求助 问题 C: 查找学生信息

前言

这是一则求助帖,本人接触此题的时间较早,当时也是一直没有亮绿灯无奈搁置了一会,今天重拾起来依然不能通过,五花八门的错误都出现了:运行错误、编译错误、答案错误。网上扒了一些别人的代码又出现新的错误叫做运行超时,总之无计可施了,希望各路大神指点一二。
说在前面:本文给出的所有代码,在DevC++上皆可成功调试运行,并执行正确的信息查找功能

题目概览

一、题目描述
输入N个学生的信息,然后进行查询。
二、输入
输入的第一行为N,即学生的个数(N<=1000)
接下来的N行包括N个学生的信息,信息格式如下:
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下:
02
03
01
04
样例输入:

5
001 张三 男 19
002 李四 男 20
003 王五 男 18
004 赵六 女 17
005 刘七 女 21
7
003
002
005
004
003
001
006

三、输出
输出M行,每行包括一个对应于查询的学生的信息。
如果没有对应的学生信息,则输出“No Answer!”
样例输出:

003 王五 男 18
002 李四 男 20
005 刘七 女 21
004 赵六 女 17
003 王五 男 18
001 张三 男 19
No Answer!

思路历程与代码

我认为此题本身并不复杂,但一开始为了提高查找的效率,我构建了一个查找表,把学号索引值与数组索引值对应起来。具体来说就是创建一个足够大的整型数组,作为查找表,可将其初始化为全-1,然后在读入学号时,以学号为索引将现在的存储学生信息的数组下标赋值给查找表。后面查找时直接根据输入的学号,找到对应学生信息数组的下标,然后输出即可。
这样处理会产生一个问题,因为显然我在这里把学号当作整型数读取,但输出是以“00X”的格式输出的,当然这里我们可以在输出的时候使用“%03d”的方法加以解决,于是有了下面的代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct student{
	int index;
	char name[10];
	char sex[4];
	int age;
};

int main(){
	int n,m;
	while(scanf("%d",&n)!=EOF){
		student stu[n];
		int id;
		int searchTable[n+10] = {-1};
		for(int i=0;i<n;i++){
			scanf("%d",&id);
			searchTable[id] = i;
			stu[i].index = id;
			scanf("%s %s %d",stu[i].name,stu[i].sex,&(stu[i].age));
		}
		scanf("%d",&m);
		while((m--)!=0){
			scanf("%d",&id);
			if(id>0&&id<=n){
				int index = searchTable[id];
				printf("%03d %s %s %d\n",stu[index].index,stu[index].name,stu[index].sex,stu[index].age);
			}else printf("No Answer!\n");
		}
	}
	return 0;
}

然后codeup报错:
在这里插入图片描述我决定采用朴素的方法查找,放弃查找表,这样我就可以用字符串类型存储学号,并原封不动地输出,以为能有些微的进展:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct student{
	char index[4];
	char name[10];
	char sex[4];
	int age;
};

int main(){
	int n,m;
	while(scanf("%d",&n)!=EOF){
		student stu[n];
		for(int i=0;i<n;i++){
			scanf("%s %s %s %d",stu[i].index,stu[i].name,stu[i].sex,&(stu[i].age));
		}
		scanf("%d",&m);
		while((m--)!=0){
			char id[4];
			scanf("%s",id);
			bool flag = false;
			for(int i=0;i<n;i++){
				if(strcmp(id,stu[i].index)==0){
					printf("%s %s %s %d\n",stu[i].index,stu[i].name,stu[i].sex,stu[i].age);
					flag = true;
					break;
				}
			}
			if(!flag) printf("No Answer!\n"); 
		}
	}
	return 0;
}

然而codeup说你再想想:
在这里插入图片描述我看了网上别人的代码,粘贴过来跑一跑,还是不行,由于它的算法内核跟我一样、输出方式也没什么差别,我无法做出优化。参考博客:起风了的博客

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

struct Students{
	char sno[10];
	char name[100];
	char sex[50];
	int age;
}s[1000];

int main()
{
	int n,m,i,j;
	char str[10];
	while(scanf("%d",&n)!=EOF){
		for(i=0;i<n;i++)
			scanf("%s %s %s %d",s[i].sno,s[i].name,s[i].sex,&s[i].age);
		cin >>m;
		for(i=0;i<m;i++){
			cin >>str;
			for(j=0;j<n;j++)
				if(strcmp(str,s[j].sno)==0){
					printf("%s %s %s %d\n",s[j].sno,s[j].name,s[j].sex,s[j].age);
					break;
				}
			if(j==n)
				printf("No Answer!\n");
		}
	}
	return 0;
}


在这里插入图片描述其实我还走了许多弯路,最开始是按照习惯把查找表以最大容量初始化在了全局空间,然后在main函数里通过memset或fill函数进行初始化的,但是可能是内存超限了,codeup会报运行错误:
在这里插入图片描述codeup数据库存储能力值得称赞~
希望有经验或想法的朋友们在评论区留言交流,感谢您的不吝赐教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值