




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、計算機科學與技術學院課程設計報告2015201史學年第二學期課程名稱C語言程序設計題目學生成績管理系統學生姓名XXX學號XXX專業班級XXX指導教師XXX合作者XXX2016年6月30日學生成績管理系統本程序可實現對學生語數外三門課程成績的錄入與保存。1、設計目的本程序旨在訓練讀者的基本編程能力,了解管理信息系統開發流程,熟悉C語言的各種語法、編寫流程、以及能夠熟練運用各種算法、以及各種函數的使用。2、功能描述本程序可實現的功能:1)錄入學生的成績( 2) 輸出學生的成績( 3) 添加學生的成績信息( 4) 刪除指定學生的成績信息( 5) 按照要求對學生成績信息進行排序( 6) 根據學號查詢指
2、定學生的成績( 7) 將學生的成績信息以文件形式保存3 、總體設計具體實現main()函數:程序首先調用menu()函數,顯示出系統主菜單,然后將menu()函數返回的從用戶讀取的選項k值賦予k,接著進入switchcase語句進入對應選項函數,若輸入錯誤沒有該選項則給出提示(default)以上過程為一個死循環,直到用戶輸入0為止。menu()函數:在屏幕上打印選項名稱,然后用一個int類型的變量接受從用戶輸入的選項,最后將其return至主函數。score*creatlink()函數:創建鏈表主要實現流程如下:print()函數:先令P=head,使p指向第一個節點,當head=!NULL
3、時說明沒有到鏈表尾端,那么就輸出p所指向的結構數據,然后讓p指向下一個節點,直到發現p=NULL為止。而當head=NUL加明鏈表中不存在數據,直接停止輸出。score*add()函數,添加新的學生信息,具體實現路程如流程圖所示(圖片制作時沒有加Y/N判斷,在判斷圖框中均為向左為真,向右為假):score*search()函數:用來查詢學生成績,傳遞給函數指向鏈表的頭指針,查詢時,如果找到與輸入相匹配的學號則打印此學生,反之則輸出“沒有任何學生資料!”:score*sortdata()函數:該函數有學號、姓名、單科成績排序(冒泡排序法),實行過程如圖:save()函數:用來保存數據,首先從用戶
4、輸入取得要保存的文件名,然后定義一個指向文件的指針,以讀寫方式打開文件。將寫生信息依次存入文件。score*load()函數:用于讀取數據,通過“r+”方式打開文件并判斷是否打開成功。具體實現如下:score*statistics()函數:它能實現程序的統計,通過switch-case語句選擇統計方式,通過循環計算總分或者平均分并打印出來,流程都是通過循環,讓指針逐個遍歷整個鏈表,讀取相應的數據并實現統計數據結構設計數據結構:定義了一個包含學生成績信息的結構體(structscorenode),學生信息包括學號(number)、姓名(name10)、語文、數學、英語成績(Chinese、mat
5、hmatic、english)、以及指向下一個結構體的鏈表指針(structscorenode*next)。函數功能描述main()函數:主函數功能主要是讓程序選擇將要進行的操作,通過menu()函數返回的選項進入其他函數執行。intmenu(intk)函數:此函數顯示主菜單內容,需要一個int類型變量作為輸入要執行的選項并返回給main()函數。score*creatlink()函數:此函數用于創建鏈表,為了節省內存空間,我們采用malloc()函數為結構體分配動態內存空間。另外考慮到學號不可能是0,所以用輸入0的方式來判斷是否結束輸入,將最后的結構體中的指針指向NULL并返回一個指向鏈表第
6、一個結構的指針。voidprint(score*head)函數:此函數返回值為空,知識為了在stdout流(屏幕)上打印出學生的成績信息,需要一個指向鏈表頭的指針來逐個向后打印。score*add(score*head,score*stu)函數:為學生信息中添加新的學生資料,然后重新排序(按學號),并返回頭指針。傳入函數的head為鏈表頭指針,stu指針指的是要添加的位置。score*search(score*head)函數:按照學號查找學生信息,需要鏈表頭指針并返回指向被搜索學生的指針。搜索原理就是從頭向后面依次檢索。score*dele(score*head)函數:刪除指定學生的資料。傳入
7、頭指針,在函數中創建變量儲存要刪除學生的學號,然后從頭向尾檢索,直至找到該學生并將其刪除,返回頭指針。score*sortdata(score*head)函數:用于按要求(學號、姓名、單科成績)排序,最后返回頭指針,排序運用老師上課時講過的冒泡排序法。intsave(score*p1)函數:將鏈表內的數據以文件的形式儲存,傳入的p1指針一開始指向鏈表頭,隨著儲存順序一個一個地向后面指,直到NULL為止。函數內部定義一個指向文件的指針*fp,用于寫入文件。score*load(score*head)函數:讀取文件數據,head為一個新建的鏈表頭指針,讀取文件數據之后令其保存至新建的鏈表之中,并返
8、回頭指針。score*statistics(score*head)函數:統計成績,可以統計總分、平均分、最高(低)分,返回操作后的鏈表首地址(頭指針)。4 、程序實現源代碼#include<>#include<>#include<>#include<>#defineLENsizeof(structscorenode)#defineDEBUG/*=數據結構=*/structscorenodeintnumber;ft|%.1ft|%.1ft|n",p->number,p->name,p->chinese,p->mat
9、hmatic,p->english);n");printf("/*打印表格域*/p=p->next;while(p!=NULL);/*=添加學生數據=*/*函數add,功能:追加學生資料,并且將所有學生資料按學號排序*/score*add(score*head,score*stu)score*p0,*p1,*p2,*p3,*max;inti,j;floatfen;chart10;p3=stu=(score*)malloc(LEN);/*開辟一個新單元*/printf("n輸入要增加的學生的資料!");repeat4:printf("
10、請輸入學生學號(學號應大于0):");scanf("%d",&stu->number);/*輸入學號,學號應大于0*/while(stu->number<0)getchar();printf("輸入錯誤,請重新輸入學生學號:");scanf("%d",&stu->number);/*輸入錯誤,重新輸入學號*/if(stu->number=0)gotoend2;/*當輸入的學號為0時,轉到末尾,結束追加*/elsep3=head;if(n>0)for(i=0;i<n;i
11、+)if(stu->number!=p3->number)p3=p3->next;elseprintf("學號重復,請重輸!n");gotorepeat4;/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/printf("輸入學生姓名:");scanf("%s",stu->name);/*輸入學生姓名*/printf("請輸入語文成績(0100):");/* 輸入語文scanf("%f",&stu->chinese);成績,成績應在0-100*/whi
12、le(stu->chinese<0|stu->chinese>100)getchar();printf("輸入錯誤,請重新輸入語文成績");scanf("%f",&stu->chinese);/*輸入錯誤,重新輸入語文成績直到正確為止 */printf(" 請輸入數學成績(0100) : ");scanf("%f",&stu->mathmatic);/* 輸入數學成績,成績應在 0-100*/while(stu->mathmatic<0|stu->
13、;mathmatic>100)getchar();printf(" 輸入錯誤,請重新輸入數學成績 ");scanf("%f",&stu->mathmatic);/* 輸入錯誤,重新輸入數學成績直到正確為止*/scanf("%f",&stu->english);/*輸入英語成績,成績應在0-100*/while(stu->english<0|stu->english>100)getchar();printf("輸入錯誤,請重新輸入英語成績");scanf(&q
14、uot;%f",&stu->english);/*輸入錯誤,重新輸入英語成績直到正確為止*/p1=head;p0=stu;if(head=NULL)head=p0;p0->next=NULL;資料*/else/*鏈表不為空*/if(p1->next=NULL)/*找到原來鏈表的末尾*/p1->next=p0;p0->next=NULL;/*將它與新開單元相連接*/elsewhile(p1->next!=NULL)/*還沒找到末尾,繼續找*/p2=p1;p1=p1->next;p1->next=pO;pO->next=NUL
15、L;)n=n+1;p1=head;pO=stu;for(i=1;i<n;i+)(for(j=i+1;j<=n;j+)(max=p1;p1=p1->next;if(max->number>p1->number)k=max->number;max->number=p1->number;p1->number=k;/*交換前后結點中的學號值,使得學號大者移到后面的結點中*/strcpy(t,max->name);strcpy(max->name,p1->name);strcpy(p1->name,t);/*交換前后結點
16、中的姓名,使之與學號相匹配*/fen=max->chinese;max->chinese=p1->chinese;p1->chinese=fen;/*交換前后結點中的語文成績,使之與學號相匹配*/fen=max->mathmatic;max->mathmatic=p1->mathmatic;/* 交換前/* 交換前p1->mathmatic=fen;后結點中的數學成績,使之與學號相匹配*/fen=max->english;max->english=p1->english;p1->english=fen;后結點中的英語成績,
17、使之與學號相匹配*/max=head;p1=head;/*重新使max,p指向鏈表頭*/end2:printf("現在的學生數為:d個!n",n);return(head);/*=查詢數據=*/*函數search,功能:查詢學生成績*/score*search(score*head)intnumber;score*p1,*p2;printf("輸入要查詢的學生的學號:");scanf("%d",&number);if(head=NULL)printf("n沒有任何學生資料!n");return(head);
18、printf("n");printf("|學號t|姓名t|語文t|數學t|英語t|n");printf("n");p1=head;while(number!=p1->number&&p1->next!=NULL)p2=p1;p1=p1->next;if(number=p1->number)printf("|%dt|%st|%.1ft|%.1ft|%.1ft|n",p1->number,p1->name,p1->chinese,p1->mathmatic
19、,p1->english);printf("n");elseprintf("輸入要查詢的學生的學號,");scanf("%d",&number);printf("已經退出了!n");return(head);/*=刪除數據=*/*函數dele,功能:刪除學生資料*/score*dele(score*head)score*p1,*p2;intnumber;printf("輸入要刪除的學生的學號(輸入0時退出):");scanf("%d",&number);
20、getchar();while(number!=0)/*輸入學號為 0 時退出 */if(head=NULL)printf("n沒有任何學生資料!n");return(head);p1=head;while(number!=p1->number&&p1->next!=NULL)首結點,并且后面還有結點*/p2=p1;p1=p1->next;if(number=p1->number)/*/*p1 指向的不是所要找的/*p1 后移一個結點 */如果找到了 */* 若 p1 指向的是首結點,把if(p1=head)head=p1->n
21、ext;地二個結點地址賦予head*/elsep2->next=p1->next;/*否則將下一個結點地址賦給前一結點地址*/printf("刪除:%dn",number);n=n-1;elseprintf("%d不存在此學生!n",number);/*找不到該結點*/printf("輸入要刪除的學生的學號:");scanf("%d",&number);getchar();#ifdefDEBUGprintf("已經退出了!n");#endifprintf("現在的學
22、生數為:d個!n",n);return(head);/*=排序=*/*定義排序函數。此函數帶回一個指向鏈表頭的指針*/score*sortdata(score*head)(score*p,*max;inti,j,x;floatfen;chart10;if(head=NULL)(printf("n沒有任何學生資料,請先建立鏈表!n");return(head);/*鏈表為空*/max=p=head;for(i=0;i<80;i+)printf("*");printf("1按學生學號排序t2按學生姓名排序t3按語文成績排序n&quo
23、t;);printf("4按數學成績排序t5按英語成績排序tn");for(i=0;i<80;i+)printf("*");printf("請選擇操作:");scanf("%d",&x);/*選擇操作*/getchar();switch(x)/*用switch語句實現功能選擇*/case 1 :for(i=1;i<n;i+)for(j=i+1;j<=n;j+)max=p;p=p->next;if(max->number>p->number)k=max->num
24、ber;max->number=p->number;p->number=k;/*交換前后結點中的學號值,使得學號大者移到后面的結點中*/strcpy(t,max->name);strcpy(max->name,p->name);strcpy(p->name,t);/*交換前后結點中的姓名,使之與學號相匹配*/fen=max->chinese;max->chinese=p->chinese;p->chinese=fen;/*交換前后結點中的語文成績,使之與學號相匹配*/fen=max->mathmatic;max->m
25、athmatic=p->mathmatic;p->mathmatic=fen;*/*/*交換前后結點中的數學成績,使之與學號相匹配fen=max->english;max->english=p->english;p->english=fen;/*交換前后結點中的英語成績,使之與學號相匹配max=head;p=head;/*重新使max,p指向鏈表頭*/print(head);break;/*打印值排序后的鏈表內容*/case 2 :for(i=1;i<n;i+)for(j=i+1;j<=n;j+)max=p;p=p->next;if(str
26、cmp(max->name,p->name)>0)/*strcmp:字符串比較函數*/strcpy(t,max->name);/*strcpy:字符串復制函數*/strcpy(max->name,p->name);strcpy(p->name,t);/*交換前后結點中的姓名,使得姓名字符串的值大者移到后面的結點中*/k=max->number;max->number=p->number;p->number=k;/*交換前后結點中的學號值,使之與姓名相匹配*/fen=max->chinese;max->chinese=
27、p->chinese;p->chinese=fen;/*交換前后結點中的語文成績,使之與姓名相匹配*/fen=max->mathmatic;max->mathmatic=p->mathmatic;p->mathmatic=fen;/*交換前后結點中的數學成績,使之與姓名相匹配*/fen=max->english;max->english=p->english;p->english=fen;/*交換前后結點中的英語成績,使之與姓名相匹配*/p=head;max=head;print(head);break;case 3 :for(i=1
28、;i<n;i+)(for(j=i+1;j<=n;j+)(max=p;p=p->next;if(max->chinese>p->chinese)(fen=max->chinese;max->chinese=p->chinese;p->chinese=fen;/*交換前后結點中的語文成績,使得語文成績高者移到后面的結點中*/k=max->number;max->number=p->number;p->number=k;/*交換前后結點中的學號,使之與語文成績相匹配*/strcpy(t,max->name);s
29、trcpy(max->name,p->name);strcpy(p->name,t);/*交換前后結點中的姓名,使之與語文成績相匹配*/fen=max->mathmatic;max->mathmatic=p->mathmatic;p->mathmatic=fen;/*交換前后結點中的數學成績,使之與語文成績相匹配*/fen=max->english;max->english=p->english;p->english=fen;/*交換前后結點中的英語成績,使之與語文成績相匹配*/p=head;max=head;print(hea
30、d);break;case 4 :for(i=1;i<n;i+)for(j=i+1;j<=n;j+)max=p;p=p->next;if(max->mathmatic>p->mathmatic)fen=max->mathmatic;max->mathmatic=p->mathmatic;p->mathmatic=fen;/*交換前后結點中的數學成績,使得數學成績高者移到后面的結點中*/k=max->number;max->number=p->number;p->number=k;/*交換前后結點中的學號,使之與
31、數學成績相匹配*/strcpy(t,max->name);strcpy(max->name,p->name);strcpy(p->name,t);/*交換前后結點中的姓名,使之與數學成績相匹配*/fen=max->chinese;max->chinese=p->chinese;p->chinese=fen;/*交換前后結點中的語文成績,使之與數學成績相匹配*/fen=max->english;max->english=p->english;p->english=fen;/*交換前后結點中的英語成績,使之與數學成績相匹配*/
32、p=head;max=head;print(head);break;case 5 :for(i=1;i<n;i+)for(j=i+1;j<=n;j+)max=p;p=p->next;if(max->english>p->english)fen=max->english;max->english=p->english;p->english=fen;*/*交換前后結點中的英語成績,使得英語成績高者移到后面的結點中k=max->number;max->number=p->number;p->number=k;/*交換
33、前后結點中的學號,使之與英語成績相匹配*/strcpy(t,max->name);strcpy(max->name,p->name);strcpy(p->name,t);/*交換前后結點中的姓名,使之與英語成績相匹配*/fen=max->chinese;max->chinese=p->chinese;p->chinese=fen;/*交換前后結點中的語文成績,使之與英語成績相匹配*/fen=max->mathmatic;max->mathmatic=p->mathmatic;p->mathmatic=fen;/*交換前后結
34、點中的數學成績,使之與英語成績相匹配*/p=head;max=head;print(head);break;default:printf("輸入錯誤,請重試!n");return(0);/*=保存數據=*/*函數save,功能:保存學生的資料*/voidsave(score*p1)FILE*fp;char filepn20;/*用來存放文件保存路徑以及文件名 */printf("請輸入文件路徑及文件名:");scanf("%s",filepn);if(fp=fopen(filepn,"w+")=NULL)print
35、f("不能打開文件!n");exit(1);fprintf(fp,"學生成績管理系統n");fprintf(fp,"n");fprintf(fp,"n");fprintf(fp,"|學號t|姓名t|語文t|數學t|英語t|n");fprintf(fp,"n");/*打印表格域*/while(p1!=NULL)fprintf(fp,"%dt%st%.1ft%.1ft%.1ftn",p1->number,p1->name,p1->chines
36、e,p1->mathmatic,p1->english);p1=p1->next;/*下移一個結點*/fclose(fp);printf("文件已經保存!n");return;/*=調入文件=*/*函數loadfile,功能:從文件讀入學生記錄*/score*loadfile(score*head)score*p1,*p2;intm=0;charfilename10;FILE*fp;printf("請輸入文件路徑及文件名:");scanf("%s",filename);/*輸入文件路徑及名稱*/if(fp=fopen
37、(filename,"r+")=NULL)printf("不能打開文件!n");return0;fscanf(fp,"學生成績管理系統n");fscanf(fp,"n");fscanf(fp,"n");fscanf(fp,"|學號t|姓名t|語文t|數學t|英語t|n");fscanf(fp,"n");/*讀入表格域*/printf("學生成績管理系統n");printf("n");printf("n&qu
38、ot;);printf("|學號t|姓名t|語文t|數學t|英語t|n");n");printf("/*打印表格域*/m=m+1;if(m=1)p1=(score*)malloc(LEN);/*開辟一個新單元*/fscanf(fp,"%d%s%f%f%f",&p1->number,p1->name,&p1->chinese,&p1->mathmatic,&p1->english);printf("|%dt|%st|%.1ft|%.1ft|%.1ft|n"
39、,p1->number,p1->name,p1->chinese,p1->mathmatic,p1->english);/*文件讀入與顯示*/head=NULL;don=n+1;if(n=1)head=p1;elsep2->next=p1;p2=p1;p1=(score*)malloc(LEN);/*開辟一個新單元*/fscanf(fp,"%d%s%f%f%fn",&p1->number,p1->name,&p1->chinese,&p1->mathmatic,&p1->eng
40、lish);printf("|%dt|%st|%.1ft|%.1ft|%.1ft|n",p1->number,p1->name,p1->chinese,p1->mathmatic,p1->english);/*文件讀入與顯示*/while(!feof(fp);p2->next=p1;p1->next=NULL;n=n+1;printf("n");/*表格下線*/fclose(fp);/*結束讀入,關*/return(head);/*=統計=*/*函數statistics,功能:統計學生成績*/score*stat
41、istics(score*head)floatsum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,max=0,min=0;charmaxname10,minname10;score*p;intx,y=0,i=0;p=head;printf("1個人總分和平均分t2單科平均分t3總分最高分和最低分n");scanf("%d",&x);getchar();switch(x)/*用switch語句實現功能選擇*/case 1: if(head=NULL)printf("n沒有任何學生資料!n");re
42、turn(head);elseprintf("n");printf("|學號t|姓名t|語文t|數學t|英語t|總分t|平均分t|n");printf("n");/*打印表格域*/while(p!=NULL)sum1=p->chinese+p->mathmatic+p->english;/*計算個人總分*/ave1=sum1/3;/*計算個人平均分*/printf("|%dt|%st|%.1ft|%.1ft|%.1ft|%.1ft|%.1ft|n",p->number,p->name,
43、p->chinese,p->mathmatic,p->english,sum1,ave1);/*打印結果*/printf("n");p=p->next;return(head);break;case 2: if(head=NULL)printf("n沒有任何學生資料!n");return(head);while(p!=NULL)sum1=sum1+p->chinese;sum2=sum2+p->mathmatic;sum3=sum3+p->english;/*計算總分*/y=y+1;ave1=sum1/y;ave
44、2=sum2/y;ave3=sum3/y;/*計算平均分*/p=p->next;/*使p指向下一個結點*/printf("語文平均分是%.1fn",ave1);printf("數學平均分是%.1fn",ave2);printf("英語平均分是%.1fn",ave3);/*打印結果*/return(head);break;case 3: if(head=NULL)printf("n沒有任何學生資料!n");return(head);min=max=p->chinese+p->mathmatic+p-
45、>english;while(i<n)i=i+1;計算個sum1=p->chinese+p->mathmatic+p->english;/*人總分*/if(max<sum1)max=sum1;strcpy(maxname,p->name);if(min>sum1)min=sum1;strcpy(minname,p->name);p=p->next;printf("總分最高分:%.1f,姓名:%s、",max,maxname);printf("n");printf("總分最低分:%.1f,姓名:%s",min,minname);printf("n");return(head);break;default:printf("輸入錯誤,請
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 木質樂器制作工藝傳承考核試卷
- 票務代理行程規劃與咨詢考核試卷
- 電池制造過程中的市場趨勢分析考核試卷
- 木材的天然防腐和抗菌性能考核試卷
- 植物油加工過程中的副產物利用策略考核試卷
- 電視接收設備的智能廣告投放系統考核試卷
- 泵的耐高溫材料與涂層技術考核試卷
- 有機化學原料的可持續采購策略考核試卷
- 廈門城市職業學院《醫學成像原理與圖像處理》2023-2024學年第二學期期末試卷
- 萍鄉衛生職業學院《文化產業項目策劃》2023-2024學年第二學期期末試卷
- 2024年河南測繪職業學院單招綜合素質考試題庫及答案解析文檔版
- 腫瘤醫院競爭格局分析
- 石油石化行業技術進步與市場趨勢
- 中醫飲食營養學(中醫飲食營養學講稿)
- 駐校教官策劃方案
- 醫療垃圾的分類與處理知識培訓
- 熱點主題作文寫作指導:將“不能”變成“能”(審題指導與例文)
- 外科學教學設計的創新方法探索
- 社會工作實務(初級)考前輔導
- 30題安全員崗位常見面試問題含HR問題考察點及參考回答
- 如何正確處理同學之間矛盾班會
評論
0/150
提交評論