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

下载本文档

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

文档简介

1、第一章 计算机语言及C语言概述第二章 基本数据类型、运算符和表达式第三章 数据的输入和输出 第四章 语句 第五章 指针初步和数组第六章 函数与程序结构第七章 编译预处理第八章 指针第九章 结构体第十章 文件C语言程序设计1第一章 计算机语言及C语言概述1.1 计算机语言1.2 C语言概述1.3 C程序的上机步骤21.1计算机语言1.1.1 计算机语言的发展过程计算机语言是指计算机能够接受和处理的、具有一定格式的语言。用计算机语言编写的,使计算机能够完成特定任务的代码串称为计算机程序。计算机语言经历了三个阶段:1.机器语言:由、代码组成的、能被机器直接理解执行的指令集合。2.汇编语言:采用一定的

2、助记符来代替机器语言中的指令和数据,又称为符号语言。3. 高级语言:接近自然语言和数学语言的程序设计语言。1. 汇编程序:将用汇编语言编制的程序(源程序)翻译加工成机器语言程序(目标程序)的工具。1.12 语言处理程序3. 编译程序:将用高级语言编写的程序(源程序)翻译成机器语言或汇编语言程序(目标程序)的工具。特点:一次编译,目标程序可多次使用从高级语言程序到获得运行结果的一般过程 程序库 数据源程序 目标程序 可执行程序 结果 3.解释程序:直接对源代码中的语句进行解释执行,产生运行结果,它不产生目标代码。编译连接执行41.2 C语言概述1.2.1 C语言的发展历史C语言的发展依次为:AL

3、GOL60 CPL BCPL B C51.2.2 C语言的特点1.C语言具有结构语言的特点,程序之间很容易实现段的共享.2.C语言的主要结构成分分为函数,函数可以在程序被定义完成独立的任务,独立的编译成代码,以实现程序的模块化3.C语言运算符丰富,,运算符包含的范围和广.4.C语言数据类型丰富。5.C语言允许直接访问物理地址,即可直接对硬件进行操作,实现汇编语言的大部分功能.6.C语言语法限制不太严格,程序实际自由度大这样使C语言能够减少对程序员的束缚.7.用C语言编程,生成的目标代码质量高,程序执行效率高.6例1.1 :# include stdio.hmain( ) printf(This

4、 is a C program.n);例1.2:main()int a,b,sum; a=123; b=456; sum=a+b; printf(sum is %dn,sum); 1.2.3 C程序举例7例1.3: 求a和b中的大者.main() /*主函数*/int a,b,c; /* 定义变量 */scanf(“%d,%d”,&a,&b); /* 输入变量a和b的值 */c=max(a,b); /* 调用max函数,将得到的值赋给c */printf(“max=%d”,c); /* 输出c的值 */int max(x,y) /* 定义max函数,函数值为整型,x,y为形式参数 */int

5、x,y; /* 对形参x,y作类型定义 */int z; /* max函数中用到的变量z,也要加以定义 */if (xy) z=x; else z=y;return(z); /* 将z值返回调用处 */8通过对上面三个程序的讨论,可以归纳如下:(1) C程序是由函数构成的. 且至少要包含一个主函数main, 也可以包含若干个其它函数.(2)被调用的函数可以是系统提供的库函数(如printf和scanf函数),也可以是用户自定义的函数(如例1.3中的max函数)。(3)一个函数由两部分组成: a. 函数头:包括函数名、函数类型、函数形参名、形参类型 一个函数名后面必须跟一对圆括号,但函数参数可以

6、没有。 b. 函数体 函数体是用一对大括号作为开始和结尾的标志. 包括说明和执行两部分: 说明部分用来说明函数、变量和定义变量、指针、数组等, 执行部分则通过语句描述函数的功能。 变量定义和语句都要以分号结尾。(4) 程序的任何地方都可以加入以“/*”和“*/”包围起来的解释部分, 该 部分的作用是为了增加程序的可读性,它不是程序的可执行部分, 不产生程序代码。9(5) C语言书写形式自由 一行内可以写多条语句,一条语句也可以分写在不同行上,当一条 语句分写在几行上时,行尾需加续行符 “” 。C语言中大小写字母 是有区别的,这一点在使用时要特别注意。1. C语言的基本符号: (1) 大小写英文

7、字母各26个:az,AZ 。 (2) 09共十个数字。 (3) 下划线 _ 。 (4) 特殊符号:包括运算符在内的其他字符。如、等。2. 标识符:用来标识变量名、符号常量名、函数名、类型名、文件名等。标识符只能由字母、数字和下划线三种字符组成,且必须以字母或下划线开头;其次,虽然C语言没有对标识符的长度进行统一的规定,但是具体的系统都有长度限制。Turbo C能识别长达31个字符。1.2.4 C语言的基本语法单位10C语言中,标识符有三种类型:a.关键字:系统已定义过的、有特定含义、不能挪作它用的标识符。C语言共有32个关键字。例如,int、char、break、for等。 b.预定义标识符:

