学生综合测评系统
中國海洋大學高級程序語言程課設
題目要求:
2、學生綜合測評系統
每個學生的信息為:學號、姓名、性別、聯系電話、C語言、高等數學、外語三門單科成績、考試平均成績、考試名次、同學互評分、品德成績、任課教師評分、綜合測評總分、綜合測評名次。考試平均成績、同學互評分、品德成績、任課教師評分分別占綜合測評總分的60%,10%,10%,20%。
A、學生信息處理
(1)?輸入學生信息、學號、姓名、性別、聯系電話,按學號以小到大的順序存入文件中。
提示:學生信息可先輸入到數組中,排序后可寫到文件中。
(2) 插入(修改)同學信息:
提示:先輸入將插入的同學信息,然后再打開源文件并建立新文件,把源文件和輸入的信息合并到新文件中(保持按學號有序)若存在該同學則將新記錄內容替換源內容,
(3) 刪除同學信息:
提示:輸入將刪除同學號,讀出該同學信息,要求對此進行確認,以決定是否刪除將刪除后的信息寫到文件中。
(4) 瀏覽學生信息:
提示:打開文件,顯示該文件的學生信息。
B、學生數據處理:
(1)?按考試科目錄入學生成績并且按公式:考試成績=(C語言+高等數學+外語)/3 計算考試成績,并計算考試名次,提示:先把學生信息讀入數組,然后按提示輸入每科成績,計算考試成績,求出名次,最后把學生記錄寫入一個文件中。
(2) 學生測評數據輸入并計算綜合測評總分及名次。
提示:綜合測評總分=(考試成績)*0.6+(同學互評分)*0.1+品德成績*0.1+任課老師評分*0.2。
(3) 學生數據管理
提示:輸入學號,讀出并顯示該同學信息,輸入新數據,將改后信息寫入文件
(4) 學生數據查詢:
提示:輸入學號或其他信息,即讀出所有數據信息,并顯示出來。
C、學生綜合信息輸出
提示:輸出學生信息到屏幕。
背景:小白獨自從下午3點奮戰到晚上11點的結果,可能很多地方寫的不咋的,O(∩_∩)O哈哈~,記錄一下把
代碼:
#include<stdio.h> #include<stdlib.h> void mainMenu();//主菜單 void studentInformationInput();//學生信息輸入 void Input();//學生信息輸入 void rankOfExam();//考試成績名次排序 void rankOfFinal();//綜合測評名次排序 void input0returnMainMenu();//鍵0回主菜單 void studentInformationSearch();//學生信息查找 void studentInformationDelete();//學生信息刪除 void studentInformationAdd();//學生信息增加 void studentInformationPrint();//學生信息輸出 void fileOperation();//文件操作 void fileInput();//數據保存到文件 void filePrint();//文件中的數據輸出 typedef struct student_data//學生的信息 {long long number;//學號直接以一個ll類型數據存儲char name[10];//姓名就要以char類型的數組來存儲char sex[10];char phoneNumber[20];//電話號碼也以一個ll類型數據來存(畢竟學號和電話號碼都以11位存儲,位數足夠)float gradeOfC;//C分float gradeOfMath;//數學分float gradeOfEnglish;//英語分float average;//平均分int rankOfExam;//按平均分計的名次float gradeOfClassmate;//同學互評分float gradeOfMorality;//品德分float gradeOfTeacher;//教師分float gradeOfFinal;//綜合分int rankOfFinal;//按綜合分計的名次struct student_data *next;//指向下一個學生節點的指針 }SD; SD *head=NULL;//建立頭指針 void input0returnMainMenu() {int choose;scanf("%d",&choose);while(choose!=0){printf("您的輸入有誤,請重新輸入:");scanf("%d",&choose);}if(choose==0)mainMenu(); } void rankOfExam() {SD *p=head;float temp[100];int count=1;while(p!=NULL){temp[count]=p->average;count++;p=p->next;}count--;for(int i =count-1;i>=1;i--)//從大到小進行冒泡排序for(int j =1;j<=i;j++)if(temp[j]<temp[j+1]){float tempP=temp[j];temp[j]=temp[j+1];temp[j+1]=tempP;}SD *p1=head;while(p1!=NULL)//for循環嵌套在內側,這樣是對每個節點都進行一次數組的遍歷,如果分數相等,那么名次記錄下來,立刻結束for循環{for(int i =1;i<=count;i++)if(p1->average==temp[i]){p1->rankOfExam=i;break;}p1=p1->next;} } void rankOfFinal() {SD *p=head;float temp[100];int count=1;while(p!=NULL){temp[count]=p->gradeOfFinal;count++;p=p->next;}count--;for(int i =count-1;i>=1;i--)//從大到小進行冒泡排序for(int j =1;j<=i;j++)if(temp[j]<temp[j+1]){float tempP=temp[j];temp[j]=temp[j+1];temp[j+1]=tempP;}SD *p1=head;while(p1!=NULL)//for循環嵌套在內側,這樣是對每個節點都進行一次數組的遍歷,如果分數相等,那么名次記錄下來,立刻結束for循環{for(int i =1;i<=count;i++)if(p1->gradeOfFinal==temp[i]){p1->rankOfFinal=i;break;}p1=p1->next;} } void mainMenu()//主頁面函數 {system("cls");system("color 7A");//打印白底綠字system("date/t");//打印系統日期(注意date/t一體)system("time/t");//打印系統時間(具體)printf("\n\n\n\n\n");printf("\t\t\t-------------歡迎來到學生綜合測評系統---------------\n""\t\t\t-------------1-學生信息輸入-----------------------\n""\t\t\t-------------2-學生信息刪除-----------------------\n""\t\t\t-------------3-學生信息增加-----------------------\n""\t\t\t-------------4-學生信息查找-----------------------\n""\t\t\t-------------5-學生信息輸出-----------------------\n""\t\t\t-------------6-操作文件--------------------------\n""\t\t\t-------------0-退出系統--------------------------\n\n""\t\t\t-------------請輸入數字編號進行選擇------------------\n");int choose;scanf("%d",&choose);while(choose!=0&&choose!=1&&choose!=2&&choose!=3&&choose!=4&&choose!=5&&choose!=6){printf("您的輸入有誤,請重新輸入:\n");scanf("%d",&choose);}switch(choose){case 1:studentInformationInput();break;case 2:studentInformationDelete();break;case 3:studentInformationAdd();break;case 4:studentInformationSearch();break;case 5:studentInformationPrint();break;case 6:fileOperation();break;case 0:printf("已經退出系統,感謝您的使用!\n");exit(0);} } void studentInformationInput()//學生信息輸入函數 {system("cls");system("color 7A");//打印白底綠字system("date/t");//打印系統日期(注意date/t一體)system("time/t");//打印系統時間(具體)printf("\n\n\n\n\n");printf("\t\t\t-------------歡迎進行學生信息輸入----------------------\n""\t\t\t-------------1-學生信息輸入-----------------------\n""\t\t\t-------------0-返回主菜單----------------------------\n\n""\t\t\t-------------請輸入數字編號進行選擇------------------\n""\t\t\t-------------------------------\n");int choose;scanf("%d",&choose);while(choose!=0&&choose!=1){printf("您的輸入有誤,請重新輸入:\n");scanf("%d",&choose);}switch(choose){case 1:Input();break;case 0:mainMenu();}} void Input() {system("cls");system("color 7A");//打印白底綠字system("date/t");//打印系統日期(注意date/t一體)system("time/t");//打印系統時間(具體)if(head!=NULL){printf("您之前已經在此輸入過學生信息了,如果要修改學生信息,請到其他模塊,請輸入0以返回主菜單\n");input0returnMainMenu();}SD *s0=(SD*)malloc(sizeof(SD));head=s0;printf("請輸入學生的學號,如果您的結束輸入,請在學號處輸入0\n""學號的大小請務必按照從小到大的順序排列,否則您可能要在主菜單的學生信息增加中執行您未輸入的學生信息\n");scanf("%lld",&s0->number);printf("\n");while(s0->number!=0){printf("請輸入學生的姓名:");scanf("%s",s0->name);;printf("請輸入學生的性別:");scanf("%s",s0->sex);printf("請輸入學生的電話號碼:");scanf("%s",s0->phoneNumber);printf("請輸入學生的C語言的分數");scanf("%f",&s0->gradeOfC);printf("請輸入學生的高數成績:");scanf("%f",&s0->gradeOfMath);printf("請輸入學生的英語成績:");scanf("%f",&s0->gradeOfEnglish);s0->average=(s0->gradeOfC+s0->gradeOfMath+s0->gradeOfEnglish)/3.0;//計算平均分printf("請輸入學生的同學互評分:");scanf("%f",&s0->gradeOfClassmate);printf("請輸入學生的道德分數:");scanf("%f",&s0->gradeOfMorality);printf("請輸入同學的教師評分:");scanf("%f",&s0->gradeOfTeacher);s0->gradeOfFinal=s0->average*0.6+s0->gradeOfClassmate*0.1+s0->gradeOfMorality*0.1+s0->gradeOfTeacher*0.2;//計算綜測分printf("此名同學的信息已經輸入完畢");SD *s1;s1=s0;s0=(SD*)malloc(sizeof(SD));s1->next=s0;printf("請輸入學生學生的學號:");scanf("%lld",&s0->number);while(s0->number<=s1->number&&s0->number!=0){printf("您輸入了一個和上一個學號相等或者比上一個學號更小的學號,這不符合規定,請重新輸入:");scanf("%lld",&s0->number);}if(s0->number==0)s1->next=NULL;}rankOfExam();rankOfFinal();printf("因為您在學號處輸入0,故系統認為您輸入結束,請鍵入0返回主菜單");input0returnMainMenu(); } void studentInformationSearch()//學生信息查找函數 {system("cls");system("color 7A");//打印白底綠字system("date/t");//打印系統日期(注意date/t一體)system("time/t");//打印系統時間(具體)rankOfExam();//在查找信息之前應該更新兩個排名信息rankOfFinal();//int num;printf("請輸入您想查找的學號:");scanf("%lld",&num);SD *p=head;while(p!=NULL){if(p->number==num)break;p=p->next;}if(p==NULL){printf("查無此人,請按0返回主菜單");input0returnMainMenu();}printf("學號 姓名 性別 聯系電話 C語言成績 高數成績 英語成績 平均成績 考試成績名次 同學互評分 品德成績 任課老師評分 綜測成績 綜測成績名次\n");printf("%-11lld%-7s%-5s%-12s",p->number,p->name,p->sex,p->phoneNumber);printf("%-11.2f%-9.2f%-9.2f%-9.2f%-13d",p->gradeOfC,p->gradeOfMath,p->gradeOfEnglish,p->average,p->rankOfExam);printf("%-11.2f%-9.2f%-13.2f%-9.2f%-12d\n",p->gradeOfClassmate,p->gradeOfMorality,p->gradeOfTeacher,p->gradeOfFinal,p->rankOfFinal);printf("這是這個學生的信息,您可以按0返回主菜單");input0returnMainMenu(); } void studentInformationDelete()//學生信息刪除函數 {system("cls");system("color 7A");//打印白底綠字system("date/t");//打印系統日期(注意date/t一體)system("time/t");//打印系統時間(具體)if(head==NULL){printf("您還沒有輸入學生信息,請輸入0到回到學生信息輸入頁面");int choose;scanf("%d",&choose);while(choose!=0){printf("輸入有誤!請重新輸入");scanf("%d",&choose);}if(choose==0)studentInformationInput();}printf("如果您想回到主菜單輸入0,刪除學生信息輸入1");int choose;scanf("%d",&choose);while(choose!=0&&choose!=1){printf("輸入有誤!請重新輸入");scanf("%d",&choose);}if(choose==0)studentInformationInput();int num;printf("請輸入您想刪除的學生的學號:");scanf("%lld",&num);SD *p1,*p2;p1=head;while(num!=p1->number&&p1->next!=NULL)//在沒有找到這個節點并且循環后p1還不是尾結點的時候,每循環一次后p2都是p1的上一個節點{p2=p1;p1=p1->next;}if(num==p1->number){if(p1==head){head=p1->next;}else{p2->next=p1->next;//都含next,這樣才會真正操作了鏈表}printf("已經刪除此學生信息,請輸入0回到主菜單");input0returnMainMenu();}else{printf("查無此人,按0重新輸入");int choose;scanf("%d",&choose);while(choose!=0){printf("輸入有誤!請重新輸入");scanf("%d",&choose);}if(choose==0)studentInformationDelete();}} void studentInformationAdd()//學生信息增加函數 {system("cls");system("color 7A");//打印白底綠字system("date/t");//打印系統日期(注意date/t一體)system("time/t");//打印系統時間(具體)int num;printf("請輸入您想增加的學生學號:");scanf("%lld",&num);SD *p1,*p2;p1=head;while(p1!=NULL){if(p1->number==num){printf("您好,輸入的學號已經存在,請輸入0重新輸入");int choose;scanf("%d",&choose);while(choose!=0){printf("輸入不是0,請重新輸入");scanf("%d",&choose);}if(choose==0);studentInformationAdd();}p1=p1->next;}SD *s0=(SD*)malloc(sizeof(SD));if(head==NULL){head=s0;s0->next=NULL;}//首先是頭結點不存在的情況,那么就直接創建一個節點else//頭結點存在的情況下{p1=head;while(p1->number<=num&&p1->next!=NULL)//p1的的學號小于等于輸入的學號并且不是p1不是尾結點;循環停止有兩個條件,1是p1的學號大于輸入的學號,2是p是尾結點{p2=p1;p1=p1->next;}if(p1->number>num)//第一種情況,直接插入{if(p1==head){s0->next=head;head=s0;}else{p2->next=s0;s0->next=p1;}}else{p1->next=s0;s0->next=NULL;}//第二種情況是尾部插入}s0->number=num;printf("請輸入學生的姓名:");scanf("%s",s0->name);;printf("請輸入學生的性別:");scanf("%s",s0->sex);printf("請輸入學生的電話號碼:");scanf("%s",s0->phoneNumber);printf("請輸入學生的C語言的分數");scanf("%f",&s0->gradeOfC);printf("請輸入學生的高數成績:");scanf("%f",&s0->gradeOfMath);printf("請輸入學生的英語成績:");scanf("%f",&s0->gradeOfEnglish);s0->average=(s0->gradeOfC+s0->gradeOfMath+s0->gradeOfEnglish)/3.0;//計算平均分printf("請輸入學生的同學互評分:");scanf("%f",&s0->gradeOfClassmate);printf("請輸入學生的道德分數:");scanf("%f",&s0->gradeOfMorality);printf("請輸入同學的教師評分:");scanf("%f",&s0->gradeOfTeacher);s0->gradeOfFinal=s0->average*0.6+s0->gradeOfClassmate*0.1+s0->gradeOfMorality*0.1+s0->gradeOfTeacher*0.2;//計算綜測分printf("此名同學的信息已經輸入完畢,您可以輸入0返回主菜單");input0returnMainMenu(); } void studentInformationPrint()//學生信息打印函數 {system("cls");system("color 7A");//打印白底綠字system("date/t");//打印系統日期(注意date/t一體)system("time/t");//打印系統時間(具體)printf("\n\n\n\n\n");rankOfExam();//在打印之前應該更新兩個排名信息rankOfFinal();printf("學號 姓名 性別 聯系電話 C語言成績 高數成績 英語成績 平均成績 考試成績名次 同學互評分 品德成績 任課老師評分 綜測成績 綜測成績名次\n");SD *p=head;while(p!=NULL){printf("%-11lld%-7s%-5s%-12s",p->number,p->name,p->sex,p->phoneNumber);printf("%-11.2f%-9.2f%-9.2f%-9.2f%-13d",p->gradeOfC,p->gradeOfMath,p->gradeOfEnglish,p->average,p->rankOfExam);printf("%-11.2f%-9.2f%-13.2f%-9.2f%-12d\n",p->gradeOfClassmate,p->gradeOfMorality,p->gradeOfTeacher,p->gradeOfFinal,p->rankOfFinal);p=p->next;}printf("如果您想回到主菜單,請輸入0");input0returnMainMenu(); } void fileOperation() {system("cls");system("color 7A");//打印白底綠字system("date/t");//打印系統日期(注意date/t一體)system("time/t");//打印系統時間(具體)rankOfExam();//在文件操作之前應該更新兩個排名信息rankOfFinal();//if(head==NULL){printf("頭節點為空,好像沒有輸入任何數據,建議您按0返回主菜單輸入數據");input0returnMainMenu();}printf("如果您想把數據保存進文件,請輸入1\n");printf("如果您想把文件中的數據顯示出來,請輸入2\n");printf("如果您想返回主菜單,請輸入0\n");int choose;scanf("%d",&choose);while(choose!=0&&choose!=1&&choose!=2){printf("輸入不合法,請重新輸入");scanf("%d",&choose);}switch(choose){case 1:fileInput();break;case 2:filePrint();break;case 0:mainMenu();} } void fileInput() {FILE *fp;fp=fopen("C:\\Users\\FX\\Desktop\\data.txt","w+");SD *p=head;fprintf(fp,"學號 姓名 性別 聯系電話 C語言成績 高數成績 英語成績 平均成績 考試成績名次 同學互評分 品德成績 任課老師評分 綜測成績 綜測成績名次\n");while(p!=NULL){fprintf(fp,"%-11lld%-7s%-5s%-12s",p->number,p->name,p->sex,p->phoneNumber);fprintf(fp,"%-11.2f%-9.2f%-9.2f%-9.2f%-13d",p->gradeOfC,p->gradeOfMath,p->gradeOfEnglish,p->average,p->rankOfExam);fprintf(fp,"%-11.2f%-9.2f%-13.2f%-9.2f%-12d\n",p->gradeOfClassmate,p->gradeOfMorality,p->gradeOfTeacher,p->gradeOfFinal,p->rankOfFinal);p = p->next;}fclose(fp);printf("您已保存完畢,如果想返回主菜單請鍵入1,如果您想返回上一級,請鍵入2");int choose;scanf("%d",&choose);while(choose!=1&&choose!=2){printf("輸入不合法,請重新輸入");scanf("%d",&choose);}switch(choose){case 1:mainMenu();break;case 2:fileOperation();}} void filePrint() {FILE *fp;fp=fopen("C:\\Users\\FX\\Desktop\\data.txt","r");char s[1000];while(fgets(s,1000,fp)!=NULL){printf("%s\n",s);}fclose(fp);printf("您已讀取完畢,如果想返回主菜單請鍵入1,如果您想返回上一級,請鍵入2");int choose;scanf("%d",&choose);while(choose!=1&&choose!=2){printf("輸入不合法,請重新輸入");scanf("%d",&choose);}switch(choose){case 1:mainMenu();break;case 2:fileOperation();} } int main() {setbuf(stdout,NULL);system("pause");//暫停緩沖一下mainMenu();//調用主頁面 }總結
- 上一篇: 面向对象编程基础
- 下一篇: 英语阅读小程序云开发项目