信息学奥赛初赛天天练-45-CSP-J2020阅读程序1-字符数组默认值、字符串长度、字符数组长度、ASCII码应用
信息学奥赛初赛天天练-45-CSP-J2020阅读程序1-字符数组默认值、字符串长度、字符数组长度、ASCII码应用
PDF文档公众号回复关键字:20240712
![](https://img2022.cnblogs.com/blog/404484/202211/404484-20221123185906168-1425738362.png)
2020 CSP-J 阅读程序1
1阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)
01 #include <cstdlib>
02 #include <iostream>
03 using namespace std;
04
05 char encoder[26] = {'C','S','P',0};
06 char decoder[26];
07
08 string st;
09
10 int main() {
11 int k = 0;
12 for (int i = 0; i < 26; ++i)
13 if (encoder[i] != 0) ++k;
14 for (char x ='A'; x <= 'Z'; ++x) {
15 bool flag = true;
16 for (int i = 0; i < 26; ++i)
17 if (encoder[i] ==x) {
18 flag = false;
19 break;
20 }
21 if (flag) {
22 encoder[k]= x;
23 ++k;
24 }
25 }
26 for (int i = 0; i < 26; ++i)
27 decoder[encoder[i]- 'A'] = i + 'A';
28 cin >> st;
29 for (int i = 0; i < st.length( ); ++i)
30 st[i] = decoder[st[i] -'A'];
31 cout << st;
32 return 0;
33 }
判断题
16.输入的字符串应当只由大写字母组成,否则在访问数组时可能越界( ) [1.5分]
17.若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样( ) [1.5分]
18.将第 12 行的“i < 26”改为“i < 16”,程序运行结果不会改变( ) [1.5分]
19.将第 26 行的"i < 26”改为“i < 16”,程序运行结果不会改变( ) [1.5分]
20.若输出的字符串为“ABCABCABCA”,则下列说法正确的是( ) [3分]
单选题
20.若输出的字符串为“ABCABCABCA”,则下列说法正确的是( ) [3分]
A.输入的字符串中既有S又有P
B.输入的字符串中既有S又有B
C.输入的字符串中既有A又有P
D.输入的字符串中既有A又有B
21.若输出的字符串为“CSPCSPCSPCSP”,则下列说法正确的是( ) [3分]
A.输入的字符串中既有P又有K
B.输入的字符串中既有J又有R
C.输入的字符串中既有J又有K
D.输入的字符串中既有P又有R
2 相关知识点
1) 字符数组
在 C 语言中,当部分初始化一个数组时(即没有为所有元素提供初始值),未明确初始化的元素将被自动赋值为 0
char encoder[26] = {'C','S','P',0};
//数组实际存储值为
{'C', 'S', 'P', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
2) 字符串长度
#include<bits/stdc++.h>
using namespace std;
/*
通过length()函数获取字符串长度
*/
int main(){
string st="abcdef";
cout<<st.length();//字符串st的长度为6
return 0;
}
3) 字符数组长度
#include<bits/stdc++.h>
using namespace std;
char encoder[] = {'C','S','P',0};
/*
字符数组长度
*/
int main(){
/*
sizeof 求变量内存占用字节数
sizeof(encoder) 数组encoder占用字节数,数组中每个元素都是相同类型,占用字节相同
sizeof(encoder[0])数组第一个元素占用字节数
sizeof(encoder) / sizeof(encoder[0]) 数组元素个数
*/
int length =sizeof(encoder) / sizeof(encoder[0]);
cout<<"字符数组encoder元素个数:"<<length; //输出4 ,encoder有4个元素
return 0;
}
4) ASCII 码
字符是一种图形符号,不同国家不同地区都有自己特殊的字符,于是就衍生了“字符集合”这个名词。其中ASCII (American Standard Code for Information Interchange: 美国信息交换标准代码)是国际通用的标准字符集
例如
char a='0';
char b='P';
char c='@';
char c='65';//ascii 码 对应大写字母A
3 思路分析
1) k值更新
/*
由于encoder数组前面3个字符不是0,所以k被累加3次,累加后k的值为3
*/
05 char encoder[26] = {'C','S','P',0};
11 int k = 0;
12 for (int i = 0; i < 26; ++i)
13 if (encoder[i] != 0) ++k;
2) 填充encoder数组
14 for (char x ='A'; x <= 'Z'; ++x) {//循环填入A~Z 26个大写字母
15 bool flag = true;
16 for (int i = 0; i < 26; ++i)
17 if (encoder[i] ==x) {//26个大写字母是否被填过
18 flag = false;
19 break;
20 }
21 if (flag) {//没填过,填入当期位置
22 encoder[k]= x;
23 ++k;
24 }
25 }
填入对应字符后encoder数组值如下
3) 填入decoder数组
存储encoder元素字母位置对应的ASCII
比如C字母对应ASCII为2,位置为0,对应字母为A,因此在encoder2位置存放A
for (int i = 0; i < 26; ++i)
decoder[encoder[i]- 'A'] = i + 'A';
填入对应字符后decoder数组值如下
4) 根据位置decoder查
根据输入字母的位置到decoder数组查
28 cin >> st;
29 for (int i = 0; i < st.length( ); ++i)
30 st[i] = decoder[st[i] -'A'];
判断题
16.输入的字符串应当只由大写字母组成,否则在访问数组时可能越界( T ) [1.5分]
分析
如果输入的是小写字母a则st[i] -'A'=97-65=32
decoder[st[i] -'A']=decoder[32] 超出数组下标,数字会越界
17.若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样( F ) [1.5分]
分析
由于前面CSP这3个字母打乱了,但从下标19以后,字母顺序就相同了,因此输入的是19~25这些字符,输出也是这些字符
输入和输出有可能一样,所以错误
18.将第 12 行的“i < 26”改为“i < 16”,程序运行结果不会改变( T ) [1.5分]
分析
12行主要是看encoder数组不为0的字符下标累加,encoder数组就前面CSP3个字符,因此26和16都可以正确累加,因此运行结果不变
12 for (int i = 0; i < 26; ++i)
13 if (encoder[i] != 0) ++k;
19.将第 26 行的"i < 26”改为“i < 16”,程序运行结果不会改变( F ) [1.5分]
分析
26行是对decoder进行填充,需要填充26个位置对应字母,如果只到16,只能填充16个字母,根据不同输入,如果用到没被填充的字母,则结果会改变
26 for (int i = 0; i < 26; ++i)
27 decoder[encoder[i]- 'A'] = i + 'A';
单选题
20.若输出的字符串为“ABCABCABCA”,则下列说法正确的是( A ) [3分]
A.输入的字符串中既有S又有P
B.输入的字符串中既有S又有B
C.输入的字符串中既有A又有P
D.输入的字符串中既有A又有B
分析
根据字符的位置去查decoder数组,具体如下图
如果输出为A则需要decoder下标为2,st[i] -'A'=2 所以st[i] 为字母C
如果输出为B则需要decoder下标为18,st[i] -'A'=18 所以st[i] 为字母S
如果输出为C则需要decoder下标为15,st[i] -'A'=15 所以st[i] 为字母P
输入的字符为CSPCSPCSPC,所以选A
29 for (int i = 0; i < st.length( ); ++i)
30 st[i] = decoder[st[i] -'A'];
21.若输出的字符串为“CSPCSPCSPCSP”,则下列说法正确的是( D ) [3分]
A.输入的字符串中既有P又有K
B.输入的字符串中既有J又有R
C.输入的字符串中既有J又有K
D.输入的字符串中既有P又有R
分析
根据字符的位置去查decoder数组,具体如下图
如果输出为C则需要decoder下标为15,st[i] -'A'=15 所以st[i] 为字母P
如果输出为S则需要decoder下标为17,st[i] -'A'=17 所以st[i] 为字母R
如果输出为P则需要decoder下标为13,st[i] -'A'=13 所以st[i] 为字母N
输入的字符为PRNPRNPRNPRN,所以选D
作者:newcode 更多资源请关注纽扣编程微信公众号
从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习