文档库 最新最全的文档下载
当前位置:文档库 › c语言函数程序的理解

c语言函数程序的理解

#include
int main()
{void print_star(); //声明print_star函数
void print_message(); //声明print_message函数
print_star(); //调用print_star函数
print_message(); //print_message函数
print_star(); //调用print_star函数
return 0;
}

void print_star() //定义print_star函数
{
printf("****************\n"); //输出一行*号
}

void print_message() //定义print_message函数
{printf("How do you do!\n"); //输出一行文字信息
}





#include
int main()
{ int max(int x,int y); //对max函数的声明
int a,b,c;
printf("please enter two integer number:"); //提示输入数据
scanf("%d,%d",&a,&b); //输入两个整数
c=max(a,b); //调用max函数,有两个实参,大数赋给变量c
printf("max is %d\n",c); //输出大数c
}


int max(int x,int y) //定义max函数,有两个参数
{
int z; //定义临时变量z
z=x>y?x:y; //把x和y中大者赋给z
return(z); //把z作为max函数的值带回main函数
}







#include
int main()
{ int max(float x,float y);
float a,b;
int c;
scanf("%f,%f",&a,&b);
c=max(a,b);
printf("max is %d\n",c);
return 0;
}
int max(float x,float y)
{
float z;
z=x>y?x:y;
return(z);
}
如果将main函数中的c改为float型,,用%f格式符输出,输出2.000000,因为调用max函数得到的是int型,函数值为整数2




#include
int main()
{ float add(float x,float y);
float a,b,c;
printf("Please enter a and b:");
scanf("%f,%f",&a,&b);
c=add(a,b);
printf("sum is %f\n",c);
return 0;
}
float add(float x, float y)
{ float z;
z=x+y;
return(z);
}





输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。

#include
int main()
{int max4(int a,int b,int c,int d);
int a,b,c,d,max;
printf("please enter 4 interger numbers:\n");
scanf("%d%d%d%d",&a,&b,&c,&d);
max=max4(a,b,c,d);
printf("max=%d\n",max);
return 0;
}
int max4(int a,int b,int c,int d)
{int max2(int a,int b);
int m;
m=max2(a,b);
m=max2(m,c);
m=max2(m,d);
return(m);
}
int max2(int a,int b)
{if(a>=b)
return a; //若a>=b,将a作为函数返回值
else
return b;
}
在主函数中没有直接调用max2函数,因此在主函数中不必对max2函数作声明

改进:
#include
int main()
{int max4(int a,int b,int c,int d);
int a,b,c,d,max;
printf("please enter 4 interger numbers:\n");
scanf("%d%d%d%d",&a,&b,&c,&d);
max=max4(a,b,c,d);
printf("max=%d\n",max);
return 0;
}
int max4(int a,int b,int c,int d)
{int max

2(int a,int b);
return max2(max2(max2(a,b),c),d); //把函数调用作为函数参数
}
int max2(int a,int b)
{return(a>b?a:b);}



求第5个学生的年龄 下一个比上个大两岁
#include
int main()
{int age(int n);
printf("No.5,age:%d\n",age(5));
return 0;
}
int age(int n) //定义递归函数
{int c;
if(n==1)
c=10;
else c=age(n-1)+2; //年龄是前一个学生的年龄加2
return c;
}


递归函数:回溯和递推





用递归法求n!

#include
int main()
{int fac(int n);
int n;
int y;
printf("input an integer number:");
scanf("%d",&n); 易漏&
y=fac(n);
printf("%d!=%d\n",n,y); 易漏y 如果输入的数是10,最后会得出10!=。。。。这里的10就是n,得出的数是y。这样想就不会漏写
return 0;
}
int fac(int n)
{
int f;
if(n<0)
printf("n<0,data error!");
else if(n==0||n==1) //n=0或n=1时,n!=1
f=1; 注意
else f=fac(n-1)*n; 注意 //n>1时,n!=n*(n-1)
return(f);
}




Hanoi塔问题


