




已阅读5页,还剩271页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计,教材分析,本书内容共有11章,可分为三部分。第1、2章为第一部分,为初学者的入门知识,使读者对c语言编写程序的步骤、方法和程序结构及算法描述有一个大致的了解。第3第5章为第二部分,是程序设计的基础部分,使读者详细了解c语言的基本数据类型和表达式以及c语言的控制结构。掌握了第一、二部分的内容,读者可以完成简单的程序设计。第6章第11章为第三部分,讲述了模块化程序设计的概念和实现的方法,为程序设计提供了更多、更方便的途径,为进行综合程序设计奠定了基础。每一个章节里都有详细的程序范例来说明程序的设计思想、语句的概念、作用、含义和使用方法,使学生能够由浅入深系统地学习c语言的知识,同时掌握一定的编程方法。,成绩考核,成绩考核方法:期末成绩=平时成绩20%+期末考试80%;注:平时成绩包括:上课情况、作业情况、上机作业完成情况等。,学习C的忠告,上机实践(编程)!(Try!),C语言程序设计教程,第1章引言第2章程序的简单算法制定第3章基本程序语句第4章选择结构第5章循环结构第6章函数与编译预处理第7章数组第8章指针第9章构造数据类型第10章文件第11章位运算,C语言程序设计课程的任务,1.指导学生掌握C程序设计语言的基础知识;2.培养学生综合分析并编制程序解决实际应用问题的能力;3.培养学生契而不舍的解决问题的精神以及认真的学习态度。通常我们把设计、书写及检查调试程序的过程称为程序设计。应当指出,简单的程序设计应包括以下几个部分:确定数据结构确定算法编写代码调试并运行整理并写出文档资料,第一章引言,1.1C语言的特点1.2简单的C语言程序介绍1.3C语言程序的结构1.4C程序设计语言的执行,1.1C语言的特点,C语言有9种控制语句,32个关键字。运算符丰富。共有34种运算符数据结构类型丰富。具有结构化的控制语句语法限制不太严格,程序设计自由度大。C语言允许直接访问物理地址,能进行位操作,可以直接对硬件进行操作。生成目标代码质量高,程序执行效率高。C语言编写的程序可移植性好。,1.2简单的C语言程序介绍,/*ex101.c-在屏幕上输出ThisisaCprogram.*/#includevoidmain()printf(“ThisisaCprogram.n”);,注释/*ex101.c-在屏幕上输出ThisisaCprogram.*/,C程序中的“/*/”之间的内容称为注释,是程序编写者给程序阅读者留下的一些说明(注释),以帮助阅读者理解程序。编译器不对注释进行编译,只将它们当作空白看待。本程序的第1行中的注释为“ex101.c”,是说明本书编写时将这个程序保存在文件ex101.c中。,库函数与文件包含命令include#include,库函数:系统提供的标准函数,程序可直接使用;使用库函数必须将其有关说明信息写入程序。为了用户方便,系统定义库函数时,把一类相关库函数的说明信息,分别写在一些文件中。本例中使用了库函数printf,其有关说明信息写在文件stdio.h中。所以在程序的开始加入了#include使用C语言的库函数,要在程序前面加上类似#include的预处理命令,main函数,任何C程序都必须有且只能有一个主函数main(),它是程序的入口,也是程序的出口。其中,main是函数名,()内可以包含一些参数;的内容称为函数体,其包含若干条C程序语句;不同语句之间用分号分隔;一般情况下,每个程序都由一至多个函数组成;,voidmain()printf(“ThisisaCprogram.n”);,演示ex101,语句printf(“ThisisaCprogram.n”);,C语言的主函数体由一些语句组成。每个语句由一个分号结束。如本例中,主函数的一个语句:printf(“ThisisaCprogram.n”);,说明:函数printf是系统提供的一个库函数,printf函数的功能是向显示器输出一段信息,具体内容括在双引号内;参数中的“n”代表一个命令:输出完这行字符后换行,不是要求显示的文字。,例2写出以下程序的运行结果,写出以下程序的输出结果#includevoidmain()printf(“Hellon”);printf(“world!n”);演示ex102,例3四则运算编程,#includeintadd(intx,inty);main()inta,b,c;scanf(%d%d,演示ex103演示ex104讨论减、乘、除的编程,输入函数Scanf(),函数说明,函数定义,1.4C程序设计语言的执行,对于C语言程序来说,这一过程一般分为4步:第1步:编辑源程序;第2步:编译;第3步:链接;第4步:执行;,(整个过程如下图),filename.c,filename.obj,filename.exe,出错,出错,出错,出错,调试debug,编译,编译就是把用C语言描述的程序翻译成计算机可以直接理解并执行的机器语言命令组成的程序。C语言的编译过程分为两个阶段:首先是编译预处理,系统要先扫描程序,处理所有预处理命令,如把文件包含命令要求的文件包含(嵌入)到程序中。然后才开始编译。编译后得到的文件称为目标文件。目标文件就是用机器语言描述的文件。C语言的目标文件的后缀为.obj。目标文件的主文件名,一般与源程序文件名相同。在编译过程中,还要对源程序中的语法和逻辑结构进行检查。编译任务是由称做编译器(compiler)的软件完成的。程序在编译过程中,也可能发现错误。这时要重新进入编辑器进行编辑。,链接,链接是将与当前程序有关的、已经有的几个目标模块链接在一起,形成一个完整的程序代码文件。这些已经有的目标模块有:库函数:如前面使用的printf;对于大的程序,常常分成几个模块,分别编写、编辑和编译,形成不同的目标模块。经正确链接所生成的文件才是可执行文件。可执行文件的文件名后缀为.exe(有的系统为.out)。完成链接过程的软件称为链接器(linker)。程序在连接过程中,也可能发现错误。这时也要重新进入编辑器进行编辑。,执行,链接后得到的可执行文件名,对操作系统来说,相当于一条命令。在操作系统提供的命令界面上打入这个命令,就可以开始执行这个程序。,C语言的集成开发环境,Turboc2.0Turboc+(选用)Vc+等(1)打开Turboc+运行环境。界面如图:,从图可以看到在集成环境的上部,有一行“主菜单”,其中包括下面10个菜单项:FileEditSearchRunCompileProjectOptionsDebugWindowHelp分别代表:文件操作、编辑、查找、运行、编译、项目文件、选项、调试、窗口、帮助等功能。用户可通过以上菜单项来选择使用TurboC集成环境所提供的各项主要功能。(2)编辑源程序。在File菜单下选择NEW子菜单项命令,系统的光标处于等待输入C源程序状态。输入完源程序后,选择File菜单下选择Saveas子菜单项命令进行保存,在随后弹出的保存文件对话框中,输入文件名*.c后按“”(3)编译源程序选择Compile主菜单项并在其下拉子菜单中选择Compile命令,则进行编译。若源程序无语错误,生成可执行文件EXE;若源程序有语法错误,在Message窗口显示错误信息,此时没有生成可执行文件,应回到第2步,修改程序的错误,直到无语法错误、生成可执行文件。,返回,(4)连接程序在Compile菜单中,选择Link子菜单项命令,程序将被连接成可执行程序。注:按F9键,可一次完成编译和连接。(5)执行程序。选择Run子菜单命令,或按快捷键Ctrl+F9。(6)看结果。程序运行后看结果必须选择File菜单下的DOSShell命令或者按快捷键Alt+F5,才能看到运行的结果。如程序未得到预期的结果,应回到第2步,修改程序的错误。(7)退出TurboC+,File-Quit菜单命令或按Alt+X。,总结:简单C语言程序设计步骤,分析问题,设计解决方案了解和编写C语言程序代码,上机调试(编辑、编译、链接、执行),理论课的主要内容,实验课的主要内容上述每个步骤都可能出现很多错误,具体有三种错误:语法错误、逻辑错误、运行错误。总之,出现错误就要进行调试。,作业,1、在屏幕上输出如下图形:25要求:写出程序,并上机调试,尽量保证程序能够得到正确结果。复习本讲内容(第一章),预习教材第二章。,第二章程序的简单算法制定,2.1结构化程序的算法制定2.2结构化程序的算法描述2.3算法制定的范例,2.1结构化程序的算法制定,利用计算机处理问题简述,2.1结构化程序的算法制定,例2.1从键盘输入3个数,找出其中最小的那个数。分析:1、需变量的个数-3个2、先比较a,b的值,把小的存在min中。3、再用min与c比较,把数值小的存放在min中。如果ab则min=a,否则min=b;如果c0(双实根)X1=X2=如果b2-4ac=0(单实根)X1=X2=如果b2-4ac=60)printf(“Passed!”);elseprintf(“Failed”);,算法可采用自然语言、流程图、N-S图、PAD图、伪代码等方法来描述。示例:根据学生成绩输出评定结果。,一、算法(algorithm),二、算法与流程图传统流程图,特点:直观形象;使用流线。缺点:占面积大,使用流线任意转移,易出现“乱麻”现象,造成编程与阅读程序困难。,二、算法与流程图N-S结构化流程图,77年美学者I.Nassi和B.Scheiderman提出。特点取消流线不允许流程任意转移,只能从上而下顺序执行规定三种基本结构的流程图单元,由这些基本结构象搭积木似的组成各种算法(结构化设计)。优点算法清晰,流程不会无规律乱转移。,二、算法与流程图三种基本结构,通常情况下,程序中的语句是以所编写的顺序一句接一句地执行,这种执行方法称为“顺序执行”。许多C语句能够让程序员指定不按编写顺序执行下一条执行语句,这种执行方法称为“控制转移”。Bohm和Jacopini的研究证实,所有的程序都能够只用三种控制结构编写,即顺序结构选择结构(selectionstructure)循环结构(repetitionstructure)顺序结构是C语言的基本结构,除非指示转移,否则计算机自动以语句编写的顺序一句一句地执行C语句。任何C语言程序都是由七种控制结构(顺序结构、三种选择结构和三种循环结构)构成的。,二、算法与流程图三种基本结构,顺序结构A块、B块顺序执行(每块代表一个或一组操作),二、算法与流程图三种基本结构,选择结构条件p成立时执行a块(否则执行b块)if选择结构条件为真时执行某个指定的操作,条件为假时跳过该操作(单路选择)ifelse选择结构条件为真时执行某个指定的操作,为假时执行另一个指定的操作(双路选择)switch选择结构根据表达式的值执行众多不同操作中的某个指定的操作(多路选择),二、算法与流程图三种基本结构,循环结构分当型和直到型两类。当型先判断,只要条件为真就反复执行A块,为假则结束循环。直到型先执行A块,再判断条件是否为真,为真则继续执行循环体,为假则结束循环。C语言提供了三种循环结构,即while循环结构,dowhile循环结构和for循环结构。,2.2.3PAD图,PAD(ProblemAnalysisDiagram)另一种被广泛使用的一种算法的图形表示法。PAD图可以看成是二维的,它能展现算法的层次结构。(顺序结构很简单,在此未画图。),2.3算法制定范例,例2.4把从键盘输入的大写字母转换成小写字母,输出结果。问题:1、描述算法2、根据算法编写C程序3、运行检查程序是否正确。演示ex202,2.3算法制定范例,例2.5已知实数a和b,计算u的值:u=(r+s)2。其中,当ab时,r=a2-b2,s=a/b;当ab时,r=b2-a2,s=a/b+4。算法(自然语言描述):从键盘输入实数a和b。如果ab,则r=a2-b2,s=a/b;否则,r=b2-a2,s=a/b+4。计算u的值:u=(r+s)2。输出u的值。,开始,输入a,b,ab,T,F,r=a*a-b*b,s=a/b,r=b*b-a*a,s=a/b+4,结束,u=(r+s)*(r+s),输出u的值,流程图,输入实数a,b,a)(=!=)结合性:自左至右;表达式的值:若为真,则结果为1;若为假,则结果为0。35的值为0;32的值为0;3+(43的值为1;afloatb=3.5;!a(0)!(a0)(0)(a0)(1),例如,结论:b=1;c=a+结果:a为0,b为0,c为0,d为1。,3.4基本运算符和表达式,逻辑表达式一般用于控制语句中的条件:例如:(1)n是小于m的偶数:(2)year是闰年:(能被4整除但不能被100整除或能被400整除),nb?a:ba条件赋值,验证:printf(%d%dn,-a=b+?a+:b+,b);运行结果:45,3.4基本运算符和表达式,5、结合性:自右至左;y=x10?x/10:x0?x:-x;等价于:y=x10?x/10:(xy)printf(“%d”,x);,例:if(xy)max=x;elsemax=y;,if语句(条件分支语句),【例4-1】在两个数中取大数。,main()intnum1,num2,max;printf(ninputtwonumbers:);scanf(%d%d,main()intnum1,num2;printf(ninputtwonumbers:);scanf(%d%d,如:if(a=b,else要与if配对使用if后面的表达式类型任意,语句可以是复合语句同一个条件的多种表达方式如:if(x)if(x!=0)if(!x)if(x=0),例考虑下面程序的输出结果:#includemain()intx,y;scanf(“%d,%d”,CompileError!,说明:,错误信息:misplacedelseinfunctionmain,如:if(ay)if(zx)max=z;elseif(yx)max=y;printf(“max=%d”,max);,结果?,缺省时,else总是和它上面离它最近的未配对的if配对,ifelse配对原则:,main()intx=100,y=10,a=30,b=20,k1=10,k2=6;if(ab)if(b!=10)if(!k1)x=1;elseif(k2)x=10;elsex=20;printf(x=%dn,x);,运行结果:x=10,例:if(a=b)if(b=c)printf(“a=b=c”);elseprintf(“a!=b”);,修改:if(a=b)if(b=c)printf(“a=b=c”);elseprintf(“a!=b”);,实现ifelse正确配对方法:加,实现ifelse正确配对方法,注意:书写格式不能代替程序逻辑,if语句嵌套一般形式:,main()intx,y;printf(”ninputx:”);scanf(”%d”,x);if(x60n”);break;caseF:.,如:switch(z)caseA:i+;k-;printf(“An”);break;caseF:.,例switch(score)case5:printf(“Verygood!”);case4:printf(“Good!”);case3:printf(“Pass!”);case2:printf(“Fail!”);default:printf(“dataerror!”);,运行结果:score为5时,输出:Verygood!Good!Pass!Fail!dataerror!,【例】输入17中的数字,将其转换成相应的星期英文单词。main()intnum;scanf(”%d”,若无break?,【例4-6】编写程序测试是数字、空白、还是其他字符。main()intc;switch(c)case0:case1:case2:case3:case4:case5:case6:case7:case8:case9:printf(”thisisadigitn”);break;case:casen:caset:printf(”thisisablankn”);break;default:printf(”thisisacharactern”);break;,补充举例:,路程s越远,每公里运费越低。折扣的标准如下:s250km没有折扣250s5002折扣500s10005折扣1000s20008折扣2000s300010折扣3000s15折扣设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为:fp*w*s*(1-d),折扣的“变化点”都是250倍数,分析折扣变化的规律:,若s为整型,则c与折扣d的关系为:c=0d=0c=1d=2%c=2、3d=5%c=4、5、6、7d=8%c=8、9、10、11d=10%c=12、13、14、d=15%,若c=s/250,则折扣d如下:c1d01c2d22c4d54c8d88c12d1012cd15,运输公司对用户计算运费:,?,能,练习:输入一个由两个数据和一个算术运算符组成的表达式,根据运算符完成相应运算,并输出结果。,#includemain()inta,b;charc;scanf(%d%c%d,作业:,第四章课后习题P65P70上机:练习,循环是指使用一定条件对同一个程序段重复执行若干次。循环结构又称重复结构,可以完成重复性、规律性的操作。,第五章循环结构,goto,goto语句,一般格式:goto语句标号由ifgoto构成循环例4-1:main()intx=0,y=0;star:if(x6)n-;printf(“%dn”,n);,6,例4-3:用while循环求sum=1+2+3+100,#includemain()intsum=0;inti=1;while(i0)p1=2*(p2+1);p2=p1;n-;printf(“thetotalis%dn”,p1);,#includemain()intn=0;longt=1;printf(“nn!n”);while(n=0);,1-1,x=x-2;printf(“%d”,x);,求1+2+3+100,#includemain()intsum=0,i;i=1;dosum=sum+i;i+;while(i=100);printf(”sum=%dn”,sum);,#includemain()intsum=0;inti=1;while(i=100)sum=sum+i;i+;printf(“sum=%d,sum);,main()inti=1,s=0;while(i1)s=s+i;i=i+1;printf(s=%dn,s);,s=0,main()inti=1,s=0;dos=s+i;i=i+1;while(i1);printf(s=%dn,s);,s=1,do-while与while的区别,一般形式:,for(表达1;表达式2;表达式3),执行流程:,for语句,一般应用形式:,for(初始化表达式;条件表达式;修正表达式),说明:for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省for语句可以转换成while结构,表达式1;while(表达式2)表达式3;,for语句,for(表达1;表达式2;表达式3),形式:#includemain()inti=0;for(i=0;i10;i+)putchar(a+i);,运行结果:abcdefghij,形式:#includemain()inti=0;for(;i10;i+)putchar(a+i);,形式:#includemain()inti=0;for(;i10;)putchar(a+(i+);,形式:#includemain()inti=0;for(;i10;putchar(a+i),i+);,例:for语句形式的多样性,main()inti;for(i=0;i10;i+)i+;printf(“%d”,i);,main()inti;for(i=1;i5;i+);printf(“%d”,i);,5,13579,空语句,求1+2+3+100,main()intsum=0,i;for(i=1;i=100;i+)sum=sum+i;printf(”sum=%dn”,sum);,几种循环的比较,while(表达式)语句;,do语句while(表达式);,循环控制条件,循环条件初始化,循环修改条件,也可在for前,也可在循环体内,for(表达式1;表达式2;表达式3)语句,几种循环的比较,循环体的执行:,先判断条件,循环体可能一次也不执行。,while(表达式)语句;,后判断条件,循环体至少执行一次.,do语句while(表达式);,for循环功能强,两者界限不清,使用较随意。,for(表达式1;表达式2;表达式3)语句,界限不清,界限不清,小结,循环控制有两种方法:计数法和标志法。能确定循环次数时,采用计数法,用for语句比较清晰;不能确定循环次数时,采用标志法,设法找出循环终止条件,用while或do-while语句来实现。用while与do-while语句能实现的程序,用for语句未必可以实现。while语句是先判断后执行,do-while语句是先执行后判断。在循环体至少执行一次的情况下两者等价。,#includemain()inti,s;s=0;i=1;while(i=100)s=s+i;i+;printf(s=%dn,s);,计算s=1+2+3+100,#includemain()inti,s;s=0;i=1;dos=s+i;i+;while(i=100);printf(s=%dn,s);,#includemain()inti,s=0;for(i=1;i=100;i+)s=s+i;printf(s=%dn,s);,main()inti;for(i=1;i=0);,去掉分号,结果是?,例:求Fibonacci数列第40项。又叫兔子繁殖问题(Fibonacci提出的),main()intn,m;longf1=1,f2=1,f3;printf(“%ld%ld”,f1,f2);for(m=3;m=40;m+)f3=f1+f2;f1=f2;f2=f3;printf(“%d”,f3);printf(“n”);,设有一对新生兔子,从第3个月开始,每个月都生一对兔子。按此规律,若所有兔子都不死,问一年后共有多少对兔子?,迭代法,f1f211f3=f1+f22f1f2f3=f1+f23f1f2f3=f1+f25f1f2f3=,初始条件,终止条件,迭代公式,思考:f1=f2和f2=f3能否对换位置?不,例:打印出所有的水仙花数。一个3位数,其各位数字的立方和等于它本身。,分析:百位数i=m/100;十位数:j=m/10%10;个位数k=m%10;判断m=i3+j3+k3,main()inti,j,k,m;for(m=100;m1000;m+)i=m/100;j=m/10%10;k=m%10;if(m=i*i*i+j*j*j+k*k*k)printf(%5d,m);,穷举法,计数法,统计从键盘输入一行字符的个数.,main()intcount=0;while(getchar()!=n)count+;printf(%d,count);,标志法:循环终止条件,main()intx,max,i;scanf(“%d”,依次输入10个数,找出最大数。,打擂方式,有一个分数序列2/1,3/2,5/3,8/5,21/13求该数例前20项之和,main()intn,t;floata=2,b=1,s=0;for(n=1;n=a,循环的嵌套:循环体本身包含循环语句三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉,(1)while()while().,(2)dodowhile();.while();,(3)while()dowhile();.,(4)for(;)dowhile();while().,循环的嵌套,for(i=1;i5;i+)j=1;while(j4)printf(i=%d,j=%dn,i,j);j+;,for(j=1;j4:j+)printf(i=%d,j=%dn,i,j);,i=1,j=1i=1,j=2i=1,j=3i=2,j=1i=2,j=2i=2,j=3i=3,j=1i=3,j=2i=3,j=3i=4,j=1i=4,j=2i=4,j=3,形状,形状,main()inti,j;for(i=1;i=9;i+)printf(“%4d”,i);printf(“n”);for(i=1;i=9;i+)printf(“%c”,-);printf(“n”);for(i=1;i=9;i+)for(j=1;j=9;j+)printf(“%4d”,i*j);printf(“n”);,P71例12:打印九九乘法表,形状,1234567891234567892468101214161836912,打印表头9个数字,打印虚线,打印表体,for(i=1;i=9;i+)for(j=1;j=i;j+)printf(“%4d”,i*j);printf(“n”);,打印表体,for(i=1;i=9;i+)for(j=0;j=i-1;j+)printf(“%4c”,);for(j=i;j=9;j+)printf(“%4d”,i*j);printf(“n”);,打印表体,打印空格,例:百马百担,有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担。问有大、中、小马各多少?,算法分析:,main()inta,b,c;for(a=0;a33;a+)for(b=0;b50;b+)c=100-a-b;if(3*a+2*b+c/2.0=100)printf(“a=%d”,a);printf(“b=%d”,b);printf(“c=%dn”,c);,穷举法,若问有几种解决方法,则应如何修改程序?,用变量k作为计数器,在if语句中增加“k+;”语句,例:打印图形。,补充举例:打印图形。,算法分析:,第1行:1个空格,5个*号,换行第2行:2个空格,5个*号,换行第3行:3个空格,5个*号,换行第4行:4个空格,5个*号,换行第5行:5个空格,5个*号,换行,第i(15)行:i个空格,5个*号,换行,main()inti,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(“”);for(j=1;j3是否为素数,main()intn,m;scanf(%d,例:验证素数,素数是除了1和它自身外,再也找不到能被它整除的数。即:若m不能被2到m-1中所有整数整除,则n为素数。已证明只要从2判断到m/2或即可。,算法分析:,求100200间的全部素数?,也可用m/2或sqrt(m),与break语句退出循环不同的是,continue语句只结束本次循环,忽略循环体中剩下的语句,接着进行下一次循环的判断,如果满足循环条件,继续循环,否则退出循环。,例:输出100以内的偶数main()inti;for(i=1;i=100;i+)if(i%2!=0)continue;printf(%d,i);,本次循环结束,循环体中剩余语句被忽略,执行达式3.进入下一循环.continue做if的内嵌语句,if(i%2=0)printf(%d,i);,continue语句,例:打印3-100内的素数。,main()intn,m;scanf(“%d”,#includemain()inti,s;s=0;for(i=1;i0)case1:switch(y10)case1:printf();break;case0:printf(!);break;case0:switch(z=5)case0:printf(*);break;case1:printf(#);break;default:printf(%);break;default:printf(思考运行结果是什么?,小结,前五章主要讲了C语言的基础知识,3种基本的数据类型和几种运算符及表达式,C语言中3种基本的结构以及简单的编程思想。要求:通过这几章的学习,要求学生掌握C的编程思想以及算法的制定,同时要求掌握调试程序的方法,第6章函数,6.1函数的概述与分类6.2函数定义6.3函数的调用6.4标识符的作用域6.6函数应用举例,6.1函数的概念与分类,C程序设计的基础工作是函数的设计和编制。C程序完全由函数组成。除语言本身提供的库函数外,用户还可根据需要定义任意多个自己的函数,这些函数可以同main函数放在一个源文件中;也可以分放在不同的源文件中,单独进行编译,形成独立的模块(.obj),然后将若干obj文件链接在一起,形成一个可执行文件(.exe)。,C函数分类除main函数外,其它为系统函数、自编函数。系统函数:由系统提供,放在不同的头文件中,用户可调用。例如:sin(x),scanf(“%d”,for(i=1;i=10;i+)printf(“*”);intf(intn)函数首部inty=1,i;for(i=1;i=n;i+)y=y*i;return(y);,函数体,例如:,voidoutput(intn)inti;for(i=1;iy)return(x);elsereturn(y);viodmain()inta,b,c;printf(“inputa,b:”);scanf(“%d%d”,例程6-2:求两数中较大者。,3.每个参数前要有类型符,若无参数,()不能省略,floatave(intx,y)floatave(intx,inty,charc),6.3函数的调用,执行一段子程序并带回计算的结果;或完成子程序中的操作。,函数的入口:函数首部函数的出口:retrun语句,函数最后的,注意:,不能利用goto插入到函数内,或break中断函数。见P.82-83。,按函数在程序中出现的位置来分,共有3种。,1.函数语句:因为void类型不需返回值,把函数调用作为一个独立的语句,仅完成一定的操作。,函数名(实参表);,例如:scanf(“%d”,函数调用的形式,voidp2(intn)inti;for(i=1;i=n;i+)printf(“*”);voidp1()printf(“显示10个*n”);voidmain()p1();p2(10);,例程6-3:,2.函数表达式:作为表达式,出现在允许表达式出现的地方,要求带回一个确定的值,以参加表达式的运算。,intf(intn)voidmain()intj;inty=1;ints;for(j=1;j=n;j+)s=1+f(2)+f(3)+f(4)+f(5);y=y*j;printf(“s=%ldn”,s);return(y);,例程6-4:,3.函数参数:函数调用作为一个函数的参数,即嵌套调用。例如:m=max(a,max(b,c);s=sum(10,sum(100,28);,见P.84-85例6.7,例6.8,函数的提前声明,虽然C语言中的函数,放置顺序任意,但必须符合先声明后使用的原则。,系统函数:利用#include命令调入。放在程序的最前面。,用户函数:在程序中的位置应遵循“先定义,后使用”的原则,否则要提前声明。,函数的提前声明:将被调函数的首部置于调用函数的说明部分。,例程6-5:用函数求平均分。P.86例6.9,例6.10,函数参数的传递,C程序是由函数组成的,每个C函数是独立的程序模块。决不允许利用goto等转向跳跃语句,将数据从函数外插入函数内执行,这样破坏了函数的独立性及模块的结构化,同时函数返回时也找不到返回点。但是函数之间有时需要一定的联系,例如:将A函数的数据传递到B函数中。,函数之间的联系工作,通过参数的传递来完成。,函数参数的作用:参数用来在独立的函数之间传递数据,建立函数间的联系,根据参数的功能,有两类参数。,位置:出现在函数调用的()中。格式:函数名(实参1,实参2,实参n)实参的形式:表达式、函数、变量、数。功能:将调用函数中的数据传递到被调函数中。,1.实际参数(实参):,2.形式参数(形参):,位置:在被调函数首部()中说明的各量。格式:类型变量1,类型变量2,类型变量n功能:其作用是接收调用函数传递过来的实参值,所以形参只能是变量(存储单元形式)。,例如:intf(intx,int,n,floaty),形式参数,每个变量名前要有类型,说明:1)多个参数间用逗号分隔,实参与形参在个数类型、顺序上,必须一一对应或赋值兼容。,2)函数被调用时,才临时分配单元给形参,函数执行完毕,这些单元被释放。这样程序中占用的固定单元较少,执行速度快,不需考虑变量名的重用,便于多人编程。需要接收外来数据的变量安排为形参,否则安排为普通变量。,3)实参仅用来传递数据或地址,不再分配存储单元,用户函数的调用同系统函数。例如:sin(x);sin(intx);ave(n);ave(int10);,voidoutput(intn)inti;for(i=1;i=n;i+)printf(*);printf(n);,例程6-6:,voidmain()intn;output(10);n=20;output(n+5);output(n);,每次调用output函数时,分配给n的存储单元地址可能不同。,实参传数据给形参,可以是表达式,但先计算后传递,先分配单元,再接收数据。故只能是变量,有类型符声明,不要写成output(intn);变量n已分配,P.89例6.11,函数之间数据的传递方式:,1.将实参传给形参,有二种方式:复制式传递数据方式传送地址方式(数组和指针中介绍),复制式传递数据方式,当调用函数时,实参将数据传给了形参后,它们之间没有任何联系,即单向按值传送。,由于实参和形参不在同一个函数,分配存储单元的时间不同,所以实参和形参不管是否同名,亦不同存储单元,所以在被调函数中,无论形参如何变化都不会影响实参值,处理的结果利用return语句带回。从前面介绍的很多例程中,可看出复制式传递数据方式的特点:不同函数中的同名变量不同存储单元。由于每个参数只能传递一个数据,当需要传递的数据较多时,显得很不方便。,#includevoidmain()inta=15,b=25;voidswap(inta,intb);printf(1.a=%db=%dn,a,b);swap(a,b);printf(4.a=%db=%dn,a,b);voidswap(inta,intb)intt;printf(2.a=%db=%dn,a,b);t=a;a=b;b=t;printf(3.a=%dy=%dn,a,b);,例程6-7:局部变量的值传递。,2.利用全局变量可在每个函数中使用不释放内存单元的特点。,在函数外部说明的变量是全局变量。从声明的位置开始,以下的所有函数中都是有效的,即多个函数都可使用、改变它的值。全局变量的使用增加了函数间的联系,但却降低了函数的独立性。因此在模块化设计方法中不提倡过多地使用全局变量。,inti;/全局变量可在2个函数中使用voidprint()for(i=1;i=10;i+)printf(“*”);intf(intn)inty=1;for(i=1;i=n;i+)y=y*i;return(y);,例程6-8:全局变量应用,函数不能嵌套定义,但可以嵌套调用。,函数的嵌套调用,见P.91例6.12,递归:一个函数直接或间接地调用自身。1.直接递归调用:函数直接调用本身2.间接递归调用:函数间接调用本身,函数的递归调用,以下表示了递归的概念.,采用递归算法的优点:可将复杂问题变得较简单。,缺点:系统要自动安排一系列的内部操作,因此通常使效率降低,对硬件要求高,且并不是所有的问题都可以用递归来实现,必须有条件限制,否则回无限执行。,一个问题采用递归方法来解决时,必须符合以下二个条件:1.可以把一个问题转化为一个新的问题,而这个新问题的解决方法仍与原问题的解法相同,只是所处理的对象有所不同,但它们也只是有规律的递增或递减。,2.必须有一个明确的结束条件。否则递归将无休止地进行下去。,例如:求n!,1.从数学上定义,见P.93例6.13,6.14,6.4标识符的作用域与存储方式,变量的作用域,变量的生命期被称为变量的作用域。,变量声明的方式不同,位置不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。,局部变量,凡在函数(含main函数)内或内定义的变量称为局部变量。,生命期:局部变量仅在函数内或内有效。,说明:,1)不同的函数可具有同名的变量,它们所占内存单元不同,互不影响。形参为局部变量。,2)在复合语句中说明的变量仅在内有效。,全局变量,在所有函数之外说明的变量为全局变量。,生命期:自说明的位置开始至文件结尾全部有效。,intp=1,q=5;/p,q可在f1,f2,main中使用floatf1(inta)intb,c;/b,c只能在f1中使用charc1,c2;/c1,c2可在f2,main中使用charf2(intc,y)inti,j;/i,j只能在f2中使用voidmain(),例如:,1.因为可在多个函数中使用,相当于这些函数的公共变量。于是,当一个函数对其值进行改变后,另一个函数使用该变量的值亦相应改变。优点:可将某函数的结果带到另一个函数中缺点:始终占据内存单元;通用性差。,2.当全局和局部变量同名时,局部变量有效。,说明:,见P.98例6.18-20,变量的存储类别表达了在程序运行期间一个变量存在的空间、时间。C系统给每个C程序在内存中分配一片区域用来存放程序和数据。,变量的存储方式,变量又可分为四种具体形式,2.静态变量(static),4.寄存器型变量(register,已不用),3.外部变量(extern),1.自动型变量(auto),静态存储变量:用static说明的变量或全局变量。存放在静态存储区,在程序整个运行过程中,始终占据固定的内存单元,到程序执行完毕才释放。,注意:,1、用static声明的变量,程序运行中仅在第一次调用时赋初值,以后调用不再赋初值,而是使用上一次调用的值(因为存储单元不释放)。,2、若不赋初值,则系统置初值0。,#includeintfac(intn)staticintf=1;f=fn;return(f);voidmain()inti;for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);,例程6-9:求n!,每一次调用fac(i),输出一个i!,同时保留这个i!的值以便下次再乘(i+1)。,运行结果为:1!12!23!64!245!120,动态存储变量:用auto说明或缺省。存放于动态存储区,函数调用时临时分配的单元,调用结束,释放这些单元。在程序执行过程中,这种分配和释放是动态的。在一个程序中几次调用同一函数,分配给函数中局部变量的存储空间可能不同。,外部变量(extern),若一个程序分成2个文件保存,在B文件中要用A文件中的全局变量,则在B文件中将该变量声明成外部变量,这样就可在B文件中,引用在A文件中说明并赋值的全局变量。,例6-10:,/1.c文件intx;voidmain()voidf();x=10;f();,/2.c文件#includevoidf()externintx;printf(x=%dn,x);,说明:若被调函数和调用函数不在同一文件,必须在调用函数中对被调函数声明,或作为全局量。,/1.c文件intn=100;voidf();voidmain()/voidf();f();,/2.c文件#includevoidf()externintn;inti,s=0;for(i=1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省【中职专业高考】2025年中职高考对口升学(理论考试)真题卷【财经商贸大类】模拟练习
- 2025安徽黄山市黄山区消防救援大队政府专职消防员招聘2人模拟试卷及答案详解(历年真题)
- 2025海南保亭黎族苗族自治县市场监督管理局公益性岗位人员招聘1人考前自测高频考点模拟试题及答案详解(必刷)
- 广播安全播出技术培训课件
- 2025年甾体药物原料合作协议书
- Ibuprofenyl-CoA-Ibuprofenyl-coenzyme-A-生命科学试剂-MCE
- 广彩工艺传承
- 2025年离合器面片项目合作计划书
- GP130-modulator-2-生命科学试剂-MCE
- 2025年旋挖钻机项目合作计划书
- 2025至2030中国生物基化学品行业产业运行态势及投资规划深度研究报告
- 雾化吸入课件
- 采购战略合作协议范本5篇
- 财务部安全生产培训报告课件
- 公司兼职人员劳务合同4篇
- 制造过程质量追溯系统设计
- 2025年能源行业新能源产业风险管理可行性研究报告
- 会计毕业论文烟草专业
- 数字文旅概论 课件全套 第1-9章 数字文旅内涵与发展背景 - 数字营销
- 井盖安全常识培训课件
- 年产5万吨电熔锆刚玉新材料扩建项目环境影响报告表
评论
0/150
提交评论