C++题目
文本文件data.txt中存放着学生信息,第1行是学生信息数量,从第2行起,每行是一个学生的信息,依次为学号、姓名、成绩。其中学号是长度不超过10的字符串、姓名是长度不超过20的字符串,成绩是实数。程序实现将data.txt中的学生信息读出,按成绩降序排序、成绩相同时按姓名升序排序,成绩和姓名都相同时按学号升序排序,输出到显示器上。自己建立data.txt文件,文件内容如下。
5
S1001 小红 92.5
S1002 小明 87
S1003 小芳 92.5
S1004 小明 87
S1005 小杜 95
为避免中文乱码问题,在保存文件时编码选择ANSI。
#include <iostream> #include <fstream> #include <cassert> #include <string> #include <stdio.h> #include <string.h> using namespace std; typedef struct student{ string Id; string Name; double score; }Stu; string s[20]; double stringToDouble(string num) { bool minus = false; //标记是否是负数 string real = num; //real表示num的绝对值 if (num.at(0) == '-') { minus = true; real = num.substr(1, num.size()-1); } char c; int i = 0; double result = 0.0 , dec = 10.0; bool isDec = false; //标记是否有小数 unsigned long size = real.size(); while(i < size) { c = real.at(i); if (c == '.') {//包含小数 isDec = true; i++; continue; } if (!isDec) { result = result*10 + c - '0'; } else {//识别小数点之后都进入这个分支 result = result + (c - '0')/dec; dec *= 10; } i++; } if (minus == true) { result = -result; } return result; } void readTxt(string file) { ifstream infile; infile.open(file.data()); //将文件流对象与文件连接起来 assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行 int i=-1; while (!infile.eof()) { infile >>s[++i]; } infile.close(); //关闭文件输入流 } int main(){ string filename="data.txt"; readTxt(filename); Stu student[5]; for(int i=0;i<5;i++){ student[i].Id=s[i*3+1]; student[i].Name=s[i*3+2]; student[i].score=stringToDouble(s[i*3+3]); } for(int i=0;i<4;i++){ for(int j=0;j<5-i;j++){ if(student[j].score<student[j+1].score){ Stu temp=student[j]; student[j]=student[j+1]; student[j+1]=temp; } } } for(int i=0;i<5;i++){ for(int j=i+1;j<5;j++){ if(student[i].score == student[j].score){ if(strcmp(student[i].Name.c_str(),student[j].Name.c_str())>0){ Stu temp=student[j]; student[j]=student[i]; student[i]=temp; }else if(strcmp(student[i].Name.c_str(),student[j].Name.c_str())==0){ if(student[i].Id>student[j].Id){ Stu temp=student[j]; student[j]=student[i]; student[i]=temp; } } } } } for(int i=0;i<5;i++){ cout<<student[i].Id<<' '<<student[i].Name<<' '<<student[i].score<<endl; } return 0; }