函数习题以及知识点

简介: 函数习题以及知识点

(1)知识点

(1)return只能返回一个值,不能返回两个 例如:return a,b;这是错误的写法。

(2)数组名本来就是地址

(3)函数的形式参数和实际参数可以同名

(4)函数主调函数和被调函数可以不在一个文件夹 #include ".h那个函数名"

(5)函数设计应该追求高内聚低耦合(函数的独立相对来说比较高)

(6)函数要尽可能的少使用全局变量,参数也不宜过多

(7)内存空间包括栈区(储存局部变量、临时参数等 出程序时就被回收释放 用一会儿就不用了就被销毁了 )、堆区(动态内存分配的)、静态区(静态变量static、全局变量)。所以函数的形式参数在栈中保存。

(2)函数返回两个变量

代码展示:

1. #include <stdio.h>
2. void test(int arr[])
3. {
4.  arr[0] = 10;
5.  arr[1] = 20;
6. }
7. int main()
8. {
9.  int arr[2] = { 0 };
10.   test(arr);
11.   printf("%d %d", arr[0], arr[1]);
12.   return 0;
13. }

(1)数组名本来就是地址(2)数组传参,传的是首元素的地址,避免空间浪费

(3)打印100-200之内的素数

代码展示:

1. #include <stdio.h>
2. int sushu(int n)
3. {
4.  int j = 0;
5.  for (j = 2; j < n; j++)
6.  {
7.    if (n % j == 0)
8.      return 0;
9.  }
10.   if (j == n)
11.     return 1;
12. }
13. int main()
14. {
15.   int i = 0;
16.   for (i = 100; i <= 200; i++)
17.   {
18.     if (sushu(i) == 1)
19.       printf("%d", i);
20.     else
21.       continue;
22.   }
23.   return 0;
24. }

优化代码展示:

1. #include <stdio.h>
2. #include <math.h>
3. int is_prime(int n)
4. {
5.  int j = 0;
6.  for (j = 2; j <= sqrt(n); j++)
7.  {
8.    if (n % j == 0)
9.    {
10.       return 0;
11.     }
12.   }
13.   return 1;
14. }
15. int main()
16. {
17.   int i = 0;
18.   for (i = 100; i < 201; i++)
19.   {
20.     if (is_prime(i) == 1)
21.     {
22.       printf("%d ", i);
23.     }
24.   }
25.   return 0;
26. }

注意比较这两个函数,学习一下更加简练的写法

(4)实现一个函数打印乘法口诀表,行数由自己指定

1. #include <stdio.h>
2. void chengfa(int n)
3. {
4.  int i = 0;
5.  int j = 0;
6.  for (i = 1; i <= n; i++)
7.  {
8.    for (j = 1; j <= i; j++)
9.    {
10.       printf("%d*%d=%-2d ", i, j, i * j);
11.     }
12.     printf("\n");
13.   }
14. }
15. int main()
16. {
17.   int line = 0;
18.   scanf("%d", &line);
19.   chengfa(line);
20.   return 0;
21. }

(5)用函数实现字符串逆序,不能使用C函数库中的字符串操作函数(对称的字符交换)

代码1展示:(用数组的方法)

1. #include <stdio.h>
2. int my_strlen(char* s)
3. {
4.  int count = 0;
5.  while (*s != '\0')
6.  {
7.    count++;
8.    s++;
9.  }
10.   return count;
11. }
12. void reverse_str(char arr[])
13. {
14.   int left = 0;
15.   int right = my_strlen(arr) - 1;
16.   while (left < right)
17.   {
18.     char a = arr[left];
19.     arr[left] = arr[right];
20.     arr[right] = a;
21.     left++;
22.     right--;
23.   }
24. }
25. int main()
26. {
27.   char arr[] = "abcdefg";
28.   reverse_str(arr);
29.   printf("%s", arr);
30.   return 0;
31. }

代码展示:(用指针的方法)

1. 
2. #include <stdio.h>
3. int my_strlen(char* s)
4. {
5.  int count = 0;
6.  while (*s != '\0')
7.  {
8.    count++;
9.    s++;
10.   }
11.   return count;
12. }
13. void reverse_str(char* a)
14. {
15.   char* left = a;
16.   char* right = a + my_strlen(a) - 1;
17.   while (left < right)
18.   {
19.     char b = *left;
20.     *left = *right;
21.     *right = b;
22.     left++;
23.     right--;
24.   }
25. }
26. int main()
27. {
28.   char arr[] = "abcdefg";
29.   reverse_str(arr);
30.   printf("%s", arr);
31.   return 0;
32. }

代码展示:(用递归的方法)

1. #include <stdio.h>
2. int my_strlen(char* s)
3. {
4.  int count = 0;
5.  while (*s != '\0')
6.  {
7.    count++;
8.    s++;
9.  }
10.   return count;
11. }
12. void reverse_str(char* a)
13. {
14.   int b = my_strlen(a);
15.   char c = *a;
16.   *a = *(a + b - 1);
17.   *(a + b - 1) = '\0';
18.   if (my_strlen(a + 1) > 1)
19.     reverse_str(a + 1);
20.   *(a + b - 1) = c;
21. 
22. }
23. int main()
24. {
25.   char arr[] = "abcdefg";
26.   reverse_str(arr);
27.   printf("%s", arr);
28.   return 0;
29. }

这个代码比较难以理解,就是首元素与末元素交换以后,再把末元素换成'\0' ,递归回归的时候,再把末元素一个一个的换成首元素。

(6)求一个数字 每位数之和

写一个递归函数,输入一个非负整数,返回成它的数字之和。

代码展示:

1. #include <stdio.h>
2. int DigitSum(size_t n)
3. {
4.  if (n < 9)
5.    return n;
6.  else
7.    return DigitSum(n / 10) + n % 10;
8. }
9. int main()
10. {
11.   size_t n = 0;
12.   scanf("%u", &n);
13.   int ret = DigitSum(n);
14.   printf("%d", ret);
15.   return 0;
16. }

非负整数 size_t   %u

相关文章
|
3月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
76 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
5月前
|
IDE 编译器 开发工具
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
40 0
|
6月前
|
存储 安全 编译器
【C++初阶】10 .习题①
【C++初阶】10 .习题①
66 2
|
6月前
|
存储 C语言
【C语言进阶篇】 数组常考笔试题万字解析(下)
【C语言进阶篇】 数组常考笔试题万字解析(下)
31 0
|
存储 算法 C语言
[数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(课后习题+答案解析)
[数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(课后习题+答案解析)
|
自然语言处理 C语言 C++
C进阶习题(下)
C进阶习题(下)
|
C语言
初识C语言习题以及知识点
初识C语言习题以及知识点
|
程序员 编译器 C语言
初阶C语言 第二章-------《函数》知识点(自定义函数,库函数,函数递归)+思维导图+基本练习题+超详细+通俗易懂(建议收藏)
初阶C语言 第二章-------《函数》知识点(自定义函数,库函数,函数递归)+思维导图+基本练习题+超详细+通俗易懂(建议收藏)