#include
int main()
{
void hanoi(int n,char one,char two,char three); //对hanoi函数的声明
int m; //定义m
printf("input the number of diskes:"); //输出一句话“输入盘子的数”
scanf("%d",&m); //给输入的m一个位置,取地址
printf("The step to move %d diskes:\n",m); //输出一句话“移动盘子的步骤是”
hanoi(m,'A','B','C'); //使用hanoi函数
}
void hanoi(int n,char one,char two,char three) //定义hanoi函数,将n个盘子从“one”座移到“three”座
{
void move(char x,char y); //对move函数的声明
if(n==1) //如果n=1
move(one,three); 直接从A移到C
else 否则(即n大于1)
{
hanoi(n-1,one,three,two); // A C B A借助C移到B hanoi函数 把柱A上最上面的(n-1)个圆盘移到柱B
move(one,three); //A C A移到C move函数 把1个圆盘从A移到C
hanoi(n-1,two,one,three); //B A C B借助A移到C hanoi函数 把上面移到B的n-1个圆盘移到C
}
}
void move(char x,char y) //定义move函数
{
printf("%c-->%c\n",x,y); //输出移动的方向
}



用hanoi函数模拟小和尚的任务,用move函数模拟大和尚自己移盘


函数调用hanoi(n,one,two,three)表示将n个盘子从“one”座移到“three”座的过程(借助“two”座)

函数调用move(x,y)表示将1个盘子从x座移到y座的

过程




下面是3个盘子运行程序得到的结果
The step to move 3 diskes:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C

现在想想n=3时程序的路线

#include
int main()
{
void hanoi(int n,char one,char two,char three); //对hanoi函数的声明
int m; //定义m
printf("input the number of diskes:"); //输出一句话“输入盘子的数”
scanf("%d",&m); //给输入的m一个位置,取地址
printf("The step to move %d diskes:\n",m); //输出一句话“移动盘子的步骤是”
hanoi(m,'A','B','C'); //使用hanoi函数
}
void hanoi(int n,char one,char two,char three) //定义hanoi函数,将n个盘子从“one”座移到“three”座
{
void move(char x,char y); //对move函数的声明
if(n==1) //n=3 ,跳过
move(one,three);
else 否则(即n大于1)
{
hanoi(n-1,one,three,two); // A C B A借助C移到B hanoi(2,A,C,B) 把柱A上最上面的2个圆盘移到柱B
move(one,three); //A C A移到C move(A,C ) 把1个圆盘从A移到C
hanoi(n-1,two,one,three); //B A C B借助A移到C hanoi(2,B,A,C) 把上面移到B的2个圆盘移到C
}
}
void move(char x,char y) //定义move函数
{
printf("%c-->%c\n",x,y); //输出移动的方向
}





输入10个数,要求输出其中最大的元素和该数是第几个数(只是为了介绍如何用数组元素作为函数实参)

