1、主讲教师:陈美莲,C语言程序设计,共 73 页 第 2 页,课程安排,总课时72,其中理论36学时,实验36学时课程基本要求1. 了解基本算法2. 了解C语言的数据类型、运算符与表达式的使用方法。3. 熟练三种基本设计语句编程。4. 熟练使用数组编程。5. 熟练函数的定义和设计。6. 了解指针的运算与使用。,共 73 页 第 3 页,教学方法及要求,1. 课堂教学 采用大屏幕投影仪授课,操作示范。要求:认真听课、作笔记、遵守课堂纪律。 2. 实验课 培养实际操作能力、自学能力。要求:遵守机房规则。独立完成各个实验(期未要进行上机考试)。 3. 课后练习 每章交一次作业、上机前预习、争取多上机
2、4. 成绩评定 根据理论考试、上机操作和平时成绩评定。,共 73 页 第 4 页,机位安排及机房清洁卫生,1. 换鞋上机,对号入座要求:按学号顺序,固定机位。学习委员填写机位表3份,交任课教师、实验室各一份。注意: 不要穿太昂贵的鞋上机。 2. 为防止病毒,严禁自带磁盘上机要求:磁盘集中保管,专人负责(上机发磁盘,下课收磁盘)。 3. 保持机房清洁要求:每天下午搞一次清洁,每周大搞一次。,共 73 页 第 5 页,目录,1.C语言概述 2.数据类型、运算符与表达式 3.顺序设计 4.选择结构设计 5.循环结构设计 6.数组的定义和引用 7.函数的定义和调用,共 73 页 第 6 页,8.预处理
3、命令 9.指针的使用 10.结构体与共同体 11.位运算 12.文件的操作,共 73 页 第 7 页,第一章 C语言概述,1.1C语言出现的历史背景 汇编语言编写的程序太依赖硬件,程序的可读性和移植性都差,C语言既有高级语言的特点又有低级语言特点. C语言是在B语言中发展起来的. 1960 ALGOL语言B语言,开发出UNIX系统(贝尔实验室)C语言,共 73 页 第 8 页,C语言开始被人们所接受,并开始流行. C语言有各种不同版本: TURBO C, BORLAND C, QUICK C, MICROSOFT C.,共 73 页 第 9 页,1.2 C语言的特点 1、语言简洁,使用方便。3
4、2个关键字、9种控制语句,书写形式自由。 2、运算符丰富。有34种运算符,包括算术、逻辑、逗号运算、移位运算等等。 3、数据结构丰富。有整型、实型、字符型、数组类型,指针类型、结构类型、共同体类型等等。 4、具有结构化的控制语句,函数模块化。 5、允许直接访问物理地址,进行位操作,可直接对硬件进行操作。,共 73 页 第 10 页,1.2 C语言的特点,6、生成目标代码质量高,执行效率高,可以直接生成EXE文件。 7、可移植性好。 8、C语言比其它语言相对来说难掌握。,共 73 页 第 11 页,1.3 简单的C程序介绍,例1: main( ) printf ( “This is a C pr
5、ogram.n”); 输出结果为: This is a C program.,共 73 页 第 12 页,1.3 简单的C程序介绍,例2: main( ) int a,b,sum; a=123;b=456; sum=a+b; printf ( “sum is %dn”,sum); 输出结果为: sum is 579,共 73 页 第 13 页,1.3 简单的C程序介绍,例3: main( ) int a,b,c; scanf(“%d,%d”, ,共 73 页 第 14 页,1.3 简单的C程序介绍,继例3: int max(int x,int y ) int z; if(xy) z=x; el
6、se z=y; return(z); 输出结果为: max is xxxsum is xxx,共 73 页 第 15 页,1.3 简单的C程序介绍,1 、C程序是由函数构成,至少有一个main函数和若干个其它函数。 2、一个函数由两部分组成: (1)函数的首部:在函数的第一行。 int max(int x,int y ) (2)函数体:包含两部分(声明部分和执行部分) 3、C程序总是从main函数开始执行的。,共 73 页 第 16 页,1.3 简单的C程序介绍,4 、一行可以有多个语句,一个语句也可以写在不同行上。 5、但每个语句后一定要有分号; 数据定义后也要有分号; 6、C语言没有专门的
7、输入输出语句。 由scanf和printf两个函数提供。 7、用/*.*/来作注释,不执行。,共 73 页 第 17 页,1.4 C程序的上机环境,我们用的是turbo C。,共 73 页 第 18 页,第三章 数据类型、运算符与表达式,基本数据类型与特点各种数据类型表示范围常量的表示方法变量说明语句运算符与基本运算规则各种表达式的使用 基本输入输出函数使用方法,本 章 要 点,共 73 页 第 19 页,3-1 数据与数据类型(续),C语言的数据类型,基本类型,字符型 char 整型 int 浮点型,单精度 float 双精度 double,指针类型,构造类型,数组 结构 struct 联合
8、 union 枚举 enum,空类型,第三章,第七章,第十一章,指针类型,共 73 页 第 20 页,3-2 常量与变量,数据程序加工处理的对象及其结果 数据类型数据在计算机内部的存储形式(占用的内存单元数量、编码方式、取值范围等) 常量在程序运行过程中不允许改变的量可用一个标识符来代表一个常量。 变量在程序运行过程中允许改变的量,一、基本概念,共 73 页 第 21 页,例题: #define PRICE 30 Main( ) int num,total;num=10; total=num* PRICE; Printf( “total=%d”,total); ,共 73 页 第 22 页,3
9、-2 常数与常数定义,常量定义形式 #define 标识符 常量用定义的一个标识符来代表一个常量,称为符号常量# 宏命令专用定义符号define 命令标识符 宏替换名(一般采用大写字符),二、常数定义与符号常量,常量定义实例,注意:符号常量与变量不同,它的值在程序运行过程中不能改变,也不能重新赋值。,共 73 页 第 23 页,2-2 常数与常数定义,整型常量(3种形式)10进制8进制16进制 实型常量(2种形式)十进制指数 字符常量 字符串常量,一、常数,:0 9,整型常量实例,:0 7 以数字0开头,:0 9,AF/af,以0x或0X开头,:符号、整数、小数点和小数,:用e或E和表示指数部
10、分,实型常量实例,字符常量,字符串常量,共 73 页 第 24 页,2-2 常数与常数定义-常量定义实例,常量定义实例#define ONE 1 #define PAI 3.1415926#define TV ”television” #define MAX 10#define TWO ONE+ONE 使用方法a=8+2;printf(”%s”,”television”);s=3.14159*r*r; int array10;,返回,a=b+TWO; printf(”%s”,TV); s=PAI*r*r; int arrayMAX;,共 73 页 第 25 页,注:符号常量名一般用大写,变量用
11、小写。 符号常量在程序的执行部分不能再赋值。 3.2.2 变量 值在程序执行过程中可随时改变的量称为变量。一个变量在内存中占据一定的存储单元,在该单元中存放变量的值。变量名实际上是一个符号地址。A 变量名变量值存储单元,13,共 73 页 第 26 页,变量的说明格式: 类型修饰符 类型说明符 变量列表; 例如:int i;char ch, str;long k=1, m=0x12345678;double x, y=1; 变量说明意味着确定了:该变量占用内存单元的数量,数据在内存的表示方式,数据的取值范围。,共 73 页 第 27 页,标识符(变量名)的说明,(1)标识符只能由字母、数字和下
12、划线组成,且第一个字符是字母或下划线。 例:sum,_total,a123-e,Basic,m.e.12, er#we,1asd,ab (2)大写字母和小写字母被认为是两个不同的字符。 (3)一般只认前面的8个字符。,共 73 页 第 28 页,变量的说明,(1)变量要先定义再使用 例:int student;stuent=10; (2)每个变量有一确定的类型 例:int student;student=15;student=34.56; (3)每个变量所进行的运算必须合法。 Float a,b,c; a=10.4;b=3.6;c=a%b;,共 73 页 第 29 页,3.3 整型数据,3.3
13、.1整型常量的不同表示方法:10进制: 100 -8 0 +1238进制: 010 024 010016进制: 0x38 0x10 0X10 0XFF 0xa 整型常量的类型:1.在整型表示范围之内,根据值大小默认类型2.在常量后面加l或L,则认为它是long int型例如:都是long int型常量10进制:-123L 0L 432l8进制: 010L 024L 0100L16进制: 0x38L 0x1000L 0XFFl x0a0000l,共 73 页 第 30 页,3.3.2整型变量 1、在内存中的存放形式。 以二进制的补码形式,占两个字节,左边一位表示符号,“0”为正,“1”为负。 补
14、码的表示:正数的补码与原码相同。负数的补码是将该数的绝对值的二进制形式,按位取反后再加1。 如-10 的表示方法 10的原码:0000000000001010 取反 1111111111110101 再加1 1111111111110110 (-10的补码),共 73 页 第 31 页,2.整型数据的分类,共 73 页 第 32 页,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”,c,d); 4、整型数据的溢出,共 73 页 第 33 页,2-1 数据与数据
15、类型-int,int型数的表示范围:二进制 16bit (2Byte),0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1,0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1,0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1,=1,=3,int型整数的最大值,int型表示数的范围:- 32768 32767,1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1,注意:使用中要防止数据溢出,=-1,int型整数的最小值,1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,=215-1=32767,=-215=-32768,共 73 页
16、第 34 页,2-1 数据与数据类型-int,main( ) int i;i= 1;i=i*2; printf(”n i=%d”,i);i=i*3; printf(”n i=%d”,i);i=i*4; printf(”n i=%d”,i);i=i*5; printf(”n i=%d”,i);i=i*6; printf(”n i=%d”,i);i=i*7; printf(”n i=%d”,i);i=i*8; printf(”n i=%d”,i);i=i*9; printf(”n i=%d”,i);i=i*10; printf(”n i=%d”,i); ,期望结果 i=2 i=6 i=24 i=1
17、20 i=720 i=5040 i=40320 i=362880 i=3628800,实际运行结果 i=2 i=6 i=24 i=120 i=720 i=5040 i=-25216 i=-30336 i=24320,产生数据溢出,上溢,下溢,返回,共 73 页 第 35 页,例:main( )int a,b,;a=32767;b=a+1;printf(“%d,%d”,a,b); 结果为:32767,-32768,共 73 页 第 36 页,3.3.3、整型常量的类型 1、整数的范围如果在-32768+32767,可以是int型或 long int型。 2、整数的范围如果在-2147483648
18、+2147483647,则是long int型。 3、int 型与short int型是等同的。 4、unsigned型是无符号的,注意范围。 5、在一个整常量后加字母l或L,则认为是long int型。,共 73 页 第 37 页,3.4 实型数据,3.4.1实型常量的表示方法 两种表示形式:十进制小数形式指数形式:123e-4,e后面的数必须为整数。 3.4.2实型变量 1、存放形式:占4位,按指数形式存储,分成小数和指数部分来存放。,共 73 页 第 38 页,2.实型变量的分类,共 73 页 第 39 页,3。实型数据的舍入误差,由于实型变量的有效位有限,有效位外的数字将被舍去,所以会
19、产生一些误差。 例:main( ) float a,b;a=123456.789e5;b=a+20;printf(“%f”,b);,共 73 页 第 40 页, 3.5 字符型数据,字符型常量:用单引号括起来的单个字符实例:A g # 0 2+ , ; ( ) 字符定界符:单引号 还有一种特殊形式的字符常量,以“”开头的字符序列.见表3.3.,返回,如何表示不可显示字符?,回车/退格/TAB?,如何表示定界符?, 产生歧异,转义符:将后面的字符转换为其它含义,共 73 页 第 41 页,表3.3 转义字符及其含义,共 73 页 第 42 页,3.5.2 字符变量,每个字符变量只能放一个字符.
20、字符变量在内存中是以二进制的形式来存放的,与整形数据可以通用.一个字符数据既可以用字符形式来输出,也可以用整形形式来输出.C语言允许字符与整数直接进行算术运算.,共 73 页 第 43 页,例子1: main( ) char c1,c2;c1=97;c2=98;printf(“%c %cn”,c1,c2);printf(“%d %dn”,c1,c2);,共 73 页 第 44 页,例子2: main( ) char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(“%c %cn”,c1,c2);printf(“%d %dn”,c1,c2);,共 73 页 第
21、45 页,3.5.4 字符串常量,字符常量是由单引号括起来的,字符串常量是由双引号括起来的.如“china”. 如a和“a”是两个不同的概念. C语言规定:每个字符串是以0为结束标志的.所以“a”其实在内存中是占两个字节的位置,而a在内存中是占一个字节的位置. Char c C=“a” (X),共 73 页 第 46 页,2-2 常数与常数定义-字符串常数,实例:”This is C string.” ”a” ” ” (1个空格)” (不含空格)串定界符:双引号 ” 字符串长度:字符串中包含的字符数量。,返回,串长=17 串长=1 串长=1 串长=0,“t“NameAddressn“,串长=1
22、5,空串,实例:,“C is very easy.“,串长=17,注意: 字符串“a“ 与 字符a 的区别,“He said“ok.“n“,串长=13,共 73 页 第 47 页,3.6 变量赋初值,对变量,可以在定义时给定初值 如int a=3,b,c;float f=3.14;char c=a; 但不能 int a=b=c=3;int a=3,b=3,c=3; a=b=c=3;,共 73 页 第 48 页,3.7 各类数值型数据间的混合运算,高double floatlongunsigned低 int char,short,共 73 页 第 49 页,3.8 算术运算符和算术表达式,3.8
23、.1 C运算符简介 1、算术运算符 +、*、/、% 2、关系运算符 、 =、 、|、& 5、赋值运算符 = 6、条件运算符 ? : 7、逗号运算符 ,,共 73 页 第 50 页,8、指针运算符 *、& 9、求字节数运算符 sizeof 10、强制类型转换运算符 (类型)| 11、分量运算符 .、 12、下标运算符 13、其它运算符 3.8.2 算术运算符和算术表达式 1、基本的算术运算符 2、算术表达式和运算符的优先级与结合性先乘除后加减,同一级的结合方向“自左而右”,共 73 页 第 51 页, 运算符和算术表达式,一、算术运算符,运算符(双目运算符/单目运算符)+ 加法运算 12 正值运
24、算 14- 减法运算 12 负值运算 14* 乘法运算 13/ 除法运算 13% 求余运算 13 优先级:* / % 同级(高),+ - 同级(低) 结合性:相同优先级运算符进行运算时的次序自左向右(标记为 ),共 73 页 第 52 页, 运算符-算术运算实例,1.参加运算的对象都是int型,结果截取为int型10/3 11/3 10.0/3 11/3. 1/2 1./2 10/5*3 10/(5*3),2.求余运算的对象必须是整型9%3 1%3 10%3 10%-3 -10%3 -10%-3,=3,=3,=3.3333,=3.66667,=0,=0.5,=6,=0,=0,=1,=1,=1,
25、=-1,=-1,共 73 页 第 53 页,3、强制类型转换运算符 格式:(类型名)(表达式) 如 float x,y;x=5.67;y=78.6;(int)x+y 的结果为83.6 x=5.67(int)x 5(int)(x+y) 84,共 73 页 第 54 页,4 自增、自减运算符,运算符(单目 )+ 自增 14 自减 14 +和 为单目运算,只能作用于变量 只能对int、char、long和指针变量进行运算 功能:+x x=x+1 (前缀:使用X之前,先改 x x=x1 变X的值) x+ x=x+1 (后缀:使用X之后,再改x x=x1 变X的值),共 73 页 第 55 页,自增(自
26、减)有前缀和后缀之分。 前缀形式: 先自增(自减)再引用后缀形式: 先引用再自增(自减) 前缀与后缀的区别:y=+x; x=x+1; y=x;x先加1再赋值y=x+; y=x; x=x+1;x先赋值再加1,共 73 页 第 56 页,如 I=3; j=+I-4; (j=0,l=4) j=I+; (j=3,l=4) 说明: 1、自增或自减,只能用于变量,不能用于常量和表达式。 2、+或- -的结合方向是“自右至左” j=(-I)+ 相当于j=-(I+)(j=-3,I=4) 不要使用这种表达式: I+I+I+,共 73 页 第 57 页,2-4 运算符-自增自减运算实例,实例 (1) +i; i+
27、;因为在表达式中没有其它运算,结果一样。 (2) x=1; y=+x; 结果: x=2,y=2 y=+x; x=x+1; y=x;在做赋值运算之前,x先加1,然后将x赋给y (3) x=1; y=x+;结果: x=2,y=1 y=x+; y=x; x=x+1;先将 x 赋值给 y ,然后 x 再加1,共 73 页 第 58 页,x=3, z=3x=3, y=6, z=3*6=18x=3, y=6, z=2*6=12x=3, y=6, z=3*5=15x=3, y=6, z=2*5=10x=4, z=4*4=16注意,以下操作是错误的:x = +(i+j)+1;j = + (5+x);y = +
28、x * +x;,自增自减运算实例,实例已知:int x = 2, y = 5, z; z = +x; z = +x * +y;z = x+ * +y;z = +x * y+;z = x+ * y+;z = +x * +x;,逻辑虽然正确 ,但实际编程中容易产生误解,应当避免,共 73 页 第 59 页,自增自减运算实例,实例已知:int i=1, j=2, k; k=i+j;C语言处理运算符(标识符)时,遵循自左向右组合的原则,两个+号是一个运算符,故处理成(i+)+j。 k = i+j; 不能编译通过。原因是编译器将前两个+处理成自增,接下来又将两个+号处理为自增,故不合语法。编程者可用空格
29、或括号来表示正确的含义: k=i+ + +j;注意:一般不要用这样的语句。,共 73 页 第 60 页,3.9 赋值运算符和赋值表达式,1、赋值运算符:= 2、类型转换 如果=两边类型不同,将右边的表达式结果转为左边的类型。 如 int I; float f; double d;I=3.45 ; (I的结果为3)f=23; (f的结果为23.00000)d=123.4536777;f=d; (f的结果为123.4537,取七位有效数值)d=123.456789e100;f=d; (f的结果发生溢出的错误),共 73 页 第 61 页,(1)、将intshortlong型数据赋给char型时,只
30、将低8位传送。 Int I=289; (100100001) Char c; C=I (低8位的结果为33 ,对应为!字符) (2)、将unsigned int 型数据赋给 int 型变量时,注意符号。 unsigned int a=65535; Int b; b=a; (b的结果为-1),共 73 页 第 62 页,3、复合的赋值运算符 在赋值运算符“=”之前加上其它运算符,可以构成复合的运算符。 如:a+=3 ( a=a+3 )x*=y+8 ( x=x*(y+8) )x%=3 ( x=x%3 ) 4、赋值表达式注意:赋值表达式是右结合律的。,共 73 页 第 63 页,如:a=b=5 a=
31、(b=5) a=b=4+c=6 a=(b=4)+(c=6)a=12;a+=a-=a*a; ( a-=a*a a=a-a*a a=-132a+=-132 a=a+(-132) a=-264) 赋值操作不仅可出现在赋值语句中,也可以以表达式形式出现在其他语句中(如输出或 循环语句)。 b=3; printf(“a=%d”,a=b); 结果为 a=3,共 73 页 第 64 页,3.10逗号运算符和逗号表达式,格式为: 表达式1,表达式2 (先求表达式1,再求表达式2,结果取表达式2的值) 注意:逗号运算符的运算级别最低,低于赋值运算符。 如: a=3; a=3*5,a*4 (a的结果不等于12,而
32、是逗号表达式的结果为60),共 73 页 第 65 页,X=(a=3,6*a) x的结果为18 X=a=3,6*a x的结果为3,整个表达式的结果为18 逗号表达式的扩展为: 表达式1,表达式2,.表达式n,共 73 页 第 66 页,2-8 综合举例,1、运算符有优先级,在C语言中关于运算符优先级的正确叙述是 。A) 逻辑运算符高于算术运算符,算术运算符高于关系运算符B) 算术运算符高于关系运算符,关系运算符高于逻辑运算符C) 算术运算符高于逻辑运算符,逻辑运算符高于关系运算符D) 关系运算符高于逻辑运算符,逻辑运算符高于算术运算符 答案:B,共 73 页 第 67 页,2-8 综合举例,2
33、、在以下关于C语言的不严格的叙述中,错误的是A)大写字母和小写字母的意义相同B)有些不同类型的变量可以在一个表达式中运算C)在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型D)同一个运算符号在不同的场合可以有不同的含义 答案:A 3、语言中的简单数据类型包括 。A)整型、实型、逻辑型B)整型、实型、字符型C)整型、字符型、逻辑型D)整型、实型、逻辑型、字符型 答案:B,共 73 页 第 68 页,2-8 综合举例,4、在C语言中,错误的int类型的常数是 。A) 32768 B) 0 C) 037 D) 0xAF 答案:A 5、下列常数中不能作为C的常量的是 。A) 0xA5 B)
34、2.5e-2 C) 3e2 D) 0582 答案:D 6、在语言中,十进制的47可等价地写为 。A) 2f B) 02f C) 57 D) 057 答案:D 7、已知:int a=4,b=5,c;则执行表达式“c=a=ab”后变量a的值为 。A) 0 B) 1 C) 4 D) 5 答案:A,共 73 页 第 69 页,2-8 综合举例,8、下列可以正确表示字符型常数的是A) “a“ B) t C) “n“ D) 297 答案:B 9、以下错误的转义字符是A) B) C) 81 D) 0 答案:C 10、已知:float x=1,y;则:y=+x*+x的结果是A) y=9 B) y=6 C) y
35、=1 D) 表达式是错误的 答案:D 11、已知:char ch=A;则下列表达式的值是 ch = (ch=AA) A B) a C) Z D) z 答案:B,共 73 页 第 70 页,2-8 综合举例,12、字符串“22a,0n“的长度是 。A) 8 B) 7 C) 6 D) 5 答案:C 13、在程序中要使用语句:printf(“%sn“, STRING); 输出一个长度为个字符的提示信息“OK!“,则应使用宏定义语句_。A) #define STRING “OK!“B) #define STRING “OK!“C) #define STRING “OK!“D) 以上三个答案都是错误的 答案:D #define STRING “OK!“,共 73 页 第 71 页,2-1 数据与数据类型(续),C语言基本数据类型有四种: 字符型 整型 单精度浮点型 双精度浮点型,char int float double,类型说明符,三、C语言的基本数据类型,C语言有四种类型修饰符: 短 长 有符号 无符号,short long signed unsigned,类型修饰符,注意:类型修饰符不能单独使用,必须与类型说明符配合在一起使用,C语言采用类型说明符说明不同的数据类型,