C语言程序设计课件完整版电子教案_第1页
C语言程序设计课件完整版电子教案_第2页
C语言程序设计课件完整版电子教案_第3页
C语言程序设计课件完整版电子教案_第4页
C语言程序设计课件完整版电子教案_第5页
已阅读5页,还剩369页未读 继续免费阅读

下载本文档

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

文档简介

1、第2章 基本数据类型和运算符及表达式 第2页主要内容常量与变量整型数据实型数据字符型数据运算符和表达式数据类型的转换程序案例小结第3页2-1 常量与变量常量和符号常量变量第4页常量所谓常量,是指在程序运行过程中其值保持不变的量。如程序中的具体数字、字符等。常量被区分为不同的类型。第5页符号常量用一个标识符代表一个常量,称为符号常量,即标识符形式的常量。 第6页2-1-2 变量变量的概念变量的定义变量的初始化第7页变量的概念C语言中的变量是指在一个程序运行过程中,其值能被改变的量。一个变量应该有一个名字作为标识,变量名的命名规则也就是相关标识符的命名规则。 第8页变量的定义在C语言中,所有变量必

2、须在使用之前给予说明。也就是“先定义,后使用”,说明主要是指出变量的类型。变量定义的一般格式为: 数据类型标识符 变量名1,变量名2,变量名n; 第9页变量的存储第10页变量的初始化 在定义变量时同时初始化变量int a=8;/*指定a为整型变量,初值为8*/float f=8.24; /*指定f为实型变量,初值为8.24*/char c=a; /*指定c为字符型变量,初值为a*/给被定义变量的部分赋初值 int a,b,c=-6;它表示指定a、b、c均为整型变量,而只对c进行初始化,且c的初值为-6。第11页变量的初始化 对几个变量赋给同一个初值若对几个变量赋同一个初值,不能写成: int

3、a=b=c=6;而应写成: int a=6,b=6,c=6;初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋给初值的,相当于有一个赋值语句。第12页2-2 整型数据整型常量整型变量第13页2-2-1 整型常量十进制的整型常量:十进制数允许出现的数字是0-9共10个阿拉伯数字,并以非0数字开头。如456、-789、0等。八进制的整型常量:以0开头的整型常量是八进制整型常量。十六进制的整型常量:以0 x开头的整型常量是十六进制整型常量。第14页2-2-2 整型变量整型变量的分类整型数据在内存中的存放形式整型变量的定义整型数据的溢出第15页整型变量的分类基本整型,以int表示。短整型,以s

4、hort int表示,或以short表示。长整型,以long int表示,或以long表示。第16页整型变量的表示方法第17页C语言整型变量数值的表示范围 第18页整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的。如果定义了一个整型变量i,系统就给变量i分配相应的存储单元。 第19页整型变量的定义定义变量一般要在程序块的首部进行,以免在编译中出现变量未定义的错误。变量定义的位置决定了被定义变量的作用域,这一概念将在以后介绍。描述数据类型的关键字与被定义的变量之间至少要有一个以上的空格隔开,这样做的目的一是便于阅读程序,二是便于编译系统识别。多个变量是同一数据类型时,可以用一个数据类

5、型的关键字进行定义,但必须注意,变量间要用逗号隔开,结尾要用分号结束。变量可以以任意顺序进行定义,不必与它们在代码块中出现的顺序相对应。在定义short int型、long int 型和unsigned int 型变量时,可以只用short,long和unsigned进行定义。第20页整型变量的定义一个整型常量,其值在-32 76832 767范围内,认为它是int型,它可以赋值给int型和short int型变量。一个整型常量,其值若超过了上述范围,在-2 147 483 6482 147 483 647范围之内,则认为它是long int 型,可以将它赋值给一个long int 型变量。如

6、果C语言版本(如Turbo C)确定short int 与int 型数据在内存中占据的长度相同,则它的表数范围与int 型相同。因此,一个int型的常量也同时是一个short int 型常量,可以赋值给int 型或short int 型变量。常量中无unsigned类型。但一个非负值的整型常量可以赋值给unsigned型的整型变量,只要它的范围不超过变量数值的表示范围即可。在一个整型常量后面加一个字母l 或L,则认为是long int 型常量。第21页整型数据的溢出 第22页2-3 实型数据实型常量实型变量第23页2-3-1 实型常量实型常量的形式实型常量的类型第24页实型常量的形式十进制数形

7、式 由数字09和小数点组成(注意,必须有小数点)。如3.14159、0.123、.321、21.0、0.0等。 注意:在用十进制数书写实型常量时,必须包含小数点,小数点的两边不一定要求都有数字,例如,21.0可以写成21.;而0.123可以写成.123。第25页实型常量的形式指数形式 实型常量的指数形式类似于数学中的指数表示法,就是把其10的多少次幂中的10用E(e)代替。一般格式为: 尾数E(e)整数指数 如5.11027,7.21023。在C语言程序中表示为:5.1e-27,7.2e23或7.2e+23。 注意:在用指数形式书写实型常量时,e(或E)的前面和后面必须有数字,且e后面的指数必

