《C语言程序设计》课程().ppt

上传人:e****s 文档编号:85467964 上传时间:2023-04-11 格式:PPT 页数:72 大小:348KB
返回 下载 相关 举报
《C语言程序设计》课程().ppt_第1页
第1页 / 共72页
《C语言程序设计》课程().ppt_第2页
第2页 / 共72页
点击查看更多>>
资源描述

《《C语言程序设计》课程().ppt》由会员分享,可在线阅读,更多相关《《C语言程序设计》课程().ppt(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C C语言程序设计语言程序设计 任课教师:任课教师:金金 丹丹 电子邮箱:电子邮箱:第第5 5章章 函数函数函数:clrscr()功能:是清屏,将插入点置于0行0列.clrscr();第 5 章 函数 模块化程序设计是面向过程程序设计的很重要的方法,C语言中的函数表达了这种思想。本章主要介绍:1、函数的定义2、模块化程序设计的实现方法3、函数的定义及函数的调用方式4、内部函数和外部函数的定义和调用方法等。5.1 C 函数与C程序结构模块化程序特点:模块化程序具备逻辑清晰、层次清楚的特点结构;具体应用:在C源程序中,用户可将算法分解成一个个相对独立的函数模块,称为用户函数,然后,通过函数调用来使

2、用这些函数。模块化程序设计C语言的函数作为一个模块一般应依据下面两个原那么:(1)界面清晰。函数的处理子任务明确,函数之间数据传递越少越好。(2)大小适中。假设函数太大,处理任务复杂,导致结构复杂,程序可读性较差;反之,假设函数太小,那么程序调用关系复杂,这样会降低程序的效率。模块化软件结构的示意图 一个一个C语言程序由主函数和假设干个语言程序由主函数和假设干个0个用户个用户函数组成;函数组成;C语言中的函数没有隶属关系,语言中的函数没有隶属关系,即所有的函数都是独立定义的,不能嵌套定义。即所有的函数都是独立定义的,不能嵌套定义。函数是通过调用来执行的,允许函数间互相调用,也允许直接或间接的递

3、归调用其自身;【例【例5.1】用户定义一个无参函数用来输出信息。】用户定义一个无参函数用来输出信息。void printstar()printf(printf(*nn););main函数函数可以调用任何一个函数,而其他函可以调用任何一个函数,而其他函数不能调用数不能调用main函数函数;例如:;例如:main()printstar()【例5.2】编写一个有参函数程序,求长方形的面积。float area(float a,float b)float s;s=a*b;return s;/*return带回函数值,S就是返回值*/main()float aver,x,y;scanf(“%f%f”,&

4、x,&y);area=area(x,y);/*调用函数,得到返回值*/printf(“%f”,area);调用另一个函数的函数称为主调函数、被调用的函数称为被调函数;函数的四种形式:a)从使用的角度来分为用户函数和系统函数 b)从形式上分成有参函数和无参函数 c)从作用的范围分为外部函数和内部函数 d)从返回值的角度分成有返回值函数和无返回值函数void printstar()/*用户函数、无参、无返回值用户函数、无参、无返回值*/float area(float a,float b)/*用户函数,有参、有返回值用户函数,有参、有返回值*/printf(“*n)/*系统函数,有参、有返回值系统

5、函数,有参、有返回值*/getchar()/*系统函数,无参、有返回值系统函数,无参、有返回值*/5.2 函数的定义及构成函数要先定义后使用函数要先定义后使用,函数定义的一般格式为:函数定义的一般格式为:存储类型存储类型 数据类型数据类型 函数名函数名(形式参数表形式参数表)说明局部说明局部 语句局部语句局部 通常把函数名和形参的说明局部称为通常把函数名和形参的说明局部称为“函数头函数头,用花括号括起来的局部称为,用花括号括起来的局部称为“函数体。函数体。函数具有以下特征(1)存储类型 定义函数时存储类型 可以是extern或static两种关键字说明(2)数据类型 定义函数时数据类型是用来说

