C语言程序设计_第1页
C语言程序设计_第2页
C语言程序设计_第3页
C语言程序设计_第4页
C语言程序设计_第5页
已阅读5页,还剩173页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计,本课程知识结构,第1章 C语言概述,1.1 C语言的发展和特点,1.1.1 C语言的发展,为了提高程序的可读性和可移植性,最好改用高级语言,但一般高级语言难以实现汇编语言的某些功能。人们设想能否找到一种既具有一般高级语言特性,又具有低级语言特性的语言,集它们的优点于一身。C语言就在这种情况下应运而生了。,第1章 C语言概述,1.1.1 C语言的发展,C语言的主要特点如下: (1)简洁、紧凑、灵活。 (2)模块化、结构化。 (3)移植性强。 (4)C语言允许直接访问物理地址,能进行位(bit)一级的操作,能实现汇编语言的大部分功能,可以直接对硬件进行编程操作,因此C语言既具有高级

2、语言的功能,又具有低级语言的许多功能,可用来编写系统软件。 (5)生成目标代码质量高,程序执行效率高。,第1章 C语言概述,1.2 C程序的基本构成,1.2.1 C程序的组成,一个C程序可由以下几部分组成: (1)文件包含部分。 (2)预处理部分。 (3)变量说明部分。 (4)函数原型声明部分。 (5)主函数部分。 (6)函数定义部分。,第1章 C语言概述,1.2.1 C程序的组成,关于程序的结构的说明如下: (1)并不是所有的C程序都必须包含上面的6个部分,一个最简单的C程序可以只包含文件包含部分和主函数部分两部分。 (2)每一个C程序文件的后缀为“.c”,并且每一个C源程序都必须有且仅有一

3、个主函数,主函数的组成形式为: main() 变量说明部分; 程序语句部分; ,第1章 C语言概述,1.2.2 C程序的书写格式,C程序的书写格式遵循以下原则: (1)函数是构成C语言程序的基本单位。 (2)C语言程序总是从主函数main()开始执行。 (3)函数体必须由一对大括号“”括起来。 (4)C程序书写格式自由。 (5)在C语言程序中,要严格区分字母的大小写。,第1章 C语言概述,1.2.3 C程序的算法,一个算法应该具有如下5个特性。 1)有穷性 2)确定性 3)可行性 4)有零个或多个输入 5)有一个或多个输出,流程图也是描述算法的很好的工具,一般的流程图由图中所示的几种基本图形组

4、成。,第1章 C语言概述,1.3 C语言的开发环境,启动Turbo C 2.0集成开发环境后即可看到Turbo C 2.0的主窗口,如图所示。,第1章 C语言概述,1.3 C语言的开发环境,Turbo C 2.0的主窗口由主菜单、编辑区、消息窗口和功能键提示行组成。 主菜单在主屏幕顶上一行,由File、Edit、Run、Compile、Project、Options、Debug、Break/watch等菜单项组成,除Edit外,其他各项均有子菜单,只要按Alt键加上某项中第一个字母(即大写字母),就可进入该项的子菜单中。编辑区在主屏幕中间,对源程序的编辑工作都要在编辑区进行,它占据了主屏幕的大

5、部分空间。信息窗口用于显示编译和链接时的有关信息,程序员可以根据提示信息对源程序进行修改调试。功能键提示行列出了Turbo C 2.0常用的7个功能键含义。,第2章 数据类型、常量和变量,2.1 数 据 类 型,数据类型是对程序所处理数据的一种“抽象”,通过类型名对数据赋予一些约束,以便进行高效处理和检查。这些约束包括以下几个方面: (1)取值范围。 (2)存储空间大小。 (3)运算方式。,第2章 数据类型、常量和变量,2.1 数 据 类 型,C语言的基本数据类型有如下不同的类型: (1)从长度上分,有8位、16位、32位和64位。 (2)从数据的符号来分,有无符号数和有符号数。 (3)按照数

6、据的数学性质,分为整型、实型和字符型。,第2章 数据类型、常量和变量,2.2 常量,2.2.1 整型常量,在C语言中,整型常量可用以下3种形式表示。 (1)十进制整数。这是最常用的一种形式,如512、-16。 (2)八进制整数。以数字0开头的数是八进制数,例如,0116表示八进制整数,相当于十进制整数78。-012表示八进制数,即十进制数-10。 (3)十六进制整数。以0 x开头的数是十六进制数,例如,0 xA5表示十六进制整数,即十进制数165。,第2章 数据类型、常量和变量,2.2.2 实型常量,实型常量又称为浮点数或实数。C语言中,实数只有十进制形式,它有两种表示方式:一种是定点数形式,

7、另一种是浮点数形式。 (1)定点数形式:凡不带指数部分的数称为定点数。例如,3.141 59,-1.298,10,2 009 等。整数都属于定点数。 (2)浮点数形式,又称为指数形式。在计算机内部,实数都以浮点形式存储。 C语言将实型数据分为float、double、long double三种类型,且默认实型数据是double类型。因此,对于实型常量,C语言编译器会将它视为double类型。如果特别说明某实型常量是float类型或long double类型,可以加上后缀字母表示。 (1)用f或F表示float类型,如123.5f,1.234 5e+3F。 (2)用l或L表示long doubl

