武漢科技大學 C課程設(shè)計 學生成績管理系統(tǒng) 鏈表
《武漢科技大學 C課程設(shè)計 學生成績管理系統(tǒng) 鏈表》由會員分享,可在線閱讀,更多相關(guān)《武漢科技大學 C課程設(shè)計 學生成績管理系統(tǒng) 鏈表(23頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 二○一二 ~二○一三 學年第 一 學期 電子技術(shù)學院 課程設(shè)計報告書 課程名稱: C程序課程設(shè)計 班 級: 電信DB2011級1102班 學 號: xxxxxxxxxxxxxxx 姓 名: xxxx 指導教師: xxxx 二○一二年 九 月 一、需求分析 1、題目二 學生成績管理程序 任務(wù):自學C語言中相
2、關(guān)知識,設(shè)計出學生成績管理程序。要求如下所述: u 錄入學生信息,每位學生錄入的信息有:姓名、學號、性別、班級、和三門功課(數(shù)學,英語,計算機)的成績。以文件(myfile.txt)的形式保存每個學生的所有信息。(實驗中:假設(shè)3個班,每個班學生人數(shù)不得少于5人) 學號 姓名 性別 班級 數(shù)學 英語 計算機 1101 王鵬 男 1班 70 58 98 1102 李燕 女 2班 68 88 95 1103 趙亞芳 女 3班 58 48 96 u 增加學生記錄,并將增加的信息以文件的(
3、myfile.txt)的形式保存。 u 刪除學生記錄,以“學號”、“姓名”為關(guān)鍵字刪除記錄,若要刪除的記錄不存在,給出必要的提示信息; 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è)計 文件讀取模塊 數(shù)據(jù)保存模塊 成績對比模塊 數(shù)據(jù)顯示 模塊 數(shù)據(jù)查找模塊 數(shù)據(jù)刪除模塊 數(shù)據(jù)增加模塊 成績單建立模塊 學生成績管理程序 三、詳細設(shè)計 1、建立結(jié)構(gòu)體 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); 結(jié)束 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\"結(jié)束]\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; 結(jié)束 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"); 結(jié)束 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 結(jié)束 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 結(jié)束
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; 算出各班平均分并比較 輸出成績對比結(jié)果 結(jié)束 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、 四、調(diào)試分析過程描述 1、主菜單 2、創(chuàng)建成績單 3、增加學生記錄 4、刪除學生記錄 5、顯示所有學生記錄 6、班級成績對比 7、查找學生記錄 8、保存學生記錄 9、讀取文件信息 調(diào)試過程中的問題與反思: 此次編寫的程序蓋內(nèi)容量很大,在編寫過程中采用的是寫好一個模塊測試一個模塊的方法,但是將各個模塊組合到一起后仍舊出現(xiàn)了許多小問題,經(jīng)過多次調(diào)試才達到各個模塊協(xié)調(diào)工作。 最初程序編寫的時候并沒有太過提示性輸出語句,雖然程序運行不會受到影響,但是非編
56、寫人員就難以使用,在調(diào)試中明顯感受到有些地方如果不加提示使用者將很難操作。最后對一些需要提示的地方慢慢修改,加入一系列提示以后才使程序比較人性化。對于界面的設(shè)計,最初雖然有一個雛形,但是在實際調(diào)試過程中暴露出不少錯位等顯示效果不佳的狀況。針對此類問題,必須多次全面調(diào)試,才能將程序界面編寫得最美觀。 經(jīng)過整個調(diào)試之后,深深感受到程序調(diào)試有相當?shù)谋匾?,很多問題不經(jīng)過反復調(diào)試是難以暴露的。如界面設(shè)計、菜單人性化等需要直觀感受的東西,也只有通過程序調(diào)試才能將它們盡可能完善。 五、課程設(shè)計小結(jié) 通過本次課程設(shè)計,我熟悉了對鏈表的創(chuàng)建、增加、刪除等一些操作,先前只在課堂上聽老師講述,自己對開辟
57、內(nèi)存空間、結(jié)構(gòu)體指針等與鏈表相關(guān)的操作并不熟悉,在制作了這個程序之后,我對鏈表的相關(guān)操作已經(jīng)比較熟練了。 本次課程設(shè)計需要用到一系列外部文件命令,通過自學外部命令和課程設(shè)計的演練,我已經(jīng)能夠掌握外部文件的相關(guān)命令。值得一提的是,課程設(shè)計要求鏈表命令與外部文件命令相結(jié)合,通過此次程序編寫,這兩部分知識結(jié)合使用,將我所學的只是串聯(lián)起來。 課程設(shè)計所要求的程序,是我從學習C語言以來編寫得最長的程序,以往老師在可能上常說命令要精簡我總是不以為然,經(jīng)過本次編寫,我體會到了精簡命令的重要性。對于一個小程序,可能長點短點無所謂,出了問題很容易檢查,而對于這種需要編寫四五百行的大程序,如果不注意使用命令的
58、簡單明了,可能導致程序編寫量大很多,冗長的程序代碼也會給程序出錯時的檢查帶來極大的麻煩。 過去編寫程序,都是書上的題目,完成題目就算目標達成。而此次程序設(shè)計我需要完成的是一個完完整整有很強使用行的程序。因而首次讓我注意到界面的問題,不僅僅需要編寫出能夠正常運行的程序,還需要給使用者一個清爽的、易操作的界面。為了達到清爽的界面,得不斷觀察程序運行界面,不斷調(diào)試,達到最佳顯示效果;為了達到一操作性,必需添加一系列判斷語句同時伴隨相應的輸出語句給使用者提示。這些,都是過去C語言練習中涉及不多的。 這次設(shè)計的程序包含了大量的獨立模塊,在編寫過程中運用了逐個模塊單獨編寫,單獨測試,最終聚合到一起調(diào)試的思路。這種思路以前大學計算機基礎(chǔ)課和C語言課都講到過,但由于所編寫的程序往往比較簡單,過去并未應用。而此次課程設(shè)計運用到了這種思想,我也感受到了這種思想的先進性,大大提高了工作效率。 總之,在這次課程設(shè)計中我受益匪淺,我不僅掌握了過去并未掌握的知識,同時將很多以前隨聽說卻不曾使用過的思想付諸實踐。也體會到調(diào)試程序的重要性,從調(diào)試中我們可以發(fā)現(xiàn)很多很多編寫時所未曾注意的問題。C語言這門課,是教我們?nèi)绾尉帉懗绦?,絕非僅僅會解答C語言題目,從編寫程序過程中,我感受到還要注重程序界面的外觀與可操作性。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 5段太尉逸事狀
- 讀后感作文輔導1
- 有機磷農(nóng)藥中毒終極
- 電解池的應用(教育精品)
- 庫存管理流程及改善課件
- 廬陽區(qū)XX小學四年級數(shù)學上冊-1-大數(shù)的認識-第4課時-億以內(nèi)數(shù)的大小比較課件-新人教版
- 合同策劃與合同分析
- 五年級下冊語文課件-1春光染綠我們雙腳-蘇教版
- 闌尾炎的教學查房csp課件
- 基準和輪廓度公差課件
- 建立開放式公共物流平臺體系-推動制造業(yè)及物流的聯(lián)動課件
- 三(323)家長會
- 策略管理Chapter3內(nèi)部分析獨特能力競爭優(yōu)勢與獲利能力課件
- 江城子(教育精品)
- 水果寶寶去旅行 (2)(教育精品)