武漢科技大學 C課程設計 學生成績管理系統(tǒng) 鏈表
《武漢科技大學 C課程設計 學生成績管理系統(tǒng) 鏈表》由會員分享,可在線閱讀,更多相關《武漢科技大學 C課程設計 學生成績管理系統(tǒng) 鏈表(23頁珍藏版)》請在裝配圖網上搜索。
1、 二○一二 ~二○一三 學年第 一 學期 電子技術學院 課程設計報告書 課程名稱: C程序課程設計 班 級: 電信DB2011級1102班 學 號: xxxxxxxxxxxxxxx 姓 名: xxxx 指導教師: xxxx 二○一二年 九 月 一、需求分析 1、題目二 學生成績管理程序 任務:自學C語言中相
2、關知識,設計出學生成績管理程序。要求如下所述: u 錄入學生信息,每位學生錄入的信息有:姓名、學號、性別、班級、和三門功課(數(shù)學,英語,計算機)的成績。以文件(myfile.txt)的形式保存每個學生的所有信息。(實驗中:假設3個班,每個班學生人數(shù)不得少于5人) 學號 姓名 性別 班級 數(shù)學 英語 計算機 1101 王鵬 男 1班 70 58 98 1102 李燕 女 2班 68 88 95 1103 趙亞芳 女 3班 58 48 96 u 增加學生記錄,并將增加的信息以文件的(
3、myfile.txt)的形式保存。 u 刪除學生記錄,以“學號”、“姓名”為關鍵字刪除記錄,若要刪除的記錄不存在,給出必要的提示信息; u 統(tǒng)計各班級學生每門課程的班級平均分,并由高到低排序。 u 按學號或者姓名查詢記錄并顯示其三門功課成績; u 能瀏覽顯示全部學生成績,若無記錄可以顯示,給出必要的提示信息; 2、系統(tǒng)功能需求分析 該程序中需要有存儲、讀取外部文件的命令實現(xiàn)將信息儲存于指定文件中。程序中需要有建立、修改鏈表的命令實現(xiàn)數(shù)據(jù)的動態(tài)鏈表存儲方式。程序還需要一系列的提示命令使程序的易用性提高。因為需要對數(shù)據(jù)進行統(tǒng)計或查詢顯示,所以需要有對鏈表數(shù)據(jù)統(tǒng)計和對鏈表指定
4、數(shù)據(jù)進行查找的功能。 二、概要設計 文件讀取模塊 數(shù)據(jù)保存模塊 成績對比模塊 數(shù)據(jù)顯示 模塊 數(shù)據(jù)查找模塊 數(shù)據(jù)刪除模塊 數(shù)據(jù)增加模塊 成績單建立模塊 學生成績管理程序 三、詳細設計 1、建立結構體 struct student { int num; char name[10],sex[10]; int Class,math,english,computer; struct student * next; }; int n; 2、成績單建立模塊 開始 struct student *head,*p
5、1,*p2; n=0; p1=p2=(struct student *)malloc(LEN); 輸入第一個學生的數(shù)據(jù) head=NULL; p1->num!=0 Y 鏈表指針向后移動 N 輸入一個學生的數(shù)據(jù) 輸入學號為“0” Y
6、 N p2->next=NULL; return(head); 結束 struct student *creat(void) { struct student *head,*p1,*p2; n=0; p1=p2=(struct student *)malloc(LEN); printf("請輸入學生信息(按學號順序輸入)\n"); printf("學號:"); scanf("%d",&p1->num); printf("姓名:"); scanf(
7、"%s",p1->name); printf("性別:"); scanf("%s",p1->sex); printf("班級:"); scanf("%d",&p1->Class); printf("數(shù)學:"); scanf("%d",&p1->math); printf("英語:"); scanf("%d",&p1->english); printf("計算機:"); scanf("%d",&p1->computer); head=NULL; while(1) { n=n+1; if(n==1)
8、head=p1; else p2->next=p1; p2=p1; p1=(struct student *)malloc(LEN); printf("\n請輸入學生信息(按學號順序輸入)[當不再輸入時在學號處輸入\"0\"結束]\n"); printf("學號:");scanf("%d",&p1->num); if(p1->num==0)break; else printf("姓名:"); scanf("%s",p1->name); pr
9、intf("性別:"); scanf("%s",p1->sex); printf("班級:"); scanf("%d",&p1->Class); printf("數(shù)學:"); scanf("%d",&p1->math); printf("英語:"); scanf("%d",&p1->english); printf("計算機:"); scanf("%d",&p1->computer); } p2->next=NULL; return(head); } 3、數(shù)據(jù)增加模塊
10、 開始 struct student *p0,*p1,*p2; p1=head; p0=stud; phead; p0=stud; 輸入一個學生的數(shù)據(jù) 根據(jù)學號順序找到數(shù)據(jù)應該插入的位置 phead; p0=stud; 插入數(shù)據(jù) 返回頭指針 phead; p0=stud; 結束 struct student *insert(struct student *head,struct student *stud) { struct student *p0,*p1,*p2; p1=h
11、ead; p0=stud; if(head==NULL) {head=p0; p0->next=NULL;} else { while((p0->num>p1->num)&&(p1->next!=NULL)) {p2=p1; p1=p1->next;} if(p0->num<=p1->num) { if(head==p1) head=p0; else p2->next=p0; p0->next=p1; } else {p1->next=p0; p0->next=NULL;} } n++; printf("\n增
12、加成功!\n"); return(head); } 4、數(shù)據(jù)刪除模塊 開始 struct student *p1,*p2; 輸入刪除的學號(姓名) 鏈表中有該數(shù)據(jù) p1==head Y Y head=p1->next N p2->
13、next=p1->next; printf(“不到該數(shù)據(jù)!\n"); 結束 struct student *del1(struct student *head,int num) { struct student *p1,*p2; if(head==NULL) {printf("\n表格不存在!\n"); return(head);} p1=head; while((num!=p1->num)&&(p1->next!=NULL)) {p2=p1; p1=p1->next;} if(num==p1->num) {
14、 if(p1==head) head=p1->next; else p2->next=p1->next; printf("\n刪除成功!\n"); n--; } else printf("\n找不到該數(shù)據(jù)!\n"); return(head); } struct student *del2(struct student *head,char *name) { struct student *p1,*p2; if(head==NULL) {printf("\n表格不存在!\n"); return(head);} p1=head; whi
15、le((strcmp(name,p1->name)!=0)&&(p1->next!=NULL)) {p2=p1; p1=p1->next;} if(strcmp(name,p1->name)==0) { if(p1==head) head=p1->next; else p2->next=p1->next; printf("\n刪除成功!\n"); n--; } else printf("\n找不到該數(shù)據(jù)!\n"); return(head); } 5、數(shù)據(jù)查找模塊
16、 開始 struct student *p=head; 輸入查找的學號(姓名) num==p->num 或strcmp(name,p->name)==0 N Y 輸出數(shù)據(jù) Y p=p->next
17、 N p!=NULL Y 結束 void find1(struct student *head,int num) { struct student *p=head; if(head!=NULL) { do { if(num==p->num) { printf("\n學號 姓名 性別 班級 數(shù)學 英語 計算機\n"); printf("--
18、------------------------------------------\n"); printf("%d %-6s %s %d %-3d %-3d %-3d\n",p->num,p->name,p->sex,p->Class,p->math,p->english,p->computer); break; } else p=p->next; }while(p!=NULL); if(p==NULL) printf("\n未找到相應信息!\n"); } else printf("
19、\n成績單為空!\n"); } void find2(struct student *head,char *name) { struct student *p=head; if(head!=NULL) { do { if(strcmp(name,p->name)==0) { printf("\n學號 姓名 性別 班級 數(shù)學 英語 計算機\n"); printf("--------------------------------------------\n"); printf("%d
20、 %-6s %s %d %-3d %-3d %-3d\n",p->num,p->name,p->sex,p->Class,p->math,p->english,p->computer); break; } else p=p->next; }while(p!=NULL); if(p==NULL) printf("\n未找到相應信息!\n"); } else printf("\n成績單為空!\n"); } void print(struct student *head) { struct student
21、 *p; p=head; if(head!=NULL) { printf("學號 姓名 性別 班級 數(shù)學 英語 計算機\n"); printf("--------------------------------------------\n"); do { printf("%d %-6s %s %d %-3d %-3d %-3d\n",p->num,p->name,p->sex,p->Class,p->math,p->english,p->computer); p=p->next;
22、 }while(p!=NULL); } else printf("無信息!\n"); } 6、數(shù)據(jù)顯示模塊 開始 struct student *p; p=head; head!=NULL Y 輸出一個學生的數(shù)據(jù) N p=p->next; p!=NULL Y 結束
23、 N void print(struct student *head) { struct student *p; p=head; if(head!=NULL) { printf("學號 姓名 性別 班級 數(shù)學 英語 計算機\n"); printf("--------------------------------------------\n"); do { printf("%d %-6s %s %d %-3d %-3d
24、 %-3d\n",p->num,p->name,p->sex,p->Class,p->math,p->english,p->computer); p=p->next; }while(p!=NULL); } else printf("無信息!\n"); } 7、成績對比模塊 開始 struct student *p; p=head; float sum1=0,sum2=0,sum3=0,average1,average2,average3,n1=0,n2=0,n3=0; p!=NULL N p->Clas
25、s==1 Y Y sum1=sum1+p->math(englishi/computer); n1++; N p->Class==2 Y sum1=sum1+p->math(englishi/computer); n1++; p->Class==3
26、 N Y sum1=sum1+p->math(englishi/computer); n1++; p=p->next; 算出各班平均分并比較 輸出成績對比結果 結束 void compare(struct student *head) { struct student *p; p=head; float sum1=0,sum2=0,sum3=0,average1,average2,average3,n1
27、=0,n2=0,n3=0; printf(" ◎ 數(shù)學班級平均分 ◎ \n"); printf("--------------------------------------\n"); while(p!=NULL) { if(p->Class==1) {sum1=sum1+p->math; n1++;} if(p->Class==2) {sum2=sum2+p->math; n2++;} if(p->Class==3) {sum3=sum3+p->math; n3++;} p=p->next; } average1
28、=sum1/n1; average2=sum2/n2; average3=sum3/n3; if((average1>=average2)&&(average1>=average3)) { if(average2>=average3) printf("1班:%.2f 2班:%.2f 3班:%.2f\n",average1,average2,average3); else printf("1班:%.2f 3班:%.2f 2班:%.2f\n",average1,average3,average2); } else {
29、 if((average2>=average1)&&(average2>=average3)) { if(average1>=average3) printf("2班:%.2f 1班:%.2f 3班:%.2f\n",average2,average1,average3); else printf("2班:%.2f 3班:%.2f 1班:%.2f\n",average2,average3,average1); } else { if(average1>=average2) printf("3
30、班:%.2f 1班:%.2f 2班:%.2f\n",average3,average1,average2); else printf("3班:%.2f 2班:%.2f 1班:%.2f\n",average3,average2,average1); } } p=head;sum1=0;sum2=0;sum3=0;n1=0;n2=0;n3=0; printf("\n ◎ 英語班級平均分 ◎ \n"); printf("-------------------------------
31、-------\n"); while(p!=NULL) { if(p->Class==1) {sum1=sum1+p->english; n1++;} if(p->Class==2) {sum2=sum2+p->english; n2++;} if(p->Class==3) {sum3=sum3+p->english; n3++;} p=p->next; } average1=sum1/n1; average2=sum2/n2; average3=sum3/n3; if((average1>=average2)&&(average1>=average
32、3)) { if(average2>=average3) printf("1班:%.2f 2班:%.2f 3班:%.2f\n",average1,average2,average3); else printf("1班:%.2f 3班:%.2f 2班:%.2f\n",average1,average3,average2); } else { if((average2>=average1)&&(average2>=average3)) { if(average1>=average3) prin
33、tf("2班:%.2f 1班:%.2f 3班:%.2f\n",average2,average1,average3); else printf("2班:%.2f 3班:%.2f 1班:%.2f\n",average2,average3,average1); } else { if(average1>=average2) printf("3班:%.2f 1班:%.2f 2班:%.2f\n",average3,average1,average2); else prin
34、tf("3班:%.2f 2班:%.2f 1班:%.2f\n",average3,average2,average1); } } p=head;sum1=0;sum2=0;sum3=0;n1=0;n2=0;n3=0; printf("\n ◎ 計算機班級平均分 ◎ \n"); printf("--------------------------------------\n"); while(p!=NULL) { if(p->Class==1) {sum1=sum1+p->computer; n1++;} if(p-
35、>Class==2) {sum2=sum2+p->computer; n2++;} if(p->Class==3) {sum3=sum3+p->computer; n3++;} p=p->next; } average1=sum1/n1; average2=sum2/n2; average3=sum3/n3; if((average1>=average2)&&(average1>=average3)) { if(average2>=average3) printf("1班:%.2f 2班:%.2f 3班:%.2f\n",average1,a
36、verage2,average3); else printf("1班:%.2f 3班:%.2f 2班:%.2f\n",average1,average3,average2); } else { if((average2>=average1)&&(average2>=average3)) { if(average1>=average3) printf("2班:%.2f 1班:%.2f 3班:%.2f\n",average2,average1,average3); else printf("2
37、班:%.2f 3班:%.2f 1班:%.2f\n",average2,average3,average1); } else { if(average1>=average2) printf("3班:%.2f 1班:%.2f 2班:%.2f\n",average3,average1,average2); else printf("3班:%.2f 2班:%.2f 1班:%.2f\n",average3,average2,average1); } } } 8、數(shù)據(jù)保存模塊
38、 void save(struct student *head) { struct student *p; FILE *fp; fp=fopen("myfile.txt","wb"); p=head; while(p!=NULL) {fwrite(p,LEN,1,fp); p=p->next;} fclose(fp); printf("保存成功!\n"); } 9、數(shù)據(jù)讀取模塊 struct student *load() { struct student *head,*p1,*
39、p2; FILE *fp; n=0; head=NULL; fp=fopen("myfile.txt","rb"); head=p2=p1=(struct student *)malloc(LEN); while(fread(p1,LEN,1,fp)==1) { p2=p1; p1=(struct student *)malloc(LEN); p2->next=p1; n++; } p2->next=NULL; fclose(fp); printf("讀取成
40、功!\n"); return(head); } 10、主函數(shù) void main() { system("color 0B"); struct student *head=NULL,*stu; int num,choice; char name[10]; while(1) { system("pause"); system("cls"); printf("# # # # # # # # # # # # # # # # # # # # # # # #\n"); printf("#
41、 #\n"); printf("# ☆★☆ 學生成績管理系統(tǒng)菜單 ☆★☆ #\n"); printf("#---------------------------------------------#\n"); printf("# 1.創(chuàng)建學生成績單 #\n"); printf("#---------------------------------------------#\n"); printf("#
42、 2.增加學生信息 #\n"); printf("#---------------------------------------------#\n"); printf("# 3.刪除學生信息 #\n"); printf("#---------------------------------------------#\n"); printf("# 4.查看學生信息 #\n"); pr
43、intf("#---------------------------------------------#\n"); printf("# 5.顯示所有學生信息 #\n"); printf("#---------------------------------------------#\n"); printf("# 6.班級成績對比 #\n"); printf("#---------------------------------------------
44、#\n"); printf("# 7.保存至文件 #\n"); printf("#---------------------------------------------#\n"); printf("# 8.從文件中讀取信息 #\n"); printf("#---------------------------------------------#\n"); printf("# 9.退出系統(tǒng)
45、 #\n"); printf("# #\n"); printf("# # # # # # # # # # # # # # # # # # # # # # # #\n"); printf("\n請選擇所需功能:"); scanf("%d",&choice); printf("\n"); switch(choice) { case 1: head=creat(); break; c
46、ase 2: stu=(struct student *)malloc(LEN); printf("請輸入學生信息\n"); printf("學號:"); scanf("%d",&stu->num); printf("姓名:"); scanf("%s",stu->name); printf("性別:"); scanf("%s",stu->sex); printf("班級:"); scanf("%d",&stu->Class)
47、; printf("數(shù)學:"); scanf("%d",&stu->math); printf("英語:"); scanf("%d",&stu->english); printf("計算機:"); scanf("%d",&stu->computer); while(1) { head=insert(head,stu); printf("請繼續(xù)輸入學生信息(按\"0\"退出)\n"); st
48、u=(struct student *)malloc(LEN); printf("學號:"); scanf("%d",&stu->num); if(stu->num==0) break; printf("姓名:"); scanf("%s",stu->name); printf("性別:"); scanf("%s",stu->sex); printf("班級:"); scanf("%d",&stu-
49、>Class); printf("數(shù)學:"); scanf("%d",&stu->math); printf("英語:"); scanf("%d",&stu->english); printf("計算機:"); scanf("%d",&stu->computer); } break; case 3: printf("1.按學號刪除 2.按姓名刪除\n請選擇:");
50、 scanf("%d",&choice); switch(choice) { case 1: printf("輸入要刪除的學生學號(按\"0\"退出):"); scanf("%d",&num); while(num!=0) { head=del1(head,num); printf("輸入要刪除的學生學號(按\"0\"退出):");
51、 scanf("%d",&num); } break; case 2: printf("輸入要刪除的學生姓名(按\"0\"退出):"); scanf("%s",name); while(strcmp(name,"0")!=0) { head=del2(head,name);
52、 printf("輸入要刪除的學生姓名(按\"0\"退出):"); scanf("%s",name); } break; default: break; } break; case 4: printf("1.按學號查找 2.按姓名查找\n請選擇:"); scanf("%d",&choice); switch(choi
53、ce) { case 1: printf("輸入要查找的學生學號:"); scanf("%d",&num); find1(head,num); break; case 2: printf("輸入要查找的學生姓名:"); scanf("%s",name); find2(head,name);
54、 break; default: break; } break; case 5: print(head); break; case 6: compare(head); break; case 7: save(head); break; case 8: head=load(); break; default: break; } if(choice==9) {printf("謝謝使用!\n"); break;} } }
55、 四、調試分析過程描述 1、主菜單 2、創(chuàng)建成績單 3、增加學生記錄 4、刪除學生記錄 5、顯示所有學生記錄 6、班級成績對比 7、查找學生記錄 8、保存學生記錄 9、讀取文件信息 調試過程中的問題與反思: 此次編寫的程序蓋內容量很大,在編寫過程中采用的是寫好一個模塊測試一個模塊的方法,但是將各個模塊組合到一起后仍舊出現(xiàn)了許多小問題,經過多次調試才達到各個模塊協(xié)調工作。 最初程序編寫的時候并沒有太過提示性輸出語句,雖然程序運行不會受到影響,但是非編
56、寫人員就難以使用,在調試中明顯感受到有些地方如果不加提示使用者將很難操作。最后對一些需要提示的地方慢慢修改,加入一系列提示以后才使程序比較人性化。對于界面的設計,最初雖然有一個雛形,但是在實際調試過程中暴露出不少錯位等顯示效果不佳的狀況。針對此類問題,必須多次全面調試,才能將程序界面編寫得最美觀。 經過整個調試之后,深深感受到程序調試有相當?shù)谋匾?,很多問題不經過反復調試是難以暴露的。如界面設計、菜單人性化等需要直觀感受的東西,也只有通過程序調試才能將它們盡可能完善。 五、課程設計小結 通過本次課程設計,我熟悉了對鏈表的創(chuàng)建、增加、刪除等一些操作,先前只在課堂上聽老師講述,自己對開辟
57、內存空間、結構體指針等與鏈表相關的操作并不熟悉,在制作了這個程序之后,我對鏈表的相關操作已經比較熟練了。 本次課程設計需要用到一系列外部文件命令,通過自學外部命令和課程設計的演練,我已經能夠掌握外部文件的相關命令。值得一提的是,課程設計要求鏈表命令與外部文件命令相結合,通過此次程序編寫,這兩部分知識結合使用,將我所學的只是串聯(lián)起來。 課程設計所要求的程序,是我從學習C語言以來編寫得最長的程序,以往老師在可能上常說命令要精簡我總是不以為然,經過本次編寫,我體會到了精簡命令的重要性。對于一個小程序,可能長點短點無所謂,出了問題很容易檢查,而對于這種需要編寫四五百行的大程序,如果不注意使用命令的
58、簡單明了,可能導致程序編寫量大很多,冗長的程序代碼也會給程序出錯時的檢查帶來極大的麻煩。 過去編寫程序,都是書上的題目,完成題目就算目標達成。而此次程序設計我需要完成的是一個完完整整有很強使用行的程序。因而首次讓我注意到界面的問題,不僅僅需要編寫出能夠正常運行的程序,還需要給使用者一個清爽的、易操作的界面。為了達到清爽的界面,得不斷觀察程序運行界面,不斷調試,達到最佳顯示效果;為了達到一操作性,必需添加一系列判斷語句同時伴隨相應的輸出語句給使用者提示。這些,都是過去C語言練習中涉及不多的。 這次設計的程序包含了大量的獨立模塊,在編寫過程中運用了逐個模塊單獨編寫,單獨測試,最終聚合到一起調試的思路。這種思路以前大學計算機基礎課和C語言課都講到過,但由于所編寫的程序往往比較簡單,過去并未應用。而此次課程設計運用到了這種思想,我也感受到了這種思想的先進性,大大提高了工作效率。 總之,在這次課程設計中我受益匪淺,我不僅掌握了過去并未掌握的知識,同時將很多以前隨聽說卻不曾使用過的思想付諸實踐。也體會到調試程序的重要性,從調試中我們可以發(fā)現(xiàn)很多很多編寫時所未曾注意的問題。C語言這門課,是教我們如何編寫程序,絕非僅僅會解答C語言題目,從編寫程序過程中,我感受到還要注重程序界面的外觀與可操作性。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工重大危險源安全管理制度
- 安全培訓資料:典型建筑火災的防治基本原則與救援技術
- 企業(yè)雙重預防體系應知應會知識問答
- 8 各種煤礦安全考試試題
- 9 危險化學品經營單位安全生產管理人員模擬考試題庫試卷附答案
- 加壓過濾機司機技術操作規(guī)程
- 樹脂砂混砂工藝知識總結
- XXXXX現(xiàn)場安全應急處置預案
- 某公司消防安全檢查制度總結
- 1 煤礦安全檢查工(中級)職業(yè)技能理論知識考核試題含答案
- 4.燃氣安全生產企業(yè)主要負責人模擬考試題庫試卷含答案
- 工段(班組)級安全檢查表
- D 氯化工藝作業(yè)模擬考試題庫試卷含答案-4
- 建筑起重司索信號工安全操作要點
- 實驗室計量常見的30個問問答題含解析