8、e类型,如123.5l,1.234 5e+3L。,第2章 数据类型、常量和变量,2.2.3 字符型常量,C语言中的一个字符常量占据一个字节的存储空间,在该字节中存放的并不是字符本身,而是该字符的ASCII码值。如字符A的ASCII码值为65,0的ASCII码值为48。由于字符常量存储的是一个整数,因此它可以像整数一样参与数值运算。在C语言程序中,字符常量通常用于字符之间的比较。 C语言还允许一种特殊形式的字符常量,就是以反斜杠“”开头的转义字符序列。转义字符序列用来表示ASCII码字符集内的控制代码。例如,前面用“n”表示换行,“n”实际上是一个字符,它的ASCII码值为10。转义字符常用于表

9、示ASCII字符集内的控制字符和某些用于功能定义的字符,如单引号、双引号和反斜杠等。,第2章 数据类型、常量和变量,2.2.4 字符串型常量,C语言中,字符串在内存中存储时,系统自动在字符串的末尾加ASCII码值为0的字符,用以表示该字符串的结束。因此,长度为n个字节的字符串,实际上占据了n+1个字节的存储空间。例如,字符串常量12345有5个字节,占据了6个字节的存储空间,其存储形式如图所示。,第2章 数据类型、常量和变量,A和A除了形式上有区别外,在内存中的存储形式也是不同的,如图所示。,2.2.4 字符串型常量,第2章 数据类型、常量和变量,2.3.1 变量的要素及定义,2.3 变量,1

10、. 变量的两个要素 1)变量名 每个变量都必须有一个名字变量名,在内存中占据一定的存储单元。变量命名遵循标识符命名规则。 2)变量值 在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。,第2章 数据类型、常量和变量,2.3.1 变量的要素及定义,2.变量的定义 变量定义的一般格式如下: 存储类型数据类型 变量名, 变量名2 在C语言中,要求对所有用到的变量进行强制定义,这样做的目的是: (1)凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。 (2)每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。 (3)指定每一变量属于一个类型,便于在

11、编译时,据此检查该变量所进行的运算是否合法。,第2章 数据类型、常量和变量,2.3.2 变量的初始化,所谓变量的初始化,也就是在定义变量的同时对变量赋初值。可以给其中的一个赋值,也可以同时给多个变量赋值。例如: int sum=0; char ch1=a,ch2=b; int a,b,c=10; 需要说明的是,变量的初始化不是在编译阶段完成的(除了静态存储变量和外部变量),而是在程序运行时才被赋值的。,第2章 数据类型、常量和变量,2.3.3 变量的分类,1.整型变量 1)整型数据在内存中的存放形式数值是以补码表示的: 正数的补码和原码相同; 负数的补码:将该数的绝对值的二进制形式按位取反再加

12、1。,10的原码:,取反:,10的补码:,第2章 数据类型、常量和变量,2.3.3 变量的分类,2)整型变量的分类 (1)基本型:类型说明符为int,在内存中占2个字节。 (2)短整型:类型说明符为short int或short。所占字节和取值范围均与基本型相同。 (3)长整型:类型说明符为long int或long,在内存中占4个字节。 (4)无符号型:类型说明符为unsigned。 无符号型又可与上述3种类型匹配而构成: 无符号基本型:类型说明符为unsigned int或unsigned。 无符号短整型:类型说明符为unsigned short。 无符号长整型:类型说明符为unsigne

13、d long。,第2章 数据类型、常量和变量,2.3.3 变量的分类,3)整型变量的定义 整型变量定义的一般形式为: 类型说明符 变量名标识符,变量名标识符,; 例如: int a,b,c; (a,b,c为整型变量) long x,y; (x,y为长整型变量) unsigned p,q; (p,q为无符号整型变量) 在书写变量定义时,应注意以下几点: 允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。 最后一个变量名之后必须以“;”号结尾。 变量定义必须放在变量使用之前。一般放在函数体的开头部分。,第2章 数据类型、常量和变量,2

14、.3.3 变量的分类,2.实型变量 1)实型变量的分类 根据数值的范围可分为单精度(float)、双精度(double)和长双精度(long double)3种类型。 2)实型数据的存储 一个实型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,实型数据是按照指数形式存储的。系统把一个实型数据分成小数部分和指数部分,分别存放。,第2章 数据类型、常量和变量,2.3.3 变量的分类,3.字符变量 1)字符变量的定义 定义字符变量的一般形式如下: char ch1,ch2; 表示定义了ch1和ch2为字符变量,各能存储一个字符常量。可以用下面语句对ch1和ch2赋值: ch1=a;c