8、系统定义过的,用于编译预处理命令中的标识符。例如,include、define等。建议这些标识符也不要作为用户自定义标识符。c.自定义标识符:依据标识符的命名原则,由用户自己定义的标识符。若能使用“见名知义”的名字,会使程序的可读性增强。 例如,下面的标识符都是合法的。 A2 student area_of_circlenum _dd 而下面的标识符则是不合法的。 2AA-B(不能有减号) area of circle(一个标识符)M.D(不能有点)111. 进入Turbo C集成环境运行Turbo C的执行程序TC.EXE,就进入了Turbo C集成环境,TC主屏由四部分组成:主菜单、编辑窗

9、口、信息窗口和功能键提示行。在进行编辑程序之前应设置好包含文件、库文件、输出文件和Turbo C系统所在的目录。2. 编辑在编辑窗口中将编写好的程序输入计算机或对已经存在的源程序文件进行修改的过程,就是源程序的编辑过程。FileLoad命令: 输入一个要编辑的源程序名字,则编辑窗口中的NONAME.C被新输入的名字取代。若被编辑的是一个新文件,则可以输入编写好的程序到编辑窗口;若被编辑的是一个旧文件,则可以对其进行修改。FileSave命令: 保存文件。FileNew命令: 在清屏后的编辑窗口,输入程序FileWrite to命令 输入源程序名字保存文件1.3 C程序的开发及上机步骤12选择C

10、ompileCompile to OBJ命令,对编辑窗口中的文件进行编译,如果编译成功,按F2键,将文件保存一下后就可进入下一个过程;否则,若编译失败,则在信息窗口中将发现的错误和警告信息一一列出。编译后生成的目标文件和库文件连接在一起才能生成可执行文件。当编译成功后,选择CompileLink EXE file命令,进入连接,如果出现错误,则一般要检查库文件和头文件的路径设置是否正确,修改后重新连接。3. 编译4. 连接13选择RunRun或Ctrl+F9(两个键同时按下)命令,就可以执行程序。若要察看运行结果,则按ALT+F5。如果程序在运行过程中需要输入数据,则选择了RunRun命令后,

11、屏幕处于用户屏状态,等待用户输入所需的数据,数据输入结束,运行后重新回到集成环境的主屏。Turbo C中,编译和连接这两个步骤也可以通过功能键ctrl+F9(建立.EXE可执行文件)附带一并一次完成。简言之,编辑后,可通过ctrl+F9一起完成若有错,则要反复多次选择FileOS shell命令,可以暂时退出Turbo C,转到DOS提示符下,此时,若再键入EXIT,则又可以返回Turbo C集成环境的主屏。选择FileQuit命令,彻底退出Turbo C,返回到DOS提示符下。作业:习题3,5,6上机知识:编辑、编译、连接、执行全过程5. 运行6. 退出Turbo环境14第二章 基本数据类型

12、、运算符和表达式2.1 基本数据类型2.2 运算符和表达式2.3 小结15C语言可以处理数值型及非数值数据。大致可分为:2.1 基本数据类型16每一种数据类型又有常量和变量之分,下面分别予以介绍。1. 值常量和符号常量常量是指那些在程序运行过程中其值不能改变的量。(1)值常量:如: -25、3.0、2e-3、A。(2)符号常量:是用define命令定义的常量,例如:#define PI 3.14define是宏定义,定义符号常量的方法为:#define 标识符 常量值习惯上符号常量名用大写表示,而变量名则用小写表示。注意:符号常量虽然用标识符来标识,但它本质上是常量,具有常量值不能改变的性质。

13、2.1.1 常量17 【例2.1】 #define PI 3.14 main( ) float r = 3.0, s, l; l = 2*PI*r; s = PI*r*r; printf(l=%f, s=%f; l, s); 2. 整型常量计算机中的整型数是有范围的,一般而言,用一个机器字来存放一个基本整型数据.(若干个字节组成一个存储单元,称为“字”).在表示方法上,通常在整数后面加上字母“l”或“L”,表示它为一个长整型数据;若在某个整数后面加上字母“u”或“U”,则表示它是一个无符号整数。例如: 125、26、40000L、37U、0L等等,都是合法的整型常量。而50000(超值,整型的

14、最大值是32767)、-23u非法.18整型常量还有十进制、八进制和十六进制三种表示方法。1)十进制形式 如125、-21、0。2)八进制形式 以数字0开头的,由07之间的数字组成的数据。 如: 056。3)十六进制数 以0 x或0X开头的,由数字09和字母A、B、C、D、 E、F组成的数据.其中6个字母也可以小写. 如: 0X5A、0 x39。 0X5A5*16110*16090 整型常量的类别和进制表示可以结合在一起使用。如: 0X41L为十六进制长整型数。193. 实型常量实型常量有两种表示方式:1)十进制小数形式由正负号、数字和小数点组成,其中小数点不能缺少,正数符号可省略。如1.25

