第 6 章 基本的程序语句

70
1 本本本本本预预预预 预预预预预预预预预 预预预 预预预预预 预预预预预预预预预预 预预预预预预预 预预预预预预预预 预 6 预 预预预预预预预

Upload: samuel-hanson

Post on 01-Jan-2016

74 views

Category:

Documents


8 download

DESCRIPTION

第 6 章 基本的程序语句. 本章知识点: 预备知识 数据类型及取值范围 标识符、常量与变量 不同类型数据间的转换 运算符和表达式 标准输入输出函数. 计算机中数的表示及进制转换 数码、基与权 数码:表示数的符号 基:数码的个数 权:每一位所具有的值 数制. 6.0 预备知识. 进制之间的转换. 二进制转换成十进制 ( 整数 + 小数 ) 方法:按权相加. 十六进制数. 数制. 十进制数. 二进制数. 八进制数. 数码. 0~9. 0~1. 0~7. 0~9,A~F,a~f. 基. 10. 2. 8. 16. 权. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 6 章 基本的程序语句

1

本章知识点:

预备知识数据类型及取值范围标识符、常量与变量不同类型数据间的转换运算符和表达式标准输入输出函数

第 6 章 基本的程序语句

Page 2: 第 6 章 基本的程序语句

2

计算机中数的表示及进制转换数码、基与权数码:表示数的符号基:数码的个数权:每一位所具有的值

数制

6.0 预备知识

Page 3: 第 6 章 基本的程序语句

3

二进制转换成十进制 (整数+小数 ) 方法:按权相加

10012345