15、h2=b;1一个字符变量只能存储一个字符常量。 2)字符变量的存储 将一个字符常量放到一个字符变量中,并不是把该字符本身放到内存单元中去,而是将该字符的ASCII码放到存储单元中。,第2章 数据类型、常量和变量,2.4.1 数据类型的隐式转换,2.4 数据类型转换,1赋值转换 当赋值运算符两边的类型不同时,C语言允许通过赋值运算符使赋值号右边表达式值的类型自动转换成其左边变量的类型。赋值转换具有强制性。 当将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。例如,i是整型变量,执行“i=5.68;”的结果是i的值为5。 当将整型数据赋给实型变量时,数值不变,但以实数形式存放到整型变

16、量中。 2输出转换 如一个长整型数在格式输出函数printf()中指定用%d格式输出,相当于先将长整型数转换成整型再输出。,第2章 数据类型、常量和变量,2.4.2 数据类型的显式转换,C语言提供了一种“强制类型转换”运算符,将一种类型的变量强制转换成另一种类型。例如,(int)3.5中“(int)”的作用是将实型数据3.5转换成整型。 强制类型转换是一种显式转换,其一般形式为: (类型标识符) 表达式 其作用是把表达式的值转换为类型名指定的类型。 例如: (double) a(把a转换成double类型) (char)(8-3.14*x)(得到字符型数据) (float)(x=99)(得到单

17、精度数据) k=(int)(int)x+(float)i+j)(得到整型数据),第3章 运算符和表达式,3.1.1 算术运算符,3.1 算术运算符与算术表达式,1.基本算术运算符 +、*、/和求模()运算为基本算术运算符,当进行两个整型数相除时,其结果仍为整型数,小数部分被略去。例如: 27/5=5 27/7=3 取模运算符“”用于计算两个数相除后得到的余数,只适用于两个整型数取模,不能用于其他数据的运算。在“x%y”表达式中,x是被除数,y是除数。,第3章 运算符和表达式,3.1.1 算术运算符,2.自增自减运算符 自增“+”和自减“”运算符为变量的增1和减1提供了紧凑而方便的表达形式。但这

18、两种运算符都有前置和后置之分,其一般用法如下: i+或+ i i-或-i,第3章 运算符和表达式,3.1.1 算术运算符,使用自增自减运算时,应注意如下几点: (1)自增自减运算的操作数一定是变量,而不能是其他表达式。(2)一个变量的前、后置运算只表明该变量参与其他运算与其自身变化之间的先后关系,并不影响它在表达式中参与其他运算的顺序。 (3)“+”和“-”运算符是自右向左结合的,单目运算符“-”也是自右向左结合的。因此,对-i+就理解为-(i+),而不应理解为(-i)+。(-i)+是非法的,因为它是表达式而不是变量。 (4)自增和自减运算常用于数组下标改变循环次数控制。,第3章 运算符和表达

19、式,3.1.2 算术表达式,算术表达式是由算术运算符和圆括号将操作数连接起来的表达式。操作数包括常量、变量和函数等。最简单的表达式是一个常量或一个变量。一般情况下一个表达式可以有多个运算符,例如: a+b*c -a/(b+c)-10%7*a,第3章 运算符和表达式,3.2.1 关系运算符,3.2 关系运算符与关系表达式,C语言中有6种关系运算符,即: (1)=(大于等于)。 (2)(大于)。 (6)(小于)。,第3章 运算符和表达式,3.2.2 关系表达式,系表达式就是用关系运算符把操作对象连接起来而构成的式子,操作对象可以是各种表达式,对于关系表达式或逻辑表达式,应把其值理解为1(真)或0(

20、假)。例如,表达式 5(4b、a+5b-3、(a=100)(y=50)、ab)(bc),第3章 运算符和表达式,3.3.1 逻辑运算符,3.3 逻辑运算符与逻辑表达式,逻辑运算符是对逻辑量进行操作的运算符。逻辑量只有两个值:“真”和“假”,它们分别用1和0表示。C语言中有3个逻辑运算符,即: (1)!(逻辑非) (2)&(逻辑与) (3)|(逻辑或) 逻辑运算符&和|是双目运算符,!是单目运算符,它们的操作对象是逻辑量或表达式(可以是关系表达式或逻辑表达式),其操作结果仍是逻辑量。,第3章 运算符和表达式,3.3.2 逻辑表达式,逻辑表达式是用逻辑运算符把操作对象(可以是关系表达式或逻辑表达式

21、)连起来所构思的一种运算式,其操作结果是“真(非零)”或“假(零)”。在处理逻辑表达式时要注意逻辑运算符的优先级及结合性,逻辑运算符的优先级从高到低的顺序依次是“!”、“&”、“|”。“&”和“|”的优先级低于关系运算符和算术运算符,而“!”高于基本算术运算符。,第3章 运算符和表达式,3.4.1 按位取反运算符,3.4 位运算符与位表达式,按位取反运算符就是将其操作对象中的所有二进制位全部改变状态,即“逢0变1,逢1变0”。例如,八进制数0217(即二进制10001111),其按位取反后为八进制数0160(即二进制位01110000)。所以0217的值是0160。又如: unsigned c

