




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
學生成績管理系統PAGEPAGE3**大學物聯網工程學院課程設計報告課程名稱:計算機綜合實踐設計題目:學生成績管理系統班級:自動化1001班姓名:學號:指導教師:評分:2011年11月15日目錄一、設計目的和任務 3二、總體設計 3三、詳細設計 5四、調試與測試 5五、源程序清單和執行結果 6六、體會與心得 17七、參考文獻 17設計目的和任務設計目的:(1)基本掌握面向過程程序設計的基本思路和方法;(2)達到熟練掌握C語言的基本知識和技能;(3)能夠利用所學的基本知識和技能,解決簡單的程序設計問題。程序功能:(1)計算各個學生的總分及平均分,并按平均分排出名次。(2)統計全班學生平均分成績,輸出60分以下、60~79、80~89、90分以上各分數人數。(3)能按學號、姓名查詢學生成績,并能輸出學生的成績單。(4)輸出不及格科目及學生名單。(5)在屏幕打印優等生名單(學號,三門課程成績,平均成績,名次),優等生必須滿足下列條件:1.平均成績大于90分;或平均分大于85分且至少有一門功課為100分;或者平均分大于85分且至少兩門課程成績為95分以上;2.名次在前三名;3.每門功課及格以上。二、總體設計(1)程序設計組成框圖:組成組成框圖初始化結構體數組建立文本文件求總分和平均分按平均分排名統計各個分數段人數查找學生信息查找不及格科目及學生查找優等生退出系統(2)程序設計流程圖:開始開始初始化學生信息初始化學生信息求總分和平均分并排名求總分和平均分并排名選擇功能選擇功能5432154321輸出優等生信息輸出不及格科目及學生信息輸出統計信息輸出查找到的學生信息輸出排名輸出優等生信息輸出不及格科目及學生信息輸出統計信息輸出查找到的學生信息輸出排名后的學生信息寫入文件寫入文件結束結束詳細設計1)初始化結構體數組:初始化學生的學號、姓名,數學、英語、計算機三科的成績,暫定學生的排名、總分、平均分為0。2)建立文本文件:可用函數voidwenjian1()和voidwenjian2()來實現,將系統查詢的結果全部寫入文本文件中。3)求總分和平均分:可用函數voidmodify(structStudentstu[N])來實現,將計算的結果賦給結構體數組中的學生的總分和平均分。4)按平均分排名:先調用函數voidmodify(structStudentstu[N]),再用函數voidrank(structStudentstu[N])來實現,將計算的結果賦給結構體數組中的學生的排名。調用函數voidprint(structStudentstu[N])按表格形式輸出學生所有信息,調用函數voidwenjian1()將其寫入文本文件。5)統計各個分數段的人數:在第(4)步基礎上用函數voidgrade(structStudentstu[N])來實現,將統計的結果輸出并調用函數voidwenjian2()寫入文本文件中。6)查找學生的信息:在第(4)步基礎上用函數voidsearch(structStudentstu[N])來實現,用switch語句讀入用戶的選擇,若讀入1,則按學號查找;若讀入2,則按姓名查找。調用函數voidwenjian2()將查找結果寫入文本文件。7)查找不及格科目及學生:在第(4)步基礎上用函數voidinsert(structStudentstu[N])來實現,依次輸出數學、英語、計算機不及格的學生姓名和該科不及格成績并調用函數voidwenjian2()寫入文本文件中。8)查找優等生:在第(4)步基礎上用函數voidexcellent(structStudentstu[N])來實現,找出同時滿足優等生三個條件的學生即為優等生,輸出他們的所有信息并調用函數voidwenjian2()寫入文本文件。9)系統的歡迎界面:可用函數voidsystem(structStudentstu[N])來實現。10)菜單選擇:可用函數voidmenu(structStudentstu[N])來實現,一共有5個功能,用switch語句讀入用戶的選擇。調試與測試文件模塊問題:這個系統總共有5個功能,也就是有5個結果,可是運行完了之后發現后一次的結果會覆蓋前一次的結果,打開文本文件查看的時候發現里面的內容混亂。解決辦法:設置兩個子函數,一個是讀入第一個結果的子函數voidwenjian1(),文件類型設置為“wb”型,另一個是讀入后四個結果的子函數voidwenjian2(),文件類型設置為“ab+”型,實現為剛剛建立的文本文件續寫的功能。這樣在下面的程序中只需要調用自己需要的子函數就可以將結果正確無誤的保存到文本文件中。排名模塊問題:可用voidrank(structStudentstu[N])來實現??墒窃谠O計“若平均分相同則并列名次”這個算法的時候遇到了困難,試驗了好幾次都不成功。解決辦法:1、最開始只是簡單的以為用選擇法對結構體里每名學生的平均分stu[i].aver從大到小排好序,然后再從一到十的賦給排名stu[i].rank就行,后來發現這解決不了名次并列的問題。于是想到了用for循環將結構體里學生的成績stu[i].aver與已排好名的數組average[m]從大到小一個一個比較,若遇到幾個學生的分數與average[k]相同,則給stu[i].rank賦相同的值。2、可是再次調試的時候問題又來了,因為當初排名的時候數組里average[m]也有相同的值,結果導致給stu[i].rank賦值出現了重復,后一次的排名會覆蓋上一次的排名。于是,我又想了一個辦法,那就是在用選擇法對average[m]進行排名的時候,若遇到幾個值相同的元素,則只保留一個元素,這樣在給stu[i].rank賦值的時候就不會出現重復了。于是這個問題順利解決。源程序清單和執行結果(1)源程序清單如下:/*******************頭文件*******************/#include<stdio.h>#include<string.h>/*******************宏定義********************/#defineN10/****************全局指針變量*******************/FILE*fp;/***************定義結構體數組****************/structStudent{ intranking; intnum; charname[20]; floatscore[3]; floataver; floattotal;};/**************初始化結構體數組****************/structStudentstu[N]={{0,1001,"YangShengqian",{99,80,85},0,0},{0,1002,"XiangJing",{80,90,78},0,0},{0,1003,"WangMinghui",{60,70,59},0,0},{0,1004,"DongQiang",{91,90,90},0,0},{0,1005,"ZhengKai",{85,76,90},0,0},{0,1006,"HeYunling",{90,91,90},0,0},{0,1007,"WangYao",{69,47,67},0,0},{0,1008,"GouHuan",{45,76,56},0,0},{0,1009,"MaYuling",{89,78,67},0,0},{0,1010,"RanDongdu",{100,100,98},0,0}};/*************子函數功能:建立文本文件*********/voidwenjian1(){ if((fp=fopen("xscjglxt.txt","wb"))==NULL)/*****用“wb”建立一個二進制文件******/ { printf("cannotopenfile\n"); return; }}/*************子函數功能:續寫文本文件**********/voidwenjian2(){ if((fp=fopen("xscjglxt.txt","ab+"))==NULL)/*****用“ab+”為剛剛建立的文件實現續寫*******/ { printf("cannotopenfile\n"); return; }}/************子函數功能:求總分和平均分**********/voidmodify(structStudentstu[N]){ inti; for(i=0;i<N;i++) { stu[i].total=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];/*******求總分********/ stu[i].aver=stu[i].total/3.0;/******求平均分*******/ }}/************子函數功能:根據平均分排名***********/voidrank(structStudentstu[N]){ inti,j,k,m,n; floataverage[N],t; modify(stu);/******調用子函數modify()******/ for(i=0;i<N;i++) average[i]=stu[i].aver; for(i=0;i<N-1;i++)/*****用選擇法對平均分排名*****/ { k=i; for(j=i+1;j<N;j++) { if(average[j]==average[k]) average[k]=0; if(average[j]>average[k]) k=j; } t=average[k]; average[k]=average[i]; average[i]=t; } for(m=0,n=1;m<N;m++,n++)/*****把排好的名次賦給結構體里的元素*****/ for(i=0;i<N;i++) if(stu[i].aver==average[m]) stu[i].ranking=n;}/*********子函數功能:統計各個分數段人數*************/voidgrade(structStudentstu[N]){ intA,B,C,D,E,i; wenjian2();/*****打開文件*****/ A=B=C=D=E=0; for(i=0;i<N;i++) { if(stu[i].aver<60)/*****平均分低于60的人數******/ E++; if(stu[i].aver>=60&&stu[i].aver<=69)/***平均分在60——69之間的人數***/ D++; if(stu[i].aver>=70&&stu[i].aver<=79)/***平均分在70——79之間的人數***/ C++; if(stu[i].aver>=80&&stu[i].aver<=89)/***平均分在80——89之間的人數***/ B++; if(stu[i].aver>=90)/****平均分大于89的人數***/ A++; } printf(">90\t80-89\t70-79\t60-69\t<60\n");/****輸出各分數段人數****/ fprintf(fp,"\r\n>90\t80-89\t70-79\t60-69\t<60\r\n");/***在文件中輸出各分數段人數***/ printf("%d\t%d\t%d\t%d\t%d\n",E,D,C,B,A); fprintf(fp,"%d\t%d\t%d\t%d\t%d\r\n",E,D,C,B,A); fclose(fp);/*********關閉文件*********/ }/*******子函數功能:用姓名或者學號查找學生信息*********/voidsearch(structStudentstu[N]){ intnum1,i,n; charname1[20]; wenjian2();/******************打開文件*********************/ /********說明若是按學號查找,則輸入1;若是按姓名查找,則輸入2***********/ printf("ifyouwanttosearchbynumber,pleaseinput1.\nifyouwanttosearchbyname,pleaseinput2.\n\n"); printf("pleaseinputyourchoice:");/*****提示用戶輸入自己的選擇***/ scanf("%d",&n);/***********讀入用戶的選擇*************/ printf("\n"); switch(n) { /********************用學號查找**********************/ case1:printf("pleaseinputthenumber:"); scanf("%d",&num1); printf("\n"); for(i=0;i<N;i++)/*******一個一個比較學號是否相符******/ { if(stu[i].num==num1) { printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n"); fprintf(fp,"\r\nRank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n"); printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); fprintf(fp,"%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\r\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); } } if(num1<1001||num1>1010)/********************如果用戶輸入不正確則提示出錯********************/ printf("ERROR!\n"); break; /*******************用姓名查找********************/ case2:printf("pleaseinputthename:"); gets(name1); gets(name1); printf("\n"); for(i=0;i<N;i++)/********一個一個比較名字是否相符********/ { if(strcmp(stu[i].name,name1)==0) { printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n"); fprintf(fp,"\r\nRank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n"); printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); fprintf(fp,"%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\r\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver);}if(strcmp(stu[i].name,name1)==0)break; } if(i==N&&strcmp(stu[i].name,name1)!=0)/*********如果用戶輸入不正確則提示出錯********/ printf("ERROR!"); break; default:printf("ERROR!\n");/****如果用戶輸入選擇鍵錯誤則提示出錯***/ } fclose(fp);/*****************關閉文件*******************/ }/*****子函數功能:輸出不及格科目和學生及其不及格分數*****/voidinsert(structStudentstu[N]){ inti,j=0; wenjian2();/*******************打開文件***********************/ printf("Math:"); fprintf(fp,"\r\nMath:");/******查找數學不及格的學生********/ for(i=0;i<N;i++) if(stu[i].score[0]<60) { printf("\t\t%s\t%5.2f\t",stu[i].name,stu[i].score[0]); fprintf(fp,"\t\t%s\t%5.2f\t",stu[i].name,stu[i].score[0]); } printf("\nEnglish:");/******查找英語不及格的學生*******/ fprintf(fp,"\r\nEnglish:"); for(i=0;i<N;i++) if(stu[i].score[1]<60) { printf("\t%s\t%5.2f\t",stu[i].name,stu[i].score[1]); fprintf(fp,"\t%s\t%5.2f\r",stu[i].name,stu[i].score[1]); } printf("\nComputer:");/*****查找計算機不及格的學生******/ fprintf(fp,"\r\nComputer:"); for(i=0;i<N;i++) if(stu[i].score[2]<60) { printf("\t%s\t%5.2f\n\t",stu[i].name,stu[i].score[2]); fprintf(fp,"\t%s\t%5.2f\t",stu[i].name,stu[i].score[2]); } printf("\n"); fclose(fp);/**************關閉文件***************/}/************************輸出優等生的信息**************************/voidexcellent(structStudentstu[N]){ inti,j,k,t,m,a,b,c; j=k=t=m=a=b=c=0; wenjian2();/*****************打開文件********************/ modify(stu); rank(stu); printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n"); fprintf(fp,"\r\n"); fprintf(fp,"\r\nRank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n"); for(i=0;i<N;i++) { if(stu[i].aver>90) j=1; if(stu[i].aver>85&&(stu[i].score[0]==100||stu[i].score[1]==100||stu[i].score[2]==100)) k=1; if((stu[i].score[0]>95&&stu[i].score[1]>95)||(stu[i].score[0]>95&&stu[i].score[2]>95)||(stu[i].score[1]>95&&stu[i].score[2]>95)) t=1; if(stu[i].aver>85&&t) m=1; if(j||k||m)/****優等生平均成績大于90分;或平均分大于85分且至少有一門功課為100分;或平均分大于85分且至少兩門課程成績為95分以上****/ a=1; if(stu[i].ranking<=3) b=1; if(stu[i].score[0]>60&&stu[i].score[1]>60&&stu[i].score[2]>60) c=1; if(a&&b&&c)/****************必須同時滿足三個條件*****************/ { printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); fprintf(fp,"%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\r\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); } j=k=t=m=a=b=c=0;}fclose(fp);/*******************關閉文件*********************/} /******子函數功能:按表格形式輸出學生信息*******/voidprint(structStudentstu[N]){ inti; wenjian1();/**********************打開文件**********************/ printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n");/**************按表格形式輸出學生信息************/ fprintf(fp,"Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n");/**************把學生信息寫入文件***************/ for(i=0;i<N;i++) { printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); fprintf(fp,"%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\r\n", stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver); } fclose(fp);/*******************關閉文件*******************/}/******子函數功能:系統的歡迎界面********/ voidsystem(structStudentstu[N]){ printf("\t\t\t\t學生成績管理系統\t\t\t\n\n"); printf("\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\n"); printf("\4\4\4\4\4\4\4\4\t1.計算全班學生總分及平均分,并排出名次。\t\t\4\4\4\4\4\4\4\4\n"); printf("\4\4\4\4\4\4\4\4\t2.統計全班成績并按平均分輸出各分數段人數。\t\t\4\4\4\4\4\4\4\4\n"); printf("\4\4\4\4\4\4\4\4\t3.按學號或者姓名查找學生,并輸出該生成績單。\t\t\4\4\4\4\4\4\4\4\n"); printf("\4\4\4\4\4\4\4\4\t4.查找不及格科目及學生名單并輸出。\t\t\t\4\4\4\4\4\4\4\4\n"); printf("\4\4\4\4\4\4\4\4\t5.查找優等生并輸出他們的成績單。\t\t\t\4\4\4\4\4\4\4\4\n\n"); printf("\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\n");}/**************子函數功能:實現菜單選擇*********/voidmenu(structStudentstu[N]){ intn,i; for(i=0;i<5;i++) { printf("\n"); printf("pleasechosethefunctionnumber:");
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國幕墻建筑行業市場調查研究及發展戰略規劃報告
- 2025年 煙草陜西公司招聘考試筆試試題附答案
- 2025年 廣東省注冊安全工程師-安全生產技術基礎考試練習題附答案
- “傳統文化線上商業傳奇”商業計劃
- 2025年 丹東市技師學院普通高校招聘教師考試試題附答案
- 2025年 保山市隆陽區永昌街道社區衛生服務中心招聘考試筆試試題附答案
- 1,2-環氧丁烷行業深度研究分析報告(2024-2030版)
- 2025年中國光纖行業市場調研分析及投資前景預測報告
- 醫療社會保障服務項目安全風險評價報告
- 防洪排澇可行性研究報告
- 2025年 內蒙古能源集團所屬單位招聘考試筆試試題(含答案)
- 期末試卷(試題)(含答案)-2024-2025學年一年級下冊數學北師大版
- 2025年江西省高考物理真題
- 2024年地理中考模擬考試地理(貴州貴陽卷)(A4考試版)
- 夜市經營安全應急預案
- 上海浦東新區公辦學校儲備教師教輔招聘筆試真題2022
- 成都市2022級(2025屆)高中畢業班摸底測試(零診)英語試卷(含答案)
- 國開(甘肅)2024年春《地域文化(專)》形考任務1-4終考答案
- 安全生產月“一把手”講安全課件
- 國家開放大學《高等數學基礎》形考任務1-4參考答案
- 山東省電力設備交接和預防性試驗規程 - 圖文-
評論
0/150
提交評論