函数部分(一)
1.函数介绍
1.1 可以采用分组的方式管理程序里的语句每个语句分组叫做一个函数。
2.函数执行时间分配(调用时间)
2.1 多函数程序执行时的时间分配必须遵守以下规则:
整个程序的执行时间被分成几段,每段由一个函数使用。
不同时间段不能互相重叠并且所有时间段必须连续。
如果函数A把时间分配给函数B使用则函数B结束后必须把时间再还给函数A
2.2 多函数程序执行时总有一个函数在干活而且任何时候只能有一个函数在干活。
2.3 如果一个函数A把一部分工作交给函数B执行则函数B干完活以后必须是函数A继续
往下执行。
2.4 如果函数A把时间分配给函数B使用则它们之间存在函数调用关系。如果函数A把一部分工作交给函数B完成就表示它们之间存在函数调用关系。
2.5 函数A叫做调用函数,函数B叫做被调用函数。
2.6 函数调用关系只在被调用函数工作期间有效。
2.7函数调用语句可以产生函数调用关系
/*
* 函数演示
* */
#include <stdio.h>
void print(void) {
printf("1\n");
}
int main() {
print();
return 0;
}
3.函数调用时变量传递
3.1 变量只能在函数里使用,其他函数不可以使用,不同函数里的变量可以重名。
/*
* 函数演示
* */
#include <stdio.h>
void func(void) {
int val = 10;
}
int main() {
int val = 1000;
printf("val是%d\n", val);
return 0;
}
3.2 如果函数多次执行,每次执行的时候变量代表的存储区都不同。
3.3声明变量的时候可以使用volatile关键字,这种变量的内容可以被其它程序修改(这个从来没练过,我不太清楚)。
volatile int val;
3.4 函数调用过程中通常伴随着两个函数之间的数据传递。
3.5 数据传递存在两个完全相反的方向,一个方向是从调用函数向被调用函数,另一个方向是从被调用函数向调用函数,不论那个方向的数据传递都需要把数据记录在被调用函数的存储区里。
3.6 只能从被调用函数向调用函数传递一个数据,这个数据叫做被调用函数的返回值,被调用函数只能在最后一步才能传递返回值。
3.7 被调用函数需要提供一个专门的存储区用来存放返回值。
3.8 编写被调用函数的时候需要把这个存储区的类型名称写在函数名称前。
3.9 在被调用函数里使用return关键字向这个存储区里放返回值。调用函数里直接把函数调用语句作为数字使用就可以得到返回值。如果没有使用return关键字设置返回值这个时候返回值是一个随机数。
/*
* 返回值演示
* */
#include <stdio.h>
int read(void) {
int val = 0;
printf("请输入一个数字:");
scanf("%d", &val);
return val;
}
int main() {
int val = read();
printf("val是%d\n", val);
return 0;
}
3.10 调用函数得到返回值以后或者立刻使用,或者存放在别的存储区里。
3.11 如果函数没有返回值在编写的时候就应该在函数名称前写void。
3.12 如果函数名称前什么都没写在C89规范里表示函数有一个整数类型的返回值,在C99规范里不允许这样。
3.13 函数不可以用数组存放返回值。
4.函数参数(形参和实参)
4.1 可以从调用函数向被调用函数传递多个数据,这些数据的类型可以不同。
4.2 被调用函数需要为每个传递过来的数据提供一个专用的存储区。代表这些存储区的变量应该声明在函数名称后面的小括号里,这些变量叫做形式参数。
4.3 小括号里的所有内容叫做形式参数列表,每个形式参数的类型名称都不可以省略,被调用函数里就可以把形式参数当做变量使用。
/*
* 参数演示
* */
#include <stdio.h>
void add(int val, int val1) {
printf("结果是%d\n", val + val1);
}
int main() {
int val = 12, val1 = 26;
add(5, 9);
add(7 - 1, 6 * 3);
add(val, val1);
return 0;
}
4.4 调用带参数的函数时需要为每个参数提供一个对应的数字,这些数字叫做实际参数
4.5 只要能作为数字使用的内容都可以作为实际参数使用。如果函数没有形式参数就应该在小括号里写void,如果小括号里什么都不写表示函数有任意多个不确定类型的形式参数
4.6 被调用函数
*********************
* *
* *
* 形式参数 *
* val val1 *
* *** *** **** *
* *3* *8* *11* *
* *** *** **** *
*********************
^ ^ *
* * *
* * V 调用函数
*********************
* *
* 3 8 *
* 实际参数 *
* *
* *
* *
* *
*********************
5函数练习
5.1 通过调用函数,实现
1 X 9 = 9
2 X 8 = 16
3 X 7 = 21
4 X 6 = 24
5 X 5 = 25
代码如下:
/*
* 函数练习
* */
#include <stdio.h>
void func(int val, int val1) {
printf("%d X %d = %d\n", val, val1, val * val1);
}
int main() {
int num = 0;
for (num = 1;num <= 5;num++) {
func(num, 10 - num);
}
return 0;
}
5.2 通过编写函数来实现鸡兔同笼问题,鸡和兔的计算在被调函数中计算,并将结果返回给调用函数
/*
* 鸡兔同笼练习
* */
#include <stdio.h>
int rabbit(int heads, int legs) {
int num = 0;
for (num = 0;num <= heads;num++) {
if (4 * num + 2 * (heads - num) == legs) {
return num;
}
}
return -1;
}
int main() {
int heads = 0, legs = 0, result = 0;
printf("请输入头和脚的数量:");
scanf("%d%d", &heads, &legs);
result = rabbit(heads, legs);
if (result == -1) {
printf("没有找到答案\n");
}
else {
printf("兔子有%d只,鸡有%d只\n", result, heads - result);
}
return 0;
}
5.3 通过辗转相除法实现最大公约数计算,要求被调函数完成计算,并将结果传给调用函数
/*
* 函数练习
* */
#include <stdio.h>
int yue(int val, int val1) {
int max = val, min = val1, tmp = 0;
while (max % min) { //余数不是0表示两个数字之间不是整数倍关系
tmp = max % min; //得到余数并记录到tmp变量里
max = min;
min = tmp;
}
return min;
}
int main() {
int max = 0, min = 0;
printf("请输入两个数字:");
scanf("%d%d", &max, &min);
printf("最大公约数是%d\n", yue(max, min));
return 0;
}