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] = 2
why??因为

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