全套电子课件:C语言程序设计-第十五套_第1页
全套电子课件:C语言程序设计-第十五套_第2页
全套电子课件:C语言程序设计-第十五套_第3页
全套电子课件:C语言程序设计-第十五套_第4页
全套电子课件:C语言程序设计-第十五套_第5页
已阅读5页,还剩251页未读 继续免费阅读

下载本文档

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

文档简介

第1章C语言概述本章主要内容1.1C语言的发展与特点1.2C语言程序结构1.3C程序的上机步骤1.1C语言的发展与特点1.1.1C语言的发展1.1.2C语言的特点1.1.1C语言的发展

C语言在发展过程中与Unix相辅相成,C语言开创了Unix的新局面,使其获得了巨大成功。Unix促成了C语言的大发展,使其得到了迅速推广。1978年以后,C语言逐渐独立于Unix系统,独立于PDP-11机而蓬勃发展。目前人们常将1978年的标准C称为旧标准,将ANSIC称为新标准。随着C的发展,现在C语言已风靡全世界,成为世界上应用非常广泛的新型的现代主流程序设计语言,成为微、小、超小、大、超大和巨型等各类计算机共同使用的语言。C语言发展历史如图1.1所示。

图1.1C语言发展历史

1.1.2C语言的特点

C语言的特点具体可分成以下几点:(1)语言简洁(2)表达方式灵活实用(3)表达能力强(4)语言生成的目标代码质量高(5)结构化程序设计(6)可移植性好C语言程序的结构如下:(1)C语言程序的基本单位是函数一个C程序由一个或多个函数构成,其中必须有且只能有一个名为main的主函数。主函数可以调用其他函数,被调用的函数可以是系统提供的库函数,也可以是用户自己编写的函数。主函数与被调函数在程序中的位置,不论前后,可以任意放置。1.2C语言程序结构(2)一个函数由函数头和函数体两部分构成,每个函数都有相同的形式,如:函数名(参数表)参数说明

{说明语句执行语句}①函数头。它包括函数名,函数标志(一对圆括号),参数表(函数形式参数名)和参数说明(定义形式参数类型)。其中前两项必须有,后两项可有可无。②函数体。由一对花括号括起来的若干语句组成。通常这些语句分为两类:一类为说明语句,又称变量定义,作用是定义函数中用到的变量。另一类为执行语句,又称执行部分,作用是完成一定的算法处理。其中有些函数可以没有变量定义部分,但常有若干执行语句构成执行部分。特殊情况下,可以既无变量定义也无执行部分,只与一对花括号构成一个空函数体,它与函数头一起组成一个空函数,即什么也不做,这也是合法的。(3)C语言程序是用小写字母按自由格式书写的程序,通常一个语句写成一行,也可写成几行,一行内也可写多个语句。语句没有行号,也没有书写格式的限制。但是每个语句最后必须有一个分号,该分号是语句的终止符,它属于语句的一个组成部分,即使是程序的最后一个语句也应包含分号。(4)可以用/*……*/对C程序中的任何部分加以注释。1.3C程序的上机步骤

1.3.1源程序的编辑、编译、连接与执行1.3.2用TurboC运行C程序的上机步骤1.3.1源程序的编辑、编译、连接与执行

C语言采用的编译方式是将源程序转换为二进制的目标代码。从编写好一个C程序到完成运行一般经过以下几个步骤。1.编辑所谓编辑,包括以下内容:①将源程序逐个字符输入到计算机内存。②修改源程序。③将修改好的源程序保存在磁盘文件中。2.编译编译就是将已编辑好的源程序(已存储在磁盘文件中)翻译成二进制的目标代码。

3.连接将各模块的二进制目标代码与系统标准模块经连接处理后,得到具有绝对地址的可执行文件,它是计算机能直接执行的文件。4.执行执行一个经过编译和连接的可执行的目标文件。只有在操作系统的支持和管理下才能执行它。TurboC程序设计环境的上机步骤:(1)启动TurboC。(2)编辑源程序。C源程序的文件扩展名必须是.c。(3)编译、连接。若源程序无语法错误,生成可执行文件.exe;若源程序有语法错误,在Message窗口显示错误信息,此时没有生成可执行文件,应回到第(2)步,修改程序的错误,直到无语法错误则生成可执行文件。(4)执行程序。如程序未得到预期的结果,应回到第(2)步,修改程序的错误。(5)退出TurboC,按Alt+X键。1.3.2用TurboC运行C程序的上机步骤第2章基本数据类型、运算符及表达式

本章主要内容2.1常量2.2变量及其说明2.3标准数据类型2.4数据类型转换2.5运算符及表达式2.1常量2.1.1常量的分类和表示2.1.2常量的定义2.1.1常量的分类和表示

1.无正负号整型常量无正负号整型常量可以用以下3种形式表示:①十进制数形式为非0开头的一串十进数字串。②八进制数形式为以0开头的一串八进数字串。③十六进制数形式为以0x或0z开头的一串十六进数字串。

2.整型常量在无正负号整型常量前可加上符号,则构成正整型常量或负整型常量。因其符号位要占据一个二进制位,故其数值范围为-32767~32767。