22、har x=0137; /* 即二进制01011111 */ x= x; /* x的二进制结果为10100000 */,第3章 运算符和表达式,3.4.2 移位运算符,1.左移运算符 左移运算符是将其操作对象向左移动指定的位数,每左移1位相当于乘以2,移n位相当于乘以2的n次方。一个二进制位组在左移时右边补0,移几位右边补几个0。其一般书写格式为: 表达式1表达式2,第3章 运算符和表达式,3.4.3 按位“与”,按位“与”的一般书写格式为: 表达式1 & 表达式2 其中“表达式1”和“表达式2”均为整型表达式。 按位“与”遵循这样的原则:当两个操作对象的相应二进制位都为1时,则该位的结果为1

23、,否则为0,即“两1为1,其余为0”。值得注意的是,按位“与”的运算,两个表达式之间用一个“&”符,而逻辑“与”,两个表达式之间用两个“&”,这是初学者经常出错的地方。,第3章 运算符和表达式,3.4.4 按位“或”,按位“或”遵循这样的原则:当两个操作对象的相应二进制位都为0时,则该对应位的按位“或”结果才为0,否则为1,可以简记为“两0为0,其余为1”。例如: 35 | 41 35的二进制表示为00000000001000011,41的二进制表示为0000000000101001,按位“或”的结果为0000000001101011。 按位“或”的一般书写格式为: 表达式1 | 表达式2 其

24、中“表达式1”和“表达式2”是整型表达式。 可以利用按位“或”来将指定位设置为1。例如,将x的从右数第三位(二进制位)设置为1,则只需执行如下表达式即可: x=x|04 x的二进制表示为0111100001000011,04的二进制表示为0000000000000100,按位“或”的结果为0111100001000111。,第3章 运算符和表达式,3.4.5 按位“异或”,按位“异或”遵循这样的原则:当其两个操作对象的相应位相同时,则该对应位“异或”的结果为0。可以简记为“相同为0,不同为1”,即000,011,110。按位“异或”也可称不进位加,即两个操作对象执行二进制相加,但不向高位进位。

25、,第3章 运算符和表达式,3.5.1 赋值运算符,3.5 赋值运算符与赋值表达式,赋值运算符“=”是将其右边表达式的值赋给左边的变量,赋值号左边一定是变量,右边是表达式。如果右边表达式的类型与左边变量的类型不一致时,则先将右边表达式的值转换为与左边变量相同的类型,然后进行赋值。,第3章 运算符和表达式,3.5.2 赋值表达式,由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。它的一般形式为: 如“a=5”是一个赋值表达式。对赋值表达式求解的过程是:将赋值运算符右侧的“表达式”的值赋给左侧的变量。赋值表达式的值就是被赋值的变量的值。例如,“a=5”这个赋值表达式的值为5(变量a的值

26、也是5)。,第3章 运算符和表达式,3.6.1 逗号运算符,3.6 逗号运算符与逗号表达式,C语言还提供了一种特殊的运算符逗号运算符(,),用它将两个表达式连接起来,例如: 3+5,6+9,第3章 运算符和表达式,3.6.2 逗号表达式,逗号表达式是由逗号运算符连接表达式构成的。逗号表达式的一般形式为: 表达式1,表达式2 逗号表达式的求解过程是:先求解“表达式1”,再求解“表达式2”。整个逗号表达式的值是“表达式2”的值。例如,上面逗号表达式“3+5,6+9”的值为15。 逗号表达式的一般形式可扩展为: 表达式1,表达式2,表达式3,表达式n 它的值为最后“表达式n”的值。,第3章 运算符和

27、表达式,3.7 条件运算符与条件表达式,条件运算符由“?”号和“:”号组成,是C语言中仅有的一个三目运算符,该运算符需要3个操作数,它能够实现简单的选择功能,条件表达式的形式为: 表达式1?表达式2:表达式3 其中,“表达式1”必须是布尔型;“表达式2”,“表达式3”可以是任何类型,且类型可以不同。条件表达式的类型为“表达式2”和“表达式3”中类型高的一个类型。 条件表达式的执行顺序是:先求“表达式1”的值,若“表达式1”的值为非零时,整个条件表达式的值为“表达式2”的值;若“表达式1”的值为零,则整个条件表达式的值为“表达式3”的值。,第3章 运算符和表达式,3.7 条件运算符与条件表达式,

28、使用条件表达式需要注意以下几点: (1)条件表达式并不能取代所有的ifelse语句,只有ifelse语句中内嵌的语句为赋值语句且两个分支都给同一个变量赋值时才能代替ifelse语句。 (2)在条件表达式中,条件1的类型可以和条件2、条件3的类型不同,也就是说表达式1的最终类型是逻辑型,即C语言中用“1”和“0”代表“真”和“假”。 (3)条件表达式中的表达式2和表达式3的类型也可以不同,此时条件表达式值的数据类型为两者中较高的数据类型。 (4)条件表达式可以嵌套,即在同一个条件表达式中可以多次出现条件运算符。,第3章 运算符和表达式,3.8 运算符的优先级与结合性,一般而言,单目运算符优先级较

