/*
* Copyright (c) 2013, 烟台大学计算机学院
* All rights reserved.
* 作 者: 沈远宏
* 完成日期:2014 年 03月 04日
* 版 本 号:v1.0
* 问题描述:(1)从文件中读出数据,存放到结构体数据中。
(2)求出每名同学的总分(可以在读入过程中顺便计算)
(3)输出结构体数组中所有同学的记录。
(4)按总分排序(降序);
(5)输出排序后的成绩单;
(6)有30名同学可以获得奖学金,规则是总分高者优先,有挂科者不得奖学金,请输出可以的奖学金的同学的名单
*/#include <iostream>
#include <fstream>
using namespace std;
struct Student
{
char num[13]; //学号
char name[10]; //姓名
int cpp;//c++成绩
int math;//数学成绩
int english;// 英语成绩
int grade;//总分
double average;//均分
};
int write_in(Student[]);//读入文件
void output(Student[],int);//输出成绩
void sort(Student[],int);//按总分降序排序
void find_exce_stu(Student[],int);
int main( )
{
int N;
Student stu[1000];//定义结构体数组
cout<<"请输入学生学号、姓名、C++、数学、英语成绩:\n";
N=write_in(stu);
cout<<"\n学号 姓名 C++ 数学 英语 总分 \n";
output(stu,N);
sort(stu,N);
cout<<"按总分降序排序后输出成绩单\n学号 姓名 C++ 数学 英语 总分 \n";
output(stu,N);
cout<<"获得奖学金的同学是:\n";
find_exce_stu(stu,N);
return 0;
}
int write_in(Student stu[])
{
int i=0;
ifstream infile("score.txt",ios::in);
if(!infile)
{
cerr<<"error"<<endl;
}
while( infile>>stu[i].num>>stu[i].name>>stu[i].cpp>>stu[i].math>>stu[i].english)//读入程序
{
stu[i].grade=stu[i].cpp+stu[i].math+stu[i].english;//求出每位同学的总分
i++;
}
return i;
}
void output(Student stu[],int i)
{
for(int j=0; j<i; j++)//输出学生学号、姓名、总分、均分
{
cout<<stu[j].num<<"\t"<<stu[j].name<<"\t"<<stu[j].cpp<<"\t"<<stu[j].math<<"\t"<<stu[j].english<<"\t"<<stu[j].grade<<endl;
}
}
void sort(Student s[],int n) //按总分降序排序
{
int i,k;
Student t;
for(k=0; k<(n-1); ++k)
{
for(i=0; i<(n-k-1); ++i)
{
if(s[i].grade<s[i+1].grade)
{
t=s[i];
s[i]=s[i+1];
s[i+1]=t;
}
}
}
}
void find_exce_stu(Student s[],int n)
{
int i, Num=0;
for(i=0;i<n; ++i)
{
if(s[i].cpp>=60&&s[i].math>=60&&s[i].english>=60)
{
cout<<s[i].num<<"\t"<<s[i].name<<"\t"<<s[i].cpp<<"\t"<<s[i].math<<"\t"<<s[i].english<<"\t"<<s[i].grade<<endl;
Num++;
if(Num==30)break;
}
}
}
运行结果:
心得体会:
说实话,这么一大串学生我一运行的时候还以为死循环了.....哈哈,玩编程也很有意思的啊