2 59212120212121111011 )()(例

103210

123452

625.5821202120

2120212121101.111010

)(

)例(

进制之间的转换

Page 4: 第 6 章 基本的程序语句

4

数制

表示

数码

特点

10º, 10¹, 10² …,

十进制数

0~9

10

逢十进一

二进制数

0~1

2

2º, 2¹, 2² …,

逢二进一

八进制数

0~7

8

8º, 8¹, 8² …,

逢八进一

十六进制数

0~9,A~F,a~f

16

16º, 16¹, 16² …,

逢十六进一

十进制: 4956= 410³+910² +510¹+610º二进制: 1011=12³+02² +12¹+12º十六进制: 81AE=816³+116² +1016¹+1416º八进制: 4275=48³+28² +78¹+58º

Page 5: 第 6 章 基本的程序语句

5

十进制转换成二进制

方法: (整数部分 )连续除以 2,从低到高记录余数,直至商为 0

例 把十进制数 7转换成二进制数

72

32

120

(7)10=(0111)2

余 1

余 1

余 1

余 0

方法: (小数部分 )连续乘以 2,从高到低记录整数,直至余下的小数为 0或者满足精度要求

例 ( 0.625)10=(0.101)2

Page 6: 第 6 章 基本的程序语句

6

内存以字节为单元组成每个字节有一个地址一个字节一般由 8个二进制位组成每个二进位的值是 0或 1

01234567

0123456789

10

……

...

7

6

4

3

2

5

1

字节和位

Page 7: 第 6 章 基本的程序语句

7

原码:最高位为符号位( 0正数, 1负数),其余各位为数值本身的绝对值反码:正数:反码与原码相同负数:符号位为 1,其余位对原码取反

补码:正数:原码、反码、补码相同负数:最高位为 1,其余位为原码取反,再对整个数加 1

——数值的表示方法 原码、反码和补码

Page 8: 第 6 章 基本的程序语句

8

原码 反码 补码

+7 00000111 00000111 00000111

-7 10000111 11111000 11111001

+0 00000000 00000000 00000000

-0 10000000 11111111 00000000

负数补码转换成十进制数:最高位不动,其余位取反加 1

例 补码: 11111001 取反: 10000110 加 1 : 10000111=-7

(用一字节 8位表示数)

正 0代表数字 0负 0代表 -128(规定)

Page 9: 第 6 章 基本的程序语句

9

定点数与浮点数

定点数:小数点位置固定的数,(整数与纯小数)

浮点数:小数点位置是浮动的 (有整数

和小数)单精度和双精度

例 234 , 256 , 0.123 , 0.0056 是定点数

例 61.329 是浮点数 表示方法见 P11

Page 10: 第 6 章 基本的程序语句

10

数据类型总表

C数据类型

基本类型

构造类型

指针类型

空类型 void

定义类型 typedef

字符类型 char

枚举类型 enum

整 型

实型单精度型 float

双精度型 double

数组

结构体 struct

共用体 union

短整型 short

长整型 long

整型 int

数据类型决定:1. 数据占内存字节数2. 数据取值范围3. 其上可进行的操作

6.1 数据类型及取值范围

Page 11: 第 6 章 基本的程序语句

11

类型符号 关键字

数的表示范围所占位数

整型

字符

实型

(signed)int 16 -32768~32767(signed)short 16 -32768~32767

(signed)long 32 -2147483648~214748364716unsigned

int0~65535

32 0~4294967295unsigned long

unsigned short 16 0~65535

有 float 32 3.4e-38~3.4e38

有 double 64 1.7e-308~1.7e308

有 char 8 -128~127

无 unsigned char 8 0~255

说明 :数据类型所占字节数随机器硬件不同而不同 ,上表以 IBM PC机为例 :

请看int和unsigned int

基本数据类型

Page 12: 第 6 章 基本的程序语句

12

01 11 11 11 11 11 11 11int型: 最大 :32767

10 00 00 00 00 00 00 00 最小 :-32768

11 11 11 11 11 11 11 11unsigned int型: 最大 :65535

00 00 00 00 00 00 00 00 最小 :0

Page 13: 第 6 章 基本的程序语句

13

例 1:运行下面的程序,了解变量的取值范围和 C语言的特性。

/*example6_1.c 变量的取值范围测试 */ #include <stdio.h>main(){ int a=32766,b=-32766; unsigned m=6553; float t=3.4e+37; printf("a=%d\n",a); printf("m=%u\n",m); printf(“t=%e\n”,t); a=a+4;

b=b-6; m=m*10+10; t=t*10; printf("After change:\

n");printf("a+4=%d\n",a);printf("b-6=%d\n",b);printf("m*10+10=%u\

n",m);printf("t*10=%e\n",t);}

Page 14: 第 6 章 基本的程序语句

14

标识符定义:用来标识变量、常量、函数等的字符序列组成:只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线大小写敏感不能使用关键字

长度:最长 32个字符命名原则:见名知意

不宜混淆 如 l与 I, o与 0

例 :判断下列标识符号合法性sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char a>b _above $123

< >

M.D.John 3days#33

char $123a>b

6.2标识符、变量与常量

Page 15: 第 6 章 基本的程序语句

15

编译程序根据变量定义为其分配指定字节的内存单元 …

...

地址

int a=1, b=-3,c;

a

b

c

2字节

2字节

2字节

地址

地址

….

..

内存

1

-3

随机数

概念:其值可以改变的量变量名与变量值变量定义的一般格式:

数据类型 变量 1[,变量 2 …, ,变量 n];

变量初始化 : 定义时赋初值例 : int a,b,c; float data;

决定分配字节数和数的表示范围

合法标识符 例 : int a=2,b,c=4; float data=3.67; char ch=‘A’; int x=1,y=1,z=1; int x=y=z=1;

变量的使用:先定义,后使用

例 1 int student; stadent=19; //Undefined symbol ‘stadent’ in function main

例 2 float a,b,c; c=a%b; //Illegal use of floating point in function main

变量定义位置:一般放在函数开头

main(){ int a,b=2; float data; a=1; data=(a+b)*1.2; printf(“data=%f\n”,data);}

变量定义

可执行语句

main(){ int a,b=2; a=1; float data; data=(a+b)*1.2; printf(“data=%f\n”,data);}

变量

Page 16: 第 6 章 基本的程序语句

16

占字节数随机器不同而不同 ,一般占一个机器字short≤int≤long可用 sizeof(类型标识符)测量

实型变量float:占 4字节,提供 7位有效数字double:占 8字节,提供 15~16位有效数字

字符型变量字符变量存放字符 ASCII码char与 int数据间可进行算术运算

例 1: float a; a=111111.111; /* a=111111.1*/例 2: double b; b=111111.111; /* b=111111.111*/

例 a=‘D’; /* a=68; */ x=‘A’+5; /* x=65+5; */ s=‘!’+‘G’ /* s=33+71; */

没有字符串变量,用字符数组存放

整型变量

Page 17: 第 6 章 基本的程序语句

17

/*example6_2.c*/ #define PRICE 12.5 main() { int num=3; float total; char ch1,ch2=‘D’;

total=num*PRICE; ch1=ch2-‘A’+‘a’; printf(“total=%f,ch1=%c\n”,total,ch1); }

宏定义

变量定义

输出结果

运行结果:total=37.500000, ch1=d

例子

Page 18: 第 6 章 基本的程序语句

18

一般用大写字母是宏定义预处理命令,不是 C语句

直接常量 : 整型常量 请点击: 实型常量 请点击: 字符常量 请点击: 字符串常量 请点击:

如 #define PRICE 30

定义:程序运行时其值不能改变的量(即常数)分类 :符号常量 :用标识符代表常量

定义格式: #define 符号常量 常量

< >

例 符号常量举例

#define PRICE 30main(){ int num,total; num=10; total=num*PRICE; printf("total=%d",total);}

运行结果: total=300

常量

Page 19: 第 6 章 基本的程序语句

19

三种形式:十进制整数:由数字 0~9和正负号表示 . 如 123,-

456,0八进制整数:由数字 0开头 ,后跟数字 0~7表示 .如

0123,011十六进制整数:由 0x开头 ,后跟 0~9,a~f,A~F表

示 . 如 0x123,0Xff

例 12 与 12L 例 30000 为 int型 65536 为 long int 型

整型常量的类型根据其值所在范围确定其数据类型在整常量后加字母 l或 L,认为它是 long int 型常量

问题:0123 = ( )10

0x123 = ( )10

0Xff = ( )10

83

291

255

问题:0123 = ( )10

0x123 = ( )10

0Xff = ( )10

整型常量(整常数)

Page 20: 第 6 章 基本的程序语句

20

例 3:了解整型常量的不同进制表示法。/*example6_3.c */ #include<stdio.h>main(){ printf("十六进制 0x80的十进制值为:%d\

n",0x80); printf("八进制 0200的十进制值为:%d\n",0200); printf("十进制 128的十进制值为:%d\n",128); printf("十进制 128的十六进制值为:%x\n",128); printf("十进制 128的八进制值为:%o\n”,128);}

