国家计算机二级C语言培训教案_第1页
国家计算机二级C语言培训教案_第2页
国家计算机二级C语言培训教案_第3页
国家计算机二级C语言培训教案_第4页
国家计算机二级C语言培训教案_第5页
已阅读5页,还剩133页未读 继续免费阅读

下载本文档

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

文档简介

全国计算机等级考试(二级)《C语言程序设计》课程教案讲授人:课程安排日期星期上课时间课程形式授课内容备注8月12日二8:00理论第1章、第2章8月12日二14:30理论第3章顺序结构、第4章选择结构布置习题18月13日三8:00理论第5章循环结构8月13日三14:30上机循环结构习题1解答、布置习题28月14日四8:00理论第6章字符型数据习题2解答8月14日四14:30理论第7章函数布置习题38月15日五8:00上机循环结构、函数习题3解答8月15日五14:30理论第8章地址和指针布置习题48月16日六8:00理论第9章数组8月16日六14:30上机循环结构、函数习题4解答、布置习题58月17日日8:00理论第9章数组、第10章字符串8月17日日14:30理论第11章、第12章、第13章8月18日一8:00上机指针、一维数组习题5解答8月18日一14:30理论第14章、第15章、第16章布置习题68月19日二8:00理论公共基础知识8月19日二14:30上机指针、一维数组习题6解答、布置习题78月20日三8:00上机二维数组8月20日三14:30上机二维数组8月21日四8:00上机字符串习题7解答8月21日四14:30上机字符串8月22日五8:00上机字符串8月22日五14:30上机结构体8月23日六8:00上机结构体、文件9月4日四19:00上机填空题9月7日日19:00上机改错题9月8日一19:00上机设计题9月9日二19:00上机综合练习、考试注意事项

