1. 题目
本题要求你写个程序帮助这所学校的老师检查所有学生的物品,以助其成大器
2. 输入格式:
输入第一行给出两个正整数 N(≤ 1000)和 M(≤ 6),分别是学生人数和需要被查缴的物品种类数。第二行给出 M 个需要被查缴的物品编号,其中编号为 4 位数字。随后 N 行,每行给出一位学生的姓名缩写(由 1-4 个大写英文字母组成)、个人物品数量 K(0 ≤ K ≤ 10)、以及 K 个物品的编号。
3. 输出格式:
顺次检查每个学生携带的物品,如果有需要被查缴的物品存在,则按以下格式输出该生的信息和其需要被查缴的物品的信息(注意行末不得有多余空格):
姓名缩写: 物品编号1 物品编号2 …… |
---|
最后一行输出存在问题的学生的总人数和被查缴物品的总数。
4. 输入样例:
4 2
2333 6666
CYLL 3 1234 2345 3456
U 4 9966 6666 8888 6666
GG 2 2333 7777
JJ 3 0012 6666 2333
5. 输出样例
U: 6666 6666
GG: 2333
JJ: 6666 2333
3 5
6. 分析:
- 注意要将编号用字符串的形式保存,不然无法输出0001这样的编号
- 注意goods数组大小不能为4,要给空格留一个,不然后面的东西保存不上
7. 代码:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
bool judge(char *a,char ban[][5],int N)
{
bool flag;
int i;
flag=false;
for(i=0;i<N;i++)
if(strcmp(a,ban[i])==0)
{
flag=true;
break;
}
return flag;
}
int main()
{
int N,M;
int i,j;
char ban[6][5]; //需要被查缴的物品
char name[5];
char goods[5]; //当前同学的物品集合
int num; //当前同学的物品数量
int p; //当前同学违禁物品的数量
int count1,count2,max;
char temp[11][5]; //当前同学违禁物品集合
scanf("%d %d",&N,&M);
for(i=0;i<M;i++)
scanf("%s",ban[i]);
count1=0;
count2=0;
for(i=0;i<N;i++)
{
memset(temp,'0',sizeof(temp));
scanf("%s %d",name,&num);
p=0;
for(j=0;j<num;j++)
{
scanf("%s",goods);
if(judge(goods,ban,M)) //判断物品是否是违禁
strcpy(temp[p++],goods);
}
if(p!=0) //若该同学存在违禁物品
{
printf("%s: ",name);
for(j=0;j<p;j++)
{
if(j!=p-1)
printf("%s ",temp[j]);
else
printf("%s\n",temp[j]);
}
count1++;
count2+=p;
}
}
printf("%d %d",count1,count2);
}