第十七周 任务一
/*
* 程序头部注释开始
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:学生成绩处理
* 作 者:薛广晨
* 完成日期:2011 年 06 月 08 日
* 版 本号:x1.0
* 对任务及求解方法的描述部分
* 输入描述:文件score.dat
* 问题描述:保存为二进制文件ASCII 文件score.dat 中保存的是100 名学生的姓名和C++课、高数和英语成绩。
(1)定义学生类,其中包含姓名、C++课、高数和英语成绩及总分、均分数据成员,成员函数根据需要确定。
(2)读入学生的成绩,并求出总分,用对象数组进行存储。
(3)将所有数据保存到一个二进制文件binary_score.dat 中,最后在文件中写入你自己的各科成绩(咱不谦虚,也求个好运,全100分)。
(4)为验证输出文件正确,再将binary_score.dat 中的记录逐一读出到学生对象中并输出查看。
* 程序输出:binary_score.dat
* 程序头部的注释结束
*/
#include <fstream>
#include<iomanip>
#include <string>
#include<iostream>
using namespace std;
class Student
{
private:
string name;
double cgrade;
double mathgrade;
double englishgrade;
double score;
double average;
public:
Student();
Student(string name, double cgrade, double mathgrade, double englishgrade, double score, double average);
void set_name(string name);
void set_cgrade(double cgrade);
void set_mathgrade(double mathgrade);
void set_englishgrade(double englishgrade);
void set_score(double score);
void set_average(double average);
string get_name();
double get_cgrade();
double get_mathgrade();
double get_englishgrade();
double get_score();
double get_average();
friend void scoregrade(Student s[]);
friend void averagegrade(Student s[]);
friend void bubble_sort(Student s[]);//排序;
friend void cin_grade(Student s[]);//从文件得到数据;
friend void cout_grade(Student s[]);//储存数据;
};
int main( )
{
Student stud[101];
cin_grade(stud);//读入101人的原始分数
scoregrade(stud);
averagegrade(stud);
bubble_sort(stud);
cout_grade(stud);
cout<<endl;
system("PAUSE");
return 0;
}
Student::Student()
{
this->name = "NULL";
this->cgrade = 0;
this->mathgrade = 0;
this->englishgrade = 0;
this->score = 0;
this->average = 0;
}
Student::Student(string name, double cgrade, double mathgrade, double englishgrade, double score, double average)
{
this->name = name;
this->cgrade = cgrade;
this->mathgrade = mathgrade;
this->englishgrade = englishgrade;
this->score = score;
this->average = average;
}
void cin_grade(Student s[])
{
int i;
string name;
double cgrade;
double mathgrade;
double englishgrade;
ifstream infile("score.dat",ios::in);
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
for(i=0;i<101;i++)
{
infile >> name >> cgrade >> mathgrade >> englishgrade;
s[i].set_name(name);
s[i].set_cgrade(cgrade);
s[i].set_mathgrade(mathgrade);
s[i].set_englishgrade(englishgrade);
}
infile.close();
cout<<endl;
}
void cout_grade(Student stud[])
{
int i;
ofstream outfile("binary_score.dat",ios::binary);
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(1);
}
cout << setiosflags(ios::left) << setw(12) << "姓名" << setw(8) << "C++" << setw(8) << "高数" << setw(8) << "英语" << setw(8) <<"总分" << setw(8) << "平均分" << endl;
for(int i = 0; i < 101; i++)
{
outfile.write((char *)&stud[i],sizeof(stud[i]));
cout<<setiosflags(ios::left)<<setw(12)<<stud[i].get_name()<<setw(8)<<stud[i].get_cgrade()<<setw(8)<<stud[i].get_mathgrade()<<setw(8)<<stud[i].get_englishgrade()<<setw(8)<<stud[i].get_score()<<setw(8)<<stud[i].get_average()<<endl;
}
outfile.close();
}
void Student::set_name(string name)
{
this->name = name;
}
void Student::set_cgrade(double cgrade)
{
this->cgrade = cgrade;
}
void Student::set_mathgrade(double mathgrade)
{
this->mathgrade = mathgrade;
}
void Student::set_englishgrade(double englishgrade)
{
this->englishgrade=englishgrade;
}
void Student::set_score(double score)
{
this->score=score;
}
void Student::set_average(double average)
{
this->average=average;
}
string Student::get_name()
{
return name;
}
double Student::get_cgrade()
{
return cgrade;
}
double Student::get_mathgrade()
{
return mathgrade;
}
double Student::get_englishgrade()
{
return englishgrade;
}
double Student::get_score()
{
return score;
}
double Student::get_average()
{
return average;
}
void bubble_sort(Student s[])
{
Student stud;
int i,j;
for(i=0;i<101-1;i++)
{
for(j=0;j<101-i-1;j++)
{
if(s[j].get_score()<s[j+1].get_score())
{
stud=s[j+1];
s[j+1]=s[j];
s[j]=stud;
}
}
}
}
void scoregrade(Student s[])
{
double grade;
for(int i=0;i<101;++i)
{
grade=s[i].get_cgrade()+s[i].get_mathgrade()+s[i].get_englishgrade();
s[i].set_score(grade);
}
}
void averagegrade(Student s[])
{
double average;
for(int i=0;i<101;++i)
{
average=double(s[i].get_cgrade()+s[i].get_mathgrade()+s[i].get_englishgrade())/3;
s[i].set_average(average);
}
}
上机感言:使用二进制文件虽然看不懂,但是它也不是给人看的,它的效率却比ASCII的高。
还没有评论,来说两句吧...