题目描述:
职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来。输入第一行包括1个整数N,1<=N<=30,代表输入数据的个数。
接下来的N行有N个职工的信息:
包括职工号(整数), 姓名(字符串,长度不超过10), 年龄(1<=age<=100)。
输出描述:
可能有多组测试数据,对于每组数据,
输出结果行数为N和3的较小值,分别为年龄最小的职工的信息。
关键字顺序:年龄>工号>姓名,从小到大。
代码思路很简单,维持一个长度为4的数组(有序),每输入一个数据就插入排序(0->n是从小到大,),最终输出前三,但是我这代码通过了90%测试,最后停在一个测试数据上,我debug后发现,问题出现在90 30 61这一行的输入上。他错误地认为61小于18,然后把63插入到数组中(debug的时候想输出一下string name的值然后程序就卡死了)。之后我用char name[10]代替了结构体中的string name,问题就解决了。想问以下为什么。
#include<iostream>
#include<string.h>
using namespace std;
struct stuff{
string name;
int age;
int id;
stuff(string n,int i,int a){
name=n;
id=i;
age=a;
}
};
void insertsort(stuff* stuffs[],stuff* s){
int i,j;
for(i=0;i<3;i++){
if( (s->age<stuffs[i]->age) || (s->age==stuffs[i]->age)&&(s->id<stuffs[i]->id) || (s->id==stuffs[i]->id)&&(s->name<stuffs[i]->name)){
for(j=3;j>i;j--){
stuffs[j]=stuffs[j-1];
}
stuffs[i]=s;
break;
}
}
}
int main(){
int n,i,j;
while(cin>>n){
stuff* stuffs[4];
for(i=0;i<4;i++){
stuffs[i]=new stuff("nn",-10,10000);
}
string name;
int id;
int age;
for(i=0;i<n;i++){
cin>>id>>name>>age;
stuff* s = new stuff(name,id,age);
insertsort(stuffs,s);
}
for(i=0;i<3;i++){
cout<<stuffs[i]->id<<" "<<stuffs[i]->name<<" "<<stuffs[i]->age<<"\n";
}
}
return 0;
}
出现问题的数据:
19
80 53 96
7 51 78
55 14 51
58 40 44
78 74 27
50 75 53
95 41 43
90 99 18
8 67 69
60 67 94
12 64 85
90 30 61
29 7 39
45 20 79
45 95 16
79 61 70
32 69 80
97 55 24
68 67 17
应该输出的结果:
45 95 16
68 67 17
90 99 18
实际输出的结果:
45 95 16
68 67 17
97 55 24
当我把结构体中string name用char name[10]代替后发现正常输出了。
说的不清楚,用char name[]替换string name并不是仅仅替换名字,以下是替换后的代码
#include<iostream>
#include<string.h>
using namespace std;
struct stuff{
char name[10];
int age;
int id;
stuff(char n[10],int i,int a){
int k=0;
while(n[k]!='\0'){
name[k]=n[k];
k++;
}
name[k]='\0';
id=i;
age=a;
}
stuff(){
}
};
void insertsort(stuff* stuffs[],stuff* s){
int i,j;
for(i=0;i<3;i++){
if( (s->age<stuffs[i]->age) || (s->age==stuffs[i]->age)&&(s->id<stuffs[i]->id) || (s->id==stuffs[i]->id)&&(strcmp(stuffs[i]->name,s->name)==0)){
for(j=3;j>i;j--){
stuffs[j]=stuffs[j-1];
}
stuffs[i]=s;
break;
}
}
}
int main(){
int n,i,j;
char tmpname[]="jahah";
while(cin>>n){
stuff* stuffs[4];
for(i=0;i<4;i++){
stuffs[i]=new stuff(tmpname,-10,10000);
}
char name[10];
int id;
int age;
for(i=0;i<n;i++){
cin>>id>>name>>age;
stuff* s = new stuff(name,id,age);
insertsort(stuffs,s);
}
for(i=0;i<3;i++){
cout<<stuffs[i]->id<<" "<<stuffs[i]->name<<" "<<stuffs[i]->age<<"\n";
}
}
}