6、明该函数返回值的类型,可以是整型、字符型、实型、指针型和其它构造类型。如果省略,那么系统默认为int型。(3)函数名 函数名是一个标识符,它的命名规那么同变量相同。(4)形式参数表 形式参数简称形参)的说明形式如下:数据类型 形式参数1,数据类型 形式参数2,(5)函数体 由 括起来的局部称为函数体。由说明局部和语句局部组成(6)函数的返回值 返回值可以是常数、变量或表达式,也可以是指针,但不能是数组名或函数名。return 表达式;return 表达式;例如:return s;关于关于return语句说明如下:语句说明如下:1.1.如果不需要从被调函数带回返回值可以不要如果不需要从被调函数带

7、回返回值可以不要returnreturn语句。一种情况是将函数类型定义为语句。一种情况是将函数类型定义为voidvoid型,也叫空类型型,也叫空类型.例如:例如:void printstar()2 2、还可以用不带表达式的还可以用不带表达式的returnreturn作为函数的作为函数的逻辑结尾,这时,逻辑结尾,这时,returnreturn的作用是将控制权的作用是将控制权交给调用函数,而交给调用函数,而不是返回一个值不是返回一个值。也可以。也可以不用不用returnreturn。returnreturn;return语句是函数的逻辑结尾,不一定是函数的最后一条语句,一个函数中允许出现多个ret

8、urn语句,但每次只能有一个return语句被执行。if(x0)return-1;else if(x=0)return 0;else return 1;-1 x0Y=5.3 函数的调用使函数得以运行称为函数的调用使函数得以运行称为函数的调用函数调用格式函数调用格式:函数名函数名(实参表实参表);函数的调用过程是:函数的调用过程是:(1)如果是有参函数,那么如果是有参函数,那么C系统首先为函数的形式参数系统首先为函数的形式参数分配存储单元,将实参的值计算出后依次赋予对应的形参,分配存储单元,将实参的值计算出后依次赋予对应的形参,称为值传递传值,在称为值传递传值,在C语言中这种数据传递是单向的。语

9、言中这种数据传递是单向的。(2)执行函数体,根据函数中的数据类型定义,系统为执行函数体,根据函数中的数据类型定义,系统为其中的变量分配存储单元并执行函数体中的可执行语句。其中的变量分配存储单元并执行函数体中的可执行语句。当执行到当执行到“返回语句时,计算返回值返回主调函数继续返回语句时,计算返回值返回主调函数继续运行程序,如果是无返回值函数,那么省略此操作。系统运行程序,如果是无返回值函数,那么省略此操作。系统将释放本函数体中定义的变量静态型变量不释放,同将释放本函数体中定义的变量静态型变量不释放,同时收回分配给形参的存储单元。如果是时收回分配给形参的存储单元。如果是“无参函数,那无参函数,那

10、么无需进行参数传递。么无需进行参数传递。input three integers:10 20 30sum=60int sum(int x,int y,int z)int m;m=x+y+z;return m;#include main()int i,j,k,s;printf(“input three integers:);scanf(“%d%d%d,&i,&j,&k);while(!(i=0&j=0&k=0)s=sum(i,j,k);printf(sum=%dn,s);【例【例5.3】编写程序,计算】编写程序,计算3个不为个不为0的整数之和的整数之和例如,求两个数中的最大数#include m

11、ax(float x,float y)float z;z=(xy)?x:y;return z;main()float a,b;int c;scanf(“%f,%f,&a,&b);c=max(a,b);rintf(“Max is%dn,c);函数调用时要注意以下问题:函数调用时要注意以下问题:(1)如果实参表中包含多个实参,那么各实参用如果实参表中包含多个实参,那么各实参用逗号隔开,实参与形参的个数应相等,且类型应逗号隔开,实参与形参的个数应相等,且类型应一致。一致。(2)函数的调用也可以出现在表达式中。这时要函数的调用也可以出现在表达式中。这时要求函数带回一个确定的值以参加表达式的运算。求函数

