Upload
zoe-bowen
View
70
Download
3
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
《 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);
}
函数首部
函数体
声明部分
执行部分
函数
…
void main(){ ……}
2 、调试 C 语言程序的方法
开始 结果
语法错误
源程序.c / .c
pp
目标程序
.obj
可执行程序.exe
编辑 编译 连接 运行
连接错误
运行错误
第二章 数据描述与基本操作
• §1 数据类型• §2 常量与变量• §3 运算符与表达式• §4 不同类型数据间的转换• §5 数据的输入和输出
2 学时
2 学时
本节
§1 数据类型整型
基本类型
构造类型
指针类型空类型 void
浮点型
字符型 char
枚举类型 enum
短整型 short基本整型 int长整型 long
单精度 float双精度 double
数组 以 [ ] 标志结构体 struct
共同体 union
文件类型 FILE
第 7 章
第 9 章
第 6 章
第 5 章
本章
第 7 章
数据的存储(置后介绍)
一、常量
直接常量(字面常量) 符号常量
整型常量: -3、 0实型常量: 1.2、 3.0字符常量:‘ a’ 、‘ #’
参阅教材 P22例 5
直接书写 用一个标识符代表一个常量
程序运行中值不能改变的量
§2 常量与变量
带 # 的为预处理命令 , 编译前先处理。
(第 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 < 符号常量 > < 常量值 >
使用符号常量含义清楚,修改方便。 一个预处理命令中只能定义一个符号常量。定义后本程序中所有该符号都代表相应的常量值。 符号常量与变量不同,其值不能在程序中被改变。 习惯上用大写字母表示符号常量,小写表示变量。
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原码: 补码:
直接常量
2 、浮点型常量(实数)
有 2 种表示形式: 十进制小数形式:由数字和小数点组成,必须有小数点。如 0.0 为浮点型,而 0 为整型。 指数形式:用 E或 e 表示 10 的幂。 123×103 表示为 123E3或 123e3
一个浮点数有多种指数形式,应采用规范化的 ( 科学记数法 ) 表示方法: E 前的小数部分中,小数点前应有且只有一位非 0 数。如: -1.23e5 是规范化的, 756e0 是不规范化的。 系统输出时按规范化形式输出。 不能用 8 进制和 16 进制表示,只能用 10 进制表示。
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 进制数代表的字符
转义字符
如: \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 值
\ 字符
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
二、变量
代表内存中具有特定属性的一块存储空间,用来存放数据。变量值:变量代表的存储空间中存放的数据。程序运行中,其值可变。
变量名:用一个名字代表变量对应的存储空间。
变量的地址:变量代表的那块存储空间的首地址。变量 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 )调至赋值表达式处详介
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
3 、变量声明(定义)
①变量声明的意义
不同类型的数据在内存中占居不同长度的存储区,在程序中引用一个变量,实际上是对指定存储空间的引用,必须先为其分配存储空间才能引用,即先定义后使用。凡未被定义的变量,不认为是变量名,保证了变量名的正确性。如:使用了 int student; 而执行部分中误写为 stadent=30 ;则系统会提示“ Undefined symbol ‘standent’ in function main” 。 一种数据类型对应一组允许的操作。变量声明便于编译时检查程序中对该变量的运算是否合法。如: float a,b; 则a%b(求余 ) 非法。 一种数据类型对应一个取值范围。
变量必须先定义后使用,这样编译时才能根据指定的类型为其分配存储空间,确定数据的存储方式和允许的操作。
②变量声明的方法
〈数据类型标识符〉〈变量名表〉 ;
一般放在函数的声明部分,也可以放在函数中某一段分程序(用 {} 号括起来的程序段)中,其作用域仅限于它所在的分程序。 一个程序中的一个变量只能属于某类型,不能声明为几种不同类型。 允许在声明变量时为变量赋初值。如:
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;
数据的存储空间长度及取值范围 (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
整型和字符型数据有带符号和无符号两种
一、整型变量
整
型
[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 、整型变量的分类
内存中的整型数据是以二进制形式存储的。带符号的整型数据的最高位(左边)为符号位: 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)
无符号的整型数据的最高位不作符号位,因此不能存放负数,但所能存储的最大数扩大了一倍。
无符号的整型
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)
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
不同类型的整型数据可以进行算术运算
转到前面遗留问题
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 求反
浮点型
单精度 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 、浮点型数据的存储
二、浮点型(实型)变量
3 、浮点型数据的舍入误差(补充)
浮点型变量的存储空间是有限的,有效数字也是有限的,有效位以外的数字将被舍去,因此会产生误差。
main()
{
float a,b;
a=123456.789e5;
b=a+20;
printf(“%f,%f\n”,a,b);
}
运行结果: 12345678848.00000 ,12345678848.00000
结论:单精度浮点型数据的有效数为 7 位,后几位数是不准确的,把 20 这样一个很小的数加在丢失精度的大数上是无意义的,应避免。
字符
[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 码
三、字符型变量
例 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
扩展:大小写字母的转换
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
例 3:
main( )
{ char c; c=0362; /*以 0 开头为 8 进制*/ printf(“%d\n”,c);}
运行结果:-14
(0362)8
c 11110010 补码
符号位外其它位求反
加 1 补符号位原码
10001101
10001110-14
补充举例 : 为字符变量赋整数值
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
能否将上例改为:
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
在可输出的字符范围内,整型和字符型可以通用。
测试某种类型数据所占存储空间的长度
sizeof( 类型标识符 )
例 4 (了解)
main( )
{
printf( “char: %d bytes\n”, sizeof(char) );
…
}
课后作业及上机任务
习题 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