學(xué)生成績管理系統(tǒng) C語言.doc
《學(xué)生成績管理系統(tǒng) C語言.doc》由會員分享,可在線閱讀,更多相關(guān)《學(xué)生成績管理系統(tǒng) C語言.doc(22頁珍藏版)》請在裝配圖網(wǎng)上搜索。
_福建工程學(xué)院計算機與信息科學(xué)系實驗報告 2012 2013 學(xué)年第 1 學(xué)期 任課老師: 章靜 課程名稱 結(jié)構(gòu)化程序綜合設(shè)計班級計算機1001座號3100301114姓名張揚文實驗題目學(xué)生成績管理系統(tǒng)實驗時間實驗開始日期:2012/2/24 報告提交日期:2012/3/10 實驗?zāi)康?、要?該實驗的課內(nèi)學(xué)時是4個課時。2程序完成后應(yīng)該完成如下基本功能:1)用自定義結(jié)構(gòu)體typedef struct設(shè)計該軟件的數(shù)據(jù)結(jié)構(gòu);2)用數(shù)組或指針鏈表將所有學(xué)生的數(shù)據(jù)按照學(xué)號順序鏈接起來;3)程序能夠按照學(xué)號順序輸入學(xué)生的三門成績,并計算平均成績和總成績。4)程序能夠顯示已經(jīng)輸入的指定學(xué)號的學(xué)生成績以及平均成績和總成績。5)程序能夠按要求顯示指定分?jǐn)?shù)段的學(xué)生成績以及平均成績和總成績。6)能夠統(tǒng)計班級總?cè)藬?shù)、班級平均成績。7)能夠增加和刪除指定學(xué)生的成績。8)按照指定的要求以及順序(升序或降序)顯示學(xué)生成績以及平均成績和總成績。 實驗步驟與內(nèi)容 按如下順序?qū)懀?、 主要設(shè)計思想;學(xué)生成績管理系統(tǒng)包含多種功能,可以輸入學(xué)生成績,刪除,插入,排序,查找等等。輸入的信息又包含學(xué)生姓名,學(xué)號,各科成績。所以首先要定義一個結(jié)構(gòu)體:typedef struct node char id20; char name15; int scoreMAXCOURSE; int sum; double average; struct node *next;Student;根據(jù)結(jié)構(gòu)體中的內(nèi)容飆血程序。2、 主要數(shù)據(jù)結(jié)構(gòu)及其解釋在此次程序設(shè)計中用了鏈表來實現(xiàn)對數(shù)據(jù)的處理,并設(shè)計了菜單界面如圖,根據(jù)switch語句來對用戶的選擇: 3、 模塊關(guān)系圖; 主函數(shù)輸入學(xué)生信息打印成績計算平均分和總分查找學(xué)生成績插入學(xué)生成績顯示分?jǐn)?shù)段的學(xué)生按總分平均分降序排列菜單4、 所有函數(shù)的簡要說明;1) 插入函數(shù)Insert_Before();主要是要重新加入學(xué)生的信息,通過頭插法。2) 計算平均分和總分Count_Score();將輸入的數(shù)據(jù)計算出學(xué)生的平均分和總分。3) 刪除學(xué)生信息Del_Student();刪除某個學(xué)生的成績。4) 按姓名查找Searchname_Student();通過輸入學(xué)生的姓名找到學(xué)生的成績。5) 計算班級總?cè)藬?shù)people=Count_People();將總的輸入學(xué)生人數(shù)打印出來。6) 顯示某分?jǐn)?shù)段學(xué)生信息Section_Score();首先選擇你要某科目的成績并輸入成績的范圍,按條件輸出學(xué)生成績。7) 按總分,平均分降序排列Descend_English();將輸入的全部學(xué)生成績按總分排序。 5、 所有源代碼; /*學(xué)生成績管理系統(tǒng) C語言*/#include #include #include #define MAXID 10#define MAXNAME 20#define MAXCOURSE 3/* 學(xué)生數(shù)據(jù)結(jié)構(gòu) */typedef struct node char id20; char name15; int scoreMAXCOURSE; int sum; double average; struct node *next;Student;/* 頭指針 */Student *head = NULL;/*課程名稱*/char ClassNameMAXCOURSE20=數(shù)學(xué),英語,計算機;/* 菜單 */int Menu() system(cls); fflush(stdin); printf( 計算機1001 張揚文 3100301114 n); printf(n); printf(*學(xué)生成績管理系統(tǒng)*n); printf(n); printf( 1-初始化n); printf( 2-輸入學(xué)生信息n); printf( 3-計算所有學(xué)生的總分和平均分n); printf( 4-打印全部學(xué)生信息n); printf( 5-查找學(xué)號或姓名刪除學(xué)生信息n); printf( 6-按姓名查找學(xué)生信息n); printf( 7-按學(xué)號查找學(xué)生信息n); printf( 8-查找某一科成績段學(xué)生信息n); printf( 9-插入學(xué)生信息到鏈表中n); printf( 10-按總分或平均分降序排列學(xué)生成績n); printf( 0-退出n); return 0;/*初始化*/Student *Init() int i; Student *head; head=(Student *)malloc(sizeof(Student); head-next=NULL; return head;/*檢查學(xué)號*/char Check_ID(char *s) int i; if(strlen(s)=0|strlen(s)MAXID)return 0; for(i=0;i 0 & si MAXNAME) return 0; for(i=0; i= a & si = A & si =0 & snext; while(p!=NULL) if(strcmp(s,p-id)=0) return 1; p=p-next; return 0;/* 輸入學(xué)生信息 */void Input_Score(Student *p) /* 學(xué)號 */ printf(n請輸入學(xué)號: ); do gets(p-id); if (!Check_ID(p-id) printf(輸入不正確!請重新輸入學(xué)號: ); else if (Is_SameID(p-id) printf(存在已學(xué)號!請重新輸入學(xué)號: ); while (!(Check_ID(p-id) & !Is_SameID(p-id); /* 姓名 */ printf(請輸入姓名: ); do gets(p-name); if (!Check_Name(p-name) printf(輸入不正確!請重新輸入姓名: ); while (!Check_Name(p-name); /輸入成績 int i; for(i=0; iscorei); if(!Check_Score(p-scorei) printf(輸入成績不正確!n請重新輸入%s成績:,ClassNamei); while(!Check_Score(p-scorei); p-average = -1; p-sum = -1; /* 頭插法插入節(jié)點 */void Insert_Before() Student *s =(Student*) malloc(sizeof(Student); Input_Score(s); s-next = head-next; head-next = s;/*輸出學(xué)生成績信息*/void Output_Score(Student *p) int i; printf(n姓名:%s, 學(xué)號:%s n,p-name,p-id); for(i=0; iscorei); printf(總分:%d 平均分:%.2f n,p-sum,p-average);/*刪除節(jié)點q*/void Del_Node(Student *q) Student *p=head; while(p-next!=q) p=p-next; p-next=q-next; free(q);/*插入學(xué)生成績*/void Insert_List() int x; printf(輸入你要插入的學(xué)生數(shù):); scanf(%d,&x); while(x!=0) getchar(); Student *p =(Student*) malloc(sizeof(Student); printf(n請輸入學(xué)號: ); do gets(p-id); if (!Check_ID(p-id) printf(輸入不正確!請重新輸入學(xué)號: ); else if (Is_SameID(p-id) printf(存在已學(xué)號!請重新輸入學(xué)號: ); while (!(Check_ID(p-id) & !Is_SameID(p-id); /* 姓名 */ printf(請輸入姓名: ); do gets(p-name); if (!Check_Name(p-name) printf(輸入不正確!請重新輸入姓名: ); while (!Check_Name(p-name); /輸入成績 int i; for(i=0; iscorei); do if(!Check_Score(p-scorei) printf(輸入成績不正確!請重新輸入%s成績:,ClassNamei); while(!Check_Score(p-scorei); p-average = -1; p-sum = -1; p-next = head-next; head-next = p; x-; /*按學(xué)號查找*/Student *Search_ID(char *id) Student *p=head-next; while(p!=NULL) if(strcmp(p-id,id)=0)break; p=p-next; return p;/*按姓名查找節(jié)點*/Student *Search_Name(char *name) Student *p=head-next; while(p!=NULL) if(strcmp(p-name,name)=0)break; p=p-next; return p;/*輸出鏈表*/void Output_List() Student *p; p=head-next; while(p!=NULL) Output_Score(p); p=p-next; /*刪除指定學(xué)生信息*/void Del_Student() Student *p; fflush(stdin); char str15; char judge10; printf(請輸入要刪除的學(xué)生的 學(xué)號或姓名:); do gets(str); if(!(Check_ID(str)|Check_Name(str) printf(輸入錯誤!請重新輸入:); while(!(Check_ID(str)|Check_Name(str); /判斷是否為學(xué)號還是姓名 if(str00&str0next; while(p != NULL) Quit(p-next); free(p); exit(0);/*計算個人平均分和總分*/void Count_Score() Student *p; int i; p=head-next; while(p!=NULL) for(i=0;isum = p-sum + p-scorei; p-average = p-sum * 1.0 / MAXCOURSE; p=p-next; /*計算班級總?cè)藬?shù)*/int Count_People() Student *p; int people=0; p=head-next; while(p!=NULL) people=people+1; p=p-next; return people;/*計算班級平均分*/void Count_Mark() Student *p; int m; float avecla=0; p=head-next; while(p!=NULL) avecla=avecla+p-sum; p=p-next; m=Count_People(); printf(班級平均分為:%.2f,avecla/m);/*根據(jù)某科成績段顯示成績*/void Section_Score() char x; int m,n,i,flag=0; Student *p; p=head-next; printf(請輸入指定分?jǐn)?shù)段的科目(A:數(shù)學(xué) B:英語 C:計算機):n); scanf(%c,&x); printf(請輸入你要顯示的分?jǐn)?shù)段(從n到m):); scanf(%d,&n); scanf(%d,&m); switch(x) case A: while(p!=NULL) if(n score0 & p-score0name,p-id); for(i=0; iscorei); printf(總分為:%d 平均分:%.2fn,p-sum,p-average); p = p-next; break; case B: while(p!=NULL) flag=1; if(n score1 & p-score1name,p-id); for(i=0; iscorei); printf(總分為:%d 平均分:%.2fn,p-sum,p-average); p = p-next; break; case C: while(p!=NULL) flag=1; if(n score2 & p-score2 name,p-id); for(i=0; iscorei); printf(總分為:%d 平均分:%.2fn,p-sum,p-average); p = p-next; break; default: printf(輸入無效!n); fflush(stdin); if(flag=0) printf(在%d到%d的分?jǐn)?shù)段學(xué)生為零!);/*比較成績大小*/Student *Descby_English(Student *Newhead,Student *sort) Student *p,*q; p=Newhead; while(p!=NULL) if(sort-sum p-sum) break; q=p; p=p-next; if(p=Newhead) sort-next = p; return sort; else q-next = sort; sort-next = p; return Newhead; /*按總分或平均分降序排列*/void Descend_English() Student *p,*q,*Newhead; int i,j=1,people; Newhead = NULL; p = head; while(p != NULL) q = p-next; Newhead = Descby_English(Newhead,p); p = q; if(p = head) printf(學(xué)生信息庫為空!n); else p = Newhead-next; people=Count_People(); printf(按總分和平均分排序如下:n); while(p!=NULL) if(jname,p-id); for(i=0; iscorei); printf(總分:%d 平均分:%.2f ,p-sum,p-average); j+; printf(n); p=p-next; /*按姓名查找學(xué)生成績*/void *Searchname_Student() char name10; int i=0; Student *p=head-next; getchar(); printf(請輸入你要查找的學(xué)生姓名:); do gets(name); if(!Check_Name(name) printf(輸入姓名不正確!重新輸入:); while(!Check_Name(name); while(p!=NULL) if(strcmp(p-name,name)=0) Output_Score(p); i=1; p=p-next; if(i=0) printf(找不到此姓名!); /*按學(xué)號查找學(xué)生成績*/void *SearchID_Student() char id10; int i=0; Student *p=head-next; getchar(); printf(請輸入你要查找的學(xué)生學(xué)號:); do gets(id); if(!Check_ID(id) printf(輸入學(xué)號不正確!重新輸入:); while(!Check_ID(id); while(p!=NULL) if(strcmp(p-id,id)=0) Output_Score(p); i=1; p=p-next; if(i=0) printf(找不到此學(xué)號!); /*主函數(shù)*/void main() int x,n,people; Student *q; Menu(); while(1) printf(n請輸入命令編號: ); scanf(%d, &x); switch(x) case 1: /初始化 head = Init(); printf(初始化成功!n); break; case 2: /輸入成績 printf(輸入序號:); scanf(%d,&n); getchar(); while(n!=-1) Insert_Before(); printf(輸入序號:); scanf(%d,&n); getchar(); break; case 3: /計算平均分和總分 Count_Score(); printf(計算平均分和總分成功!); break; case 4: /打印出所有成績 Output_List(); break; case 5: Del_Student(); break; case 6: /按姓名查找學(xué)生成績 Searchname_Student(); break; case 7: /按學(xué)號查找學(xué)生成績 SearchID_Student(); break; case 8: /計算班級人數(shù) people=Count_People(); printf(班級總?cè)藬?shù)為:%d n,people); break; case 9: /*插入學(xué)生成績*/ Insert_List(); break; case 10: /*顯示某科分?jǐn)?shù)段的學(xué)生*/ getchar(); Section_Score(); break; case 11: /*按總分或平均分降序排列*/ Descend_English(); break; case 0: /*結(jié)束*/ Quit(); break; default:printf(輸入錯誤!nn); 試驗過程記錄記錄試驗中遇到的困難及解決方法;實驗結(jié)果記錄以及與預(yù)期結(jié)果比較以及分析記錄每次實驗結(jié)果以及分析情況初始化輸入學(xué)生成績計算平均分 總分打印學(xué)生成績刪除學(xué)生成績查找學(xué)生成績插入學(xué)生成績顯示某分?jǐn)?shù)段學(xué)生成績總結(jié)以及心得體會實驗總體還是比較順利,但也遇到了一些困難,通過與同學(xué)交流和查找資料已經(jīng)解決了。 在做實驗之前,一定要把課本上的知識吃透,因為這是做實驗的基礎(chǔ),否則,在老師講解時久聽不懂,這會使實驗難度加大,浪費做實驗的寶貴時間。做實驗一定要親力親為,務(wù)必要將每個細節(jié),每個步驟弄清楚,弄明白,還要復(fù)習(xí),思考。這樣,你的印象才深刻,才記得牢固,否則,過后就忘了還不如不做。 每次的實驗都讓我受益非淺,這次課程設(shè)計更使我有了更大的收獲。明白了字符串的很多操作算法的編寫和理解,并且查閱了大量的資料,對字符串的相關(guān)知識有了很大的了解。期間遇到了很多的問題,其實我覺得編寫程序,調(diào)試,遇到問題耐心的查錯,總會有解決辦法的,比較困難的錯誤其實是能夠運行之后結(jié)果不穩(wěn)定,有時候?qū)?,有時候錯,這樣的問題往往是程序設(shè)計的算法的問題,雖然這次程序沒有太復(fù)雜的算法,但是一些小的地方?jīng)]有考慮到,往往會給運行結(jié)果造成很多難以解釋的錯誤。我覺得我的程序在經(jīng)過很多種情況的測試后,基本上能滿足我自己的要求了,可能還有很多不完善的地方,但是確實收獲了很多東西,隨著以后的學(xué)習(xí)運用,估計會有更深入的認(rèn)識。指導(dǎo)老師評閱意見指導(dǎo)老師: 年 月 日填寫內(nèi)容時,可把表格擴大。實驗的源程序代碼(要有注釋)附在表后。THANKS !致力為企業(yè)和個人提供合同協(xié)議,策劃案計劃書,學(xué)習(xí)課件等等打造全網(wǎng)一站式需求歡迎您的下載,資料僅供參考-可編輯修改-- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
32 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 學(xué)生成績管理系統(tǒng) C語言 學(xué)生 成績管理系統(tǒng) 語言
鏈接地址:http://ioszen.com/p-1557134.html