29、高,赋值运算符优先级低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。,第4章 程序结构,4.1 顺序结构,C语言中的顺序结构主要由表达式语句、说明语句、输入/输出语句、空语句和复合语句组成。C语言中的语句以分号“;”为结束标志,因此只要有分号的地方就会有一条语句,不管它前面是否有内容。顺序结构流程图如图所示。,第4章 程序结构,4.1.1 基本语句,1.表达式语句 以分号结尾的赋值表达式叫表达式语句,也叫赋值语句。例如: a=b+c-d*e; 在赋值语句中,首先计算等号右边的表达式的值,然后将其值赋给等号左边的变量。

30、如果等号右边的表达式的类型与左边变量的类型不一致,系统将自动把等号右边的表达式的值转换为与左边变量相同的类型,然后再赋值。,第4章 程序结构,4.1.1 基本语句,2.复合语句和空语句 1)复合语句 把多个语句用括号括起来组成的一个语句称复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。 2)空语句 只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。,第4章 程序结构,4.1.2 数据输出,1.字符输出函数 1)功能 该函数向标准输出设备(通常是显示终端)输出一个字符。使用此函数时,要求在程序首行有“include ”预编译命令。 2)

31、调用格式 putchar(c); 其中c是一个字符型变量或整型变量,其值被看做是要输出字符的代码,它被输出到显示终端上。,第4章 程序结构,4.1.2 数据输出,2.字符串输出 1)格式 int puts(char *s); 2)功能 将s所指向的字符串输出到标准输出文件中,并将末尾字符 0 变换为CR输出。 3)参数 s指向要输出的字符串。 4)返回值 正常返回值是0,错误返回值为EOF。,第4章 程序结构,4.1.2 数据输出,3.printf函数 1)格式 printf(输出格式描述串,输出项表列) 2)功能 该函数按照指定的格式,将输出项表列中的诸项输出到标准输出文件中。 3)参数说明

32、 输出格式描述串是由一系列格式转换说明符组成,格式转换说明符的描述形式如下: %+-0m.n1,第4章 程序结构,4.1.3 数据输入,1.字符输入函数 1)功能 该函数从标准输入设备(通常是键盘)上读入一个字符。 2)调用格式 c=getchar() 当执行此函数调用语句时,变量c获得一个从标准设备上读取的字符代码值。当从键盘上输入z(即按Ctrl+Z组合键)时,c得到的值是-1。z称文件结尾,在程序中经常使用符号常量EOF表示(End of File)。用此函数时,也要求在程序第一行有预编译命令(也称嵌入头文件)“include ”。,第4章 程序结构,4.1.3 数据输入,2.字符串输入

33、函数 1)格式 gets(char *s) 2)功能 该函数从标准输入文件(一般是键盘)读取下一个字符串,存入s所指向的内存区内。当输入遇到字符时,结束字符串的输入,并自动将字符转换为0(即NULL),存放在输入串的末尾,使其构成下一个字符串。 3)参数说明 s是一个字符型指针,它指向所取字符串的首地址。 4)返回值 正常返回时,取到字符串的首地址。如果遇到文件尾或出错时返回NULL。NULL定义的形式为“define NULL 0”,它包含在stdio.h头文件中。,第4章 程序结构,4.1.3 数据输入,3.scanf函数 1)格式 scanf(格式描述串,输入项表列); 2)功能 该函数

34、从标准输入设备(通常是键盘)按照指定的格式为指定的输入项输入数据。如果有多个输入项时,从键盘上输入的各个数据之间可以用空格、Tab键或作为分隔符。 3)参数说明 与“printf()”类似,格式描述串也是由一系列“格式转换说明”所组成。每个格式转换说明符的完整描述如下: % m.nl,第4章 程序结构,4.2.1 if语句,4.2 选择结构,1.if语句的格式 if语句的格式为: if(表达式) 语句1 例如: if(ab) printf(%dn,a); 这种if语句的执行过程如图所示。,第4章 程序结构,4.2.1 if语句,2.ifelse语句 ifelse语句的格式为: if(表达式)

35、语句1 else 语句2 这种if语句的执行过程如图所示。 若表达式的值为真(非零),就执行“语句1”;若表达式的值为假(零),则执行“语句2”,然后执行if语句后的下一条语句。这就是典型的两分支选择结构。,第4章 程序结构,4.2.1 if语句,3.ifelseif语句 当有多个分支选择时,可采用ifelseif 语句,其一般形式如下: if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 else if(表达式m) 语句m else 语句n 这种if语句的执行过程示意图如图所示。,第4章 程序结构,4.2.2 if语句的嵌套,在if语句中又包含一

36、个或多个if语句称为if语句的嵌套。其一般格式为: if(表达式) if(表达式)语句 else 语句 else if(表达式)语句 else 语句 应当注意if与else的配对关系。else总是与它上面最近的if配对。,第4章 程序结构,4.2.3 条件分支的嵌套,在进行程序设计时,经常要用到条件分支嵌套。所谓条件分支嵌套就是在一个分支中可以嵌套另一个分支。例如,在下面的条件分支中: if(条件表达式c) 程序段s1; else 程序段s2; 程序段s1和s2中又可包含条件分支。利用条件分支嵌套可以实现多分支控制。,第4章 程序结构,4.2.4 ifelse if结构,ifelse if结构