3.实型常量实型常量是一种在数值中出现小数点或指数部分的常量,又称浮点常量。它可以用两种形式表示。①十进制数形式,又称定点表示形式,它由数字和小数点组成。②指数形式,又称浮点表示形式。它由下述5部分组成:[±]数[.数]e[±]数数符 尾数 阶符 阶码

4.双精度实型常量双精度实型常量与实型常量一样有十进制数和指数两种表示形式,同样是带有小数点或指数部分的常量,区别仅在于它占有更多的字节存储位置。

5.字符常量

C语言的字符常量又称字符型常量。它有两种表示方式:①由括在一对单引号中的一个字符构成。②由括在一对单引号中的转义字符构成。

6.字符串常量字符串常量由括在一对双引号中的字符序列或转义字符序列构成。其中字符序列由零个或多个字符组成。2.1.2常量的定义

为了提高通用性和灵活性,C程序常用一个标识符来代表一个常量,称符号常量。C语言规定要用常量定义来说明常量标识符及其所代表的常量。常量定义格式:#define常量标识符常量如:#defineMAX1002.2变量及其说明

变量是一种在程序执行过程中其值能不断变化的量。C程序中每一个变量都必须有一个标识符作“变量名”。习惯约定,变量名用能反映其意义的小写字符串来表示。对程序中的变量,在使用之前必须加以说明,指明其存储属性和数据类型,以便编译系统给它分配存储位置。变量说明格式:[存储属性]类型变量表;

其中变量表为:变量,变量……变量。例如:inta,b,c;2.3标准数据类型

2.3.1整数类型2.3.2实数类型2.3.3双精度实数类型

2.3.4字符类型2.3.1整数类型

整数类型的标志是int,它可以保存一个整数常量。分为如下四种:①基本型:标志是int。②短整型:标志是shortint或short。③长整型:标志是longint或long。④无符号型:存储单元中全部二进位均用来存放整数本身,而不包括符号位。它又分为三种:

无符号整型:标志是unsignedint。无符号短整型:标志是unsignedshort。无符号长整型:标志是unsignedlong。2.3.2实数类型

实数类型的标志是float,又称为单精度浮点类型。通常一个float型数据在内存中占32位(4个字节),其中8位表示指数部分,其余24位表示带符号的尾数。

float型数据的数值范围同样与宿主机器有关。在IBMPC微机中,float型数据就按上述32位格式存储,故其数值范围约为3.4×10-38~3.4×1038。

float型变量可以用来存放一个单精度的实型常量,它具有7位十进制数的精确度。2.3.3双精度实数类型

双精度实数类型的标志是double,又称为双精度浮点类型。通常一个double型数据在内存中占64位(8个字节),其精度为15~16位有效数字,在IBMPC微机中,double型数据的数值范围约为10-308~10308。2.3.4字符类型

字符类型的标志是char,它用来存放一个字符,不能存放字符串,而只能存放一个字符。一个char型数据在内存中占8位(1个字节),它实际上存储的是该字符相应的ASCII(美国标准信息交换码)。

在C语言中将小写字母转换成大写字母,只要对其减去32即可得到。此外,在C语言中,字符型数据和整型数据之间还可以互相赋值。

C语言没有直接提供其他高级语言所常有的“逻辑类型”或“布尔类型”。但是,在C语言中,同样有关系运算和逻辑运算。为了表示关系表达式和逻辑表达式所得的逻辑结果,C语言用整型值0表示逻辑值“假”,而用非0整型值表示逻辑值“真”。2.4数据类型转换2.4.1标准类型数据隐式转换2.4.2强制类型转换2.4.1标准类型数据隐式转换

隐式转换规则中,横向向左的箭头表示运算时必定的转换;纵向向上的箭头表示运算对象类型不一致时转换的方向,其总的原则是由级别低的向级别高的转换。

C语言允许任何标准类型数据之间的隐式转换。即在运算时,不同类型数据将按图2.1所示规则,自动地进行类型转换,从而实现整型、单精度型、双精度型和字符型间不同类型数据的混合运算。图2.1标准类型数据隐式转换规则2.4.2强制类型转换

C语言系统提供了一个强制类型转换运算符“()”,用它可以在任何表达式中以强制类型的形式进行显式类型转换。其方式为:(类型名)表达式其功能是将指定表达式的值强制转换为括号中所指定的类型。在使用强制转换时应注意以下问题:①类型说明符和表达式都必须加括号(单个变量可以不加括号)。②无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。③程序员编程时,应尽量使参加运算的各个对象类型一致,以减少程序运行时,要增加进行类型判别和转换的额外开销。2.5运算符及表达式2.5.1算术运算符及表达式2.5.2关系运算符及表达式2.5.3逻辑运算符及表达式2.5.4自增自减运算符及表达式2.5.5赋值运算符及赋值表达式2.5.6条件运算符及表达式2.5.7逗号运算符及表达式2.5.1算术运算符及表达式

1.基本的算术运算符在C语言中,算术运算符有5种:+、-、*、/、%。这些都是双目运算符。所谓双目就是说在其左右(或前后)各有一个运算分量。