8、须为整数,而尾数可以是整数也可以是小数。例如,.0e0、1E0、0e5合法,而e3、2.1e3.5、.e3、e等都不是合法的指数形式。第26页实型常量的类型许多编译系统将实型常量作为双精度来处理。例如,已定义一个实型变量f,有如下语句:f=3.86435*6620.87 系统将3.86435和6620.87按双精度数据存储(占64位)和运算,得到一个双精度的乘积,然后取前16位赋给实型变量f。这样做可以保证计算结果更精确,但是运算速度降低了。若在数的后面加字母f或F(如1.65f、654.87F),这样编译系统就会按单精度(32位)处理。第27页实型常量的类型一个实型常量可以赋给一个float

9、型、double型或long double型变量。根据变量的类型截取实型常量中相应的有效位数字。 第28页2-3-2 实型变量实型变量的分类实型变量的定义实型数据在内存中的存放形式实型数据的误差第29页实型变量的分类实型变量分为单精度(float型)、双精度(double型)和长双精度(long double型)3类。第30页 实型变量第31页实型变量的定义 使用单精度型变量之前,必须在程序块的首部对其进行定义。定义单精度型变量的关键字是float。 定义i为长双精度实数。C编译系统将为其分配8个字节(128bit)的存储空间。第32页实型数据在内存中的存放形式 第33页实型数据在内存中的存放

10、形式 第34页实型数据的误差 由于实型变量是用有限的存储单元存储的,因此,能提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。 第35页2-4 字符型数据字符常量转义序列字符串常量符号常量字符型变量字符数据在内存中的存放形式及其使用方法第36页2-4-1 字符常量C语言中字符型常量是由一对单引号括起来的单个字符构成。例如:x,y,7,%,;等都是有效的字符型常量。第37页2-4-2 转义序列除了以上介绍的字符常量之外,C语言还允许用一种特殊形式的字符常量,就是以一个“”开头的字符序列。 第38页转义序列 第39页2-4-3 字符串常量C语言中除了允许使用字符型常量外

11、,还允许使用字符串常量。字符串常量是用一对双引号括起来的字符序列。第40页2-4-4 符号常量C语言中,常量可以用符号代替,代替常量的符号称之为符号常量。为了便于与一般标识符、变量名相区别,符号常量一般用大写英文字母序列构成,符号常量在使用之前必须预先进行定义。其定义的一般格式是: #define 符号常量名 常量第41页2-4-4 符号常量使用符号常量增强了程序的可读性。使程序易于修改。第42页2-4-5 字符型变量字符型变量是用来存放字符常量的,在一个字符变量中只能放一个字符,而不能存放一个字符串(包括若干字符)。字符型变量和整型变量一样也需要先定义,其定义应该在程序块的首部,其关键字是“

12、char”。字符型变量的定义形式如下: char c1,c2;或char c1; char c2;第43页2-4-6 字符数据在内存中的存放形式及其使用方法字符常量在内存中的存放形式及使用字符串常量在内存中的存放形式第44页字符常量在内存中的存放形式及使用 将一个字符常量放到一个字符型变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。第45页字符常量在内存中的存放形式第46页字符串常量在内存中的存放形式字符串常量在内存中存储时,系统自动在该字符串的末尾加一个“字符串结束标志”,这个结束标志就是0(ASCII码值为0的字符),也用NULL表示。它

13、是一字节(8bit)的代码,因此,长度为n个字符的字符串常量,在内存中要占用n+1个字节的存储空间。 第47页2-5 运算符和表达式 运算符的分类运算符的优先级与结合性算术运算符和算术表达式增1、减1运算符及表达式赋值运算符和赋值表达式关系运算符和关系表达式逻辑运算符和逻辑表达式逗号运算符和逗号表达式sizeof运算符第48页2-5-1 运算符的分类 圆括号运算符:( )。算术运算符:+、-、*、%。增1、减1运算符:+、-。赋值运算符:=及其扩展赋值运算符。关系运算符:、=、=、=、!=。逻辑运算符:&、!。逗号运算符:,。求字节数运算符:sizeof。第49页2-5-1 运算符的分类 强制

14、类型转换运算符:(类型)。条件运算符:?、:。下标运算符: 。指针运算符:*、&。分量运算符:、。位运算符:、|、。第50页2-5-2 运算符的优先级与结合性运算符的优先级运算符的结合性第51页运算符的优先级 所谓运算符的优先级就是在一个表达式中运算符所具有的运算优先次序。优先级数字越大,表示优先级越高,越优先被执行。在C语言中,运算符的优先顺序共分15个等级,最低为1,最高为15。处在同一级别的运算符,它们的优先级相同。第52页运算符的结合性所谓运算符的结合性就是同一优先级的运算符的结合方向。自左至右的结合方向,称为“左结合性”;反之称为“右结合性”。除单目运算符、赋值运算符和条件运算符是“

15、右结合性”,即第14、3、2级。其他运算符都是“左结合性”。第53页2-5-3 算术运算符和算术表达式算术运算符算术表达式算数运算符的优先级、结合性第54页算术运算符C语言有如下5个算术运算符。+:加法运算符,或正值运算符,如1+4,+8。-:减法运算符,或负值运算符,如5-2,-9。*:乘法运算符,如2*6。/:除法运算符,如7/4。%:模运算符,或称求余运算符,如5%3。第55页算术运算符两个整数相除的结果为整数,如5/3的结果值为1,舍去小数部分。但是,如果除数或被除数中有一个为负值,则舍入的方向是不固定的。模运算是取整数除法的余数。第56页算术表达式算术运算符和操作数结合构成算术表达式