Page 21: 第 6 章 基本的程序语句

21

表示形式: 十进制数形式:(必须有小数点) 如

0.123, .123, 123.0, 0.0, 123.指数形式:( e或 E之前必须有数字;指数必须为整

数)如 12.3e3 ,123E2, 1.23e4 , e-5 , 1.2E-3.5

实型常量的类型默认 double型在实型常量后加字母 f或 F,认为它是 float 型

实型常量(实数或浮点数)

Page 22: 第 6 章 基本的程序语句

aaa 22

定义 :用单引号括起来的单个普通字符或转义字符 . 字符常量的值:该字符的 ASCII码值

<

转义字符及其含义:

转义字符 含义

\n

\v

\r

\a

\‘

\ddd

\t

\b

\f

\\

\“

\xhh

转义字符 含义

换行

垂直制表

回车

响铃单引号

3位 8进制数代表的字符

水平制表

退格

换页

反斜线

双引号2位 16进制数代表的字符

‘如 \101’ -----------‘A’ ‘\012’ -----------’\n’ ‘\376’ -----------’’ ‘\x61’ -----------’a’ ‘\060’ -----------’0’ ‘\483’ ----------()

例 :‘A’-------’\101’-------’\x41’--------65

‘如 A’——65 ‘, a’——97, ‘0’——48 , ‘\n’——10

‘如 a’ ‘A’ ‘?’ ‘\n’ ‘\101’

转义字符 :反斜线后面跟一个字符或一个代码值表示

例 转义字符举例/*example2_4.c */main(){ printf("\101 \x42 C\n"); printf("I say:\"How are you?\"\n"); printf("\\C Program\\\n"); printf("Turbo \'C\'");}

运行结果: (屏幕显示 )A B CIsay:”How are you?”\C Program\Turbo ‘C’

例 见 p23 例 2-6

字符常量

Page 23: 第 6 章 基本的程序语句

23

字符常量与字符串常量不同

定义:用双引号 (“”)括起来的字符序列存储:每个字符串尾自动 ‘加一个 \0’ 作为字符串

结束标志

h e l l o \0 “例 字符串 hello”在内存中

a a \0例 ‘ a’ “a”

“”例 空串 \0

例 : char ch; ch=“A”; 例 : char ch; ch=‘A’;

字符串常量

Page 24: 第 6 章 基本的程序语句

24

隐式转换什么情况下发生

运算转换 ------不同类型数据混合运算时 赋值转换 ------把一个值赋给与其类型不同的变量时 输出转换 ------输出时转换成指定的输出格式 函数调用转换 ------实参与形参类型不一致时转换

运算转换规则 :不同类型数据运算时先自动转换成同一类型

6.3不同类型数据间的转换

Page 25: 第 6 章 基本的程序语句

25

double float

long

unsigned

int char,short低

高 说明 :

必定的转换

运算对象类型不同时转换

char ch; int i; float f; double d;

ch/i + f*d - (f+i)int

int

double

double

double

double

double

double

int

int

double

double

double

double

double

double

10+‘a’ +i*f - d / l

例 2 int i; float f; double d; long l;

例 1

Page 26: 第 6 章 基本的程序语句

26

一般形式:(类型名)(表达式) 例 : (int)(x+y) (int)x+y (double)(3/2) (int)3.6 说明:强制转换得到所需类型的中间变量,

原变量类型不变 例 main()

{ float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); }结果: x=3.600000,i=3

较高类型向较低类型转换时可能发生

精度损失问题

显式转换(强制转换)

Page 27: 第 6 章 基本的程序语句

27

C运算符

算术运算符:(+ - * / % ++ --)关系运算符:(< <= == > >= !=)