12、带回一个确定的值以参加表达式的运算。s=5*sum(i,j,k);(3)对实参表求值的顺序对实参表求值的顺序Turbo C是按从右到左是按从右到左的顺序求值。的顺序求值。【例5.4】写出程序运行结果。#include int f(int a,int b)if(ab)return 1;else if(a=b)return 0;else return-1;main()int i=2,p;p=f(i,+i);/*传递的都是3*/printf(“%d,p);结果为:0(4)函数定义 的类型就是返回值的类型;函数调用时,如果return中的表达式类型与函数类型不一致,那么编译系统自动将表达式的类型转换成

13、函数的类型后返回。int max(float x,float y)float z;z=(xy)?x:y;return z;/*返回整型值*/输入:3.5,4.8(4)调用函数与被调用函数的相对位置关系 一个程序文件中可能包含假设干个函数,函数在其中所处的位置代表函数定义的顺序,同时也决定了它的作用域。假设:调用点位于被调用函数后那么不需说明,而调用点位于被调用函数前,那么必须进行函数声明后才能调用。声明时要说明被调用函数的返回值的类型、函数名、函数的形式参数表,其中形参都要在形参表中一一列举。函数声明的 格式为:类型名 被调用函数的函数名()【例5.5】编写函数,求一个整数的阶乘。#inclu