16、。操作数包括常量、变量、函数等。第57页算数运算符的优先级、结合性算术运算符中的“*、/、%”运算符指定优先级是第13级,它们优先于优先级小于13级的各种运算符,但它们低于优先级为第15级和第14级的运算符。而运算符+、-的优先级是第12级。也就是说在一个表达式中有加、减、乘和除运算时要先进行乘、除运算,而后进行加、减运算。第58页2-5-4 增1、减1运算符及表达式增1、减1运算符增1、减1表达式第59页增1、减1运算符C语言中除了基本运算符外,还包括两个特殊的算术运算符:增1运算符“+”,减1运算符“-”。表达形式有4种:+操作数操作数+-操作数操作数-第60页增1、减1表达式 由增1、减

17、1运算符和变量构成的表达式是增1、减1表达式。使用增1、减1操作时需注意:增1、减1运算的操作对象只能是变量,而不允许是常量或表达式、函数调用等。增1、减1运算符的操作数通常是整型或字符型,因为上述类型的数据操作后其值是确定的;而实型数操作前后并不能确保其差的绝对值是1。增1、减1操作又分前置和后置操作两类,它们有质的区别。第61页增1、减1表达式 增1、减1运算是除了第15级以外优先级最高的运算。但是后置操作则要注意:必然先引用其值参加运算,再做后置操作。注意增1、减1操作的副作用。增1、减1运算一般用于如下两种场合:计数。最常用的场合是修改循环控制变量,因为n+不论是从书写的角度还是从阅读

18、的角度都比n=n+1来得简捷方便;且生成的目标码较之n=n+1短。指针增1、减1操作。在增1或减1表达式不是其他表达式的一部分时,其前置操作和后置操作的效果是一样的。第62页2-5-5 赋值运算符和赋值表达式赋值运算符复合的赋值运算符赋值表达式第63页赋值运算符 赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。例如:a=10; /*把常量10赋给变量a*/b=2; /*把常量2赋给变量b*/x=a/b; /*将表达式a/b的值赋给x*/如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。第64页复合的赋值运算符在赋值符“=”之前加上其他运算符,可以构

19、成复合的运算符。凡是二目运算符,都可以与赋值符一起组合成复合赋值符。C语言规定可以使用10种复合赋值运算符。它们是:+= = *= /= %= &= = |=第65页复合的赋值运算符C语言中采用这种复合运算符,一是为了简化程序,使程序精炼;二是为了提高编译效率,下面是复合赋值运算符的例子:a+=6等价于a=a+6。 a-=5等价于a=a-5。x*=y+6等价于x=x*(y+6)。 x/=6等价于x=x/6。x%=4等价于x=x%4。第66页赋值表达式定义 由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。其一般形式为: 变量=表达式赋值表达式可以嵌套,并可以放在任何可以放置表

20、达式的地方。例如: a=(b=5)赋值表达式也可以包含复合的赋值运算符 其一般形式为: 变量 双目运算符=表达式第67页赋值表达式先进行“x*=x-2”的计算,此式子相当于x=x*(x-2),因为赋值运算符的优先级别最低,所以根据运算规则,将x=5代入此式,即得:x=x*(x2)x=5*(52)x=15再计算x+=x*=x-2,此时即是计算x+=xx=x+xx=15+15x=30。最后计算整个式子的值:x+=x+=x*=x-2x+=x+=xx+=xx=x+xx=30+30 x=60该赋值表达式的值是60,x的值为60。第68页2-5-6 关系运算符和关系表达式关系运算符关系表达式第69页关系运

21、算符所谓“关系运算符”实际上就是“比较运算”,即将两个数据进行比较,判断两个数据是否符合制定的条件。C语言提供了6种关系运算符。说明:关系运算符 、=的优先级别相同,关系运算符=、!=的优先级别相同,前面4种高于后面两种。关系运算符是双目运算符,结合性方向都是从左向右,即左结合性。关系运算符优先级低于算术运算符,但它们高于赋值运算符。第70页关系运算符第71页关系表达式关系表达式的概念 关系表达式是指,用关系运算符将两个表达式连接起来进行关系运算的式子。其一般形式为: 表达式1 关系运算符 表达式2 关系运算符两边的运算对象可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式等任意

22、合法的表达式。关系表达式的值逻辑值(“真”或“假”) 由于C语言没有逻辑型数据,所以用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。因为关系表达式的值为“1”或“0”,所以可参与其他种类的运算,如算术运算、逻辑运算等。关系表达式的求值过程 首先计算关系运算符两边的表达式的值,然后比较这两个值的大小。第72页2-5-7 逻辑运算符和逻辑表达式逻辑运算符逻辑表达式第73页逻辑运算符C语言提供了3种逻辑运算符,分别是:&:逻辑与:逻辑或!:逻辑非其中,&和运算符是双目运算符,如(x=1)&(x9)和(x5)。!运算符是单目运算符,应该出现在运算对象的左边,如!(ab)。逻辑运算符结合方向都是