2.算术运算符的优先级和结合性表达式是由常量、变量、函数和运算符组合起来的式子。表达式求值按运算符的优先级和结合性规定的顺序进行。算术表达式用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语言语法规则的式子。

(1)运算符的优先级:共分15级,1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。

(2)运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。

C语言中算术运算符的优先级如图2.2所示。图2.2算术运算符的优先级2.5.2关系运算符及表达式

C语言中有完整的一组关系运算符,表示两个运算分量之间的大小关系。下面是这些运算符:<=(小于或等于)、<(小于)、>=(大于或等于)、==(全等比较)、!=(不等于)。这些运算符都取两个运算分量,根据它们之间的关系成立(真)或不成立(假),分别得到结果是1或0,关系运算符的结合性为左结合,优先级低于算术运算符,如图2.3所示。图2.3关系运算符的优先级2.5.3逻辑运算符及表达式

C语言中有逻辑运算符:&&(逻辑与,即合取)、||(逻辑或,即析取)、!(逻辑非)赋值运算符。关系运算符的结果可以用逻辑运算符来组合。关系运算符的结合性为左结合,运算符的优先级如图2.4所示。图2.4运算符的优先级2.5.4自增自减运算符及表达式

++:增1运算符。

--:减1运算符。

自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式:++i:i自增1后再参与其他运算。

--i:i自减1后再参与其他运算。

i++:i参与运算后,i的值再自增1。

i--:i参与运算后,i的值再自减1。2.5.5赋值运算符及赋值表达式

1.赋值运算符简单赋值运算符和表达式:简单赋值运算符记为“=”。由“=”连接的式子称为赋值表达式。其一般形式为:变量=表达式赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。在C语言中,把“=”定义为运算符,从而组成赋值表达式。凡是表达式可以出现的地方均可出现赋值表达式。也可以组成赋值语句,按照C语言规定,任何表达式在其末尾加上分号就构成为语句。

2.复合的赋值运算符在赋值符“=”之前加上其他二目运算符可构成复合赋值符。如:

+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。构成复合赋值表达式的一般形式为:

变量双目运算符=表达式它等效于:变量=变量运算符表达式

赋值运算符和复合的赋值运算符的优先级仅高于逗号运算符,结合性为右结合。2.5.6条件运算符及表达式

条件运算符在两种选择中挑选,以产生一个确定的结果。这是一个三目运算符,其表达式是:

c?x:y

它表示,如c为真(非零),则结果是x,否则就是y。实际上,条件运算符执行的操作就是条件语句完成的功能。条件运算符通常用在下列结构中:求两个数中的小数,求两个数中的大数,或求一个数的绝对值。

条件运算符的优先级稍高于赋值运算符,而结合性为右结合。2.5.7逗号运算符及表达式

在C语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。其一般形式为:表达式1,表达式2

其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。对于逗号表达式还要说明两点:①逗号表达式一般形式中的表达式1和表达式2也可以又是逗号表达式。②程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。

逗号运算符的优先级在C语言中是所有运算符中最低的,其结合性为左结合。第3章简单的程序设计——顺序结构程序设计本章主要内容3.1C语句概述3.2输入语句3.3输出语句3.4综合应用举例3.1C语句概述

3.1.1表达式语句3.1.2函数调用语句3.1.3控制语句3.1.4复合语句3.1.5空语句3.1.6赋值语句3.1.1表达式语句

1.表达式表达式是C语言中的基本成分,是用来求值的一个式子,通常由运算符和运算对象组成。运算对象包括常量、变量、函数和表达式等。运算符包括前面已介绍过的各种运算符,按其作用分,有算术运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符等。根据表达式中运算符的分类和作用,表达式也分成算术表达式、关系表达式、逻辑表达式、赋值表达式和条件表达式等。

2.表达式语句

C语言是一种表达式语言。C语言中大多数语句是表达式语句。C语言的任意表达式加上分号就构成一个表达式语句,其格式为:表达式;

最后还要说明两点:①使用表达式时,表达式中的变量必须先已赋

值,否则结果不定。②表达式运算结果的类型与赋值语句中变量

要求的类型应当一致。不一致时,由系统自动进行隐式转换。3.1.2函数调用语句

函数调用语句由函数名、实际参数加上分号“;”组成。其一般形式为:函数名(实际参数表);执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调用函数体中的语句,求得函数值。3.1.3控制语句

控制语句用于控制程序的流程,以实现程序的各种结构方式,由特定的语句定义符组成。C语言有九种控制语句。可分成以下三类:(1)条件判断语句

if语句,switch语句

(2)循环执行语句

dowhile语句,while语句,for语句

(3)转向语句

break语句,goto语句,continue语句,return语句3.1.4复合语句

把多个语句用括号{}括起来组成的一个语句称复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。

复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。3.1.5空语句

只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。3.1.6赋值语句

赋值语句是由赋值表达式再加上分号构成的表达式语句。其一般形式为:变量=表达式;。赋值语句的功能和特点都与赋值表达式相同。由于赋值运算有三种形式,故相应的赋值表达式和赋值语句也有三种形式。

(1)简单赋值语句格式:变量=表达式;(2)多重赋值语句

