[C++] 纯文本查看 复制代码 // 查找学生
Student Student::findBySno(int sno)throw(RuntimeException){
static Student sts[5]; //findBySno是一个静态函数, 为什么这个sts变量不加static 出现以下错误。另外当整个程序结束也就是main 执行完return 0; 也会出现下面的错误。求大佬看看
/*Microsoft Visual Studio
ce.exe中的0x79e1ad7a(msvcp100d.d0处有未经处理的异常:0x0000005:
读取位置0×015b8644时发生访问冲突 */
readFromFile("E:/Users/Administrator/Documents/Visual Studio 2010/Projects/ce/ce/STU1.DAT",sts);
for(int i=0;i<5;i++){
if(sts[i].getSno() == sno)
return sts[i];
}
完整代码
[mw_shl_code=cpp,true]
#include <iostream>
#include <string>
#include <fstream>
using namespace std;class RuntimeException{
public:
int code;
string msg;
RuntimeException(){
}
RuntimeException(int code,string msg){
this->code = code;
this->msg=msg;
}
RuntimeException& error() {
this->code = -9999;
this->msg="未知异常!";
return *this;
}
RuntimeException& ok(){
this->code = 200;
this->msg="成功!";
return *this;
}
int getCode(){
return this->code;
}
string getMsg(){
return this->msg;
}
};
class Student{
private:
// 学号
int sno;
// 姓名
string name;
// 3门课的成绩
float scores[3];
// 平均成绩
float avgScore;
public:
// 总学生数
static int count;
// 无参构造
Student(){
count++;
}
// 计算平均成绩
void calculateAvgScore()
{
float sum =0.;
for(int i=0;i<3;i++){
sum+=scores[i];
}
this->avgScore = sum / 3;
}
// 排序
static void sort(Student sts[]);
// 查找学生
static Student findBySno(int sno);
// 获取学号
int getSno(){
return this->sno;
}
// 获取姓名
string getName(){
return this->name;
}
// 获取成绩
float* getScores(){
return this->scores;
}
// 获取平均成绩
float getAvgScore(){
return this->avgScore;
}
// set学号
void setSno(int sno){
this->sno = sno;
}
// set姓名
void setName(string name){
this->name = name;
}
// set成绩
void setScores(float scores[]){
for(int i=0;i<3;i++){
this->scores[i] = scores[i];
}
}
friend Student& operator<<(ostream &os,Student &stu){
os<<stu.sno<<" "<<stu.name<<" ";
for(int i =0;i<3;i++){
os<<stu.scores[i]<<" ";
}
os<<stu.avgScore<<endl;
return stu;
}
};
// 定义
int Student::count = 0;
void readFromFile(string fileName,Student *sts){
fstream fs;
fs.open(fileName,ios::in|ios::out|ios::binary);
for(int i = 0;i<Student::count;i++){
fs.read((char*)&sts[i],sizeof sts[i]);
sts[i].calculateAvgScore();
}
fs.close();
}
void writeToFile(string fileName,Student sts[]){
fstream fs;
fs.open(fileName,ios::in|ios::out|ios::binary|ios::trunc);
for(int i = 0;i<Student::count;i++){
fs.write((char*)&sts[i],sizeof sts[i]);
}
fs.close();
}
// 排序
void Student::sort(Student sts[]){
int flag;
for(int i = 0;i<Student::count-1;i++){
flag = 1;
for(int j= 0;j<Student::count-1-i;j++){
Student tmp;
if(sts[j].avgScore<sts[j+1].avgScore){
tmp = sts[j];
sts[j] = sts[j+1];
sts[j+1] =tmp;
flag=0;
}
Student::count--;
if(flag)
return;
}
}
}
// 查找学生
Student Student::findBySno(int sno)throw(RuntimeException){
static Student sts[5];
readFromFile("E:/Users/Administrator/Documents/Visual Studio 2010/Projects/ce/ce/STU1.DAT",sts);
for(int i=0;i<5;i++){
if(sts[i].getSno() == sno)
return sts[i];
}
throw RuntimeException(1000,"没找到该学号的学生!");
}
/*
2.编写程序完成如下功能:
(1)输入5个学生的信息:学号(6位整数)、姓名(6个字符)、3门课的成绩(3位整数1位小数)。
计算每个学生的平均成绩(3位整数2位小数),将所有数据写入文件STU1.DAT;
(2)从STU1.DAT文件中读入学生数据,按平均成绩从高到低排序后写入文件STU2.DAT;
(3)按照输入学生的学号,在STU2.DAT文件中查找该学生,找到以后输出该学生的所有数据,如果文件中没有输入的学号,给出相应的提示信息.
*/
int main(){
int n = 5;
Student s[5];
//(1)
#if 0
for(int i = 0;i<n;i++){
int sno;
string name;
float sc[3];
cin>>sno>>name>>sc[0]>>sc[1]>>sc[2];
s[i].setSno(sno);
s[i].setName(name);
s[i].setScores(sc);
Student(*(s+i)).calculateAvgScore();
}
writeToFile("E:/Users/Administrator/Documents/Visual Studio 2010/Projects/ce/ce/STU1.DAT",s);
#endif
//(2)
#if 0
readFromFile("E:/Users/Administrator/Documents/Visual Studio 2010/Projects/ce/ce/STU1.DAT",s);
Student::sort(s);
writeToFile("E:/Users/Administrator/Documents/Visual Studio 2010/Projects/ce/ce/STU2.DAT",s);
#endif
//(3)
/*
2001 小米 90 100 120
2002 小黑 190 100 120
2003 米 90 110 120
2004 X米 90 100 120
2005 X小米 90 100 120
*/
try{
Student res = Student::findBySno(2001);
cout<<res;
}catch(RuntimeException& ex){
cout<<"错误原因->"<<ex.getMsg();
}
return 0;
}
throw RuntimeException(1000,"没找到该学号的学生!");
}[/mw_shl_code] |