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