格式:变量1=变量2=…=变量n=表达式;(3)自反赋值语句格式:变量双目操作符=表达式;在赋值语句的使用中需要注意以下几点:①注意在变量说明中给变量赋初值和赋值语句的区别。给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其他同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。②

在变量说明中,不允许连续给多个变量赋初值。③注意赋值表达式和赋值语句的区别。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。3.2输入语句3.2.1字符输入语句3.2.2格式输入语句

3.2.1字符输入语句

1.字符输入函数格式:getchar();

功能:从标准输入设备(一般为终端键盘)上输入一个可打印字符,并将该字符返回函数的值。

getchar()的类型为int,故实际返回函数的值为输入字符的ASCII码。getchar()只能接收一个字符,该字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一个运算对象参加表达式的运算处理。

2.字符输入语句格式:字符变量=getchar();

功能:从标准输入设备上输入一个可以打印字符,并将该字符赋给指定的字符变量。凡在程序中需要使用标准输入输出函数时,必须在程序文件的开头处使用预处理命令#include″stdio.h″嵌入这个定义文件。此外,函数getchar()只能输入可打印字符,对于不可打印字符,只有使用赋值语句才能输入。3.2.2格式输入语句

1.格式输入函数格式:scanf(格式控制串,地址表);

功能:从标准输入设备上读入字符序列,并将它们按指定格式进行转换后,储存于地址表所指定的对应的变量中。格式控制串是一个用双引号前后括起来的字符序列,又称“转换控制字符串”。它由若干个格式说明构成。格式说明是由控制前缀“%”与格式字符构成。其作用是控制转换输入数据的类型。

有时在控制前缀“%”与格式字符之间还可附加一个说明字符,用来进一步说明数据的格式。

2.格式输入语句格式:scanf(格式控制串,地址表);

由此可见,格式输入语句由格式输入函数加分号构成,实际上它是一个格式输入函数调用语句。注意:格式输入语句中的地址表是变量的地址,而不能用变量名。3.3输出语句3.3.1字符输出语句3.3.2格式输出语句

3.3.1字符输出语句

1.字符输出函数格式:putchar(表达式)

功能:将指定表达式的值所对应的字符输出到标准输出终端上。表达式可以是字符型或整型。每次只能输出一个字符;也可以输出控制字符;它还可以输出其他转义字符。

2.字符输出语句格式:putchar(表达式);

即由字符输出函数加分号构成,实际上是一个字符输出函数调用语句。注意:除了scanf和printf两个函数以外,所有需要使用标准I/O库中的函数时,都必须在程序文件的开头处使用预处理命令。

3.3.2格式输出语句

1.格式输出函数格式:printf(格式控制串[,表达式表]

功能:将表达式表的诸值按相应的指定格式输出到标准输出终端上。格式控制串:与scanf的格式控制串含意相同。它常由三部分组成:①格式说明:同样由控制前缀“%”与格式字符构成。②其他字符:这些字符照原样不变输出。③转义字符:对输出进行控制。

表达式表:是需要输出的数据,为选择项。当表达式表缺省时,只输出格式控制串中的其他字符内容。

2.格式输出语句格式:printf(格式控制串[,表达式表]);

它由格式输出函数加分号构成,实际上是一个格式输出函数调用语句。注意:在格式输出语句中,格式控制串中的格式说明和它后面表达式表中的数据,必须保持类型、顺序和项数三个一致。3.4综合应用举例

第4章流程控制本章主要内容4.1复合语句4.2条件语句4.3开关语句4.4循环语句4.5循环语句的嵌套4.6间断语句与继续语句4.7转移语句与返回语句4.8程序举例4.1复合语句

所谓顺序结构,就是将一个复杂的运算分解成若干依次执行的步骤,这些步骤或再分解,或用一个简单语句表达,由它们组合成的一个不可分的、顺序执行的语句序列整体。顺序语句由复合语句构成。格式:{语句序列}

功能:将花括号内的一系列语句(称子语句)组合在一起,构成一个顺序结构,在语法上成为一个语句。说明:①复合语句运行时各子语句依次顺序执行。②复合语句在语法上等价于一个简单语句。③复合语句中最后的大括号不用分号,但复合语句中最后一条语句后的分号不能忽略。4.2条件语句

C语言提供了三种格式的条件语句:

格式1:if(表达式)语句;

功能:首先计算表达式的值,然后判断表达式的值是否为真(非0),若为真,则执行语句。其执行过程如图4.1所示。

图4.1if语句图解

格式2:if(表达式)语句1;else语句2;

功能:首先计算表达式的值,然后判断表达式的值是否为真(非0),若为真,则执行语句1,否则执行语句2。其执行过程如图4.2所示。图4.2if-else语句图解

格式3:采用if-else-if语句,其一般形式为:if(表达式1)

语句1;elseif(表达式2)

语句2;elseif(表达式3)

语句3;…elseif(表达式m)

语句m;else

语句n;

其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。

在使用if语句中还应注意以下问题:①在三种形式的if语句中,在if关键字之后均为表达式。该表达式通常是逻辑表达式或关系表达式,但也可以是其他表达式,如赋值表达式等,甚至也可以是一个变量。②

在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。③在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。但要注意的是在}之后不能再加分号。4.3开关语句

