c++程序代码:
#include<bits/stdc++.h>
using namespace std;
struct Student {
char cno[3];
char sno[3];
double avg;
bool operator < (const Student& i) const {
if (strcmp(cno, i.cno) != 0) return strcmp(cno, i.cno) < 0;
return avg > i.avg;
}
};
int main()
{
vector<Student> student;
char s[4];
while (cin >> s) {
if (s[0] == '\\') break;
Student tmp;
strcpy(tmp.cno,s);
cout << s << endl;
cin >> s;
strcpy(tmp.sno, s);
cin >> tmp.avg;
student.push_back(tmp);
}
sort(student.begin(), student.end());
puts("cno\tsno\tavg");
for (int i = 0; i < student.size(); i++) {
cout << student[i].cno << '\t' << student[i].sno << '\t' << student[i].avg<< endl;
}
return 0;
}
/*
kc1 abc 66
kc1 pvz 99
kc2 kfc 88
kc3 hiv 50
\
*/
其中程序最下方是输入的元素, 这里注意一下Student结构体中char cno[3], char sno[3]声明位置上是相邻的。当我运行程序输入数据之后输出是:
cno sno avg
kc1abc abc 66
kc1pvz pvz 99
kc2kfc kfc 88
kc3hiv hiv 50
我疑问的点是cno数组长度为3,但是最终输出cno时连带sno数组也输出了,调试了很多次,发现如果在Student结构体中像下面这样声明变量,就不会出现这种问题:
struct Student {
char cno[3];
double avg;
char sno[3];
bool operator < (const Student& i) const {
if (strcmp(cno, i.cno) != 0) return strcmp(cno, i.cno) < 0;
return avg > i.avg;
}
};
就是不将char cno[3] 和 sno[3] 声明分开。
最后我觉得多输出的原因是第一中声明方式上 cno 与 sno在地址上是连续的。 采用首地址输出字符型数据时遇到空字符才结束。
最终正确输出为:
cno sno avg
kc1 pvz 99
kc1 abc 66
kc2 kfc 88
kc3 hiv 50