23、从左向右,即左结合性。逻辑运算符的运算规则。第74页逻辑运算符逻辑运算就是将关系表达式用逻辑运算符连接起来,并对其求值的一个运算过程。a&b:若a、b同时为“真”,则a&b为“真”,否则a&b为“假”。ab:若a、b同时为“假”,则ab为“假”,否则ab为“真”。!a:若a为真,则!a为“假”;若a为“假”,则!a为“真”。第75页逻辑运算符逻辑运算符的优先级逻辑运算符的优先级顺序是:!(逻辑非)级别最高,&(逻辑与)次之,(逻辑或)最低。逻辑运算与算术运算、关系运算和赋值运算之间从高到低的运算顺序是:!(逻辑非)、算术运算、关系运算、&(逻辑与)、(逻辑或)、赋值运算。根据这个优先级关系,下

24、列表达式可以简化为:(ab)&(xy) 可写成 ab&xy (a=b)(x=y) 可写成 a=bx=y (!a)(ab) 可写成 !aab (a+b)& (x%y) 可写成 a+b&x%y 第76页逻辑运算符的运算规则第77页逻辑表达式 用逻辑运算符将算术表达式、关系表达式或逻辑量连接起来的式子就是逻辑表达式。C语言用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。但在判断一个数据是“真”或“假”时,却以0和非0为根据:如果为0,则判定为“逻辑假”;如果为非0,则判定为“逻辑真”。 第78页2-5-8 逗号运算符和逗号表达式逗号运算符C语言提供一种特殊的运算符,即逗号“,”运算符。逗号运

25、算符又称为“顺序求值运算符”,其优先级为1,即最低优先级;结合方向是从左至右。操作数的类型不受限制。此运算符不进行算术转换。2逗号表达式用逗号表达式连接的表达式称为逗号表达式。逗号表达式的一般形式为:表达式1,表达式2,表达式n第79页2-5-9 sizeof运算符sizeof运算符是一个单目运算符,有下面两种不同的用法,格式为:sizeof 表达式 或:sizeof(类型名)它是以字节为单位给出操作数所占用存储空间的大小。当操作数是类型名时,必须用圆括号将其括起来;当操作数是表达式时,圆括号可以省略。第80页2-6 数据类型的转换 隐式类型转换强制类型转换第81页2-6-1 隐式类型转换算术

26、转换赋值转换第82页算术转换 当表达式中的运算对象不同时,系统会进行类型的自动转换。转换的基本原则是:自动将精度低、表示范围小的运算对象类型向精度高、表示范围大的运算对象转换。 第83页算术转换规则第84页数据转换 第85页赋值转换 将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中,如将35赋给float变量f,即f35,先将35转换成35.00000,再存储到f中。如果将35赋给double型变量d,即d35,则将35补足有效位数字为35.00000000000000,然后以双精度浮点数形式存储到d中。将一个

27、double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元(32位)中。但应注意数值范围不能溢出。第86页赋值转换 字符型数据赋给整型变量时,由于字符只占1个字节,而整型变量为2个字节,因此,将字符数据(8位)放到整型变量低8位中。将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量(即截断)。将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的l6位送到long型低l6位中将unsigned int型数据赋给long int型变量时,不存在符号扩展问题,只需将高位补0即可。将一

28、个unsigned型数据赋给一个占字节数相同的整型变量。int,unsigned longlong,unsigned shortshort),将unsigned型变量的内容原样送到非unsigned型变量中,如果数据范围超过相应整型的范围,则会出现数据错误。第87页赋值转换 将unsigned int型数据赋给long int型变量时,不存在符号扩展问题,只需将高位补0即可。将一个unsigned型数据赋给一个占字节数相同的整型变量。int,unsigned longlong,unsigned shortshort),将unsigned型变量的内容原样送到非unsigned型变量中,如果数据范

29、围超过相应整型的范围,则会出现数据错误。将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋(连原有的符号位也作为数值一起传送)。第88页2-6-2 强制类型转换强制类型转换是利用强制类型转换运算符将一个表达式转换成所需数据类型的转换。强制类型转换常被称为显式类型转换。其一般形式为: (类型标识符)表达式其功能就是把表达式结果的数据类型强制转换为圆括号中的类型。其中,类型标识符可以是int、char、float、double、long等,也可以是后面章节介绍的指针、结构体类型标识符等。注意,类型转标识符两边的圆括号不可省略,此圆括号就是C语言中的强制类型转换符。 第89

30、页2-7 程序案例#include main() int a=99; int b=5; int c=11; int d=3; int result; float r;第90页接上 result=a-b; printf(a-b=%dn,result); result=b*c; printf(b*c=%dn,result); result=a/b; printf(a/b=%dn,result); result=a%b; printf(a%b=%dn,result); result=a%d+b/c; printf(a%d+b/c=%dn,result); r=(float)(a+b)/2; prin