逻辑运算符:((! && ||) 位运算符 :(<< >> ~ | ^ &)

赋值运算符:(= 及其扩展)条件运算符:( ?:)逗号运算符:( ,)指针运算符:( * &)

求字节数 :( sizeof)强制类型转换:(类型)分量运算符:( . ->)下标运算符:( [])

其它 :( ( ) -)

6.4 运算符和表达式

Page 28: 第 6 章 基本的程序语句

28

运算符功能与运算量关系要求运算量个数要求运算量类型

运算符优先级别结合方向结果的类型

学习运算符应注意

Page 29: 第 6 章 基本的程序语句

29

基本算术运算符: + - * / %结合方向:从左向右

优先级: - ---->* / % -----> + -

(14) (13) (12)说明:

“-”可为单目运算符时 ,右结合性两整数相除,结果为整数%要求两侧均为整型数据

例 5/2 = -5/2.0 =

例 5%2 = -5%2 = 1%10 = 5%1 = 5.5%2

算术运算符和表达式

2-2.5

1-110

()

Page 30: 第 6 章 基本的程序语句

30

例: 阅读下面的程序,了解由算术运算符组成的表达式。/*example6_8.c */ #include<stdio.h>main(){ int a,b,c,d1,d2,d3,d4; double x,y,z1,z2,z3; a=8; b=3; c=10;

d1=a+b*c-b/a+b%c*a; /* 复杂表达式 1 */ d2=(a+b)*c-(b/a)+(b%c)*a; /* 复杂表达式 2 */ d3=a/b; d4=c%b; printf("d1=%d, d2=%d, d3=%d, d4=%d\n", d1,d2,d3,d4); x=3.2; y=2.4; z1=x+y/x-y; /* 复杂表达式 3 */ z2=(x+y)/(x-y); /* 复杂表达式 4 */ z3=y/b; printf("z1=%f, z2=%f, z3=%f\n",z1,z2,z3); }程序运行结果:

d1=62, d2=134, d3=2, d4=1z1=1.550000, z2=7.000000, z3=0.800000

Page 31: 第 6 章 基本的程序语句

31

作用:使变量值加 1或减 1种类:

前置 ++i, --i (先执行 i+1或 i-1,再使用 i值) 后置 i++,i-- (先使用 i值 ,再执行 i+1或 i-1)

例 j=3; k=++j; j=3; k=j++; j=3; printf(“%d”,++j); j=3; printf(“%d”,j++); a=3;b=5;c=(++a)*b; a=3;b=5;c=(a++)*b;

//k=4,j=4//k=3,j=4//4//3//c=20,a=4//c=15,a=4

自增、自减运算符 ++ --

Page 32: 第 6 章 基本的程序语句

32

说明:++ -- 不能用于常量和表达式 ,如 5++, (a+b)++++ -- 结合方向: 自右向左优先级: - ++ -- ------>* / % ----->+ - (14) (13) (12)

例 -i++ -(i++) i=3; printf(“%d”,-i++); //-3 例 j+++k; (j++)+k; 例 -i++ i=3; printf(“%d”,-i++);

自增、自减运算符 ++ --

Page 33: 第 6 章 基本的程序语句

33

例: 阅读下面的程序,了解由++和 --组成的表达式。/*example6_11.c */ #include<stdio.h>main(){ int a ; double x ; a=16; x =12.6; printf(“a1=%d,a2=%d,a3=%d\n”,a++,a++,a++);

printf(“a1=%d,a2=%d,a3=%d\n”, ++a, ++a, ++a);printf(“x1=%f,x2=%f,x3=%f\n”,x--,x--,x--);printf(“x1=%f,x2=%f,x3=%f\n”, --x, --x, --x);}

Page 34: 第 6 章 基本的程序语句

34

简单赋值运算符 符号: = 格式: 变量标识符 =表达式

作用:将一个数据(常量或表达式)赋给一个变量

复合赋值运算符种类: += -= *= /= %= 《 = 》 = &= ^= |=

含义: exp1 op= exp2 exp1 = exp1 op exp2

a+=3 a=a+3

x*=y+8 x=x*(y+8)

x%=3 x=x%3

例 a=3; d=func(); c=d+2;

赋值运算符和表达式

Page 35: 第 6 章 基本的程序语句

35

结合方向:自右向左优先级 : 2左侧必须是变量,不能是常量或表达式

赋值表达式的值与变量值相等 ,且可嵌套

赋值转换规则 :使赋值号右边表达式值自动转换成其左边变量的类型

例 3=x-2*y; a+b=3;

例 float f; int i; i=10; f=i;则 f=10.0

例 int i; i=2.56; //结果 i=2;

例 : a=b=c=5 a=(b=5) a=5+(c=6) a=(b=4)+(c=6) a=(b=10)/(c=2)

//表达式值为 5, a,b,c值为 5// b=5;a=5//表达式值 11, c=6,a=11//表达式值 10, a=10,b=4,c=6//表达式值 5, a=5,b=10,c=2

说明( 1):

Page 36: 第 6 章 基本的程序语句

36

例 : a=12; a+=a-=a*a

例 : int a=2; a%=4-1; a+=a*=a+=a*=3;

//a=-264 等价于 a=a+(a=a-(a*a))

//a=288 等价于 a=a+(a=a*(a=a+(a=a*3)))

Page 37: 第 6 章 基本的程序语句

37

形式:表达式 1,表达式 2,……表达式 n结合性 :从左向右优先级 : 1逗号表达式的值:等于表达式 n的值用途:常用于循环 for语句中

例 a=3*5,a*4 a=3*5,a*4,a+5

例 x=(a=3,6*3) x=a=3,6*a

例 a=1;b=2;c=3; printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c);

//a=15,表达式值 60//a=15,表达式值 20

//赋值表达式,表达式值 18, x=18//逗号表达式 ,表达式值 18,x=3

//1,2,3//3,2,3

逗号运算符和表达式

Page 38: 第 6 章 基本的程序语句

38

关系运算符种类:< <= == >= > !=结合方向:自左向右优先级别:

<<=>>===!=

优先级 10(高)

优先级 9(低) 例 c>a+b //c>(a+b)

a>b!=c //(a>b)!=c a==b<c //a==(b<c) a=b>c //a=(b>c)

“ ” “ ”关系表达式的值:是逻辑值 真 或 假 ,用 1和0表示

例 int a=3,b=2,c=1,d,f; a>b (a>b)==c b+c<a d=a>b f=a>b>c

//表达式值 1

//表达式值 1

//表达式值 0//d=1

//f=0

关系运算符和表达式

Page 39: 第 6 章 基本的程序语句

39

“例 注意区分 =” “与 ==” int a=0,b=1; if(a=b) printf(“a equal to b”); else printf(“a not equal to b”);

例 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0==1.0 结果为

可改写为: fabs(1.0/3.0*3.0-1.0)<1e-60

关系运算注意

Page 40: 第 6 章 基本的程序语句

40

a b !a !b a&&b a||b真

假假假

逻辑运算符 种类: ! && ||

逻辑运算真值表

C语言中 ,运算量 : 0 “ ”表示 假 , 非 0 “ ”表示 真 , 运算结果 : 0 “ ”表示 假 , 1 “ ”表示 真 ,

真真

假真

逻辑运算符和表达式( 1)

Page 41: 第 6 章 基本的程序语句

41

! (14)

&& (5)

|| (4)

例 a<=x && x<=b a>b&&x>y a==b||x==y !a||a>b

优先级: 结合方向:

! :从右向左

&& :从左向右

|| :从左向右

// (a<=x) && (x<=b) //(a>b)&&(x>y)

//(a==b)||(x==y)//(!a)||(a>b)

逻辑运算符和表达式( 2)

Page 42: 第 6 章 基本的程序语句

42

短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符

< >

例 a&&b&&c //只在 a为真时,才判别 b的值; 只在 a、 b都为真时,才判

别 c的值 例 a||b||c //只在 a为假时,才判别 b的值;

只在 a、 b都为假时,才判 别 c的值 例 a=1;b=2;c=3;d=4;m=1;n=1;

(m=a>b)&&(n=c>d)

//结果 m=0,n=1

逻辑运算符和表达式( 4)

Page 43: 第 6 章 基本的程序语句

43

一般形式: expr1 ? expr2 : expr3执行过程功能:相当于条件语句,但不能取代一般 if语句 例 if (a>b)

printf(“%d”,a); else printf(“%d”,b);

printf(“%d”,a>b?a:b); 例 求 a+|b|

printf(“a+|b|=%d\n”,b>0?a+b:a-b);

expr1

取 expr2值 取 expr3值

非 0 =0

例 (a==b)?’Y’:’N’ (x%2==1)?1:0 (x>=0)?x:-x (c>=‘a’ && c<=‘z’)?c-’a’+’A’:c

条件运算符可嵌套 如 x>0?1:(x<0?-1:0)优先级 : 3结合方向:自右向左 如 a>b?a:c>d?c:d a>b?a:(c>d?c:d)expr1、 expr2、 expr3类型可不同,表达式值取较高的类型

例 x?‘a’:‘b’ //x=0, ‘表达式值为 b’; x‡0, ‘表达式值为 a’ x>y?1:1.5 //x>y ,值为 1.0; x<y ,值为 1.5

条件运算符与表达式

Page 44: 第 6 章 基本的程序语句

44

阅读下面的程序,了解三目运算符组成的表达式计算规则。/*example6_15.c 了解三目运算符的语法规则 */ #include <stdio.h>#include <stdlib.h>main(){ int a=3,b=5,c; c=(a>b)?(a+b):(a-b); printf("The max value of a and b is: %d\n",c); a=6; b=2; c=(a>b)?(a-b):(a+b); printf("The max value of a and b is: %d\n",c);}

Page 45: 第 6 章 基本的程序语句

45

C语言共有各类运算符 47个,按优先级可分为

11个类别共 15个优先级。

运算符的优先级与运算方向: P34表 2-10

复杂表达式的计算顺序

Page 46: 第 6 章 基本的程序语句

46

例 阅读程序,分析复杂表达式的计算顺序。/*example6_18.c 复杂表达式的计算顺序 */ #include <stdio.h>main(){ int a=10,b=15,c=14,temp; temp= a+6>b && b-c>c; /* ① */ printf("a+6>b && b-c>c= %d\n",temp); temp=!a+b*c-b/a && b-a*!(c-a); /* ② */ printf("!a+b*c-b/a && b-a*!(c-a)= %d\n",temp);}

请分析并修改程序。

Page 47: 第 6 章 基本的程序语句

47

C语言的基本语句结构

C语言的语句可分为四大类:1.表达式语句2.复合语句3.控制语句4.转向控制语句

Page 48: 第 6 章 基本的程序语句

48

1.表达式语句一个独立的语句就是表达式语句。如:

a=3*b-c/2;i--;++j:b=(a>3)? 1:0;

2.复合语句 “由一对花括号 { }”将多个表达式语句括起来所组成。如:{ a=b+c; x=y%a; prinft("a=%d, x=%d\n", a, x);}

Page 49: 第 6 章 基本的程序语句

49

3.控制语句由控制结构组成的语句,有 5种控制语句:( 1)选择(分支)语句: if…else。( 2)多分支语句: switch。( 3) for循环语句: for。( 4) while循环: while。( 5) do_while循环: do…while。

4.转向控制语句由系统提供的关键字构成,用于改变程序的流程。 有 4种转向控制语句:( 1) break;可用于 switch语句和循环的语句。( 2) continue;只适用于循环语句。( 3) return;用在函数的结束处。( 4) goto<标号 >;可用于程序的任何地方,但不提倡使用。

Page 50: 第 6 章 基本的程序语句

50

6.5 标准输入输出函数常用的标准输入 /输出函数有如下几种。( 1)格式化输入 /输出函数: scanf()/printf()。( 2)字符输入 /输出函数: getc()/putc()。( 3)字符输入 /输出函数: getch()/putch()。( 4)字符输入 /输出函数: getchar()/putchar()。( 5)字符串输入 /输出函数: gets()/puts()。

C语言无 I/O语句, I/O操作由函数实现 #include <stdio.h> 不同的函数在功能上有所不同,使用时应根据具体的要求,选择合适的输入 /输出函数。Stdout 表示屏幕, Stdin表示键盘

Page 51: 第 6 章 基本的程序语句

51

格式输出函数 printf()

格式: printf(“ ”格式控制字符串 ,输出项列表 )功能:按指定格式向显示器输出数据返值:正常,返回输出字节数;出错,返回 EOF(-1)

输出项列表: 要输出的数据(可以没有,多个时“以 ,”分隔)

格式控制字符串:包含两种信息 格式说明: %[修饰符 ] 格式字符 ,用于指定输

出格式普通字符或转义序列:原样输出

格式字符 见下表

Page 52: 第 6 章 基本的程序语句

52

d x,Xoucs

e,Efg

%%

十六进制无符号整数

不带符号十进制整数

十进制整数

指数形式浮点小数

单一字符字符串

八进制无符号整数

小数形式浮点小数e和 f中较短一种百分号本身

int a=567;printf ( “%d”,a);

int a=255;printf(“%x”,a);

int a=65;printf(“%o”,a);

int a=567;printf(“%u”,a);

char a=65;printf(“%c”,a);

printf(“%s”,“ABC”);

float a=567.789;printf(“%e”,a);

float a=567.789;printf(“%f”,a);

float a=567.789;printf(“%g”,a);

printf(“%%”);

567

ff

101

567

A

ABC

5.677890e+02

567.789000

567.789

%

说明格式字符要用小写格式字符与输出项个数应相同,按先后顺序一一对应输出转换 :格式字符与输出项类型不一致 ,自动按指定格式输出

表格

Page 53: 第 6 章 基本的程序语句

53

m.n 以宽度 m输出实数,指定小数点后 n位数 (四舍五入 )

修饰符 功 能

m 输出数据域宽 ,数据长度 <m,左补空格 ;否则按实际输出

输出数据在域内左对齐(缺省右对齐 )-

指定在有符号数的正数前显示正号 (+)+

输出数值时指定左面不使用的空位置自动填 00

用常量或变量的值作为输出宽度 *

在 d,o,x,u前,指定输出精度为 long型在 e,f,g前,指定输出精度为 double型l

附加格式说明符(修饰符)

对字符串 ,指定实际输出位数

printf (“%*d”,5,i)printf (“%*d”,k,i)

long a=65536;

printf(“%d,%8ld\n”,a, a);

//0, 65536���

//0, 65536���

例 int a=1234; float f=123.456; printf(“%08d\n”,a); printf(“%010.2f\n”,f); printf(“%0+8d\n”,a); printf(“0+10.2f\n”,f);

//00001234

//0000123.46//000+1234//000+123.56

Page 54: 第 6 章 基本的程序语句

54

阅读程序【例 6-19】

【例 6-20】

【例 6-21 】 。

了解格式输出的方法。

Page 55: 第 6 章 基本的程序语句

55

格式输入函数 scanf()格式 : scanf(“ ”格式控制串 ,地址表)功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中 ,并按回车键结束返值:正常,返回输入数据个数

地址表:变量的地址,常用取地址运算符 &格式字符 :d,i,o,x,u,c,s,f,e

例 scanf(“%d”,&a); 输入: 10 则 a=10

例 scanf(“%x”,&a); 输入: 11 则 a=17

Page 56: 第 6 章 基本的程序语句

56

附加格式说明符(修饰符)

l

修饰符 功 能

h

m

*

用于 d,o,x前,指定输入为 short型整数

用于 d,o,x前,指定输入为 long型整数

用于 e,f前,指定输入为 double型实数

指定输入数据宽度,遇空格或不可转换字符则结束

抑制符,指定输入项读入后不赋给变量

例 scanf(“%4d%2d%2d”,&yy,&mm,&dd); 输入 19991015 则 1999yy, 10 mm, 15 dd scanf(“%d%*c%c”,&yy,&dd); 输入 64ַq 则ayy, ‘q’ dd

修饰符功能

Page 57: 第 6 章 基本的程序语句

57

一般以空格、 TAB或回车键作为分隔符其它字符做分隔符:格式串中两个格式符间字符

例 scanf(“%d%o%x”,&a,&b,&c); printf(“a=%d,b=%d,c=%d\n”,a,b,c); 输入 123 123 123 输出 a=123,b=83,c=291

例 scanf(“%d:%d:%d”,&h,&m,&s); 输入 12:30:45 则 12 h, 30 m, 45 s

例 scanf(“%d,%d”,&a,&b) 输入 3,4 则 3a, 4 b

例 scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); 输入 a=12,b=24,c=36

输入分隔符的指定

Page 58: 第 6 章 基本的程序语句

58

“用 %c”格式符时,空格和转义字符作为有效字符输入

如 scanf(“%c%c%c”,&c1,&c2,&c3); 若输入 abc� � 则 ac1, � c2, b c3

输入数据时,遇以下情况认为该数据结束: 遇空格、 TAB、或回车 遇宽度结束 遇非法输入

如 scanf(“%d%c%f”,&a,&b,&c);

若输入 1234a123o.26

则 1234 a, ‘a’ b, 123 c

“ ”输入函数留下的 垃圾 :

例 int x; char ch; scanf(“%d”,&x); ch=getchar(); printf(“x=%d,ch=%d\n”,x,ch);执行: 123输出: x=123,ch=10

例 int x; char ch; scanf(“%d”,&x); scanf(“%c”,&ch); printf(“x=%d,ch=%d\n”,x,ch);执行: 123输出: x=123,ch=10

解决方法:( 1)用 getchar()清除( 2)用函数 fflush(stdin)清除全部剩余内容 (3) “用格式串中空格或 %*c” “ ”来 吃掉 (4) 可先输入字符型,后输入数值型

例 int x; char ch; scanf(“%d”,&x); scanf(“ %c”,&ch);

或 scanf(“%*c%c”,&ch);

说明:

Page 59: 第 6 章 基本的程序语句

59

#include <math.h>#include <stdio.h>main(){ float a,b,c,s,area; scanf("%f,%f,%f",&a,&b,&c); s=1.0/2*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("a=%7.2f, b=%7.2f, c=%7.2f, s=%7.2f\n",a,b,c,s); printf("area=%7.2f\n",area);}

输入: 3,4,6 输出: a= 3.00, b= 4.00, c= 6.00 s= 6.50 area= 5.33

文件包含预处理命令

变量定义输入数据

输出数据

例 输入三角形边长,求面积

Page 60: 第 6 章 基本的程序语句

60

/*ch6_13.c*/#include "stdio.h"main(){ char c1,c2; c1=getchar(); printf("%c,%d\n",c1,c1); c2=c1+32; printf("%c,%d\n",c2,c2);}

输入: A 输出: A,65 a,97

例 从键盘输入大写字母,用小写字母输出

Page 61: 第 6 章 基本的程序语句

61

字符 /字符串输出函数 函 数 原 型 函 数 功 能

int putc( int ch,FILE *stream) ;

将 ch所对应的字符输出到stream 指定的文 件流中( stdout表示屏幕)

int putch( int ch) ;将缓冲区中 ch所对应的字符输出到屏幕

int putchar( int ch) ; 将 ch所对应的字符输出到屏幕

int puts( int ch,FILE *stream) ;

将 ch所对应的字符串输出到stream 指定的文 件流中( stdout表示屏幕)

Page 62: 第 6 章 基本的程序语句

62

/*example6_24.c 了解字符输出函数的功能 */#include "stdio.h"#include "conio.h"main(){ char ch1='A',ch2='B',ch3[]="abcd"; int a=97,b=32; printf("将字符输出到标准输出流 :\n" ); putc(ch1,stdout); printf("\n输出字符串常量 :\n" ); puts(ch3); printf("\n输出字符常量 :\n" ); putch('O'); putchar('K');

printf("\n输出字符常量 :\n" ); putch(ch1); putchar(ch2); printf("\n输出表达式对应的字符 :\n" ); putch(a); putchar(a-b); putch('\n');}

Page 63: 第 6 章 基本的程序语句

63

1 putchar(int ch)是定义成 putc( int ch,stdout )的一个宏,其作用是一样的,但putc有更多的功能 ;

2 putch() 和 putchar()的功能等同于printf()函数的 %c,函数中的参数可以是字符常量 ,字符变量和整型表达式 ;

3 puts()的参数为字符型的数组 .

关于字符输出函数特别提醒

Page 64: 第 6 章 基本的程序语句

64

字符 /字符串输入函数

函 数 原 型 函 数 功 能int getc(FILE *stream);

从指定的输入流 stream中读取字符( stdin表示键盘)

int getch();将键盘读取的字符放入缓冲区,键盘输入的字符不显示在屏幕上

int getchar();将键盘读取的字符放入缓冲区,键盘输入的字符会显示在屏幕上

int gets( int ch,FILE *stream) ;

从指定的输入流 stream中读取字符串( stdin表示键盘)

Page 65: 第 6 章 基本的程序语句

65

/*example6_25.c 了解字符输入函数的功能 */#include "stdio.h"#include "conio.h"main(){ char ch1,ch2,ch3,ch4[10]; int a=97,b=32; printf("ch1=getc(stdio):\n" ); ch1=getc(stdin); putc(ch1,stdout); scanf("%*c",ch1); fflush(stdin); printf("\nch2=getchar():\n" ); ch2=getchar(); putchar(ch2); printf("\nthe value of ch2 is %d:\n",ch2 );

fflush(stdin); printf("input ch3=getch():\n" ); ch3=getch(); putch(ch3); printf("\nplease input ch4:" ); gets(ch4); printf("ch4 is:"); puts(ch4); printf("\nThe End!\n" ); }

Page 66: 第 6 章 基本的程序语句

66

1.使用 getch()函数输入字符后,输入的字符不会显示在屏幕上。

2.用字符输入函数接收字符时,并不是从键盘输入一个字符后立即响应,而是将输入的内容先读入缓冲区,待输入结束后再一并执行。

3.与 scanf()输入函数不一样,字符输入函数将空格符、制表符、换行符也作为字符接收。

4.用 getchar()、 fflush(stdin)、 scanf(%*c)清除字符垃圾

关于字符输入函数特别提醒

Page 67: 第 6 章 基本的程序语句

67

6.6 程 序 范 例【例 6-26 】 编写程序,计算两复数的差。程序要求从键盘输入两个复数的实部和虚部的值,然后求第 1个复数与第 2个复数的差。

核心算法分析: 两个复数的算术运算结果仍为复数,计算两个复数的差是实部与实部相减,虚部与虚部相减,即 (a1+b1i)−(a2+b2i)=(a1-a2)+(b1-b2)i。

程序见: example6_26.c 思考:请修改程序,完成计算两复数的和与两复数的差

Page 68: 第 6 章 基本的程序语句

68

【例 6-28 】 简单的数学计算。编写程序,计算 3个数的和的平均值。

核心算法分析:计算 3个数 a、 b、 c之和的平均值方法为: (a+b+c)/3 。

程序见: example2_28.c

思考:请修改程序,完成其他的简单算术运算。

Page 69: 第 6 章 基本的程序语句

69

本 章 小 结本章重点

1.基本数据类型及取值范围。 不同类型的变量有不同的取值范围。2.基本表达式的意义 算术表达式、关系表达式、逻辑表达式3.复杂表达式的优先级和表达式的意义 任何复杂表达式都是基本表达式的组合。4.几组输入 / 输出函数( 1)格式化输入 /输出函数: scanf()/printf()。( 2)字符输入 /输出函数: getc()/putc()。( 3)字符输入 /输出函数: getch()/putch()。( 4)字符输入 /输出函数: getchar()/putchar()。

Page 70: 第 6 章 基本的程序语句

70

作 业

书面作业:题 6.48 题 6.49题 6.53

其他的题目上机操作练习