实验楼的学习笔记
地址:https://www.shiyanlou.com/courses/57
- 函数的分类
- 从用户的角度:库函数;自定义函数
- 从函数的形式角度:有参函数(带回函数的值);无参函数(不带回函数的值)
有参函数:
一般形式为:
类型名 函数名(形式参数列表) { 函数体 }
例子:
#include<stdio.h>
int main()
{
int max(int x,int y); //声明 max 函数
int a = 10,b = 20;
int c;
c = max(a,b); //a, b 为实际参数;调用max函数,传递的是a,b的值给 max 函数。
printf("%d",c);
return 0;
}
int max(int x,int y) //int 代表的是返回值是 int 型
{
int z;
z = x>y ? x:y;
return (z);
注意:其中,x和y是形参,a和b是实参
无参函数
其一般形式为
类型名 函数名() { 函数体 }
例子:
void printstar ()
{
}
- 两种函数调用的方法
- 嵌套调用
例子:
输入四个整数,找出其中最大的整数。
include<stdio.h>
int main()
{
int max4(int a,int b,int c,int d);
int a,b,c,d,max;
printf("please enter 4 integer number:");
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); //声明max2
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;
else
return b;
}
- 递归调用
在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。
例子:
用递归的方法求n!
#include<stdio.h>
int main()
{
int fac(int n);
int n,y;
printf("please input an integer number:");
scanf("%d",&n);
if(n<0)
printf("data error"); //n不能小于0
else
{
y = fac(n);
printf("%d!=%d\n",n,y);
}
return 0;
}
int fac(int n)
{
int f;
if(n==0||n==1)
f = 1;
else
f = fac(n-1) * n;
return f;
}
相当于用n*(n-1)!
3.数组与函数
- 把数组的元素作为实参
数组元素可以作为函数实参,不能作为函数形参。因为形参是在函数被调用时临时分配的存储单元,不可能作为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)。在用数组元素作为函数实参时,把实参的值传给形参,是“值传递”的方式。
例子:输入 10 个数,要求输出其中值最大的元素和该数是第几个数。
解题思路:可以定义一个长度为 10 的数组。设计一个函数 max,用来求两个数中的大者。在主函数中定义一个变量 m,m 的初值为 a[0],每次调用 max 函数后的返回值存放在 m 中。用打擂台算法,将数组元素 a[1] 到 a[9] 与 m 比较,最后的到的 m 就是最大值。
#include<stdio.h>
int main()
{
int max(int x,int y);
int a[10],m,n,i;
printf("please enter 10 integer number:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
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\n it is the %dth number \n",m,n+1);
return 0;
}
int max(int x,int y)
{
return(x>y?x:y);
}
- 数组名作为函数参数
除了可以用数组元素作为函数的参数外,还可以用数组名做函数参数(包括实参和形参)。应当注意的是:用数组元素作为实参时,向形参变量传递的是数组所对应数组元素的值,而用数组名做函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址。
例子:有一个一维数组 score,内放 10 个学生成绩,求平均成绩。
解题思路:用一个函数 average 来求平均成绩,不用数组元素作为函数实参,而是用数组名作为函数的实参,形参也用数组名,在 average 函数中引用各数组的元素,求平均成绩并返回 main 函数。
#include<stdio.h>
int main()
{
float average(float array[10]);
float score[10],aver;
int i;
printf("please enter 10 scores:");
for(i=0;i<10;i++)
scanf("%f",&score[i]);
printf("\n");
aver = average(score); //注意这里调用函数时,向形参传递的是数组首元素的地址
printf("average score is %5.2f\n ",aver);
return 0;
}
float average(float array[10])
{
int i;
float aver,sum = 0;
for(i=0;i<10;i++)
sum = sum + array[i];
aver = sum / 10;
return(aver);
}
需要注意的是,主函数中调用 float average(float array[10]) 这个函数,使用的是
aver = average(score); 这个语句
将一开始定义的score[10]带入到 float average(float array[10])函数中。
课后习题
1.编写函数 fun,其功能是:用户输入一个数 m,打印 1~m 能被 7 或 11 整除的所有整数。
例如,如果传给 m 的值是 50,则程序输出:
7 11 14 21 22 28 33 35 42 44 49
#include<stdio.h>
int fun(int num){
if((num%7)==0 || (num%11)==0)
printf("%d\t",num);
}
int main()
{
int m;
scanf("%d",&m);
//调用函数
for(int i=0;i<m;i++)
fun(i+1);
return 0;
}
编写函数fun,其功能是将两个两位数的正整数a、b合并成一个整数放在c中。合并的方式是:将a数的十位和个位依次放在c数的十位和千位上,b数的十位和个位依次放在c数的百位和个位上。
例如,当a=45,b=12 时,调用该函数后,c=5142。
#include<stdio.h>
int fun(int a,int b){
int c;
c = a%10*1000 + a/10*10 + b/10*100 + b%10;
printf("%d",c);
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
//a,b必须是两位数
if(a<10 || a>99 || b<10 || b>99){
printf("Enter erro!");
return 0;
}
//调用函数
fun(a,b);
return 0;
}