31、tf(float)(a+b)/2=%fn,r); 第91页接上运行结果为:a-b=94b*c=55a/b=19a%b=4a%d+b/c=0(float)(a+b)/2=52.000000第92页2-8 小结C语言的数据类型:基本类型、构造类型、指针类型和空类型。其中基本数据类型包括整型、实型(包括单精度实型和双精度实型)、字符型和枚举类型等。构造类型包括数组类型、结构体类型和共用体类型。常量是指在程序运行过程中其值不能被改变的量。常量通常有4种类型,整型常量、实型常量、字符型常量、字符串常量。整型常量有十进制、八进制和十六进制表示。实型常量有小数和指数两种表示形式,均按double类型处理。字

32、符常量是用单引号(即撇号)括起来的单个可视字符或转义字符。字符串常量是用一对双引号括起来的若干字符序列,存储时系统会自动在其末尾加0作为字符串的结束标志,因此字符串常量所占存储空间等于字符串长度加1。第93页接上在程序运行时,其值能被改变的量叫做变量,变量必须先定义后使用。变量的类型由定义语句中的数据类型标识符指定。系统根据变量类型分配相应的存储空间,存放变量的值。通过变量初始化可以给变量赋初值。不能直接使用未经赋值的变量,因为它的值是一个不确定的数据。C语言的运算符,按运算对象分类有:一目运算符、二目运算符、三目运算符。按完成的动作类型分类有:算术运算符、赋值运算符、关系运算符、逻辑运算符、

33、强制类型转换运算符、位运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符、分量运算符、下标运算符和其他运算符。一个表达式中运算符所具有的运算优先次序称为运算符的优先级。同一优先级的运算符的结合方向称为运算符的结合性。自左至右的结合方向,称为“左结合性”;反之称为“右结合性”。第94页接上在C语言中,基本的算术运算符有5个,分别是+、-、*、/、%。其中*、/和%的优先级相同且高于+、-。这5个运算符具有“左结合性”。C语言中增1运算符“+”,减1运算符“-”是两个特殊的算术运算符。将操作数先执行增1或减1操作,再将操作后的值参加其他操作称为前置操作。先将操作数的值参加其他操作,再对操作

34、数做相应的增1或减1操作称为后置操作。C语言中,赋值运算符用“=”表示,它的作用是将一个数据赋给一个变量,有+=、- =、*=、/=、%=、=、&=、=和|=10种复合赋值运算符。由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。C语言提供的关系运算符有6种:(小于),(大于),=(大于等于),=(等于),!=(不等于)。用关系运算符将两个表达式连接起来,进行关系运算的式子称为关系表达式。第95页接上C语言提供的逻辑运算符有3种:&(逻辑与),|(逻辑或),!(逻辑非)。用逻辑运算符将一个或多个表达式连接起来,进行逻辑运算的式子称为逻辑表达式。C语言提供一种特殊的运算符,即逗

35、号“,”运算符。用逗号连接的表达式称为逗号表达式。C语言中,sizeof运算符的作用是以字节为单位给出操作数所占用存储空间的大小。当操作数是类型名时,必须用圆括号将其括起来;当操作数是表达式时,圆括号可以省略。在进行混合运算时,如果一个运算符两侧的运算对象的数据类型不同,系统则按“先转换,后运算”的原则,首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。分隐式类型转换和强制类型转换。隐式类型转换主要又分为两类:算术转换和赋值转换。强制类型转换格式为:(类型)表达式。第5章 数组 第97页主要内容一维数组二维数组字符数组程序案例小结第98页5-1 一维数组 一维数组的定义一维数组元素的

36、引用一维数组的初始化一维数组的应用第99页5-1-1 一维数组的定义一维数组的定义方式为:类型说明符 数组名常量表达式;第100页说明 类型说明符 类型说明符用来定义数组中各个数据元素的类型,包括整数型、浮点型、字符型、指针型以及结构体和共用体。数组名 数组名即数组的名称,它代表数组所占存储空间的首地址。数组名、变量名、标识符的命名规则相同。因为在C语言中,将数组也当成一个变量来看待。常量表达式 常量表达式表示数组中元素的个数,即:数组的大小,它必须是由常量或符号常量组成的表达式,不能含有变量。即C语言不允许对数组的大小作动态定义。这点是与PASCAL、BASIC语言不同的。第101页接上下标

37、 下标决定了元素在数组中的次序。数组都是以0作为第一个元素的下标,设n为一个常量,则下标的取值范围是0,n-1。存储方式 在内存中是以字节为基本单位来表示存储空间的,并且在内存中只能按照顺序的方式存放数据。一维数组中的各个元素在内存中是按照下标规定的顺序存放在内存中的。第102页 数组元素存放方式 第103页5-1-2 一维数组元素的引用在已经定义了一个数组以后,怎么来使用数组中的元素呢?C语言规定只能逐个地引用数组元素而不能整体引用,即不能一次引用数组中的全部元素。一维数组元素的引用格式:数组名下标第104页说明 数组必须先定义,后引用。数组名是表示要引用哪一个数组中的元素。下标往往隐含有特