37、是条件分支嵌套常用的一种形式,其一般形式如下: if(条件表达式c1) 程序段s1; else if(条件表达式c2) 程序段s2; else if(条件表达式c3) 程序段s3; else if(条件表达式cn) 程序段sn+1;,第4章 程序结构,4.2.4 ifelse if结构,该结构实质上是ifelse分支的多层嵌套。因为如果嵌套的层数过多,会使程序写的很靠右,因此,把它简化为ifelse结构。其流程是从条件表达式c1开始向下逐一判断,一旦满足(即条件ci的逻辑值为1),则执行对应的程序段si,若所有的条件表达式的值都为零,就执行Sn+1语句。右图是ifelse if结构的示意图。,

38、第4章 程序结构,4.2.5 switch语句及用switch语句实现的分支结构,1.switch语句 语言还提供了另一种用于多分支选择的switch语句,其一般形式如下: switch(表达式) case常量表达式1: 语句1; case常量表达式2: 语句2; case常量表达式n: 语句n; default: 语句n+1; ,第4章 程序结构,4.2.5 switch语句及用switch语句实现的分支结构,2.switch语句的执行过程 当执行switch语句时,首先计算紧跟其后的一对括号中的表达式的值,然后在switch语句体中寻找与该值符合的case标号。如果有与该值相等的标号,则执

39、行该标号后开始的各语句,包括在其后的所有case和default中的语句,直到switch语句体结束;如果没有与该值相等的标号,并且存在default标号,则从default标号后的语句开始执行,直到switch语句体结束;如果没有与该值相等的标号,同时又没有default标号,则跳过switch语句体,去执行switch语句之后的语句。,第4章 程序结构,4.3.1 for循环语句,4.3 循环结构,1.for语句构成的循环结构 在许多情况下,循环条件的变化是有规律的,比如,循环变量每次增大1,而且循环变量的初值和终值都是已知的,那么使用for语句就成为“最佳选择”。例如: for(i=0;

40、iN;i+) sum=sum+d; 其中i=0是给循环变量赋初值,常称为循环初值。而iN是循环能否执行的条件,又称循环终值。最后的i+是循环变量增1,又称为增量。可以看出,在for循环头里面包含了循环的初值、终值和增值。当条件成立时,就执行语句: sum=sum+d; for语句的一般语法形式是: for(表达式1;表达式2;表达式3) 语句,第4章 程序结构,4.3.1 for循环语句,2.for循环的执行过程 for循环的执行过程如下: (1)先求解表达式1。 (2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步;若其值为假(0),则结束循环,转

41、到第(5)步。 (3)求解表达式3。 (4)转回上面第(2)步继续执行。 (5)循环结束,执行for语句下面的一个语句。,第4章 程序结构,4.3.2 while循环语句,1. while循环的一般形式 while语句的一般形式为: while(表达式)语句 其中表达式是循环条件,语句为循环体。 while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。,2. while循环的执行过程 while循环的执行过程如下: (1)计算while后圆括号中表达式的值。当值为非0时,执行步骤(2);当值为0时,执行步骤(4)。 (2)执行循环体一次。 (3)转去执行步骤(1)。 (4)

42、退出while循环。 其执行过程如图所示。,第4章 程序结构,4.3.2 while循环语句,第4章 程序结构,4.3.3 dowhile语句,1.dowhile语句构成的循环结构 dowhile语句的一般形式是: do 语句 while(表达式); 例如: do sum=sum+i; i+; while(i100); dowhile语句的作用类似于while语句,但dowhile语句的循环控制条件判定是在循环体后,即总是先执行一次循环体,而后再判断控制表达式的值是否为真,如为真,则再执行循环体;否则循环到此结束。,第4章 程序结构,4.3.3 dowhile语句,2.dowhile循环的执行

43、过程 dowhile循环的执行过程如下: (1)执行do后面循环体中的语句。 (2)计算while后一对圆括号中表达式的值。当值为非0时,转去执行步骤(1);当值为0时,执行步骤(3)。 (3)退出dowhile循环。 dowhile循环的执行过程如图所示。,第4章 程序结构,4.3.4 循环结构的嵌套,C语言提供的3种循环语句都可以互相嵌套。 在使用循环相互嵌套时,被嵌套的一定是一个完整循环结构,即两个循环结构不能相互交叉。如图所示,其中(a)是非法的嵌套,(b)是合法的嵌套。,第4章 程序结构,4.3.5 break、continue和goto语句,1.break语句 break语句通常用

44、在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。 当break语句用于dowhile、for、while循环语句中时,可使程序终止循环而执行循环后面的语句,通常break语句总是与if语句连在一起。即满足条件时便跳出循环。,第4章 程序结构,4.3.5 break、continue和goto语句,2.continue语句 continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。continue语句只用在for、while、dowhile等循环体中,常与i

45、f条件语句一起使用,用来加速循环。 while(表达式1) if(表达式2) continue; 其执行过程可用图表示。,第4章 程序结构,4.3.5 break、continue和goto语句,3.goto语句 goto语句是一种无条件转移语句,与BASIC中的goto语句相似。goto语句的使用格式为: goto 语句标号; 其中标号是一个有效的标识符,这个标识符加上一个“:”一起出现在函数内某处,执行goto语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用,当满足某一条件时,程序跳到标号处

46、运行。,第5章 数组,5.1.1 一维数组,5.1 数值型数组,1.一维数组的定义 一维数组是数组名后只有一对方括号的数组,其定义方式为: 数据类型数组名元素个数; 关于数组的定义,应注意如下几点: (1)数组名后用方括号括住数组元素的个数,不能使用圆括号。 (2)元素个数可以是整型常量,也可以是整型常量表达式,但绝对不能含有变量,因为此表达式的值是在编译时计算出来的,而编译时系统并不能确定变量的取值。 (3)数组元素个数必须大于或等于1。 (4)数组元素的下标是从0开始编号的,因此,对于定义:“float a8;”,其第一个元素是a0而不是a1,最后一个元素是a7,而不是a8。,第5章 数组

47、,5.1.1 一维数组,2.一维数组的存储形式 一维数组在内存中存储时,按下标递增的次序连接存放。对于int a15数组名a或a0是数组存储区域的首地址,即数组第一个元素存放的地址。因此,数组名是一个地址常量,不能对其进行赋值和进行运算。 3. 一维数组的初始化 初始化就是给数组元素赋初始值,有如下两种初始化方法: 1)用赋值语句初始化 用赋值语句初始化是在程序执行时实现的。 2)在数组定义时初始化 这种初始化是在编译时进行的。其一般形式如下: 数据类型 数组名数组元素个数值1,值2,值n,第5章 数组,5.1.1 一维数组,4. 一维数组的引用 与变量类似,任何一个数组都应先定义或说明,然后

