




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、題目學生成績管理系統(tǒng)一、 功能1. 每一條記錄包括一個學生的學號、姓名、語數外3門成績、平均成績2. 輸入功能:可以一次完成有限(不大于2000)條記錄的輸入3. 顯示功能:完成全部學生記錄的顯示4. 查找功能:完成按學號或姓名查找學生記錄,并顯示5. 排序功能:按學生學號或平均成績進行排序6. 保存功能:將學生記錄保存在Information.txt文件中7. 讀取功能:將保存在文件中的學生記錄讀取出來8. 有一個清晰美觀界面來調用各個功能二、 要求1. 整個系統(tǒng)均用C語言實現2. 利用指針、結構體數組或鏈表來實現學生成績的數據結構設計3. 系統(tǒng)具有輸入、顯示、查詢、修改、刪除、排序、保存、
2、讀取等基本功能4. 系統(tǒng)的各個功能模塊都用函數的形式來實現5. 可以將學生成績信息保存在文件中6. 可以將學生信息從文件中讀取出來三、 設計內容整個學生成績管理系統(tǒng)由主函數及12個子函數構成,實現學生成績錄入、顯示、查詢、排序、修改、保存、讀取和刪除共8項功能,各函數功能相信說明如下:1.主函數 int main()利用無限次循環(huán)while和switch實現對各個函數的調用,使用時根據輸入的數字來調用相應的函數2. 顯示主菜單函數void DispMainMenu()這是一個無參函數,用來顯示程序主菜單,用戶通過輸入對應功能前的數字來實現相應的功能3. 學生成績錄入函數int Informat
3、ionInput(STUDENT stu,int cn)這是一個有返回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,形參int cn為當前學生人數,返回值為當前學生人數。其作用是輸入有限個學生的成績信息。算法:定義3個變量,num用來存放本次錄入學生人數,i、j為循環(huán)變量。由鍵盤輸入學生人數賦值給num,判斷num是否大于MAX_NUM(2000),若大于,則提示輸入人數太多,函數返回值0;若不大于,則依次輸入num個學生信息。4. 顯示所有學生信息函數void DispInformation(STUDENT stu,int MAX)這是一個無
4、返回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,形參int MAX為為當前學生人數。其作用是現實當前所有學生成績信息。5. 查找指定學號的學生的信息函數int FindStudentnumber(STUDENT stu,int findnumber,int MAX)這是一個有返回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,形參int MAX為當前學生人數。其作用是根據指定學號查詢學生成績信息,若查找到指定學號學生信息,則返回該學生學號,否則返回-1。算法:6. 查找指定姓名的學生的信息函數i
5、nt FindStudentname(STUDENT stu,char findname,int MAX)這是一個有返回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,形參int MAX為當前學生人數。其作用是根據指定姓名查詢學生成績信息,若查找到指定姓名學生信息,則返回該學生學號,否則返回-1。算法:7. 學生信息查詢函數void QueryInformation(STUDENT stu,int MAX)這是一個無返回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,形參int MAX為當前學生人數
6、。其作用是可以根據學號或姓名查找到指定學生的成績信息。算法:定義查詢方式字符變量select,指定學號整型變量findnumber,指定姓名字符串數組findname10,整型變量i,循環(huán)變量j。調用函數時,屏幕提示選擇查詢方式,若選擇按學號查詢,則輸入學號后調用查找指定學號的學生的信息函數int FindStudentnumber(STUDENT stu,int findnumber,int MAX)將返回值賦給變量i,若變量i不為-1,則查找成功,輸出學生信息,否則在屏幕顯示“輸入學號不存在”;若選擇按姓名查詢則輸入姓名后調用查找指定姓名的學生的信息函數int FindStudentnam
7、e(STUDENT stu,char findname,int MAX)將返回值賦給i,若變量i不為-1,則查找成功,輸出學生信息,否則在屏幕顯示“輸入學號不存在”。若在選擇查詢方式時輸入除“1”、“2”外的其他字符,則提示“選擇錯誤”。N-S圖8. 修改學生信息函數 void EditInformation(STUDENT stu,int MAX)這是一個無返回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,形參int MAX為當前學生人數。其作用是修改或刪除指定學生的成績信息。算法:定義整型變量i、j,j為循環(huán)變量;浮點型變量sum,用來尋訪
8、總成績;整形變量findnum用來存放需要修改信息的學生學號;字符變量select用來存放修改方式代號。輸入學號后調用查找指定學號的學生的信息函數int FindStudentnumber(STUDENT stu,int findnumber,int MAX)將返回值賦給變量i,若變量i不為-1,則存在該學號學生。在屏幕提示選擇修改方式,若選擇修改信息,則先在屏幕輸出原信息,后按提示依次修改信息;若選擇刪除信息,則調用刪除信息函數void Delete(STUDENT stu,int n,int MAX)刪除該學號學生信息。若未查找到指定學號,則在屏幕輸出“您輸入的學號不存在”。N-S圖9.
9、按學號排序函數void SortNum(STUDENT stu,int MAX)這是一個無返回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,形參int MAX為當前學生人數。其作用是用冒泡法將學生成績信息按學號由小到大排列。算法:定義循環(huán)變量i、j,結構體變量p作為中間變量。冒泡法完成排序后,調用顯示所有學生信息函數void DispInformation(STUDENT stu,int MAX)在屏幕打印出排序后的學生成績信息。N-S圖10. 按平均成績排序函數void SortScore(STUDENT stu,int MAX)這是一個無返
10、回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,形參int MAX為當前學生人數。其作用是用冒泡法將學生成績信息按平均成績由大到小排列。算法:定義循環(huán)變量i、j,結構體變量p作為中間變量。冒泡法完成排序后,調用顯示所有學生信息函數void DispInformation(STUDENT stu,int MAX)在屏幕打印出排序后的學生成績信息。N-S圖11. 保存數據到文件函數void Save(STUDENT stu,int MAX)這是一個無返回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,
11、形參int MAX為當前學生人數。其作用是將存放在結構體數組中的學生成績信息保存到文件Information.txt中。算法:定義整型變量i,文件指針*fp。若成功打開文件Information.txt,則用fwrite()將存放在結構體數組中的學生成績信息保存到文件Information.txt中;若打開失敗,則在屏幕輸出“can not open file”。N-S圖12. 打開數據文件函數int Read(STUDENT stu)這是一個有返回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,返回值為讀取到的學生信息個數,即學生人數。其作用是
12、將存放在文件Information.txt中的學生成績信息存放到結構體數組中。算法:定義整型變量i,文件指針*fp。若成功打開文件Information.txt,則計數變量賦值為0,每完成一次讀取,i自加1。若打開失敗,則在屏幕輸出“can not open file”。N-S圖13.刪除信息函數void Delete(STUDENT stu,int n,int MAX)這是一個無返回值的有參函數,形參STUDENT stu為結構體數組指針,表示存有學生信息的結構體數組的頭指針,形參int n表示血藥刪除的學生序號,形參int MAX為當前學生人數。其作用是刪除第n個學生的信息。算法:定義循環(huán)
13、變量i、j,文件指針*fp。打開存有學生成績信息的文件Information.txt,在屏幕顯示源信息。然后將存放在結構體數組中的信息,從第n個開始,之后每一組數據覆蓋前一組數據,以達到刪除信息的同時又保證結構體數組中信息連續(xù)的目的。之后當前學生人數自減1,重新保存數據到文件Information.txt,在屏幕輸出當前所有學生信息。N-S圖五、調試分析1.運行時輸入信息沒有按照scanf()函數格式輸入,導致程序無法正常繼續(xù)運行。2.按照正確格式輸入完信息后按回車鍵后出現“燙燙燙燙”字樣的亂碼,后經檢查發(fā)現在學生成績輸入函數int InformationInput(STUDENT stu,i
14、nt cn)中調用了顯示所有學生信息函數void DispInformation(STUDENT stu,int MAX),而顯示所有學生信息函數void DispInformation(STUDENT stu,int MAX)中,語句for (i=0;i<MAX;i+)后誤按了一個“;”導致不能正常執(zhí)行循環(huán)體,后經考慮,決定刪除輸入完后顯示學生信息和排序的語句。3.經2修改后再次運行,出現了運行結果一閃而過的情況,所以上網查找解決方法。先開始查到的方法是需要添加頭文件#include<conio.h>并且在需要停留的地方輸入語句“getch();”,再次運行發(fā)現運行結果還是
15、一閃而過。再次查詢后,將getch()改為“system("pause");”。再次運行能正常顯示。4.經3修改后再次運行,在排序部分,發(fā)現按照平均成績排序時是由小到大排序的,不符合實際應用中最常用的由大到小排序,遂進行修改。5.經4修改后,在修改信息時,結果不能正常輸入學號,檢查代碼后發(fā)現語句“scanf("%d",&stui.number);”中“stui.number”前漏掉了取地址符號“&”。6.經5修改后,程序能完整運行,但是在查看文件內容是發(fā)現信息均為亂碼,后有查閱教科書,其解釋為fread()和fwrite()一般用于二進制
16、文件的處理。7.程序運行后,界面內容太多,容易混亂,查詢后添加清屏函數“system("cls");”六、總結經過這次C語言實踐活動,我覺得我的C語言水平相對上學期期末又提高了不少。過去只是對單個知識點較為清楚,如今已經能夠形成體系,并且寫出有使用價值的程序。雖然程序很小,但是萬事都要有個循序漸進、由易到難的過程。另外,這次實踐對我通過江蘇省計算機等級考試(二級C)也有很大的幫助。過去我們都是軟件的使用者,看到的都是軟件給我們處理日常事務的便捷之處,如今我們已經能深入后臺,自己設計、編寫程序了,今后還要躲在易用性和美觀上面多下功夫。我相信,這次實踐會成為我今后進行編程、開發(fā)
17、的良好開端和基礎。附程序源代碼:/*頭文件*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<windows.h>#include<conio.h>#define MAX_NUM 2000 /*人數上限2000*/*定義數據結構*/typedef struct studentint number; /*學號*/char name10; /*姓名*/float score3; /*三門課成績*/float aver; /*平均成績*/STUDENT;/*函數原型
18、*/void DispMainMenu(); /*顯示主菜單*/int InformationInput(STUDENT stu,int cn); /*學生成績錄入*/void DispInformation(STUDENT stu,int MAX); /*顯示所有學生信息*/int FindStudentnumber(STUDENT stu,int findnumber,int MAX); /*查找指定學號的學生的信息*/int FindStudentname(STUDENT stu,char findname,int MAX); /*查找指定姓名的學生的信息*/void QueryInfo
19、rmation(STUDENT stu,int MAX); /*學生信息查詢*/void EditInformation(STUDENT stu,int MAX); /*修改學生信息*/void SortNum(STUDENT stu,int MAX); /*按學號排序*/void SortScore(STUDENT stu,int MAX); /*按平均成績排序*/void Save(STUDENT stu,int MAX); /*保存數據到文件*/int Read(STUDENT stu); /*打開數據文件*/void Delete(STUDENT stu,int n,int MAX);
20、 /*刪除信息*/*顯示主菜單*/void DispMainMenu()printf("*學生成績管理系統(tǒng)*n");printf(" t1.信息錄入 t2.按學號排序n");printf(" t3.按平均成績排序 t4.信息修改n");printf(" t5.信息查詢 t6.保存到數據文件n");printf(" t7.打開數據文件 t8.顯示所有學生信息n");printf(" t0.退出");printf("n*n");printf("請選擇
21、0-8:"); /*顯示菜單信息*/*學生成績錄入*/int InformationInput(STUDENT stu,int cn)int num,i,j;float sum=0;printf("n請輸入本次錄入的學生人數:");scanf("%d",&num);if(num>MAX_NUM)printf("您輸入的人數太多,大于%d人!n",MAX_NUM);system("pause");return 0;for(i=cn;i<num+cn;i+) /*輸入num個學生的信息*/
22、printf("請輸入第%d個學生的學號:",i+1);scanf("%d",&stui.number);printf(" 姓名:");scanf("%s",);printf(" 語數外成績:");for(j=0;j<3;j+)scanf("%f",&stui.scorej);sum=sum+stui.scorej;stui.aver=sum/3;sum=0;system("pause"); return (num+
23、cn);/*顯示所有學生信息*/void DispInformation(STUDENT stu,int MAX)int i,j;printf("n序號t學號t姓名t語數外成績tt平均成績n");for(i=0;i<MAX;i+)printf("%dt%dt%st",i+1,stui.number,);for(j=0;j<3;j+)printf("%.2ft",stui.scorej);printf("%.2f",stui.aver);printf("n");pri
24、ntf("n");system("pause");/*查找指定學號的學生的信息*/int FindStudentnumber(STUDENT stu,int findnumber,int MAX)int i;for(i=0;i<MAX;i+)if(stui.number=findnumber)break;if(i<MAX) /*判斷找到的i是否小于MAX,若小于,則執(zhí)行了break跳出循環(huán),即找到該指定學號的學生*/return i;elsereturn -1;/*查找指定姓名的學生的信息*/int FindStudentname(STUDE
25、NT stu,char findname,int MAX)int i;for(i=0;i<MAX;i+)if(strcmp(,findname)=0)break;if(i<MAX) /*判斷找到的i是否小于MAX,若小于,則執(zhí)行了break跳出循環(huán),即找到該指定姓名的學生*/return i;elsereturn -1;/*學生信息查詢*/void QueryInformation(STUDENT stu,int MAX)char select;int i,j;int findnumber;char findname10;printf("*請選擇查詢方式
26、*n");printf(" t1.按學號查詢;t2.按姓名查詢n");printf("*n");printf("請選擇1或2:"); select=getche();switch(select)case '1':printf("n您選擇的是按學號查詢n請輸入學生的學號:"); /*按學號查詢*/scanf("%d",&findnumber);if(i=FindStudentnumber(stu,findnumber,MAX)!=-1)printf("n
27、查找結果如下:n");printf("n學號t姓名t語數外成績tt平均成績n");printf("%dt%st",stui.number,);for(j=0;j<3;j+)printf("%.2ft",stui.scorej); printf("%.2fn",stui.aver);elseprintf("您輸入的學號不存在!n");break;case '2':printf("n您選擇的是按姓名查詢n請輸入學生的姓名:");
28、/*按學號查詢*/scanf("%s",&findname);if(i=FindStudentname(stu,findname,MAX)!=-1)printf("n查找結果如下:n");printf("n學號t姓名t語數外成績tt平均成績n");printf("%dt%st",stui.number,);for(j=0;j<3;j+)printf("%.2ft",stui.scorej); printf("%.2fn",stui.aver);
29、elseprintf("您輸入的學號不存在!n");system("pause");break;default:printf("選擇錯誤!n");/*修改學生信息*/void EditInformation(STUDENT stu,int MAX)int i,j;float sum=0;int findnum;char select;printf("n請輸入學生學號:");scanf("%d",&findnum);if(i=FindStudentnumber(stu,findnum,MA
30、X)!=-1)printf("*請選擇修改方式*n");printf("t1.修改信息;t2.刪除信息n");printf("*n");printf("請選擇1或2:");select=getche();switch(select)case '1':printf("您選擇的是修改信息!n");printf("姓 名:%sn",);printf("原信息:n 學號:%dt語數外成績:",stui.number);for(j=
31、0;j<3;j+) printf("%.2ft",stui.scorej); printf("t平均成績:%.2fn",stui.aver);printf("請輸入新信息n");printf("學號:t");scanf("%d",&stui.number);printf("姓名:t");scanf("%s",);printf("語數外成績:t");for(j=0;j<3;j+) scanf(&quo
32、t;%f",&stui.scorej); sum=sum+stui.scorej; stui.aver=sum/3;break;case '2': printf("您選擇的是刪除信息!n");Delete(stu,i,MAX);break;elseprintf("您輸入的學號不存在!n"); system("pause");/*按學號排序*/void SortNum(STUDENT stu,int MAX) /*冒泡法由小到大排序*/int i,j;STUDENT p;for(i=0;i<MAX
33、-1;i+)for(j=0;j<MAX-1-i;j+)if(stuj.number>=stuj+1.number)p=stuj;stuj=stuj+1;stuj+1=p;printf("按學號排序后:n");DispInformation(stu,MAX);/*按平均成績排序*/void SortScore(STUDENT stu,int MAX) /*冒泡法由大到小排序*/ int i,j;STUDENT p;for(i=0;i<MAX-1;i+)for(j=0;j<MAX-1-i;j+)if(stuj.aver>=stuj+1.aver)p
34、=stuj;stuj=stuj+1;stuj+1=p;printf("按平均成績排序后:n");DispInformation(stu,MAX);/*保存數據到文件*/void Save(STUDENT stu,int MAX)int i;FILE *fp;if(fp=fopen("Information.txt","w+")!=NULL)for(i=0;i<MAX;i+)fwrite(&stui,sizeof(STUDENT),1,fp);fclose(fp);elseprintf("cannot open
35、file!n");/*打開數據文件*/int Read(STUDENT stu)int i;int result=-1;FILE *fp;if(fp=fopen("Information.txt","r")!=NULL)i=0;while(fread(&stui,sizeof(STUDENT),1,fp)!=0)i+; /*讀取到一個信息時,i作為學生人數自加1*/result=i;fclose(fp);elseprintf("cannot open the file!n");return result;/*刪除信息
36、*/void Delete(STUDENT stu,int n,int MAX)FILE *fp;int i,j;if(fp=fopen("Information.txt","rb")=NULL)printf("cannot open the file!n");exit(0);printf("n源信息:n");DispInformation(stu,MAX);for(i=n;i<MAX-1;i+)stui.number=stui+1.number;strcpy(,stui+1.name);for(j=0;j<3;j+)stui.scorej=stui+1.scorej;stui.aver=stui+1.aver;MAX-; /*刪除一個學生信息后人數MAX自減1*/printf("當前文件內容:n");Save(st
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文件鎖機制優(yōu)化-全面剖析
- 貴州大學招聘工作人員真題2024
- 企業(yè)資源規(guī)劃系統(tǒng)的優(yōu)化策略-全面剖析
- 斯洛文尼亞語中的職業(yè)詞匯分析論文
- 2025-2030全球及中國番茄粉市場產銷需求及投資價值評估研究報告
- 2025年醫(yī)保報銷流程專項考試題庫:題庫及答案真題解析
- 2025-2030全球及中國電信行業(yè)的地理信息系統(tǒng)行業(yè)市場現狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報告
- 生態(tài)安全中的空間安全防護機制論文
- 2025-2030全球及中國汽車拋光機行業(yè)市場現狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報告
- 2025-2030全球及中國教育硬件行業(yè)市場現狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報告
- 軟件代碼審計與測試作業(yè)指導書
- 上消化道出血護理疑難病例討論記
- 城市軌道交通自動售票機
- 環(huán)境設計專業(yè)考察課程教學大綱
- 2024版互聯(lián)網企業(yè)股東合作協(xié)議書范本3篇
- 企業(yè)環(huán)保知識培訓課件
- 110kV立塔架線安全施工方案
- 完形填空-2025年安徽中考英語總復習專項訓練(含解析)
- 《歲末年初重點行業(yè)領域安全生產提示》專題培訓
- 商混站(商品混凝土公司)安全風險分級管控和隱患排查治理雙體系方案全套資料匯編完整版
- GB/T 16288-2024塑料制品的標志
評論
0/150
提交評論