在C语言中,可直接使用开关语句来实现多种情况的选择结构。格式:switch(表达式){case常量表达式1:

语句1;case常量表达式2:

语句2;…case常量表达式n:

语句n;default:

语句n+1;}

其中的default:和语句n+1可以同时省略。

执行过程:

首先计算表达式的值,然后用此值来查找各个case后面的常量表达式,直到找到一个等于表达式值的常量表达式,则转向该case后面的语句去执行;若表达式不等于任何case后面的常量表达式的值,则转向default后面的语句去执行;若没有default部分,则将不执行switch语句中的任何语句,而直接执行switch后面的语句。说明:①switch后面的表达式,可以是整型或字符型,也可是枚举类型。②case后的表达式只能是常量组成的表达式,且表达式的值必须互不相同。

③case的次序不影响执行结果,一般情况下,尽量将使用几率大的case放在前面。④在执行完一个case语句后,程序流程转到下一个case语句开始执行,直到整个switch语句结束。若要执行完一个case语句后,转到switch后的语句去执行,则要在该case语句的最后加上break语句。4.4循环语句4.4.1while语句4.4.2do-while语句4.4.3for语句

4.4.1while语句

格式:while(表达式)

循环体语句其执行过程如图4.5所示。

功能:先计算表达式,当值为非0时,重复执行指定的子语句;当值为0时,退出循环。特点:先判断表达式,后执行语句,即在“顶部”测试循环条件。当表达式一开始即为0时,则语句一次也不执行。图4.5while语句执行图解

注意:①循环体为多个语句时,必须用花括号将它们构成复合语句;②循环体中应有语句不断地修改循环控制条件,最终能使循环趋于结束。4.4.2do-while语句

格式:do

循环体语句;while(表达式);

其执行过程如图4.6所示。功能:先执行循环体语句,再测试表达式,当值为非0时,重复执行指定的循环体语句;直到值为0时,退出循环。特点:先执行语句,后判断表达式,即在“底部”测试循环条件。即使表达式一开始就为0时,其循环体语句至少也要执行一次。图4.6do-while语句执行图解4.4.3for语句

格式:for([表达式1];[表达式2];[表达式3])

循环体语句;

执行过程如图4.7所示。

图4.7for语句执行图解

功能:先计算表达式1给循环控制变量赋初值,再测试表达式2是否满足循环条件:条件为真,执行循环体语句,进行表达式3的计算,它改变表达式2的参量,再返回测试表达式2,……,直到表达式2条件为假,退出循环。说明:①for语句的一般语句又可用以下格式表示:

表达式1;while(表达式2){

语句表达式3}②for语句也可用如下易理解的形式来描述:for(循环变量初值;循环条件;循环变量增值)

循环体语句;

其中的三个表达式都可缺省,但无论缺省哪一个表达式,其中的两个分号都不能缺省。③若在for语句之前已对循环变量赋过初值,则可缺省表达式1。④“表达式2”也可缺省,此时不测试循环条件,即认为表达式2永远为真,为了避免无限重复下去,循环体中一定要有一条语句break能够跳出循环。⑤“表达式3”也可缺省,此时应在循环体中有语句可以改变循环变量的值。⑥表达式1、2、3也可同时缺省两个或三个。⑦表达式1、2、3可以是任何类型的表达式。4.5循环语句的嵌套

所谓循环的嵌套即是一个循环(称为“外循环”)的循环体内包含另一个循环(称为“内循环”),内循环中还可以包含循环,形成多层循环。三种循环(while循环、do-while循环、for循环)可以互相嵌套。多重循环的使用与单一循环完全相同。4.6间断语句与继续语句4.6.1间断语句break4.6.2继续语句continue4.6.1间断语句break

格式:break;

功能:在循环体或switch结构中,当执行到break语句时,它终止当前语句的执行,把流程转移到当前循环语句或switch语句的后继语句继续执行。单独使用break语句没有意义,一般它与循环语句和switch语句连用,与while语句连用的格式如下:while(表达式1){

语句1;if(表达式2)break;

语句2;}

break语句不能用于switch和循环语句之外的任何其他语句中。若用在多重循环的内层循环中,则break语句只能跳出本层循环。4.6.2继续语句continue

功能:在循环体中,当执行到continue时,要跳过循环体中位于其后的其他语句,把流程转移到当前循环语句的下一个循环周期,并根据循环控制条件决定是否重复执行该循环体。其与while循环语句连用的格式如下:while(表达式1){

语句1;if(表达式2)continue;

语句2;}

这里要注意continue语句和break语句的区别:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断循环的条件是否成立。continue语句只能用在循环语句中,而break语句除了可用在循环语句中,还可用在switch语句中。4.7转移语句与返回语句4.7.1转移语句goto4.7.2返回语句return4.7.1转移语句goto

goto语句为无限定转向语句,其格式为:goto语句标号;

语句标号用标识符表示,它的命名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。不能用整数来做标号。一般情况下,使用goto语句有两种情况:①与if语句一起构成循环结构。②从循环体中跳转到循环体外,但在C语言中可以用break语句和continue语句跳出本层循环和结束本次循环。4.7.2返回语句return

格式:return[(表达式)];

