函数部分(二)
1.数组形参
1.1 数组也可以作为形式参数使用
1.2 数组形式参数不在被调用函数里
1.3 真正的形式参数不是数组,而是一个可以作为数组使用的变量
1.4 数组形式参数里的存储区在函数调用开始之前就已经存在了,函数调用结束后也依然存在
1.5 声明数组形式参数的时候可以省略数组里的存储区个数
1.6 使用数组形式参数的时候需要另外提供一个整数类型的形式参数表示数组里的
存储区个数
/*
* 数组形式参数演示
* */
#include <stdio.h>
void print(int arr[], int size) {
int num = 0;
for (num = 0;num <= size - 1;num++) {
printf("%d ", arr[num]);
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
print(arr, 5);
return 0;
}
1.7 使用数组形式参数可以实现双向数据传递,这种参数叫做输入输出参数
/*
* 输入输出参数演示
* */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void create(int arr[], int size) {
int num = 0;
for (num = 0;num <= size - 1;num++) {
arr[num] = rand() % 36 + 1;
}
}
int main() {
int arr[7] = {0}, num = 0;
srand(time(0));
create(arr, 7);
for (num = 0;num <= 6;num++) {
printf("%d ", arr[num]);
}
printf("\n");
return 0;
}
2.函数的显式声明与隐式声明
2.1 如果被调用函数写在下面编译器会猜测它的格式
2.2 编译器认为函数有一个整数类型的返回值并且有任意多个不确定类型的形式参数
2.3 参数只能是整数类型或双精度浮点类型这个猜测结果叫做函数的隐式声明,如果隐式声明和函数的真实格式不一致编译就会出错
2.4 函数大括号前面的部分可以单独写成一条语句,这种语句叫做函数声明语句。
2.5 函数声明语句里可以省略形式参数名称把函数声明语句写在文件开头叫函数的显式声明,这可以避免隐式声明。
2.6 除了主函数以外的所有函数都应该进行显式声明(一般声明在头文件中)
/*
* 函数声明演示
* */
#include <stdio.h>
double add(double, double);
int main() {
int val = add(4, 7);
printf("val是%d\n", val);
return 0;
}
double add(double val, double val1) {
return val + val1;
}
3.exit函数
3.1 exit标准函数可以立刻结束程序的执行为了使用这个标准函数需要包含stdlib.h头文件
3.2 这个函数需要一个整数类型的参数,这个参数的作用和主函数返回值的作用类似
/*
* exit标准函数演示
* */
#include <stdio.h>
#include <stdlib.h>
void func(void) {
printf("2\n");
//return ;
exit(0);
printf("3\n");
}
int main() {
printf("1\n");
func();
printf("4\n");
return 0;
}
4.递归函数(就是你搞不明白的一种函数调用)
4.1 c语言里函数可以调用自己这种函数叫递归函数
...
1 print()
*** ************
1 print()
*** ****************
1 print()
*** ********************
print()
*************************
4.2 如果一个问题可以采用一种方法不停的分解并且分解后的问题一定比原来的问题简单就可以采用递归函数解决。
递归函数编写步骤
1.编写语句解决分解后的每个小问题
(假设递归函数已经可以使用)
2.在递归调用语句之前编写分支解决
不可分解的情况(分支必须保证
函数可以结束)
/*
* 递归函数演示
* */
#include <stdio.h>
void print(void) {
printf("1\n");
print();
}
int main() {
print();
return 0;
}
4.3 用循环解决问题的方法叫递推,用递归函数解决问题的方法递归。
4.4 首先用最简单的参数测试递归函数的结果,然后把参数逐渐变得复杂继续测试。用这种方法可以搞清楚递归函数的实际执行效果。
/*
* 递归函数演示
* */
#include <stdio.h>
void print(int max) {
if (max == 1) { //最大数字是1的时候就不能再分解了
printf("1 ");
return ;
}
print(max - 1); //显示从1到max - 1之间所有的整数
printf("%d ", max);
}
int main() {
int max = 0;
printf("请输入最大数字:");
scanf("%d", &max);
print(max);
printf("\n");
return 0;
}
5.练习
5.1 采用递归的方法实现1~用户输入数字之和
/*
* 递归函数练习
* */
#include <stdio.h>
int sum(int max) {
if (max == 1) {
return 1;
}
return sum(max - 1) + max;
}
int main() {
int max = 0;
printf("请输入最大数字:");
scanf("%d", &max);
printf("结果是%d\n", sum(max));
return 0;
}
5.2 计算斐波那契数列(输入序号,输出对应的结果)
/*
* 递归函数练习
* */
#include <stdio.h>
int fei(int sn) {
if (sn <= 1) {
return 1;
}
return fei(sn - 2) + fei(sn - 1);
}
int main() {
int sn = 0;
printf("请输入一个数字:");
scanf("%d", &sn);
printf("结果是%d\n", fei(sn));
return 0;
}