15、、34.0(尾数零可以省)、+1.25、17.和.1。2)指数形式由尾数开头,加上指数部分共同构成,其中指数部分由指数符号e(或E),正负号及整数组成。如1.25e-5、+1e10、-1.25e5、1e-6、3e2。注意:e前面不能没有数字,e后面的数字必须为整数,也不能加园括号。计算机中e表示10如1E(-3)、E-5、1e2.1都是错误的。4. 字符型常量C语言提供了两类字符型常量。1)普通的字符常量:用单引号括起来的一个字符.如A、b、0、? 。2)转义字符常量:是以“”(反斜杠)开头的用单引号括起来的字符序列。 常用的转义字符见p 12.20注意: x61表示ASCII码为97的字符,

16、即字符a。 0表示ASCII码为0的字符,它是一个空字符(不是空格字符),常作为 字符串的结束标志。 整型数据和字符型数据可以在一定范围内通用,通过指定不同的格 式,一个字符型数据既可以以字符形式输出,又可以以整数形式输 出其ASCII码值。字符型char的值机内以ASCII码值表示。如: 数字字符09的ASCII码值是连续排列的, 为4857; 大写字母AZ的ASCII码值是连续排列的,为6590; 小写字母az的ASCII码值是连续排列的, 为97122。 A与A不同,前者是字符串,实际上由两个字符组成,即字符 A和字符串结束标志0,而后者是一个字符,仅由一个字符A 组 成,在存储器中存放

17、的是A的ASCII码值65。211. 变量的定义变量: 在程序运行过程中其值可变的量. 变量的定义方式如下: 存储类别 数据类型 变量名表;其中“存储类别”是可以省略的,缺省时,在函数内默认为auto型,即自动类型。例如:int a, b; (定义变量a和b为整型) unsigned c,d; (定义变量c,d为无符号整型变量)long e,f; (定义变量e和f为长整型) float x,y ; (定义变量x和y为单精度实型) double z; (定义变量z为双精度实型) char c1,c2; (定义变量c1,c2为字符型变量)C规定:程序中所有用到的变量都必须在程序中指定其类型,即“定

18、义”.2.1.2 变量222. 变量的赋值和初始化变量必须先有确定的值后才能参与各种相应的操作。(1)赋值语句例如:int a;a = 3;使整型变量a的值为3。(2) 初始化在定义变量的同时对变量赋初值。如int a=3;它等价于上面的赋值语句。(3) 赋值与初始化的区别赋值语句是在程序运行阶段将值赋给变量的初始化是在编译或运行时,系统为变量分配内存单元的同时,将值存放进去的。赋值语句允许在一条语句中为多个变量同时赋值,初始化则不允许. 23如int a, b, c;a = b = c = 0;是正确的。而int a = b = c = 0;则是错误的,应该修改为如下的形式:int a=0,

19、 b=0, c=0;3. 变量的使用原则变量的使用遵循这样的原则:先定义,后使用。例如,在程序中有定义int date;而程序体中有语句data=10;则编译时会检查出data是未经定义.例如,有定义float a, b;若程序中出现表达式“a%b”,则编译系统会检查出变量a和b参与了非法的运算。因为运算符“%”要求的操作数必须是整型。244. 注意事项(1) 不能把字符串赋给字符型变量。例如:char ch = You are wrong.;因为ch是char类型,一个字符型变量只能存放一个字符。(2) 一般不要将一个负数赋给一个unsigned型变量。例如:unsigned int a =

20、 -26;因为-26不是无符号数。(3) 给整型变量赋值时,注意要避免超界。例如:int a = 50000;超界,因为int类型允许的最大整数是32767。25语言提供了十五大类共四十四种运算符。有三个属性:优先级、结合性和目数优先级由高到低的次序进行,C语言的优先级别分为15级结合性则规定了在相同优先级运算符连续出现时的计算顺序,包括自左向右和自右向左两种。不同的运算符的优先级和结合性见p15表2.4。表达式:由常量,变量,函数调用和运算符按一定规律组合在一起构成的式子。其求值的顺序为:根据运算符的优先级与结合方向对表达式加园括号,然后从左到右计算表达式,一面计算一面转换操作数的类型,直到

21、能最终确定表达式的值时终止。 2.2 运算符和表达式261. 算术运算符+(加法或取正)-(减法或取负)*(乘法)/(除法)%(求余数)+(自增)-(自减)其中 +、-、*、/、%的结合性是自左向右。而+和-的结合性则是自右向左。C语言的算术运算符优先级从高到低为(+、-、+、-) 、 (*、/、%) 、 (+、-)。2. 说明(1) 在除法运算中,当两个操作数都是整数时,商也为整数,小数部分一律舍去。例如,7/3的结果为2,-1/2的结果为0,-5/3的结果为-1 。2.2.1 算术运算27当两个运算数的符号不同时,结果的符号与被除数的符号相同。例如,5%3的值为2,-5%3的值为-2,5%

