• C Primer Plus第九章编程练习答案


    学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出!

    1.设计一个函数min(x, y),返回两个double类型值的较小值。在一个简单 的驱动程序中测试该函数。

    1. #include
    2. double Min(double x, double y)
    3. {
    4. return x > y ? y : x;
    5. }
    6. int main(void)
    7. {
    8. double min_num = Min(20.0, 15.0);
    9. printf("min_num : %lf\n", min_num);
    10. min_num = Min(15.0, 20.0);
    11. printf("min_num : %lf\n", min_num);
    12. return 0;
    13. }

    2.设计一个函数chline(ch, i, j),打印指定的字符j行i列。在一个简单的驱 动程序中测试该函数。

    1. #include
    2. void chline(char ch, int i, int j)
    3. {
    4. for (int m = 0; m < i; m++)
    5. {
    6. for (int n = 0; n < j; n++)
    7. {
    8. printf("%c ", ch);
    9. }
    10. printf("\n");
    11. }
    12. }
    13. int main(void)
    14. {
    15. char ch = '0';
    16. int i = 0, j = 0;
    17. printf("请输入一个字符:");
    18. scanf("%c",&ch);
    19. printf("请输入行数:");
    20. scanf("%d", &i);
    21. printf("请输入列数:");
    22. scanf("%d", &j);
    23. chline(ch, i, j);
    24. return 0;
    25. }

    3.编写一个函数,接受3个参数:一个字符和两个整数。字符参数是待 打印的字符,第1个整数指定一行中打印字符的次数,第2个整数指定打印指 定字符的行数。编写一个调用该函数的程序。

    1. #include
    2. void chline(char ch, int i, int j)
    3. {
    4. for (int m = 0; m < j; m++)
    5. {
    6. for (int n = 0; n < i; n++)
    7. {
    8. printf("%c ", ch);
    9. }
    10. printf("\n");
    11. }
    12. }
    13. int main(void)
    14. {
    15. char ch = '0';
    16. int i = 0, j = 0;
    17. printf("请输入一个字符:");
    18. scanf("%c",&ch);
    19. printf("请输入一行中打印字符的个数:");
    20. scanf("%d", &i);
    21. printf("请输入指定打印字符的个数:");
    22. scanf("%d", &j);
    23. chline(ch, i, j);
    24. return 0;
    25. }

    4.两数的调和平均数这样计算:先得到两数的倒数,然后计算两个倒数 的平均值,最后取计算结果的倒数。编写一个函数,接受两个double类型的 参数,返回这两个参数的调和平均数。

    1. #include
    2. double Reconcile_the_average(double d1, double d2)
    3. {
    4. return 1.0 / ((1.0 / d1 + 1.0 / d2) / 2.0);
    5. }
    6. int main(void)
    7. {
    8. double ret = Reconcile_the_average(3.0,4.0);
    9. printf("ret : %lf\n", ret);
    10. ret = Reconcile_the_average(4.0, 5.0);
    11. printf("ret : %lf\n", ret);
    12. return 0;
    13. }

    5.编写并测试一个函数larger_of(),该函数把两个double类型变量的值替 换为较大的值。例如, larger_of(x, y)会把x和y中较大的值重新赋给两个变 量。

    1. #include
    2. void larger_of(double* d1,double* d2)
    3. {
    4. if (*d1 > *d2)
    5. *d2 = *d1;
    6. else
    7. *d1 = *d2;
    8. }
    9. int main(void)
    10. {
    11. double d1 = 1.0, d2 = 2.0, d3 = 3.0,d4 = 4.0;
    12. printf("d1 = %lf,d2 = %lf d3 = %lf,d4 = %lf\n", d1, d2, d3, d4);
    13. larger_of(&d1, &d2);
    14. larger_of(&d3, &d4);
    15. printf("d1 = %lf,d2 = %lf d3 = %lf,d4 = %lf\n", d1, d2, d3, d4);
    16. return 0;
    17. }

    6.编写并测试一个函数,该函数以3个double变量的地址作为参数,把最 小值放入第1个函数,中间值放入第2个变量,最大值放入第3个变量。

    1. #include
    2. void sort(double* d1, double* d2, double* d3)
    3. {
    4. double temp = 0.0;
    5. if (*d1 > *d2)
    6. {
    7. temp = *d1;
    8. *d1 = *d2;
    9. *d2 = temp;
    10. }
    11. if (*d1 > *d3)
    12. {
    13. temp = *d1;
    14. *d1 = *d3;
    15. *d3 = temp;
    16. }
    17. if (*d2 > *d3)
    18. {
    19. temp = *d2;
    20. *d2 = *d3;
    21. *d3 = temp;
    22. }
    23. }
    24. int main(void)
    25. {
    26. double d1 = 2.0, d2 = 3.0, d3 = 1.0;
    27. printf("排序前:d1 = %lf,d2 = %lf,d3 = %lf\n", d1, d2, d3);
    28. sort(&d1, &d2, &d3);
    29. printf("排序后:d1 = %lf,d2 = %lf,d3 = %lf\n", d1, d2, d3);
    30. return 0;
    31. }

    7.编写一个函数,从标准输入中读取字符,直到遇到文件结尾。程序要 报告每个字符是否是字母。如果是,还要报告该字母在字母表中的数值位 置。例如,c和C在字母表中的位置都是3。合并一个函数,以一个字符作为 参数,如果该字符是一个字母则返回一个数值位置,否则返回-1。

    1. #include
    2. #include
    3. int position(char ch)
    4. {
    5. if (islower(ch))
    6. return ch - 'a' + 1;
    7. else if (isupper(ch))
    8. return ch - 'A' + 1;
    9. return -1;
    10. }
    11. void get_char_pos(void)
    12. {
    13. char ch = '0';
    14. printf("请输入一些字符:");
    15. while ((ch = getchar()) != EOF)
    16. {
    17. if (ch == '\n')
    18. continue;
    19. if (position(ch) != -1)
    20. printf("该字符是一个字母,且位于字母表第%d位\n", position(ch));
    21. else
    22. {
    23. printf("该字符不是一个字母\n");
    24. }
    25. }
    26. }
    27. int main(void)
    28. {
    29. get_char_pos();
    30. return 0;
    31. }

    8.第6章的程序清单6.20中,power()函数返回一个double类型数的正整数 次幂。改进该函数,使其能正确计算负幂。另外,函数要处理0的任何次幂 都为0,任何数的0次幂都为1(函数应报告0的0次幂未定义,因此把该值处 理为1)。要使用一个循环,并在程序中测试该函数。

    1. #include
    2. double power(double n, int p)
    3. {
    4. int i;
    5. double pow = 1.0;
    6. if ((0 == p) && (0 == n))
    7. {
    8. printf("0 to the 0 undefined, using 1 as the value.\n");
    9. return pow;
    10. }
    11. if (0 == n)
    12. {
    13. pow = 0.0;
    14. return pow;
    15. }
    16. if (0 == p)
    17. {
    18. return pow;
    19. }
    20. if (p > 0)
    21. {
    22. for (i = 1; i <= p; i++)
    23. {
    24. pow *= n;
    25. }
    26. return pow;
    27. }
    28. else
    29. {
    30. for (i = 1; i <= -p; i++)
    31. {
    32. pow *= 1 / n;
    33. }
    34. return pow;
    35. }
    36. }
    37. int main(void)
    38. {
    39. double x, xpow;
    40. int exp;
    41. printf("Enter a number and the integer power");
    42. printf(" to which\nthe number will be raised. Enter q");
    43. printf(" to quit.\n");
    44. while (scanf("%lf%d", &x, &exp) == 2)
    45. {
    46. xpow = power(x, exp);
    47. printf("%.3g to the power %d is %.5g.\n", x, exp, xpow);
    48. printf("Enter next pair of numbers or q to quit.\n");
    49. }
    50. printf("Hope you enjoyed this power trip -- bye!\n");
    51. return 0;
    52. }

    9.使用递归函数重写编程练习8。

    1. #include
    2. double power(double n, int p)
    3. {
    4. double pow = 1.0;
    5. if ((0 == p) && (0 == n))
    6. {
    7. printf("0 to the 0 undefined, using 1 as the value.\n");
    8. return pow;
    9. }
    10. if (0 == n)
    11. {
    12. pow = 0.0;
    13. return pow;
    14. }
    15. if (0 == p)
    16. {
    17. return pow;
    18. }
    19. if (p > 0)
    20. {
    21. return n * power(n, p - 1);
    22. }
    23. else
    24. {
    25. return power(n, p + 1) / n;
    26. }
    27. }
    28. int main(void)
    29. {
    30. double x, xpow;
    31. int exp;
    32. printf("Enter a number and the integer power");
    33. printf(" to which\nthe number will be raised. Enter q");
    34. printf(" to quit.\n");
    35. while (scanf("%lf %d", &x, &exp) == 2)
    36. {
    37. xpow = power(x, exp);
    38. printf("%.3g to the power %d is %.5g.\n", x, exp, xpow);
    39. printf("Enter next pair of numbers or q to quit.\n");
    40. }
    41. printf("Hope you enjoyed this power trip -- bye!\n");
    42. return 0;
    43. }

    10.为了让程序清单9.8中的to_binary()函数更通用,编写一个to_base_n() 函数接受两个在2~10范围内的参数,然后以第2个参数中指定的进制打印第 1个参数的数值。例如,to_base_n(129, 8)显示的结果为201,也就是129的 八进制数。在一个完整的程序中测试该函数。

    1. #include
    2. void to_base_n(int x, int base)
    3. {
    4. int r;
    5. r = x % base;
    6. if (x >= base)
    7. {
    8. to_base_n(x / base, base);
    9. }
    10. printf("%d", r);
    11. return;
    12. }
    13. int main(void)
    14. {
    15. int b;
    16. long int n;
    17. printf("Please enter a number (q to quit): ");
    18. while (scanf("%ld", &n) == 1)
    19. {
    20. if (n <= 0)
    21. {
    22. printf("Illegal data! Please enter again: ");
    23. continue;
    24. }
    25. printf("Please enter a base system number (2 - 10): ");
    26. while (scanf("%d", &b) != 1 || (b < 2 || b > 10))
    27. {
    28. while (getchar() != '\n')
    29. continue;
    30. printf("Please enteragain (2 - 10): ");
    31. }
    32. printf("%d in %d base system is: ", n, b);
    33. to_base_n(n, b);
    34. printf("\nYou can enter a number again (q to quit): ");
    35. }
    36. printf("Done.\n");
    37. return 0;
    38. }

    11.编写并测试Fibonacci()函数,该函数用循环代替递归计算斐波那契 数。

    1. #include
    2. void Fibonacci(int len)
    3. {
    4. int i;
    5. unsigned long t, x, y;
    6. x = y = 1;
    7. for (i = 0; i < len; i++)
    8. {
    9. printf("%lu\n", x);
    10. t = x + y;
    11. x = y;
    12. y = t;
    13. }
    14. return;
    15. }
    16. int main(void)
    17. {
    18. int n;
    19. printf("Please enter a integer (<= 0 or q to quit): ");
    20. while (scanf("%d", &n) == 1)
    21. {
    22. printf("Top %d items of Fibonacci sequence:\n", n);
    23. Fibonacci(n);
    24. printf("You can enter again (<= 0 or q to quit): ");
    25. }
    26. printf("Done.\n");
    27. return 0;
    28. }

  • 相关阅读:
    数据结构学习——第一章了解数据结构
    专利交底书怎么写 -
    GEE开发之Modis_LAI数据分析和获取
    前馈神经网络
    同比增长29.89%,长城汽车9月销售新车超12万辆
    最新,2022年国自然立项数量统计出炉
    Redis介绍
    记宝塔使用webhook自动化同步gitee代码
    二进制部署ETCD单机版
    我的创业之路:3个月的经历与回顾
  • 原文地址:https://blog.csdn.net/sakura0908/article/details/130895571