(共31张PPT)
第五章 字符型数据 位运算
主要内容
第一节 字符编码
第二节 字符型数据
第三节 字符型数据的输入输出
第四节 位运算
第一节 字符编码
计算机中的数据分为数值型和非数值型两大类。
无论是数值型数据和非数值型的数据,在计算机中都是以二进制的形式存放的。
国际上通用的字符包括:大小写英文字母、运算符、标点符号、数字和不可打印的控制符号,合计不超过128个。
国际上通用的是美国标准信息交换码,ASCII码。见书p140
第二节 字符型数据
一、字符型常量
字符常量是用一对单引号括起来的一个字符。如‘a’、‘B’、‘>’、‘?’等都是字符常量。作为字符常量的小写字母a,在程序中写成‘a’,以便和标识符a区别开来。
关于字符常量,以下有几点说明:
(1)其中单引号只是作为定界符使用,并不是字符常量的组成部分,也就是说在输出字符常量时,一对单引号并不被输出。
(2)单引号中的大写字母和小写字母代表不同的字符常量,如‘A’和‘a’是不同的字符常量。
(3)被一对单引号括起来的字符不允许是单引号或反斜杠,即‘’’或‘\’。
(4)字符常量只能包含一个字符,故‘abc’是不合法的。
(5)在C语言中,字符常量具有数值,这个值就是该字符在规定的字符集中的ASCII代码值。在ASCII字符集中的256个字符的值为0~255。如‘a’的值为97,‘A’的值为65。
(6)字符常量在机器内以整型常量的形式存放,占一个字节。因此,字符常量与整型常量等价。也就是说,字符常量可以像整数一样,在程序中参与各种运算。
※重点提示:字符常量只是单个的字符,而且与标识符之间是有区别的,标识符不带有单引号,而字符常量必须使用单引号。
转义字符常量
除了以上形式的字符常量外,C语言还允许用一种特殊形式的字符常量,即以一个“\”开头的字符序列。
例如,在printf函数中的‘\n’,这里的“n”不代表字母n而作为“换行”符。这类字符称为转义字符,又称为反斜线字符,意思是将反斜杠(\)后面的字符转换成另外的意义。其特点是都以“\”开头。
字符形式 功能
\n 回车换行,将光标从当前位置移到下一行开头
\t 横行跳格,相当于TAB键,光标从当前位置跳到下一个TAB位置
\b 退格,光标从当前位置向左退一格
\r 回车不换行,光标从当前位置移到本行开头
\f 换页,将光标从当前位置移到下一页开头
\\ 反斜杠字符“\”
\’ 单引号字符(撇号)
\’’ 双引号字符
\ddd 1~3位八进制数代码对应的字符
\xhh 1~2位十六进制数代码对应的字符
以下是关于转义字符的几点说明:
1.转义字符常量只代表一个字符。
2.反斜杠后的八进制数可以不用0开头,如‘\141’代表的就是字符常量‘a’。
3.反斜杠后的十六进制数只能以小写字母x开头,不允许用大写X,也不能用0x开头,如‘\x41’是代表字符常量‘A’。
※重点提示:转义字符常量,均以一个“\”开头。若要输出一个\字符,则输出格式应为’\\’。
二、字符变量
字符变量就是值为单个字符的变量。
字符型变量的说明格式为:
char 变量名表;
1.字符变量在内存中占一个字节,只能存放一个字符,可以是ASCII字符集中的任何字符。当把字符放入字符变量中时,字符变量中的值就是该字符的ASCII值。
2.在合法的取值范围内,字符型变量与整型变量可以通用。
3.字符型数据输入、输出形式灵活多样。一字符数据既可以以字符形式输出,也可以以整数形式输出。
※重点提示:字符变量可以作为整型变量来处理,可以参与对整型变量所允许的任何运算。
三、可对字符量进行的运算
由于字符量具有数值,在机器内也是以整型常量的形式存放,因此字符可参与任何整数运算。
1.利用算术运算实现大写字母与小写字母的互换。
例如: ‘A’+32≡65+32≡’a’
‘b’-32≡98-32≡’B’
2.利用算术运算实现字符与整数值之间的互换。
例如: ‘9’﹣’0’≡57﹣48≡9
表达式中,57、48分别是用十进制表示的字符‘9’、’0’的ASCII代码值。注意,编程时要分清整数9和字符9的区别。
3.字符常量也可以进行关系运算。
例如: ‘a’<’b’
在ASCII代码表中,’a’的值是97,小于’b’的值98,所以关系运算的结果为“真”。
4.字符常量还可以进行逻辑运算。
例如: ‘a’&&’b’的逻辑值为1。
※重点提示:字符常量在机器内以整型常量的形式存放,占一个字节。因此,字符常量与整型常量等价。也就是说,字符常量可以像整数一样,在程序中参与各种运算。
第三节 字符的输入和输出
6.3.1 调用printf和scanf函数输出和输入字符
用printf函数输出字符时须使用格式说明%c,但可以在格式字符前加一整数m,用来指定输出字符的宽度。
调用scanf函数可以输入字符。也须使用格式说明符号%,且输入的字符变量前必须加&.以下是几点关于scanf输入字符的几点说明:
(1)当使用的格式说明符%c一个紧接着一个,在输入的时候字符之间没有间隔符时,空格、回车和横向跳格符都将按字符读入。
(2)在格式控制串中可以加入空格。
(3)格式控制符前也可以加一整数m,用来指定输入数据所占宽度。这时在输入字符数据时,应严格按指定的宽度输入数据,且取指定宽度中的第一个字符作为输入的数据。
(4)当从键盘输入字符,并且在格式说明中并未指定宽度时,输入的字符将按顺序赋予各输入项。
printf和scanf函数的输入格式符可以参考第三章中的详细说明。
以下是scanf函数应用举例。
例如:求方程ax2+bx+c=0的根。其中a,b,c由键盘输入,设b2-4ac>0。
#include
main()
{ float a,b,c,disc,x1,x2,p,q;
printf("Please enter float a,b,c:\n");
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
disc=b*b-4*a*c;
p=-b/(2*a);
q=sqrt(disc)/(2*a);
x1=p+q; x2=p-q;
printf("\n\nx1=%5.2f\nx2=%5.2f\n",x1,x2);}
程序运行结果为:
x1=-0.37
x2= 5.37
说明:
(1)该程序是利用如下一元二次方程的求根公式来求解的:
再将此公式分为两项:
则方程两根可表示为:
,
,
(2)程序第9行中sqrt()是求平方根函数。由于要调用数学函数库中的函数,因此必须在程序的开头用预处理命令#include,把头文件“math.h”包含到程序中来。请注意,以后凡是在程序中要用到数学函数库中的函数,都应当这样处理。
※重点提示:用printf函数输出以及用scanf函数输入字符都必须使用格式说明%c。
6.3.2 调用putchar和getchar函数输出和输入字符
1.putchar()函数
putchar的作用是向终端设备输出一个字符。
其一般形式为:putchar(参数)
(1)在一个函数中要调用putchar函数,应在该函数的前面(或本文件开头)加上编译预处理语句:
#include
(2)putchar函数的参数可以是字符变量或字符常量或整型变量,也可以是某个字符对应的ASCII码值,还可以是表达式。并且还可以是控制字符,如‘\n’,它的作用是回车换行,即使输出的当前位置移到下一行的开头。
(3)putchar函数使用举例
2.getchar()函数
getchar函数的作用是向终端设备输入一个字符。
其一般形式为: getchar()
getchar函数不需要参数,函数的值是从输入设备得到的字符。该函数的使用方式有两种:
(1)把函数getchar得到的字符代码赋给一个字符型或整型变量。例如:
int a; a=getchar();
(2)把函数getchar得到的字符代码直接作为表达式的一部分,而不赋给任何变量。例如:printf("%c",getchar());
(3)getchar函数使用举例
①从键盘上输入一个字符,然后显示该字符及其十进制、八进制、十六进制的ASCII码值。
#include
main()
{ int a;
printf("Please enter a character: ");
a=getchar();
printf("%c\t%d\t%o\t%x\n",a,a,a,a);
}
程序运行结果为:
Please enter a character: F<回车>
F 70 106 46
② 试利用getchar函数与putchar函数显示由键盘输入的一个字符
#include
main()
{
char c1;
c1=getchar();
putchar(c1);
}
程序运行结果为:
M<回车>
M
说明:putchar函数的参数可以是表达式,因此上述程序的第3、4、5行可以简化为一条语句:putchar(getchar());
该语句中的putchar参数是函数getchar。
第四节 位运算
C 既具有高级语言的特点,又具有低级语言的功能,位运算能力就是其特色之一。
位运算就是指进行二进制位的运算。C提供的位运算有:
名称 运算符 名称 运算符
按位与 & 按位异或
按位或 左移 <<
取反 ~ 右移 >>
注意:按位求反(~)运算符为单目运算符,优先级最高;其他为双目运算符,结合行自左向右。位运算的运算对象只能是整型或者字符型数据。
一、按位求反(~)
求反运算符~为单目运算符,具有右结合性。
一般形式:~a
运算功能是把a的各二进位按位求反。
例如,~9的运算为:
~(0000000000001001)结果为:
1111111111110110
二、左移(<<)
左移运算符“<<”是双目运算符。
一般形式:a<运算功能:将a的各二进制位向左移动i位。右端补0,左端溢出的部分舍弃。
例如: a<<4;
指把a的各二进位向左移动4位。如a=00001101(十进制13),左移4位后为11010000(十进制-48)。
三、右移(>>)
右移运算符“>>”是双目运算符。
一般形式:a>>i
运算功能:将a的各二进制位向右移动i位。右端溢出的部分舍弃;若a为无符号整数或正整数,左端补0 ;若a为负整数,左端补1。
例如: a>>2;
指把a的各二进位向右移动2位。如a=00001101(十进制13),左移2位后为00000011(十进制3)。
四、按位与(&)
按位与“&”是双目运算符。
一般形式:a&b
运算功能:参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。
例如,3&9=1: 0011
& 1001
────
(0001)2=(1)10
五、按位异或(^)
按位异或“^”是双目运算符。
一般形式:a^b
运算功能:参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1,否则为0。
例如,9&5=12: 1001
& 0101
────
(1100)2=(12)10
六、按位或(|)
按位或“|”是双目运算符。
一般形式:a|b
运算功能:参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1,否则为0。
例如,9|5=12: 1001
& 0101
────
(1101)2=(13)10
说明:
(1)x、y和“位数”等操作数,都只能是整型或字符型数据。除按位取反为单目运算符外,其余均为双目运算符。
(2)参与运算时,操作数x和y,都必须首先转换成二进制形式,然后再执行相应的按位运算。
实例说明:
从键盘上输入1个正整数给int变量num,按二进制位输出该数。
说明
1.复合赋值运算符
除按位取反运算外,其余5个位运算符均可与赋值运算符一起,构成复合赋值运算符: &=、|+、^=、<<=、>>=
2.不同长度数据间的位运算──低字节对齐,短数的高字节按最高位补位:
对无符号数和有符号中的正数,补0;
有符号数中的负数,补1。