檔案輸入流錄入五名學生成績,並對五人成績進行操作
阿新 • • 發佈:2019-01-27
採用簡單的方法,簡單的語句對學生成績進行操作。
1.計算每一科目的總分,平均分,最高分,最低分
2.輸出學生的學號,姓名,所有成績以及總分,平均分,gpa(加權值)
3.根據學生的名字升序排列
4.根據學生的學號升序排到
5.根據學生的學號查詢學生的排名並展示他的成績
6.根據學生的姓名查詢學生的排合併展示他的成績
7.由分數書成5個階段: A(90——100) B(80—— 90)C(70—— 80). D(60——70) F(0-59)
計算每一科目每一階段的人數及百分比
#include<iostream> #include<string>//fileName.c_str()函式呼叫 #include<fstream>//檔案流標頭檔案 #include<iomanip>//流操作符 #include<stdio.h> using namespace std;//申請記憶體空間, //輸出 學生號,學生姓名,所有成績,總分,平均分,和每個學生的績點,儲存結果到指定檔案。 struct student { string sno;//學號 string name;//姓名 double score[5];//五門科目成績 double perSum;//每名學生五門科目總成績 double perAvg;//每名學生五門科目平均分 double perGpa;//gpa(加權值) int Rank;// }stud1[8];//結構體大小為8個,可以錄入8人成績資訊 void inputScoreFromFile();//呼叫函式,將檔案內容讀入磁碟 int menu();//選單選項 void displayScoreStudent();//顯示單個學生資訊,計算每一科目的總分,平均分,最高分,最低分 void displayAll();//輸出學生的學號,姓名,所有成績以及總分,平均分,gpa(加權值) void sortByName(struct student[]);//按照學生姓名氣泡排序 void sortBySno(struct student[]);//按照學生姓名氣泡排序 void searchBySno();//根據學生的學號查詢學生的排名並展示他的成績 int searchByName(struct student[],string enterByName);//根據學生的姓名查詢學生的排名並展示他的成績 void searchByPercentage(struct student[]);//第七題,計算每一科目每一階段的人數及百分比 void SAG(); void RANK(); int main() { int itemSelected=0;//承接選單項返回值,然後進入switch選項 while(true){//while(true)死迴圈,必須有結束迴圈標準,for(;;) inputScoreFromFile(); SAG(); RANK(); itemSelected=menu(); string enterName;//輸入學生姓名進行查詢 switch(itemSelected){ case 1: displayScoreStudent(); break; case 2: displayAll(); break; case 3: sortByName(stud1); break; case 4: sortBySno(stud1); break; case 5: searchBySno(); break; case 6: cin>>enterName; searchByName(stud1,enterName); break; case 7: searchByPercentage(stud1); break; case 0: return 0; default: cout<<"Wrong choose you entered!"<<endl; } } return 0; } int n=0;//定義為全域性變數 void inputScoreFromFile()//轉存到磁碟上 { ifstream iofile("F:\\scores.txt",ios::in);//檔案開啟 if(!iofile.is_open()) { cerr<<"Error:opening file fail"<<endl; } while(!iofile.eof()&&n<8) { iofile>>stud1[n].sno>>stud1[n].name>>stud1[n].score[0]>>stud1[n].score[1]>>stud1[n].score[2]>>stud1[n].score[3]>>stud1[n].score[4]; n++; } iofile.close();//關閉檔案 } int menu()//選單 { cout<<"1.計算每一科目的總分,平均分,最高分,最低分"<<endl; cout<<"2.輸出學生的學號,姓名,所有成績以及總分,平均分,gpa(加權值)"<<endl; cout<<"3.根據學生的名字升序排列"<<endl; cout<<"4.根據學生的學號升序排到"<<endl; cout<<"5.根據學生的學號查詢學生的排名並展示他的成績"<<endl; cout<<"6.根據學生的姓名查詢學生的排名並展示他的成情"<<endl; cout<<"7.按標準計算每一科目每一階段的人數及百分比"<<endl; cout<<"Select the desired option:"; int choose; cin>>choose; return choose;//返回值 } void SAG()//對結構體一些變數賦值 { for(int i=0;i<8;i++) { stud1[i].perSum=stud1[i].score[0]+stud1[i].score[1]+stud1[i].score[2]+stud1[i].score[3]+stud1[i].score[4]; stud1[i].perAvg=stud1[i].perSum/5; stud1[i].perGpa=(stud1[i].score[0]*3+stud1[i].score[1]*2+stud1[i].score[2]*4+stud1[i].score[3]*3+stud1[i].score[4]*3)/(3+2+4+3+3); } } void RANK() { for(int i=0;i<8;i++) { stud1[i].Rank=1; for(int j=0;j<8;j++) { if(i==j)continue; if(stud1[i].perSum<stud1[j].perSum) stud1[i].Rank++; } } } void displayScoreStudent()//1 {//顯示單個學生資訊,計算每一科目的總分,平均分,最高分,最低分 int m=0; double sum[5];//求和變數值 double average[5];//求平均值 double min[5];//求最小值 double max[5];//求最大值 for(int i=0;i<5;i++) { sum[i]=stud1[0].score[i]+stud1[1].score[i]+stud1[2].score[i]+stud1[3].score[i]+stud1[4].score[i]+stud1[5].score[i]+stud1[6].score[i]+stud1[7].score[i]; } for(int i=0;i<5;i++) { average[i]=sum[i]/8; } for(int i=0;i<5;i++) { double minNumber=9999; for(int j=0;j<8;j++) { if(minNumber>stud1[j].score[i]) { minNumber=stud1[j].score[i]; } } min[i]=minNumber; } for(int i=0;i<5;i++) { double maxNumber=0; for(int j=0;j<8;j++) { if(maxNumber<stud1[j].score[i]) { maxNumber=stud1[j].score[i]; } } max[i]=maxNumber; } cout<<"ECE101:"<<sum[0]<<"ECE102:"<<sum[1]<<"ECE103:"<<sum[2]<<"ECE104:"<<sum[3]<<"ECE105:"<<sum[4]<<endl; cout<<"ECE101:"<<average[0]<<"ECE102:"<<average[1]<<"ECE103:"<<average[2]<<"ECE104:"<<average[3]<<"ECE105:"<<average[4]<<endl; for(int i=0;i<5;i++) { cout<<"ECE10"<<(i+1)<<setw(6)<<":"<<min[i]; } cout<<endl; for(int i=0;i<5;i++) { cout<<"ECE10"<<(i+1)<<setw(6)<<":"<<max[i]; } cout<<endl; } void displayAll()//2 { for(int i=0;i<8;i++) { cout<<"sno:"<<stud1[i].sno<<"name:"<<stud1[i].name<<"ECE101:"<<stud1[i].score[0]<<"ECE102:" <<stud1[i].score[1]<<"ECE103:"<<stud1[i].score[2]<<"ECE104:"<<stud1[i].score[3]<<"ECE105:"<<stud1[i].score[4]<<"perSum:"<<stud1[i].perSum<<"perAvg:"<<stud1[i].perAvg<<"perGpa:"<<stud1[i].perGpa<<endl; } ofstream outfile("D:\\stud.dat",ios::binary); if(!outfile) { cerr<<"Error:open error!"<<endl; } else for(int i=0;i<8;i++) outfile.write((char*)&stud1[i],sizeof(stud1[i])); outfile.close(); } void sortByName(struct student stud1[])//3 { int i,j; student character;//定義一個結構體 for(i=0;i<8-1;i++) { for(j=0;j<8-1-i;j++) { if(stud1[j].name>stud1[j+1].name) { character=stud1[j]; stud1[j]=stud1[j+1]; stud1[j+1]=character; } } } for(int i=0;i<8;i++) { cout<<"sno:"<<stud1[i].sno<<setw(6)<<"name:"<<stud1[i].name<<setw(10) <<"ECE101:"<<stud1[i].score[0]<<setw(10)<<"ECE102:"<<stud1[i].score[0]<<setw(10) <<"ECE103:"<<stud1[i].score[0]<<setw(10)<<"ECE104:"<<stud1[i].score[0]<<setw(10) <<"ECE105:"<<stud1[i].score[0]<<endl; } } void sortBySno(struct student stud1[])//4 { int i,j; student character; for(i=0;i<8-1;i++) { for(j=0;j<8-1-i;j++) { if(stud1[j].sno>stud1[j+1].sno) { character=stud1[j]; stud1[j]=stud1[j+1]; stud1[j+1]=character; } } } for(int i=0;i<8;i++) { cout<<"sno:"<<stud1[i].sno<<setw(6)<<"name:"<<stud1[i].name<<setw(10) <<"ECE101:"<<stud1[i].score[0]<<setw(10)<<"ECE102:"<<stud1[i].score[1]<<setw(10) <<"ECE103:"<<stud1[i].score[2]<<setw(10)<<"ECE104:"<<stud1[i].score[3]<<setw(10) <<"ECE105:"<<stud1[i].score[4]<<endl; } } void searchBySno()//5 { string ID; cout<<"請輸入學號:"<<endl; cin>>ID; for(int i=0;i<8;i++) { if(ID==stud1[i].sno) { cout<<"sno:"<<stud1[i].sno<<"name:"<<stud1[i].name <<"ECE101:"<<stud1[i].score[0]<<"ECE102:"<<stud1[i].score[1] <<"ECE103:"<<stud1[i].score[2]<<"ECE104:"<<stud1[i].score[3] <<"ECE105:"<<stud1[i].score[4]<<"rank:"<<stud1[i].Rank<<endl; break;//對於單個for迴圈,break能夠跳出迴圈,對於雙層for迴圈,只能跳出最內層迴圈 } if(i==7&&ID!=stud1[i].sno) cout<<"學號不存在!"<<endl; } } int searchByName(struct student stud1[],string enterName)//6 { int i,j=0,num; double chooseValue; for(i=0;i<8;i++) { if(enterName==stud1[i].name) { num=i;//記錄下該學生的結構體陣列下標 j=1; chooseValue=stud1[i].score[0]+stud1[i].score[1]+stud1[i].score[2]+stud1[i].score[3]+stud1[i].score[4]; } } if(j==0) { cout<<"Error:Incorrect name!"<<endl; return 0; } double sum[8];//利用陣列,承接每位學生的總分 for(i=0;i<8;i++) { sum[i]=stud1[i].score[0]+stud1[i].score[1]+stud1[i].score[2]+stud1[i].score[3]+stud1[i].score[4]; } double value1; for(i=0;i<8-1;i++)//對學生總分進行排序 { for(j=0;j<8-1-i;j++) { if(sum[j]<sum[j+1]) { value1=sum[j]; sum[j]=sum[j+1]; sum[j+1]=value1; } } } for(i=0;i<8;i++) { if(chooseValue==sum[i]) { cout<<"該學生排名為:"<<(i+1)<<"sno:"<<stud1[num].sno<<setw(6)<<"name:"<<stud1[num].name<<setw(10) <<"ECE101:"<<stud1[num].score[0]<<setw(10)<<"ECE102:"<<stud1[num].score[1]<<setw(10) <<"ECE103:"<<stud1[num].score[2]<<setw(10)<<"ECE104:"<<stud1[num].score[3]<<setw(10) <<"ECE105:"<<stud1[num].score[4]<<endl; } } return 0; } void searchByPercentage(struct student stud1[])//7 { int array[5][5];//五門科目分五個等級成績 int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) { array[i][j]=0; } cout<<endl; } for(i=0;i<8;i++) { if(stud1[i].score[0]>=90&&stud1[i].score[0]<100) { array[0][0]+=1; } if(stud1[i].score[0]>=80&&stud1[i].score[0]<90) { array[0][1]+=1; } if(stud1[i].score[0]>=70&&stud1[i].score[0]<80) { array[0][2]+=1; } if(stud1[i].score[0]>=60&&stud1[i].score[0]<70) { array[0][3]+=1; } if(stud1[i].score[0]>=0&&stud1[i].score[0]<60) { array[0][4]+=1; } } for(i=0;i<8;i++) { if(stud1[i].score[1]>=90&&stud1[i].score[1]<100) { array[1][0]++; } if(stud1[i].score[1]>=80&&stud1[i].score[1]<90) { array[1][1]++; } if(stud1[i].score[1]>=70&&stud1[i].score[1]<80) { array[1][2]++; } if(stud1[i].score[1]>=60&&stud1[i].score[1]<70) { array[1][3]++; } if(stud1[i].score[1]>=0&&stud1[i].score[1]<60) { array[1][4]++; } } for(i=0;i<8;i++) { if(stud1[i].score[2]>=90&&stud1[i].score[2]<100) { array[2][0]++; } if(stud1[i].score[2]>=80&&stud1[i].score[2]<90) { array[2][1]++; } if(stud1[i].score[2]>=70&&stud1[i].score[2]<80) { array[2][2]++; } if(stud1[i].score[2]>=60&&stud1[i].score[2]<70) { array[2][3]++; } if(stud1[i].score[2]>=0&&stud1[i].score[2]<60) { array[2][4]++; } } for(i=0;i<8;i++) { if(stud1[i].score[3]>=90&&stud1[i].score[3]<100) { array[3][0]++; } if(stud1[i].score[3]>=80&&stud1[i].score[3]<90) { array[3][1]++; } if(stud1[i].score[3]>=70&&stud1[i].score[3]<80) { array[3][2]++; } if(stud1[i].score[3]>=60&&stud1[i].score[3]<70) { array[3][3]++; } if(stud1[i].score[3]>=0&&stud1[i].score[3]<60) { array[3][4]++; } } for(i=0;i<8;i++) { if(stud1[i].score[4]>=90&&stud1[i].score[4]<100) { array[4][0]++; } if(stud1[i].score[4]>=80&&stud1[i].score[4]<90) { array[4][1]++; } if(stud1[i].score[4]>=70&&stud1[i].score[4]<80) { array[4][2]++; } if(stud1[i].score[4]>=60&&stud1[i].score[4]<70) { array[4][3]++; } if(stud1[i].score[4]>=0&&stud1[i].score[4]<60) { array[4][4]++; } } for(i=0;i<5;i++ ) { for(j=0;j<5;j++) { cout<<array[i][j]; } cout<<endl; } //輸出等級所佔比例 // double array1[5][5];//儲存科目成績所佔比例 for(i=0;i<5;i++) { for(j=0;j<5;j++) { double munber=0; double a=0; if(array[i][j]!=0) { munber=(double)array[i][j]/8; double a=munber*100; if(j==0) { cout<<"科目ECE10"<<i<<setw(6)<<"所在階段90--100"<<setw(6)<<a<<"%"<<endl; } if(j==1) { cout<<"科目ECE10"<<i<<setw(6)<<"所在階段80--90"<<setw(6)<<a<<"%"<<endl; } if(j==2) { cout<<"科目ECE10"<<i<<setw(6)<<"所在階段70--80"<<setw(6)<<a<<"%"<<endl; } if(j==3) { cout<<"科目ECE10"<<i<<setw(6)<<"所在階段60--70"<<setw(6)<<a<<"%"<<endl; } if(j==4) { cout<<"科目ECE10"<<i<<setw(6)<<"所在階段0--60"<<setw(6)<<a<<"%"<<endl; } } } } }