22、-3的值为2。【例2.2】main( )int x = 10, y = 3; printf(x/y=%d,y/x=%dn, x/y, y/x); printf(x%y=%d,y%x=%dn, x%y, y%x); /* 字符串中的%输出为% */(3) 自增、自减运算符 +i , -i (在使用 i之前,先使i的值加减1) i+ , i- (在使用 i之后, 使i的值加减1) 若 i 的值为3,则 j=+i; j的值为4 j=i+; j的值为3,然后变为4.(2) %(求余运算)要求两个操作数都是整型,结果为整除后余下的整余数。printf(%d,+i); 输出4printf(%d,i+);

23、输出328再如,若a的值仍为3则执行a+*2后,表达式的值为6,a的值为4,而执行+a*2后,表达式的值为8,a的值为4。注意: 自增、自减运算符只能用于整型变量,而不能用于表达式. 如 5+ (a+b)+ -d(d为实数) 非法【例2.3】 main( ) int a = 9, b, c; b = +a; printf(%d,%dn, a, b); a = 9; c = a+; printf(%d,%dn, a, c); 29【例2.4】 main()int a,b,c; a=b=c=0; a=+b+ +c; printf(”n %d %d %d”,a,b,c); a=b+ +c+; pri

24、ntf(”n %d %d %d”,a,b,c); a=+b+c+; printf(”n %d %d %d”,a,b,c); a=b-+-c; printf(”n %d %d %d”,a,b,c);输出: 2 1 1 2 2 2 5 3 3 5 2 230其形式为: 变量 赋值运算符 表达式其中赋值运算符可以是 “=”,也可以是复合赋值运算符,如“+=”、“-=”、“*=”、“/=”和“%=”等等赋值运算其作用:将一个数据赋给一个变量,并以变量的值作为赋值运算后整个式子的值。复合赋值运算符“+=”一般形式: 变量+=表达式等价于 变量 = 变量表达式 其余的复合赋值运算符可类似的理解。例如:a

25、+= 3等价于a=a+3b *= a+2等价于b = b*(a+2),而不是b=b*a+2。2.2.2 赋值运算31使用赋值运算符,要注意以下几点:1. 该运算符的结合性为自右向左。例如:a = 3+(b = 2) 等价于 a = (3+( b = 2)运算结束后,a的值为5,b的值为2。思考题:假设a 的初值为,有表达式a += (b = 4)+2 则运算结束后,a 、b及表达式的值各为多少?2. 当赋值运算符两端数据类型不一致时,在赋值之前,系统自动对右端的类型进行转换,使其与左端类型一致。例如,假定a为整型变量,则a = 3.78的结果是将3赋给a。系统自动把赋值号右边的实数3.87转换

26、成整型3,小数部分全部舍去,不遵循四舍五入的原则。323. 赋值运算符的左端只能是变量(或数组元素),不能为表达式 或常量。如: a+b = 3和4 += m等都是错误的。4. 赋值表达式中的“表达式”,可以是一个赋值表达式,也可以包含复合 的赋值运算符. 如: a=b=c=5 a=5+(c=6) a=(b=10)/(c=2) a+=a-=a*a33 种类: (小于)、 (大于)、 =(大于等于)、 = =(等于)、!=(不等于)结合方向从左到右。关系运算符优先级从高到低为( 、 、 = ) ( = = 、 != )a= =bc 等价于 a= = (bc)而不等价于 (a= =b)的结果为,

27、aB的结果为x为0到100之间的数能否表示为 0=x0)个人进行分班,每班k(0)个人,最后不足k人也编一班,问要编几个班?2.2.3 关系运算n/k+(n%k0)34C语言提供三个逻辑运算符:&(逻辑与)、|(逻辑或)、!(逻辑非)优先级从高到低的次序为 ! & |“!” 是单目运算符,优先级高于算术运算符。“” 和 “|” 低于关系运算符。在逻辑运算中,逻辑运算符两端的操作数如果“非”,就当作“真”来处理,如果是“”,便当作“假”来处理,p19表2.5给出了各种逻辑运算的结果。例如: 53 & ab的结果为1 !12+3y?x:y); 将和中较大的一个数赋值给变量max条件运算符的结合性是

28、由右向左。2.2.5 条件运算37思考题:假设初值为,初值为,则执行了表达式 xy?x-:y-之后,、的值各为多少? z= xy? (float)x/-y+:x=y?1:(float)x/-y 和 x 、 y 的值各为多少?解:上述表达式等价如下形式:z=(xy)?(float)x)/-(y+):(x=y)?1: (float)x/(-y)由题意知, x0)个人进行分班,每班k(0)个人,最后不足k人也编一班,问要编几个班?(试用条件运算符表达)在使用条件运算符时,要特别注意,在一次判断中,表达式e2和e3有且只有一个被求值。n%k0?n/k+1:n/k38逗号运算符是优先级别最低的运算符,其