38、定的含义。一般来说,一维数组的使用往往与单循环联系在一起。对于下标出界,C语言不进行语法检查。第105页5-1-3 一维数组的初始化变量的初始化是指变量在被说明的同时被赋予一个初值。数组的初始化操作是在定义数组的同时就规定数组中有什么样的内容,即各个数组元素取什么值。对数组的初始化操作可以采取以下方式:static类型说明符 数组名n=值1,值2,值n;第106页说明 对数组的初始化操作只能在定义数组时进行。C语言规定:只有静态存储数组和外部存储(extern)数组才能初始化。常量表达式n表示数组含有的元素个数。大括号中的内容即为数组的初值。值1将赋给第0个元素、值2将赋给第1个元素,等等。数

39、组初始化时,初值用“,”分开,整体再加一对“”括起来,最后以“;”表示结束。第107页在对数组元素全部赋初值时,可以不指定数组的大小。在省略了数组的大小后,系统将根据初值的个数来决定数组的大小。 static int a=1,2,3,4,5; 这个数组定义语句相当于static int a5=1,2,3,4,5;。对数组初始化时, 可以只给最前一部分数组元素赋初值,其余的数组元素赋0。如果想使数组中的元素全部被赋为0,则可以这样写: static int a5=0,0,0,0,0; (要写5个0) 或:static int a5=0;第108页赋初值后数组内容 第109页5-2 二维数组二维数

40、组的定义二维数组元素的引用二维数组的初始化二维数组的应用第110页5-2-1 二维数组的定义当数组中的每个元素带有两个下标时,称这样的数组为二维数组,其中存放的是有规律地按行、列排列的同一类型数据。所以二维数组中的两个下标,一个是行下标,一个是列下标。在C语言中二维数组定义的一般形式为:类型说明符 数组名常量表达式1常量表达式2第111页说明 “类型说明符”、“数组名”及“常量表达式”的含义与一维数组中的相关定义相同。二维数组中有两个下标,每一维的下标都是从0算起。第112页5-2-2 二维数组元素的引用二维数组元素的引用格式为:数组名行下标表达式列下标表达式第113页说明 二维数组的引用与一

41、维数组的引用基本上是一样的,只不过二维数组的引用要使用两个下标。数组元素可以出现在表达式中,也可以被赋值。二维数组的输入和输出常常通过二重循环来实现,一个下标对应一重循环控制变量,外循环对应下标1,内循环对应下标2。要注意定义数组和引用数组元素的差别。第114页5-2-3 二维数组的初始化分行初始化线性初始化只对部分元素初始化如果将数组的所有元素全部赋值的话,可以省略第一维的长度第115页分行初始化这种初始化是对二维数组进行初始化的最基本形式。二维数组有几行,就有几个用逗号分隔的大括号;有几列,每个大括号中就有几个用逗号分隔的数值;最后将所有的初始化内容用一对大括号括起来。 第116页线性初始

42、化 二维数组的存储是连续的,因此,可以用初始化一维数组的办法来初始化二维数组,即将所有的初始值全部连续地写在一对大括号里。 第117页只对部分元素初始化 对数组初始化时,如果初值表中的数据个数比数组元素少,则不足的数组元素用0来填补。第118页5-3 字符数组字符数组的定义字符数组的初始化字符数组的引用字符串和字符串结束标志字符数组的输入输出字符串处理函数字符数组的应用第119页5-3-1 字符数组的定义字符数组的定义与前面介绍的数值数组的定义类似。 第120页5-3-2 字符数组的初始化逐个字符赋值用字符串对字符数组赋初值第121页逐个字符赋值对字符数组进行初始化时,如果提供的初值个数小于数

43、组长度,则只将这些字符赋给数组中前面的那些元素,其余的元素自动赋空字符0。 第122页用字符串对字符数组赋初值例如,static char a=I am a student;也可以省略大括号,写成static char a = I am a student ;。注意:此时数组a的长度为15而不是14。因为在字符串常量的最后由系统加上了一个0。第123页5-3-3 字符数组的引用字符数组的引用和前面几节数组的引用没有什么区别,也是通过对数组元素的引用实现的,每次得到一个字符,只是要注意数据元素的类型现在是字符型。第124页5-3-4 字符串和字符串结束标志 这样在初始化字符数组时,可以写成如下形

44、式: static char a=I am a boy!;,此时a数组的长度为12。大括号也可以省略,写成如下形式: static char a=I am a boy!; 相当于static char a=I, ,a,m, ,a, ,b,o,y,!,0;。第125页5-3-4 字符串和字符串结束标志 注意:只有在程序中对字符串进行处理时,才考虑字符串结束标志的问题。系统在处理字符串时,如果程序中有一个字符串,那么就将其翻译成若干字符和一个0字符;如果某段程序要处理一个字符串,首先系统要找到字符串的第一个字符,然后依次向后,在遇到0字符时就认为当前这个字符串结束了。第126页5-3-5 字符数组

