




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、C語言程序設計課程設計報告設計題目:學生考勤系統(tǒng)設計專 業(yè) 微電子科學與工程班 級 微電 131 學 生 趙 楊 怡 指導教師 年 學期 設計任務:C語言課程設計任務書10題目:學生考勤系統(tǒng)設計功能:學生考勤系統(tǒng)應包含各班學生的全部信息。每個學生是一條記錄,包括姓名、性別、學號、日期、節(jié)次、出勤情況等信息。本系統(tǒng)可以模擬考勤過程、記錄考勤結果,并能在課程結束后按照設定的考勤評分標準自動給出每個學生的考勤分數(shù)。要求:1、用C語言實現(xiàn)程序設計;2、利用結構體進行相關信息處理;3、系統(tǒng)的各個功能模塊要求用函數(shù)的形式實現(xiàn);4、界面友好(良好的人機交互),程序加必要的注釋。平時成績:驗收答辯成績:設計報
2、告成績:總評成績:指導教師:一、總體設計1程序的總體設計 確定界面,使用戶可選擇操作項目(錄入,修改,查詢,評分)。 錄入功能:使用結構體,要求用戶輸入姓名、性別、學號、日期、節(jié)次、當前出勤情況等信息,并寫入文件。 修改功能:使用戶輸入學號,姓名其中一項可以修改考勤其信息。對于修改功能的實現(xiàn),是先將所有文件內容讀入到內存中,然后修改考勤值,最后再重新覆蓋寫入文件。 查詢模塊:使用字符串比較函數(shù),利用循環(huán)找到對應結構體數(shù)組元素,然后輸出需要信息。對于查詢功能的實現(xiàn),同修改,是先將所有文件內容讀入到內存中,然后查找到其中某項,最后輸出到屏幕。 評分模塊:系統(tǒng)根據(jù)總的應道考勤數(shù)按照百分制,求出每個學
3、生的分數(shù),并輸出到屏幕。2. 數(shù)據(jù)結構學生信息用結構體記錄,包括姓名(字符數(shù)組)、性別(字符型)、日期(年月日三個字符數(shù)組)、節(jié)次(整型)、出情況(整型)。3. 函數(shù)原型聲明 void main() /主函數(shù)void input(); /錄入數(shù)據(jù)函數(shù)void change(); /修改數(shù)據(jù)函數(shù)void search(); /查詢數(shù)據(jù)函數(shù)void evaluate(); /計算總評函數(shù)二、詳細設計1.main( )函數(shù)void main()void input(); /錄入數(shù)據(jù)函數(shù)void change(); /修改數(shù)據(jù)函數(shù)void search(); /查詢數(shù)據(jù)函數(shù)void evaluate(
4、); /計算總評函數(shù) char item; system("color 34");printf(" n");printf(" n");printf(" 學 生 考 勤 管 理 系 統(tǒng) n");printf(" n");printf(" BY 朱勝佳 n");printf(" n");printf(" n");printf(" n");printf(" 1.學生信息及考勤情況錄入 n");print
5、f(" n");printf(" 2.學生信息及考勤情況修改 n");printf(" n");printf(" 3.學生信息及考勤情況查詢 n");printf(" n");printf(" 4.學生考勤總評分數(shù)查詢 n");printf(" n");printf(" n"); /用戶界面printf("n");printf(" 請選擇您需要的操作n");scanf("%c"
6、,&item); switch(item) case '1': input();break; case '2': change();break; case '3': search();break; case '4': evaluate();break; /實現(xiàn)功能選擇 流程圖: 開 始1breakgoal()search()amend()record()432switch(item) switch(item)switch(item)輸出界面 結束2. input() 函數(shù)void input()int i,j=0,jx=1
7、;printf(" *學 生 基 本 信 息 錄 入*n");if(fp=fopen("date.txt","w")=NULL)printf("文件打開失敗n"); exit(0);for(i=0;jx=1;i+) /輸入信息循環(huán) for(;j=0;) /輸入確認循環(huán)getchar();printf("請輸入第%d個學生的姓名 ",i+1);gets();printf("請輸入第%d個學生的學號 ",i+1);gets(stui.number);printf
8、("請輸入第%d個學生的性別(男:m 女:f) ",i+1);stui.sex=getchar();printf("請輸入第%d個學生的生日(格式:年 月 日) ",i+1);scanf("%d%d%d",&stui.year,&stui.month,&stui.day); printf("請輸入第%d個學生的當前考勤次數(shù) ",i+1);scanf("%d",&stui.kq);printf("您輸入的信息為 姓名 %s 學號 %s 性別 %c 生日 %
9、d年%d月%d日n 0 重輸 1 確認",,stui.number,stui.sex,stui.year,stui.month,stui.day);scanf("%d",&j); /輸入確認 j=0; if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf("文件寫入錯誤n"); /寫入文件printf(" 是否繼續(xù)輸入下一個學生信息 0 終止 1 繼續(xù)n");scanf("%d",&jx); /繼續(xù)輸入選擇
10、fclose(fp); printf("0 返回主菜單n");getchar();a=getchar();getchar();if(a='0') main(); /返回主菜單流程圖:開始0=>j打開文件1=>jx0=>ijx=1?Yj=0?Y輸入i+1個學生信息生信息N輸入j值選擇是否確認寫入文件i+1=>i輸入jx值選擇是否繼續(xù)結束3. change()函數(shù)void change() int i=0,j=0,sway,t,x; char name10,number10;printf(" *學 生 考 勤 修 改*n&quo
11、t;); if(fp=fopen("date.txt","r")=NULL) /將文件內容讀入內存printf("文件打開失敗n"); exit(0);for(i=0;feof(fp)=0;i+) fread(&stui,sizeof(struct student),1,fp); /讀取文件內容fclose(fp); /關閉文件printf("選擇查找方式 1 按照姓名查找 2 按照學號查找");scanf("%d",&sway); /*按照姓名查找開始*/if(sway=1)p
12、rintf("請輸入需要修改學生的姓名 ");/printf("i=%d",i);scanf("%s",name);for(j=0;t!=0;j+) t=strcmp(,name);if(j=i) t=0;printf("未找到您所查詢的數(shù)據(jù),請重新輸入n"); if(j<i) /查詢成功printf("您查找的學生信息如下n 姓名 %s 學號 %s 性別 %c 生日 %d年%d月%d日 當前考勤次數(shù) %dn",,stuj-1.number,stuj
13、-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq); printf("是否修改該生考勤信息 0 否 1 是"); /選擇是否修改考勤 scanf("%d",&x); /輸入選擇變量值if(x=1)printf("請輸入新的考勤值 ");scanf("%d",&stuj-1.kq); /輸入新的考勤值 if(fp=fopen("date.txt","w")=NULL) /以只寫方式打開文件 printf(&
14、quot;文件打開失敗n"); exit(0); for(j=0;j<i;j+) if(fwrite(&stuj,sizeof(struct student),1,fp)!=1) printf("文件寫入錯誤n"); /寫入文件 fclose(fp); /關閉文件printf("是否繼續(xù)修改其他學生考勤 0 否 1 是");scanf("%d",&x);if(x=1) change();/*按照姓名查找結束*/ /*按照學號查找開始*/if(sway=2)printf("請輸入需要修改學生的學
15、號 ");/printf("i=%d",i);scanf("%s",number);for(j=0;t!=0;j+) t=strcmp(stuj.number,number);if(j=i) t=0;printf("未找到您所查詢的數(shù)據(jù),請重新輸入n"); if(j<i) /查詢成功printf("您查找的學生信息如下n 姓名 %s 學號 %s 性別 %c 生日 %d年%d月%d日 當前考勤次數(shù) %dn",,stuj-1.number,stuj-1.sex,stuj-1.yea
16、r,stuj-1.month,stuj-1.day,stuj-1.kq); printf("是否修改該生考勤信息 0 否 1 是"); /選擇是否修改考勤 scanf("%d",&x); /輸入選擇變量值if(x=1)printf("請輸入新的考勤值 ");scanf("%d",&stuj-1.kq); /輸入新的考勤值 if(fp=fopen("date.txt","w")=NULL) /以只寫方式打開文件 printf("文件打開失敗n"
17、;); exit(0); for(j=0;j<i;j+) if(fwrite(&stuj,sizeof(struct student),1,fp)!=1) printf("文件寫入錯誤n"); /寫入文件 fclose(fp); /關閉文件printf("是否繼續(xù)修改其他學生考勤 0 否 1 是");scanf("%d",&x);if(x=1) change();/*按照學號查找結束*/printf("0 返回主菜單n");getchar();a=getchar();getchar();if(
18、a='0') main();開始 打開文件將文件內容全部讀入結構體數(shù)組輸入sway值選擇查找方式Sway=1?NSway=2?Y輸入要查找的學號輸入要查找的姓名N查找學號查找姓名輸入X值選擇是否修改考勤X=1?Y輸入新的考勤值寫入文件結束4. search()函數(shù)void search() int i=0,j=0,sway,t,x; char name10,number10;printf(" *學 生 信 息 查 詢*n"); if(fp=fopen("date.txt","r")=NULL) /將文件內容讀入內存pr
19、intf("文件打開失敗n"); exit(0);for(i=0;feof(fp)=0;i+) fread(&stui,sizeof(struct student),1,fp); /讀取文件內容fclose(fp); /關閉文件printf("選擇查找方式 1 按照姓名查找 2 按照學號查找");scanf("%d",&sway); /*按照姓名查找開始*/if(sway=1)printf("請輸入需要修改學生的姓名 ");/printf("i=%d",i);scanf(&quo
20、t;%s",name);for(j=0;t!=0;j+) t=strcmp(,name);if(j=i) t=0;printf("未找到您所查詢的數(shù)據(jù),請重新輸入n"); if(j<i) /查詢成功printf("您查找的學生信息如下n 姓名 %s 學號 %s 性別 %c 生日 %d年%d月%d日 當前考勤次數(shù) %dn",,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq); printf("是否繼
21、續(xù)查詢其他學生信息 0 否 1 是");scanf("%d",&x);if(x=1) search();/*按照姓名查找結束*/ /*按照學號查找開始*/if(sway=2)printf("請輸入需要修改學生的學號 ");/printf("i=%d",i);scanf("%s",number);for(j=0;t!=0;j+) t=strcmp(stuj.number,number);if(j=i) t=0;printf("未找到您所查詢的數(shù)據(jù),請重新輸入n"); if(j&l
22、t;i) /查詢成功printf("您查找的學生信息如下n 姓名 %s 學號 %s 性別 %c 生日 %d年%d月%d日 當前考勤次數(shù) %dn",,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq);printf("是否繼續(xù)查詢其他學生信息 0 否 1 是");scanf("%d",&x);if(x=1) search();/*按照學號查找結束*/printf("0 返回主菜單n");getch
23、ar();a=getchar();getchar();if(a='0') main(); 流程圖:開始 打開文件將文件內容全部讀入結構體數(shù)組輸入sway值選擇查找方式Sway=1?NSway=2?Y輸入要查找的學號輸入要查找的姓名查找學號查找姓名輸出該生信息5. evaluate()函數(shù) void evaluate() int i=0,j=0,sway,t,x; float score; char name10,number10;printf(" *學 生 考 勤 分 數(shù) 計 算*n");if(kqcs=0)printf("請輸入應到考勤總數(shù) &q
24、uot;); /請輸入應到考勤總數(shù)scanf("%f",&kqcs); if(fp=fopen("date.txt","r")=NULL) /將文件內容讀入內存printf("文件打開失敗n"); exit(0);for(i=0;feof(fp)=0;i+) fread(&stui,sizeof(struct student),1,fp); /讀取文件內容fclose(fp); /關閉文件printf("選擇查找方式 1 按照姓名查找 2 按照學號查找");scanf("
25、;%d",&sway); /*按照姓名查找開始*/if(sway=1)printf("請輸入需要修改學生的姓名 ");/printf("i=%d",i);scanf("%s",name);for(j=0;t!=0;j+) t=strcmp(,name);if(j=i) t=0;printf("未找到您所查詢的數(shù)據(jù),請重新輸入n"); if(j<i) /查詢成功printf("您查找的學生信息如下n 姓名 %s 學號 %s 性別 %c 生日 %d年%d月%d日 當前
26、考勤次數(shù) %dn",,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq); score=(stuj-1.kq)/kqcs*100; printf("該生當前考勤分數(shù)為 %5.2f",score);printf("是否繼續(xù)計算其他學生考勤分數(shù) 0 否 1 是");scanf("%d",&x);if(x=1) evaluate();/*按照姓名查找結束*/ /*按照學號查找開始*/if(sway=2)prin
27、tf("請輸入需要修改學生的學號 ");/printf("i=%d",i);scanf("%s",number);for(j=0;t!=0;j+) t=strcmp(stuj.number,number);if(j=i) t=0;printf("未找到您所查詢的數(shù)據(jù),請重新輸入n"); if(j<i) /查詢成功printf("您查找的學生信息如下n 姓名 %s 學號 %s 性別 %c 生日 %d年%d月%d日 當前考勤次數(shù) %dn",,stuj-1.number,s
28、tuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq);score=(stuj-1.kq)/kqcs*100; printf("該生當前考勤分數(shù)為 %5.2f",score);printf("是否繼續(xù)計算其他學生考勤分數(shù) 0 否 1 是");scanf("%d",&x);if(x=1) evaluate();/*按照學號查找結束*/printf("0 返回主菜單n");getchar();a=getchar();getchar();if(a='
29、;0') main();流程圖:開始輸入應到考勤次數(shù)kqcs值打開文件將文件內容全部讀入結構體數(shù)組輸入sway值選擇查找方式Sway=1?YNSway=2?輸入要查找的學號輸入要查找的姓名查找學號查找姓名輸出該生信息計算考勤分數(shù)輸出考勤分數(shù)結束三、測試及調試(測試方案、存在的問題及解決方法)測試方案:按照每個函數(shù)功能進行測試,在做完每個函數(shù)對其進行測試,主函數(shù)測試,先將所有需要的功能模塊函數(shù)設置為空,每個函數(shù)用一個printf語句來測試主函數(shù)。1. 存在問題:開始將生日定義為字符數(shù)組,當用scanf來輸入年月日時,年月日之間用空格分隔,但在輸出時發(fā)現(xiàn)年月日出現(xiàn)錯誤。分析原因:用scan
30、f輸入年月日時,系統(tǒng)會把用來分隔的空格當做字符讀入。解決方法:將年月日定義為整型,這樣就可以用scanf輸入,用空格隔開。2. 存在問題2:在查找數(shù)據(jù)時,需要先將所有數(shù)據(jù)讀入一個結構體數(shù)組,在讀取后未關閉文件,執(zhí)行查找時查找不到相關信息。分析原因:再利用for循環(huán)讀取全部文件內容后,文件指針將會移至文件末尾,這樣再執(zhí)行查找時就會從文件末尾開始,顯然不符合要求,所以會出現(xiàn)錯誤。解決方法:在讀取完數(shù)據(jù)后先關閉文件,在查找時再次打開文件,這時文件指針就會指向文件開頭。3. 存在問題3:再多個使用getchar或者gets輸入的時候,會出現(xiàn)直接跳過輸入的情況。分析原因:在使用getchar或者gets
31、輸入的時候,系統(tǒng)會將前一步用來確認執(zhí)行的回車當成字符讀入,導致跳過該步輸入。解決方法:再getchar或者gets前面加上getchar()語句,讀掉回車,下面的getchar或者gets就可以正常輸入。四、小結通過編寫該程序,熟悉了C語言的基本語法,選擇,循環(huán)等結構,深入練習了函數(shù)的調用方法,和文件的讀寫方法,熟悉了結構體的使用,更加深化了面向過程語言思想,和一些基本算法。通過對程序的后期調試,熟悉了C常見錯誤,鍛煉了思維的嚴密性,和完備性。通過對程序的注釋和畫流程圖,形成了一套自己編程的風格,和清晰地思路,使思維更加條理化,清晰化。附件:主要源程序代碼(需打?。?include<st
32、dio.h>#include<string.h>#include<stdlib.h>FILE *fp; /定義文件char a; /返回選擇變量float kqcs=0; /應到考勤次數(shù)變量struct student char name10;char number11;char sex;int year;int month;int day;int kq;stu100; /定義儲存學生信息的結構體數(shù)組/*主 函 數(shù) 開 始*void main()void input(); /錄入數(shù)據(jù)函數(shù)void change(); /修改數(shù)據(jù)函數(shù)void search(); /查
33、詢數(shù)據(jù)函數(shù)void evaluate(); /計算總評函數(shù)char item;system("color 34");printf(" n");printf(" n");printf(" 學 生 考 勤 管 理 系 統(tǒng) n");printf(" n");printf(" BY 朱勝佳 n");printf(" n");printf(" n");printf(" n");printf(" 1.學生信息及考勤情況
34、錄入 n");printf(" n");printf(" 2.學生信息及考勤情況修改 n");printf(" n");printf(" 3.學生信息及考勤情況查詢 n");printf(" n");printf(" 4.學生考勤總評分數(shù)查詢 n");printf(" n");printf(" n"); /用戶界面printf("n");printf(" 請選擇您需要的操作n");sca
35、nf("%c",&item);switch(item)case '1': input();break;case '2': change();break;case '3': search();break;case '4': evaluate();break; /實現(xiàn)功能選擇/*主 函 數(shù) 結 束*/*錄入數(shù)據(jù)函數(shù)內容開始*void record()int i,j=0,jx=1;printf(" *學 生 基 本 信 息 錄 入*n");if(fp=fopen("date.tx
36、t","w")=NULL)printf("文件打開失敗n");exit(0);for(i=0;jx=1;i+) /輸入信息循環(huán) for(;j=0;) /輸入確認循環(huán)getchar();printf("請輸入第%d個學生的姓名 ",i+1);gets();printf("請輸入第%d個學生的學號 ",i+1);gets(stui.number);printf("請輸入第%d個學生的性別(男:m 女:f) ",i+1);stui.sex=getchar();printf(
37、"請輸入第%d個學生的生日(格式:年 月 日) ",i+1);scanf("%d%d%d",&stui.year,&stui.month,&stui.day);printf("請輸入第%d個學生的當前考勤次數(shù) ",i+1);scanf("%d",&stui.kq);printf("您輸入的信息為 姓名 %s 學號 %s 性別 %c 生日 %d年%d月%d日n 0 重輸 1 確認",,stui.number,stui.sex,stui.year,s
38、tui.month,stui.day);scanf("%d",&j); /輸入確認j=0;if(fwrite(&stui,sizeof(struct student),1,fp)!=1) printf("文件寫入錯誤n"); /寫入文件printf(" 是否繼續(xù)輸入下一個學生信息 0 終止 1 繼續(xù)n");scanf("%d",&jx); /繼續(xù)輸入選擇fclose(fp);printf("0 返回主菜單n");getchar();a=getchar();getchar(
39、);if(a='0') main(); /返回主菜單/*錄入數(shù)據(jù)函數(shù)內容結束*/*修改數(shù)據(jù)函數(shù)內容開始*void change() int i=0,j=0,sway,t,x;char name10,number10;printf(" *學 生 考 勤 修 改*n");if(fp=fopen("date.txt","r")=NULL) /將文件內容讀入內存printf("文件打開失敗n");exit(0);for(i=0;feof(fp)=0;i+) fread(&stui,sizeof(st
40、ruct student),1,fp); /讀取文件內容fclose(fp); /關閉文件printf("選擇查找方式 1 按照姓名查找 2 按照學號查找");scanf("%d",&sway);/*按照姓名查找開始*/if(sway=1)printf("請輸入需要修改學生的姓名 ");/printf("i=%d",i);scanf("%s",name);for(j=0;t!=0;j+)t=strcmp(,name);if(j=i)t=0;printf("未找
41、到您所查詢的數(shù)據(jù),請重新輸入n");if(j<i) /查詢成功printf("您查找的學生信息如下n 姓名 %s 學號 %s 性別 %c 生日 %d年%d月%d日 當前考勤次數(shù) %dn",,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq);printf("是否修改該生考勤信息 0 否 1 是"); /選擇是否修改考勤scanf("%d",&x); /輸入選擇變量值if(x=1)printf(&qu
42、ot;請輸入新的考勤值 ");scanf("%d",&stuj-1.kq); /輸入新的考勤值if(fp=fopen("date.txt","w")=NULL) /以只寫方式打開文件printf("文件打開失敗n");exit(0);for(j=0;j<i;j+) if(fwrite(&stuj,sizeof(struct student),1,fp)!=1) printf("文件寫入錯誤n"); /寫入文件fclose(fp); /關閉文件printf(&quo
43、t;是否繼續(xù)修改其他學生考勤 0 否 1 是");scanf("%d",&x);if(x=1) change();/*按照姓名查找結束*/*按照學號查找開始*/if(sway=2)printf("請輸入需要修改學生的學號 ");/printf("i=%d",i);scanf("%s",number);for(j=0;t!=0;j+)t=strcmp(stuj.number,number);if(j=i)t=0;printf("未找到您所查詢的數(shù)據(jù),請重新輸入n");if(j<i) /查詢成功printf("您查找的學生信息如下n 姓名 %s 學號 %s 性別 %c 生日 %d年%d月%d日 當前考勤次數(shù) %dn",,stuj-1.number,stuj-1.sex,stuj-1.year,stuj-1.month,stuj-1.day,stuj-1.kq);printf("是否修改該生考勤信息 0 否 1 是"); /選擇是否修改考勤scanf("%d&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 用智慧譜寫幼兒園發(fā)展新篇章計劃
- 重大建設項目的安全檢查計劃
- 2025年貓爬架項目發(fā)展計劃
- 2025年板臥式電除塵器項目合作計劃書
- 2025年密封用填料及類似品項目建議書
- 實施均衡發(fā)展的人口政策
- 醫(yī)療健康管理服務協(xié)議
- 藝術品交易與展示項目投資合同
- 擔保期權合同
- 西游記中的人物形象賞析與解讀
- 人教版(2024新版)七年級上冊英語各單元重點語法知識點講義
- 安全閥校驗標準
- 耳穴壓豆課件
- 建筑制圖與識圖教學課件:第八章 結構施工圖
- 湘教版三年級美術下冊教案全冊
- (高清版)DB15∕T 3585-2024 高標準農田施工質量評定規(guī)程
- 試油(氣)HSE作業(yè)指導書
- 重癥監(jiān)護-ICU的設置、管理與常用監(jiān)測技術
- 法律顧問服務投標方案(完整技術標)
- 中醫(yī)藥三方合作協(xié)議書范本
- 2024年《動漫藝術概論》自考復習題庫(附答案)
評論
0/150
提交評論