29、形式为: e1,e2,e3,其中e1、e2、e3均为表达式,在逗号表达式中,从左向右依次计算各个表达式的值,而将最后一个表达式的值作为整个表达式的值。例如: x = (y = 2, z = 3, y+z) x的值为5。 a=3*5,a*4 整个逗号表达式的值为60 (a=3*5,a*4),a+5 整个逗号表达式的值为20 x=(a=3,6*3) x=a=3,6*a逗号运算符常用于语法上要求一条语句而语义上要求多条语句时,如常用于循环控制中 例:for(i=0,j=n;i=100&a=999”,而不能用“100=a=A&ch =Z思考题:上述命题可否描述为Ach=A&ch=Z?putchar(c

30、h+32):putchar(ch-32); 3.2.2 getchar函数(字符输入函数)scanf( %c,&ch);573.3 小结一格式输入输出函数printf和scanf注意事项:格式输出函数printf 双引号内除“%格式符”以外,皆原样输出。 输出表列中的各个表达式的值若要正确输出,则要求双引号内必须有一个类型一致的格式符与之对应;若类型不对,则输出无定值;若格式符少,则列在后面的输出项不被输出。 多数系统在该输出函数中采用自右向左的顺序求输出表列中各个表达式的值。 使用该函数的输出形式灵活多样。如,可以通过附加控制符“+”、“-”和指定列宽共同控制对齐方式。如:“%-5d”代表数

31、据占5列宽,且左端对齐。 函数的返回值为正常输出的输出的字符个数。58格式输入函数scanf: 地址表列中的地址可以是变量的地址、数组名、指针变量。 输入项要与“控制字符串”中的格式符的个数相等、类型一致。 对整数可以指定系统按要求的位数截取所读入的数据,但对实数则不能规定小数位数。 双引号内除“%格式符”以外的部分也要原样输入,因此一般除分隔符外,建议不要增加其他内容,以简化输入形式。若无分隔符,对数值型数据而言,遇空白符(包括空格符、制表符、回车符)、遇指定的宽度、遇非法输入的数据(如:非数值型数据)等结束该数据的输入;对字符型数据而言,所有输入的数据都为有效的字符。 建议双引号内不要象输

32、出函数一样经常使用 n,由于系统方面的原因,经常需要多输入一个数据方能结束。 “%*”表示跳过对应的输入数据项,即该数据项不被读入。 返回值为正常读入数据的个数。59 字符输入函数getchar() :该函数的作用是从标准输入设备(通常指键盘)输入一个字符。该函数无参数,函数的值是从输入设备得到的字符,可将其赋给一字符变量或整型变量,也可以只作为表达式的一部分,而不赋给任何变量。 如: ch=getchar();是将从输入设备输入的字符赋给字符型变量ch,等价于 scanf( %c,&ch); 使用getchar和putchar函数时,程序前面要包含一条编译预处理命令:#include std

33、io.h。二.字符读写函数getchar和putchar。 字符输出函数putchar(参量) : 该函数是将一个字符在标准输出设备(显示器或打印机)上输出,其作用相当于printf( %c,参量)。60 第四章 语句 4.1 基本语句 4.2 选择控制语句 4.3 循环控制语句 4.4 程序举例61 形式为: 表达式;例如: i+; sum=a+b;又称为赋值语句 scanf( %d , &a);和printf(%f,b);等,又称为函数调用语句。 空语句是一个只由分号组成的语句。 形式: ; 作用:当程序中某个位置在语法上需要一条语句,而在语义上又不 要求执行任何动作时,可放上一条空语句。

34、 一般适用于在循环语句中做空循环体; 如: for (m = 0, s = 0; my) t = x; x = y; y = t; 通常,把 定义或说明 语句组 这种分程序形式也归为复合语句。4.1.3 复合语句63如: main()int m=2; int m=3; printf( %d ,m); printf( %d ,m);其中:花括号括起来的部分是一个分程序结构,也归为复合语句。在分程序结构中也可以定义变量,这些变量只在分程序结构内部有效.语言提供两类选择控制语句:种为if语句,实现n分支,要求n-1个表达式;一种为switch语句,实现多分支;只用1个表达式.4.2 选择控制语句64

35、 4.2.1 if语句 if语句的三种形式: 1. if (表达式) 语句 当表达式为真(非0)时,执行表达式后面的语句,否则绕过该语句, 而执行其后面的语句。 如: if(xy) t=x; x=y; y=t; printf(min=%d,max=%d, x, y); 2. if (表达式) 语句1else 语句2 当表达式为真(非0)时,执行语句1,否则执行语句2。 错例: if (xy) max = x; min = y; else.if (x0) printf(%f,x) else printf(%f,-x) 653.if (表达式1) 语句1else if (表达式2) 语句2 els

36、e if (表达式n) 语句nelse 语句n+1当表达式1的值为真(非0)时,执行语句1,否则当表达式2的值为真时执行语句2,依此类推,若表达式的值都为假,则执行语句n+1。【例4.1】将a,b,c三个实数按由小到大的顺序排列。 main( ) float a, b, c, t; scanf(%f %f %f, &a, &b, &c); if (ab) t = a, a = b, b = t; if (ac) t = a, a = c, c = t; /* 逗号表达式语句*/ if (bc) t = b; b = c; c = t; /* 复合语句 */ printf(%f,%f,%fn,

37、a, b, c); 后两个if语句的次序交换,行否?663. if语句的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌套。 一般形式: if(表达式1)if(表达式11) 语句11 else 语句12 else 语句2在if语句的嵌套形式中,为了增强程序的可读性,建议采用锯齿型的书写形式。C语言规定: else始终与它上面的最近的if语句配对。假如有: if ( ) if ( ) 语句1 else if ( ) 语句2 else 语句3if ( ) if ( ) 语句1 else if ( ) 语句2 else 语句367【例4.2】用if语句实现下面分段函数程序段:if (x=0

38、) if(x0) y=1; else y=0;else y=-1;思考题:试对上述分段函数用一个表达式语句实现。或者: y = -1; if (x=0) if (x0) y = 1; else y = 0;错例: y=0; if (x=0) if(x0) y=1; else y=-1;68C语言还提供了另外一种专门用于描述多分支选择结构的语句switch语句。 1. 形式:switch(表达式)case 常量表达式1:语句组1break; case 常量表达式2:语句组2break; case 常量表达式n:语句组nbreak;default:语句组n+14.2.2 switch语句当表达式的

39、值与某个常量表达式的值相等时,则执行该常量表达式后面相应的语句,若使用了break, 则执行完该语句后便退出switch语句;否则,还要依次执行其后面的各条语句。若找不到相匹配的常量表达式,则执行default后面的语句。69如: switch (grade) case A : printf( 85100n ); case B : printf ( 7084n ); case C : printf ( 6069n ); case D : printf ( 60n ); default : printf (errorn ); 2. 说明:(1) switch语句中的常量表达式与表达式的类型要一致

40、,要求为整型或字符型。(2) 常量表达式的值要互不相同,但不同的常量表达式可以共用同一个语句组。(3) 该语句通常与break语句联用,以保证多路分支的正确实现,break的作用是强制退出switch语句。(4) 多个case可以共用一组执行语句,如: case A : case B : case C : printf ( 6069n );“case常量表达式”只是起语句标号作用,不是进行条件判断。70 a=1;switch(a%5)case 0: printf(“%dt”,a+); case 1:printf(“%dt”,a+); case 2:printf(“%dt”,+a);break;

41、 case 3:printf(“%dt”,+a);break;又如:switch(int)s/1000)case 0: case 1: case 2: 错误:switch(s)case s=1000&s=2000:.714.3 循环控制语句C语言提供了三种循环语句:while语句,do-while语句以及for语句。do-while为直到型循环, while 和for为当型循环流程图如下:whiledo-while forwhile (表达式) 语句do语句while (表达式);for (表达式1;表达式2;表达式3)语句 前两种用于描述循环次数未知的循环, 而后者则用于描述循环次数已知的循