45、的输入输出字符数组的输出字符数组的输入第127页字符数组的输出 利用printf函数,按%c的格式将数组元素一次输出一个字符。利用printf函数,按%s的格式将数组中的内容按字符串的方式输出,即将整个字符串一次输出(要判断0字符)。利用puts函数可以将整个字符串一次输出。第128页字符数组的输入 利用scanf函数按%c的格式,读入键盘输入的单个字符为字符数组元素赋值。利用scanf函数,按%s的格式将整个字符串一次输入(要判断0字符)。利用gets函数可以将整个字符串一次输入。第129页5-3-6 字符串处理函数strcat(字符数组1,字符数组2)字符串连接函数strcpy(字符数组1

46、,字符数组2) 字符串复制函数strcmp(字符数组1,字符数组2)字符串比较函数strlen(字符数组) 求字符串长度函数strlwr()将大写字母转为小写字母strupr()将小写字母转为大写字母第130页strcat(字符数组1,字符数组2)字符串连接函数 功能:将存放在字符数组1和字符数组2的两个字符串连接起来,并存入字符数组1中。第131页strcat字符串连接函数执行过程 第132页strcpy(字符数组1,字符数组2) 字符串复制函数功能:字符复制函数将字符数组2中的字符复制到字符数组1中去,字符数组1中的原有字符串将被覆盖。注意:字符数组1一定要能放下字符数组2中的字符串。第1

47、33页strcmp(字符数组1,字符数组2)字符串比较函数功能:如果两个数组中的字符串一模一样,函数返回0值,否则返回非0值。注意:如果a、b为两个字符数组时,下面的写法是不正确的。if(a=b)printf(OK!);应写成if(strcmp(a,b)=0)printf(OK!);第134页strlen(字符数组) 求字符串长度函数 功能:函数返回字符串中原有字符的个数,不包括0。第135页strlwr()将大写字母转为小写字母 功能:将字符串中的大写字母转换为小写字母。第136页strupr()将小写字母转为大写字母功能:将字符串中的小写字母转换为大写字母。第137页【例5-9】用筛法求2

48、100之间的所有素数。 用筛法求2100之间的所有素数基本思路: 应用筛法求素数时,首先要建立筛子,这里用数组作为筛子。下标对应于数,相应下标变量的值标志是否在筛子中:为1表示在筛子中,为0表示已被筛去,不在筛子中。然后找每一轮筛选种子,筛选种子是完成一轮筛选后的下一个最小的素数,初值为2。 对每一轮筛选种子,筛去其所有的倍数,即相应下标变量的值赋值为0。倍数初值为筛选种子的2倍。第138页5-4 程序案例筛选完成后,筛子中剩下的即为素数。#include main() int i,a100; /*筛子数组*/ int i,n=0; /*n为素数个数,用于输出格式控制*/ int minp,d

49、oub; /* minp为筛选种子,doub为倍数*/ for(i=0;i100;i+) /*建立筛子*/第139页5-4 程序案例 ai=1; minp=2; /*筛选种子初始化*/ while(minp100) /*完成整个筛选*/ doub=2*minp; /*倍数初始化*/ while(doub100) /*完成一轮筛选*/ adoub=0; /*筛去当前倍数*/ doub+=minp; /*计算下一个倍数*/ do /*计算下一轮筛选种子*/ 第140页5-4 程序案例 minp+; while(aminp=0); printf(2到100之间的所有素数如下:n); for(i=2;

50、iy)m=x; else m=y; return(m);/*返回最大值*/第155页6-2 函数的参数与返回值函数的参数返回语句第156页6-2-1 函数的参数C语言程序由若干相对独立的函数组成,在程序运行期间,数据必然在函数中流入或流出,这就是函数之间的数据传递,也是函数之间的接口。一般的语言中,数据传递有参数传递和全局变量传递两种方法,语言也提供这两种传递方法。参数传递是数据传递的主门(正门),全局变量传递是数据传递的辅门(后门)。参数传递又有传值与传地址两种方式。语言提供的是传值方式,传值方式将对应实参表达式的值传递给相应的形参,实参与形参占有不同的存储单元,形参的改变不会引起对应实参的

51、改变。C语言的形式参数是入口参数,将数据从主调函数带进被调函数是单向传递,而数据的带回、数据的出口通过函数名进行。第157页6-2-2 返回语句通过在函数中使用返回语句,返回一个值给函数,同时终止函数的调用,返回主函数。一般格式为: return(表达式)或:return 表达式;第158页6-2-2 返回语句功能:计算表达式的值,将表达式的值返回给函数。从被调用的函数返回主调函数。说明:返回值类型应和函数类型一致,若不一致则将返回值自动转换成函数类型。函数中可以有多条返回语句,这时一般与if语句连用,执行到哪一条返回语句,哪条返回语句起作用。函数中无return语句,执行至函数体结尾时返回,

52、此时将返回一个不确定的值给函数。如果只需要从函数中返回,而不需带返回值,使用不带表达式的return语句。第159页6-3 函数的调用函数调用的一般形式函数调用的方式被调函数的说明第160页6-3-1 函数调用的一般形式函数调用的一般形式为:函数名(实参表);第161页说明 如果调用无参函数,则无实参表,此时小括号不能省略。调用时,实参与形参的个数应相同,类型应一致。实参与形参按顺序对应,一一传递数据。调用后,形参得到实参的值。实参可以是表达式。如是表达式实参,先计算表达式的值,再将值传递给形参。第162页说明 在C语言中,对于实参表的求值顺序,有的系统按自左至右的常规顺序,有的系统则按自右至

