#学习笔记 C语言模块化程序设计

实验楼的学习笔记
地址:https://www.shiyanlou.com/courses/57

  1. 函数的分类
  • 从用户的角度:库函数;自定义函数
  • 从函数的形式角度:有参函数(带回函数的值);无参函数(不带回函数的值)
    有参函数:
    一般形式为:
    类型名 函数名(形式参数列表) { ​ 函数体 }
    例子:
#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 ()
{

}
  1. 两种函数调用的方法
  • 嵌套调用

在这里插入图片描述
例子:

输入四个整数,找出其中最大的整数。

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;
}