42、环。72 【例4.4】用上述三种循环语句,求s= main( ) int n,s;n = 1;s = 0;while (n=100)s=s+n; n=n+1; printf(s = %dn,s);main() int n,s; n = 1; s = 0; do s = s+n; n = n+1; while(n=100); printf(s=%dn,s); /* 花括号不能省 */main( ) int n, s; for (n = 1,s = 0;n=100;n+) s=s+n; printf(s=%dn,s); while语句:do-while 语句:for语句:73 使用while语句和

43、do-while语句应注意:1.循环体若包含一个以上的语句,应用花括弧括起来,以复合语句出现.2.若循环体中没有使用break语句强制退出,则循环体中应包含使循环 条件改变的语句.3.循环语句开始之前,对必要的变量赋初值。使用for语句几点说明:1. for语句可理解为:表达式1用来对循环变量赋初值,表达式2代表 循环条件,表达式3对循环变量进行增、减的修正.2. 表达式1和表达式3可以是逗号表达式. 如: for(sum=0,i=1;i=100;i+)sum=sum+i; for(i=0,j=10;i=j;i+,j-)k=i+j;3. 三个表达式都可以省略,但分隔这三部分的分号不能省略.如:

44、 for( ;i=100;i+) sum=sum+i;74 i=1;while (1) sum=sum+i; i+ ; for(i=1; ;i+) sum=sum+i; for (sum,i=1;i=100; ) sum=sum+i; i+; for ( ; i=100; ) sum=sum+i; i+;while (i=100) sum=sum+i; i+; for ( ; ; )语句 while(1) 语句4. 表达式2也可以是数值表达式或字符表达式,只要其值为非零, 就执行循环体. for (i=0;(c=getchar()!=n;i+=c); /*ex4_1_1 */75循环的嵌套:循

45、环体内包含另一个完整的循环结构.三种循环语句皆可以互为内嵌语句。以下形式的循环被称为二重循环。例如: while() while() for(;) while() 例: main() /* ex4_1_2 */ int i,j; for (i=1;i10;i+) for (j=1;j10;j+) printf(%dt,i*j); printf(n); 外循环控制变量每变化一次,内循环就要被执行若干次。76还可以用无条件转移语句goto及if语句来实现循环。 形式: goto 标号;标号的命名规则同标识符。goto语句的作用是将程序控制转到标号对应的语句处。例: main() int n, s

46、= 0; n = 1; loop:if (n=100) /* loop为标号*/ s = s+n; n+; goto loop; printf(%dn, s); 注意: goto语句只能从循环体内跳到循环体外, 但不能从循环体外转到循环体内。77break语句有两个作用:其一是用于switch语句中,保证多分支情况的正确执行;其二是用于循环语句中,强制终止本层循环(跳出本层循环)。Continue语句只能用于循环语句中,不同于break语句的是它并不终止本层循环,而只是绕过本次循环,强行进入下一次循环,即它只能跳过循环体中continue后面的语句。分析下面两个例子:break语句和 cont

47、inue语句例4.5: main( ) int m;for(m = 0; m10; m+) if (m = = 5) break;printf(%dn, m); main( ) int m;for (m = 0; m10; m+) if (m = = 5) continue;printf(%dn, m);784.4 程序举例例4.5: 求Fibonacci数列的前40项.即: F1=1 (n=1)F2=1 (n=2) (n 3)main()long int f1,f2; int i; f1=1;f2=1; for (i=1;i=1e-4) pi=pi+t; n=n+2; s=-s; t=s/n

48、; pi=pi*4; printf( pi=%10.6fn ,pi); 80【例4.7】求下列级数的前m项和。分析: 上面级数的通项为xm/m!, 第i项ti与第i-1项 ti-1之间存在如下关系:程序: main( ) int i, m; float x, s, tem;printf(input m &xn);scanf(%d %f, &m, &x);s = tem = 1;for ( i=1 ; i=m; i+) printf(e*%.2f=%fn,x,s);tem *= x/i;s += tem;81【例4.8】判断数m是否为质数? 质数:除1和它本身外,不能被其他任何一个整数整除的自然

49、数。 可进一步证明:若m不能被 中任一整数整除,则m为质数.程序:#include math.hmain( ) int j, k, m; scanf(%d,&m); ; for (j = 2; jk)k=sqrt(m)break82#include math.h /* 一行打印五个 */main() int i,j,k,n=0; for(i=1;i=100;i+) k=sqrt(i); for (j=2;j=k+1) n+; printf(%3d,i); if(n%5=0)printf(n); 83请阅读以下程序的功能:main()int a=100,b=2;while(a300)for(b=

50、2;a%b!=0;)b+; if(b=a) printf(%dn,a); +a;84【例4.9】求两个自然数的最大公约数。 分析:算法描述如下:(1) 被除得到余数md;(2) 若md,则算法结束,为最大公约数,否则进行下一步;(3) 将n 的值赋给m,将md 的值赋给n,转到第(1)步;程序: main( ) int m, n, m1, n1, md; printf(Input m & n); scanf(%d %d,&m,&n); if (mEPS);87【例4.11】输入一行字符,要求输出其相应的密码. 规律:将字母A变成字母E,a变成e,即变成其后的第四个字母, W变成A,X变成B,Y