53、左的顺序求实参数值。大多数C(包括Turbo C)语言采用自右至左的顺序求值。主函数由系统调用。第163页6-3-2 函数调用的方式表达式方式语句方式参数方式第164页表达式方式 函数调用出现在一个表达式中,这种表达式称为函数表达式。这时要求函数返回一个确定的值以参加表达式的运算。第165页语句方式把函数调用作为一个语句。常用于只要求函数完成一定的操作,不要求函数返回值。这在scanf函数及printf函数的调用中已多次使用。第166页参数方式 函数调用作为另一个函数的实参。说明: 如要求2-n之间的所有素数,只需在主函数中增加数据n的输入处理,将for循环控制变量的终值改为n。第167页6-

54、3-3 被调函数的说明用户自定义函数一般在调用前,在主函数中进行说明。函数说明是一种声明,是告诉主调函数这里调用的是一个什么样的函数。函数说明的一般形式为:被调函数类型 被调函数名();注意:函数说明不是函数定义,故其后应有分号。第168页有以下情况,在调用函数前可不加说明 如果是整型函数或字符型函数,可以不加说明,系统自动按整型函数处理。如果被调用函数的定义出现在主调函数之前,可以不加说明。如果已在所有函数定义之前,或在文件的开头,或在函数的外部已作说明,可以不加说明。除了上述情况,其他情况均必须对被调用的函数在调用前进行说明。第169页注意 函数一般先定义,后使用。为清晰起见,一般均对被调

55、用的函数在调用前进行说明,以增加程序的可读性。函数不能重复定义,但可以反复说明。对于标准函数,还应在文件开头用文件包含指令include,指明调用有关库函数时所需用到的信息。例如,include ,其中stdio.h是一个头文件,它包含了输入输出库函数所用到的一些宏定义信息,前面程序中已反复用到。第170页6-4 函数的嵌套调用在C语言中,被调用函数还可以调用其他函数,这就构成了函数的嵌套调用。函数的嵌套调用是逐级调用,逐层返回。 第171页6-5 函数的递归调用递归算法具有两个基本特征。转化:将问题规模用一定的条件描述;类似问题的求解通过定义一个函数来完成;问题规模需转化成函数参数的形式来表

56、示。终止:对特定简单易解的类似问题有明确的解,这也就是递归调用的终止条件,常用if语句来控制。第172页递归调用分成两个基本阶段完成 第一阶段是递归阶段,也就是完成转化阶段的处理。第二阶段是回归阶段,即由特定问题的解递推出所求问题的解。 第173页6-6 函数与数组一维数组名作实参二维数组名和指针数组作实参第174页6-6-1 一维数组名作实参【例】通过函数给数组输入若干个正整数,调用函数输出该数组中的数据。本例的算法十分简单,只是想通过此例的程序,举例说明如何在函数中给主函数中的数组元素赋值;如何把主函数中的数组的数据传送给被调用函数;同时也显示了如何在被调用函数中引用在主函数中定义的数组。

57、第175页接上#define M 100void arrout(int ,int);/*函数原型,用以输出数组中的值*/int arrin(int *);/*函数原型,给数组输入数据*/main() int sM,k; k=arrin(s); arrout(s,k);第176页接上arrin(int *a) int i,x; i=0; scanf(%d,&x); while(x=0) *(a+i)=x;i+;scanf(%d,&x); return i;第177页接上void arrout(int *a,int n) int i; for(i=0;in;i+) printf(i+1)%5=0)

58、?%4dn:%4d,*(a+i); /*根据i的值来确定使用不同的格式串*/ printf(n); 第178页接上当数组名作为实参时,对应的形参除了应该是指针外,形参还可以用另外两种形式。 对于上例中的函数调用arrin(s);对应的函数首部可以写成以下3种形式:arrin(int *a)arrin(int a )arrin(int aM)在第(2)和第(3)种形式中,虽然说明的形式与数组相同,但C编译程序都将把a处理成第一种的指针形式。第179页6-6-2 二维数组名和指针数组作实参二维数组名作实参指针数组作实参第180页二维数组名作实参 当二维数组名作为实参时,对应的形参必须是一个行指针变

59、量。例如,若主函数中有以下定义和函数调用语句。#define M 5#define N 3main() double sMN; fun(s);第181页接上则fun函数的首部可以是以下3种形式之一:fun(double (*a)N)fun(double a N)fun(double aMN)注意:列下标不可缺。无论是哪种方式,系统都将把a处理成一个行指针。第182页指针数组作实参当指针数组作为实参时,对应的形参应当是一个指向指针的指针。例如,若主函数中有以下定义和函数调用语句。#define M 5#define N 3main() double sMN,*psM; for(i=0;iM;i+

60、)psi=si; fun(ps); 第183页接上则fun函数的首部可以是以下3种形式之一:fun(double *aM)fun(double *a)fun(double *a)因为传送的是一维指针数组,所以形参的定义形式与一维数组中作为实参的形式类似。 第184页6-7 程序案例【例】使用函数isprime(int a),用来判断自变量a是否为素数,若是素数,函数返回1,否则返回0。#include int isprime(int);/*函数原型说明*/main()第185页接上int x; printf(Enter a interger number: ); scanf(d%,&x);/*

温馨提示

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

评论

0/150

提交评论