函数习题以及知识点

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

(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

相关文章
|
2月前
|
编解码 算法 数据安全/隐私保护
手机常用压缩工具推荐,RAR,ZIP,7Z解压缩,zip解压缩,Bandizip,ZArchiver等解压工具
在手机上解压RAR、ZIP、7Z等格式文件时,选择一款功能强大的解压缩工具至关重要。本文介绍了多款实用的解压软件,如7Z解压缩、ZArchiver、RAR、Bandizip等,它们不仅支持多种压缩格式的解压和压缩,还具备文件管理、加密、分享、媒体预览等功能。无论是处理文档、图片还是视频,这些工具都能提供高效便捷的解决方案,满足日常使用需求。
845 0
|
12月前
|
存储 NoSQL Redis
Redis的RDB快照:保障数据持久性的关键机制
Redis的RDB快照:保障数据持久性的关键机制
251 0
|
设计模式 API 图形学
Unity精华☀️ 「设计模式」的终极详解!
Unity精华☀️ 「设计模式」的终极详解!
|
API 开发者 Python
FastAPI系列 4 -路由管理APIRouter
本文是FastAPI系列教程的第四部分,介绍了如何使用APIRouter进行路由管理,通过示例展示了将应用程序功能拆分到不同的模块和文件中,创建用户和书籍的API路由,以及在FastAPI主应用中包含这些路由的方法,并提供了运行结果和API交互文档的截图。
|
关系型数据库 MySQL 分布式数据库
PolarDB 开源评测
阿里云PolarDB,一款分布式云原生数据库,以其高性能(交易性能6倍于开源DB,分析性能高达400倍)、强可扩展性(秒级弹性伸缩)、良好兼容性(100%适配MySQL/PostgreSQL,高度兼容Oracle)和易用性(丰富的监控管理功能,灵活备份恢复)脱颖而出。它是应对高并发业务和突发流量的理想选择,尤其适合寻求高性能、高可用和高扩展性的企业。
276 2
|
存储 NoSQL Java
实现Spring Boot与Apache Cassandra的数据存储整合
实现Spring Boot与Apache Cassandra的数据存储整合
|
存储 ice 索引
经验大分享:PJSUA2开发文档
经验大分享:PJSUA2开发文档
310 0
|
移动开发 前端开发 JavaScript
html5 Canvas 绘制基本图形 从直线图形到使用路径 - 直线、矩形、路径、多边形、复杂组合图形
html5 Canvas 绘制基本图形 从直线图形到使用路径 - 直线、矩形、路径、多边形、复杂组合图形
331 0
html5 Canvas 绘制基本图形 从直线图形到使用路径 - 直线、矩形、路径、多边形、复杂组合图形
|
存储 Ubuntu Linux
linux系统中如何制作rootfs?详细教程
linux系统中如何制作rootfs?详细教程
394 0
|
存储 机器学习/深度学习 人工智能
『亚马逊云科技产品测评』在当前飞速发展的AI人工智能时代云服务技术哪家强?
『亚马逊云科技产品测评』在当前飞速发展的AI人工智能时代云服务技术哪家强?
319 0