功能:被调函数中,当执行到return时,控制流程返回到主调函数调用该函数的地方。说明:①当return后面带表达式时,要计算其值,并且该值就是函数值,表达式的类型须与函数首部说明的类型一致;不带表达式时,被调函数返回主调函数时,函数值不确定。②一个函数可以有多个语句,但控制流程仅能执行其中的一个return而返回主调函数。③一个函数也可没有return语句,此时,由程序执行到函数的最后一个界限符“}”处,自动返回主调函数。4.8程序举例第5章数组本章主要内容5.1 数组的基本概念5.2 一维数组5.3 二维数组5.4 字符数组5.5 综合应用举例

5.1数组的基本概念

数组,是指相同类型变量的集合。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。同简单变量一样,数组也要先定义后使用。5.2一维数组5.2.1一维数组的定义

5.2.2一维数组元素的引用5.2.3一维数组的初始化5.2.4一维数组应用举例5.2.1一维数组的定义

定义一维数组的形式如下:

数据类型数组名1[整型常量表达式1],数组名2[整型常量表达式2],……

说明:①数据类型是数组全体数组元素的数据类型。②数组名用标识符表示,整型常量表达式代表数组具有的数组元素个数。③数组元素的下标一律从0开始。④编译程序为数组开辟连续的存储单元,用来顺序存放数组的各数组元素。注意:①数组名不能与其他变量名相同。

②定义数组元素个数的表达式是整型常量表达式。③允许在同一个类型说明中,说明多个数组和多个变量。5.2.2一维数组元素的引用

数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素的一般形式为:数组名[下标],其中的下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。注意:① 必须先定义数组,才能使用下标变量。② C语言中只能逐个地使用下标变量,而不能一次引用整个数组。5.2.3一维数组的初始化

数组初始化赋值是指在数组说明时给数组元素赋予初值。数组初始化是在编译阶段进行的。初始化赋值的一般形式为:static类型说明符数组名[常量表达式]={值,值...值};

其中static表示是静态存储类型,C语言规定只有静态存储数组和外部存储数组才可作初始化赋值。在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。

C语言对数组的初始赋值还有以下几点规定:①可以只给部分元素赋初值。当{}中值的个数少于元素个数时,只给前面部分元素赋值。②只能给元素逐个赋值,不能给数组整体赋值。③如不给可初始化的数组赋初值,则全部元素均为0值。④如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。5.2.4一维数组应用举例5.3二维数组5.3.1二维数组的定义

5.3.2二维数组元素的引用5.3.3二维数组的初始化5.3.4二维数组应用举例5.3.1二维数组的定义

定义二维数组的形式为:数据类型数组名[常量表达式1][常量表达式2],……;

数据类型是数组全体数组元素的数据类型;数组名用标识符表示;两个整型常量表达式分别代表数组具有的行数和列数。其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。数组元素的下标一律从0开始。5.3.2二维数组元素的引用

二维数组的元素也称为双下标变量,其表示的形式为:数组名[下标][下标],其中下标应为整型常量或整型表达式。下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。5.3.3二维数组的初始化

