阅读程序 · 答案 120 112 · 考点:ASCII编码、循环结构、运算符与表达式、模拟
← 整套速查表 NOIP 普及组初赛 全部真题阅读程序写结果:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
char m1, m2;
int i;
getline(cin, s);
m1 = ' ';
m2 = ' ';
for (i = 0; i < s.length(); i++)
if (s[i] > m1) {
m2 = m1;
m1 = s[i];
}
else if (s[i] > m2)
m2 = s[i];
cout<<int(m1)<<' '<<int(m2)<<endl;
return 0;
} 输入:Expo 2010 Shanghai China 输出:_________
提示:
| 字符 | 空格 | '0' | 'A' | 'a' |
|---|---|---|---|---|
| ASCII码 | 32 | 48 | 65 | 97 |
这题就是考ASCII码大小关系和循环找最大、次大值的逻辑。拿到输入先别急着跑代码,心里过一遍:空格最小,数字其次,大写字母再其次,小写字母最大。字符串里只要出现小写字母,最大值肯定在小写字母里找。
很多初学者会忽略大小写对ASCII的影响,以为字母顺序就是大小顺序,或者把空格当成0处理,导致找错最大值。还有人在找次大值时,没考虑到当最大值更新时,原来的最大值要自动降级为次大值,而不是只保留原来的次大值。比如遇到'x'时,'p'还没被识别为次大,这时候要先把'p'赋值给m2,再把'x'给m1,否则结果会错。
这道题考查的是ASCII编码的大小关系、字符与整数的转换(int(char))、以及循环中同时维护最大值和次大值的逻辑。命题人喜欢在这种“找最大/次大”的题目里挖坑:
1. 大小写陷阱:大写字母(65-90)比小写字母(97-122)小,但字母表顺序里大写在前。如果学生按字母表顺序想,就会误判。 2. 空格与数字:空格(32)是最小的,数字(48-57)次之,容易被忽略。 3. 次大值更新逻辑:当发现一个比当前最大值还大的字符时,原来的最大值必须“降级”为次大值,否则结果错误。
int(char):把字符转成它的ASCII数字。getline(cin, s):读一整行字符串,包括空格。m1存当前最大的字符(ASCII值),m2存次大的字符。