NOIP 普及组初赛 · NOIP 2018 普及组初赛试题 第 18 题

阅读程序 · 答案 RuanHuoMianTai · 考点:输入输出、分支结构、循环结构、字符串(string)

← 整套速查表 NOIP 普及组初赛 全部真题

题目

阅读程序写结果:

#include <stdio.h>
char st[100];

int main() {
	scanf("%s", st);
	for (int i = 0; st[i]; ++i) {
		if (‘A’ <= st[i] && st[i] <= ‘Z’)
		st[i] += 1;
	}
	printf("%s\n", st);
	return 0;
}

输入:QuanGuoLianSai

答案:RuanHuoMianTai

考点

输入输出分支结构循环结构字符串(string)

解题思维

这题核心就是模拟字符串遍历:scanf读入整个单词后,循环逐个字符判断,只要是大写字母就ASCII码+1。拿到题先圈出所有大写位置,然后像过电影一样把每个字母往后挪一位,最后拼起来输出。

常见错误

很多学生看到代码里有个if判断,就下意识想‘会不会把小写也改了’或者‘会不会溢出’,其实小写根本没进if,直接跳过。另外有人会把Q当成17,G当成7,然后直接加1得到18和8,再回头找字母表里对应的字母,容易把字母表顺序记混,比如把G当成H(其实G后面是H,没错,但有人会记成G后面是I)。更隐蔽的坑是以为循环条件st[i]是判断字符本身,其实它是判断ASCII码是否为0,也就是字符串结束符。只要记住‘大写字母+1,小写不动’这个铁律,就不会算错。

详细解析(节选)

考点与概念

这题考的是字符串遍历和条件分支。字符串在C里是用字符数组表示的,末尾自动补一个\0。循环条件st[i]就是判断当前字符是不是结束符,是则循环终止。分支里if ('A' <= st[i] && st[i] <= 'Z')就是判断当前字符是不是大写字母。ASCII码里,相邻字母的编码差1,所以st[i] += 1就把当前大写字母变成字母表中的下一个字母。小写字母的ASCII码比对应大写字母大32,但题目里根本没碰小写,所以它们原样保留。

命题视角

NOIP普及组初赛特别喜欢这种‘阅读程序写结果’的题,因为它不考复杂算法,只考对基本语法的理解。命题人通常会在if里设一个范围判断,然后在循环里做简单的数值或字符操作。坑点往往就藏在‘你以为会改,其实不会改’的地方——比如这里的小写字母,或者循环条件里的st[i](很多人会误以为是判断字符本身是否非空,其实它是判断ASCII码是否为0)。另外,字符数组的末尾\0是隐式的,循环条件st[i]刚好利用了这个特性,不需要显式写st[i] != '\0'。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断