二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。例如对数组a[5][3]:①按行分段赋值可写为:staticinta[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};②按行连续赋值可写为:staticinta[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

这两种赋初值的结果是完全相同的。③只对部分元素赋初值,未赋初值的元素自动取0值。④如果对全部元素都赋初值(即提供全部初始数据),则定义数组时,对第一维的长度可以不指定,但第二维的长度不能省。5.3.4二维数组应用举例5.4字符数组5.4.1字符数组的定义

5.4.2字符数组的初始化5.4.3字符串和字符串结束标志5.4.4字符数组的输入和输出5.4.5字符串常用函数

5.4.6字符数组应用举例5.4.1字符数组的定义

C语言中有字符型常数和字符串常数,有字符型变量但没有字符串变量,所以要用字符型数组存放和处理字符串。其中,一维字符型数组可存放一个字符串,二维字符型数组可存放多个字符串。字符数组也可以是二维或多维数组。5.4.2字符数组的初始化1.一维字符型数组一维字符型数组的初始化,有以下两种方式:①用字符常数初始化,即将字符常数依次放在花括号中。注意:用这种方式初始化,最后一个字符必须是′\0′,不能省略。②直接用字符串常量初始化(字符串常量加不加花括号均可)。

2.二维字符型数组二维字符型数组相当于一个字符串数组,其初始化也有两种方式:①字符常数方式。②字符串常数方式。5.4.3字符串和字符串结束标志

通常用一个字符数组来存放一个字符串,当把一个字符串存入一个数组时,也把结束符′\0′存入数组,并以此作为该字符串是否结束的标志。

C语言允许用字符串的方式对数组作初始化赋值。用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志′\0′。除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。对一个字符数组,如果不作初始化赋值,则必须说明数组长度。5.4.4字符数组的输入和输出

1.用scanf()和printf()实现字符数组的输入和输出。①用“%c”控制的scanf()和printf()可以逐个输入和输出字符数组中的各个字符。②用″%s″控制的scanf()和printf()输入和输出字符串。特别要注意的是:″%s″用在scanf()中控制输入有一个弊端,就是输入的字符串不能含有空格或制表符。

2.字符串输入函数gets()和字符串输出函数puts()①用gets()可以直接输入字符串,直至遇到回车键为止,它不受输入字符中空格或制表符的限制。gets()的一般格式为:gets(字符型数组名);

②用puts()可以输出字符串,而且自动把字符串末尾的′\0′字符转换成换行符(而″%s″控制的printf()则没有将字符串末尾的′\0′转换成换行符的功能,必须增加″\n″来实现换行)。它的一般格式为:puts(字符型数组名);

这两个函数都要求数组名作参数,不能在数组名前加″&″。它们定义在标题文件stdio.h中,使用前要用#include把它们包含进来。5.4.5字符串常用函数1.字符串输出函数puts

格式:puts(字符数组名);

功能:把字符数组中的字符串输出到显示器。

2.字符串输入函数gets

格式:gets(字符数组名);

功能:从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。说明:gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。

3.字符串连接函数strcat

格式:strcat(字符数组名1,字符数组名2);

功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志″\0″。要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。

4.字符串拷贝函数strcpy

格式:strcpy(字符数组名1,字符数组名2);

功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志″\0″也一同拷贝。字符数名2也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。

5.字符串比较函数strcmp

格式:strcmp(字符数组名1,字符数组名2);

功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。字符串1=字符串2,返回值=0;

字符串1>字符串2,返回值>0;

字符串1<字符串2,返回值<0。

6.函数strlen

格式:strlen(字符数组名);

功能:测字符串的实际长度(不含字符串结束标志′\0′)并作为函数返回值。5.4.6字符数组应用举例5.5综合应用举例第6章函数本章主要内容6.1概述6.2函数的定义

6.3函数的参数和函数的返回值

6.4函数的调用

6.5函数的嵌套调用

6.6函数的递归调用

6.7变量的作用域与存储类别

6.8函数的作用域和存储类别

6.1概述

一个C语言的程序由若干个函数组成在组成一个程序的多个函数中,有且仅有一个是主函数,其函数名为main()。在C语言中可从不同的角度对函数分类。从函数定义的角度看,函数可分为库函数和用户定义函数两种。①库函数:由C系统提供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件,即可在程序中直接调用。②用户定义函数:由用户按需要写的函数。

C语言的函数兼有其他语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。

①有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。②无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。①无参函数:函数定义、函数说明及函数调用中均不带参数。②有参函数:在函数定义及函数说明时都有参数,称为形式参数(简称为形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)。注意:在C语言中,在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。函数还可以自己调用自己,称为递归调用。6.2函数的定义

6.2.1无参函数的定义6.2.2有参函数的定义6.2.1无参函数的定义

类型标识符函数名(){

声明部分语句

}

其中类型标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。

{}中的内容称为函数体。在函数体中的声明部分,是对函数体内部所用到的变量的类型说明。6.2.2有参函数的定义

类型标识符函数名(形式参数表列){

声明部分语句

}

表中给出的参数称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。注意:形参既然是变量,必须在形参表中给出形参的类型说明。6.3函数的参数和函数的返回值 6.3.1形式参数和实际参数6.3.2函数的返回值6.3.1形式参数和实际参数

形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,发生函数调用时,主调函数把实参的值传送给被调函数的形参,从而实现主调函数向被调函数的数据传送。函数的形参和实参具有以下特点:①形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。②实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。③实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。④函数调用中发生的数据传送是单向的。6.3.2函数的返回值

函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。对函数返回值有以下一些说明:①

函数的值只能通过return语句返回主调函数。

return语句的一般形式为:return表达式;或者为:return(表达式);

该语句的功能是计算表达式的值,并返回给主调函数。②函数返回值的类型和函数定义中函数的类型应保持一致。③如函数值为整型,在函数定义时可以省去类型说明。④不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。6.4函数的调用

6.4.1函数调用的一般形式6.4.2函数调用方式6.4.3对被调用函数的声明6.4.1函数调用的一般形式

C语言中,函数调用的一般形式为:

函数名(实际参数表)

对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数,变量或其他构造类型数据及表达式。各实参之间用逗号分隔。6.4.2函数调用方式

在C语言中,可以用以下几种方式调用函数:①函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。②函数语句:函数调用的一般形式加上分号即构成函数语句。③函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。6.4.3对被调用函数的声明

声明的一般形式为:

类型说明符被调函数名(类型形参,类型形参…);或为:

类型说明符被调函数名(类型,类型…);

括号内给出了形参的类型和形参名,或只给出形参类型。注意:C语言中规定在以下几种情况时,可以省去主调函数中对被调函数的函数说明。①如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用。

②当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用。③如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明。④对库函数的调用不需要再作说明,但必须把该函数头文件用include命令包含在源文件的前部。6.5函数的嵌套调用

函数的嵌套调用关系如图6.1所示。图中表示了两层嵌套的情形。其执行过程是:执行main函数中调用a函数的语句时,即转去执行a函数,在a函数中调用b函数时,又转去执行b函数,b函数执行完毕返回a函数的断点继续执行,a函数执行完毕返回main函数的断点继续执行。图6.1函数的嵌套调用6.6函数的递归调用

一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。注意:在递归函数中,由于存在着自调用过程,程序控制将反复地进入它的函数体。为防止自引用过程无休止地继续下去,在函数内必须设置某种条件。这种条件通常用if语句来控制。当条件成立时终止自调用过程,并使程序控制逐步从函数中返回。6.7变量的作用域与存储类别6.7.1局部变量6.7.2全局变量6.7.3局部变量的存储类别6.7.4全局变量的存储类别6.7.1局部变量

在函数内部定义的变量称作局部变量,也叫内部变量。它的作用域是本函数,因此只能在本函数内引用该变量,不能在本函数外的其他函数中使用。另外,形式参数也是本函数的局部变量,也只能在本函数内引用。关于局部变量的作用域还要说明以下几点:①主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。

②形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。③允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。④在复合语句中也可定义变量,其作用域只在复合语句范围内。6.7.2全局变量

在函数之外定义的变量称为全局变量,又叫外部变量。其作用域是从定义变量的位置开始,到本文件结束。全局变量的设置,增加了函数间的数据联系。利用全局变量,可以在函数之间互相传递多个数值。但是,要注意限制使用全局变量。因为全局变量在程序的全部过程中都占用存储单元,这会浪费空间。另外,它还会降低函数的通用性,因为函数在执行时要依赖于其所需的全局变量。而且,全局变量使用过多,亦会降低程序的清晰性,原因是各个函数都有可能改变全局变量的值,程序容易出错。6.7.3局部变量的存储类别

局部变量的存储类别共有三种:自动的、静态的和寄存器的。分别用关键字auto、static、register进行说明。其中,自动变量存放在动态存储区中,寄存器变量存放在CPU中的寄存器内,而静态局部变量存放在静态存储区中。

1.自动变量自动变量最为常用,“auto”可省略不写。在函数调用开始时,系统自动为它们动态分配空间,函数结束时释放这些空间。自动变量的值不被保留,生存期为函数的被调用期。使用自动变量可以节约存储空间。

2.静态局部变量若希望函数中局部变量的值在函数调用结束后保留原值,就应使用“静态局部变量”。对静态局部变量的说明:①静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。②静态局部变量在编译时赋初值,且只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

③如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。静态局部变量要多占内存,且长期占用并不释放。另外,它还会降低程序的可读性。

3.寄存器变量寄存器变量的性质与自动变量基本相同。由于CPU存取寄存器的速度比存取内存的速度快,使用寄存器变量就可以加快程序的运行速度。但是,由于计算机系统中的寄存器数目有限,所以不能在程序中定义过多的寄存器变量。6.7.4全局变量的存储类别

全局变量是在函数的外部定义的,编译时分配在静态存储区。它在程序的整个运行过程中都占用存储单元,生存期为整个程序的运行过程。全局变量的存储类别有两种:静态的和外部的。分别用关键字static和extern来说明。全局变量的存储类别可对其作用域进行限制或扩充。①将作用域扩充到整个文件,要用extern对全局变量加以声明。②将作用域扩充到一个C程序的其他文件。此时需要在其中一个文件中定义一个全局变量,而在其他文件中,同样用extern对该变量加以声明。

③将作用域限制在定义该变量的文件中,不允许被其他文件引用。这就要求在定义全局变量时前面加上static的存储类别,这种全局变量称作静态全局变量。6.8函数的作用域和存储类别6.8.1内部函数

6.8.2外部函数 6.8.1内部函数

函数的作用域是全局的。如果一个函数只能被本文件中其他函数所调用,就称为内部函数。在定义内部函数时,在函数名和函数类型前面加static。因此,内部函数又称静态函数。使用内部函数,可以使函数只局限于该函数所在的文件,即使其他文件中有同名的内部函数,也互不干扰,这种情况与静态全局变量相似。6.8.2外部函数

如果函数定义时不指出static,函数就可以被本文件和其他文件中的函数调用。为明确起见,可以在函数定义和声明时使用extern,表示此函数是外部函数。注意:C语言规定,在定义函数时若省略了extern,则表示此函数是外部函数。第7章

编译预处理第7章编译预处理本章主要内容7.1宏定义7.2文件包含

7.3条件编译7.1宏定义7.1.1不带参数的宏定义7.1.2带参数的宏定义7.1.1不带参数的宏定义

不带参数的宏定义是用一个指定的标识符(宏名)来代表一个字符串(宏体)。它的一般形式为:#define宏名宏体其中,#define是宏定义命令。宏名为C语言标识符,一般习惯用大写字母表示。宏体可以含任意字符。预编译时,将程序中所有出现的宏名替换成宏体的过程称为“宏展开”。对于宏定义还要说明以下几点:①宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名。②宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。

③宏定义不是说明或语句,在行末不必加分号。④#define命令出现在程序中,宏名从定义命令之后,到本源文件结束。⑤可用宏定义表示数据类型,使书写更为方便。⑥对“输出格式”作宏定义,可以减少书写麻烦。7.1.2带参数的宏定义

带参数的宏定义的一般形式为:#define宏名(形式参数表)宏体其中,形式参数表由一个或多个形参组成,形参之间用逗

温馨提示

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

评论

0/150

提交评论