第一章程序设计基本概念一、程序和程序设计1、程序计算机程序是一组有限的指令序列。它告诉计算机该做什么,怎么做。2、程序设计程序设计即通过程序设计语言将需要处理的对象和对其处理的方法转化成计算机能够理解的指令。3、程序设计语言与计算机打交道就必须用计算机理解的语言。所谓程序设计语言是指具有一定的语法规则,能够被计算机所理解的一组符号的集合。程序设计语言大致可分为三类:(1)机器语言计算机的“自然语言”,由“0”和“1”组成的符号序列表示指令。机器语言程序可以被计算机直接执行。(2)汇编语言用英文单词的缩写来表示指令,与机器语言指令一一对应。执行时需要通过“汇编程序”转换为机器语言执行。(3)高级语言类似于人类的自然语言,一条语句可对应多条指令。执行时可通过“编译程序”或者“解释程序”转换为机器语言执行。C语言属于高级语言中的一种,由C语言直接编写的代码称为C语言“源程序”,计算机无法直接执行,而必须通过编译程序转换成为机器语言程序再由计算机执行,即生成“目标程序”。C语言源程序的后缀名为“.c”,编译之后生成的目标程序后缀名为“.obj”,再由连接程序与库函数连接生成后缀名为“.exe”的可执行文件,在windows中直接执行。4、C程序开发过程(1)确定数据结构。数据结构:数据的组织形式。在C语言中,数据结构是通过数据类型的形式体现出来的。即将需要处理的数据用C语言支持的形式表示。(2)确定算法。算法:求解的步骤地描述,也即操作的具体步骤。将求解的步骤用特定的形式进行描述。(3)编写程序代码。将算法转换成为C语言程序代码。(4)编译连接,修改错误。通过编译器将C语言源程序转换成为可执行的目标程序。C语言编译器能够自动寻找部分程序错误(主要是语法错误),提示错误原因及错误位置。在这些错误未被改正之前,不会生成目标程序。(5)运行,修改错误。部分错误编译器无法查出,但会导致程序中断运行,称为运行时错误;有些程序能够正常运行,但运行结果与期望的结果不符,称为逻辑错误。运行时错误和逻辑错误出现时,都必须返回编辑源程序,修改后再编译运行。二、算法1、算法的概念算法即运算方法,是对问题求解步骤的描述。一个问题有多种解决方法,即同一个问题可以设计多种算法。2、算法的特点(1)有穷性:对于任何合法输入,可在有穷的时间内,通过有穷步骤得出结果。(2)确定性:每个步骤有确定的意义,对相同的输入必须得到相同的结果。(3)有效性:每个步骤都应当有可能有效地被执行到,并得到确定的结果。(4)输入:可以有0个或多个输入。(5)输出:可以有一个或多个输出。没有输出的算法是没有意义的。3、算法举例例1求0+1+2+3+…+10的和。算法1:step1:sum=0;step2:sum=sum+1;step3:sum=sum+2;…step10:sum=sum+9;step11:sum=sum+10;step12:输出sum的值;该算法可以得出正确的结果,但步骤太繁琐。算法2:(设置累加器)step1:sum=0;step2:add=1;step3:sum=sum+add;step4:add=add+1;step5:判断add的值,如果add<=10,则转向执行step3;step6:输出sum的值;显然,该算法比算法1更简洁。例2输入两个数,找出其中大的数输出。算法3:setp1:输入两个数分别保存在变量a和b中step2:比较两个数step3:如果a大于b,则输出astep4:否则输出b4、算法的描述(1)自然语言:用日常使用的语言描述算法。上例中算法3就是使用自然语言描述的。(2)流程图:用特定的图形符号表示操作以及操作的执行顺序。这种描述方式易于理解,直观。流程图中主要图形符号有:起止框起止框处理框流程线输入输出框判断框上例中算法2同样可以用流程图描述:开始开始结束sum=0add=1sum=sum+addadd=add+1add<=10YN算法3用流程图描述为:开始开始a>=bYN输入a和b输出a输出b结束(3)伪码用介于自然语言和计算机语言之间的文字和符号描述算法。如上例中算法2用伪码描述为:开始sum=0;add=1;dosum=sum+add;add=add+1;while(add<=10);输出sum的值;结束三、结构化程序设计和模块化结构1、结构化程序C语言程序由若干条指令(语句)组成,这些指令(语句)按照一定的顺序执行。指令(语句)的执行顺序主要有三种:(1)顺序结构按照语句的书写顺序执行,不会发生控制的转移,例如算法1。(2)选择结构根据给出的条件从给出的多条语句中选择一条执行,其它语句不执行。例如算法3。(3)循环结构根据给出的条件判断是否重复执行一条(段)固定的语句。例如算法2。2、模块化结构计算机中处理大型问题时,往往将该大型问题分解成为多个小的问题分别解决;每一个小的问题通过一段独立的程序来解决。这样一段独立的程序称为一个“功能模块”,在C语言中表现为函数。最后将若干函数组合起来构成一个完成的程序。第二章C程序设计的初步知识一、简单C语言程序的构成和格式1、C语言程序的特点下面我们将算法2和算法3转化为C语言程序。程序1求0+1+2+…+10的和。#include<stdio.h>voidmain(){intsum,add;sum=0;add=1;do{sum=sum+add;add=add+1;}while(add<=10);printf(“0~10的和为:%d\n”,sum);}程序2输入两个数,将其中大的数输出。#include<stdio.h>main(){inta,b;scanf(“%d,%d”,&a,&b);if(a>=b)printf(“大的数是:%d”,a);elseprintf(“大的数是:%d”,b);}(1)C语言程序由函数构成函数组成C语言程序的基本单位;C程序中的函数分为两种:库函数和自定义函数。库函数是预先编译好的、严格而高效的函数,C语言中的输入输出操作就是通过调用scanf()和printf()两个库函数完成的。(2)函数由函数首部和函数体构成函数首部是函数的第一行,其格式为:[函数类型]函数名([参数类型参数名,]…)例:intfun(intx,inty)函数首部之后的{}内的部分称为函数体。函数体包括声明部分和执行部分。(3)程序从main()函数开始执行不管main()函数在程序中的位置如何,一个C程序总是从main()函数体的第一条语句开始执行,到最后一条语句结束。同一程序中其他函数的执行是通过函数的调用完成的。(4)语句以分号结束(5)程序书写自由一行可以写多条语句;一条语句也可写在多行。(6)程序中可以添加注释/**/程序是写给计算机看的,而注释是写给程序员看的,以增加程序的可读性。注释中的内容不会被计算机执行。(7)C语言区分大小写(8)变量先声明再使用2、C语言程序的书写规则(1)一个C程序中必须有且只能有一个main()函数(2)函数名后必须有一对小括号()(3)语句末尾必须有分号,预处理命令和函数首部后不能有分号(4)关键字和库函数名必须用小写(5)标识符、关键字之间必须用间隔符或空格分开(6)括号和引号必须成对出现(7)声明部分必须在执行部分之前(8)程序书写最好采用缩进格式二、标识符、常量和变量1、标识符程序员为变量、数组、函数等取的名字,必须满足一定的规则:由字母、数字和下划线组成;第一个字符不能为数字;区分大小写。(1)关键字又称为保留字,是C语言中具有特定含义的单词,共32个。(2)预定义标识符C语言中已有特殊含义的标识符,如库函数名等,但可重新定义。(3)用户标识符不能与关键字相同,尽量不要与预定义标识符相同,应当做到“见名思意”。2、常量常量是指在程序运行过程中,其值不能被改变的量。常量按照类型又可分为:整型常量、实型常量、字符常量、字符串常量。3、符号常量符号常量即用一个标识符代替的常量。其定义形式为:#define标识符常量如:#definePI3.14#definePRICE40程序中任何使用该常量的地方都可用指定标识符代替。符号常量不同于变量,其值在程序运行过程中不能改变。为与变量区分,定义符号常量时,标识符一般采用全大写。使用符号常量的优点:(1)可提高程序的可读性;(2)一改全改,便于调试。4、变量变量即程序运行过程中,其值可以改变的量。一个变量实际上对应一个存储单元,其有4个属性:(1)变量地址:变量在内存中的实际地址;(2)变量名:变量名就是区分这个单元的符号化的地址。调用一个变量时,实际上就是通过该变量的变量名访问对应的存储单元。例如:a=b;即读取变量名为b的存储单元的值,然后写入到变量名为a的存储单元中,变量b的值不变。(3)变量类型:确定了变量所占内存单元的大小和存储方式;(4)变量的值:变量所对应的内存单元中存放的数据。变量的定义形式:类型变量名;变量必须先定义后使用,一次可定义多个变量。变量的初始化:在定义变量的同时为其赋值,不可使用“连等”同时为多个变量初始化。数据类型数据类型表现为数据为何种类型以及能对其进行何种操作。程序中用到的所有数据都必须指明其类型。数据类型数据类型基本类型字符型整型实型构造类型枚举型数组类型结构体类型共用体类型指针类型空类型双精度实型单精度实型三、整型数据1、整型常量整型常量即整常数,可用三种形式表示:(1)十进制整数。如:123,0,-123等。(2)八进制整数,以0作为前缀表示。如:037(31D),-010(-8D)等。(3)十六进制整数,以0X或者0x作为前缀表示。如:0xF(15D),-0x10(-16D)等。当数值在-215~215-1范围内,则表示为基本整型常量,在内存中用2个字节保存。当数值在上述范围之外而在-231~231-1范围内,则表示为长整型常量,在内存中用4个字节保存。整型常量默认为基本整型常量。如需表示一个长整型常量,即用4个字节保存,可在其后添加l或者L,如15为基本整型常量,而15L表示长整型常量,其值相同,但前者在内存中占据2个字节,而后者用4个字节保存。2、整型变量根据占用内存字节数的不同,整型变量又分为4类:(1)基本整型(类型关键字为int)。(2)短整型(类型关键字为short[int])。(3)长整型(类型关键字为long[int])。(4)无符号整型。无符号型又分为无符号基本整型(unsigned[int])、无符号短整型(unsignedshort)和无符号长整型(unsignedlong)三种,只能用来存储无符号整数。上述各类型整型变量占用的内存字节数,随系统而异。在VC6.0中,一般用4字节表示一个int型变量,且long型(4字节)>int型(4字节)≥short型(2字节)。四、实型数据1、实型常量实型常量有两种表示形式:(1)十进制小数形式。如:1.0,0.03,-1.2345等。(2)指数形式。如:123e3,-4.567e-7等。实型常量默认为双精度实型常量,在内存中用8个字节保存。如需表示为单精度实型常量,可在其后添加后缀f或者F,在内存中占据4个字节,以加快计算机的处理速度。如1.0表示一个双精度实型常量,而1.0F表示单精度实型常量。2、实型变量实型变量分为:单精度(float)、双精度(double)。单精度:其类型说明符为float单精度说明符双精度:double双精度说明符。在VC中单精度实型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。运算符和表达式1、概念(1)运算符运算符是表示各种运算的符号。按运算对象(操作数)的个数,运算符可分为单目、双目和多目等三类。(2)表达式由操作数和运算符组成的符合C语言语法的式子称为表达式。如:1+2a1.23x&&y2、运算符的优先级与结合性(1)优先级优先级指当一个表达式中有多个不同的运算符时,应执行的运算的顺序。优先级高的先执行,优先级低的后执行。(2)结合性结合性指当一个表达式中有多个优先级相同的运算符时,应执行的运算顺序,分为左结合性和右结合性两种。3、运算符使用规则(1)先看优先级,再看结合性;(2)可使用()避免二义性;(3)多个()嵌套使用时,先执行内层()。题目:求表达式的值1-2/3*((4+5)%6)结果为:-1五、算术表达式1、基本算术运算符+(正)-(负)+(加法运算符。如3+5)-(减法运算符。如5-2)*(乘法运算符。如3*5)/(除法运算符。如5/3,5.0/3)%(模运算符或求余运算符)。除了正、负值运算符为单目运算符外,其它都是双目运算符。说明:(1)两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分。但是如果除数或被除数中有一个为负值,则舍入的方向是不固定的,多数机器采用“向0取整”的方法(实际上就是舍去小数部分,注意:不是四舍五入)。(2)如果参加+,-,*,/运算的两个数有一个为实数,则结果为double型,因为所有实数都按double型进行计算。(3)求余运算符%,要求两个操作数均为整型,结果为两数相除所得的余数。求余也称为求模。2、算术表达式算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为算术表达式。运算对象可以是常量、变量、函数等。如:a*b/c-1.5+’a’C语言算术表达式的书写形式与数学表达式的书写形式有一定的区别:(1)C语言算术表达式的乘号(*)不能省略。例如:数学式b2-4ac,相应的C表达式应该写成:b*b-4*a*c。(2)C语言表达式中只能出现字符集允许的字符。例如,数学πr2相应的C表达式应该写成:PI*r*r。(其中PI是已经定义的符号常量)(3)C语言算术表达式不允许有分子分母的形式。例如,(a+b)/(c+d)。(4)C语言算术表达式只使用圆括号改变运算的优先顺序(不要指望用{}[])。可以使用多层圆括号,此时左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。六、赋值表达式1、基本赋值运算符和表达式=:将右边的表达式的值赋给左边的变量。赋值表达式:由赋值运算符组成的表达式称为赋值表达式。一般形式:〈变量〉〈赋值符〉〈表达式〉使用注意:(1)赋值运算符左边必须是变量,右边可以是常量、变量、函数调用或常量、变量、函数调用组成的表达式。例如:x=10y=x+10y=func()都是合法的赋值表达式。