51、变成C,Z变成D. 非字母字符不变.# include stdio.h main()char c; while ( !=n ) if (c= a &c= A &C z ) c=c-26; printf( %c ,c); 思考: 划横线部分不要,行否?(c=getchar()c=c+4c Z & c= Z +488 第五章 指针初步和数组5.1 指针初步5.2 一维数组5.3 指针和一维数组的关系5.4 二维数组5.5 字符串5.6 程序举例89对变量的操作直接访问:按标识符来存取这些变量的值。间接访问:若要访问某个变量的值,先要找到这个变量的地址,然后再到这个地址对应的单元中存取内容。5.1.

52、1 指针概念的引入例如,假定有定义char ch = A;int a = 2;float f = 1.5;有定义int *ap = &a;float *fp = &f;则ap和fp分别是指向变量a和f的指针变量。指针变量:存放某一变量地址的特殊变量.指针:地址5.1 指针初步901. 定义方式 存储类型 数据类型 *标识符;说明:1.“*”后面的标识符是一个指针变量名,“*”本身不是变量名的组成部分。 2.一个指针变量只能指向同一类型的变量.例如:int *p;float *q;是指向整型数据的指针变量,即p中应存放某一整型数据的地址;是指向单精度实型数据的指针变量,即q中应存放某一单精度实型

53、数据的地址。2. 初始化在定义的同时赋初值,称为指针变量的初始化。例如:float d =1.5, *p= &d;5.1.2 指针变量的定义及初始化float d =1.5, *p;p = &d;91p和d的关系如图5.2所示。 p d&d1.5图中,称为指针变量,d称为指针变量所指向的变量。指针变量与指针所指向的变量的区别:5.1.3 指针运算符 两个专用运算符: (1) & : 取地址运算符. &d表示变量的地址 (2 ) * : 指针运算符,也称取值运算符(或间接访问运算符). 不同于 定义时出现的“*”, *表示p所指向的变量的内容,即利用 指针变量间接存取所指对象的内容时,使用该运算

