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;
}

 

posted on 2020-05-14 20:54  二进制dd  阅读(211)  评论(0编辑  收藏  举报

导航