(2)赋值符号“=”不同于数学的等号,它没有相等的含义。例如:C语言中x=x+1是合法的(数学上不合法),它的含义是取出变量x的值加1,再存放到变量x中。(3)赋值表达式的值等于左边变量的值。(4)赋值运算符的优先级只高于逗号运算符,为右结合性。2、复合赋值运算符和表达式在赋值符“=”之前加上某些运算符,可以构成复合赋值运算符,复合赋值运算符可以构成赋值表达式。C语言中许多双目运算符可以与赋值运算符一起构成复合运算符,即:+=,-=,*=,/=,%=,<<=,>>=,&=,|=,^=复合赋值表达式一般形式:<变量><双目运算符>=<表达式>

等价于:<变量>=<变量><双目运算符><表达式>例如:n+=1等价于n=n+1x*=y+1等价于x=x*(y+1)七、自加、自减运算符自增运算使单个变量的值增1,自减运算使单个变量的值减1。

自增、自减运算符都有两种用法:1、前置运算──运算符放在变量之前:++变量、--变量先使变量的值增(或减)1,然后再以变化后的值参与其它运算,即先增减、后运算。2、后置运算──运算符放在变量之后:变量++、变量--变量先参与其它运算,然后再使变量的值增(或减)1,即先运算、后增减。使用说明:(1)自增、自减运算,常用于循环语句中,使循环控制变量加(或减)1,以及指针变量中,使指针指向下(或上)一个地址。(2)自增、自减运算符,不能用于常量和表达式。例如,5++、--(a+b)等都是非法的。(3)在表达式中,连续使同一变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。八、逗号运算符和表达式C语言提供一种用逗号运算符“,”连接起来的式子,称为逗号表达式。逗号运算符又称顺序求值运算符。其一般形式为:表达式1,表达式2,……,表达式n例如:3+5,6+8其求解过程为:自左至右,依次计算各表达式的值,“表达式n”的值即为整个逗号表达式的值。例如,逗号表达式“a=3*5,a*4”的值=60:先求解a=3*5,得a=15;再求a*4=60,所以逗号表达式的值=60。又例如,逗号表达式“(a=3*5,a*4),a+5”的值=20:先求解a=3*5,得a=15;再求a*4=60;最后求解a+5=20,所以逗号表达式的值=20。九、类型转换在C语言中,整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用)。如果一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则,转换的方法有三种:自动转换(隐式转换);赋值转换和强制转换。1、自动转换(隐式转换)自动转换发生在不同类型数据进行混合运算时,由编译系统自动完成。转换规则:(1)类型不同,先转换为同一类型,然后进行运算。(2)图中纵向的箭头表示当运算对象为不同类型时转换的方向。可以看到箭头由低级别数据类型指向高级别数据类型,即数据总是由低级别向高级别转换。(3)图中横向向左的箭头表示必定的转换(不必考虑其它运算对象)。如字符数据参与运算必定转化为整数,float型数据在运算时一律先转换为双精度型,以提高运算精度(即使是两个float型数据相加,也先都转换为double型,然后再相加)。2、赋值转换赋值运算时,当赋值运算符两边数据类型不同时,将由系统自动进行类型转换。转换原则是:先将赋值号右边表达式类型转换为左边变量的类型,然后赋值。(1)将低级别数据赋给高级别变量时,其值一般不会改变。(2)将高级别数据赋给低级别变量时,采取截断法,如高级别数据大于低级别数据的取值范围时,会导致错误。(3)将实型数据赋给整型变量时,只取其整数部分(不四舍五入)。3、强制转换强制转换是通过类型转换运算来实现。一般形式:(类型说明符)表达式功能:把表达式的结果强制转换为类型说明符所表示的类型。例如:(int)a将a的结果强制转换为整型量。(int)(x+y)将x+y的结果强制转换为整型量。(float)a+b将a的内容强制转换为浮点数,再与b相加说明:(1)类型说明和表达式都需要加括号(单个变量可以不加括号)(2)无论隐式转换,强制转换都是临时转换,不改变数据本身的类型和值。第三章顺序结构为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中没有专门的输入输出语句,而是通过调用库函数来实现。因此,在使用库函数输入和输出之前,需要使用“文件包含”预处理命令将标准输入输出头文件“stdio.h”包含到程序中,格式如下:#include<stdio.h>一、数据输出用于输出的库函数很多,这里将格式输出函数printf作为重点进行介绍。1、printf函数的一般调用形式printf函数用于在标准输出设备(显示器)上将数据按指定格式输出。其调用格式如下:printf(格式控制,输出项1,输出项2,……)例:printf(“a=%d,b=%c”,x,y);(1)格式控制(如上例中“a=%d,b=%c”)包括在一对双引号中,分为两个部分:eq\o\ac(○,1)格式说明:由%+格式符组成的格式字符串,指定数据输出的类型(如上例中%d和%c)。eq\o\ac(○,2)普通字符:将字符按原样输出。(如上例中a=和,b=)格式控制部分中,除了格式说明之外的所有字符按原样输出。(2)输出项(如上例中x和y):列出需要输出的一个或多个常量、变量或表达式,各参数之间用,隔开。2、printf函数中常用的格式说明每一个格式说明通常以%开头,以一个格式字符作为结束,其中可包括“宽度说明”、左对齐符号“-”等。(1)格式字符不同类型的数据必须使用不同的格式字符输出。常用格式字符如下:eq\o\ac(○,1)c格式符按字符型数据输出。eq\o\ac(○,2)d或i格式符按十进制整型数据输出。hd表示按短整型输出,ld表示按长整型输出。eq\o\ac(○,3)o格式符按八进制整型数据输出。输出的八进制数不会带前导0。如8输出10,如015输出15。eq\o\ac(○,4)x格式符按十六进制整型数据输出。输出的十六进制数不带前导0x。如22输出16,0x12输出12,025输出15。eq\o\ac(○,5)u格式符按无符号十进制整型数据输出。eq\o\ac(○,6)f格式符按小数形式的实型数据输出。eq\o\ac(○,7)e格式符按指数形式的实型数据输出。会自动转换成为格式化指数形式,小数部分位数默认为6,指数部分位数默认为3,不足在左端补0。如12.3456输出1.234560e+001eq\o\ac(○,8)g格式符由系统决定是采用f还是e格式符输出,原则为宽度最小。eq\o\ac(○,9)s格式符输出一个字符串。eq\o\ac(○,10)p格式符输出变量的内存地址。eq\o\ac(○,11)%%%表示输出一个%。(2)宽度说明eq\o\ac(○,1)可通过在格式符前加一个整型常量说明数据的输出宽度,如指定宽度小于数据的实际宽度,则按实际宽度输出;否则,按指定宽度输出,左补空格。例:inta=12345;printf(“%d,%3d,%7d”,a,a,a);输出:12345,12345,12345eq\o\ac(○,2)对于输出实型数据的f和e格式符,可通过加i.j来控制输出宽度。i指定输出数据的总宽度(f包括小数点,e包括e和符号);j指定小数位数。如j小于实际位数,则按j位输出,最后一位四舍五入;如j大于实际位数,则在最后补0。例:doublex=12.3456;printf(“%f,%3.3f,%10.3f,%10.5f”,x,x,x,x);输出:12.3456,12.346,12.346,12.34560printf(“%e,%3.3e,%12.3e,%18.8e”,x,x,x,x);输出:1.234560e+001,1.235e+001,1.235e+001,1.23456000e+001eq\o\ac(○,3)也可只使用.j指定小数部分宽度。.0表示舍去小数部分和小数点。例:printf(“%.3f,%.2e,%.0f,%.0e”,x,x,x,x);输出:12.346,1.23e+001,12,1e+001eq\o\ac(○,4)使用s格式符输出字符串时,也可使用i.j形式控制输出宽度。i指定输出总宽度,j指定输出字符串的前j个字符。例:Strings=”abcdef”;printf(“%s,%2s,%3.2s,%8.4s,%.3s”,s,s,s,s,s);输出:abcdef,abcdef,ab,abcd,abc(3)左对齐符号输出数据默认右对齐,可在%和宽度之间加“-”实现左对齐。例:inta=123;printf(“%-5d,%5d,%d”,a,a,a);输出:123,123,123(4)使用注意eq\o\ac(○,1)格式说明的个数和类型应当与输出项一至,如格式说明的个数少于输出项,则多余的输出项将不进行输出;反之则会输出一些不确定值。eq\o\ac(○,2)格式控制中,除了格式说明之外的所有字符都会照原样输出。二、数据输入1、scanf函数的一般调用形式scanf()函数是用来从外部输入设备向计算机主机输入数据的。一般格式:scanf(格式控制,输入项首地址表);格式控制与printf()函数的相似,但输入时格式控制部分如果有普通字符,必须一起输入。输入项首地址表──由若干个输入项首地址组成,相邻2个输入项首地址之间,用逗号分开。输入项首地址表中的地址,可以是变量的首地址,也可以是字符数组名或指针变量。变量首地址的表示方法:&变量名其中“&”是地址运算符。例如,&radius是指变量radius在内存中的首地址。2、scanf函数常用的格式说明scanf函数的格式说明符与printf函数相同,但以下情况需注意:(1)格式说明与输入地址个数和类型应当一致。如格式说明多于地址个数,则输入的多余数据作废;反之,多余的变量不能得到正确的输入值。(2)输入short型数据,应使用%hd;输入long型数据,应使用%ld;输入double型数据,应使用%lf。(3)输入数据时,可以指定总宽度,但实型数据不能限制输入的小数位数。3、scanf函数的使用说明(1)输入数值数据输入的数据之间必须用空格或回车等间隔符隔开。例:inta,b,c;scanf(“%d%d%d”,&a,&b,&c);输入可以为:123也可以为:123(2)指定输入宽度可以指定数据的宽度,系统将按指定宽度读取数据。例:scanf(“%3d%2d%4d”,&a,&b,&c);如输入:1234567890则a为123,b为45,c为6789(3)跳过输入数据可通过在%和格式字符间加入*以跳过某个输入的数据。例:scanf(“%d%*d%d%d”,&a,&b,&c);如输入:1234则a为1,b为3,c为4。(4)格式控制中的普通字符输入格式控制中除了格式说明之外,任何普通字符在输入时必须按原样输入。例:scanf(“x=%d,y=%d”,a,b);则必须输入:x=1,y=2三、C语言基本语句1、流程控制语句(1)选择语句if(条件)~;else~;switch语句(2)循环语句for(条件)~;while(条件)~;do~while(条件);(3)转移语句break;中止执行switch语句或循环语句continue;中止本次循环return;从函数中返回控制权及返回值goto;无条件跳转2、表达式语句由表达式加上分号(;)构成的语句。如:a=1;a=b+c;i++;x=max(a,b);3、函数调用语句调用函数,完成相应操作功能的语句。如:printf(“verygood!”);4、空语句不执行任何操作。5、复合语句用一对{}括起来的多条语句,可作为一条语句使用,也称为语句块;其中可包含声明部分。例如:{x=y+z;a=b+c;printf(“%d%d”,x,a);}是一条复合语句。我们可以把它看成是一条语句。注意:复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。第四章选择结构一、关系运算和逻辑运算1、C语言中的逻辑值在C语言中,运算符的操作数以非0表示“真”,以0表示“假”。表达式结果以1表示“真”,以0表示“假”。2、关系运算符和关系表达式所谓“关系运算”实际上就是“比较运算”,即将两个数据进行比较,判定两个数据是否符合给定的关系。例如,“a>b”中的“>”表示一个大于关系运算。如果a的值是5,b的值是3,则大于关系运算“>”的结果为“真”,即条件成立;如果a的值是2,b的值是3,则大于关系运算“>”的结果为“假”,即条件不成立。(1)关系运算符关系运算符的操作数可以是整型、字符型和实型,而结果是整型(0和1)。C语言提供6种关系运算符:<(小于),<=(小于或等于),>(大于),>=(大于或等于),==(等于),!=(不等于)注意:在C语言中,“等于”关系运算符是双等号“==”,而不是单等号“=”(赋值运算符)。优先级:(1)在关系运算符中,前4个优先级相同,后2个也相同,且前4个高于后2个。(2)与其它种类运算符的优先级关系关系运算符的优先级,低于算术运算符,但高于赋值运算符。(2)关系表达式所谓关系表达式是指,用关系运算符将两个表达式连接起来,进行关系运算的式子。例如,下面的关系表达式都是合法的:a>b,a+b>c-d,(a=3)<=(b=5),'a'>='b',(a>b)==(b>c)例如,假设num1=3,num2=4,num3=5,则:(1)num1>num2的值=0。(2)(num1>num2)!=num3的值=1。(3)num1<num2<num3的值=1。3、逻辑运算符和逻辑表达式(1)逻辑运算符C语言提供三种逻辑运算符:&& 逻辑与(相当于“并且”)||逻辑或(相当于“或者”)! 逻辑非(相当于“否定”)运算规则:&&:当且仅当两个运算量的值都为“真”时,运算结果为“真”,否则为“假”。||:当且仅当两个运算量的值都为“假”时,运算结果为“假”,否则为“真”。!:当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时,运算结果为“真”。例如,假定x=5,则(x>=0)&&(x<10)的值为“真”,(x<-1)||(x>5)的值为“假”。(2)逻辑表达式所谓逻辑表达式是指,用逻辑运算符将1个或多个表达式连接起来,进行逻辑运算的式子。在C语言中,用逻辑表达式表示多个条件的组合。例如:(year%4==0)&&(year%100!=0)||(year%400==0)就是一个判断一个年份是否是闰年的逻辑表达式。(3)优先级及结合性:逻辑非的优先级最高,逻辑与次之,逻辑或最低,即:!(非)→&&(与)→||(或)逻辑非的结合性为右结合性,其他两种为左结合性。(4)短路原则:对于逻辑与运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。对于逻辑或运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。例如:假设n1、n2、n3、n4、x、y的值分别为1、2、3、4、1、1,则求解表达式“(x=n1>n2)&&(y=n3>n4)”后,x的值变为0,而y的值不变,仍等于1!二、if选择结构1、if语句格式:if(条件)语句;功能:如果条件为真(非0),执行语句;否则,直接执行之后的语句。2、if~else语句格式:if(条件)语句1;else语句2;功能:如果条件为真(非0),执行语句1;否则,执行语句2。3、if~elseif语句格式:if(条件1)语句1;elseif(条件2)语句2;else语句3;功能:如果条件1为真(非0),执行语句1;否则如果条件2为真,执行语句2;否则执行语句3。4、if语句的嵌套格式:if(条件1){if(条件2)语句1;else语句2;}else{if(条件3)语句3;else语句4;}功能:如果条件1为真,又如果条件2为真,执行语句1;如果条件2为假,执行语句2;如果条件1为假,又如果条件3为真,执行语句3;如果条件3为假,执行语句4;5、if语句案例[案例1]输入任意三个整数num1、num2、num3,求三个数中的最大值。