54、符。例如: float d =1.5, *p= &d;可得出下面的等价关系: &d *p *& &*pd 变量的值可表示为: d, *p, *&d变量的地址可表示为: &d, p, &*p92为指针变量赋值,使其有明确的指向,是使用指针变量的前提。 (1)p=NULL;NULL代表0地址(在stdio.h中有NULL的宏定义),表示不指向任何对象。(2)p=&a; p指向变量a。(3)p1=&a; p2=p1;相同类型的指针变量可以相互赋值,但必须用已有确定指向的指针对同类型指针变量赋值。(4)p=(int *)malloc(sizeof(int);调用malloc库函数,系统自动开辟一段内存

55、区,并将其首地址赋给变量.例: 有定义: int a,*p; float f;则: p=&f; p=100; 错!5.1.4 指针变量的赋值93【例5.1】 : main( ) int a,b;int *p1,*p2,*p; scanf(%d%d,&a,&b); p1=&a;p2=&b; printf(na=%d,b=%dn,*p1,*p2); p=p1;p1=p2;p2=p; printf(na=%d,b=%dn,*p1,*p2); p1,p2所指对象变了,而对象本身没变94【例5.2】 : main() int a,b,t;int *p1,*p2; scanf(%d%d,&a,&b); p

56、1=&a;p2=&b; printf(na=%d,b=%dn,*p1,*p2); t=*p1;*p1=*p2;*p2=t; printf(na=%d,b=%dn,*p1,*p2); 955.1.5 指针的算术运算1. 自增(+)和自减(-)运算。 p+ +p p- -pp+的意义是p先参加运算,接着指向下一元素的内存位置。p-的意义是先参加运算,接着指向上一元素的内存位置。+ p,-p是先改指向,后参加运算。*p+和( *p)+的含义是什么?*p+ *(p+) *p p + (*p)+ *p(*p)+见Ex5_3_1.c96p+n (或p-n)(为一整数)意义是指向其所指基本类型的后面(或前面

57、)第个元素的位置。即p+n的值为:p的值n*sizeof(p指向的类型)例:若有定义float f,*p=&f;并假设系统将2000H单元开始的一段内存区分配给变量,则p:2000Hp+5:2000H+5*sizeof(float)=2000H+5*42014H 3. 指向同类型数据的两指针变量可相减p2-p1。意义:以这两个指针变量的值为上、下界的一段地址区域中能存放的基本类型的元素的个数。例:若有定义 int *p1,*p2;并假设p1指向1000H,p2指向1008H,则p2p1值为:(1008-1000)/sizeof(int)=4 2. 指针变量加(减)一个整数97由一组相同数据类型

58、的元素按一定顺序存放,构成的数据集合。1. 定义形式存储类型 数据类型 数组名整型常量表达式;如:int s50;定义了一个包含50个整型元素的数组,这些数组元素分别用s0、s1、s49来表示。也可用符号常量及常量表达式说明数组长度。如: #define N 10 float aN,bN*2;如下面的定义是错误的: int n, an;5.2 一维数组5.2.1 一维数组的定义982. 实质 数组一经定义,系统便为该数组分配一段连续的内存单元来存放这些数组元素,数组名代表了这段内存区域的首地址(是一个地址常量), 数组名是用来描述整个数组的,而数组元素则是数组中的某个特定变量。5.2.2 数组

59、的初始化 1. 给所有元素赋初值。 如:int a5=0,2,4,6,8; 或 int a =0,2,4,6,8; 将全部数组元素的初值在一对花括号内依次列出。 2. 给部分元素赋初值。如:int a10=1,3,5,7,9; 花括号内列出的值赋给了前面的若干个元素。 错例: 1)int a10; a=1,3,5,7,9; 数组名是个地址常量,不能被赋值。 2)int a10; a10=1,3,5,7,9; a10不是数组中的元素,且不能用花括号为一个元素赋多个值。995.2.3 数组元素的引用数组除了做函数参数或对字符数组进行某些操作时可整体引用外(即以数组名的形式出现),其它情况下必须以元

60、素的方式引用。数组元素的形式:数组名下标其中:下标为整型或整型表达式。假设有定义:int aN; 其中,N是已定义过的符号常量。1) 数组元素的输入for(j=0; jN; j+)scanf(%d ,&aj);2) 数组元素的求和sum=0;for(j=0; jN; j+)sum+=aj;1003)求数组中的最大元素max=a0; for(j=1; jmax) max=aj;4)求最大元素下标imax=0;/*开始假设第一个元素为最大元素*/for (j=1;jaimax)imax=j;5)将最大元素放于某一特定位置(如放在最前头)imax=0;for(j=1;jaimax)imax=j;if

温馨提示

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

评论

0/150

提交评论