信息学奥赛初赛天天练-45-CSP-J2020阅读程序1-字符数组默认值、字符串长度、字符数组长度、ASCII码应用

信息学奥赛初赛天天练-45-CSP-J2020阅读程序1-字符数组默认值、字符串长度、字符数组长度、ASCII码应用
PDF文档公众号回复关键字:20240712

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

posted @ 2024-07-12 17:40  new-code  阅读(1)  评论(0编辑  收藏  举报