函数调用和递归问题:

1.嵌套循环:函数内部调用函数

void sp() {
printf("你好啊!\n");
}
int sprint(int n) {
for (int i = 1; i <= n; i++) {
sp();
}
}
int main() {
int n;
scanf("%d", &n);
sprint(n);
return 0;
}

2.链式访问:调用的优先(这里我认为是先执行最底层的函数),在对链式调用进行执行时,需将调用的函数一个个执行,之后将返回值进行返回。

这里解释一下printf函数的作用:

printf();是将所要打印的值在屏幕上显示出来,但是其返回值则是打印数的字符个数;这里要看清楚是返回值,多个printf()函数进行链式访问时,是将返回值返回到printf()函数。

例如:调用printf函数,printf("%d",24);这里打印的是24,但是返回值是打印数的字符数 ,为2。

代码演示:

int main() {
printf("%d\n", 24);
printf("%d\n", printf("%d", 24));
printf("%d", printf("%d", printf("%d", 24)));//

}

C语言 day10_调用函数

3.函数的声明和定义:

在大规模的函数中,我们将所要写的调用函数,独自写在一个.c文件里,不同的.c文件内部,函数的功能不同,并且将它们定义在头文件中(这里的头文件是自己定义的),这样再次使用是可以直接进行调用,在要执行的.c(目标)文件中引用头文件,并进行对应函数的调用。

例如:要写一个加法运算,进行函数的调用  这里有三个文件:add.c  、  add.h  、 test.c

①add.h头文件的声明定义:大致格式如下

#ifndef __add_h__
#define __add_h__


int add();
#endif // !__add_h__

②add.c功能函数:

#define _CRT_SECURE_NO_WARNINGS 1
int add(int x, int y) { //这里的参数可以省略
int z = x + y;
return z;
}

③test.c测试函数(main函数)

int main() {
int a, b;
scanf("%d%d", &a, &b);
int sum = add(a, b);
printf("%d", sum);
return 0;
}

C语言 day10_嵌套循环_02

C语言 day10_嵌套循环_03

4.递归函数的实现:

int print(int num) {
if (num > 9) { //判断是个两位数
print(num/10); //递归调用函数print(123)、print(12)、print(1);之后进行返回值的输出 1 2 3 4
}
printf("%d ", num % 10);//要想打印出每个数,1234%10=4,123%10=3,12%10=2,1%10=1
}
int main() {
int num;
printf("输入一个整数:");
scanf("%d", &num);
print(num);
}

C语言 day10_调用函数_04

5.通过函数的调用来求字符串的长度:这里不使用strlen();

数组传参时,传递的是数组中第一个元素的地址;下面有两种写法:

①int math (char*  arr)

②int marh (char  arr[}),这两个在本质上是相同的,我理解认为都是指针

int math(char arr1[]){//这里的arr是一个指针
int i=-1;
do { //do while 语句;
i++;
} while (arr1[i] != '\0');
return i;
//int i = 0;
//while (arr1[i] != '\0') { //使用的while语句
// i++;
//}
//return i;
}
//第二种写法:
//int math(char* arr) {
// int count = 0;
// while (*arr != '\0') {
// arr++;
// count++;
// }
// return count;
//}
int main() {
char arr[] = "abcdefg";
//int len = strlen(arr);
int len = math(arr);//自己写一个函数去求字符串的长度,这里arr传参,传的是第一个元素的地址
printf("字符的长的是:%d",len);
return 0;
}

C语言 day10_嵌套循环_05