第17周报告
实验目的:理解结构体概念
实验内容:从文件中读入数据,利用结构体,作出成绩单。
* 程序头部注释开始
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:
* 作
* 完成日期:
* 版本号:
* 对任务及求解方法的描述部分
* 输入描述:文件score.txt
* 问题描述:从文件score.txt中读入30名同学成绩(c++,高数,英语),按照总成绩排序,将排序后的结果在屏幕上输出,将30名同学中能活奖学金的输出。
* 程序输出:总成绩排序
* 程序头部的注释结束
#include<fstream>
#include<iomanip>
#include<string>
#include<iostream>
using namespace std;
struct student
{
char num[12];
string name;
float grade[3];
float score;
};
student stu[180];
int main()
{
int i, j;
student t;
ifstream infile( "score.txt", ios::in );
if(!infile)
{
cerr << "open error" << endl;
exit(1);
}
for(i = 0; i < 180; i++)
{
infile >> stu[i].num >> stu[i].name>> stu[i].grade[0]
>> stu[i].grade[1] >> stu[i].grade[2] ;
stu[i].score = stu[i].grade[0] + stu[i].grade[1] + stu[i].grade[2];
}
infile.close();
for(j = 0; j < 179; j++)
for( i = 0; i < 179-j; i++)
{
if(stu[i].score < stu[i+1].score)
{
t = stu[i];
stu[i] = stu[i+1];
stu[i+1]= t;
}
}
for(i = 0; i < 180; i++)
{
cout << stu[i].num << '\t' << stu[i].name <<'\t' <<stu[i].grade[0]
<<'\t'<<stu[i].grade[1] <<'\t'<< stu[i].grade[2] <<'\t'<< stu[i].score << endl;
}
cout << endl <<"获得奖学金的同学名单:" << endl;
for(i = 0; i < 180; i++)
{
static array = 0;
if(array >= 30)
{
break;
}
if(stu[i].grade[0] >= 60 && stu[i].grade[1] >= 60 && stu[i].grade[2] >= 60 )
{
cout << stu[i].name << '\t' ;
array ++;
}
if( (i+1) % 5 == 0 )
{
cout << endl ;
}
}
return 0;
}
运行结果:
经验积累:
1.结构体本身并不复杂,可以向往常一样进行运算,替换,而真正的难点在于结构体内部数据的处理。
2.此次做题,被输入奖学金名单难住了,原因在于30名同学与执行循环体中的矛盾。再一个是对于总成绩的排序,只是想着将总成绩排序,却总是没法把所有数据都进行排序。
3.在输入文件内容较多时,可以仅取其中的几个值但要覆盖面广,从而检验算法的正误。
上机感言:确实花了时间,而且还不少,对输出结果的对齐,尤其是长人名处理还是,不能解决。在以后还要将此算法简化,用多个自己定义函数计算,思路现在还是不十分清晰。