欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

2023年 6月 GESP C++ 三级真题解析 编程题

时间:2024-05-21 13:10 作者:lizq 点击:
三、编程题(每题 25 分,共 50 分) 1. 春游 【问题描述】 老师带领同学们春游。已知班上有N位同学,每位同学有从0 到N−1的唯一编号。到了集合时间,老师确认是否所有同学都到达了

三、编程题(每题 25 分,共 50 分)
1. 春游
【问题描述】
   老师带领同学们春游。已知班上有N位同学,每位同学有从0 到N−1的唯一编号。到了集合时间,老师确认是否所有同学都到达了集合地点,就让同学们报出自己的编号。到达的同学都会报出的编号,不会报出别人的编号,但有的同学很顽皮,会多次报出。你能帮老师找出有哪些同学没有到达吗?

【输入描述】
   输入包含 2 行。

   第一行包含两个整数N和M,表示班级有N位同学,同学们共有M次报出编号。约定 2 ≤ N, M ≤ 1000。
   第二行包含M个整数,分别为M次报出的编号。约定所有编号都在合理范围内。
【输出描述】
   输出一行。如果所有同学都到达,则输出N;否则由小到大输出所有未到达的同学编号,空格分隔。
【样例输入 1】

3 3
0 2 1

【样例输出 1】

3

【样例输入 2】

3 5
0 0 0 0 0

【样例输出 2】

1 2

【解题思路】
   1. 使用 arrive 数组来记录每个同学是否到达,初始为false,表示没有到达。

   2. 每有一个同学报出编号,就将 arrive 数组对应的编号改为true。

   3. 遍历 arrive 数组,将数组中对应位置为 false 的下标输出并特判所有人均到达的情况。
【考纲知识点】

   循环结构(一级),模拟法、一维数组(三级)

【参考程序】

#include <iostream>
using namespace std;
bool arrive[1000];
int main() {
    int n = 0, m = 0;
    cin >> n >> m;
    // 初始化 arrive 数组为所有同学均未报到
    for (int i = 0; i < n; i++)
        arrive[i] = false;
    // 依次报到 m 次
    for (int i = 0; i < m; i++) {
        int code = 0;
        cin >> code;
        arrive[code] = true;
    }
    // 依次检查 n 位同学是否到达
    bool all = true;
    for (int i = 0; i < n; i++) {
        if (!arrive[i]) {
            if (all) {
                cout << i;
                all = false;
            } else {
                cout << " " << i;
            }
        }
    }
    // 处理全部到达的特殊情况
    if (all)
        cout << n;
    cout << endl;
    return 0;
}

2. 密码合规检测
【问题描述】
   网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求:
   1、只能由 a-z 之间 26 个小写字母、A-Z 之间 26 个大写字母、0-9 之间10个数字以及!@#$四个特殊字符构成。
   2、密码最短长度:6 个字符,密码最大长度:12 个字符。3、大写字母、小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。
【输入描述】
   输入一行不含空格的字符串。约定长度不超过 100。该字符串被英文逗号分隔为多段,作为多组被检测密码。
【输出描述】
   输出若干行,每行输出一组合规的密码。
   输出顺序以输入先后为序,即先输入则先输出。
【样例输入 1】

seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!

【样例输出 1】

seHJ12!@
sjdkffH$123

【样例解释 1】
   输入被英文逗号分为了四组被检测密码:“seHJ12!@”、“sjdkffH$123”、“sdf!@&12HDHa!”、“123&^YUhg@!”。其中,“sdf!@&12HDHa!”长度超过12 个字符,不合规;“123&^YUhg@!”包含四个特殊字符之外的字符“^”,不合规。

【解题思路】
   1. 首先遍历输入的字符串 line 并按照','进行分隔。
   2. 对于分隔出来的每一个密码,先判断密码长度是否符合要求,然后遍历所有的字符,并用 hasC,hasL,hasD,hasS 分别记录是否存在大写字母,小写字母,数字以        及特殊字符,若存在以上四种字符外的其它字符则直接返回非法。
   3. 判断是否存在特殊字符,若不存在返回非法。
   4. 判断是否存在两种及以上的大写字母、小写字母和数字,若不存在返回非法。

   5. 以上情况都存在,返回合法并输出。
【考纲知识点】

   多层分支/循环结构(二级),模拟法、字符串(三级)

【参考程序】

#include <iostream>
using namespace std;
char line[101];
char pwd[101];
// 检查从 str 开始、长度为 l 的密码是否合规
bool check(char * str, int l) {
    if (l < 6 || l > 12)
        return false;
    bool hasC = false, hasL = false, hasD = false, hasS = false;
    for (int i = 0; str[i] != '\0'; i++) {
        if ('A' <= str[i] && str[i] <= 'Z') {
            hasC = true;
        } else if ('a' <= str[i] && str[i] <= 'z') {
            hasL = true;
        } else if ('0' <= str[i] && str[i] <= '9') {
            hasD = true;
        } else if (str[i] == '!' || str[i] == '@' ||
str[i] == '#' || str[i] == '$') {
            hasS = true;
        } else
            return false;
    }
    if (!hasS)
        return false;
    if (hasC + hasL + hasD < 2)
        return false;
    return true;
}
int main() {
    cin >> line;
    // 按逗号对输入进行切分,并依次判断
    int len = 0;
    for (int i = 0; line[i] != '\0'; i++) {
        if (line[i] != ',') {
            pwd[len] = line[i];
            len++;
        } else {
            pwd[len] = '\0';
            if (check(pwd, len))
                cout << pwd << endl;
            len = 0;
        }
    }
    if (len > 0) {
        pwd[len] = '\0';
        if (check(pwd, len))
            cout << pwd << endl;
    }
    return 0;
}


(责任编辑:lizq)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%