内容正文:
CCF-GESP C++二级
CCF-GESP C++二级
编程能力等级认证
1
ASCII编码
ASCII编码
第六课
2
ASCII编码
01
01
3
ASCII编码表
阿拉伯数字0:48
大写字母A:65
小写字母a:97
重点记忆:
ASCII码值:0~127
知识讲解
计算机中,信息都以整数的形式进行存储,所以计算机的科学家们就想了个办法。计算机存储这些字符进行编码,使用一个整数来表示对应的字符,例如整数65表示大写字母A,计算机中存储就是整数65,65就是字符A的编码。编码的方式是统一的。
ASC编码是最古老、最常见的编码方式,ASCII编码是国际通用的编码规则,也是最常见的编码方式。ASCII编码表中,使用了128个整数对128个字符进行编码,包括0~9阿拉伯数字,26个英文大小写字母,以及常用符号。在ASCII码表种有33个控制字符无法显示,剩余95个字符可以正常显示。
我们再来看一下ASCII编码表,ASCII编码值字符对应的编码,范围从0到127,对128个字符进行了编码,码值右边就是编码对应的字符,其中有我们常用的就是阿拉伯数字,大小写字母。其中需要我们重点记忆0、A、a的ASCII码。0的ASCII码为48,A的ASCII码为65,a的ASCII码为97。
4
判断题
(样题)汉字没有对应的ASCII码。
正确 错误
真题解析
C++2级样例试题
解析:在ASCII码中包括0~9阿拉伯数字,26个英文大小写字母,以及常用符号,没有汉字。
5
选择题
(2023年6月)如果 a 为 char 类型的变量,下列哪个表达式可以正确判断"a 是数字"?( )
A. '0' <= a && a <= '9'
B. '1' <= a && a <= '0'
C. '0' <= a <= '9'
D. '1' <= a <= '0'
A
真题解析
解析:本题考察 C++中的比较运算以及数字字符的 ASCII 码;判断两个条件是 否同时成立时,需要把两个条件用&&符号连接起来,C、D 选项不符合要求;数 字字符的 ASCII 码最小的是'0',最大的是'9',所以本题正确答案为 A。
6
字符与数字运算
字符类型数据可以像整数一样进行运算。
参与运算的实际上是字符的ASCII码,都是整数。
char a = 'A';
cout << a+3 << endl;
char b = 'B';
cout << b-2 << endl;
68
64
字符与整数之间进行运算的结果是整数!!!
知识讲解
字符类型数据可以像整数一样进行运算,参与运算的实际上是字符的ASCII码。例如:定义char类型的变量a,存储字符A,计算a+3,其实计算字符A对应的ASCII码加3。字符A的ASCII码为65,也就是65+3等于68。因此输出的计算结果为68。定义char类型的变量b,存储字符B,计算b-2,其实计算字符A对应的ASCII码减2。字符A的BSCII码为66,也就是66-2等于64。因此输出的计算结果为64。注意字符与整数之间进行运算的结果是整数,不是字符。
7
选择题
(2023年3月)如果a是char类型的变量,且a的值为'2',则下列哪条语句执行后,a的值不会变为'3'?( )
a=a+1;
a+1;
a=1+a;
++a;
B
真题解析
解析:B 选项中并未对 a + 1 的结果进行任何处理,变量 a 在计算过程中未发生改变,所以本题正确答案为 B。
8
选择题
(2023年3月)在下列代码的横线处填写( ),可以使得输出是5。
D
#include <iostream>
using namespace std;
int main(){
int cnt=0;
for(char ch='1'; ch<='9'; ch++)
if(_______) //此处填入代码
cnt++;
cout<<cnt<<endl;
return 0;
}
ch<'5'
ch>=5
ch>='4'
ch%2==1
真题解析
解析:cnt初始值为0,最终输出cnt的值是5,证明循环的次数为5次。循环的范围是从字符1到字符9,如果if的条件为ch<'5',则循环次数为4次,ch>=5,循环次数为9次,ch>='4',循环次数为6次。ch%2==1,也就是找ASCII码为奇数的字符个数,字符1到字符9之间,有5个字符符合要求,所以循环次数为5次,所以应该选择选项D
9
判断题
(2023年6月)如果a为char类型的变量,且取值为大写字母'F',则执行语句a=a+1;后,a的值会变为大写字母'G'。
正确 错误
真题解析
解析:a的值为大写字母F,加1之后的值再次保存到了字符变量中,所以结果是比字符F的ASCII码大1的字符G
10
选择题
(2023年6月)如果a为char类型的变量,且a的值为'C'(已知'C'的ASCII码为67)则执行cout<<(a+2);会输出( )。
D
E
C+2
C2
69
真题解析
解析: a+2相当于a的ASCII码加2,字符与整数运算的结果是整数,结果应该是69。
11
字符与字符运算
字符类型数据之间也可以进行运算。
参与运算的实际上也是字符的ASCII码,都是整数。
char c1 = 'c';
char c2 = 'a';
cout << c1-c2 << endl;
2
196
cout << c1+c2 << endl;
字符与字符之间进行运算的结果也是整数!!!
知识讲解
字符除了能跟整数进行运算之外,字符之间也能进行运算。
例如:定义变量c1存储字符c,定义变量c2,存储字符a。令c1-c2,就是使用字符c的ASCII码减字符a的ASCII码,也就是99-97等于2,因此输出结果为2。再令c1+c2,就是使用字符c的ASCII码加字符a的ASCII码,也就是99+97等于196,因此输出结果为196。
由此我们能够看出,字符之间进行运算的结果也是整数!!!并不是字符。
12
判断题
(2023年3月)如果a为char类型的变量,且取值为小写字母,则执行语句a=a-'a'+'A';后,a的值会变为与原值对应的大写字母。
正确 错误
真题解析
解析:算式:a-'a'+'A',可以调整计算顺序为a+('A'-'a'),大小写字母的ASCII码相差32,所以算式可以简化为a-32,由于变量a的值为小写字母,所以ASCII码值减小32之后变为对应的大写字母。
13
数据类型转换
02
02
14
赋值运算时的自动转换:
自动数据类型转换
int a='5';
cout<<a<<endl;
53
int类型
char c=66;
cout<<c<<endl;
B
char类型
int b=3.125;
cout<<b <<endl;
3
int类型
double d='A';
cout<<d<<endl;
65.0
double类型
知识讲解
什么情况下会发生自动数据类型转换呢?第一种情况是在赋值运算时,会发生自动转换。
例如:
1)定义int类型变量a,存储字符5,此时输出a的值为字符5的ASCII码值53,是一个int类型的数据。这种情况下就发生了自动数据类型转换,char类型的数据转换成了int类型的数据。
2)定义int类型变量b,存储小数3.14,此时输出b的值为3,是一个int类型的数据。这种情况下也发生了自动数据类型转换,double类型的数据转换成了int类型的数据。
3)定义char类型的变量c,存储整数66,输出c的值为字符‘B’,这是将int类型的数据转换为了char类型。
4)定义double类型的变量d,存储字符‘A’,输出d的值为65.0,这是将char类型的数据转换为了double类型。
这些情况下都是发生了自动数据类型转换。
15
自动数据类型转换
算术运算时的自动转换:
转换规则:小类型向大类型转换
char
int
long long
float
double
int a=5;
double b=3.14 ;
cout<<a+b<<endl;
8.14
double类型
char c='A';
cout<<a+c<<endl;
70
int类型
cout<<a+b+c<<endl;
73.14
double类型
char s;
s='A'+5;
cout<<s<<endl;
F
char类型
知识讲解
还有一种情况,就是在我们进行多种类型的算术运算时,会发生自动数据类型转换。转换的规则是小类型向大类型转换。
例如:
1)定义int类型变量a,存储整数5,定义double类型变量b,存储小数3.14,两个变量相加之后的结果为8.14,结果为double类型。再这个过程中发生了自动转换,int类型的数据转换为了double类型的数据,计算的结果自然也是double类型。
2)定义char类型变量c,存储字符A,a+c的结果为70,是int类型的数据。这个过程中也是发生了自动转换,char类型的数据,转为了int类型的数据,结果自然也是int类型的数据。
3)当计算a+b+c时,三种类型的数据同时参加运算,结果为double类型。此时char类型和int类型的数据都自动转换成了double类型的数据。
如果当遇到算术运算和赋值运算结合的情况下,此时可能会发生多次数据类型转换。
例如:
定义char类型变量s,将字符A加5的结果赋值给s,‘A’+5,的结果为70,此时发生了一次数据类型转换,char类型转为int类型。整数70保存到char类型的变量中,输出s的值为字符F,此时又发生了一次数据类型转换,int类型转换成了char类型。
16
判断题
(2023年3月)表达式(10.0 / 2)的计算结果为5.0,且结果类型为double。
正确 错误
真题解析
解析:10.0是double类型,2是int类型,结果过程中会将int转为double,结果为5.0,结果类型为double类型。
17
选择题
(2023年3月)如果a、b、c和d都是int类型的变量,则下列哪个表达式能够正确计算他们的平均值?( )
(a+b+c+d)/4
(a+b+c+d)%4
(a+b+c+d)/4.0
(a+b+c+d)%4.0
C
真题解析
解析:计算a、b、c、d的均值需要利用他们的和除4,所以BD选项排除,由于平均值可能是小数,a、b、c、d相加的结果为整数,4也为整数,相除的结果依旧是整数,所以选项A错误。只有选项C是正确的,利用一个整数除小数,得到的结果是小数。
18
选择题
(2023年6月)下列关于C++语言的叙述,正确的是?( )
char类型变量不能赋值给int类型的变量。
两个int类型变量相乘,计算结果还是int类型。
计算两个int类型变量相乘时,如果乘积超出了int类型的取值范围,程序会报错崩溃。
计算两个double类型变量相除时,如果除数的值为0.0,程序会报错崩溃。
B
真题解析
解析:选项A:char类型变量可以赋值给int类型的变量,int类型的变量也同样可以赋值给char类型,所以A错误。选项C:当保存到int类型变量中的数据超出int类型的取值范围时,程序不会崩溃报错,只会丢失一部分数据,所以C错误。选项D:这种情况下,程序不会保存崩溃,输出结果依然是0.0。
19
选择题
(2023年6月)如果用两个int类型的变量a和b分别表达平行四边形的两条边长,用int类型的变量h表达a边对应的高,则下列哪个表达式不能用来计算b边对应的高?( )
a/b*(0.0+h)
(0.0+a*h)/b
a*h/(b+0.0)
(a+0.0)*h/b
A
真题解析
解析:本题可以借助平行四边形的面积。平行四边形面积=边长*高。通过边长a和对应的高相乘可以计算机平行四边形的面积。再用该面积除b,即可得到b边对应的高。其中只有选项A是错误的。
20
判断题
(2023年9月)C++表达式 7.8 / 2 的值为 3.9 ,类型为float。
正确 错误
真题解析
解析:7.8是double类型,2是int类型,结果过程中会将int转为double,结果为3.9,结果类型为double类型,是不是float类型。
21
强制数据类型转换
//将变量a的值转化为char类型
int a=65;
cout<<(char) a<<endl;
//将数值65转化为char类型
cout<<(char) 65<<endl;
A
A
强制数据类型转换格式一: (数据类型)变量
//将变量a的值转化为char类型
int a=65;
cout<<char (a)<<endl;
//将表达式a+b的结果转化为char类型
int b=1;
cout<<char (a+b)<<endl;
A
B
强制数据类型转换格式二: 数据类型(变量或表达式)
知识讲解
除了自动数据类型转换以外,我们还能够进行强制数据类型转换。
有两种转换的方式,第一种的格式为:(数据类型)变量。
例如:
1)定义int类型变量a,赋值为65,可以通过(char)a将65强制转换为字符A,注意转换之后a中保存的内容是不变的。
2)另外还可以直接通过(char)65 将数值65转换为字符A。
除了上述讲解的方式还有一种强制数据类型转换的格式: 数据类型(变量或表达式)
例如:
1)定义int类型变量a,赋值为65,可以通过char (a) 将变量a的值转成char类型,输出结果为字符A。
2)另外这种写法还可以转换表达式的结果。定义int类型变量a,赋值为1,可以通过char (a+b),将表达式的结果转换为char类型,输出的结果为字符B。
22
判断题
(2023年6月)如果a是double类型的变量,而且值为3.5,则表达式a*10的计算结果为35,且结果类型为int 。
正确 错误
真题解析
解析:a为doule类型的变量,10为int类型的数据,a*10会发生数据类型转换,结果依旧为double类型。
23
(2023年6月)如果a为int类型的变量,b为char类型的变量,则下列哪个语句不符合C++语法( )。
a=a+1.0;
a=(int)(b-'0');
b=(char)(a+'0')。
(int)b=a;
D
选择题
真题解析
解析:本题主要考察 C++中数据类型转换的规则;强制类型转换得到的是改变类型的值,不再是能被赋值的变量;所以本题正确答案为 D。
24
选择题
(2023年6月)在下列代码的横线处填写( ),使得输出是9。
D
(a+b)
(a+b-'0')
(char)(a+b)
(char)(a+b-'0')
#include <iostream>
using namespace std;
int main(){
char a='3', b='6';
cout<<________; //此处填入代码
return 0;
}
真题解析
解析:
在C++中,字符'3'和'6'在内存中是以ASCII码的形式存储的。'3'的ASCII码是51,'6'的ASCII码是54。因此,a+b的结果是51 + 54 = 105。
选项D中的表达式(char)(a+b-'0'):
a+b的结果是105。
'0'的ASCII码是48,所以'0'被减去后,结果是105 - 48 = 57。
57对应的字符是'9',因此程序输出结果为9。
所以,正确答案是选项D。
25
选择题
(2023年9月)C++表达式 int(-123.123 / 10) 的值是( )。
D
-124
-123
-13
-12
真题解析
解析:-123.123/10的结果为-12.3123,使用int()会将数据-12.3123强制转换为-12。
26
变换密码
【问题描述】
一密码变换规则如下:一个正整数对应一个字符;
如果该数对123取余的值在97-122范围,将余数作为变换后字符密码的ASCII码,此时变换后的字符密码为小写字母;
如果变换不了小写字母,将该数对91取余,若余数在65-90范围,依旧将余数作为变换后字符密码的ASCII码,此时变换后的字符密码为大写字母;
如果变换不了大小写字母,直接变换为"*"。
输入一个正整数,输出变换后的字符。
【输入描述】
输入一个正整数n(1≤n≤1000),表示原始密码。
【输出描述】
输出变换后的密码。
【输入样例】
42
【输出样例】
*
97 ≤ 42%123 ≤ 122
65 ≤ 42%91 ≤ 90
课堂练习
27
思路分析
1、创建变量n保存整数密码。
int n;
cin>>n;
2、将整数密码变换成字符密码。
变换规则:
如果 97 ≤ (n%123) ≤ 122
变换后字符密码的ASCII码:n%123;
否则如果 65 ≤ (n%91) ≤ 90
变换后字符密码的ASCII码:n%91;
否则 变换为"*"
课堂练习
28
思路分析
2、将整数密码变换成字符密码。
char b; //存储字符密码
if(n%123>=97&&n%123<=122)
b=n%123;
else if(n%91>=65&&n%91<=90)
b=n%91;
else
b='*';
cout<<b;
变换规则:
如果 97 ≤ (n%123) ≤ 122
变换后字符密码的ASCII码:n%123;
否则如果 65 ≤ (n%91) ≤ 90
变换后字符密码的ASCII码:n%91;
否则 变换为"*"
课堂练习
【完整代码】
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
char b;
if(n%123>=97&&n%123<=122)
b=n%123;
else if(n%91>=65&&n%91<=90)
b=n%91;
else
b='*';
cout<<b;
return 0;
}
课堂练习
完整代码
30
感谢你的学习
31
$$