1、1,第2章 基本数据类型及其运算,2.1 C语言的数据类型 2.2 常量与变量 2.3 整型数据 2.4 实型数据 2.5 字符型数据 2.6 运算符与表达式 2.7 数据的类型转换 2.8 数据的输入与输出 2.9 顺序结构程序设计,2,通常,一个程序应包括: 对数据的描述 对数据处理的描述。,对数据的描述, 即数据结构; 对数据处理的描述,即算法。,在C语言中 数据结构以数据类型的形式出现, 算法由语句序列实现。,3,2.1 C语言的数据类型,4,5,6,7,8,所谓类型,就是对数据分配存储单元的安排 单元的长度(占多少字节) 数据的存储形式 不同的类型分配不同的长度和存储形式,9,数据的
2、值有两种不同的表现形式: 常量 变量 C语言提供了丰富的运算符和表达式,以完成各种数值计算和非数值计算。,10,2.2.1 标识符 是常量、变量、数组、函数、类型和语句的名称。 标识符有3种类型: 关键字 预定义标识符 用户标识符,11,关键字类 ANSI C标准C共有32个关键字 1999年ISO推出的C99标准新增了5个关键字(见附录C) 根据关键字的作用,分为两大类: 数据类型 流程控制,12,1. 数据类型关键字 (4小类) (1) 基本数据类型(5个) void char int float double (2) 类型修饰关键字(4个) short long signed unsig
3、ned,13,(3) 复杂类型关键字(5个) struct union enum typedef sizeof (4) 存储级别关键字(6个) auto static register extern const volatile,14,2. 流程控制关键字 (1) 跳转结构(4个) return continue break goto (2) 分支结构(5个) if else switch case default,15,(3) 循环结构(3个) for do while C99新增5个关键字: inline restrict _bool _complex _imaginary,16,预定义标
4、识符类 预定义标识符就是已经存在的名字。 如系统提供的标准库函数名(printf、scanf) 如编译预处理命令名(define 、include) 这些预定义标识符已有特定的含义 虽仍可作为用户标识符使用,但会失去原意,17,用户标识符类 用于标识变量、符号常量、数组、函数和数据类型等对象的一个字符序列,称为用户定义标识符。 C语言规定用户标识符只能由字母、数字和下划线组成.且以字母或下划线开头。,18,说明: (1)C语言中同一字母的大小写,被认为是两个不同的字符。 例如: total、TOTAL、ToTaL、tOtAl 不同的用户标识符。,19,(2)C语言的关键字不能用作用户标识符。
5、例如: int 不合法 Int、INT、iNt 合法,20,(3)用户标识符的命名要见名知意。 例如: name/xm 姓名 sex/xb 性别 age/nl 年龄,21,(4)避免使用易混字符。 例如: 1、l、i;0、o、O;p、P;x、X;2、z、Z等。,file6、stu_name、DeFault、_9、xandy 正确 6file、stu-name、default、-9、x&y 不正确,22,2.2.2 常量,常量:在程序运行过程中,其值不能被改变的量,整型常量: 实型常量 字符常量: 普通字符:如? 转义字符:如n 字符串常量:如“boy” 符号常量:#define PI 3.14
6、16,直接常量 即常数,23,直接常量的类型从字面上就能够区分出来。,整型常量的表示方法 有3种形式表示: (1) 十进制整数 如:123、-456、0 (2) 八进制整数 如:0123表示八进制数123,即(123)8 (3) 十六进制整数 如:0x123表示十六进制123,即(123)16,24,实际上,任何进制的数都可以表示为:,其中: Ki 为第i位的数码, n为整数的位数, m为小数的位数, C为进制。,25,实型常量的表示方法 实数又称浮点数,有两种表示形式: (1) 十进制小数形式 由数字和小数点组成,如:.123、123.、123.0、0.0,(2) 指数形式 如: 1.234
7、56e2或0.123456E3都代表123.456 但注意字母e之前必须有数字 且e后的指数必须为整数,其中: 1.23456e2 规范化的指数形式,26,字符常量:使用单引号括起来的一个字符。 如: a、9、D、?、¥ 等。 注意: a 和 A 不是同一个字符常量。,除以上的普通字符常量外,还有一种特殊形式的字符常量,既以“”开头的字符序列,称为“控制字符” 例如:printf函数中的 n 代表一个“换行”符。 控制字符不能在屏幕上显示,也无法用一个一般形式的字符表示,只能用特殊形式表示。,字符常量的表示方法,27,常用的特殊字符表如下:,28,字符常量是一对单引号括起来的单个字符。 字符串
8、常量则是一对双引号括起来的一个字符序列,例 a 是字符常量。 “a” 是字符串常量。二者不同,也不能混淆。,字符串常量的表示方法,29,a 和 “a” 的区别在于: C语言规定:在每个字符串的结尾由系统自动加入一个控制字符0 作为字符串的结束标志。 这表明 “a” 字符串在内存中实际是由2个字符组成的,因此只能放一个字符的字符变量无法存放 “a”。,30,例:若有字符串常量为: “CHINA” 则实际内存中是:,其中的0是系统自动加上的。,31,符号常量:用一个标识符代表一个常量,例 符号常量的使用。,符号常量的表示方法,#define PRICE 30 void main ( ) int n
9、um,total ; num=10; total=num * PRICE ; printf (“total=%d”,total) ;,符号常量名用大写,变量名用小写。 使用符号常量的优点有: (1)含义清楚。 (2) “一改全改”,32,2.2.3 变量,变量必须先定义,后使用 定义变量时指定该变量的名字和类型 变量名和变量值是不同的概念 变量名代表内存中的存储单元 变量名实际上是一个符号地址 从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据,变量:在程序运行过程中,其值可以被改变的量,33,低地址,a,34,1.变量定义 所有用到的变量必须先定义、后使用。 变量定义
10、的一般格式如下: 类型说明符 变量名1,变量名2,变量名n;,例如: int i,j,k; float x,y,z;,35,2.变量赋值 变量赋值有如下几种方式。 (1)变量赋初值。 定义变量时直接赋值,也称为变量的初始化。,例如: int a=10,b=9,c=6; float x=3.0,y=1.0,z=2.0;,36,注意: 不能将具有相同初值的变量赋初值时写成以下形式: int a=b=c=6; 只能写成: int a=6, b=6, c=6;,37,2.3 整型数据,2.3.1 整型常量 八进制、十进制、十六进制,整型数据包括整型常量和整型变量。,38,例:设定义一个整形变量 i :
11、 int i ; i=10 ; 图 (a)为在内存中的10进制表示(示意); (b)为在内存中的2进制表示。,2.3.2 整型变量,39,实际上,数值是以补码表示的。 正数的补码:与其原码的形式相同。 负数的补码:是将该数的绝对值的二进制形式按位取反再加1。,1. 整型数据存放形式,40,根据字节数可以看出,补码的表示范围: 一个整数占2个字节,16位。去掉一个符号位,有效数字位为15位,因此可表达的值的范围为: -215 215-1 即 -32768 32767 。,32767,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,有符号a,1,1,1,1,1,1,1,1,1,1,
12、1,1,1,1,1,1,无符号b,65535,符号位,数据的第1位,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,有符号a,-32768,41,2. 整型变量的分类,根据占用内存字节数的不同,整型变量分为: (1) 基本整型 (类型关键字为int) (2) 短整型 (类型关键字为short int) (3) 长整型 (类型关键字为long int),42,Turbo C 2.0和Turbo C+ 3.0 short、int 2个字节 long 4个字节 C+ 6.0 short 2个字节 int、long 4个字节。,43,3. 整型变量的符号属性 整型变量的值的范围包
13、括负数到正数 可以将变量定义为“无符号”类型 扩充的整形类型:,44,扩充的整型类型: 有符号基本整型 signed int; 无符号基本整型 unsigned int; 有符号短整型 signed short int; 无符号短整型 unsigned short int; 有符号长整型 signed long int; 无符号长整型 unsigned long int 有符号双长整型 signed long long int; 无符号双长整型 unsigned long long int,45,4.整型数据值域 整型数据所占字节数和数值范围如表2-1所示。,46,2.4 实型数据,实型数据包
14、括实型常量和实型变量。,2.4.1 实型常量 小数形式、指数形式,47,实型数据是按照指数形式存储的 分别存放 小数部分 指数部分 指数部分采用规范化的指数形式。 小数部分采用定点小数形式存放。,2.4.2 实型变量,1. 实型数据存放形式,48,例:实数3.14159在内存中的存放形式如图。,49,上图是用十进制来示意的。 实际在计算机中是: 用二进制表示小数部分 用2的幂次表示指数部分 (如1x2n+1x2n-1),50,例:把0.5803D转换成二进制数,且有效位数为6位。,解:采用乘R取整法。 0.5803 X 2 1.1606 取整数1 作为最高位 2 0.3212 取整数0作为第二
15、位 2 0.6424 取整数0作为第三位,51,0.6424 X 2 1.2848 取整数1 作为第四位 2 0.5696 取整数0作为第五位 2 1.1392 取整数1作为第六位(最低位) 即: 0.5803D = 0.100101B,小数永远不会绝对精确,52,在计算机中是用2的幂次来表示指数部分的。 例如: 17D=10001B=1*24+0*23+0*22+0*21+1*20,数符,阶码,尾数,float型(单精度浮点型6位10进制有效数字),53,2.实型变量分类 根据所占字节数分类有3种类型: (1)单精度型。类型关键字为float。 (2)双精度型。类型关键字为double。 (
16、3)长双精度型。类型关键字为long double。,54,2.5 字符型数据,字符型数据包括字符常量和字符变量。,2.5.1 字符常量 字符常量是指单个字符,用一对单引号及其所括 起来的字符表示。 字符常量有两种表示形式: 普通字符 转义字符,55,2.5.2 字符变量 用类型符char定义字符变量 例: char c = A; 系统把A的ASCII码值65赋给变量c,56,由于存储形式与整数相同,允许相互转换。,【例2-2】 以字符形式或整数形式输出。 #include int main() char ch1,ch2; ch1=A; ch2=97; printf(“ch1=%c,ch2=%
17、cn“,ch1,ch2); printf(“ch1=%d,ch2=%dn“,ch1,ch2); return 0; ,57,可以进行运算 例如: A+3 /值为68,对应字符D 5-0 /值为5 5+0 /值为53,对应字符5,58,字符1和整数1是不同的概念: 字符1只是代表一个形状为1的符号,在需要时按原样输出,在内存中以ASCII码形式存储。 占1个字节 整数1以整数存储方式(二进制补码方式)存储的。 占2个或4个字节,59,2.5.3 字符串常量,字符串常量则是一对双引号括起来的一个字符序列,注意:整型、实型、字符型数据都有变量表示,而C语言中没有字符串变量。,60,例:若有字符串常量
18、为: “CHINA” 则实际内存中是:,其中的0是系统自动加上的。,注意: 空串,表示为“” 空字符(NUL)的ASCII码值:0 空格字符的ASCII码值:32,61,数据,62,字符常量:由单撇号括起来的单个字符或转义字符 整型常量:不带小数点的数值 系统根据数值的大小确定int型还是long型等 浮点型常量:凡以小数形式或指数形式出现的实数 C编译系统把浮点型常量都按双精度处理 分配8个字节,怎样确定常量的类型,63,2.6 运算符与表达式,2.6.1 运算符概述 应理解和掌握的概念,2.6.2 表达式概述 用运算符将运算对象连接起来并符合语法规则的式子,称为表达式 运算对象包括常量、变
19、量、函数等,64,1.基本的算术运算符: + :正号运算符(单目2级) - :负号运算符(单目2级) * :乘法运算符(双目3级) / :除法运算符(双目3级) % :求余运算符(双目3级) + :加法运算符(双目4级) - :减法运算符(双目4级),#include void main() int a=-10; printf(“%dn”,a); printf(“%dn”,-a); printf(“%dn”,+a); ,2.6.3 算术运算符与算术表达式,65,说明: 对于除法,如果是两个整数相除,结果仍为整数。即舍掉小数部分。 如:5/3 的结果为1。这是在正整数时。,若两数中有一个为负数,
20、则舍入方向是不确定的。多数机器采用“向零取整法”。,66,说明: %运算符要求参加运算的运算对象(即操作数)为整数,结果也是整数。 如: 7%4,结果为3,67,不同类型数据间的混合运算:,整型(int,short,long)和实型(float,double)数据可以混合运算 字符型可以与整型通用 因此:整型、实型、字符型数据之间可以混合运算 例如:10+c+1.5 - 8765.1234*b,68,注意: 不同类型之间数据的混合运算要先转换成同一种类型,然后进行运算。 转换的规则如下图所示:,表示必须进行的转换。 表示当运算对象为不同类型时,转换的方向。,69,例:设已定义: i 为 int
21、 型变量 f 为 float 型变量 d 为 double 型变量 有式子如: 10 +a+ i * f d/3 执行时,计算机自左向右扫描,运算次序为: 1) 进行10+a 运算 先把 a 转化为 int 型,即整数 97, 运算结果为 107。,70,10 + a+ i * f d/3 2) 进行 i * f 运算 先把 i 和 f 都转化成 double 型, 结果也为 double 型 3) 整数107与 i * f 的积相加 先把整数107转化为 double 型 4) 进行 d/3 运算 先把 3 转化为double型,d/3 结果为 double 型 5) 把 10+a+ i *
22、 f 的结果与 d/3 的商相减, 结果为 double 型。,71,2.6.4 赋值运算符和赋值表达式,1.赋值运算符 14级;双目、右向左 “”是赋值运算符 作用是将一个数据赋给一个变量 也可以将一个表达式的值赋给一个变量,72,复合的赋值运算符 在赋值符“”之前加上其他运算符,构成复合的运算符 例如: 等价于 ,73,注意: 例如: a+=3 相当于 a=a+3 x*=y+8 相当于 x=x*(y+8) x%=3 相当于 x=x%3,注意:不是x=x*y+8,注意:不是x 的余数等于3,而是把x与3的余数赋值给x,74,2.赋值表达式 一般形式为: 变量赋值运算符表达式 对赋值表达式求解
23、的过程: 求赋值运算符右侧的“表达式”的值 赋给赋值运算符左侧的变量,用运算符把操作数连接起来称为表达式,表达式的值一定要赋给一个变量 不能写成: 5=a+b 或 x+y=5,75,需要区分的概念 对于赋值表达式: a=3*5 对上述表达式求解后,变量 a的值和 表达式的值都是15,76,注意: 赋值表达式的嵌套: 赋值表达式中的表达式又可以是一个赋值表达式。 例如: a=(b=3) 相当于b=3 和 a=b两个表达式,77,复合赋值表达式: 赋值表达式也可包含复合的赋值运算符。 例如:a+=a-=a*a,设a的初值为12。 按如下步骤求解: 1)先求a-=a*a的运算 (自右向左) 相当于a
24、=a-a*a=12-144=-132 2)再进行a+=-132的运算 相当于a=a+(-132)=-264,(此a中的值为-132),78,注意: 赋值表达式的用途: 赋值操作不仅仅出现在赋值语句中,还可以在其他语句中出现。 例如:printf(“%d”,a=b);,79,注意: 双目是指有两个操作数。 对赋值运算符而言,其左侧又称为“左值” 右侧称为 “右值”。 左值是变量,不能是常量或表达式 凡是左值都可作为右值。,80,例如: a=(b=3*4) 正确 (a=b)=3*4 错误 a=(b=c)=3*4 错误,?,81,3.赋值过程中的类型转换 自动 两侧类型一致时,直接赋值 两侧类型不一
25、致,但都是算术类型时, 自动将右侧的类型转换为左侧类型后赋值 定义变量时要防止数据溢出或精度降低,warning C4244: = : conversion from float to int, possible loss of data,若:int a;float b=20.0; a=b;,82,2.6.5 自增、自减运算符 2级 单目 右至左,作用:使变量的值加或减,前置,后置,(先加后用,使i自身加1, 然后再参与其他运算) 先减后用 先用后加 先用后减,表示形式:有4种 +i -i i+ i-,83,例如:设 i 的原值为3,执行下面的语句: j=+i 此时 i 的值先变为4, 再赋给
26、j,j的值为4,若 j=i+ 此时先把i的值为 3 赋给j, 然后 i 的值再变为4 虽然对于 i,最后的值都为4,但与之进行操作的其他变量或表达式的结果则不同。,84,提示: 自增、自减运算符只能用于变量不能用于常量或表达式 +和- -的结合方向是“自右向左”的。,先用后加,例如: int i=3; printf(“%dn”,-i+); 此时 为负号运算符,而+为自增运算符。,若按算术运算符的结合方向则相当于(-i)+,这是对表达式进行自增运算,显然不合法。,若按自右向左的结合方向则相当于 -(i+),此时执行printf(“%d”,-i+);会先取出i的值3,输出i 的值 -3。,85,用
27、途: 自增、自减运算符常用于循环语句中做循环变量 也用于指针变量,使指针指向下一个地址,86,有关问题的说明,(1) 歧义性 应避免有可能发生歧义的表达式 例如:有表达式为: (i+)+(i+)+(i+) 设i的原值为3: int i=3; printf(“n%dn“,(i+)+(i+)+(i+); printf(“n%dn“,i);,若希望结果为12, 可以把问题表述为 i=3; a=i+; b=i+; c=i+; d=a+b+c; 若希望结果为9, 则写成: d=a+a+a;,87,(2) 处理原则 编译系统在处理运算符、标识符、关键字时,尽可能多地自左向右将若干个字符组成一个运算符或关键
28、字。,这主要是由2个因素共同作用引起的: 在C语言中,运算符是作为1个字符来处理的, 有的运算符却是由2个符号组成的。 例如:表达式可能会写成 i+j 按照处理原则理解为(i+)+j。,88,(3)实参的求值顺序 不同的编译系统求值顺序可能不同。 如对函数调用: printf(“%d,%d”,i,i+); 有些系统自左向右求值,此时输出3,3。 有些系统自右向左求值,即先求表达式i+的值 建议写成 j=i+; printf(“%d,%d”,j,i);,89,优先级 优先级是指运算符的优先级。共15级。 *、/、%是3级;+、-是4级 求表达式的值时,按优先级的级别从高到低顺序执行。,结合性 结
29、合性是指同一优先级时的求值顺序。用结合方向表示。 结合方向有2个: 自左向右 自右向左,90,在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。,例有表达式:x-y+z, 则 y应先与“-”号结合,执行x-y运算, 然后再执行+z的运算。 自左至右,最典型的右结合性运算符是赋值运算符, 如x=y=z。 由于“=”的右结合性,应先执行y=z, 再执行x=(y=z)运算。,左结合 a-b 右结合 a=b 所谓的左、右结合性,就是指运算对象先与左还是右侧的运算符结合。所有的单目运算符都是右结合的。,91,2.6.6 逗号运算符、逗号表达式 15级 自左至右,用逗号运算符“
30、,”连接起来的式子,一般形式为: 表达式, 表达式2, , 表达式n 表达式求解过程为: 自左至右,依次计算各表达式的值, “表达式n” 的值作为整个逗号表达式的值。,92,a=3*5,a*4 /逗号表达式的值为60。 a=3,a*4,a+ /逗号表达式的值为3。 注意: 并不是任何地方出现的逗号,都是逗号运算符。很多情况下,逗号仅用作分隔符。 例如:printf(“%d%d%d“,a,b,c);,93,对于类型转换,有两种方式: 1) 系统自动进行的类型转换 例如: 在求表达式 a*b/c-1.5+a 的值时,系统会自动把字符型数据转换成整型数据后再与其他整型数据进行运算,系统也会自动把整型
31、数据转换成实型数据,然后在实型数据间进行运算,2.7 数据的类型转换,94,2) 强制类型转换 作用: 用强制类型转换运算符把一个表达式的值转换成所需要的类型。 一般形式: (类型名)(表达式) 例如:(float)(5%3) 把表达式(5%3)的值转为实型,95,例如: (double)a (将 转换成double类型) (int) (x+y) (将x+y的值转换成int型) (float)(5%3) (将5%3的值转换成float型),96,提示: (类型名)是一个运算符,包括括号。 但不是定义变量的类型说明。 例如: (double)a 把a转为double型,而不管a原来的型,被转换的
32、表达式也应用括号括起来。 例如:(int)(x+y) 把表达式(x+y)的值转为整型 再如:(int)x+y 仅把x转为整型,然后与y相加,97, 优先级为2级,高于%运算符。 例如:若 x 为 float 型, 则 x % 3 是不合法的, 而 (int)x % 3 是合法的。,98,例:强制类型转换 int main() float x;int i; a=3.6; i=(int)a; printf(“x=%f,i=%d”,a,i); 运行结果为: a=3.600000,i=3 可见a仍为float型。,这说明强制类型转换并不是把a的原值改为整型,而只是产生了一个整型的中间变量,这个中间变量
33、的值为x的整数部分。,99,2.8 数据的输入/输出,输入输出是相对于计算机主机而言的。 从计算机向输出设备(如显示器、打印机等)输出数据称为输出 从输入设备(如键盘、磁盘、光盘、扫描仪等)向计算机输入数据称为输入,100,语言本身不提供输入输出语句 输入和输出操作是由C标准函数库中的函数来实现的 printf和scanf不是语言的关键字,而只是库函数的名字 putchar、getchar、puts、gets,101,在使用输入输出函数时,要在程序文件的开头使用预编译指令。 #include 在include目录下 或 #include “stdio.h” 在用户自定义目录下,102,2.8.
34、1 格式化输出函数printf,在C程序中用来实现输出和输入的,主要是printf函数和scanf函数 用这两个函数时,必须指定格式 这两个函数是格式输入输出函数,103,printf函数的一般格式: printf(格式控制,输出表列),可以是常量、变量或表达式,例如: printf(“i=%d,c=%cn”,i,c);,104,printf函数的一般格式: printf(格式控制,输出表列) 例如: printf(“i=%d ,c=%cn”,i,c);,105,printf函数的一般格式: printf(格式控制,输出表列) 例如: printf(“i=%d ,c=%cn”,i,c);,格式
35、声明,106,printf函数的一般格式: printf(格式控制,输出表列) 例如: printf(“i=%d,c=%cn”,i,c);,普通字符,107,常用格式字符 格式符。用来输出一个有符号的十进制整数 可以在格式声明中指定输出数据的域宽 printf(“%5d%5dn”,12,-345);,不是普通字符,108,%md m是指定的输出字段的宽度。 若数据的实际位数小于m,则左端补空格。 若数据的实际位数大于m,则按实际位数输出。,%d 输出int型数据 %ld 输出long型数据 %lld 输出长双整型数据,109,常用格式字符 格式符。用来输出一个字符,输出字符:a,char ch
36、=a; printf(“%c”,ch); 或 printf(“%5c”,ch);,110,常用格式字符 格式符。用来输出一个字符串,printf(“%s”,“CHINA”); 输出字符串:CHINA ,111,常用格式字符 f格式符。以小数形式输出实数 %f 不指定数据宽度和小数位数 例3.6 用%f输出实数,只能得到位小数。 double a=1.0; printf(“%fn”,a/3);,112,常用格式字符 f格式符。以小数形式输出实数 %m.nf 指定数据宽度和小数位数 printf(“%20.15fn”,1/3.0); printf(“%.0fn”,10000/3.0);,113,实
37、型数据的有效位数 float a; a=10000/3.0; printf(“%fn“,a);,区别6位有效位数和6位小数,114,float x=1/3.0; printf(“%20.15fn”,1/3.0); printf(“%11fn”,x);,float型数据只能保证6位有效数字 double型数据能保证15位有效数字 计算机输出的数字不都是绝对精确有效的,115,常用格式字符 f格式符。以小数形式输出实数 %-m.nf 输出的数据向左对齐,右补空格,116,常用格式字符 e格式符。以指数形式输出实数 %e,VC+给出小数位数为位 指数部分占5列 小数点前必须有而且只有1位非零数字 p
38、rintf(“%e”,123.456); 输出:1.234560e+002,117,常用格式字符 e格式符。以指数形式输出实数 %m.ne printf(“%13.2e”,123.956); 输出: 1.24e+002 (前面有4个空格),4舍5入,118,常用格式字符 o格式符。以8进制形式输出整数 同样有字段宽度m形式。 对长整型也有长型格式输出。,是把内存中的各位的值(0,1)按8进制形式输出; 因此输出的数值不带符号; 即把符号位也作为8进制数的一部分输出。,119,整数本身没变, 在内存中是二进制形式,例如:-1在内存中的补码形式为16位全是1, 此时: int a= -1; pri
39、ntf(%d,%o”,a,a); 输出结果为:-1,177777,120,常用格式字符 x 格式符。以16进制形式输出整数 同样有字段宽度m形式。 对长整型也有长型格式输出。,u 格式符。以十进制形式输出无符号整数 有符号数可用无符号格式输出, 反之,无符号数也可用%d格式输出。,121,例 无符号数据的输出 int main() unsigned int a=65535; int b= -2; printf(“a=%d,%o,%x,%un”,a,a,a,a); printf(“b=%d,%o,%x,%un”,b,b,b,b); 运行结果为:-1,177777,ffff,65535 -2,17
40、7776,fffe,65534,122,常用格式字符 g格式符。用于输出实数 根据数值的大小,自动选择f格式或e格式(即选宽度较小的,此格式不多用)。,123,scanf 函数的一般形式 scanf(格式控制,地址表列),是变量的地址,或字符串的首地址,2.8.2 格式化输入函数scanf,124,scanf的格式声明与printf的格式声明相似 以开始,以一个格式字符结束,中间可以插入附加的字符 scanf(“a=%f,b=%f,c=%f”, 普通字符必须原样输入,125,使用scanf函数时应注意的问题 scanf(“%f%f%f”,a,b,c); 错 scanf(“%f%f%f”, 1#
41、3#2 错 a=1 b=3 c=2 错 a=1,b=3,c=2 对,126,使用scanf函数时应注意的问题 对于scanf(“%c%c%c”, 若输入 1234a253o.26,127,输入数据的结束 空白字符:空格键、Enter键和Tab键 指定数据宽度 指定数据分隔符 遇到非法字符,128,若在程序中连续调用多个scanf函数,应消除前一行输入的“回车”符。 解决办法:在下一个scanf函数格式字符串的开始处加一个空格符来抵消上一行输入的“回车”。 即改为: scanf(“ m=%f,n=%f“, 注意:执行该程序时,也可以输入为: m=4.5,n=-7.6Aa,使用scanf函数时应注
42、意的问题,129,【例2-5】在程序中有3个scanf函数调用语句,要使a=5,b=10,m=4.5,n=-7.6,ch1= A ,ch2= a 。 #include int main() int a,b; float m,n; char ch1,ch2; scanf(“%d%d“, ,如果输入: 5 10 m=4.5,n=-7.6 运行结果: a=5,b=10 m=-107374176.000000, n=-107374176.000000 ch1= ,ch2=m,130,用putchar函数从计算机向显示器输出一个字符 putchar函数的一般形式为: putchar(ch) ,2.8.3
43、 字符输出函数putchar,131,输出项:可以是字符型表达式或整型表达式 例如: 输出字符 putchar(65); putchar(a-32); putchar(101); 输出单引号字符 putchar(),132,2.8.4 字符输入函数getchar,向计算机输入一个字符 getchar函数的一般形式为: getchar( ),133,【例2-6】输入一个字符,并将该字符输出。 #include int main() char ch; ch=getchar(); putchar(ch); printf(“n%dn“,ch); return 0; ,134,程序是由语句构成的。 语句
44、必须遵循一定的语法规则。,由数据和运算符构成表达式。但仅将表达式写出来,计算机并不知道该如何对待或处理这些表达式。 因此必须由程序员发出如何处理这些表达式的命令; 这些命令以关键字的形式出现; 关键字和表达式一起构成语句。,2.9 简单程序设计顺序结构程序设计,2.9.1 C语句,135,语句:向计算机系统发出的操作指令。 一个语句经编译后,可产生若干条机器指令。 一个实际的程序应包含若干个语句。 定义:能完成一定操作任务的语句称为C语句。,声明部分的内容不应称为语句。例如int a;不是一个C语句,因为它不产生机器操作,而只是对变量的定义。,一个函数包括声明部分和执行部分,执行部分是由语句构
45、成的。,136,C程序结构: 一个C应用程序可以由若干个源文件组成, 一个源文件可由若干个函数、预处理命令、全局变量声明部分组成。 一个函数由数据定义部分和执行部分组成。,137,138,程序(函数)应包括两大部分: 1、 数据描述(由声明部分实现); 2、 数据操作(由语句实现); 因此,语句是完成数据操作的(即对数据进行加工),139,C语句分类:(共5类) (1) 控制语句 (有9种) 完成一定的控制功能。,例如:对条件语句可以写成: if(xy) z=x;else z=y;, if() else 条件语句 for() 循环语句 while() 循环语句 do while() 循环语句
46、continue 结束本次循环 break 终止执行循环 或switch switch 多分支选择 goto 转向 return 从函数返回,140,函数调用语句 由一次函数调用加上一个“;”构成一个语句。,例如: printf(“this is a c statement。”) ;,理解: c=max(a,b)+d ;,表达式语句,141,(3) 表达式语句 由表达式构成的语句。 例如: a=3 是一个赋值表达式。 而: a=3 ; 是一个赋值语句。,因此在应该使用表达式时,不要加分号, 在应该使用语句时不要忘记分号。 任何表达式都可以加上分号而成为语句。 例如 x+y;是语句,但因其值未赋
47、给其它变量或表达式,因而无意义。,142,(4) 空语句 只有一个分号“ ;”的语句。 常用于作被转向点或作为循环体。,143,(5) 复合语句 也称为分程序(或语句块)。 是由 把一些语句括起来构成的。,例如: z=x+y; t=z/100; printf(“%f”,t); ,144,2.9.2 顺序结构程序设计,顺序结构表示程序中的各个操作是按照它们出现的先后顺序执行的。,145,【例2-7】输入一个学生的3门成绩,求总分和平均分并输出。 #include int main() int score1,score2,score3,sum; float aver; scanf(“%d%d%d“, 输入:76 85 90 结果:sum=251,aver=83