main()

{intnum1,num2,num3,max;

printf("Pleaseinputthreenumbers:");

scanf("%d,%d,%d",&num1,&num2,&num3);

if(num1>num2)

max=num1;

else

max=num2;

if(num3>max)

max=num3;

printf("Thethreenumbersare:%d,%d,%d\n",num1,num2,num3);

printf("max=%d\n",max);

}程序运行情况如下:

Pleaseinputthreenumbers:11,22,18↙Thethreenumbersare:11,22,18max=22本案例中的第1个if语句,可优化为如下不带else子句的形式:max=num1;if(num2>max)max=num2;这种优化形式的基本思想是:首先取一个数预置为max(最大值),然后再用max依次与其余的数逐个比较,如果发现有比max大的,就用它给max重新赋值,比较完所有的数后,max中的数就是最大值。这种方法,对从3个或3个以上的数中找最大值的处理,非常有效。[案例2]输入任意三个数num1、num2、num3,按从小到大的顺序排序输出。main(){intnum1,num2,num3,temp;printf("Pleaseinputthreenumbers:");scanf("%d,%d,%d",&num1,&num2,&num3);if(num1>num2){temp=num1;num1=num2;num2=temp;}if(num2>num3){temp=num2;num2=num3;num3=temp;}if(num1>num2){temp=num1;num1=num2;num2=temp;}printf("Threeumbersaftersorted:%d,%d,%d\n",num1,num2,num3);} 程序运行情况如下:Pleaseinputthreenumbers:11,22,18↙Threenumbersaftersorted:11,18,22[案例3]写一程序,从键盘上输入1年份year(4位十进制数),判断其是否闰年。闰年的条件是:能被4整除、但不能被100整除,或者能被400整除。算法设计要点:(1)如果X能被Y整除,则余数为0,即如果X%Y的值等于0,则表示X能被Y整除!(2)首先将是否闰年的标志leap预置为0(非闰年),这样仅当year为闰年时将leap置为1即可。这种处理两种状态值的方法,对优化算法和提高程序可读性非常有效,请读者仔细体会。参考程序如下:main(){intyear,leap=0; /*leap=0:预置为非闰年*/printf("Pleaseinputtheyear:");scanf("%d",&year);if(year%4==0){if(year%100!=0)leap=1;}else{if(year%400==0)leap=1;}if(leap)printf("%disaleapyear.\n",year);elseprintf("%disnotaleapyear.\n",year);} 利用逻辑运算能描述复杂条件的特点,可将上述程序优化如下:main(){intyear;printf("Pleaseinputtheyear:");scanf("%d",&year);if((year%4==0&&year%100!=0)||(year%400==0))printf("%disaleapyear.\n",year);elseprintf("%disnotaleapyear.\n",year);}5、if语句使用说明(1)if后面的“表达式”,除常见的关系表达式或逻辑表达式外,也允许是其它类型的数据,如整型、实型、字符型等。(2)if语句允许嵌套,但嵌套的层数不宜太多。在实际编程时,应适当控制嵌套层数(2~3层)。(3)“语句组1”和“语句组2”,可以只包含一个简单语句,也可以是复合语句。务必牢记:不管是简单语句,还是复合语句中的各个语句,每个语句后面的分号必不可少!例如,[案例1]中的:if(num1>num2)max=num1;elsemax=num2;语句:if行后面的赋值语句“max=num1;”分号不能省略。但不要误认为if和else是2个独立的语句,它们都属于if语句中的一部分,else是if语句的子句。三、条件表达式1.一般格式:表达式1?表达式2:表达式3条件表达式中的“表达式1”、“表达式2”、“表达式3”的类型,可以各不相同。2.运算规则如果“表达式1”的值为非0(即逻辑真),则运算结果等于“表达式2”的值;否则,运算结果等于“表达式3”的值。3.运算符的优先级与结合性条件运算符的优先级,高于赋值运算符,但低于关系运算符和算术运算符。其结合性为“从右到左”(即右结合性)。[案例4]从键盘上输入一个字符,如果它是大写字母,则把它转换成小写字母输出;否则,直接输出。main(){charch;printf("Inputacharacter:");scanf("%c",&ch);ch=(ch>='A'&&ch<='Z')?(ch+32):ch;printf("ch=%c\n",ch);}四、switch语句选择结构1.switch语句的一般形式switch(表达式){case常量表达式1:语句组;break;case常量表达式2:语句组;break;......case常量表达式n:语句组;break;[default:语句组;[break;]] }2.执行过程(1)当switch后面“表达式”的值,与某个case后面的“常量表达式”的值相同时,就执行该case后面的语句(组);当执行到break语句时,跳出switch语句,转向执行switch语句的下一条。(2)如果没有任何一个case后面的“常量表达式”的值,与“表达式”的值匹配,则执行default后面的语句(组)。然后,再执行switch语句的下一条。3.说明(1)switch后面的“表达式”,可以是int、char和枚举型中的一种。(2)每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的执行方案)。(3)case后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。(4)各case及default子句的先后次序,不影响程序执行结果。(5)多个case子句,可共用同一语句(组)。(6)用switch语句实现的多分支结构程序,完全可以用if语句或if语句的嵌套来实现。[案例5]从键盘上输入一个百分制成绩score,按下列原则输出其等级:score≥90,等级为A;80≤score<90,等级为B;70≤score<80,等级为C;60≤score<70,等级为D;score<60,等级为E。main()

