1. 程式人生 > >檔案輸入流錄入五名學生成績,並對五人成績進行操作

檔案輸入流錄入五名學生成績,並對五人成績進行操作

採用簡單的方法,簡單的語句對學生成績進行操作。

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;
                }
            }
        }
    }
}