48、再引用。在C语言中不能对数组整体进行操作,例如,不能对整个数组进行赋值或其他各种运算。只能对数组元素进行操作。数组的引用形式为: 数组名下标 其中下标既可以是整型常量表达式,也可以是含有变量的整型表达式。,第5章 数组,5.1.1 一维数组,5一维数组的应用 1)求和、平均值问题 2)求最值问题 3)查找问题 4)排序问题,第5章 数组,5.1.2 二维数组,1.二维数组的定义 二维数组定义的一般形式是: 数据类型 数组名 整型常量表达式整型常量表达式; 例如: int a510; 定义数组a为510(5行10列)的整型数组。 double matrix32*3+1; 定义数组matrix为3

49、7(即2*3+1的结果)的双精度数组。 char namesZ-A+110; 定义数组names为26(即Z-A+1的结果)行10列的字符数组。 在一个标识符后面连续出现两对方括号(其中有表示大小的整数),就说明该标识符是二维数组名。,第5章 数组,5.1.2 二维数组,2.二维数组的初始化 二维数组初始化也是在类型说明时给各下标变量赋初值。二维数组可按行分段赋值,也可按行连续赋值。 例如,对数组a53: (1)按行分段赋值可写为: int a53= 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85; (2)按行连续赋值可写为: int a53= 80,

50、75,92,61,65,71,59,63,70,85,87,90,76,77,85; 这两种赋初值的结果是完全相同的。,第5章 数组,5.1.2 二维数组,3. 二维数组的引用 二维数组元素的表示形式是: 数组名下标表达式下标表达式 其中,下标表达式的值必须是整数。例如,ab00是数组ab的第0行第0列元素,即整个数组的头一个元素,而ab34是数组ab的第3行第4列元素,即整个数组的最后一个元素。 在引用数组元素时应注意: (1)二维数组的行下标值和列下标值都是从0开始的。 (2)二维数组元素可像同类型的简单变量那样在表达式中使用,但应注意,行下标、列下标都应齐备。,第5章 数组,5.1.2

51、二维数组,4.二维数组的应用 【例5-5】有一个34的矩阵,要求编程求出其中值最大的那个元素及其所在的行号和列号。 先用N-S图表示其算法,如图所示。,第5章 数组,5.2 字符型数组,5.2.1 字符型数组的定义及初始化,1.字符型数组的概念 字符数组的一般定义形式是: char 数组名整型常量表达式; 由整型常量表达式的值决定数组的大小。例如: char name 15; 定义name为字符数组,它由15个元素组成。 又如: char s 10=H,I,:,m,o,r,n,i,n,G; 定义s为10个元素组成的字符数组。 字符数组占用一片连续的空间,如图所示。每一个元素占用的单元应足以存放

52、一个字符量,通常是一个字节。,第5章 数组,5.2.1 字符型数组的定义及初始化,2.字符型数组的初始化 关于字符数组的初始化有如下两种方式。 1)用字符常量初始化数组 例如: char str20=T,s,i,n,g,h,u,a, ,u,n,i,v,e,r,s,i,t,y,0 即该数组被初始化为“Tsinghua University”。 2)用字符串常量初始化数组 例如: char str18=This is a program; 该初始化自动在末尾一个字符后加0。,第5章 数组,5.2.2 字符型数组的输入/输出和处理,1.字符型数组的输入/输出 在标准库函数中,系统提供了大量有关字符和

