任务要求:
-
完成函数stu_sort:实现按成绩从高到低对Student对象数组s的排序
void stu_sort(Student s[], int size);
-
完成函数
creatDatfile
:将学生信息按序写入二进制文件中。void createDatfile(char* txtfilename, char *datfilename)
该函数首先读取文本文件txtfilename
,将数据保存到Student
类的对象数组stu[10]
中(本题做了简化处理,假设文本文件中有且只有10个学生信息) 然后调用函数stu_sort()
, 对stu[10]
排序。 最后将排好序的stu数组,写入二进制文件 datfilename中 -
完成函数getRankN:从学生信息的二进制文件datfilename中读取第n名并返回
Student getRankN(char *datfilename, int n);
实训代码(平台里面自动生成测试文件)
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
#include "testdatfile.h"
using namespace std;
class Student{
public:
void setStu(int, char*, float);
float getScore();
void print();
private:
int id;
char name[30];
float score;
};
void stu_sort(Student s[], int size); // 按成绩从高到低对Student对象数组s排序, 数组长度为size
void createDatfile(const char* txtfilename, const char *datfilename); // 从文本文件txtfilename中读取10个学生信息到Student 对象数组s中, 并以Student对象数组的形式写入二进制文件datfilename中
Student getRankN(const char *datfilename, int n);//从学生信息的二进制文件datfilename中读取第n名并返回
int main()
{
Student stu;
int n;
generatetestfile(); // 产生score.txt文件数据, 平台测试用
createDatfile("score.txt", "rank.dat");// 从文本文件score.txt中读取10个学生信息入二进制文件rank.dat中
cin >> n; // 由用户输入想查询第几名
stu = getRankN("rank.dat", n); // 从rank.dat中读取第n名
stu.print(); //显示第n名的信息
}
// 根据成绩从高到低对Student数组排序
void stu_sort(Student s[], int size)
{
/***********begin**********/
for(int i=0; i<size-1;i++)
{
for (int j=0; j<size-i-1;j++)
{
if(s[j].getScore()<s[j+1].getScore())
{
Student temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
/********end************/
}
// 从文本文件txtfilename中读取10个学生信息到Student 对象数组s中, 并以Student对象数组的形式写入二进制文件datfilename中
void createDatfile(const char* txtfilename, const char *datfilename)
{
/***********begin*********/
Student s[10];
ifstream is(txtfilename);
if (!is)
{
cerr << "Open file " << txtfilename << " failed." << endl; exit(EXIT_FAILURE);
}
int id;
char name[30];
float score;
for (int i = 0; i < 10; ++i)
{
is >> id >> name >> score;
s[i].setStu(id, name, score);
}
is.close();
stu_sort(s, 10);
ofstream os(datfilename, ios::binary);
if (!os)
{
cerr << "Open file " << datfilename << " failed." << endl;
exit(EXIT_FAILURE);
}
for (int i = 0; i < 10; ++i)
{
os.write(reinterpret_cast<const char*>(&s[i]),
sizeof(Student));
}
os.close();
/************end****************/
}
//从学生信息的二进制文件datfilename中读取第n名并返回
Student getRankN(const char * datfilename, int n)
{
/***********begin*********/
Student stu;
ifstream is(datfilename, ios_base::in|ios_base::binary);
is.seekg((n-1) * sizeof(Student));
is.read(reinterpret_cast <char *> (&stu), sizeof(Student));
is.close();
return stu;
/************end****************/
}
//类 student的成员函数
void Student :: setStu(int d, char *n, float s)
{
id = d;
strcpy(name, n);
score = s;
}
float Student :: getScore()
{
return score;
}
void Student::print()
{
cout << id << ' ' << name << ' '<< score << endl;
}
如果想在编程软件(本人使用vs2010)里实现此功能,则需自己创建score.txt文件
代码如下:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;
class Student{
public:
void setStu(int, char*, float);
float getScore();
void print();
private:
int id;
char name[30];
float score;
};
void stu_sort(Student s[], int size); // 按成绩从高到低对Student对象数组s排序, 数组长度为size
void createDatfile(const char* txtfilename, const char *datfilename); // 从文本文件txtfilename中读取10个学生信息到Student 对象数组s中, 并以Student对象数组的形式写入二进制文件datfilename中
Student getRankN(const char *datfilename, int n);//从学生信息的二进制文件datfilename中读取第n名并返回
int main()
{
Student stu;
int n;
createDatfile("score.txt", "rank.dat");// 从文本文件score.txt中读取10个学生信息入二进制文件rank.dat中
cin >> n; // 由用户输入想查询第几名
stu = getRankN("rank.dat", n); // 从rank.dat中读取第n名
stu.print(); //显示第n名的信息
}
// 根据成绩从高到低对Student数组排序
void stu_sort(Student s[], int size)
{
for(int i=0; i<size-1;i++)
{
for (int j=0; j<size-i-1;j++)
{
if(s[j].getScore()<s[j+1].getScore())
{
Student temp=s[j]; s[j]=s[j+1];
s[j+1]=temp;
}
}
}
}
// 从文本文件txtfilename中读取10个学生信息到Student 对象数组s中, 并以Student对象数组的形式写入二进制文件datfilename中
void createDatfile(const char* txtfilename, const char *datfilename)
{
Student s[10];
ifstream is(txtfilename);
if (!is)
{
cerr << "Open file " << txtfilename << " failed." << endl; exit(EXIT_FAILURE);
}
int id;
char name[30];
float score;
for (int i = 0; i < 10; ++i)
{
is >> id >> name >> score;
s[i].setStu(id, name, score);
}
is.close();
stu_sort(s, 10);
ofstream os(datfilename, ios::binary);
if (!os)
{
cerr << "Open file " << datfilename << " failed." << endl;
exit(EXIT_FAILURE);
}
for (int i = 0; i < 10; ++i)
{
os.write(reinterpret_cast<const char*>(&s[i]),
sizeof(Student));
}
os.close();
}
//从学生信息的二进制文件datfilename中读取第n名并返回
Student getRankN(const char * datfilename, int n)
{
Student stu;
ifstream is(datfilename, ios_base::in|ios_base::binary);
is.seekg((n-1) * sizeof(Student));
is.read(reinterpret_cast <char *> (&stu), sizeof(Student));
is.close();
return stu;
}
//类 student的成员函数
void Student :: setStu(int d, char *n, float s)
{
id = d;
strcpy(name, n);
score = s;
}
float Student :: getScore()
{
return score;
}
void Student::print()
{
cout << id << ' ' << name << ' '<< score << endl;
}
运行结果: