32
C 语语语语语语语语语语Huanghuai University Department of Information Engineering 语语 语语语语语语语语语语 北北北北北北北 北北北 北北北北北

《 C 语言程序设计案例教程 》

Embed Size (px)

DESCRIPTION

北京大学出版社. 《 C 语言程序设计案例教程 》. 汪新民、刘若慧主编. 主讲:傅 丰 黄淮学院信息工程学院. Huanghuai University Department of Information Engineering. 知识回顾. 1 、 C 语言程序的结构. int max(int x , int y) { int z; if (x>y) z=x; else z=y; return(z); }. 函数首部. 函数. 声明部分. 函数体. 执行部分. 程序. 函数. …. - PowerPoint PPT Presentation

Citation preview

Page 1: 《 C 语言程序设计案例教程 》

《 C 语言程序设计案例教程》

Huanghuai University Department of Information

Engineering

主讲:傅 丰黄淮学院信息工程学院

北京大学出版社

汪新民、刘若慧主编

Page 2: 《 C 语言程序设计案例教程 》

知识回顾1、 C 语言程序的结构

函数

程序 函数

int max(int x, int y)

{

int z;

if (x>y) z=x;

else z=y;

return(z);

}

函数首部

函数体

声明部分

执行部分

函数

void main(){ ……}

Page 3: 《 C 语言程序设计案例教程 》

2 、调试 C 语言程序的方法

开始 结果

语法错误

源程序.c / .c

pp

目标程序

.obj

可执行程序.exe

编辑 编译 连接 运行

连接错误

运行错误

Page 4: 《 C 语言程序设计案例教程 》

第二章 数据描述与基本操作

• §1 数据类型• §2 常量与变量• §3 运算符与表达式• §4 不同类型数据间的转换• §5 数据的输入和输出

2 学时

2 学时

本节

Page 5: 《 C 语言程序设计案例教程 》

§1 数据类型整型

基本类型

构造类型

指针类型空类型 void

浮点型

字符型 char

枚举类型 enum

短整型 short基本整型 int长整型 long

单精度 float双精度 double

数组 以 [ ] 标志结构体 struct

共同体 union

文件类型 FILE

第 7 章

第 9 章

第 6 章

第 5 章

本章

第 7 章

数据的存储(置后介绍)

Page 6: 《 C 语言程序设计案例教程 》

一、常量

直接常量(字面常量) 符号常量

整型常量: -3、 0实型常量: 1.2、 3.0字符常量:‘ a’ 、‘ #’

参阅教材 P22例 5

直接书写 用一个标识符代表一个常量

程序运行中值不能改变的量

§2 常量与变量

Page 7: 《 C 语言程序设计案例教程 》

带 # 的为预处理命令 , 编译前先处理。

(第 4章 )

符号常量(使用前必须先定义):

例:求圆的面积(参阅教材 P22例 5 )

#define PI 3.141592654

#define R 20

main()

{ double s, c;

s=PI*R*R;

c=2*PI*R;

printf(“s=%f,c=%f\n”,s,c);

}

#define < 符号常量 > < 常量值 >

使用符号常量含义清楚,修改方便。 一个预处理命令中只能定义一个符号常量。定义后本程序中所有该符号都代表相应的常量值。 符号常量与变量不同,其值不能在程序中被改变。 习惯上用大写字母表示符号常量,小写表示变量。

Page 8: 《 C 语言程序设计案例教程 》

1 、整型常量(整常数) 有 3 种表示形式: 8 进制:以 0 开头的整数,如: 012、 -012 ; 16 进制:以 0x 开头的整数,如: 0x12、 -0x12 ;

10 进制:以非 0 数字开头的整数,如: 12、 -12

数值在 -32768~32767 间的为基本整型 int 。超出该范围但在 - 231~( 231-1 )范围内的整数为 long (int) 型。 整型常量后加 l或 L 则为 long (int) 型,用于函数调用中和 long (int) 型形参对应的实参的书写。如 123和123L 的大小相同,但存储时所占字节数分别为 2和 4个字节。 整型常量后加 u 则为 unsigned (int) 型。如 -12345u ,则先将 -12345 转成补码 53191 ,然后按无符号数存储。

置后介绍

1011000000111001 1100111111000111原码: 补码:

直接常量

Page 9: 《 C 语言程序设计案例教程 》

2 、浮点型常量(实数)

有 2 种表示形式: 十进制小数形式:由数字和小数点组成,必须有小数点。如 0.0 为浮点型,而 0 为整型。 指数形式:用 E或 e 表示 10 的幂。 123×103 表示为 123E3或 123e3

一个浮点数有多种指数形式,应采用规范化的 ( 科学记数法 ) 表示方法: E 前的小数部分中,小数点前应有且只有一位非 0 数。如: -1.23e5 是规范化的, 756e0 是不规范化的。 系统输出时按规范化形式输出。 不能用 8 进制和 16 进制表示,只能用 10 进制表示。

Page 10: 《 C 语言程序设计案例教程 》

3 、字符型常量 用单引号括起来的一个字符。如‘ a’ 和‘ A’ 为不同字符,而“ a” 不是字符,是字符串。 单引号中的字符不能是单引号和反斜杠 \ ,可分别用‘ \’’ 和‘ \\’ 表示。 转义字符: (1) 以反斜杠 \ 后跟一个字母,代表一个控制字符。如:‘ \n’ 表示换行。见 P24表 2-4 (2) 以反斜杠 \ 后跟 ASCII值,代表该 ASCII 值对应的字符 (P350 附录 1) 。

字符 含义 ASCII

\n 换行 ( 到下行开头 ) 10

\t 跳到下一个 Tab位 (8列 ) 9

\b 退格 ( 前移一列) 8

\r 回车 ( 到本行开头 ) 13

\f 换页 ( 到下页开头 ) 12

\\ 反斜杠 \ 92

\’ 单引号’ 39

\” 双引号” 34

\ddd 1~3位 8 进制数代表的字符

\xhh 1~2位 16 进制数代表的字符

Page 11: 《 C 语言程序设计案例教程 》

转义字符

如: \101或 \x41 表示‘ A’ \010或 \x08 表示‘ \b’ (退格) \012或 \x0A 表示‘ \n’ (换行) \0 表示 ASCII 码为 0 的字符(空操作)

在 P24表 2-4 中:为转义字符不在表中:表示 2 个字符带 x 前缀的 1~2 位数: 16 进制不带 x 前缀的 1~3 位数: 8 进制

ASCII 码表见 P350 附录 1

例 6: printf(“Y\b=\n”); 结果:¥(只能打印,不能显示)例 7: printf(“\362”); 结果:≥

补充举例: printf(“_ab_c\t_de\rf\tg\n”); /*_ 代表空格 */ printf(“h\ti\b\bj_k\n”); 分析: 结果:1 2 3 4 5 6 7 8 9 0 1

f a b c g d e

h j i k

1 2 3 4 5 6 7 8 9 0 1

f g d e

h j k

说明: \t 的作用是跳到下一个制表位(一个制表位占 8 列)。 \r 是回到本行开头,则此后在本行上再输出的字符(包括空格 和跳格)所经过的位置将取代原来该位置上的字符。

\ASCII 值

\ 字符

Page 12: 《 C 语言程序设计案例教程 》

4 、字符串常量

由一对双引号括起来的字符序列。“ a” 与‘ a’ 不同。 如: char c; 则 c=‘a’; 是正确的, c=“a” 是错误的。 双引号为定界符,不属于字符串,串中的单引号要用转 义字符 \’ 表示。如:字符串“ I say: ‘Goodby!’ ” 应表示为:

“ I say: \‘Goodby!\’ ”

字符串中的字符个数称为字符串的长度。字符串常量在 内存中的存储是以‘ \0’ 作结束标志的。

如:“ CHINA” 的长度为 5 ,占 6 字节

“ a”占 2 字节 ‘ a’占 1 字节

“” 表示空字符串,占 1 字节

C H I N A \0

a \0

\0

实际存储的是字符的二进制 ASCII 码

a

65 0

Page 13: 《 C 语言程序设计案例教程 》

二、变量

代表内存中具有特定属性的一块存储空间,用来存放数据。变量值:变量代表的存储空间中存放的数据。程序运行中,其值可变。

变量名:用一个名字代表变量对应的存储空间。

变量的地址:变量代表的那块存储空间的首地址。变量 a 的地址记作 &a

如: int a; 编译时为变量名 a 分配存储空间( 2 字节)。 a=3; 将 3 存放到变量 a 的存储空间,称变量 a 的值为 3 。 a=a+1; 将 a 中的值取出加 1 后再存放到 a 的存储单元中。

a变量

名 00000000

00000011

3

内 存

+1

00000000

00000101

4 变量

1 、变量有关的概念

从运算器向变量代表的存储空间传送数据的操作,称为赋值( P26 )调至赋值表达式处详介

Page 14: 《 C 语言程序设计案例教程 》

2 、标识符

为程序中变量、符号常量、函数、数组等对象所起的名字

以字母或下划线开头,由字母、数字或下划线组成的字符序列。如:¥ 123、 3D、 a>b、 5_2、 one-of、 a book 非法, day、 _total、 A_1 合法。 不能与 P351 附录 II 中的 32 个关键字同名。 系统内部使用了一些以下划线开头的标识符,为防止冲突,建议用户自定义标识符尽量不要以下划线开头。 区分大小写。如 Sum和 sum 为不同变量。习惯上,变量和函数名用小写,符号常量用大写。 ANSI C 没规定标识符的长度,但不同的 C 编译系统有自己的规定:Turbo C 允许变量名长 32 个字符,有的则允许 8 个字符。考虑程序移植性,建议变量名最好不超过 8 个字符。 应做到见名知意,避免使用易认错的字符。如: 2、 Z和 z

Page 15: 《 C 语言程序设计案例教程 》

3 、变量声明(定义)

①变量声明的意义

不同类型的数据在内存中占居不同长度的存储区,在程序中引用一个变量,实际上是对指定存储空间的引用,必须先为其分配存储空间才能引用,即先定义后使用。凡未被定义的变量,不认为是变量名,保证了变量名的正确性。如:使用了 int student; 而执行部分中误写为 stadent=30 ;则系统会提示“ Undefined symbol ‘standent’ in function main” 。 一种数据类型对应一组允许的操作。变量声明便于编译时检查程序中对该变量的运算是否合法。如: float a,b; 则a%b(求余 ) 非法。 一种数据类型对应一个取值范围。

变量必须先定义后使用,这样编译时才能根据指定的类型为其分配存储空间,确定数据的存储方式和允许的操作。

Page 16: 《 C 语言程序设计案例教程 》

②变量声明的方法

〈数据类型标识符〉〈变量名表〉 ;

一般放在函数的声明部分,也可以放在函数中某一段分程序(用 {} 号括起来的程序段)中,其作用域仅限于它所在的分程序。 一个程序中的一个变量只能属于某类型,不能声明为几种不同类型。 允许在声明变量时为变量赋初值。如:

float f=3.5; char c=‘a’; int x=1,y=3+5; int x,y=1; int x=1,y=1; 均合法。 int x=y=1; 非法。

如: int m, n; char c; float x;

仅对 y 赋了初值:int x,y;y=1;

Page 17: 《 C 语言程序设计案例教程 》

数据的存储空间长度及取值范围 (P21)

基本类型 字节 取值范围

[signed]

带符号

short [int] 2 -32768~32767 ( 215-1 )int 2 -32768~32767

long [int] 4 - 231~( 231-1 )

unsigned

无符号

short [int] 2 0~65535 ( 216-1 )int 2 0~65535

long [int] 4 0~( 232-1 )

浮点型

单精度 float 4 -3.4e-38~3.4e38 有效数 6~7 位双精度 double 8 -1.7e-308~1.7e308 有效数 15~16

位长双精度 long double 16 -1.2e-4932~1.2e4932

字符

[signed] char 1 -128~127( 27-1 )unsigned char 1 0~255 ( 28-1 )

说明:不同的 C 编译系统对基本整型 int 的处理不同, Turbo C 2.0 将其处理为short

整型和字符型数据有带符号和无符号两种

Page 18: 《 C 语言程序设计案例教程 》

一、整型变量

[signed]

带符号

short [int] 2 字节 -32768~32767 ( 215-1 )

int 2 字节 -32768~32767

long [int] 4 字节 - 231~( 231-1 )

unsigned

无符号

short [int] 2 字节 0~65535 ( 216-1 )int 2 字节 0~65535

long [int] 4 字节 0~( 232-1 )说明:不同的 C 编译系统为基本整型 int 分配的字节数不同: Turbo C 2.0和 Turbo C++3.0 为其分配 2 个字节 Visual C++ 6.0 为其分配个 4 字节

1 、整型变量的分类

Page 19: 《 C 语言程序设计案例教程 》

内存中的整型数据是以二进制形式存储的。带符号的整型数据的最高位(左边)为符号位: 0 表示正, 1 表示负。 内存中的数据以补码形式表示:正数的补码是:该数的二进制数( 原码 ) ;负数的补码是:对原码除符号位外求反,加 1 后补上符号位。

带符号的整型

如: int x; /* 声明 x 为整型变量,为其分配 2 字节存储空间*/ x=10; /*将 10 存放到 x 的存储空间中 ,10 的二进制为1010 */0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0

若: x=-10; 则存 -10 的补码:①除符号位外(绝对值)求反:

符号

1 1 1 1 1 1 1 1 1 1 1 0 1 0 1

②加 1 后补上符号位1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0

2 、整型数据的存储(1)

Page 20: 《 C 语言程序设计案例教程 》

无符号的整型数据的最高位不作符号位,因此不能存放负数,但所能存储的最大数扩大了一倍。

无符号的整型

int 型负数 :

加1

0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1int 型正数 :

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

215-1= 32767

存储的是补码,除符号外求反加 1 可以得到原码:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1求反

-215= -327681 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0unsigned:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 216-1= 65535

2 、整型数据的存储(2)

Page 21: 《 C 语言程序设计案例教程 》

3 、整型变量的定义(补充)

例:整型变量的定义与使用。

main()

{

int a,b,c,d;

unsigned u;

a=12; b=-24; u=10;

c=a+u; d=b+u;

printf(“a+u=%d,b+u=%d\n”,c,d);

}

运行结果: a+u=22,b+u=-14

不同类型的整型数据可以进行算术运算

转到前面遗留问题

Page 22: 《 C 语言程序设计案例教程 》

4 、整型数据的溢出(补充)int 型变量的范围为 -32768~32767 ,超出会出现数据溢出。

main()

{

int a,b;

a=32767;

b=a+1;

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

}

0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

32767

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0+1 后

由补码求原码:除符号位外求反加 1

1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

-32768运行结果: 32767, -32768

将变量类型改为高一级类型便可解决

也可以是除符号位外 -1 求反

Page 23: 《 C 语言程序设计案例教程 》

浮点型

单精度 float 4 字节 -3.4e-38~3.4e38 有效数 6~7 位双精度 double 8 字节 -1.7e-308~1.7e308 有效数 15~16 位长双精度 long double

16 字节

-1.2e-4932~1.2e4932 (不常用)

按指数形式存储,分成小数和指数两部分存放。如: 3.14159

+ .314159 1

符号位 0或 1 小数部分 指数部分

标准 C未规定小数和指数部分的位数,各种 C 编译系统的规定不同。多数用 24位 ( 包括符号位 ) 表示小数部分, 8 位表示指数部分 ( 包括符号位 ) 。小数部分位数越多,精度越高;指数部分位数越多,表示的数据范围越大。

1 、浮点型变量的分类

2 、浮点型数据的存储

二、浮点型(实型)变量

Page 24: 《 C 语言程序设计案例教程 》

3 、浮点型数据的舍入误差(补充)

浮点型变量的存储空间是有限的,有效数字也是有限的,有效位以外的数字将被舍去,因此会产生误差。

main()

{

float a,b;

a=123456.789e5;

b=a+20;

printf(“%f,%f\n”,a,b);

}

运行结果: 12345678848.00000 ,12345678848.00000

结论:单精度浮点型数据的有效数为 7 位,后几位数是不准确的,把 20 这样一个很小的数加在丢失精度的大数上是无意义的,应避免。

Page 25: 《 C 语言程序设计案例教程 》

字符

[signed] char 1 字节 -128~127( 27-1 )

unsigned char 1 字节 0~255 ( 28-1 )

1 、字符型变量的分类

2 、字符型数据的存储 字符型变量用于存放字符常量,占 1 个字节。但并不是把字符本身存入内存,而是存放字符的二进制 ASCII码 (P350 附录1) 。 字符的存储与整数的存储类似,两者 间可以通用(相互赋值,混合运算)。但字符变量只占 1 个字节,只能存放 0~255之间的整数。如: char c1=‘a’;

a 97 01100001

字符 十进制 二进制 ASCII 码 ASCII 码

三、字符型变量

Page 26: 《 C 语言程序设计案例教程 》

例 1:

main( )

{

char ch;

ch=‘a’;

printf(“%d”,ch);

printf(“%c\n”,ch);

}

运行结果:97a

97 01100001ch

例 2:

main( ){ char ch; int i; ch=‘A’; ch=ch+32; i=ch; printf(“%d is %c”,i,ch); printf(“%c is %d\n”,ch,ch);}

运行结果:97 is aa is 97

65 97ch

‘A’的 ASCII 值为 65‘a’的 ASCII 值为 97

97i

Page 27: 《 C 语言程序设计案例教程 》

扩展:大小写字母的转换

main()

{

char c1,c2;

c1=‘a’; c2=‘B’;

c1=c1-32;

c2=c2+32;

printf(“%c %c\n”,c1,c2);

} 运行结果: A b

a 01100001

B 01000010

c1

c2

97

66

97-32=65 ------A

66+32=98 ------ b

Page 28: 《 C 语言程序设计案例教程 》

例 3:

main( )

{ char c; c=0362; /*以 0 开头为 8 进制*/ printf(“%d\n”,c);}

运行结果:-14

(0362)8

c 11110010 补码

符号位外其它位求反

加 1 补符号位原码

10001101

10001110-14

Page 29: 《 C 语言程序设计案例教程 》

补充举例 : 为字符变量赋整数值

main()

{

char c1,c2;

c1=97; c2=98;

printf(“%c %c\n”,c1,c2);

printf(“%d %d\n”,c1,c2);

}

运行结果: a b 97 98

97 01100001

98 01100010

c1

c2

Page 30: 《 C 语言程序设计案例教程 》

能否将上例改为:

main()

{

int c1,c2; char c1,c2;

c1=97; c2=98;

printf(“%c %c\n”,c1,c2);

printf(“%d %d\n”,c1,c2);

}

97 00000000 01100001

98 00000000 01100010

c1

c2

运行结果: a b 97 98

在可输出的字符范围内,整型和字符型可以通用。

Page 31: 《 C 语言程序设计案例教程 》

测试某种类型数据所占存储空间的长度

sizeof( 类型标识符 )

例 4 (了解)

main( )

{

printf( “char: %d bytes\n”, sizeof(char) );

}

Page 32: 《 C 语言程序设计案例教程 》

课后作业及上机任务

习题 4、 6、 7、 8、 9

必作: 1 、调试习题 4、 7、 9 2 、将“ China” 译成密码:用原来字母后面第4 个字母代替原来字母。如: A 后面第 4 个字母是 E ,用 E 代替 A 。“ China” 应译为“ Glmre” 。请编程用赋初值的方法使c1、 c2、 c3、 c4、 c5这 5 个变量的值分别为‘ C’ 、‘ h’ 、‘ i’ 、‘ n’ 、‘ a’ 。通过计算将其译成密码并输出。

选作:调试教材例 1、 2、 3、 5、 6、7