题目
输入N个学生的信息,然后进行查询
输入
输入的第一行为N,即学生的个数(N<=1000)
接下来的N行包括N个学生的信息,信息格式如下:
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下:
02
03
01
04
输出
输出M行,每行包括一个对应于查询的学生的信息。
如果没有对应的学生信息,则输出“No Answer!”
案例
5
001 张三 男 19
002 李四 男 20
003 王五 男 18
004 赵六 女 17
005 刘七 女 21
7
003
002
005
004
003
001
006
003 王五 男 18
002 李四 男 20
005 刘七 女 21
004 赵六 女 17
003 王五 男 18
001 张三 男 19
No Answer!
代码
正确代码转载于计算机考研复试真题
/*
程序设计思想:声明一个学生信息结构体或类,初始化一个结构体类型的向量。然后读入信息,按要求匹配信息并输出即可。
*/
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct stuInfo{
string id; //
string name; //
string sex; //
int age; //
};
int main(){
int N=0;
while(cin>>N){
vector<stuInfo>stu(N);
for(int i=0;i<N;++i){ //读入学生信息
cin>>stu[i].id>>stu[i].name>>stu[i].sex>>stu[i].age;
}
string ids[10000]; //保存匹配学号
int M=0;
cin>>M;
for(int i=0;i<M;++i){ //读入匹配学号
cin>>ids[i];
}
for(int i=0;i<M;++i){ //进行匹配
bool flag=false; //看有没有对应的学生信息的哨兵
for(int j=0;j<N;++j){
if(ids[i]==stu[j].id){
flag=true; //说明有对应的学生信息
cout<<stu[j].id<<" "<<stu[j].name<<" "<<stu[j].sex<<" "<<stu[j].age<<endl;
break;
}
}
if(!flag){
cout<<"No Answer!"<<endl;
}
}
}
return 0;
}
自己写的【答案错误】
#include <stdio.h>
#include <iostream.h>
const int stu_num = 1000;
const int max = 10000;
struct Student{
char name[20];
int num;
char sex[1];
int age;
};
int main(){
struct Student stu[stu_num];
int n,m;
int num[max];
int flag = 0;
while(scanf("%d",&n) != EOF){
for(int i=0;i<n;i++){
getchar();
scanf("%s",stu[i].num);
scanf("%s",stu[i].name);
scanf("%s",stu[i].sex);
scanf("%d",&stu[i].age);
}
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d",&num[i]);
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(stu[j].num == num[i]){
flag = 1;
printf("%03d %s %s %d\n",stu[j].num,stu[j].name,stu[j].sex,stu[j].age);
}
}
if(flag == 0){
printf("No Answer!\n");
}
flag = 0;
}
}
return 0;
}
代码答案错误分析
- 代码逻辑没有错,
错误的地方在于“03%d”
- 因为
测试时输入的学号不一定是三位数
,可能是四位数、五位数,并且输入的数据可能类似于00045 输出的时候前面的0就会自动去掉
,不能保证输出和输入一致- 所以只能用c++的cin和cout,来保证输入输出一致