Coursera课程 《计算机程式设计》台湾大学 刘邦锋
Week4 Functions
函数主要分为两大类系统定义函数与使用者定义函数,例如printf和main。
例子:(sys-function.c)呼叫系统定义函数
#include <stdio.h> /* for printf and scanf */
#include <stdlib.h> /* for abs */
#include <math.h> /* for sin */
main()
{
    int i, j;
    double x, y;
    scanf("%d", &i);
    j = abs(i);
    printf("%d\n", j);
    scanf("%lf", &x);
    y = sin(x);
    printf("%f\n", y);
}需要使用的系统定义函数,可以在网络上查找到它存在于哪个库中,方便调用。比如说课程中提到的这个网址。
例子:(scanf-count.c)借由scanf的返回值掌握资料个数
#include <stdio.h>
int main()
{
    int sum = 0;
    int count = 0;
    int i;
    
    while (scanf("%d", &i) != EOF){
        sum += i;
        count++;
    }
    printf("%d\n", sum / count);
    return 0;
}如果定义一个接受一个整数参数i,并返回一个整数的函数myfuntion:
int myfunction(int i)
{
    int value;
    ...
    compute value according to i;
    ...
    return value;
}例子:返回一个整数的main
#include <stdio.h>
int main(void)
{
    return 0;
}例子:(leap-year-function.c)定义一个函数决定闰年
#include <stdio.h>
int leap_year(int y)
{
    int is_leap;
    is_leap = (y % 400 == 0) || ((y % 4 == 0) && !(y % 100 == 0));
    return is_leap;
}
int main(void)
{
    int year;
    int k;
    scanf("%d", &year);
    k = leap_year(year);
    printf("%d\n", k);
    return 0;
}可以重复使用写好的函数。重复的代码不仅会让程序冗长难以理解,而且很容易在重复撰写时出错。如果使用已经过验证的函数,则可以避免这些麻烦。
定义一个接受一个整数参数i,但不返回任何值的函数foo:
void foo(int i)
{
    ...
    process according to i;
    ...
    return;
}例子:(print-digits.c)印出一个数的各位数
#include <stdio.h>
void print_digits(int i)
{
    int index = 0;
    int digits[20];
    if (i < 0)
        return;
    while (i != 0){
        digits[index] = (i % 10);
        i /= 10;
        index++;
    }
    for (i = index - 1; i >= 0; i --)
        printf("%d\n", digits[i]);
    return;
}
int main(void)
{
    int i;
    scanf("%d", &i);
    print_digits(i);
    return 0;
}其实就是把重复的代码整合在函数里,可以简化代码。
函数原型:printf-scanf
int printf(char *format, ...);
int scanf(char *format, ...);例子:对多个变量作输出输入
printf("%d %p %f %f\n", int, addr, float, double);
scanf("%d%f%lf", &int, &float, &double)例子:(multi-io-message.c)输出夹杂其他字元
#include <stdio.h>
int main(void)
{
    int i;
    float f;
    double df;
    scanf("%d%f%lf", &i, &f ,&df);
    printf("int %d adr %p flt %f dbl %f\n",i &i, f, df);
    return 0;
}则如输入
-1 3.2 4.6
输出为
int -1 adr 0x7fff98a1f330 flt 3.200000 dbl 4.600000
就是说scanf也可以夹杂其他字元,但是输入形式一定要与其相对应,不然会读不全。
形式参数(formal parameter)就是写在被呼叫方函数的申明部分,所以一定是一个变量的类别。例如j就是test的形式参数。
void test(int j)实际参数(actual parameter)是呼叫方实际用以呼叫被呼叫函数的参数。实际参数可以是一个算式,并不一定是一个变量。
test(i);
test(3 + 7);例子:使用函数处理一个数组中的元素
void process_array(int array[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        process element array[i];
    return;
}
int main(void)
{
    int a[10];
    process_array(a,10);
    return 0;
}这里注意形式参数array申明要写成array[]。
例子:(partial-inc.c)增加部分阵列元素的值
#include <stdio.h>
void print_array(int array[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf("a[%d] = %d\n", i, array[i]);
    return;
}
void inc_array(int array[], int n)
{
    int i;
    printf("inc_array: array = %p\n", array);
    for (i = 0; i < n; i++)
        array[i]++;
    return;
}
int main(void)
{
    int i;
    int a[5];
    for (i = 0; i < 5; i++)
        scanf("%d", &(a[i]));
    printf("before inc_array\n");
    print_array(a, 5);
    inc_array(a, 5);
    printf("after first inc_array\n");
    print_array(a, 5);
    inc_array(&(a[1]), 2);
    printf("after second inc_array\n");
    print_array(a, 5);
    inc_array(&(a[2]), 2);
    printf("after third inc_array\n");
    print_array(a, 5);
    return 0;
}例子:(multi-dim-array-parameter.c)传递多维数组参数
#include <stdio.h>
void print_matrix(int a[4][3], int i, int j)
{
    printf("a[%d][%d] = %d\n", i, j, a[i][j]);
    return;
}
int main(void)
{
    int i, j;
    int array[3][4];
    for (i = 0; i < 3; i++)
        for (j = 0; j < 4; j++)
            scanf("%d", &(array[i][j]));
    printf("array[2][1] = %d\n", array[2][1]);
    print_matrix(array, 2, 1);
    printf("array[0][2] = %d\n", array[0][2]);
    print_matrix(array, 0, 2);
    return 0;
}注意,我们在main函数中申明的array是3,4,而print_matrix函数中申明的形式参数array是4,3。
输入
0 1 2 3
4 5 6 7
8 9 10 11输出
array[2][1] = 9
a[2][1] = 7
array[0][2] = 2
a[0][2] = 2why??因为

【C语言】Coursera课程《计算机程式设计》台湾大学刘邦锋——Week4课堂笔记
原文:https://www.cnblogs.com/IvyWong/p/9324315.html