• C语言练习题之函数部分


    对于C语言的练习题,笔者之前写过不少,而且还有函数,指针,图形……各种练习题,笔者都有涉及,恰巧今日练习了部分函数的练习题,趁热打铁,想要将其分享给各位老铁,希望老铁能给个一箭三连呀!!感激

    其实学习语法是次要的,主要在于将知识如何应用到实际中去,因此,练习题就是必不可缺少的部分,对于程序员而言,在力扣,牛客网,这两个热门的网站去练习题,是一个不错的选择!

    或不多说,言归正传,下面请看笔者的练习题!

    1.题目:利用递归方法求5!。

    2.题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

    3..题目:计算第五个人的年龄

    4.题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

    5.题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同

    1.

    C 练习实例26

    题目:利用递归方法求5!。

    程序分析:递归公式:fn=fn_1*4!

    下面请看笔者代码:

    1. //题目:利用递归方法求5!。
    2. //
    3. //程序分析:递归公式:fn = fn_1 * 4!
    4. #include <stdio.h>
    5. int fn(int n)
    6. {
    7. if (n == 1)
    8. return 1;
    9. else
    10. return n=n * fn(n - 1);
    11. }
    12. int main()
    13. {
    14. int n = 0;
    15. while (~scanf_s("%d", &n))
    16. {
    17. printf("%d\n", fn(n));
    18. }
    19. return 0;
    20. }

    代码的运行结果为:

    2.

    C 练习实例27

    题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

    程序分析:无。

    对于这等难度的练习题一开始没有思路,可以选择,由浅入深,一步步进行深入!从而破解该题!

    因此对于该题,笔者首先想到的是:将5个字符,以相反顺序打印出来。然后在根据此问题来进行思考题目的代码

    1. //题目;将5个字符,以相反顺序打印出来。
    2. #include <stdio.h>
    3. #include <string.h>
    4. int main()
    5. {
    6. char ch[6] = "abcde";
    7. int sz = strlen(ch);
    8. int left = 0;
    9. int right = sz - 1;
    10. while (left < right)
    11. {
    12. char tmp = ch[left];
    13. ch[left] = ch[right];
    14. ch[right] = tmp;
    15. left++;
    16. right--;
    17. }
    18. printf("%s\n", ch);
    19. return 0;
    20. }

    上述代码,将5个字符,以相反顺序打印出来。所以,根据此代码,可以进行选择性的增添,从而达到目的!

    笔者对于上述代码的更改就不做更多的讲述!

    下面请看笔者的函数写法:参考代码为:

    1. //利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
    2. #include
    3. void reverseSentence()
    4. {
    5. char c;
    6. c = getchar();
    7. if (c != '\n')
    8. {
    9. reverseSentence();
    10. putchar(c);
    11. }
    12. }
    13. int main()
    14. {
    15. printf("输入一个字符串: ");
    16. reverseSentence();
    17. return 0;
    18. }

    代码的运行结果为:

     上述代码,用到了几个库函数,对于不知道用法的读者,可以在https://cplusplus.com 这个网站进行搜索!学习!

    3.

    C 练习实例28

    题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

    程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。。

    根据题意,这个题目,将会是函数的真正典范!!如果你能自主写出来该题目,那么你将能够成功出师!

    1. #include <stdio.h>
    2. int reserve(int n)
    3. {
    4. if (n == 1)
    5. return 10;
    6. if (n > 1)
    7. return 2 + reserve(n - 1);
    8. }
    9. int main()
    10. {
    11. int n = 0;
    12. scanf_s("%d", &n);
    13. int ret = reserve(n);
    14. printf("%d\n",ret);
    15. }

    这个代码,可以实现想求第几个人的年龄,就能求出来,简短许多!毕竟规律在哪儿放着来!!

    代码的运行结果为:

     4.

    C 练习实例29

    题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

    对于该题目,可以选择创建数组来进行不多于五位数字的输入(不过该写法就得首先知道要输入的是几位数),也可以直接输入该数字来进行求!

    1.直接输入该数字进行求:参考代码为:

    1. //题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
    2. #include <stdio.h>
    3. int main()
    4. {
    5. long a, b, c, d, e, x;
    6. printf("请输入 5 位数字:");
    7. scanf("%ld", &x);
    8. a = x / 10000; /*分解出万位*/
    9. b = x % 10000 / 1000; /*分解出千位*/
    10. c = x % 1000 / 100; /*分解出百位*/
    11. d = x % 100 / 10; /*分解出十位*/
    12. e = x % 10; /*分解出个位*/
    13. if (a != 0) {
    14. printf("为 5 位数,逆序为: %ld %ld %ld %ld %ld\n", e, d, c, b, a);
    15. }
    16. else if (b != 0) {
    17. printf("为 4 位数,逆序为: %ld %ld %ld %ld\n", e, d, c, b);
    18. }
    19. else if (c != 0) {
    20. printf("为 3 位数,逆序为:%ld %ld %ld\n", e, d, c);
    21. }
    22. else if (d != 0) {
    23. printf("为 2 位数,逆序为: %ld %ld\n", e, d);
    24. }
    25. else if (e != 0) {
    26. printf("为 1 位数,逆序为:%ld\n", e);
    27. }
    28. }

    上述代码显得臃肿,而且不是该函数的写法!不是很建议!!!

    2.下面请看笔者对于函数的写法!!参考代码为:

    1. #include
    2. int the_mount_of_noumbles(int n) {
    3. int i = 0;
    4. while (n) {
    5. n /= 10;
    6. i++;
    7. }
    8. return i;
    9. }
    10. void print_noumbles(int n) {
    11. int i;
    12. while (n) {
    13. i = n % 10;
    14. n /= 10;
    15. printf("%d", i);
    16. }
    17. }
    18. int main() {
    19. int n;
    20. printf("输入一个数: ");
    21. scanf_s("%d", &n);
    22. printf("它是 %d 位数", the_mount_of_noumbles(n));
    23. print_noumbles(n);
    24. return 0;
    25. }

    上述代码,笔者定义了两个函数,分别实现:输入的数字有几位数,逆序打印该数字!!

    代码的运行结果为:

     3.假设知道输入的是几位数!请看参考代码!!

    选择创建数组来进行不多于五位数字的输入(不过该写法就得首先知道要输入的是几位数)

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int arr[10] = { 0 };
    5. int n = 0;
    6. scanf_s("%d", &n); //假设知道几位数
    7. int i = 0;
    8. for (i = 0; i < n; i++)
    9. {
    10. scanf_s("%d", &arr[i]);
    11. }
    12. int left = 0;
    13. int right = n - 1;
    14. while (left < right)
    15. {
    16. int tmp = arr[left];
    17. arr[left] = arr[right];
    18. arr[right] = tmp;
    19. left++;
    20. right--;
    21. }
    22. for (i = 0; i < n; i++)
    23. {
    24. printf("%d", arr[i]);
    25. }
    26. return 0;
    27. }

    代码的运行结果为:

     5.

    C 练习实例30 - 回文数

    题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

    程序分析:学会分解出每一位数。

    参考代码为:

    1. //题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
    2. //
    3. //程序分析:学会分解出每一位数。
    4. #include <stdio.h>
    5. int main()
    6. {
    7. long ge, shi, qian, wan, x;
    8. printf("请输入 5 位数字:");
    9. scanf_s("%ld", &x);
    10. wan = x / 10000; /*分解出万位*/
    11. qian = x % 10000 / 1000; /*分解出千位*/
    12. shi = x % 100 / 10; /*分解出十位*/
    13. ge = x % 10; /*分解出个位*/
    14. if (ge == wan && shi == qian) { /*个位等于万位并且十位等于千位*/
    15. printf("这是回文数\n");
    16. }
    17. else {
    18. printf("这不是回文数\n");
    19. }
    20. }

    代码的运行结果为:

     对于函数的习题,本次就到此结束,有兴趣的读者,请看笔者之前的练习题!!

  • 相关阅读:
    Spring扩展接口(3):BeanFactoryPostProcessor
    apt-mirror 制作麒麟桌面版内网源
    Google Earth Engine ——利用降水数据来实现
    组合控件——顶部导航栏——工具栏Toolbar
    实用的窗口管理软件:Display Maid for Mac
    Chrome 浏览器的 ChromeOptions 参数介绍,selenium 动态渲染必看
    eclipse配置maven,安装lombok,导入和创建springboot项目
    Talk Is Cheap,Show Me The Code: 三种语言个人框架压测(Java/Go/Rust)
    求求你别在用if进行参数校验了!!!
    腌萝卜很好吃
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/126807103