53、字符串的操作函数,其中包括输入/输出函数,这里简单说明一下如何利用它们对字符型数组进行输入/输出。可以用getchar()或scanf()两函数对字符数组进行赋值,而用putchar()或printf()输出其内容。,第5章 数组,5.2.2 字符型数组的输入/输出和处理,1)用getchar()或scanf()的“%c”格式对数组进行字符赋值 例如,对于数组“char c15;”,用getchar()赋值: for(i=0;i14;i+) ei=getchar(); 也可用scanf()赋值: for(i=0;i14;i+) scanf(%c,&ci); 用getchar()赋值,一次只接收

54、一个字符,用scanf()赋值,一次可接收一个字符串。,2)用scanf()的“%s”格式赋值(即字符串赋值) char c15; scanf(%s,c); 或 scanf(%s,&c0); 当在键盘上输入“program”并回车时,c数组中自动包含一个以0结尾的字符串program。“%s”格式要求操作数是地址,所以上述两种写法均正确。但下面的写法是不正确的: scanf(%s,&c);,第5章 数组,5.2.2 字符型数组的输入/输出和处理,第5章 数组,5.2.2 字符型数组的输入/输出和处理,3)用字符输出函数输出字符数组中的内容 例如,假设下面的c数组各元素已赋值: char c15

55、; for(i=0;i15;i+) putchar(ci); 或 for(i=0;i15;i+) printf(%s,c); 4)用printf()的“%s”进行字符串输出 此时要求字符数组一定要以0结尾。例如: char c15=program; printf(%s,c); 此时将输出字符串: program 需要注意的是putchar()一次只能输出一个字符。,第5章 数组,5.2.2 字符型数组的输入/输出和处理,2.字符型数组(字符串)处理函数 语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。 使用这些函数可大大减轻编程的负担。用于

56、输入/输出的字符串函数,在使用前应包含头文件stdio.h,使用其他字符串函数则应包含头文件string.h。 几个最常用的字符串函数。 1)字符串输出函数 puts 2)字符串输入函数gets 3)字符串连接函数strcat 4)字符串拷贝函数strcpy 5)字符串比较函数strcmp 6)测字符串长度函数strlen,第6章 函数,6.1 函数的定义,6.1.1 无参函数的一般形式,类型标识符 函数名() 声明语句部分; 执行语句部分; 用“类型标识符”指定函数值的类型,即函数返回值的类型。无参函数一般不需要返回函数值,因此可以不写类型标识符。,第6章 函数,6.1.2 有参函数的一般形

57、式,类型标识符 函数名(数据类型1 参数1,数据类型2 参数2 ,) 声明语句部分; 执行语句部分; 有参函数比无参函数多了一个参数表。调用有参函数时,调用函数将赋予这些参数实际的值。 为了与调用函数提供的实际参数区别开,将函数定义中的参数表称为形式参数表,简称形参表。,第6章 函数,6.1.3 说明,(1)函数名和形式参数的名称应符合标识符的构成规则。 (2)类型标识符用于说明函数返回值的数据类型。 (3)函数定义不允许嵌套。 (4)空函数既无参数,函数体又为空的函数。其一般形式为: 类型说明符 函数名() (5)除了void类型外,所有函数都返回一个值,这个值由return语句明确给出。

58、(6)在老版本C语言中,参数类型说明允许放在函数说明部分的第2行单独指定。,第6章 函数,6.2 函数的声明和调用,6.2.1 函数的声明,函数声明的一般格式为: 类型说明符 函数名(类型说明符 形参变量1,类型说明符 形参变量2,); 从形式上看,函数声明就是在函数定义格式的基础上去掉了函数体。通常,将函数声明安排在源文件的开始部分。函数声明中的形参变量名可以省略。,第6章 函数,6.2.2 函数的调用,1.函数调用的方式 在语言中,可以用以下几种方式调用函数。 1)函数表达式 函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如,z=max

59、(x,y)是一个赋值表达式,把max的返回值赋予变量z。 2)函数语句 函数调用的一般形式加上分号即构成函数语句。例如: printf (%d,a); scanf (%d,&b); 都是以函数语句的方式调用函数。,第6章 函数,6.2.2 函数的调用,3)函数实参 函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf(%d,max(x,y); 即是把max调用的返回值又作为printf函数的实参来使用的。在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用,还是自右至左使用。对此,各系统的规定不一定相同。,第6章 函数,6.2.2 函数的调用,2.函数调用时的语法要求 函数调用时有下列几条语法要求: (1)调用函数时,函数名必须与所调用的函数名完全一致。 (2)实际参数的个数必须与形式参数的个数一致。 (3)C语言规定,函数必须先定义,后调用(函数的返回值类型为int或char时除外)。 (4)C程序中,函数可以直接或间接地调用自己,称为递归调用。,第6章 函数,6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论