标签:
用函数实现模块化程序设计(二)
一、函数的嵌套调用
C语言的函数定义是互相平行、独立的。即函数不能嵌套定义,但可以嵌套调用函数。即调用一个函数的过程中,又可以调用另一个函数
执行过程,如图:
例子:输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。
解题思路:
main中调用max1函数,找4个数中最大者
max1中再调用max2,找两个数中的大者
/* 输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。 */
#include "stdio.h"
void main()
{
int max1(int a,int b,int c,int d); /*对max1的声明*/
int a,b,c,d,max;
printf("请输入四个数字:");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
max=max1(a,b,c,d); /*调用max1函数,得到其中最大值,赋值给max*/
printf("max=%d \n",max);
return 0;
}
int max1(int a,int b,int c,int d)/*定义max1函数*/
{
int max2(int a,int b); /*max2的声明*/
int m;
m=max2(a,b); /*调用max函数,找出a和b的最大值*/
m=max2(m,c); /*调用max函数,找出m和c的最大值*/
m=max2(m,d); /*调用max函数,找出m和d的最大值*/
return(m); /*函数返回值是4个数的最大的*/
}
int max2(int a,int b)/*定义max2函数*/
{ if(a>=b)
return a;
else /*函数返回值是a和b中的大的*/
return b;
}
二、函数的递归调用
概念:在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。
例如:
int f(int x)
{
int y,z;
z=f(y);
return (2*z);
}
在调用f函数过程中,又调用f函数
练习1:有5个学生坐在一起,问第5个学生多少岁?他说比第4个学生大2岁,问第4个学生岁数,他说比第3个学生大2岁,问第3个学生,又说比第2个学生大2岁,问第2个学生,说比第1个学生大2岁,最后问第1个学生,他说是10岁,请问第5个学生多大
解题思路:要求第5个年龄,就必须先知道第4个年龄
要求第4个年龄必须先知道第3个年龄
以此类推age(5)=age(4)+2
age(4)=age(3)+2
…….. age(n)=age(n-1)+2
#include <stdio.h>
void main()
{
int age(int n);
printf("第五个人的年龄:%d\n",age(5));/*输出年龄*/
}
int age(int n)/*求年龄的递归函数*/
{
int c;/*变量c用做存放函数的返回值的变量*/
if(n==1)
c=10;
else
c=age(n-1)+2;/*执行age函数过程中又调用age函数*/
return(c);
}
运行结果:18
当主函数的位置在age函数以后,主函数不用再对age函数进行声明
age函数共被调用5次,其中四次是在age函数中调用,也就是递归调用4次,另一次是在主函数中使用的。
练习2:用递归方法求n!。
解题思路:递归的思路跟递推是相反的,是直接从目标出发解决,要求n!必须知道n-1,才能求出n!=(n-1)!*n。所以递归公式为:
n!=1 (n=1或n=0)
n!=n*(n-1)! (n>1)
/*用递归方法求n!*/
#include <stdio.h>
int main()
{int fac(int n);/*对被调函数fac声明*/
int n; int y;
printf("请输入n的值:");
scanf("%d",&n);
y=fac(n);/*调用fac函数*/
printf("%d!=%d\n",n,y);
return 0;
}
int fac(int n)/*定义fac函数*/
{
int f;
if(n<0)
printf("数据错误");/*如果输入的n<0,则不正确*/
else if(n==0||n==1)
f=1;/*当n=1或n=0时等于1*/
else f=fac(n-1)*n;/*递归调用fac*/
return(f);/*f就是n!*/
}
/*再求n!的时候一定要记得int数值范围,防止溢出*/
三、内部函数与外部函数
1)内部函数概念:如果一个函数只能被本文件中其他函数所调用,它称为内部函数
在定义内部函数时,在函数名和函数类型的前面加static,即:static 类型名 函数名(形参表)
2)外部函数概念:如果在定义函数时,在函数首部的最左端加关键字extern,则此函数是外部函数,可供其他文件调用。
如函数首部可以为extern int fun (int a, int b)
如果在定义函数时省略extern,则默认为外部函数
四、进制之间的转换
十进制转换为——>二进制:如6的二进制,算法
结果就为:0110,注意:结果要从下往上写。
二进制转化为——>十进制:如0110的十进制等于:22*1+21*0+20*0=6。
简而言之:十进制转二进,除2取余数;二进制转换为十进制,乘以2的幂数。
10进制数转换成8进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成8。
10进制数转换成16进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成16。
习题:
/*9、 编程实现将任意的十进制整数转换成任意R进制数(R在2-16之间)。(C语言)*/
#include <stdio.h>
void main()
{
//定义整型变量s,r分别代表十进制数跟r进制数
int s,r,a;
int i;
//定义数组用来存放转换所得数据
int cs[100];
//提示用户输入数据
printf("请输入一个十进制整数:");
//接收用户输入
scanf("%d",&s);
printf("请输入需要转换的进制数(2-16之间):");
scanf("%d",&r);
if(r<2||r>16){
printf("输入超出范围\n");
}else{
//十进制转换任意进制都是:十进制/任意进制取余
for(i=0;s!=0;i++){
cs[i]=s%r;
s=s/r;
}
}
//数组遍历的逆向打印
for(a=i;a>=0;a--){
printf("%d",cs[a]);
/*最终的结果不太正确,前几个数为乱码,具体自己也找不出原因在呢里*/
}
}
标签:
原文地址:http://www.cnblogs.com/gaozp/p/4872203.html