「PAT乙级真题解析」Basic Level 1072 开学寄语 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求查找学生携带的物品中是否有被禁止的物品。这涉及到"查找/搜索"。 由于物品编号是正整数, 所以我们可以用C的数组来存储禁止携带的物品编号, 数组索引作为编码, 索引位置值为1代表禁止携带。 搜索时只需要用学生携带的物品编号按索引查询数组对应位置的值是否为1, 就可以知道是否是禁止携带的物品。

#算法#数据结构#c语言#需求分析#pat考试

Table of Contents

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT乙级BasicLevelPractice 1072 开学寄语

问题分析

题设要求查找学生携带的物品中是否有被禁止的物品。这涉及到"查找/搜索"。 由于物品编号是正整数, 所以我们可以用C的数组来存储禁止携带的物品编号, 数组索引作为编码, 索引位置值为1代表禁止携带。 搜索时只需要用学生携带的物品编号按索引查询数组对应位置的值是否为1, 就可以知道是否是禁止携带的物品。

完整描述步骤

  1. 获取输入: 学生人数, 禁止携带的物品数目
  2. 初始化记录器:
    • 禁止携带的物品记录器
    • 学生携带的违禁物品个数
    • 携带的物品有问题的学生个数
  3. 对于每一个禁止携带的物品:
    • 获取输入: 物品编号
    • 禁止携带的物品记录器[物品编号] = 1
  4. 对于每一个学生, 检查其携带的物品:
    • 初始化记录器:
      • 学生携带的物品存在违禁物品 = 0
    • 对于每一个物品的编号:
      • 如果禁止携带的物品记录器[物品编号] == 1, 则:
        • 如果是该学生第一件违禁物品, 输出学生名称
        • 学生携带的物品存在违禁物品 = 1
        • 学生携带的违禁物品个数+1
        • 输出违禁物品编号
    • 如果 学生携带的物品存在违禁物品 == 1:
      • 携带的物品有问题的学生个数+1
  5. 输出携带的物品有问题的学生个数和学生携带的违禁物品个数

伪代码描述

  1. get input: student_amount, baned_things_amount
  2. init recorder:
    • baned_counter = {0};
    • studen_with_baned_thing_amount = 0;
    • student_lost_thing_amount = 0;
  3. for each baned_thing:
    • baned_counter[baned_thing] = 1
  4. for each student:
    • init counter: baned_count = 0;
    • for each thing:
      • if baned_counter[thing_ID] == 1:
        • if baned_count == 0:
          • print(student name)
        • baned_count += 1;
        • print(baned_thing_ID)
    • if baned_count > 0:
      • studen_with_baned_thing_amount += 1;
      • student_lost_thing_amount += baned_count;
  5. print(studen_with_baned_thing_amount, student_lost_thing_amount);

完整提交代码

/*
# 问题分析
题设要求查找学生携带的物品中是否有被禁止的物品。这涉及到"查找/搜索"。
由于物品编号是正整数, 所以我们可以用C的数组来存储禁止携带的物品编号, 数组索引作为编码, 索引位置值为1代表禁止携带。
搜索时只需要用学生携带的物品编号按索引查询数组对应位置的值是否为1, 就可以知道是否是禁止携带的物品。
 
# 完整描述步骤
1. 获取输入: 学生人数, 禁止携带的物品数目
2. 初始化记录器:
    - 禁止携带的物品记录器
    - 学生携带的违禁物品个数
    - 携带的物品有问题的学生个数
3. 对于每一个禁止携带的物品:
    - 获取输入: 物品编号
    - 禁止携带的物品记录器[物品编号] = 1
4. 对于每一个学生, 检查其携带的物品:
    - 初始化记录器:
        - 学生携带的物品存在违禁物品 = 0
    - 对于每一个物品的编号:
        - 如果禁止携带的物品记录器[物品编号] == 1, 则:
            - 如果是该学生第一件违禁物品, 输出学生名称
            - 学生携带的物品存在违禁物品 = 1
            - 学生携带的违禁物品个数+1
            - 输出违禁物品编号
    - 如果 学生携带的物品存在违禁物品 == 1:
        - 携带的物品有问题的学生个数+1
5. 输出携带的物品有问题的学生个数和学生携带的违禁物品个数
 
# 伪代码描述
1. get input: student_amount, baned_things_amount
2. init recorder:
    - baned_counter = {0};
    - studen_with_baned_thing_amount = 0;
    - student_lost_thing_amount = 0;
3. for each baned_thing:
    - baned_counter[baned_thing] = 1
4. for each student:
    - init counter: baned_count = 0;
    - for each thing:
        - if baned_counter[thing_ID] == 1:
            - if baned_count == 0:
                - print(student name)
            - baned_count += 1;
            - print(baned_thing_ID)
    - if baned_count > 0:
        - studen_with_baned_thing_amount += 1;
        - student_lost_thing_amount += baned_count;
5. print(studen_with_baned_thing_amount, student_lost_thing_amount);
 
*/
 
# include<stdio.h>
 
int baned[10000] = {0};
 
int main(){
    int student_amount, baned_things_amount;
    scanf("%d %d", &student_amount, &baned_things_amount);
 
    int baned_thing_ID;
    for (int i = 0; i < baned_things_amount; i++){
        scanf("%d", &baned_thing_ID);
        baned[baned_thing_ID] = 1;
    }
    
    
    int studen_with_baned_thing_amount = 0;
    int student_lost_thing_amount = 0;
    char name[5];
    int thing_amount, thing_ID;
    for (int i = 0; i < student_amount; i++){
        scanf("%s %d", name, &thing_amount);
        int baned_count = 0;
        for (int j = 0; j < thing_amount; j++){
            scanf("%d", &thing_ID);
            if (baned[thing_ID] == 1){
                if (baned_count == 0){
                    printf("%s:", name);
                }
                printf(" %04d", thing_ID);
                baned_count++;
            }
        }
        
        if (baned_count > 0){
            studen_with_baned_thing_amount++;
            student_lost_thing_amount += baned_count;
            printf("\n");
        }
    }
    
    printf("%d %d", studen_with_baned_thing_amount, student_lost_thing_amount);
    return 0;
}
「PAT乙级真题解析」Basic Level 1072 开学寄语 (问题分析+完整步骤+伪代码描述+提交通过代码) | 生活糖果