14、de main()int n;long fac(int);printf(input an integer:);scanf(%d,&n);printf(%d!=%ld,n,fac(n);input an integer:5 5!=120long fac(int x)int i;long y;if(x0)printf(data errorn);else for(i=1,y=1;i=x;i+)y=y*i;return y;假设被调用函数的函数值是整型或字符型,那么均可省略上述函数声明。例如,求两个数中的最大数如果已在所有函数定义之前,在函数的外部已做了函数声明,那么在各个主调函数中不必对所调用的函数

15、再作声明。例如:float f1(float,float);char f2(char);int f3(float);main()float f1(float a,float b)char f2(char c)int f3(float d)在main中不用对函数f1,f2,f3进行声明。(5)函数的调用可以是嵌套的,即在调用一个函数的过程中可以再调用另一个函数。C语言不允许嵌套定义,但可以嵌套调用。【例5.6】计算组合数 分析:分析:1、设计一个求阶乘的子函数、设计一个求阶乘的子函数 flog fac(int x)2、设计一个子函数、设计一个子函数 long cmn(int m,int n),回

16、收回收3个阶乘数,个阶乘数,其中其中m,n为的两个参数;定义一个变量为的两个参数;定义一个变量long fc,使之带回使之带回返回值;返回值;3、主函数调用、主函数调用cmn函数;函数;cmn函数三次调用函数三次调用fac函数;函数;4、在主函数中读入、在主函数中读入m、n的值,并分析的值,并分析m和和n的情况,最后的情况,最后输出计算结果。输出计算结果。#include main()int m,n;long fac(int);long cmn(int,int);printf(“input two integers:);scanf(“%d,%d,&m,&n);if(mn|m0|n0)print

17、f(“input error!n);else printf(“%ld,cmn(m,n);long fac(int x)/*在前在前*/int i;long y;for(i=1,y=1;i=x;i+)y=y*i;return y;long cmn(int m,int n)/*在后在后*/long fc;fc=fac(m);fc=fc/fac(n);fc=fc/fac(m-n);return fc;input two integers:9,5 126input two integers:4,8 input error!复 习1、模块化程序设计方法:函数4种形式2、调用函数的方法:值传递数据类型、函

18、数的位置#include#includefloat f()float f()int s=1;int s=1;float i,n=1,d=0,m;float i,n=1,d=0,m;scanf(%f,&n);scanf(%f,&n);for(i=1;in+1;i+)for(i=1;in+1;i+)m=s/i;m=s/i;d=d+m;d=d+m;s=-s;s=-s;return d;return d;调用与返回调用与返回main()main()float s;float s;s=f();s=f();printf(“%fn printf(“%fn,s);,s);传值main()int a,is_no

19、t=10;scanf(%d,&a);is_not=runnian(a);printf(%d,is_not);#include#include int runnian(int runnian(int bint b)int c;int c;if(b%100!=0&b%4=0|b%100=0&b%400!=0)if(b%100!=0&b%4=0|b%100=0&b%400!=0)c=1;c=1;else c=0;else c=0;return(c);return(c);5.4 函数的递归调用 C语言允许函数进行递归调用。即在调用一个函数的过程中,又出现直接或间接地调用该函数本身。前者称为直接递归,后

20、者称为间接递归。递归调用的函数称为递归函数。由于递归非常符合人们的思维习惯,而且许多数学函数、算法或数据结构都是递归定义的,因此递归调用颇具实用价值。、递归函数的特点递归函数常用于解决那些需要分屡次求解,并且每次求解过程根本类似的问题;递归函数内部对自身的每一次调用都会导致一个与原问题相似而范围要小的新问题;构造递归函数的关键在于寻找递归算法和终结条件;终结条件是为了终结函数的递归调用而设置的一个标记;注意:递归调用不应也不能无限制的执行下去,所以必须设置一个条件来检验是否需要停止递归函数的调用。终止条件的设置可以通过分析问题的最后一步求解而得到。、递归函数的设计递归问题的一般描述:用递归函数

21、求n!递归结束的条件:f(k)=常量递归计算公式:f(n)=含有f(n-1)的表达式函数递归的一般结构:数据类型 f(n)if(n=k)return(常量);else return(f(n-1)的表达式);【例5.7】用递归函数求n!。分析:首先将求n!的函数拿来用1、如果求n!可以通过求(n-1)!完成、而求(n-1)!必须要求出(n-2)!,以次类推,直到最后求出1!。这就是递归调用公式;2、那么当n为1时可得出结果就是1,1就是结束条件;有这种规律的计算问题就可以设计递归函数调结构程序#include 例例5.7float fac(int n)float f;if(n 1)f=fac(n

22、-1)*n;else if (n=0|n=1)f=1;else f=-1;return f;void main()int n;float y;printf(Input a integer number:);scanf(%d,&n);y=fac(n);if(y 0)printf(Error:%d 0,n);else printf(%d!=%.ld,n,y);【例5.8】用递归函数求fibonacci数列的某一项的值。#include int fib(int i)if(i=1&i=2)return 1;else return fib(i-1)+fib(i-2);main()int i;printf

23、(“Input the item of fibonacci:);scanf(%d,&i);printf(fib(%d)=%dn,i,fib(i);input the item of fibonacci:10fib(10)=55例 有5个人坐在一起,问第5个人多少岁?答,比第4个人大2岁。第4个人说他比第3个人大2岁,第3个人比第2个人大2岁,第2个人比第1个人大2岁,问第1个人时答复是10岁。第5个人到底多大?计算公式:计算公式:10(n=1)递归条件递归条件age(n)=age(n-1)+2(n 1)公式公式age(5)age(5)=age(4)+2=18age(4 )age(4)=age(

24、3)+2=16age(3)age(3)=age(2)+2=14age(2)age(2)=age(1)+2=12age(1)=10 返回回推阶段回推阶段 递推阶段递推阶段求解过程求解过程age 函数的调用过程函数的调用过程age(5)输出结果age(4)c=18age(3)c=16age(2)c=14age(1)c=12c=10void mainagen=5agen=4agen=3agen=2agen=1程序程序#include int age(int n)int c;if(n=1)c=10;else c=age(n-1)+2;return c;void main()printf(%d,age(

25、5);5.5 函数间的数据传递 函数间的数据传递是指主调函数向被调函数传送数据及被调函数向主调函数返回数据。函数间的数据传递可以通过参数(实参)、返回值、全局变量来实现。参数传递数据的方式主要有两种:值传递和地址传递 传值传递的是具体数据;传址是传递的变量数组元素或数组的地址。实质上两种方式均为值传递,为数值与地址值(地址值)5.5.1 值传递方式 值传递方式所传递的是参数值。调用函数时,将实参的值计算出来传递给对应的形参。实参对形参的值传递只是单向传递,不能由形参传结实参。这是由于在内存中实参和形参使用的是不同的存储单元;因此,在执行一个被调函数时,形参的值如果发生变化,并不会改变主调函数的

26、实参值。【例5.9】考察下面的程序,能否通过函数调用实现求变量的相反数。#include main()int x;void opposition(int);scanf(%d,&x);printf(Output before calling opposition:x=%dn,x);opposition(x);printf(Output after calling opposition:x=%dn,x);void opposition(int a)a=-a;printf(Output in opposition:a=%d n,a);-2output before calling oppositio

27、n:x=2output in opposition:a=-2output after calling opposition:x=2【例5.10】设一维数组存放了10个学生的成绩,求不及格的人数 int flag(float score)if(score60)return 1;else return 0;main()float score10;int i,num=0;printf(“input 10 scores:n);for(i=0;i10;i+)scanf(“%f,&scorei);num+=flag(scorei);/*传递元素*/printf(“the number of not pas

28、sed is%d,num);input 10 scores:90 85 50 45 70 76 92 69 83 89the number of not passed is 25.5.2 地址传递方式 地址传递方式不是传递数据本身,而是数据的内存单元的地址传递给形参简称传址;实参和形参共同占用相同的存储单元,因此在函数中改变了形参存储单元的值,将会使实参随之变化。可见,在形参和实参为地址传送方式时,被调用程序中对形参的操作实际上就是对实参的操作,间接的实现了数据的双向传递。【例5.11】数组a中存放了一个学生5门课程的成绩,求平均成绩。float average(float array5)in

29、t i;float av,sum=0;for(i=0;i5;i+)sum=sum+arrayi;av=sum/5;return av;main()float score5,av;int i;printf(input 5 scores:n);for(i=0;i5;i+)scanf(%f,&scorei);av=average(score);/*数组首地址数组首地址*/printf(average score is%5.2f,av);input 5 scores:84 72 90 87 65 average score is 79.60说明:用数组名也可用数组元素地址作函数参数 要求:在主调函数和

30、被调函数分别定义数组 且数组的类型应该一致执行机制:C编译系统只将实参数组的首地址传给形参数组关于形参数组:可以指定大小;float average(float array5)可以不指定大小,另设一个参数传递实参数组的大小;但在定义数组时在数组名空的方括号不可少;这时形参数组可以随实参数组而动态变化。例如被调函数中形参数组没有定义大小,由n来接收长度值float average(float array,int n)int i;float av,sum=0;for(i=0;in;i+)sum=sum+arrayi;av=sum/n;return av;main()float score15=84

31、,72,90,87,65;float score210=72,68,93,55,89,75,62,88,95,70;printf(average score1 is%5.2fn,average(score1,5);printf(average score2 is%5.2fn,average(score2,10);这种方式比较灵活这种方式比较灵活5.5.3 返回值方式 在调用函数后直接返回一个数据到主调函数中.注意以下几点:1定义函数时,在函数头应给出“数据类型,指出该函数返回值的数据类型。2定义函数时,函数体中应有“return(表达式);。3传递的数据可以是整型、实型、字符型及结构型等,但不

32、能传整个数组。4只能传递 1 个数据,而且只能是从被调函数将数据传给主调函数。5当被调用函数的数据类型与函数中return后面表达式的类型不一致时,表达式的值将被自动转换成函数的类型后传递给调用函数。【例】输入长方体的长宽高l,w,h,求体积.#include int vs(int a,int b,int c)int v;v=a*b*c;return v;main()int v,l,w,h;printf(“input length,width and height:n);scanf(“%d%d%d,&l,&w,&h);v=vs(l,w,h);printf(“v=%d n,v);问还要求:求出三

33、个面的面积,怎么办?5.5.4 全局变量传递方式 在程序执行的全程有效的变量称为全局变量又称外部变量。作用域:是从定义处开始到整个程序结束。同时,还可以被任何一个函数使用内存的使用:在整个程序的运行中一直占用着存储单元。作用:可以利用全局变量在函数间传递数据,使得 通过函数调用得到多个返回值。#include int s1,s2,s3;int vs(int a,int b,int c)int v;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;return v;main()int v,l,w,h;printf(input length,width and height:n);scan

34、f(%d%d%d,&l,&w,&h);v=vs(l,w,h);printf(v=%d s1=%d s2=%d s3=%dn,v,s1,s2,s3);input length,width and height:2 3 4v=24 s1=6 s2=12 s3=8【例5.14】外部变量与内部变量同名int a=3,b=5;max(int a,int b)int c;c=ab?a:b;return c;main()int a=8;printf(%d,max(a,b);运行结果为:8形参形参a、b的作用范围的作用范围局部变量局部变量a的作用范围的作用范围全局变量全局变量a,b的作用范围的作用范围说明好处

35、:设全局变量的作用是增加了函数间数据联系的渠道。缺点:(1)利用全局变量实现函数间的数据传递,削弱了函数的内聚性,从而降低了程序的可靠性和通用性。(2全局变量在程序的全部过程中都占用存储单元。由于外部变量的作用域是从定义处开始,直到整个文件结束,在外部变量定义位置之前的函数就不能共享它们。用extern对外部变量说明后,在定义外部变量位置之前的函数也能共享它们。max(int x,int y)int z;z=xy?x:y;return z;main()extern int a,b;printf(“%dn,max(a,b);int a=3,b=5;5.6 内部函数和外部函数语言程序中函数分为两类

36、:即内部函数和外部函数。它们以是否可以允许其它程序文件调用来区分的。允许其它程序文件调用的函数称为外部函数;不允许其它程序文件调用的函数称为内部函数;5.6.1 内部函数 一个源文件中定义的函数只能被本文件中的函数调用,而不能被其它文件中的函数调用,这种函数称为内部函数静态函数。使用关键字static定义内部函数,其格式为:static 数据类型 函数名(形参表);例如:static int f(int a,int b);内部函数的作用域:内部函数的调用范围只局限于本文件5.6.2 外部函数 外部函数是指允许其他文件调用的函数,使用关键字extern定义外部函数,其格式为:extern 数据类

37、型 函数名(形参表);例如:extern int f(int a,int b);系统默认:如在函数定义中没有说明extern或static那么默认为外部函数;在一个源文件的函数中调用其它源文件中定义的外部函数时,应用extern说明被调函数为外部函数。【例5.15】有一个字符串,内有假设干字符,现输入一个字符,判断字符串中是否包含该字符,假设有就输出该字符在字符串中的位置,否那么输出不包含此字符的信息。设计源程序,共分为三个源文件:file1文件:主函数功能:调用file2函数读入字符串和读入要查找的字符File2文件:功能:读入字符串Fie3文件;:功能:查找并输出查找信息。file1.c#

38、include main()extern input_string(),find_char();char c;static char str80;input_string(str);printf(Input a char:);scanf(%c,&c);find_char(str,c);file2.c#include extern input_string(char str80)printf(Input a string:);gets(str);file3.cextern find_char(char str,char ch)int i,flag=0;for(i=0;stri!=0;i+)if(

39、stri=ch)printf(%c has been found,the position is%d,ch,i+1);flag=1;break;if(flag=0)printf(%c is not includedin given string%sn,ch,str);Input a string:I am a teacherInput a char:mm has been found,the position is 4调试该程序的过程调试该程序的过程调试方法:1、分别录入三个源程序(file1.c,file2.c,file3.c)并编译F92、生成一个f.prj文件;方法是:调出主菜单(ALT

40、+p),写入文件名(f.prj),然后按下(ESC)键.另存为:f.prg.f.prg文件内容是:file1.obj file2.obj file3.obj3、对f.prg文件编译连接、CTRL+F9、运行,5.7 函数应用程序举例【例5.16】编写一个函数,求一个整数的所有正因子。#include void gene(int n)int d;for(d=1;d=n;d+)if(n%d=0)printf(%dn,d);main()int n;printf(Input integer n:);scanf(%d,&n);if(n=0)printf(must be positive!n);else

41、gene(n);51131751【例5.17】编写一个函数,求一个字符串中英文单词的个数。单词之间用空格符、换行符、跳格符隔开。#include int wordnum(char str)int i,num=1;char ch;for(i=0;(ch=stri)!=0;i+)num+;return num;I am a teacherThere are 4 words in the string.main()char string81;printf(Input a string:n);gets(string);printf(There are%d words in the string.n,w

42、ordnum(string);【例5.18】用选择法对数组中的 5 个元素由小到大排序。算法分析:经过一轮比较后,找出一个未经排序数中的最小值,并记录下所在位置。找出4个数共须5-1轮排序。a0 a1 a2 a3 a45 2 9 6 4 未排序时数据排序状态2 5 9 6 4 将5个数的最小值与a0交换后状态2 4 9 6 5 将余下的4个数的最小值与a1交换后状态2 4 5 6 9 将余下的3个数的最小值与a2交换后状态2 4 5 6 9 将余下的2个数的最小值与a4交换后,排序完成void sort(int array,int n)int i,j,k,temp;for(i=0;in-1;i

43、+)k=i;/*要放数据的下标,即位置*/for(j=i+1;jn;j+)if(arrayjarrayk)k=j;temp=arrayk;arrayk=arrayi;arrayi=temp;input the array:5 2 9 6 4 1 10 8 3 7the sorted array:1 2 3 4 5 6 7 8 9 10main()int a10,i;printf(input the array:n);for(i=0;i10;i+)scanf(%d,&ai);sort(a,10);printf(the sorted array:n);for(i=0;i1时,移动一个n片金盘的塔转

44、换为移动两个(n-1)片金盘的塔和移动一片金盘,而移动一个(n-1)片金盘的塔相应地被转换为移动两个(n-2)片金盘的塔和移动一片金盘,依此类推。因此得出以下的递归关系:h(1)=1递归条件 h(n)=2h(n-1)+1(n1)递归公式可得:h(1)=1,h(2)=3,h(3)=7,h(4)=15,下面给出将A针上的3个金盘借助B针移到C针上void hanoi(int n,char a,char b,char c)if(n=1)printf(“%c%cn,a,c);else hanoi(n-1,a,c,b);printf(“%c%cn,a,c);hanoi(n-1,b,a,c);main()

45、hanoi(3,A,B,C);ACABCBACBABCAC【例5.20】编写一个程序,从键盘分别读入一个学生的五科考试成绩,要求输出该学生的总成绩、平均成绩、最高成绩和最低成绩。算法分析:分别设计4个函数用来求totle、average、highest和lowest。在main函数中输入学生的5科成绩,然后依次调用对应的函数,输出结果。main()float score5;int i;float totle(float a,int n);float average(float a,int n);float highest(float a,int n);float lowest(float a,

46、int n);printf(input scores of the subject_1 to subject_5:n);for(i=0;i5;i+)scanf(%f,&scorei);printf(totle=%5.2fn,totle(score,5);printf(average=%5.2fn,average(score,5);printf(highest=%5.2fn,highest(score,5);printf(lowest=%5.2fn,lowest(score,5);float totle(float s,int n)int i;float sum=0;for(i=0;in;i+)

47、sum+=si;return sum;float average(float s,int n)return(totle(s,5)/n);float highest(float s,int n)int i;float max=s0;for(i=1;imax)max=si;return max;input scores of the subject_1 to subject_5:75 80 85 90 95totle=425.00average=85.00highest=95.00lowest=75.00float lowest(float s,int n)int i;float min=s0;for(i=1;in;i+)if(simin)min=si;return min;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