版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、現(xiàn)代數(shù)據(jù)庫技術(shù)PAGE PAGE 42南京航空航天大學(xué) PAGE 1基于C#的企業(yè)ERP管理系統(tǒng)161210404,楊凱迪,算機(jī)科學(xué)與技術(shù)Email:Yangkd摘 要: 為了方便企業(yè)管理,基于Visual Studio 2010和SQL Server 2012開發(fā)平臺,用C#語言和SQL語言結(jié)合開發(fā)此Enterprise Resourse Planning系統(tǒng),可應(yīng)用于中小型企業(yè)的人流,物流,產(chǎn)品生產(chǎn)銷售管理,能夠幫助企業(yè)管理者統(tǒng)籌分配,實現(xiàn)企業(yè)資源利用率最大化。關(guān)鍵詞: 企業(yè)ERP管理;C#;SQL系統(tǒng)分析需求分析現(xiàn)在不少生產(chǎn)企業(yè)都有自己的單項信息化業(yè)務(wù)系統(tǒng),比如
2、進(jìn)銷存系統(tǒng)、財務(wù)系統(tǒng)、客戶關(guān)系系統(tǒng)、工資人事系統(tǒng)等等,但這些軟件系統(tǒng)間的信息是各自獨立的,無法實現(xiàn)信息共享。各個信息在某一個部門可能得心應(yīng)手,但對企業(yè)整體來說,各個部門間的信息都是“孤島”,并沒有起到信息綜合利用的效果。只有將企業(yè)各個部門的信息資源集成化,才能實現(xiàn)信息共享和企業(yè)資源的綜合利用,這也正是ERP管理系統(tǒng)能夠解決的最主要問題。通過與XXX生產(chǎn)制造企業(yè)的溝通和需求分析,要求系統(tǒng)具有以下功能:(1)限于操作人員的計算機(jī)操作水平,因此要求系統(tǒng)具有良好的人機(jī)交互界面;(2)如果系統(tǒng)的使用人員較多,則要求有清晰的權(quán)限設(shè)置;(3)方便的數(shù)據(jù)查詢和管理功能;(4)使用水晶報表分析采購、銷售、利潤核
3、算、庫存預(yù)警等數(shù)據(jù)信息;(5)在具有刪除權(quán)限的情況下,可方便地刪除數(shù)據(jù)記錄;(6)在具有審核或棄審權(quán)限的情況下,可審核或棄審業(yè)務(wù)單據(jù);(7)數(shù)據(jù)計算自動完成,盡量減少人工干預(yù);(8)業(yè)務(wù)流程自動控制,主動向用戶提示業(yè)務(wù)流程信息。可行性分析要求:可以實現(xiàn)最大限度地整合企業(yè)的所有資源;最大限度地減少庫存和資金占用;系統(tǒng)的功能要符合本企業(yè)的實際情況;系統(tǒng)的功能操作要方便、易懂,不要有多余或復(fù)雜的操作;可以方便地對企業(yè)的各種資源信息進(jìn)行統(tǒng)計或查詢,并提供打印功能。目標(biāo):實現(xiàn)對企業(yè)所擁有的人、財、物、信息、時間和空間等綜合資源進(jìn)行綜合平衡和優(yōu)化管理,協(xié)調(diào);企業(yè)各管理部門,圍繞市場導(dǎo)向開展業(yè)務(wù)活動,提高企
4、業(yè)的核心競爭力,從而取得最好的經(jīng)濟(jì)效益。系統(tǒng)設(shè)計系統(tǒng)目標(biāo)本系統(tǒng)屬于中小型ERP管理系統(tǒng),可以對中小型生產(chǎn)企業(yè)或商業(yè)企業(yè)進(jìn)行有效管理。通過本系統(tǒng)可以達(dá)到以下目標(biāo):靈活的錄入數(shù)據(jù),使信息傳遞方便、快捷;系統(tǒng)采用人機(jī)交互方式,界面美觀友好,操作靈活方便,業(yè)務(wù)流程控制嚴(yán)謹(jǐn),數(shù)據(jù)存儲安全可靠;嚴(yán)格按操作功能來分配權(quán)限;嚴(yán)格控制業(yè)務(wù)流程,主動向用戶提示業(yè)務(wù)流程信息;各種單據(jù)的最終確認(rèn),需要具有審核權(quán)限的人員進(jìn)行審核操作;客戶分析采用圖形化顯示,直觀明了;實現(xiàn)各種綜合查詢和模糊查詢;實現(xiàn)企業(yè)客戶及其內(nèi)部資源的信息集成化管理;對用戶輸入的數(shù)據(jù),進(jìn)行嚴(yán)格的數(shù)據(jù)檢驗,盡可能避免人為錯誤;系統(tǒng)最大限度地實現(xiàn)了易維護(hù)
5、性和易操作性。功能結(jié)構(gòu)Figure SEQ Figure * ARABIC 1 主模塊功能結(jié)構(gòu)圖Figure SEQ Figure * ARABIC 2 子模塊功能結(jié)構(gòu)業(yè)務(wù)流程 Figure SEQ Figure * ARABIC 3 業(yè)務(wù)流程圖編碼規(guī)范數(shù)據(jù)庫命名規(guī)范表1 數(shù)據(jù)庫命名數(shù)據(jù)庫名稱描述SMALLERP企業(yè)管理ERP管理系統(tǒng)數(shù)據(jù)庫數(shù)據(jù)表命名規(guī)范表2 數(shù)據(jù)表命名數(shù)據(jù)表名稱的前兩位 描述BS基礎(chǔ)管理模塊PU采購管理模塊SE銷售管理模塊ST倉庫管理模塊PRCU FISYIN生產(chǎn)管理模塊客戶管理模塊財務(wù)管理模塊系統(tǒng)管理模塊內(nèi)置系統(tǒng)信息字段命名規(guī)范:表3 字段命名字段名稱描述EmployeeC
6、ode員工編號EmployeeName員工姓名視圖命名規(guī)范:表4 視圖命名視圖名稱描述V_BomStruct哪些存貨編制了物料清單結(jié)構(gòu)存儲過程命名規(guī)范:表4 存儲過程命名字段名稱描述P_QueryForeignConstraint查詢某個表的約束信息存貨編碼用來唯一標(biāo)識存貨檔案信息,不同種類的存貨可以通過該代碼來區(qū)分(即使存貨名稱相同),存貨通常分為原材料、產(chǎn)成品、半成品和在產(chǎn)品4大類。在本系統(tǒng)中該編碼的命名規(guī)則為:存貨類別代碼+分隔符(-)+存貨序號。銷售訂單編號用來唯一標(biāo)識商品的銷售訂單,即使兩張銷售訂單的商品名稱和數(shù)量相同,也完全可以通過該編號來區(qū)分。在本系統(tǒng)中該編碼的命名規(guī)則為:日期字
7、符串十分隔符(-)+單據(jù)流水號。例如,20110808-00080在創(chuàng)建一個窗體時,首先對窗體的ID進(jìn)行命名,本系統(tǒng)中統(tǒng)一命名為“Form+窗體名稱”,其中窗體名稱是英文形式的窗體說明,便于開發(fā)者通過窗體ID就能知道該窗體的作用,如結(jié)算賬戶窗體ID名為F ormBSAccount。在窗體中調(diào)用其他窗體時,必須對調(diào)用窗體進(jìn)行引用,其引用的變量名為將第一字母改為小寫的原窗體名稱,如生產(chǎn)完工窗體FormProduceComplete的引用名為formProduceComplete。系統(tǒng)預(yù)覽系統(tǒng)運行環(huán)境本系統(tǒng)的系統(tǒng)運行環(huán)境具體如下。(1)系統(tǒng)開發(fā)平臺:Microsoft Visual Studio 2
8、010。(2)系統(tǒng)開發(fā)語言:C# 4.0。(3)數(shù)據(jù)庫管理軟件:Microsoft SQL Server 2008。(4)運行平臺:Windows XP(SP3)/Windows Server 2003(SP2)/Windows 7。(5)運行環(huán)境:Microsoft .NET Framework SDK v4.0。(6)分辨率:最佳效果1024768像素。數(shù)據(jù)庫與數(shù)據(jù)表設(shè)計分析概念設(shè)計Figure SEQ Figure * ARABIC 4 存貨信息實體E-R圖Figure SEQ Figure * ARABIC 5 采購入庫單信息實體E-R圖Figure SEQ Figure * ARAB
9、IC 6 銷售收款單信息實體E-R圖Figure SEQ Figure * ARABIC 7 領(lǐng)料信息實體E-R圖Figure SEQ Figure * ARABIC 8 存貨庫存信息實體E-R圖邏輯設(shè)計邏輯關(guān)系Figure SEQ Figure * ARABIC 9 職工基本信息表與各表之間的關(guān)系Figure SEQ Figure * ARABIC 10 登錄表與用戶權(quán)限表、權(quán)限模塊表之間的關(guān)系文件夾組織結(jié)構(gòu)Properties 程序資源文件夾引用 DLL引用文件夾BS 基礎(chǔ)管理文件夾ComClass 公共類文件夾CU 客戶管理文件夾DataClass 數(shù)據(jù)操作類文件夾FI 財務(wù)管理文件夾I
10、mages 圖片文件夾PR 生產(chǎn)管理文件夾PU 采購管理文件夾FORM 報表窗體文件夾RPT 水晶報表文件夾SE 銷售管理文件夾ST 倉庫管理文件夾SY 系統(tǒng)管理文件夾APPMain.cs 主窗體Login.cs 系統(tǒng)登錄窗體Program.cs 系統(tǒng)主程序文件公共類設(shè)計DataBase類DataBase類主要用來連接和操作數(shù)據(jù)庫,除了系統(tǒng)默認(rèn)提供的命名空間之外,還需要引入System.Windows.Forms, System.Data, System.Data.SqlClient和SMALLERP.ComClass等4個命名空間。using System.Data.SqlClient;us
11、ing System.Windows.Forms;using System.Data;using SMALLERP.ComClass;DataBase方法:/ / 創(chuàng)建數(shù)據(jù)庫連接和SqlCommand實例 / public DataBase() string strServer = OperatorFile.GetIniFileString(DataBase, Server, , Application.StartupPath + SMALLERP.ini); /獲取登錄用戶 string strUserID = OperatorFile.GetIniFileString(DataBase,
12、UserID, , Application.StartupPath + SMALLERP.ini); /獲取登錄密碼 string strPwd = OperatorFile.GetIniFileString(DataBase, Pwd, , Application.StartupPath + SMALLERP.ini); /數(shù)據(jù)庫連接字符串 string strConn = Server = + strServer + ;Database=SMALLERP;User id= + strUserID + ;PWD= + strPwd; try m_Conn = new SqlConnectio
13、n(strConn); m_Cmd = new SqlCommand(); m_Cmd.Connection = m_Conn; catch(Exception e) throw e; ExecDataBySQL方法:/ / 多條Transact-SQL語句提交數(shù)據(jù) / / 使用List泛型封裝多條SQL語句 / bool值(提交是否成功) public bool ExecDataBySqls(List strSqls) bool booIsSucceed; if (m_Conn.State = ConnectionState.Closed) m_Conn.Open(); SqlTransac
14、tion sqlTran = m_Conn.BeginTransaction(); try m_Cmd.Transaction = sqlTran; foreach (string item in strSqls) m_Cmd.CommandType = CommandType.Text; m_Cmd.CommandText = item; m_Cmd.ExecuteNonQuery(); sqlTran.Commit(); booIsSucceed = true; /表示提交數(shù)據(jù)庫成功 catch sqlTran.Rollback(); booIsSucceed = false; /表示提交
15、數(shù)據(jù)庫失敗! finally m_Conn.Close(); strSqls.Clear(); return booIsSucceed; GetDataReader方法:/ / 通過Transact-SQL語句得到SqlDataReader實例 / / Transact-SQL語句 / SqlDataReader實例的引用 public SqlDataReader GetDataReader(string strSql) SqlDataReader sdr; m_Cmd.CommandType = CommandType.Text; m_Cmd.CommandText = strSql; tr
16、y if (m_Conn.State = ConnectionState.Closed) m_Conn.Open(); sdr = m_Cmd.ExecuteReader(CommandBehavior.CloseConnection); catch (Exception e) throw e; /sdr對象和m_Conn對象暫時不能關(guān)閉和釋放掉,否則在調(diào)用時無法使用 /待使用完畢sdr,再關(guān)閉sdr對象(同時會自動關(guān)閉關(guān)聯(lián)的m_Conn對象) /m_Conn的關(guān)閉是指關(guān)閉連接通道,但連接對象依然存在 /m_Conn的釋放掉是指銷毀連接對象 return sdr; GetDataTable方法
17、:/ / 通過Transact-SQL語句,得到DataTable實例 / / Transact-SQL語句 / 數(shù)據(jù)表的名稱 / DataTable實例的引用 public DataTable GetDataTable(string strSqlCode, string strTableName) DataTable dt = null; SqlDataAdapter sda = null; try sda = new SqlDataAdapter(strSqlCode,m_Conn); dt = new DataTable(strTableName); sda.Fill(dt); catc
18、h (Exception ex) throw ex; return dt; /dt.Rows.Count可能等于零 CommonUse類CommonUse類主要用來實現(xiàn)控件綁定到數(shù)據(jù)源、鍵盤輸入驗證、生成單據(jù)編號等功能。該類中需要添加的命名空間如下:using System.ComponentModel;using CrystalDecisions.Shared; /TableLogOnInfousing CrystalDecisions.CrystalReports.Engine; /ReportDocumentusing SMALLERP.BS;using SMALLERP.PU;usin
19、g SMALLERP.SE;using SMALLERP.ST;using SMALLERP.PR;using SMALLERP.CU;using SMALLERP.FI;using SMALLERP.SY;using SMALLERP.RP.FORM;using SMALLERP.DataClass;BuildTree方法:/ / TreeView控件綁定到數(shù)據(jù)源 / / TreeView控件 / ImageList控件 / 根節(jié)點的文本屬性值 / 要綁定的數(shù)據(jù)表 / 數(shù)據(jù)表的代碼列 / 數(shù)據(jù)表的名稱列 public void BuildTree(TreeView tv,ImageList
20、imgList,string rootName, string strTable, string strCode, string strName) string strSql = null; DataSet ds = null; DataTable dt = null; TreeNode rootNode = null; TreeNode childNode = null; strSql = select +strCode+ , +strName+ from +strTable; tv.Nodes.Clear(); tv.ImageList = imgList; /創(chuàng)建根節(jié)點 rootNode
21、 = new TreeNode(); rootNode.Tag = null; rootNode.Text = rootName; rootNode.ImageIndex = 1; rootNode.SelectedImageIndex = 0; try ds = db.GetDataSet(strSql, strTable); dt = ds.TablesstrTable; foreach (DataRow row in dt.Rows) /創(chuàng)建子節(jié)點 childNode = new TreeNode(); childNode.Tag = rowstrCode; childNode.Text
22、 = rowstrName.ToString(); childNode.ImageIndex = 1; childNode.SelectedImageIndex = 0; rootNode.Nodes.Add(childNode); tv.Nodes.Add(rootNode); tv.ExpandAll(); catch (Exception e) MessageBox.Show(e.Message, 軟件提示); throw e; BuildComboBox方法:/ / ComboBox或DataGridViewComboBoxColumn綁定到數(shù)據(jù)源 / / 要綁定數(shù)據(jù)源的控件 / Va
23、lueMember屬性要綁定的列名稱 / DisplayMember屬性要綁定的列名稱 / SQL查詢語句 / 數(shù)據(jù)表的名稱 public void BindComboBox(Object obj, string strValueColumn, string strTextColumn, string strSql, string strTable) /Component 替換 Object try string strType = obj.GetType().ToString(); strType = strType.Substring(strType.LastIndexOf(.) + 1)
24、; /判斷控件的類型 switch (strType) case ComboBox: ComboBox cbx = (ComboBox)obj; cbx.BeginUpdate(); cbx.DataSource = db.GetDataSet(strSql, strTable).TablesstrTable; cbx.DisplayMember = strTextColumn; cbx.ValueMember = strValueColumn; cbx.EndUpdate(); break; case DataGridViewComboBoxColumn: DataGridViewCombo
25、BoxColumn dgvcbx = (DataGridViewComboBoxColumn)obj; dgvcbx.DataSource = db.GetDataSet(strSql, strTable).TablesstrTable; dgvcbx.DisplayMember = strTextColumn; dgvcbx.ValueMember = strValueColumn; break; default: break; catch (Exception e) throw e; InputNumeric方法:/ / 控制可編輯控件的鍵盤輸入,該方法限定控件只可以接收表示非負(fù)十進(jìn)制數(shù)的
26、字符 / / 為 KeyPress 事件提供數(shù)據(jù) / 可編輯文本控件 public void InputNumeric(KeyPressEventArgs e,Control con) /在可編輯控件的Text屬性為空的情況下,不允許輸入.字符 if (String.IsNullOrEmpty(con.Text) & e.KeyChar.ToString() = .) /把Handled設(shè)為true,取消KeyPress事件,防止控件處理按鍵 e.Handled = true; /可編輯控件不允許輸入多個.字符 if (con.Text.Contains(.) & e.KeyChar.ToSt
27、ring() = .) e.Handled = true; /在可編輯控件中,只可以輸入“數(shù)字字符”、.字符 、字符(刪除鍵對應(yīng)的字符) if (!Char.IsDigit(e.KeyChar) & e.KeyChar.ToString() != . & e.KeyChar.ToString() != ) e.Handled = true; / / 控制可編輯控件的鍵盤輸入,該方法限定控件只可以接收表示非負(fù)整數(shù)的字符 / / 為 KeyPress 事件提供數(shù)據(jù) public void InputInteger(KeyPressEventArgs e) if (!Char.IsDigit(e.K
28、eyChar) & e.KeyChar.ToString() != ) /把Handled設(shè)為true,取消KeyPress事件,防止控件處理按鍵 e.Handled = true; BuildBillCode方法:/ / 生成單據(jù)代碼 / / 數(shù)據(jù)表 / 數(shù)據(jù)表中表示代碼的列 / 數(shù)據(jù)表中表示日期的列 / 生成單據(jù)的日期 / 單據(jù)的代碼 public string BuildBillCode(string strTable, string strBillCodeColumn,string strBillDateColumn,DateTime dtBillDate) string strSql
29、; string strBillDate; string strMaxSeqNum; string strNewSeqNum; string strBillCode; try strBillDate = dtBillDate.ToString(yyyyMMdd); strSql = SELECT SUBSTRING(MAX( + strBillCodeColumn + ),10,4) FROM + strTable + WHERE + strBillDateColumn + = + dtBillDate.ToString(yyyy-MM-dd)+; strMaxSeqNum = db.GetS
30、ingleObject(strSql) as string; if (String.IsNullOrEmpty(strMaxSeqNum) strMaxSeqNum = 0000; strNewSeqNum = (Convert.ToInt32(strMaxSeqNum) + 1).ToString(0000); strBillCode = strBillDate + - + strNewSeqNum; catch (Exception ex) MessageBox.Show(ex.Message, 軟件提示); throw ex; return strBillCode; 物料清單模塊設(shè)計窗體
31、設(shè)計加載母件和子件信息using SMALLERP.ComClass;using SMALLERP.DataClass;namespace SMALLERP.BS public partial class FormBSBom : Form DataBase db = new DataBase(); CommonUse commUse = new CommonUse(); public FormBSBom() InitializeComponent(); private void FormBom_Load(object sender, EventArgs e) /權(quán)限 commUse.Cortr
32、olButtonEnabled(toolAdd, this); commUse.CortrolButtonEnabled(toolAmend, this); commUse.CortrolButtonEnabled(toolDelete, this); /TreeView綁定到數(shù)據(jù)源 commUse.BuildTree(tvInven, imageList1, 母件, V_BomStruct, InvenCode, InvenName); private void tvInven_AfterSelect(object sender, TreeViewEventArgs e) commUse.D
33、ataGridViewReset(dgvStructInfo); /清空DataGridView if (tvInven.SelectedNode != null) if (tvInven.SelectedNode.Tag != null) BindDataGridView(tvInven.SelectedNode.Tag.ToString(); 添加功能 private void toolAdd_Click(object sender, EventArgs e) if (tvInven.SelectedNode != null) FormBSBomInput formBomInput = n
34、ew FormBSBomInput(); formBomInput.Tag = Add; /添加狀態(tài) formBomInput.Owner = this; formBomInput.ShowDialog(); 銷售收款單設(shè)計設(shè)計窗體瀏覽功能 using SMALLERP.ComClass;using SMALLERP.DataClass;namespace SMALLERP.SE public partial class FormSEGather : Form DataBase db = new DataBase(); CommonUse commUse = new CommonUse();
35、public FormSEGather() InitializeComponent(); private void btnChoice_Click(object sender, EventArgs e) FormBrowseSEOutStore formBrowseSEOutStore = new FormBrowseSEOutStore(); formBrowseSEOutStore.Owner = this; formBrowseSEOutStore.ShowDialog(); 選擇功能 using SMALLERP.DataClass;using SMALLERP.ComClass;na
36、mespace SMALLERP.SE public partial class FormBrowseSEOutStore : Form DataBase db = new DataBase(); CommonUse commUse = new CommonUse(); FormSEGather formSEGather = null;private void FormBrowseSEOutStore_Load(object sender, EventArgs e) formSEGather = (FormSEGather)this.Owner; commUse.BindComboBox(th
37、is.dgvSEOutStoreInfo.ColumnsOperatorCode, OperatorCode, OperatorName, select OperatorCode,OperatorName from SYOperator, SYOperator); commUse.BindComboBox(this.dgvSEOutStoreInfo.ColumnsCustomerCode, CustomerCode, CustomerName, select CustomerCode,CustomerName from BSCustomer, BSCustomer); commUse.Bin
38、dComboBox(this.dgvSEOutStoreInfo.ColumnsStoreCode, StoreCode, StoreName, select StoreCode,StoreName from BSStore, BSStore); commUse.BindComboBox(this.dgvSEOutStoreInfo.ColumnsInvenCode, InvenCode, InvenName, select InvenCode,InvenName from BSInven, BSInven); commUse.BindComboBox(this.dgvSEOutStoreIn
39、fo.ColumnsEmployeeCode, EmployeeCode, EmployeeName, select EmployeeCode,EmployeeName from BSEmployee, BSEmployee); commUse.BindComboBox(this.dgvSEOutStoreInfo.ColumnsIsFlag, Code, Name, select * from INCheckFlag, INCheckFlag); this.BindDataGridView( WHERE IsFlag = 1); if (dgvSEOutStoreInfo.RowCount
40、0) formSEGather.txtSEOutCode.Text = this.dgvSEOutStoreInfoSEOutCode, this.dgvSEOutStoreInfo.CurrentCell.RowIndex.Value.ToString(); formSEGather.dtpSEOutDate.Value = Convert.ToDateTime(this.dgvSEOutStoreInfoSEOutDate, this.dgvSEOutStoreInfo.CurrentCell.RowIndex.Value); formSEGather.cbxCustomerCode.Se
41、lectedValue = this.dgvSEOutStoreInfoCustomerCode, this.dgvSEOutStoreInfo.CurrentCell.RowIndex.Value; formSEGather.txtSEMoney.Text = this.dgvSEOutStoreInfoSEMoney, this.dgvSEOutStoreInfo.CurrentCell.RowIndex.Value.ToString(); this.Close(); 生產(chǎn)單模塊設(shè)計窗體設(shè)計瀏覽功能 using SMALLERP.ComClass;using SMALLERP.DataCl
42、ass;using System.Data.SqlClient;namespace SMALLERP.PR public partial class FormPRProduce : Form DataBase db = new DataBase(); CommonUse commUse = new CommonUse();運行結(jié)果致謝 *感謝鄭老師的指導(dǎo),各位研究生學(xué)長的幫助和同學(xué)們的支持* 參考文獻(xiàn): 王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論. 4版. 北京: 高等教育出版社, 2006.5. 明日科技.SQL Server從入門到精通. 北京: 清華大學(xué)出版社, 2012.9. 附錄資料:不需要的可以
43、自行刪除Abstract: Based on the comprehensive analysis on the plastic parts structure service requirement, mounding quality and mould menu factoring cost. A corresponding injection mould of internal side core pulling was designed. By adopting the multi-direction and multi-combination core-pulling. A corr
44、esponding injection mould of internal side core pulling was designed, the working process of the mould was introducedC語言詳解 - 枚舉類型注:以下全部代碼的執(zhí)行環(huán)境為VC+ 6.0在程序中,可能需要為某些整數(shù)定義一個別名,我們可以利用預(yù)處理指令#define來完成這項工作,您的代碼可能是:#define MON 1#define TUE 2#define WED 3#define THU 4#define FRI 5#define SAT 6#define SUN 7在此,我
45、們定義一種新的數(shù)據(jù)類型,希望它能完成同樣的工作。這種新的數(shù)據(jù)類型叫枚舉型。1. 定義一種新的數(shù)據(jù)類型 - 枚舉型 以下代碼定義了這種新的數(shù)據(jù)類型 - 枚舉型enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN;(1) 枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號,隔開。(2) DAY是一個標(biāo)識符,可以看成這個集合的名字,是一個可選項,即是可有可無的項。(3) 第一個枚舉成員的默認(rèn)值為整型的0,后續(xù)枚舉成員的值在前一個成員上加1。(4) 可以人為設(shè)定枚舉成員的值,從而自定義某個范圍內(nèi)的整數(shù)。(5) 枚舉型是預(yù)處理指令#defi
46、ne的替代。(6) 類型定義以分號;結(jié)束。2. 使用枚舉類型對變量進(jìn)行聲明新的數(shù)據(jù)類型定義完成后,它就可以使用了。我們已經(jīng)見過最基本的數(shù)據(jù)類型,如:整型int, 單精度浮點型float, 雙精度浮點型double, 字符型char, 短整型short等等。用這些基本數(shù)據(jù)類型聲明變量通常是這樣:char a; /變量a的類型均為字符型charchar letter;int x, y, z; /變量x,y和z的類型均為整型intint number;double m, n;double result; /變量result的類型為雙精度浮點型double既然枚舉也是一種數(shù)據(jù)類型,那么它和基本數(shù)據(jù)類型
47、一樣也可以對變量進(jìn)行聲明。方法一:枚舉類型的定義和變量的聲明分開enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN;enum DAY yesterday;enum DAY today;enum DAY tomorrow; /變量tomorrow的類型為枚舉型enum DAYenum DAY good_day, bad_day; /變量good_day和bad_day的類型均為枚舉型enum DAY方法二:類型定義與變量聲明同時進(jìn)行:enum /跟第一個定義不同的是,此處的標(biāo)號DAY省略,這是允許的。 saturday, sunday = 0, monday
48、, tuesday, wednesday, thursday, friday workday; /變量workday的類型為枚舉型enum DAYenum week Mon=1, Tue, Wed, Thu, Fri Sat, Sun days; /變量days的類型為枚舉型enum weekenum BOOLEAN false, true end_flag, match_flag; /定義枚舉類型并聲明了兩個枚舉型變量方法三:用typedef關(guān)鍵字將枚舉類型定義成別名,并利用該別名進(jìn)行變量聲明:typedef enum workday saturday, sunday = 0, monday
49、, tuesday, wednesday, thursday, friday workday; /此處的workday為枚舉型enum workday的別名workday today, tomorrow; /變量today和tomorrow的類型為枚舉型workday,也即enum workdayenum workday中的workday可以省略:typedef enum saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday workday; /此處的workday為枚舉型enum workday的別名workda
50、y today, tomorrow; /變量today和tomorrow的類型為枚舉型workday,也即enum workday也可以用這種方式:typedef enum workday saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday;workday today, tomorrow; /變量today和tomorrow的類型為枚舉型workday,也即enum workday注意:同一個程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的命名常量。錯誤示例如下所示:錯誤聲明一:存在同名的枚舉類型t
51、ypedef enum wednesday, thursday, friday workday;typedef enum WEEK saturday, sunday = 0, monday, workday; 錯誤聲明二:存在同名的枚舉成員typedef enum wednesday, thursday, friday workday_1;typedef enum WEEK wednesday, sunday = 0, monday, workday_2;3. 使用枚舉類型的變量3.1 對枚舉型的變量賦值。實例將枚舉類型的賦值與基本數(shù)據(jù)類型的賦值進(jìn)行了對比:方法一:先聲明變量,再對變量賦值#i
52、nclude/* 定義枚舉類型 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;void main() /* 使用基本數(shù)據(jù)類型聲明變量,然后對變量賦值 */ int x, y, z; x = 10; y = 20; z = 30; /* 使用枚舉類型聲明變量,再對枚舉型變量賦值 */ enum DAY yesterday, today, tomorrow; yesterday = MON; today = TUE; tomorrow = WED; printf(%d %d %d n, yesterday, today, tomorrow);方法二
53、:聲明變量的同時賦初值#include /* 定義枚舉類型 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;void main() /* 使用基本數(shù)據(jù)類型聲明變量同時對變量賦初值 */ int x=10, y=20, z=30; /* 使用枚舉類型聲明變量同時對枚舉型變量賦初值 */ enum DAY yesterday = MON, today = TUE, tomorrow = WED; printf(%d %d %d n, yesterday, today, tomorrow);方法三:定義類型的同時聲明變量,然后對變量賦值。#includ
54、e /* 定義枚舉類型,同時聲明該類型的三個變量,它們都為全局變量 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN yesterday, today, tomorrow;/* 定義三個具有基本數(shù)據(jù)類型的變量,它們都為全局變量 */int x, y, z;void main() /* 對基本數(shù)據(jù)類型的變量賦值 */ x = 10; y = 20; z = 30; /* 對枚舉型的變量賦值 */ yesterday = MON; today = TUE; tomorrow = WED; printf(%d %d %d n, x, y, z); /輸出:
55、10 20 30 printf(%d %d %d n, yesterday, today, tomorrow); /輸出:1 2 3方法四:類型定義,變量聲明,賦初值同時進(jìn)行。#include /* 定義枚舉類型,同時聲明該類型的三個變量,并賦初值。它們都為全局變量 */enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN yesterday = MON, today = TUE, tomorrow = WED;/* 定義三個具有基本數(shù)據(jù)類型的變量,并賦初值。它們都為全局變量 */int x = 10, y = 20, z = 30;void main()
56、printf(%d %d %d n, x, y, z); /輸出:10 20 30 printf(%d %d %d n, yesterday, today, tomorrow); /輸出:1 2 33.2 對枚舉型的變量賦整數(shù)值時,需要進(jìn)行類型轉(zhuǎn)換。#include enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;void main() enum DAY yesterday, today, tomorrow; yesterday = TUE; today = (enum DAY) (yesterday + 1); /類型轉(zhuǎn)換 tomorrow = (enum DAY) 30; /類型轉(zhuǎn)換 /tomorrow = 3; /錯誤 printf(%d %d %d n, yesterday, today, tomorrow); /輸出:2 3 303.3 使用枚舉型變量#includeenum BELL = a, BACKSPACE = b, HTAB = t, RETURN = r, N
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 年度員工代表發(fā)言稿15篇
- 年終大會發(fā)言稿15篇
- 年會精彩發(fā)言稿(15篇)
- 黨的理論知識宣講
- 教師清廉建設(shè)培訓(xùn)
- 教體局校車安全管理培訓(xùn)
- 闌尾炎術(shù)后應(yīng)用抗生素聯(lián)合黃藤通腑湯干預(yù)的效果
- 大學(xué)生安全教育概述
- 抖音賣貨流程
- 初級會計實務(wù)-《初級會計實務(wù)》預(yù)測試卷364
- 湖北省十堰市城區(qū)2024-2025學(xué)年九年級上學(xué)期期末質(zhì)量檢測綜合物理試題(含答案)
- 導(dǎo)播理論知識培訓(xùn)班課件
- 電廠檢修安全培訓(xùn)課件
- 高中生物選擇性必修1試題
- 電氣工程及其自動化專業(yè)《畢業(yè)設(shè)計(論文)及答辯》教學(xué)大綱
- 《客艙安全管理與應(yīng)急處置》課件-第14講 應(yīng)急撤離
- 危險化學(xué)品押運員培訓(xùn)
- 2025屆高考作文押題預(yù)測5篇
- 一年級數(shù)學(xué)(上)計算題專項練習(xí)集錦
- 阿里巴巴國際站:2024年珠寶眼鏡手表及配飾行業(yè)報告
- 手術(shù)室護(hù)士考試題及答案
評論
0/150
提交評論