{intscore,grade;

printf(“Inputascore(0~100):”);

scanf(“%d”,&score);

grade=score/10;/*将成绩整除10,转化成switch语句中的case标号*/

switch(grade){case10:case9:printf(“grade=A\n”);break; case8:printf("grade=B\n");break;case7:printf("grade=C\n");break;case6:printf("grade=D\n");break;case5:case4:case3:case2:case1:case0:printf(“grade=E\n”);break;default:printf(“Thescoreisoutofrange!\n”); }

} 程序运行情况如下:Inputascore(0~100):85↙grade=B第5章循环结构一、循环结构概述循环结构的三个术语:1、循环条件:循环结构中的条件表达式如while(j<10)其中,j<10就是循环条件。2、循环体:在每个循环周期均要执行一次的语句序列。如while下用{}括起来的语句序列。3、循环控制变量:能够决定控制条件是真是假的量。二、while循环结构是一种“当型”循环,其格式为:while(条件)循环体语句;功能:当条件为真(非0)时,重复执行循环体语句;当条件为假(0)时,结束循环。其流程图为:使用注意:1、循环体只能是一条语句。如果需要执行多条语句,需用{}括起来组成复合语句。2、循环体中必须有能够使循环正常结束的部分,不能构成死循环。3、(条件)后没有分号(;),否则会构成死循环。[案例1]用while结构求1+2+……+100的和。main(){ inta,sum; a=1; while(a<=100) { sum+=a; a++; }printf(“1+2+……+100的和是%d”,sum);}二、do~while循环结构是一种“直到型”循环,其格式为:do循环体语句;while(条件);功能:先执行循环体,再判断条件。当条件为真(非0)时,重复执行循环体语句;当条件为假(0)时,结束循环。其流程图为:使用注意:1、循环体只能是一条语句。如果需要执行多条语句,需用{}括起来组成复合语句。2、循环体中必须有能够使循环正常结束的部分,不能构成死循环。3、(条件)后必须有分号(;),表示循环的结束。[案例2]用do~while语句求1+2+……+100的和。main(){ inta,sum; a=1; do { sum+=a; a++; }while(a<=100);printf(“1+2+……+100的和是%d”,sum);}三、for循环结构是一种“当型”循环,一般用于指定循环次数的循环结构,其格式为:for(表达式1;表达式2;表达式3)循环体语句;表达式1:用于给循环变量赋初始值。表达式2:用于判断循环体是否执行的条件。表达式3:用于对循环变量进行增量,使循环变量趋向于循环结束的状态。执行过程:先执行表达式1,再判断表达式2的值,如果表达式2为真(非0),执行循环体,然后执行表达式3,再判断表达式2的值;如果表达式2为假(0),结束循环。使用注意:1、循环体只能是一条语句。如果需要执行多条语句,需用{}括起来组成复合语句。2、循环体中必须有能够使循环正常结束的部分,不能构成死循环。3、()后不能有分号(;)4、各表达式之间用分号(;)隔开。各表达式都可省略,但分号不能省略。[案例3]用for结构求1+2+……+100的和。main(){ inta,sum; for(a=1;a<=100;a++) { sum+=a; }printf(“1+2+……+100的和是%d”,sum);}四、break和continue语句的使用为了使循环控制更加灵活,C语言提供了break语句和continue语句。1.一般格式:break;continue;2.功能(1)break:强行结束循环,转向执行循环语句的下一条语句。(2)continue:对于for循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于while和do-while循环,跳过循环体其余语句,但转向循环继续条件的判定。3.break和continue语句对循环控制的影响循环条件循环条件终止循环条件其它操作终止本次循环的条件break语句continue语句break,continue主要区别:continue语句只终止本次循环,而不是终止整个循环结构的执行;break语句是终止循环,不再进行条件判断。4.说明(1)break能用于循环语句和switch语句中,continue只能用于循环语句中。(2)循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关。五、goto语句无条件转移语句使用方式:goto语句标号;可以和if语句一起组成循环。例:intx=10;A:if(x>0){printf(“%d”,x);x--;gotoA;}所有使用了goto语句的程序都能改写成不带goto语句的程序,由于goto语句过多会使程序难以理解和维护,所以尽量少使用goto语句。六、几种循环结构的比较C语言中,三种循环结构(不考虑用if/goto构成的循环)都可以用来处理同一个问题,但在具体使用时存在一些细微的差别。如果不考虑可读性,一般情况下它们可以相互代替。(1)循环变量初始化:while和do-while循环,循环变量初始化应该在while和do-while语句之前完成;而for循环,循环变量的初始化可以在表达式1中完成。(2)循环条件:while和do-while循环只在while后面指定循环条件;而for循环可以在表达式2中指定。(3)循环变量修改使循环趋向结束:while和do-while循环要在循环体内包含使循环趋于结束的操作;for循环可以在表达式3中完成。(4)for循环可以省略循环体,将部分操作放到表达式2,表达式3中,for语句功能强大。(5)while和for循环先测试表达式,后执行循环体,而do-while是先执行循环体,再判断表达式。(所以while,for循环是典型的当型循环,而do-while循环可以看作是直到型循环)。(6)三种基本循环结构一般可以相互替代,不能说哪种更加优越。具体使用哪一种结构依赖于程序的可读性和程序设计者个人程序设计的风格(偏好)。我们应当尽量选择恰当的循环结构,使程序更加容易理解。(尽管for循环功能强大,但是并不是在任何场合都可以不分条件使用)。七、程序举例例题1:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?图1:1、程序分析:本题主要考察循环的使用。设高度为n=100,经过距离为s=100第一次反弹前经过100米每一次循环需要完成的工作有:(1)求反弹的高度。高度为前一次高度的一半,即n=n/2(2)求经过距离。除第一次外,距离为:s=s+n*2循环次数为10次。开始n=100开始n=100s=100i=1i<=10n=n/2;s=s+n*2;i++ s=s+n*2;输出s输出n结束AABBYN3、程序源代码如下:#include<stdio.h>main(){doublen=100,s=100;inti; for(i=1;i<=10;i++) { n=n/2; s=s+n*2; } printf("总共经过了%.2lf米\n",s); printf("第十次反弹的高度为%.2lf米\n",n);运行结果:总共经过了299.80米第十次反弹的高度为0.10米例题2:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

