三、编程题(每题 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) |