模拟EXCEL排序

模拟EXCEL排序


一、目的

-掌握自定义结构
-掌握sort的用法


二、实验内容与设计思想

模拟EXCEL排序

Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。

输入格式:
输入的第一行包含两个正整数 n (≤10
5
) 和 c,其中 n 是纪录的条数,c 是指定排序的列号。之后有 n 行,每行包含一条学生纪录。每条学生纪录由学号(6 位数字,保证没有重复的学号)、姓名(不超过 8 位且不包含空格的字符串)、成绩([0, 100] 内的整数)组成,相邻属性用 1 个空格隔开。

输出格式:
在 n 行中输出按要求排序后的结果,即:当 c=1 时,按学号递增排序;当 c=2 时,按姓名的非递减字典序排序;当 c=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

输入样例:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
输出样例:
000001 Zoe 60
000007 James 85
000010 Amy 90


题目分析:

代码重点在于判断排序条件的函数


函数相关伪代码

1.定义结构
struct student{
    string id;
    string name;
    int g;
};
2.
bool compareid(student& a,student& b) 
|return a.id < b.id;
bool comparename(student& a,student& b)
|if(a.name!=b.name)
||return a.name<b.name;
|return a.id<b.id;
bool compareg(student& a,student& b) 
|if (a.g!= b.g) 
||return a.g < b.g;
|return a.id < b.id;
3.主函数
cin>>x>>y;
for(i=0;i<x;i++)
|cin>>a[i].id>>a[i].name>>a[i].g;
if (y == 1) 
|sort(a.begin(),a.end(), compareid);
else if (y == 2) 
|sort(a.begin(), a.end(), comparename);
else if (y == 3) 
|sort(a.begin(),a.end(), compareg);
for (const auto& s : a) 
|cout << s.id << " " << s.name << " " << s.g << endl;

函数代码

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
struct student{
    string id;
    string name;
    int g;
};
bool compareid(student& a,student& b) {
    return a.id < b.id;
}
bool comparename(student& a,student& b){
    if(a.name!=b.name){
        return a.name<b.name;
    }
    return a.id<b.id;
}
bool compareg(student& a,student& b) {
    if (a.g!= b.g) {
        return a.g < b.g;
    }
    return a.id < b.id;
}
int main()
{
    int x,y,i;
    cin>>x>>y;
    vector<student>a(x);
    for(i=0;i<x;i++){
        cin>>a[i].id>>a[i].name>>a[i].g;
    }
     if (y == 1) {
        sort(a.begin(),a.end(), compareid);
    } else if (y == 2) {
        sort(a.begin(), a.end(), comparename);
    } else if (y == 3) {
        sort(a.begin(),a.end(), compareg);
    }
     for (const auto& s : a) {
        cout << s.id << " " << s.name << " " << s.g << endl;
    }
    return 0;
}

三、实验使用环境

以下请根据实际情况编写

  • 操作系统:Windows 11专业版
  • 编程语言:C++
  • 开发工具:[Visual Stdio 2022]

四、实验步骤和调试过程

模拟EXCEL排序

本机运行截图

运行分析

输入x,表示有多少行,y表示排序方法
根据y的值来选择排序方法,最后输出结构,按照id(学号),name(名字),g(成绩)来输出

五、实验小结

遇到的问题及解决方法:

  1. 问题:判断函数逻辑有问题
  • 解决方法:修改代码

实验体会和收获:

这段代码能够根据不同的标准对学生信息进行排序。
首先,代码先定义了一个学生结构体,包含学生的学号、姓名和成绩。接着,定义了三个比较函数,根据题目要求,分别按学号、姓名和成绩进行排序。这些比较函数确保了在排序时,如果第一判断条件相同,则按学号进行第二判断条件来排序(因为用sort函数来排序,需要自定义标准,要用bool来表示判断条件的正确性,根据返回的是true还是false来排序)。
在主函数中,程序首先读取有多少行和排序标准条件。然后,使用一个循环读取每个学生的学号、姓名和成绩,并将这些信息存储在一个动态数组vector中(直接定义数组个数,会造成溢出或空间浪费)。之后,根据用户输入的排序标准值y,程序使用sort函数,调用相应的比较函数对学生信息进行排序。最后,程序遍历排序后的学生信息(使用 for (const auto& s : a) ,使a从0开始循环被赋值到s,直到把a数组遍历一遍,自动停止,也可以用for (i=0;i<x;i++)来替换)并输出每个学生的学号、姓名和成绩。


posted @ 2025-05-22 23:18  穗和  阅读(35)  评论(0)    收藏  举报