PAT 乙级 1072 开学寄语(C语言代码+分析)

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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值