#include
int main()
{int max(int x,int y); //函数声明
int a[10],m,n,i; //定义数组a,长度为10,用来存放10个数
printf("enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]); //输入10个数给a[0]`a[9]
printf("\n");
for(i=1,m=a[0],n=0;i<10;i++)
{
if(max(m,a[i])>m) //若max函数返回的值大于m
{m=max(m,a[i]); //max函数返回的值取代m原值
n=i; //把此数组元素的序号记下来,放在n中
}
}
printf("The largest number is %d\nnit is the %dth number.\n",m,n+1); //n+1 因为序号从0开始,例如 如果n=6,a[6]是最大的数,序号从0开始,它是10个数中第7个数
}
int max(int x,int y) //定义max函数
{
return(x>y?x:y); //返回x和y中的大者
}


变量m用来存放当前已比较过的各数中的最大者。开始时设m的值为a[0],然后将m

与a[1]比,如果a[1]大于m,就以a[1]的值取代m的原值,下次以m的新值与a[2]比较。


if max(a[0],a[1])>a[0] 意思就是a[1]>a[0]
则 m=max(m,a[1]) 意思就是m=a[1]

错误 for循环的设定
#include
int main()
{int max(int x,int y);
int a[i],m,n,i; 应该定义数组长度为10
for(a[i]=0;i<10;i++) i=0
scanf("%d",&a[i]);
printf("input 10 integer numbers:");
for( i=0;n=0) for(i=1,m=a[0],n=0;i<10;i++)要设置i,m,n的初值
{ if(max(m,a[i])>m))
m=(max(m,a[i]);
n=i;
}
printf("the largest number is %d\nit is %dth number\n"m,n+1); m前面逗号
}
int max(int x,int y)
{
return(x>y?x:y);
}




有一个一维数组score,内放10个学生成绩,求平均平均成绩

#include
int main()
{float average(float array[10]); //函数声明
float score[10],aver; //定义一个一维数组score,长度为10 ,定义aver变量,表示平均数
int i; //定义i,用来控制数组
printf("input 10 scores:\n"); //输出“请输入10个学生成绩”
for(i=0;i<10;i++) //for循环控制输入10个数
scanf("%f",&score[i]); //输入,给a[0]`a[9]提供位置
printf("\n"); //回车
aver=average(score); //调用average函数
printf("average score is %5.2f\n",aver); //输出“平均数是。。。”
return 0;
}
float average(float array[10]) //定义average函数
{int i; //定义i
float aver,sum=array[0]; //定义aver, sum,sum的初值是array[0]
for(i=1;i<10;i++) //for循环,i从1到10
sum=sum+array[i]; //求和
aver=sum/10; //求平均
return(aver);
}

array是形参数组名,score是实参数组名,分别在其所在的函数中定义,不能只在一方定义
另外还有一些关于这个程序的分析这里不做深究,留到以后进一步思考。就是关于形参数组指定大小的问题。


前面一个例子是数组元素作函数实参,这个例子是数组名做函数实参和形参。 以后可以仔细对比一下。






有两个班级,分别有35名和30名学生,调用一个有average函数,分别求这两个班的学生的平均成绩。为简化,设两个班的学生数分别为5和10.

#include
int main()
{float average(float array[],int n); //声明average函数 函数类型float 函数名average 参数类型 数组的是float n是int
float score1[5]={98.5,97,91.5,60,55}; //定义长度为5的数组
float score2[10]={67.5,89.5,99,69.5,77,89.

5,76.5,54,60,99.5}; //定义长度为10的数组
printf("The average of class A is %6.2f\n",average(score1,5)); //用数组名score1和5作实参
printf("The average of class B si %6.2f\n",average(score2,10)); //用数组名score2和10作实参
return 0;
}
float average(float array[],int n) //定义average函数,未指定形参数组长度
{int i; //定义i
float aver,sum=array[0]; //定义 aver ,sum,sum初值为array[0] 注:array是数组的英文
for(i=1;isum=sum+array[i];
aver=sum/n;
return(aver);



用选择法对数组中10个整数按由小到大排序

#include
int main()
{void sort(int array[],int n); //sort是种类、分类的意思 函数类型void空函数 函数名sort 参数类型int 参数名 一个是数组一个是n
int a[10],i; //定义一个长度为10的数组a 定义i
printf("enter array:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort(a,10); //调用sort函数,a为数组名,大小为10
printf("The sorted array:\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
return 0;
}

void sort(int array[],int n)
{int i,j,k,t;
for(i=0;i{k=i; //
for(j=i+1;jif(array[j]k=j; //
t=array[k];array[k]=array[i];array[i]=t; //array[k]和array[i]借助t互换位置.

}
}

n=10,现在对走一下for循环的路线

i=0,i<9,成立 进入内循环 k=0,j=0+1,j<10,如果array[1]j=0+1+1,如果array[2]j=3,j=4,j=5,后面哪个数小就跟哪个数换
j=10,退出内循环 (j从0到9变化)

i=1,i<9成立 进入内循环 k=1,j=1+1=2,j<10,如果array[2]
。。。。

比较10个数9趟比较,第1趟中比较10-1次,第二趟中比较10-2次。。。








下面是复制的一个程序,来自于前面数组的内容 是对10个数进行比较的程序,与上面把10个数由小到大排序有相通之处,但是可以看到for循环的设置并不相同,可能是有两种表示方法,这个还有有待研究。
#include
int main()
{

int a[10];
int i,j,t;
printf("input 10 numbers:\n");
for(i=0;i<10;i++) //输入10个数给a[0]到a[9]
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++) //j由0变到8执行9次循环,实现9趟比较 第一个for嵌套第二个for,第二个for嵌套if语句
for(i=0;i<9-j;i++) //在每一趟中进行9-j次比较
if(a[i]>a[i+1]) //相邻两个数比较
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("the sorted numbers:\n");
for(i=0;i<10;i=i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}




有一个3*4的矩阵,求所有元素中的最大值
#include
int main()
{int max_value(int array[][4]);
int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}}; //对数组元素赋初值
printf("Max value is %d\n",max_value(a)); //max_value(a)为函数调用
return 0;
}
int max_value(int array[][4])
{int i,j,max;
max=array[0][0]; //先使变量max的初值等于矩阵中第一个元素的值
for(i=0;i<3;i++) //然后将矩阵中各个元素与max相比,每次比较厚都把“大者”,存放在max中
for(j=0;j<4;j++)
if(array[i][j]>max)max=array[i][j];
return(max);
}



C语言中在函数名或关键字钱加下划线是什么意思?

1、一般情况是标识该函数或关键字是自己内部使用的,与提供给外部的接口函数或关键字加以区分。
这只是一种约定,实际非要把这些函数或关键字提供给外部使用,语法上也没有限制。
2、如果下划线加在最前面,一般是微软的习惯,代表这个函数有相应的去掉下划线的函数或命令替代,比如:
VC中嵌入汇编:
__ASM xor eax, eax
可以写成 ASM xor eax, eax
比如_lopen可用CreateFile替代




有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后能求出平均分、最高分和最低分。

#include
float Max=0,Min=0;
int main()
{float average(float array[],int n);
float ave,score[10];
int i;
printf("Please enter 10 scores:");
for(i=0;i<10;i++)
scanf("%f",&score[i]);
ave=average(score,10);
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);
return 0;
}
float average(float array[],int n)
{int i;
float aver,sum=array[0];
Max=Min=array[0];
for(i=1;i{if(array[i]>Max)Max=array[i];
else if(array[i]sum=sum+array[i];
}
aver=sum/n;
return(aver);
}







#include
int main()
{int f(int);
int a=2,i;
for(i=0;i<3;i++)
printf("%d\n",f(a));
return 0;
}
int f(int a)
{auto int b=0;
static c=3;
b=b+1;
c=c+1;
return(a+b+c);
}

运行结果7 8 9
c被定义为静态局部变量,在函数第一次调用结束后,它并不释放,仍保留c的值为4。而第一次调用结束

后b的值为1,第二次调用开始b重新被赋初值为0.
静态局部变量是在编译时赋初值的,而对自动局部变量赋初值是在函数调用时进行的。





输入1到5的阶乘值

#include
int main()
{int fac(int n);
int i;
for(i=1;i<=5;i++) //先后5次调用fac函数
printf("%d!=%d\n",i,fac(i)); //每次计算并输出i!的值
return 0;
}
int fac(int n)
{static int f=1; //f保留了上次调用结束时的值
f=f*n; //在上次的f值得基础上再乘以n
return(f); //返回值f是n!的值
}




调用函数,求3个整数中的大者

#include
int main()
{int max();
extern int A,B,C;
printf("Please enter three integer numbers:");
scanf("%d%d%d",&A,&B,&C);
printf("max is %d\n",max());
return 0;
}
int A,B,C;

int max()
{int m;
m=A>B?A:B; //把A和B中的大者放在m中
if(C>m)m=C; //将A,B,C三者中的大者放在m中
return(m);
}




相关文档