1.程序分析:本题同样考察循环的使用。设分子为a=2,分母为b=1,总和为s=2.0/1。每一次循环需要完成的工作有:(1)求每一项的分子和分母。由于b的值还必须用于a的计算,所以应当先将b的值保存在一个变量t中;分母为前一项的分子,即b=a;分子为前一项分子和分母的和,即a=a+b。(2)求总和。除第一项外,总和为:s=s+a/b。循环次数为19次。2、算法流程图如下:开始开始a=2b=1i=2s=2.0/1i<=20t=bb=aa=a+ts=s+a/bi++输出s结束AAYN3、程序源代码如下:#include<stdio.h>main(){inti;doublea=2,b=1,s=2.0/1,t;for(i=2;i<=20;i++){t=0;b=a;a=a+t;s=a/b;}printf("前20项的总和为:%.2lf",s);}输出结果:前20项的总和为32.66例题3:要求输出国际象棋棋盘。图2:1、程序分析:本题考察循环的嵌套使用。国际象棋棋盘共有64格,分为8行8列。可用一个循环控制输出8行,而用一个内嵌的循环控制每行输出8格,输出8格后换行。通过观察发现,每个格子的颜色由其所在的行号和列号之和控制,和为偶数,则为黑色,和为奇数,则为白色。2、算法流程图如下:开始开始i=1i<=8结束AYNi<=8j=1A(i+j)%2==0输出黑格输出白格j++BBCCYYNj++换行3、程序源代码如下:#include"stdio.h"main(){inti,j;for(i=0;i<8;i++){for(j=0;j<8;j++)if((i+j)%2==0)printf("%c%c",219,219);elseprintf("");printf("\n");}}输出结果:见图2(注意:须将输出窗口的默认值改为英文。)第6章字符型数据一、字符型常量1、字符常量字符常量是指用一对单引号括起来的单个字符。说明:(1)单引号是字符常量的定界符,也是其与其他常量的区分标志。(2)字符常量只包含一个字符。(3)空格也是字符,表示为’]’。(4)字符常量在内存中存储为其ASCII码值,可作为整数处理。ASCII码中最高位固定为0,所以其表示的字符为0~127。2、转义字符常量转义字符:用“\”加上其它字符组成,表示特殊的意义。转义字符加上一对单引号构成转义字符常量。“\”+单个字符,如:\n,\t,\b“\”+ooo,即一个三位的八进制数,表示该数对应ASCII码值的字符。如:’\061’表示字符’1’,’\042’表示字符’”’,’\141’表示字符’a’。“\”+xhh,即x加上一个两位的十六进制数,表示该数对应ASCII码值的字符。如:’\x31’表示字符’1’,’\x6B’表示字符’k’3、字符串常量字符串常量是指用一对双撇号括起来的字符序列。如:”Cprogram”,”a”,”1+2=3”等。字符串常量在内存中的存储空间为字符数+1个字节,系统自动在其末尾添加“\0”作为字符串结束标志。4、字符数据的运算字符数据表现为其ASCII码值,可参与任何整型数据能够参与的运算。如’a’+3,!’\n’,’b’>’B’等。字符数据与其它数据混合运算时,会转换成为int再运算。字符数据在内存中用一个字节保存,其表示范围为-128~127,对字符变量赋值时,超出范围会出现错误。如charch=160;ch的值为-96二、字符变量字符变量的类型关键字为char,一般占用1字节内存单元。字符变量用来存储字符常量。将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到内存单元中。三、字符输入输出1、调用printf和scanf输入输出字符字符数据的格式说明符是c格式符。(1)printfc格式符中可指定宽度,如%5c。(2)scanfeq\o\ac(○,1)如格式符形式为%c%c则输入数据之间不能以]为间隔符,否则空格会作为字符读入。eq\o\ac(○,2)如格式符形式为%c%c输入数据间必须有1个以上空格,多个空格当作一个空格处理。例:输入abc,则a和c会被读入。eq\o\ac(○,3)格式符中规定数据宽度,如%3c%3c则指定宽度内第一个字符被读入。例:输入abcdef,则a和d被读入。eq\o\ac(○,4)当包含其他格式符时,如%d%c%d%c则根据类型读取数据例:输入1a2]b则读入的数据为1a2]输入1.23a2b则读入的数据为1.23a2、调用putchar和getchar输入输出字符(1)字符输出函数——putchar()putchar()函数的格式:putchar(ch);其中ch可以是一个字符变量或常量,也可以是一个转义字符。putchar()函数的作用:向终端输出一个字符。eq\o\ac(○,1)putchar()函数只能用于单个字符的输出,且一次只能输出一个字符。另外,从功能角度来看,printf()函数可以完全代替putchar()函数。eq\o\ac(○,2)在程序中使用putchar()函数,务必牢记:在程序(或文件)的开头加上编译预处理命令(也称包含命令),即:#include"stdio.h" (2)字符输入函数——getchar()getchar()函数的格式:getchar();getchar()函数的作用:从系统隐含的输入设备(如键盘)输入一个字符。另外,从功能角度来看,scanf()函数可以完全代替getchar()函数。eq\o\ac(○,1)getchar()函数只能用于单个字符的输入,一次输入一个字符。eq\o\ac(○,2)程序中要使用getchar()函数,必须在程序(或文件)的开头加上编译预处理命令。四、程序举例1、统计输入字符中的元音字母个数,以’!’结束。2、教材例6.5第7章函数一、函数概述1、函数的概念函数是可被多次调用、用以实现一个特定功能的程序模块。2、函数的一般意义在软件设计和程序编制中使用函数可以有效地改善软件质量评价的两大重要指标:可维护性和可重用性:①使用函数可以遵循“自顶向下、逐步求精”的结构化程序设计思想,把一个较大或复杂的问题分解成若干较小且较易解决的问题,继而各个击破、分而治之,实现对复杂问题的求解。使用函数作为程序的基本模块单位,将一个较复杂的应用程序分解成若干功能较单一的程序模块(即函数)并加以实现,有利于实现程序的模块化,使程序设计变得简单和直观,改善程序的可理解性和可修改性,从而改善软件的可维护性;②把程序中经常用到的一些计算或操作编成通用函数以供随时调用,可以大大减轻代码编制的工作量,有效地改善软件的可重用性。3、函数在C语言程序中的特殊意义①函数是C语言程序的基本组成单位。C语言程序的每个模块都是函数,编写C语言程序就是编写一个个函数。一个C语言程序由一个主函数和若干个函数构成。②合理组织函数有利于提高C语言程序的开发效率。一个C程序由一个或多个源程序文件组成,这些源程序文件可分别编写、编译和凋试。③C语言的函数兼有其他语言中的函数和过程两种功能。当C语言函数向主调函数传递返回值时,它相当于其他语言中的函数;当C语言函数不向主调函数传递返回值时,它相当于其他语言中的过程4、注意事项①一个C语言源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位。②C语言程序从main()函数开始执行。主函数Main()是C语言程序的主控函数,相当于其它高级语言程序的主程序。5、C语言函数的分类①从函数的来源分①从函数的来源分自定义函数:用户自己定义的函数。②从函数的形式分②从函数的形式分有参函数③从函数的作用域分③从函数的作用域分内部函数(静态函数)④从函数的返回值分④从函数的返回值分无返回值函数二、函数的定义形式1、函数的组成和函数定义的一般形式(1)函数的组成C语言的函数(包括主函数main())都是由函数首部和函数体两部分组成。①函数首部:是函数的说明部分,即函数的第1行其内容与格式依次为“[存储类型][函数类型]函数名([形参表])”其中的函数名及函数名后紧跟的圆括号对“()”是必需的,而其它内容(即“[]”括号对中的内容)则为可选项。②函数体:是函数的主体部分,即紧接着函数首部下面由花括号对“{}”括起来的部分函数体一般包括(但非必须包括)声明部分和执行部分。声明部分是对函数中新用到的变量(局部变量)的定义和所调用的函数的声明;执行部分则由可执行语句序列组成。(2)函数定义的一般形式函数的定义是把完成一个子任务的程序写成一个函数,可理解为“制造函数”。从上述函数的组成可知函数定义的一般形式为:[存储类型][函数类型]函数名([形参类型1形参名1[,形参类型2形参名2…]]){[声明序列(局部变量定义、调用函数声明);][语句序列;]}例:staticintmax(intx,inty){intz;z=x>y?x:y;return(z);}(3)注意事项①函数必须先定义和声明后才能调用。②存储类型说明该函数是外部函数还是外部函数,它可以是extern(外部函数)或static(内部函数),缺省时默认为extern型。②函数类型说明函数值的类型,它可以是任何有效类型,缺省时默认为int型。③函数名、形参名都是标识符,必须遵循标识符命名规则(最好“见名知义”)。在同一程序中,函数名必须惟一(函数名代表此函数在内存中的起始位置)。④“形参”是形式参数的简称,是一些局部变量(如程序7-1中max()定义中函数首部中的变量x,y),这些变量用来接受调用时由主调函数传入的实际参数的值,它也可以参加该函数体中的操作。形参的个数和类型均由函数的功能决定。⑤函数体中声明部分可以包括本函数的局部变量的定义和本函数将调用的其它自定义函数的声明(即“函数原型”)。前者是“定义性声明”(简称“定义”),是本函数中需要使用的一些变量说明,它只在本函数中有效;后者是“引用性声明”(简称“声明”)。⑥可以有“空函数”。空函数是既无参数、函数体又为空(指花括号对“{}”内不写内容,并非连“{}”也不写)的函数。其一般形式为:[函数类型]函数名(void){}注意,空函数的函数类型应定义成void型,否则其函数体内应有能执行到的“return;”语句,不然编译时系统将给出“mustreturnavalue”的警告提示。⑦形参声明的传统方式。老版本C语言中,形参类型的声明放在函数定义的笫2行,即不在笫1行的括号内指定形参类型,而在括号外单独指定(即函数首部为2行),用以下形式出现:[函数类型]函数名(形式参数表)形参类型说明;⑧如果函数有返回值,则函数体中必须包含返回语句return。⑨函数体中使用的局部变量均须“先定义,后使用”。2、函数的类型与函数值C语言的函数兼有其他语言中的函数和过程两种功能,据此可把函数分为有返回值函数和无返回值函数2种。函数值指函数的返回值,函数的类型即函数值的数据类型。(1)函数返回值与return语句函数的返回值通过函数中的return语句获得。如果需要被调函数带回一个函数值给主调函数,被调函数中必须包含能执行到的return语句。如果不需要从被调函数带回函数值则可以不要return语句。return语句的格式:return(表达式);或return表达式;或return;return语句的功能:①把return后面“表达式”的值传给主调函数(格式“return;”无此功能)。②停止所在函数后续语句(如果有的话)的执行,把控制转回给主调函数。当函数类型与return语句表达式类型一致时,函数返回值就是return语句中的表达式的值。注意事项:①声明为void型的函数中不能包括带表达式的return语句,即void型函数中应当无return语句或仅为“return;”格式;②主函数的函数体内不能有return语句。③当函数没有return语句时,以结束函数的花括号}作为返回点。但这时并不表明函数没有返回值,而是其返回值是不确定的。④return语句中表达式的值的类型一般应与函数首部中定义的函数类型一致,至少必须两者赋值兼容(参见本书第2章中的“2.12.3赋值转换”)。⑤函数中可有多个return语句,但函数第一次遇到return语句时就立即实现该语句的功能,返回到主调函数。如例7-1中的comp_ch()中的“x=2;”语句将不会执行。⑥虽然除void型函数外的所有函数都返回一个函数值,但该返回值是

温馨提示

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

评论

0/150

提交评论