第一篇:C語言課程設計銷售管理系統報告
報告正文
1、題目與要求:
1.1 某公司有四個銷售員(編號:1-4),負責銷售五種產品(編號:1-5)。每個銷售員都將當日出售的每種產品各寫一張便條交上來。每張便條內容有 ? 銷售員的代號 ? 產品的代號
? 這種產品當天的銷售額
1.2 每位銷售員每天可能上繳0-5張便條。假設手機到了上個月的所有便條,編寫一個處理系統,讀取上月的銷售情況(自己設定),進行如下處理: ? 計算上個月沒人每種產品的銷售額
? 按銷售額對銷售員進行排序,輸出排序結果(銷售員代號)
? 統計每種產品的總銷售額,對這些產品從高到低的順序輸出結果(須輸出產品的代號和銷售額)? 輸出統計報表
2、需求分析
本程序將用到文件系統,list.txt文件內容作為數據源,其中單行內容代表一張紙條。程序運行后首先將文件系統的原始數據讀取并保存到程序的結構體數組當中,所以應提供文件輸入的操作;由于紙條數據零散,所以要對原始數據進行分類操作并提供一個數組用于保存分類信息;在程序中要進行統計工作,所以要提供顯示、排序等操作;另外應提供鍵盤式選擇菜單實現功能選擇。
3、功能實現設計
3.1總體設計
根據上面的分析,可以將這個系統分為如下五大模塊:查看每人每種產品的銷售額、按銷售額對銷售員排序、對每種產品總銷售額從高到低排序、輸出統計報表和退出。其中主要模塊是前四個模塊。
3.2流程圖
3.3詳細設計:
3.3.1【頭文件和預定義】 #include
#include
原始數據有銷售員代號、產品代號和銷售額,所以定義一個全局結構體數組scrip用于保存原始數據。然后定義全局變量n保存紙條數目,定義數組s用于保存分類后的信息。struct ss { int sid;//銷售員代號
int pid;//產品代號
int sn;//銷售額 }ss[M];int n;//紙條數目
int s[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};//用于保存員工和產品信息 3.3.4【主函數】
顯示程序設計者相關信息和調用文件讀取函數、數據初始化函數和主菜單函數 void main()//入口函數,即主函數 { readdata();//讀取文件數據
foreach();//根據文件初始數據初始化便于操作的數組 menu();//顯示主菜單 } 3.3.4-1【文件讀取函數】readdata()讀出便條中的內容,并保存到文件結構體中
void readdata()//從文件讀取數據 { FILE *fp;if((fp=fopen(“list.txt”,“r”))==NULL){
printf(“Can't open the file!n”);
exit(0);} else
for(n=0;!feof(fp);n++)
{
fscanf(fp,“%d %d %dn”,&ss[n].sid,&ss[n].pid,&ss[n].sn);
} //保存文件數據到結構體
fclose(fp);} 3.3.4-2【文件讀取函數】foreach()將保存到結構體中的信息按產品分類,再根據銷售員進行分類,將信息存到數組當中。
void foreach()//從紙條讀取數據并分類整理 { int i;for(i=0;i { switch(ss[i].pid) //按產品分大類,根據大類分銷售員小類,累加個人各產品銷售數量 { case 1: switch(ss[i].sid) { case 1:s[0][0]+=ss[i].sn;break; case 2:s[1][0]+=ss[i].sn;break; case 3:s[2][0]+=ss[i].sn;break; case 4:s[3][0]+=ss[i].sn;break; } break; case 2: switch(ss[i].sid) { case 1:s[0][1]+=ss[i].sn;break; case 2:s[1][1]+=ss[i].sn;break; case 3:s[2][1]+=ss[i].sn;break; case 4:s[3][1]+=ss[i].sn;break; } break; case 3: switch(ss[i].sid) { case 1:s[0][2]+=ss[i].sn;break; case 2:s[1][2]+=ss[i].sn;break; case 3:s[2][2]+=ss[i].sn;break; case 4:s[3][2]+=ss[i].sn;break; } break; case 4: switch(ss[i].sid) { case 1:s[0][3]+=ss[i].sn;break; case 2:s[1][3]+=ss[i].sn;break; case 3:s[2][3]+=ss[i].sn;break; case 4:s[3][3]+=ss[i].sn;break; } break; case 5: switch(ss[i].sid) { case 1:s[0][4]+=ss[i].sn;break; case 2:s[1][4]+=ss[i].sn;break; case 3:s[2][4]+=ss[i].sn;break; case 4:s[3][4]+=ss[i].sn;break; }; break;} } } 3.3.4-3【主菜單函數】menu()顯示系統功能菜單以供用戶選擇相關功能使用,根據用戶選擇分別可調用 detail():計算上個月每個人每種產品的銷售額 seller():按銷售額對銷售員進行排序,輸出排序結果(銷售員代號)product():統計每種產品的總銷售額,對這些產品按從高到低的順序輸出排序結果(需輸出產品代號和銷售額)exit(0):退出系統 void menu(){ int w,c;do{ puts(“tt*********菜單*********************nn”);puts(“tt 1.查看每人每種產品的銷售額n”);puts(“tt 2.按銷售額對銷售員排序(銷售員代號)n”);puts(“tt 3.對每種產品總銷售額從高到低排序(產品代號和銷售額)n”);puts(“tt 4.輸出統計報表n”);puts(“tt 5.退出n”);puts(“nntt*********************************************n”);printf(“請選擇(1-5):[ ]bb”);scanf(“%d”,&c);if(c<1||c>5)//錯誤輸入則重新獲取輸入 { w=1;getchar();} else w=0;} while(w==1); switch(c)//根據輸入實現相應函數調用 { case 1: detail();break;//每個銷售員每種產品的銷售額統計 case 2: seller();break;case 3: product();break;case 4: total();break;case 5: exit(0);} } 3.3.5【功能函數】 5-1【每人每種產品銷售額統計函數】detail()計算上個月每個人每種產品的銷售額 void detail()//顯示銷售情況 { int i,j;for(i=0;i<4;i++)//遍歷銷售員 { printf(“ntt%d號銷售員銷售情況:n”,i+1); for(j=0;j<5;j++) //按銷售員分類遍歷所有產品并顯示信息 printf(“tt%d號產品銷售數量:%dn”,j+1,s[i][j]); } choice();} 3.3.5-1【銷售員銷售業績排序函數】seller()按銷售額對銷售員進行排序,輸出排序結果(銷售員代號)void seller(){ int i,j,k;int sp[4]={0,0,0,0};for(i=0;i<4;i++) for(j=0;j<5;j++) sp[i]+=s[i][j];//計算每單個銷售員所有產品銷售數量 for(i=0;i<4;i++)//比較四次,每次選出最大數 { k=0;//用于標記單輪最大數 for(j=0;j<4;j++) if(sp[k] printf(“tt第%d名是%d號銷售員!n”,i+1,k+1);sp[k]=-1; //輸出最大數和排名,將最大數標記為負 } choice();} 3.3.5-2【總銷售額統計函數】void product()統計每種產品的總銷售額,對這些產品按從高到低的順序輸出排序 void product()//與seller()原理一樣,用于對產品進行統計 { int i,j,k;int p[5]={0,0,0,0,0};for(j=0;j<5;j++) for(i=0;i<4;i++) p[j]+=s[i][j]; for(j=0;j<5;j++) { k=0; for(i=0;i<5;i++) if(p[k] printf(“tt第%d名是%d號產品!t銷量為%d!n”,j+1,k+1,p[k]);p[k]=-1; } choice();} 3.3.5-3【統計報表輸出函數】total()統計每種產品的總銷售額,對這些產品按從高到低的順序輸出排序結果(需輸出產品代號和銷售額) void total()//輸出報表 { int i,j;printf(“nt銷售員t產品t銷量n”);for(i=0;i<4;i++) for(j=0;j<5;j++) printf(“t %dt %dt %dn”,i+1,j+1,s[i][j]);choice();} 3.3.6【公共函數】 【選擇函數】choice()選擇退出系統或則返回主菜單 void choice()//用于輸出信息功能選擇 { int c;printf(“請選擇接下來想做什么t1>返回菜單t2>退出系統scanf(”%d“,&c);if(c==1)menu();else exit(0);puts('n');} 4、運行結果(附帶抓圖) List.txt(便條)文件中數據如下: 2 3 4 1 [ ]bb”);3 運行結果 顯示主菜單: 查看每人每種產品的銷售額運行結果: 按銷售額對銷售員排序運行結果: 對每種產品銷售額從高到低排序運行結果: 統計報表運行結果: 5、總結 通過這次C程序設計,我掌握了模塊化設計方法,能夠深入的理解結構化程序設計思想,熟練運用結構化程序設計方法,提高了運用C語言進行程序設計的能力。此外我還熟悉了,對于文件讀寫的操作。更重要的是對程序的調試有了顯著的提高。我發現我對程序的設計越來越感興趣了,我決定今后在這一方面下一番功夫,取得一些成績。 6、源程序 #include int pid;//產品代號 int sn; //銷售額 }ss[M];int n; //紙條數目 int s[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};//用于保存員工和產品信息 void main()//入口函數,即主函數 { p readdata();//讀取文件數據 foreach(); //根據文件初始數據初始化便于操作的數組 menu(); //顯示主菜單 } void readdata() //從文件讀取數據 { FILE *fp;if((fp=fopen(“list.txt”,“r”))!=NULL){ printf(“Can't open the file!n”); exit(0);} else for(n=0;!feof(fp);n++) { fscanf(fp,“%d %d %dn”,&ss[n].sid,&ss[n].pid,&ss[n].sn); } //保存文件數據到結構體 fclose(fp);} void foreach() //從紙條讀取數據并分類整理 { int i;for(i=0;i //遍歷所有紙條 { switch(ss[i].pid) //按產品分大類,根據大類分銷售員小類,累加個人各產品銷售數量 { case 1: switch(ss[i].sid) { case 1:s[0][0]+=ss[i].sn;break; case 2:s[1][0]+=ss[i].sn;break; case 3:s[2][0]+=ss[i].sn;break; case 4:s[3][0]+=ss[i].sn;break; } break; case 2: switch(ss[i].sid) { case 1:s[0][1]+=ss[i].sn;break; case 2:s[1][1]+=ss[i].sn;break; case 3:s[2][1]+=ss[i].sn;break; case 4:s[3][1]+=ss[i].sn;break; } break; case 3: switch(ss[i].sid) { case 1:s[0][2]+=ss[i].sn;break; case 2:s[1][2]+=ss[i].sn;break; case 3:s[2][2]+=ss[i].sn;break; case 4:s[3][2]+=ss[i].sn;break; } break; case 4: switch(ss[i].sid) { case 1:s[0][3]+=ss[i].sn;break; case 2:s[1][3]+=ss[i].sn;break; case 3:s[2][3]+=ss[i].sn;break; case 4:s[3][3]+=ss[i].sn;break; } break; case 5: switch(ss[i].sid) { case 1:s[0][4]+=ss[i].sn;break; case 2:s[1][4]+=ss[i].sn;break; case 3:s[2][4]+=ss[i].sn;break; case 4:s[3][4]+=ss[i].sn;break; }; break; } } } void menu(){ int w,c;do{ puts(“tt********************菜單*********************nn”); puts(“tt 1.查看每人每種產品的銷售額n”); puts(“tt 2.按銷售額對銷售員排序(銷售員代號)n”); puts(“tt 3.對每種產品總銷售額從高到低排序(產品代號和銷售額)n”); puts(“tt 4.輸出統計報表n”); puts(“tt 5.退出n”); puts(“nntt*********************************************n”); printf(“請選擇(1-5):[ ]bb”); scanf(“%d”,&c); if(c<1||c>5) //錯誤輸入則重新獲取輸入 { w=1; getchar(); } else w=0;} while(w==1); switch(c) //根據輸入實現相應函數調用 { case 1: detail();break;//每個銷售員每種產品的銷售額統計 case 2: seller();break;case 3: product();break;case 4: total();break;case 5: exit(0); } } void detail() //顯示銷售情況 { int i,j; for(i=0;i<4;i++) //遍歷銷售員 { printf(“ntt%d號銷售員銷售情況:n”,i+1); for(j=0;j<5;j++) //按銷售員分類遍歷所有產品并顯示信息 printf(“tt%d號產品銷售數量:%dn”,j+1,s[i][j]); } choice();} void seller(){ int i,j,k;int sp[4]={0,0,0,0};for(i=0;i<4;i++) for(j=0;j<5;j++) sp[i]+=s[i][j]; //計算每單個銷售員所有產品銷售數量 for(i=0;i<4;i++) //比較四次,每次選出最大數 { k=0; //用于標記單輪最大數 for(j=0;j<4;j++) if(sp[k] //獲取最大數標號 printf(“tt第%d名是%d號銷售員!n”,i+1,k+1);sp[k]=-1; //輸出最大數和排名,將最大數標記為負 } choice();} void product() //與seller()原理一樣,用于對產品進行統計 { int i,j,k;int p[5]={0,0,0,0,0};for(j=0;j<5;j++) for(i=0;i<4;i++) p[j]+=s[i][j]; for(j=0;j<5;j++) {k=0; for(i=0;i<5;i++) if(p[k] printf(“tt第%d名是%d號產品!t銷量為%d!n”,j+1,k+1,p[k]);p[k]=-1;} choice();} void total() //輸出報表 { int i,j;printf(“nt銷售員t產品t銷量n”);for(i=0;i<4;i++) for(j=0;j<5;j++) printf(“t %dt %dt %dn”,i+1,j+1,s[i][j]); choice();} void choice() //用于輸出信息功能選擇 { int c;printf(“請選擇接下來想做什么t1>返回菜單t2>退出系統 [ ]bb”);scanf(“%d”,&c);if(c==1)menu();else exit(0);puts('n');} 銷售管理系統一.項目簡介 隨著計算機技術的迅猛發展,存在于網絡的企業銷售管理系統將逐步代替傳統的管理模式進入企業。為了更高效得完成銷售方面的工作,也可以有更多的時間處理更多的別的事務,企業也將擺脫原有的管理形勢完全進入信息化管理。銷售管理系統在企業的管理過程中起著巨大的作用 二.功能需求 一個銷售管理系統,設計者的目標是滿足公司運營和日常管理的需要,具有對產品,客戶管理的功能。客戶登錄銷售管理系統進行售后服務查詢,銷售員可以對銷售的產品進行登記,并將銷售情況反饋給數據庫。為管理的方便性和信息傳遞的快速性提供了一個很好的平臺。系統開發的總體任務是實現售后服務及銷售登記自動化。總之,銷售管理系統要實現登陸驗證、商品銷售管理、商品銷售報表管理、客戶信息管理四大部分。1.客戶對功能的需求 1>查看自己的信息,了解自己近期的購買情況。2>查看產品的信息,熟悉產品情況。2>查看售后服務信息。 2.銷售人員對功能的需求 1>查看自己的信息,了解自己近期的銷售情況。2>查看產品的信息,熟悉產品情況。3>登記銷售產品。 4>添加新產品,并填寫產品相關信息。 3.售后服務人員對功能的需求 1>查看售后服務信息。2>添加售后服務信息。 三.分析模型時序圖 銷售管理系統頂層圖 1.客戶管理 第三層DFD圖 客戶管理子系統 2.銷售管理 第三層DFD圖 銷售管理子系統 3.售后服務管理 第三層DFD圖 售后服務管理子系統 4.客戶登錄動態時序圖為 四.模塊活動圖,登錄流程圖 1.注冊、登陸模塊 1>模塊功能描述 該模塊主要實現對用戶能否進入系統的確認以及對進入系統的用戶權限的設定;因為本系統涉及到三類使用者,不可能每一類用戶都具有相同的操作權限,如前所說,必然會早成系統的混亂和崩潰,嚴重影響其安全性和有效性。所以采取在通常的注冊,登錄模式下加上用戶類型的選擇,非常簡潔地就完成了對用戶類型的區別及權限的劃分。2>在模塊的詳細設計后,便能得出實現該部分的具體流程,如圖 用戶注冊模塊程序流程圖 登錄模塊程序流程圖 活動圖為: 2.客戶管理模塊 1>模塊功能描述 顯示客戶的基本信息。庫戶可以查看自己的等級和交易次數。 2>在模塊的詳細設計后,便能得出實現該部分的具體流程,如圖3-8。 客戶管理模塊流程圖 活動圖為: 3.銷售管理模塊 >模塊功能描述 在這個模塊可以登記銷售記錄。并且在提交記錄時,更新數據庫: (1)更新客戶信息。如果是“老客戶”系統會按照客戶等級給出對應的優惠價。(2)更新產品信息。主要是更新該產品數量。 2>在模塊的詳細設計后,便能得出實現該部分的具體流程,如圖 銷售管理模塊流程圖 活動圖為 五.數據庫設計 1.客戶信息表 字段khidkhnamegyshjchzhgzhugteladrkhtelfaxbzh數據類型IntVarCharVarCharVarCharnCharVarCharncharVarChartext是否是主鍵是否否否否否否否否是否為空否否否是是是否是是說明客戶編號客戶名稱客戶簡稱采購主管采購主管聯系方式客戶地址客戶電話傳真備注 2.商品進貨表 字段數據類型intVarCharCharCharCharnumericnumericint是否是主鍵是否否否否否否否是否為空說明進貨編號商品名稱商品名稱首拼大單位小單位進貨成本jhbhshpmchshpshpddwxdwjhchbxshjgjhshulgyshjhrqbzh否否否否是否否否銷售價格進貨數量供應商進貨日期備注VarCharsmalldatetimeVarChar否否否是否是 3.商品銷售表 字段xshbhshpmchshpshpxshjgxshshlxshryxshrqkhbzh數據類型IntVarCharVarCharNumericIntVarCharSmalldatetimeVarChartext是否是主鍵是否否否否否否否否是否為空否否否是是是否是是說明銷售編號商品名稱商品名稱首拼銷售價格銷售數量銷售人員銷售日期客戶簡稱備注 六.運行界面與代碼 1.登陸窗口 Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Private Sub CmdOk_Click()If UserName.Text <> “" And PassWord.Text <> ”“ Then Set conn = New ADODB.Connection Set rs = New ADODB.Recordset conn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ rs.Open ”select * from usermanage where username='“ & UserName.Text & ”'“, conn, 1, 1 If Not rs.EOF Then If rs(”password“)= PassWord.Text Then Main.Show Unload Me Else MsgBox ”非法登錄,密碼錯誤!“, vbOKOnly, ”警告“ End If Else MsgBox ”非法登錄,找不到該用戶!“, vbOKOnly, ”警告“ End If Else MsgBox ”用戶名或密碼不能為空!“, vbOKOnly, ”提示“ End If End Sub Private Sub PassWord_KeyPress(KeyAscii As Integer)If KeyAscii = 13 Then Call CmdOk_Click End If End Sub Private Sub UserName_KeyPress(KeyAscii As Integer)If KeyAscii = 13 Then Call CmdOk_Click End If End Sub `2.主界面 Private Sub Cmd_Click(Index As Integer)Select Case Index Case 0 GoodsIn.Show Me.Enabled = False Case 1 Saler.Show Me.Enabled = False Case 2 SaleData.Show Me.Enabled = False Case 3 SaleTotal.Show Me.Enabled = False Case 4 UserM.Show Me.Enabled = False End Select End Sub `進貨管理 Private Sub Cmd_Click(Index As Integer)Select Case Index Case 0 '第一條 Adodc1.Recordset.MoveFirst Case 1 '上一條 If Not Adodc1.Recordset.BOF Then Adodc1.Recordset.MovePrevious End If Case 2 '下一條 If Not Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveNext End If Case 3 '最尾條 Adodc1.Recordset.MoveLast Case 4 '添加 Adodc1.Recordset.AddNew For i = 0 To 7 GoodText(i).Enabled = True Next Cmd(6).Enabled = True Case 5 '修改 For i = 0 To 7 GoodText(i).Enabled = True Next Cmd(6).Enabled = True Case 6 '保存 Adodc1.Recordset.Update For i = 0 To 7 GoodText(i).Enabled = False Next MsgBox ”更新記錄成功!“, vbOKOnly, ”提示“ Cmd(6).Enabled = False Case 6 '刪除 If MsgBox(”確定刪除當前記錄,數據將不可恢復?“, vbOKCancel, ”提示“)= vbOK Then Adodc1.Recordset.Delete End If End Select End Sub Private Sub Form_Load()Adodc1.ConnectionString = ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ Adodc1.RecordSource = ”select * from save“ For i = 0 To 6 Set GoodText(i).DataSource = Adodc1 GoodText(i).DataField = Adodc1.Recordset.Fields(i).Name Next Adodc1.Refresh Set DataGrid1.DataSource = Adodc1 End Sub Private Sub Form_Unload(Cancel As Integer)Main.Enabled = True End Sub `銷售管理 Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Public id As String Public action As String Private Sub Cmd_Click(Index As Integer)Select Case Index Case 0 '第一條 If Not Adodc1.Recordset.BOF Then Adodc1.Recordset.MoveFirst End If Case 1 '上一條 If Not Adodc1.Recordset.BOF Then Adodc1.Recordset.MovePrevious End If Case 2 '下一條 If Not Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveNext End If Case 3 '最尾條 If Not Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast End If Case 4 '添加 action = ”add“ ManageSale.Show Me.Enabled = False Case 5 '修改 action = ”modify“ id = Adodc1.Recordset.Fields(”id“)ManageSale.Show Me.Enabled = False Case 7 '刪除 If MsgBox(”確定刪除當前記錄,數據將不可恢復?“, vbOKCancel, ”提示“)= vbOK Then Set conn = New ADODB.Connection Set rs = New ADODB.Recordset conn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ rs.Open ”select goodcount from save where goodnum='“ & GoodText(0).Text & ”'“, conn, 1, 3 rs(”goodcount“)= rs(”goodcount“)+ GoodText(5).Text rs.Update rs.Close Adodc1.Recordset.Delete End If End Select End Sub Private Sub Form_Load()Adodc1.ConnectionString = ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ Adodc1.RecordSource = ”select * from sale order by id“ For i = 0 To 6 Set GoodText(i).DataSource = Adodc1 GoodText(i).DataField = Adodc1.Recordset.Fields(i + 1).Name Next Adodc1.Refresh Set DataGrid1.DataSource = Adodc1 End Sub Private Sub Form_Unload(Cancel As Integer)Main.Enabled = True End Sub 添加修改銷售記錄 Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Public salecount As Long Private Sub Combo1_Change()End Sub Private Sub Cmd_Click(Index As Integer)Select Case Index Case 0 Set conn = New ADODB.Connection Set rs = New ADODB.Recordset conn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ If GoodText(0)= ”“ Or GoodText(3)= ”“ Or GoodText(4)= ”“ Then MsgBox ”數據沒有輸入完整,請重新輸入!“, vbOKOnly, ”提示“ Exit Sub End If If SaleData.action = ”add“ Then rs.Open ”select * from sale“, conn, 1, 3 rs.AddNew Else rs.Open ”select * from sale where id=“ & SaleData.id, conn, 1, 3 End If rs(”Goodnum“)= GNum.Text rs(”goodname“)= GoodText(1).Text rs(”danwei“)= GoodText(2).Text rs(”outdate“)= GoodText(3).Text rs(”danjia“)= GoodText(4).Text rs(”outcount“)= GoodText(0).Text rs(”salename“)= SaleName.Text rs.Update rs.Close rs.Open ”select * from save where goodnum='“ & GNum.Text & ”'“, conn, 1, 3 '在庫存表中將庫存數量減去已售出的數量 If SaleData.action = ”add“ Then rs(”goodcount“)= rs(”goodcount“)(GoodText(0).Text-salecount)End If rs.Update rs.Close MsgBox ”數據更新成功!“, vbOKOnly, ”提示“ SaleData.Adodc1.Refresh Unload Me Case 1 Unload Me End Select End Sub Private Sub Form_Load()Set conn = New ADODB.Connection Set rs = New ADODB.Recordset conn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ Dim saleman As String If SaleData.action = ”add“ Then rs.Open ”select goodnum from save order by goodnum“, conn, 1, 1 Do While Not rs.EOF GNum.AddItem rs(0)rs.MoveNext Loop GNum.Text = GNum.List(0)Else rs.Open ”select * from sale where id=“ & SaleData.id, conn, 1, 1 GNum.AddItem rs(”goodnum“)GoodText(1).Text = rs(”goodname“)GoodText(2).Text = rs(”danwei“)GoodText(3).Text = rs(”outdate“)GoodText(4).Text = rs(”danjia“)GoodText(0).Text = rs(”outcount“)saleman = rs(”salename“)GNum.Text = GNum.List(0)GNum.Enabled = False rs.Close rs.Open ”select * from save where goodnum='“ & GNum.Text & ”'“, conn, 1, 1 SaleNum.Max = GoodText(0).Text + rs(”goodcount“)salecount = GoodText(0).Text End If rs.Close rs.Open ”select salename from saler order by id“, conn, 1, 1 Do While Not rs.EOF SaleName.AddItem rs(0)rs.MoveNext Loop If SaleData.action = ”add“ Then SaleName.Text = SaleName.List(0)Else SaleName.Text = saleman Cmd(0).Caption = ”保存修改“ End If rs.Close End Sub Private Sub Form_Unload(Cancel As Integer)SaleData.Enabled = True End Sub Private Sub GNum_Click()Set conn = New ADODB.Connection Set rs = New ADODB.Recordset conn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & ”人事.mdb;Persist Security Info=False“ rs.Open ”select * from save where goodnum='“ & GNum.Text & ”'“, conn, 1, 1 If Not rs.EOF Then GoodText(1).Text = rs(”goodname“)GoodText(2).Text = rs(”danwei“)SaleNum.Max = rs(”goodcount")End If End Sub 1、課程設計的目的、任務 《匯編語言》課程設計對于鞏固匯編語言理論知識,加強學生的實際動手能力和提高學生綜合素質十分必要。課程設計的目的主要是通過程序設計方法和技能的基本訓練,鞏固在課堂上學到的有關程序設計的基本知識和基本方法,通過實際動手能力的培養,進一步熟悉匯編語言的結構和使用方法,達到能獨立閱讀、編制和調試一定規模的匯編語言程序的水平。 2、軟件需求分析和設計 2.1學生成績管理系統是對學生成績的管理,其中包括以下幾個模塊:(1).插入一個數據(插入學生學號以及語數外三個成績)。(2)修改一個數據。(3)刪除學生成績數據。(4)查找學生成績。(5)查看學生成績的排名(6)查看學生成績分布(7)按esc鍵退出系統 2.2學生成績管理系統應該包含以下信息:學號,語文成績,英語成績,數學成績。因此,系統應該提供以下功能:(1)輸出顯示菜單。(2)輸入學生的成績(3)修改學生成績(4)刪除學生成績(5)查詢學生成績(6)顯示學生成績排名(7)顯示成績分布統計(8)按esc鍵退出系統 2.3依據程序的功能需求,該系統的功能結構圖如下 系統功能結構圖 2.4 程序流程圖: 主程序流程圖 查找學生成績 插入學生學號及成績 修改學生的成績 顯示各個學科各分數段的人數 3、程序實現說明 3.1學生管理系統中各子程序如下: (1).輸入全部學生學號以及語文,英語,數學三科的成績。子程序名:insert 子程序描述:該子程序為輸入字程序。系統在開始的時候是沒有數據的,通過該子程序可以初始化系統,將學生的學號及成績輸入系統。 代碼: insert proc near;定義進程子程序:插入學生,學號及 成績 call input;調用input add n,1 ret insert endp (2).修改輸入的成績。子程序名:modify 子程序描述:通過子程序修改學生的成績 代碼: modify proc near;定義進程子程序:修改學生學號,成績 md1:output mess1;輸出mess1 shuru;調用宏shuru:二位數據輸入 mov bl,n mov bh,0 mov al,dl mov si,0 md: cmp al,xh[si];先查找輸入的學生是否存在 je qq1_1;查到的話,就跳轉到qq1_1輸入修改的值,也就是重新輸入。;結果相等則跳轉到qq1_1 add si,1 cmp si,bx jbe md;小于等于則跳轉到md output mess;輸出mess jmp md1;不相等繼續輸入學號 qq1_1:;轉入修改的值重新輸入。mov di,si output mess2 output mess4 mov si,0 mov cx,3 qq3_1:shuruu;cmp dx,78h; jbe qq2_1;output ts3;jmp qq1_1;qq2_1:mov buf[si],dl output bg;add si,1 loop qq3_1 mov al,buf[0];mov chi[di],al mov al,buf[1] 分別輸入語文,英語,數學成績,并將其放 在緩沖區buf中 比較輸入的成績是否大于120,如果大于120的 話,那么重 新輸入成績 小于等于則轉移到qq2_1 輸出ts3 跳轉到qq1_1 輸出空格 將存入buf中的成績,分別賦值給存放對應科 目的成績的數組 mov eng[di],al mov al,buf[2] mov mat[di],al ret modify endp (3).刪除學生的成績。子程序名:delete 子程序描述:通過子程序刪除學生的成績 代碼: de proc near;刪除某個學生的記錄 sc1:output mess1 shuru;調用宏shuru,接受輸入的學號 mov bl,n mov bh,0 mov al,dl mov si,0 sc: cmp al,xh[si];查詢輸入學號的學生信息是否存在,不存在的話,重新輸入學號 je sc2;相等則轉移到sc2 add si,1 cmp si,bx jbe sc;小于等于則轉移到sc output mess;輸出mess jmp sc1 sc2: sub bx,si cmp bx,0 je sc3;相等則轉移到sc3 mov cx,bx sc4:mov dl,chi[si+1] mov chi[si],dl mov dl,eng[si+1] mov eng[si],dl mov dl,mat[si+1] mov mat[si],dl mov dl,xh[si+1] mov xh[si],dl add si,1 loop sc4;loop循環指令,執行操作(cx)<--(cx)-1.若 cx!=0,跳轉到標號sc處循環執行;cx=0,則推出 循環,執行loop的下一條指令 sub n,1 sc3: ret de endp (3).查詢學生的成績。子程序名:find 子程序描述:通過子程序查詢學生的成績 代碼: find proc near;定義進程子程序:查找學生成績 call sum;求學生的總成績 call ping;求學生的平均成績 bj1:output mess1;輸出mess1 shuru;二位數數據輸入 mov bl,n mov bh,0 mov al,dl mov si,0 bj: cmp al,xh[si];將輸入的學號與輸入的學號相比,je i;存在的話,將此學生的成績輸出。je表示結果相 等則轉移。add si,1 cmp si,bx jbe bj;output mess jmp bj1 i: output strr2 shuzi xh[si];shuzi output bg;mov al,chi[si] cbw;shuzii ax;shuzii output bg;mov al,eng[si] cbw;shuzii ax;shuzii output bg mov al,mat[si] cbw shuzii ax output bg; mov al,pj[si] cbw 小于等于則轉移到bj 為二位數據輸出 輸出空格 將字節變為字 為三位數據輸出。輸出空格 將字節變為字 為三位數據輸出 輸出空格的字符串,用于與標題欄對齊 shuzii ax output bg mov ax,si mov bl,2 mul bl mov bx,ax shuzii zc[bx];shuzii為三位數據輸出 output bg;輸出空格的字符串,用于與標題欄對齊 shuzi mc[si];shuzi為二位數據輸出 ret find endp (4).顯示學生的成績排名。子程序名:show 子程序描述:通過子程序顯示學生的成績排名 代碼: show proc near;定義進程子程序:顯示結果排名 call sum;調用宏sum call ping;調用宏ping call rank;調用宏rank call shuchu;調用宏shuchu ret show endp 3.2程序運行抓圖: 主菜單 修改學生成績 刪除學生成績 顯示各個學科各分數段的人數 4、程序總結 通過兩個星期的學習,努力,終于完成了報告。系統可以很好的運行。這兩個多星期的時間,幾乎每天不是在敲代碼,就是在看代碼,查書,上網。系統中用到了很多最近才學習的知識,比如宏,子程序。這些都使得代碼的運行效率提高了,代碼行數減少了。系統還用到了bios的清屏功能。這些功能如果不是做課程設計,我想我很難會接觸到這些知識。 由于自己對知識掌握的不是很牢固,其中也會碰到一些困難。每當遇到問題的時候,我會先上網去查找,看看有沒有人提過這方面的問題。互聯網是強大的,大部分的問題通過網絡都可以解決。部分找不到的問題,我就去請教班里學得好的同學。他們對知識的掌握遠超過我。這樣下來,很多問題都迎刃而解了。 課程設計是一個很好的掌握書本上知識的過程。平時上課之后,自己都不會想著去敲一些代碼聯系聯系。通過做課程設計,將理論與實踐結合了起來,對知識的理解更加深入了。 C語言課程設計 倉庫管理系統 #include struct cangku { int num; char name[20]; char introdution[50]; float square; };typedef struct cangku Cangku; int Input(Cangku t[]);void List(Cangku t[],int n);void SearchOnName(Cangku t[],int n);int DeleteRecord(Cangku t[],int n);int AlterRecord(Cangku t[],int n);int AddRecord(Cangku t[],int n);void SortOnName(Cangku t[],int n);void SortOnSquare(Cangku t[],int n);void SaveRecord(Cangku t[],int n);int LoadRecord(Cangku t[]);int LoadRecord1(Cangku t[]);void Save(Cangku t[],int n);void Load(Cangku t[],int n);void Load1(Cangku t[]);int Menu_select(); void main(){ Cangku ck[50];int i,l,length,w=1;int q[4]={5,2,1,0}; system(“cls”);printf(“請輸入第1個密碼:n”);for(i=0;i<4;i++) { scanf(“%d”,&l); system(“cls”); if(l==q[i]) printf(“正確,繼續輸入第%d個密碼:.n”,i+2); else { w=0; printf(“輸入錯誤!n”); break; } } while(w) { switch(Menu_select()) { case 1: length=Input(ck); SaveRecord(ck,length); break; case 2: length=LoadRecord(ck); SearchOnName(ck,length); break; case 3: length=LoadRecord(ck); length=DeleteRecord(ck,length); SaveRecord(ck,length); break; case 4: length=LoadRecord(ck); length=AlterRecord(ck,length); SaveRecord(ck,length); break; case 5: length=LoadRecord(ck); length=AddRecord(ck,length); SaveRecord(ck,length); break; case 6: length=LoadRecord(ck); system(“cls”); List(ck,length); break; case 7: length=LoadRecord(ck); system(“cls”); SortOnName(ck,length); SaveRecord(ck,length); break; case 8: length=LoadRecord(ck); system(“cls”); SortOnSquare(ck,length); SaveRecord(ck,length); break; case 9: length=LoadRecord(ck); system(“cls”); Save(ck,length); break; case 0: length=LoadRecord1(ck); Load1(ck); system(“cls”); Load(ck,length); break; case 10: exit(0); } } } int Menu_select(){ int c; printf(“按任意鍵進入倉庫管理菜單n”); getchar(); system(“cls”); system(“color F0”);printf(“ ******************************倉庫管理*******************************n”); printf(“ * 1.錄入倉庫初始記錄 *n”); printf(“ * 2.按倉庫名稱查找記錄 *n”); printf(“ * 3.刪除倉庫記錄 *n”); printf(“ * 4.修改倉庫記錄 *n”);printf(“ * 5.增加倉庫信息 *n”); printf(“ * 6.顯示全部記錄 *n”); printf(“ * 7.按倉庫名稱排序 *n”); printf(“ * 8.按倉庫面積排序 *n”); printf(“ * 9.備份 *n”);printf(“ * 0.恢復 *n”);printf(“ * 10.退出 *n”); printf(“ *********************************************************************n”);do { printf(“n輸入您想要進行的操作選項鍵(0-10):”); if(scanf(“%d”,&c)!=1) { while(getchar()!='n') continue; } } while(c<0||c>10);return c;} int Input(Cangku t[]){ int i,n; system(“cls”); printf(“n請輸入要輸入的倉庫數目:n”); scanf(“%d”,&n); printf(“開始輸入倉庫信息:n”); for(i=0;i { system(“cls”); printf(“n第%d個倉庫的編號:”,i+1); scanf(“%d”,&t[i].num); printf(“第%d個倉庫的名稱:”,i+1); scanf(“%s”,t[i].name); printf(“第%d個倉庫的面積:”,i+1); scanf(“%f”,&t[i].square); printf(“第%d個倉庫的說明:”,i+1); scanf(“%s”,t[i].introdution);} return(n);} void List(Cangku t[],int n){ int i; printf(“ *********************************************************************n”); printf(“ ** 編號 名稱 面積 說明n”); printf(“ -------n”);for(i=0;i printf(“%17d%13s%20f%14sn”,t[i].num,t[i].name,t[i].square,t[i].introdution);} printf(“ *********************************************************************n”); printf(“n”);getchar();} void SearchOnName(Cangku t[],int n){ char s[20]; int i,flag=0; system(“cls”); printf(“請輸入要查找的倉庫名稱:n”); scanf(“%s”,s); for(i=0;i { if(strcmp(s,t[i].name)==0) { flag=1; system(“cls”); printf(“nn要查找的倉庫信息如下:n”); printf(“n”); printf(“ *********************************************************************n”); printf(“ ** 編號 名稱 面積 說明n”); printf(“ -------n”);{ printf(“%17d%13s%20f%14sn”,t[i].num,t[i].name,t[i].square,t[i].introdution);} printf(“ *********************************************************************n”); printf(“n”); } } if(flag==0) printf(“要查找的倉庫不存在!n”);getchar();} int DeleteRecord(Cangku t[],int n){ char s[20]; char ch; int i,j,flag=0; system(“cls”); printf(“請輸入要刪除的倉庫名稱n”); scanf(“%s”,s); for(i=0;i if(strcmp(s,t[i].name)==0) { flag=1; system(“cls”); printf(“nn要刪除的倉庫信息如下:n”); printf(“n”); printf(“ *********************************************************************n”); printf(“ ** 編號 名稱 面積 說明n”); printf(“ -------n”);{ printf(“%17d%13s%20f%14sn”,t[i].num,t[i].name,t[i].square,t[i].introdution);} printf(“ *********************************************************************n”); printf(“n”); printf(“確定刪除倉庫信息嗎?(Y/N)n”); ch=getchar(); ch=getchar(); if(ch=='Y'||ch=='y') { for(j=i;j t[j]=t[j+1]; n--; i--; printf(“刪除成功.n”); } } } if(flag==0) printf(“要刪除的倉庫不存在!n”); getchar(); return n;} int AlterRecord(Cangku t[],int n){ int i,flag=0; char s[20],ch; system(“cls”); printf(“請輸入要修改的倉庫名稱n”); scanf(“%s”,s); for(i=0;i { if(strcmp(s,t[i].name)==0) { flag=1; system(“cls”); printf(“nn要修改的倉庫信息如下:n”); printf(“n”); printf(“ *********************************************************************n”); printf(“ ** 編號 名稱 面積 說明n”); printf(“ -------n”); { printf(“%17d%13s%20f%14sn”,t[i].num,t[i].name,t[i].square,t[i].introdution); } printf(“ *********************************************************************n”); printf(“n”); printf(“確定修改倉庫信息嗎?(Y/N)n”); ch=getchar(); ch=getchar(); if(ch=='y'||ch=='Y') { system(“cls”); printf(“請輸入修改后的信息:n”); printf(“請輸入倉庫新的名稱:”); scanf(“%s”,t[i].name); printf(“請輸入%s倉庫新的編號:”,t[i].name); scanf(“%d”,&t[i].num); printf(“請輸入%s倉庫新的面積:”,t[i].name); scanf(“%f”,&t[i].square); printf(“請輸入%s倉庫新的說明:”,t[i].name); scanf(“%s”,t[i].introdution); } } } if(flag==0) printf(“要修改的倉庫不存在!n”); getchar(); return n;} int AddRecord(Cangku t[],int n){ int i,m; system(“cls”); printf(“n請輸入再增加的記錄數:n”); scanf(“%d”,&m); printf(“開始追加記錄n”); for(i=n;i { system(“cls”); printf(“n第%d個倉庫的編號:”,i+1); scanf(“%d”,&t[i].num); printf(“第%d個倉庫的名稱:”,i+1); scanf(“%s”,t[i].name); printf(“第%d個倉庫的面積:”,i+1); scanf(“%f”,&t[i].square); printf(“第%d個倉庫的說明:”,i+1); scanf(“%s”,t[i].introdution); } return(n+m);} void SortOnName(Cangku t[],int n){ int i,j; struct cangku temp; for(j=1;j for(i=0;i if((strcmp(t[i].name,t[i+1].name))>0) { temp=t[i]; t[i]=t[i+1]; t[i+1]=temp; } printf(“排序成功!!n”); printf(“排序后倉庫信息列表如下:n”); List(t,n);} void SortOnSquare(Cangku t[],int n){ int i,j; struct cangku temp; for(j=1;j for(i=0;i if(t[i].square { temp=t[i]; t[i]=t[i+1]; t[i+1]=temp; } printf(“排序成功!!n”); printf(“排序后倉庫信息列表如下:n”); List(t,n);} void SaveRecord(Cangku t[],int n){ int i; FILE *fp; if((fp=fopen(“record.txt”,“w”))==NULL) { printf(“不能打開文件!n”); exit(1);} for(i=0;i { fwrite(&t[i],sizeof(struct cangku),1,fp); } fclose(fp);} int LoadRecord(Cangku t[]){ int n=0; FILE *fp; if((fp=fopen(“record.txt”,“a+”))==NULL) { printf(“不能打開文件!n”); exit(1);} while(fread(&t[n],sizeof(struct cangku),1,fp))n++; fclose(fp); printf(“從文件中成功讀出記錄!!n”); return n;} int LoadRecord1(Cangku t[]){ int n=0; FILE *fp; if((fp=fopen(“bkrecord.txt”,“a+”))==NULL) { printf(“不能打開文件!n”); exit(1);} while(fread(&t[n],sizeof(struct cangku),1,fp))n++; fclose(fp); printf(“從文件中成功讀出記錄!!n”); return n;} void Save(Cangku t[],int n){ int i; FILE *fp; if((fp=fopen(“bkrecord.txt”,“w”))==NULL) { printf(“不能打開文件!n”); exit(1);} for(i=0;i { fwrite(&t[i],sizeof(struct cangku),1,fp); } fclose(fp); printf(“備份成功.n”); getchar();} void Load1(Cangku t[]){ int n=0; FILE *fp; if((fp=fopen(“bkrecord.txt”,“a+”))==NULL) { printf(“不能打開文件!n”); exit(1); } while (fread(&t[n],sizeof(struct cangku),1,fp))n++; fclose(fp); getchar();} void Load(Cangku t[],int n){ int i; FILE *fp; if((fp=fopen(“record.txt”,“w”))==NULL) { printf(“不能打開文件!n”); exit(1);} for(i=0;i { fwrite(&t[i],sizeof(struct cangku),1,fp); } fclose(fp); printf(“恢復成功.n”);}1 課程設計說明書 學 院、系: 專 業: 學 生 姓 名: 設 計 題 目: 起 迄 日 期: 指 導 教 師: 學 號: 銷售管理系統 日期: 2017年5月12日 設計目的 1.了解管理信息系統的開發流程,熟悉C語言的文件和結構數組的各種基本操作。2.握高級程序設計語言的知識。 3.踐中逐步掌握程序設計的思想和方法,培養問題求解和語言的應用能力。 4.程序中涉及結構體、數組、文件等方面的知識。通過本程序的訓練,能對C語言 的文件操作有一個更深刻的了解。 5.提高與程序設計和軟件開發有關的各種綜合能力。 6.通過本課程設計,培養上機動手能力,鞏固《C語言程序設計》課程學習的內容,掌握工程軟件設計的基本方法,強化上機動手能力,闖過編程關; 7.為后續各門計算機課程的學習打下堅實基礎;8.學會用c語言程序設計來設計銷售管理系統設計。任務概述 某公司有四個銷售員(編號:1-4),負責銷售五種產品(編號:1-5)。每個銷售員都將當天出售的每種產品各寫一張便條交上來。每張便條包含內容:1)銷售員的代號,2)產品的代號,3)這種產品的當天的銷售額。每位銷售員每天上繳1張便條。 試設計一個便條管理系統,使之能提供以下功能: 1、系統以菜單方式工作 2、便條信息錄入功能(便條信息用文件保存)--輸入 3、收集到了上個月的所有便條后,讀取銷售情況 1)計算每個人每種產品的銷售額。 2)按銷售額對銷售員進行排序,輸出排序結果(銷售員代號) 3)統計每種產品的總銷售額,對這些產品按從高到底的順序,輸出排序結果 4)輸出統計報表 模塊劃分 主菜單及頭文件設計 編輯系統菜單運行 輸入信息 保存信息,參數為結構體數組和記錄數 讀入取函數,參數為結構體數組 清單輸出 主要功能的實現 主要函數說明及其N-S圖 主菜單及頭文件設計: 我們按照老師所給的示例我們首先編譯了一個頭文件,在頭文件里,編譯了主函數需要用到的一些函數,如#include “stdio.h”等,因為需要錄入便條的所有信息,所有用一個數據結構來實現信息的儲存方式,用數組方式,把每條信息都編譯成一個數組,如銷售員代號用name[4]記錄。頭文件還包括了定義常數記錄數typedef struct,主函數原型 int menu_select();/*聲明函數*/ int enter(RECODE t[]);/*聲明函數*/ void salor(RECODE t[],int n);/*聲明函數*/ int sum(RECODE t[],int n,int m);/*聲明函數*/ void list1(RECODE t[],int n);/*聲明函數*/ void list2(RECODE t[],int n);/*聲明函數*/ void list3(RECODE t[],int n);/*聲明函數*/ void save(RECODE t[],int n);/*聲明函數*/ int load(RECODE t[]);/*聲明函數*/ 這些的都是主函數需要用到的數據,因此放入頭文件當中,在主程序開始之前直接引用#include “pro.h”。 2.編輯系統菜單運行: 題目要求我們系統以菜單方式工作,所以我們現要定義一個系統的結構體數組RECODE rec[600],用for(;;)循環讓菜單實現無限循環,讓switch(menu_select())調用主菜單函數,返回值整數作開關語句的條件,之后分別定義菜單的信息,如: case 1: length=enter(rec);就是輸入信息的定義編輯,當然最后需要用到break來實現返回。菜單定義完成之后,開始編譯菜單的輸出,這部分,用了printf就把需要顯示的菜單顯示出來,然后由用戶選擇菜單的選項,因為菜單只有0~7的選項,為了防止用戶輸入選項超值,所以用do while語句來控制,(c<0||c>7) 限定了用戶輸入的數據只有0~7才有效,超值則返回開始菜單,重新選擇(return)。 3.輸入信息: 輸入信息一般都是使用scanf來實現,但在用戶輸入之前需要解決一個問題,程序必須限制用戶的輸入序數(記錄條數),所以在輸入數據之前,必須先限定序數,方法則是用一個for循環來實現,有用戶輸入一個數字,成為循環的上限,而用戶輸入的便條信息則在此限定下,不能超出,當超出時則返回到開始菜單。用戶輸入的便條信息分別存入對應的數組當中,如便條條數則存入t[i].num當中。 4.保存信息,參數為結構體數組和記錄數: 用戶輸入的信息需要保存時,用save選項進行保存。保存的時候,實現應該建立一個指向文件的指針,從而固定保存文件時的位置,之后用if語句來判斷打開文件是否正常,if((fp=fopen(“record.txt”,“wb”))==NULL),如果沒打開(打開不正常),則程序執行退出;當判斷文件打開正常時,系統顯示“保存文件”(用printf(“n保存文件n”)來完成),保存信息是用到的fprintf函數,將制定記錄數輸入文件fprintf(fp,“%d”,n),因為源文件中采用了換行,保存文件是系統默認不會進行保存,所有必須加如換行符號保存,防止文件丟失,保證文件以用戶輸入的信息一致,保存換行符號依然采用fprintf函數來實現,具體源文件為fprintf(fp,“rn”);當確立了保存的可以性之后,系統開始錄入需要保存的信息,用for循環語句,不斷把用戶輸入的信息保存,因為之前在編寫輸入,輸出程序時,都用到了一定的格式,保證信息的一一對應,所以在保存文件時,也需要確定和輸入是相同的格式,這里依然使用fprintf函數來進行保存,如fprintf(fp,“%-10d%-7d%-7d%-7d%-7d-7d”,t[i].name,t[i].a1,t[i].a2,t[i].a3,t[i].a4,t[i].a5)就是把銷售員代號,產品代號,銷售額按照間隔7個字符格式進行保存,在保存格式確立后,需要把換行符號再次寫入文件,程序結束后fclose結束保存,并用printf輸出“文件保存成功”,讓用戶知道已經保存文件。 5.讀入取函數,參數為結構體數組: 前面已經做了文件的保存,當保存文件成功后,系統會以record.txt文件保存在與程序同級的文件夾下,而讀入函數,就是為了讓用戶再次打開運行程序時,可以直接讀取之前已經輸入并保存過的信息,和儲存信息一樣,讀入函數也采用了參數為結構體數組,同樣應該確定文件指向指針FILE *fp,讀入函數之前,應該確定是否有已經保存的文件,用保存文件一樣,用if語句來進行判斷 if((fp=fopen(“record.txt”,“rb”))==NULL),如果判斷失敗,系統不能讀入文件,則會顯示“不能打開文件”,用printf(“不能打開文件n”)來實現,同時系統要結束讀入文件的執行,用exit(1)實現;如果判斷成功,則系統會自動讀入用戶已經保存的數據(fscanf(fp,“%d”,&n)讀入記錄數),用for循環把已經保存的數據一一對應的讀入到正在執行的程序中,這里需要注意的是,讀取的數據格式應該同保 存 時的一 致,如 儲 存 時的格 式 是fprintf(fp,“%-10d%-7d%-7d%-7d%-7d-7d”,t[i].name,t[i].a1,t[i].a2,t[i].a3,t[i].a4,t[i].a5),則讀 入的時的格 式 就 為fscanf(fp,“%d%d%d%d%d%d”,&(t[i].name),&(t[i].a1),&(t[i].a2),&(t[i].a3),&(t[i].a4),&(t[i].a5)),讀取成功后關閉文件fclose(fp),并顯示“成功地從文件讀入數據!!”(用printf實現)。 6.清單輸出: 讀取銷售情況有3個,分別是每個人每種產品的銷售額,按銷售額對銷售員進行排序和每種產品的總銷售額三個函數: 1).每個人每種產品的銷售額: 首先,要定義每個人,每種產品,銷售額數組如 int i,j,sum0=0,sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;int c[4],b1[4]={0},b2[4]={0},b3[4]={0},b4[4]={0},b5[4]={0},用for循環來求每個人的總銷售額:for(i=0;i<4;i++);用for循環來求每個人每種產品的總銷售額:for(i=0;i 此部分要分兩部分其一是,每位銷售員銷售額;其二是,按銷售額對銷售員排序。在求每個銷售員銷售額時也是要先定義銷售員代號,產品代號,銷售額。接著是則是用輸入要查詢的銷售員的代號,用scanf(“%d”,&s)來記錄輸入銷售員代號的信息,然后輸出頭標(如銷售員代號,產品代號,銷售額等,用printf實現),之后開始查詢,查詢信息首先需要一個for語句來,實現對已存入數據的所有查詢for(i=0;i 也一樣首先要定義數組,接著用c[i]=sum(t,n,i+1)求每個人的總銷售額,再用for循環,再用 sum0+=c[i]對所有產品的銷售額求總,用for循環對每個人每種產品的銷售額求總銷售額,再用for循環實現每種產品的總銷售額,然后輸出 頭標(如銷售員代號,產品代號,總銷售額等,用printf實現)即可。程序運行數據及其結果 1.進入主菜單: 2.選擇“1”,輸入便條: 3.輸入條數,如:輸入2天的便條,8條: 4.選擇“2”,保存到文件: 5.選擇“3”,讀取文件: 6.選擇“4”,顯示清單: 7.選擇“5”,每位銷售員的銷售額: 8.輸入查詢員工代號,如:查詢的員工號為3: 8.選擇“6”,每種產品的銷售額: 9.選擇“7”,按銷售額對銷售員排序: 10.選擇“0”,退出管理: 11.保存的文件: 保存的文件為TXT格式,其保存的文件為: 課程設計心得 經過上機實踐學習,使我對c語言有了更進一步的認識和了解,C語言是計算機程序設計的重要理論基礎,在我們以后的學習和工作中都有著十分重要的地位。要學好這種語言,僅僅學習課本上的知識是不夠的,還要經常自己動手,有較強的實踐能力。只有多動手,經常編寫程序,才能發現我們學習上的漏洞和自己的不足,并在實踐中解決這些問題,不斷提高自己轉化知識的能力。通過實踐,我也發現 我的好多不足之處,首先是自己在指法上還不行,經常按錯字母,通過學習也有所改進;再有對c語言的一些標準庫函數不太了解,還有對函數調用的正確使用不夠熟悉,還有對c語言中經常出現的錯誤也不了解,通過實踐,使我在這幾個方面的認識有所提高。通過實踐的學習,我認到學好計算機要重視實踐操作,不僅僅是學習c語言,還是其它的語言,以及其它的計算機方面的知識都要重在實踐,所以后在學習過程中,我會更加注視實踐操作,使自己便好地學好計算機。 附錄: #include “stdio.h”/*輸入輸出函數*/ #include “stdlib.h”/*通用應用程序函數*/ #include “string.h”/*字符串函數*/ #include “ctype.h”/*字符操作函數*/ typedef struct /*定義結構體變量*/ { int name;/*銷售員代號*/ int a1;/*產品一代號*/ int a2;/*產品二代號*/ int a3;/*產品三代號*/ int a4;/*產品四代號*/ int a5;/*產品五代號*/ }RECODE; /******以下是函數原型*******/ int menu_select();/*聲明函數*/ int enter(RECODE t[]);/*聲明函數*/ void salor(RECODE t[],int n);/*聲明函數*/ int sum(RECODE t[],int n,int m);/*聲明函數*/ void list1(RECODE t[],int n);/*聲明函數*/ void list2(RECODE t[],int n);/*聲明函數*/ void list3(RECODE t[],int n);/*聲明函數*/ void save(RECODE t[],int n);/*聲明函數*/ int load(RECODE t[]);/*聲明函數*/ /*主函數開始*/ int main()/*主函數*/ { } RECODE rec[600];int length; system(“cls”);/*清屏*/ for(;;)/*無限循環*/ {switch(menu_select())/*根據用戶的選擇判斷該調用哪個功能函數*/ { break;case 2:save(rec,length); } } break;break;break;break;break;break;case 3:length=load(rec);case 4:list1(rec,length);case 5:salor(rec,length);case 6:list2(rec,length);case 7:list3(rec,length);case 0:exit(0); case 1:length=enter(rec);int menu_select()/*菜單函數*/ { int n; printf(“********************MENU*****************nn”);printf(“ 1 輸入便條n”);printf(“ 2 保存到文件n”);printf(“ 3 讀取文件n”);printf(“ 4 顯示便條清單n”); printf(“ 5 每位銷售員的銷售額n”);printf(“ 6 每種產品的銷售額n”);printf(“ 7 按銷售額對銷售員排序n”);printf(“ 0 退出管理n”); printf(“*********************END****************nn”);printf(“ 請選擇你的操作(0-7): n”);scanf(“%d”,&n);if(0 /*清單輸入*/ int enter(RECODE t[]){ int i,num;system(“cls”);/*清屏*/ printf(“請輸入要寫的便條條數:n”); scanf(“%d”,&num);/*輸入所要寫入的清單的條數*/ printf(“name product1 product2 product3 product4 product5”);for(i=0;i } printf(“n----nnn”);return i;} /*保存文件*/ void save(RECODE t[],int n){ printf(“nn-----n”); scanf(“%d%d%d%d%d%d”,&t[i].name,&t[i].a1,&t[i].a2,&t[i].a3,&t[i].a4,&t[i].a5); int i; FILE *fp;/*調用fopen函數*/ if((fp=fopen(“record.txt”,“wb”))==NULL)/*如果函數帶回一個空指針值*/ { printf(“不能打開文件n”);/*不能打開文件*/ exit(1);} fprintf(fp,“%d”,n);fprintf(fp,“rn”);for(i=0;i fprintf(fp,“%-10d%-7d%-7d%-7d%-7d%-7d”,t[i].name,t[i].a1,t[i].a2,t[i].a3,t[i].a4,t[i].a5);/*將便條的信息輸出到fp指向的文件上*/ fprintf(fp,“rn”);} fclose(fp);/*關閉文件*/ printf(“****保存成功***nn”);/*顯示保存成功*/ printf(“press any key to continue......n”);getchar();} /*讀取文件*/ int load(RECODE t[]){ int i,n;FILE *fp; if((fp=fopen(“record.txt”,“r”))==NULL)/*如果函數帶回一個空指針值*/ { printf(“不能打開文件n”);/*不能打開文件*/ exit(1);} fscanf(fp,“%d”,&n); for(i=0;i fscanf(fp,“%d%d%d%d%d%d”,&(t[i].name),&(t[i].a1),&(t[i].a2), &(t[i].a3),&(t[i].a4),&(t[i].a5));/*從fp指向的文件上讀入便條信息*/ fclose(fp); printf(“n 成功讀取文件!!n”);/*成功讀入信息*/ printf(“press any key to continue......nn”);getchar();return n;} /*顯示清單*/ void list1(RECODE t[],int n){ int i;FILE *fp; if((fp=fopen(“record.txt”,“r”))==NULL)/*如果函數帶回一個空指針值*/ { printf(“不能打開文件n”);/*不能打開文件*/ exit(1);} fscanf(fp,“%d”,&n);for(i=0;i fscanf(fp,“%d%d%d%d%d%d”,&(t[i].name),&(t[i].a1),&(t[i].a2),&(t[i].a3),&(t[i].a4),&(t[i].a5));/*從fp指向的文件上讀入便條信息*/ fclose(fp); printf(“***************************the recode**************************nnn”); printf(“name product1 product2 product3 product4 product5”);for(i=0;i printf(“ %d %d %d %d %d %d”,t[i].name,lise of saling t[i].a1,t[i].a2,t[i].a3,t[i].a4,t[i].a5); } printf(“nn--n”);printf(“n press any key to continue.......n”);getchar();} /*每位銷售員銷售額*/ void salor(RECODE t[],int n){ int i,s; int b1=0,b2=0,b3=0,b4=0,b5=0; printf(“請輸入要查詢的銷售員的代號(1-4): n”); scanf(“%d”,&s);/*輸入所要查看的售貨員的代號*/ for(i=0;i if(t[i].name==s){b1+=t[i].a1; b2+=t[i].a2; b3+=t[i].a3; b4+=t[i].a4; b5+=t[i].a5;} printf(“name product1 product2 product3 product4 product5n”); printf(“------------n”); printf(“%-15d%-10d%-10d%-7d%-7d%-7d”,s,b1,b2,b3,b4,b5); printf(“npress enter to continue.......n”); getchar(); } /*銷售產品總和*/ int sum(RECODE t[],int n, int e){ int i,sum=0; for(i=0;i<=n;i++)/*求銷售產品的總和*/ if(e==t[i].name) {sum+=t[i].a1;sum+=t[i].a2;sum+=t[i].a3;sum+=t[i].a4;sum+=t[i].a5;} return sum;} /*每種產品的銷售額*/ void list2(RECODE t[],int n){ int i,j,sum0=0,sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;int c[4],b1[4]={0},b2[4]={0},b3[4]={0},b4[4]={0},b5[4]={0};system(“cls”);;for(i=0;i<4;i++) c[i]=sum(t,n,i+1);/*求每個人的總銷售額*/ for(i=0;i<4;i++) sum0+=c[i];/*所有產品的銷售額*/ for(i=0;i for(i=0;i<4;i++)/*每種產品的總銷售額*/ {sum1+=b1[i];sum2+=b2[i]; sum3+=b3[i];sum4+=b4[i];sum5+=b5[i];} printf(“ products numn”); printf(“ code sumnn”);for(i=0;i<4;i++) printf(“ %-10d%-7d%-7d%-7d%-7d%-7d%-7dn”,i+1,b1[i],b2[i],b3[i],b4[i],b5[i],c[i]);printf(“ psum %-7d%-7d%-7d%-7d%-7d%-7d”,sum1,sum2,sum3,sum4,sum5,sum0);printf(“n press any key to continue.......n”);getchar();} /*按銷售額對銷售員排序*/ void list3(RECODE t[],int n){ int i,j,s; int c[4],m[4];/*定義兩個數組*/ system(“cls”);/*清屏*/ for(i=0;i<4;i++)m[i]=i+1;for(i=0;i<4;i++)c[i]=sum(t,n,m[i]); for(i=0;i<4;i++)/*按銷售員的銷售額進行排序*/ for(j=i+1;j<4;j++)if(c[i] } printf(“the sequce of salor'saling number from many to fewn”);for(i=0;i<4;i++)/*輸出銷售員代號*/ printf(“%dn”,m[i]); printf(“ninput any key to continue.......n”);getchar();}第二篇:軟件工程 課程設計 銷售管理系統
第三篇:語言課程設計-學生成績管理系統
第四篇:C語言課程設計 倉庫管理系統
第五篇:c語言銷售管理系統