320 likes | 464 Views
北京大学出版社. 《 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); }. 函数首部. 函数. 声明部分. 函数体. 执行部分. 程序. 函数. ….
E N D
北京大学出版社 《 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() { …… } 函数
编辑 编译 连接 运行 源程序 .c / .cpp 目标程序 .obj 可执行程序 .exe 开始 结果 运行 错误 语法 错误 连接 错误 2、调试C语言程序的方法
第二章数据描述与基本操作 • §1 数据类型 • §2 常量与变量 • §3 运算符与表达式 • §4不同类型数据间的转换 • §5数据的输入和输出 2学时 本节 2学时
§1 数据类型 短整型short基本整型int长整型long 整型 本章 单精度float双精度double 基本类型 浮点型 字符型char 第7章 枚举类型enum 第5章 数组以[ ]标志 结构体struct 构造类型 第7章 共同体union 第9章 文件类型FILE 第6章 指针类型 空类型void 数据的存储 (置后介绍)
§2 常量与变量 一、常量 程序运行中值不能改变的量 直接常量(字面常量) 符号常量 直接书写 用一个标识符 代表一个常量 整型常量:-3、0 实型常量:1.2、3.0 字符常量:‘a’、‘#’ 参阅教材P22例5
带#的为预处理命令,编译前先处理。(第4章) • 符号常量(使用前必须先定义): #define <符号常量> <常量值> 例:求圆的面积(参阅教材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); }
直接常量 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)。
在P24表2-4中:为转义字符 不在表中:表示2个字符 转义字符 \字符 \ASCII值 带x前缀的1~2位数:16进制 不带x前缀的1~3位数:8进制 如:\101或\x41表示‘A’ \010或\x08表示‘\b’(退格)\012或\x0A表示‘\n’(换行)\0表示ASCII码为0的字符(空操作) 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”);分析:结果: 说明:\t的作用是跳到下一个制表位(一个制表位占8列)。 \r是回到本行开头,则此后在本行上再输出的字符(包括空格 和跳格)所经过的位置将取代原来该位置上的字符。
4、字符串常量 • 由一对双引号括起来的字符序列。“a”与‘a’不同。如:char c; 则c=‘a’; 是正确的,c=“a”是错误的。 • 双引号为定界符,不属于字符串,串中的单引号要用转义字符\’表示。如:字符串“I say: ‘Goodby!’ ”应表示为: “I say: \‘Goodby!\’ ” • 字符串中的字符个数称为字符串的长度。字符串常量在内存中的存储是以‘\0’作结束标志的。 • 如:“CHINA”的长度为5,占6字节 “a”占2字节 ‘a’占1字节 • “”表示空字符串,占1字节 实际存储的是字符的二进制ASCII码
变量值 a 变量名 +1 二、变量 1、变量有关的概念 代表内存中具有特定属性的一块存储空间,用来存放数据。 变量值:变量代表的存储空间中存放的数据。程序运行中,其值可变。 变量名:用一个名字代表变量对应的存储空间。 变量的地址:变量代表的那块存储空间的首地址。变量a的地址记作&a 内存 4 3 如:int a; 编译时为变量名a分配存储空间(2字节)。a=3; 将3存放到变量a的存储空间,称变量a的值为3。a=a+1; 将a中的值取出加1后再存放到a的存储单元中。 从运算器向变量代表的存储空间传送数据的操作,称为赋值(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(求余)非法。 • 一种数据类型对应一个取值范围。
②变量声明的方法 〈数据类型标识符〉〈变量名表〉; 如:int m, n; char c; float x; • 一般放在函数的声明部分,也可以放在函数中某一段分程序(用{}号括起来的程序段)中,其作用域仅限于它所在的分程序。 • 一个程序中的一个变量只能属于某类型,不能声明为几种不同类型。 • 允许在声明变量时为变量赋初值。如: • 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; 非法。 仅对y赋 了初值: int x,y; y=1;
数据的存储空间长度及取值范围(P21) 说明:不同的C编译系统对基本整型int的处理不同,Turbo C 2.0将其处理为short 整型和字符型数据有带符号和无符号两种
一、整型变量 1、整型变量的分类 说明:不同的C编译系统为基本整型int分配的字节数不同:Turbo C 2.0和Turbo C++3.0为其分配2个字节Visual C++ 6.0为其分配个4字节
2、整型数据的存储(1) 带符号的整型 • 内存中的整型数据是以二进制形式存储的。带符号的整型数据的最高位(左边)为符号位:0表示正,1表示负。 • 内存中的数据以补码形式表示:正数的补码是:该数的二进制数(原码);负数的补码是:对原码除符号位外求反,加1后补上符号位。 如:int x; /*声明x为整型变量,为其分配2字节存储空间*/ x=10; /*将10存放到x的存储空间中,10的二进制为1010 */ 符号位 若:x=-10; 则存-10的补码:①除符号位外(绝对值)求反: ②加1后补上符号位
2、整型数据的存储(2) 无符号的整型 无符号的整型数据的最高位不作符号位,因此不能存放负数,但所能存储的最大数扩大了一倍。 215-1= 32767 int型正数: int型负数: 存储的是补码,除符号外求反加1可以得到原码: 求反 -215= -32768 加1 unsigned: 216-1= 65535
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,超出会出现数据溢出。 将变量类型改为高一级类型便可解决 32767 main() { int a,b; a=32767; b=a+1; printf(“%d,%d\n”,a,b); } +1后 由补码求原码:除符号位外求反加1 -32768 运行结果: 32767,-32768 也可以是除符 号位外-1求反
二、浮点型(实型)变量 1、浮点型变量的分类 2、浮点型数据的存储 按指数形式存储,分成小数和指数两部分存放。如:3.14159 符号位0或1 小数部分指数部分 • 标准C未规定小数和指数部分的位数,各种C编译系统的规定不同。多数用24位(包括符号位)表示小数部分,8位表示指数部分(包括符号位)。 • 小数部分位数越多,精度越高;指数部分位数越多,表示的数据范围越大。
3、浮点型数据的舍入误差(补充) 浮点型变量的存储空间是 有限的,有效数字也是有限的, 有效位以外的数字将被舍去, 因此会产生误差。 main() { float a,b; a=123456.789e5; b=a+20; printf(“%f,%f\n”,a,b); } 运行结果: 12345678848.00000 ,12345678848.00000 结论:单精度浮点型数据的有 效数为7位,后几位数是不准确的, 把20这样一个很小的数加在丢失精 度的大数上是无意义的,应避免。
三、字符型变量 1、字符型变量的分类 2、字符型数据的存储 • 字符型变量用于存放字符常量,占1个字节。但并不是把字符本身存入内存,而是存放字符的二进制ASCII码(P350附录1)。 • 字符的存储与整数的存储类似,两者间可以通用(相互赋值,混合运算)。但字符变量只占1个字节,只能存放0~255之间的整数。如:char c1=‘a’; 字符十进制二进制ASCII码ASCII码
‘A’的ASCII值为65 ‘a’的ASCII值为97 例1: 例2: main( ) { char ch; ch=‘a’; printf(“%d”,ch); printf(“%c\n”,ch); } 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);} ch ch 运行结果: 97 is a a is 97 i 运行结果: 97a
扩展:大小写字母的转换 main() { char c1,c2; c1=‘a’; c2=‘B’; c1=c1-32; c2=c2+32; printf(“%c %c\n”,c1,c2); } 97 c1 66 c2 97-32=65 ------A 66+32=98 ------ b 运行结果:A b
例3: main( ) { char c; c=0362; /*以0开头为8进制*/ printf(“%d\n”,c);} 运行结果: -14 c 补码 符号位外其它位求反 加1补符号位原码 -14
补充举例: 为字符变量赋整数值 main() { char c1,c2; c1=97; c2=98; printf(“%c %c\n”,c1,c2); printf(“%d %d\n”,c1,c2); } c1 c2 运行结果:a b 97 98
能否将上例改为: main() { int c1,c2;char c1,c2; c1=97; c2=98; printf(“%c %c\n”,c1,c2); printf(“%d %d\n”,c1,c2); } 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