当前位置:   article > 正文

C Primer Plus(第六版) 第六章(6.16.1~6.16.18)编程练习答案(仅供参考)_c primer plus 第六章编程题答案

c primer plus 第六章编程题答案

最近在复习C语言,在做编程练习的过程中自己也有些许收获,现将第六章编程练习题及个人答案发布如下,欢迎各位参考学习,若在参考过程中发现有何问题或者有其他思路请评论或私信我,感谢各位!

1.编写一个程序,创建一个包含26个元素的数组,并在其中储存26个小写字母。然后打印数组的所有内容。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #define SIZE 26
  4. int main(void)
  5. {
  6. int i;
  7. char num_1[SIZE];
  8. for (i = 0; i < 26; i++)
  9. {
  10. num_1[i] = 'a' + i;
  11. printf("%c", num_1[i]);
  12. }
  13. printf("\n");
  14. return 0;
  15. }

参考结果如下:

2.使用嵌套循环,按下面的格式打印字符:

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #define SIZE 5
  4. int main(void)
  5. {
  6. int i, j;
  7. for (i = 0; i < SIZE; i++)
  8. {
  9. for (j = 0; j <= i; j++)
  10. printf("$");
  11. printf("\n");
  12. }
  13. return 0;
  14. }

参考结果如下:

3.使用嵌套循环,按下面的格式打印字母:

F

FE

FED

FEDC

FEDCB

FEDCBA

注意:如果你的系统不使用ASCII或其他以数字顺序编码的代码,可以把字符数组初始化为字母表中的字母:

char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

然后用数组下标选择单独的字母,例如lets[0] 是'A' ,等等。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNING
  2. #include<stdio.h>
  3. #define SIZE 6
  4. int main(void)
  5. {
  6. int i, j;
  7. char array_1[SIZE] = { 0 };
  8. for (i = 0; i < SIZE; i++)
  9. {
  10. array_1[i] = 'F' - i;
  11. for (j = 0; j <= i; j++)
  12. printf("%c", array_1[j]);
  13. printf("\n");
  14. }
  15. return 0;
  16. }

参考结果如下:

4.使用嵌套循环,按下面的格式打印字母:

A

BC

DEF

GHIJ

KLMNO

PQRSTU

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #define SIZE 6
  4. int main(void)
  5. {
  6. int i, j, sum = 0;
  7. char array_1[SIZE] = { 0 };
  8. for (i = 0; i < SIZE; i++)
  9. {
  10. for (j = 0; j <= i; j++)
  11. {
  12. array_1[j] = 'A' + sum++;
  13. printf("%c", array_1[j]);
  14. }
  15. printf("\n");
  16. }
  17. return 0;
  18. }

参考结果如下:

 5.编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母:

          A

        ABA

      ABCBA

   ABCDCBA

ABCDEDCBA

打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、以升序打印字母、以降序打印字母。如果系统不使用ASCII或其他以数字顺序编码的代码,请参照练习3的解决方案。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #define SIZE 100
  4. int main(void)
  5. {
  6. int i, j, k, l, m;
  7. char letter, array_1[SIZE] = { 0 };
  8. printf("请输入一个大写字母:");
  9. scanf("%c", &letter);
  10. m = letter - 'A';
  11. for (i = 0; i <= m; i++)
  12. {
  13. array_1[i] = 'A' + i;
  14. for (j = i; j < m; j++)
  15. printf(" ");
  16. for (k = 0; k <= i; k++)
  17. {
  18. printf("%c", array_1[k]);
  19. }
  20. for (l = i - 1; l >= 0; l--)//无论是while、do while、还是for,都只有满足条件才能继续循环,不满足条件退出,一定记住呀!!!
  21. {
  22. printf("%c", array_1[l]);
  23. }
  24. printf("\n");
  25. }
  26. return 0;
  27. }

参考结果如下:

注: 无论是while、do while、还是for,都只有满足条件才能继续循环,不满足条件退出,一定记住呀!!!

思考:

  1. //有无办法减少一些循环?试试!
  2. //这个嵌套循环方法的本质是分布完成任务,第一个循环打印空格,第二个循环打印升序字母,第三个循环打印降序字母
  3. //我能不能创建一个数组,一个数组保存一行的内容,最后一起打印出来?
  4. //我暂时实现不了,因为如果不用嵌套循环来分步完成任务,会导致使用更多更复杂的语句来实现同样的效果
  5. #define ROW 100
  6. #define COLUMN 100
  7. int main(void)
  8. {
  9. int i, j, k, l, m;
  10. char letter, array_1[ROW][COLUMN] = { 0 };
  11. printf("请输入一个大写字母:");
  12. scanf("%c", &letter);
  13. m = letter - 'A';
  14. for (i = 0; i <= m; i++)
  15. {
  16. for (j = 0; j <= m; j++)
  17. {
  18. if (j < m)
  19. {
  20. array_1[i][j] = ' ';
  21. printf("%c", array_1[i][j]);
  22. }
  23. else
  24. {
  25. array_1[i][j] = 'A' + i;
  26. printf("%c", array_1[i][j]);
  27. }
  28. }
  29. printf("\n");
  30. }
  31. return 0;
  32. }

6.编写一个程序打印一个表格,每一行打印一个整数、该数的平方、该数的立方。要求用户输入表格的上下限。使用一个for 循环。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<math.h>
  4. int main(void)
  5. {
  6. int i;
  7. double min = 0.0, max = 0.0, c = 0.0;
  8. printf("请输入两个数字,我们将为您打印这两个数之间所有整数及其平方和立方:");
  9. scanf("%lf%*c%lf", &min, &max);
  10. if (min > max)
  11. {
  12. c = max;
  13. max = min;
  14. min = c;
  15. }
  16. for (i = (int)min; i < (int)max + 1 ; i++)
  17. {
  18. printf("%10d%10d%10d\n", i, (int)pow(i, 2), (int)pow(i, 3));
  19. }
  20. return 0;
  21. }

参考结果如下:

注:中间用了一段比较,若用户不按从小到大输入时可以通过这种比较方式处理。

7.编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词。提示:strlen() 函数(第4章介绍过)可用于计算数组最后一个字符的下标。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<string.h>
  4. #define SIZE 100
  5. int main(void)
  6. {
  7. int i, max;
  8. char word_1[SIZE] = { 0 };
  9. printf("请输入一个单词,我将为您倒序打印这个单词:");
  10. scanf("%s", word_1);
  11. max = strlen(word_1);
  12. for (i = max; i >= 0; i--)
  13. {
  14. printf("%c", word_1[i]);
  15. }
  16. printf("\n打印完成,感谢您的使用!\n");
  17. return 0;
  18. }

参考结果如下:

8.编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。在用户输入非数字之前,程序应循环处理用户输入的每对值。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. int main(void)
  4. {
  5. int m;
  6. double num_1 = 0.0, num_2 = 0.0;
  7. do{
  8. printf("请输入两个浮点数,我将为您打印两数之差除以两数乘积的值(输入非数字或右上角×号结束程序):");
  9. m = scanf("%lf%*c%lf", &num_1, &num_2);
  10. if(m == 2)
  11. printf("(%lf - %lf) / (%lf * %lf) = %lf\n",num_1, num_2, num_1, num_2, (num_1 - num_2) / (num_1 * num_2));
  12. } while (m == 2);
  13. printf("程序结束,感谢您的使用!\n");
  14. return 0;
  15. }

参考结果如下:

9.修改练习8,使用一个函数返回计算的结果。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. double CL(double num_1, double num_2);
  4. int main(void)
  5. {
  6. int m;
  7. double num_1 = 0.0, num_2 = 0.0;
  8. do {
  9. printf("请输入两个浮点数,我将为您打印两数之差除以两数乘积的值(输入非数字或右上角×号结束程序):");
  10. m = scanf("%lf%*c%lf", &num_1, &num_2);
  11. if (m == 2)
  12. printf("(%lf - %lf) / (%lf * %lf) = %lf\n", num_1, num_2, num_1, num_2, CL(num_1, num_2));
  13. } while (m == 2);
  14. printf("程序结束,感谢您的使用!\n");
  15. return 0;
  16. }
  17. double CL(double num_1, double num_2)
  18. {
  19. double ans = 0.0;
  20. ans = (num_1 - num_2) / (num_1 * num_2);
  21. return ans;
  22. }

参考结果如下:

 10.编写一个程序,要求用户输入一个上限整数和一个下限整数,计算从上限到下限范围内所有整数的平方和,并显示计算结果。然后程序继续提示用户输入上限和下限整数,并显示结果,直到用户输入的上限整数等于或小于下限整数为止。程序的运行示例如下:

Enter lower and upper integer limits: 5 9

The sums of the squares from 25 to 81 is 255

Enter next set of limits: 3 25

The sums of the squares from 9 to 625 is 5520

Enter next set of limits: 5 5

Done

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<math.h>
  4. int main(void)
  5. {
  6. int num_1 = 0, num_2 = 0, sum = 0, i = 0;
  7. do {
  8. printf("请输入一个上限整数和一个下限整数,我将为您计算并显示范围内所有整数的平方和(当上限等于下限时程序结束):");
  9. scanf("%d%*c%d", &num_1, &num_2);
  10. for (i = num_1; i <= num_2; i++)
  11. {
  12. sum += (int)pow(i, 2);
  13. }
  14. if (num_1 != num_2)
  15. printf("数1的平方为:%d\n数2的平方为:%d\n两数范围内的平方和为:%d\n", (int)pow(num_1, 2), (int)pow(num_2, 2), sum);
  16. sum = 0;
  17. } while (num_1 != num_2);
  18. printf("程序结束,感谢您的使用!\n");
  19. return 0;
  20. }

参考结果如下:

 11.编写一个程序,在数组中读入8个整数,然后按倒序打印这8个整数。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #define SIZE 8
  4. int main(void)
  5. {
  6. int i, num_1[SIZE] = { 0 };
  7. printf("请输入8个整数,我将为您倒序打印:");
  8. for (i = 0; i < SIZE; i++)
  9. scanf("%d", &num_1[i]);
  10. for (i = SIZE - 1; i >= 0; i--)
  11. printf("%d ", num_1[i]);
  12. printf("\n程序结束,感谢您的使用!\n");
  13. return 0;
  14. }

参考结果如下:

 12.考虑下面两个无限序列:

1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ...

1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + ...

编写一个程序计算这两个无限序列的总和,直到到达某次数。提示:奇数个-1相乘得-1,偶数个-1相乘得1。让用户交互地输入指定的次数,当用户输入0或负值时结束输入。查看运行100项、1000项、10000项后的总和,是否发现每个序列都收敛于某值?

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<float.h>
  4. #include<math.h>
  5. int main(void)
  6. {
  7. double i, num_1 = 0.0, sum_1 = 0.0, sum_2 = 0.0;
  8. do {
  9. printf("请输入项数(输入0或负值时结束):");
  10. scanf("%lf", &num_1);
  11. if (num_1 > 0)
  12. {
  13. for (i = 1.0; i <= num_1; i++)
  14. {
  15. sum_1 = sum_1 + (1.0 / i);
  16. sum_2 = sum_2 - (int)pow(-1, i) * (1.0 / i);
  17. }
  18. printf("当%d项时:1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ... = %lf\n", (int)num_1, sum_1);
  19. printf("当%d项时:1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + ... = %lf\n", (int)num_1, sum_2);
  20. sum_1 = 0;
  21. sum_2 = 0;
  22. }
  23. } while (num_1 > 0);
  24. printf("程序结束,感谢您的使用!\n");
  25. return 0;
  26. }

参考结果如下:

  13.编写一个程序,创建一个包含8个元素的int 类型数组,分别把数组元素设置为2的前8次幂。使用for 循环设置数组元素的值,使用do while 循环显示数组元素的值。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<math.h>
  4. #define SIZE 8
  5. int main(void)
  6. {
  7. int i, j = 0, num_1[SIZE] = { 0 };
  8. printf("2的前8次幂为:");
  9. do {
  10. for (i = 0; i < SIZE; i++)
  11. num_1[i] = (int)pow(2, i);
  12. printf("%d ", num_1[j]);
  13. j++;
  14. } while (j < SIZE);
  15. printf("\n程序结束,谢谢您的使用!");
  16. return 0;
  17. }

参考结果如下:

 14.编写一个程序,创建两个包含8个元素的double类型数组,使用循环提示用户为第一个数组输入8个值。第二个数组元素的值设置为第一个数组对应元素的累积之和。

例如,第二个数组的第4个元素的值是第一个数组前4个元素之和,第二个数组的第5个元素的值是第一个数组前5个元素之和。(用嵌套循环可以完成,但是利用第二个数组的第5个元素是第二个数组的第4个元素与第一个数组的第5个元素之和,只用一个循环就能完成任务,不需要使用嵌套循环)

最后,使用循环显示两个数组的内容,第一个数组显示成一行,第二个数组显示在第一个数组的下一行,而且每个元素都与第一个数组各元素相对应。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #define SIZE_1 8
  4. #define SIZE_2 8
  5. int main(void)
  6. {
  7. int i, j;
  8. double num_1[SIZE_1] = { 0 }, num_2[SIZE_2] = { 0 };
  9. printf("请输入8个值:");
  10. for (i = 0; i < SIZE_1; i++)
  11. {
  12. scanf("%lf", &num_1[i]);
  13. }
  14. for (i = 1; i < SIZE_1; i++)
  15. {
  16. num_2[0] = num_1[0];
  17. num_2[i] = num_1[i] + num_2[i - 1];
  18. }
  19. //此法仅需解决第一个元素的处理,其余元素按公式依次处理就行
  20. /*
  21. 法二:嵌套循环。
  22. for (j = 0; j < SIZE_2; j++)
  23. {
  24. for (i = 0; i <= j; i++)
  25. {
  26. num_2[j] += num_1[i];
  27. }
  28. }*/
  29. printf("第一个数组的元素为:");
  30. for (i = 0; i < SIZE_1; i++)
  31. {
  32. printf("%9.2lf", num_1[i]);
  33. }
  34. printf("\n第二个数组的元素为:");
  35. for (j = 0; j < SIZE_2; j++)
  36. {
  37. printf("%9.2lf", num_2[j]);
  38. }
  39. printf("\n程序结束,感谢您的使用!\n");
  40. return 0;
  41. }

参考结果如下:

 15.编写一个程序,读取一行输入,然后把输入的内容倒序打印出来。可以把输入储存在char类型的数组中,假设每行字符不超过255。回忆一下,根据%c转换说明,scanf()函数一次只能从输入中读取一个字符,而且在用户按下Enter 键时scanf()函数会生成一个换行字符(\n)。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #define SIZE 255
  4. int main(void)
  5. {
  6. int i = 0, max = 0;
  7. char cr_1[SIZE] = { 0 };
  8. printf("请随意输入,我将为您倒序打印所有的内容:");
  9. do {
  10. scanf("%c", &cr_1[i]);
  11. max = i;
  12. i++;
  13. } while (cr_1[i - 1] != '\n');//此题难点在于如何处理第一个输入,以及如何判断用户输入了Enter,若是用for循环就难以处理第一个数据,建议用do while。
  14. printf("您输入内容的倒序为:");
  15. for (i = max - 1; i >= 0; i--)//这里需要注意,若不想打印最后输入的Enter,那么在输入的循环内所记录的最大值需要减一(即减去最后的Enter)
  16. {
  17. printf("%c", cr_1[i]);
  18. }
  19. printf("\n程序结束,感谢您的使用!\n");
  20. return 0;
  21. }

参考结果如下:

16.Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投资10%)。Deirdre以5%的复合利息投资了100美元(也就是说,利息是当前余额的5%,包含之前的利息)。编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,并显示那时两人的投资额。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. int main(void)
  4. {
  5. int i;
  6. double da = 100.0, de = 100.0;
  7. for (i = 0; de <= da; i++)
  8. {
  9. da = da + 100 * 0.1;
  10. de = de + de * 0.05;
  11. }
  12. printf("需要 %d 年后Deirdre的投资额才会超过Daphne\n此时,Deirdre的投资额为:%lf,Daphne的投资额为:%lf\n", i, de, da);
  13. return 0;
  14. }

参考结果如下:

17.Chuckie Lucky赢得了100万美元(税后),他把奖金存入年利率8%的账户。在每年的最后一天,Chuckie取出10万美元。编写一个程序,计算多少年后Chuckie会取完账户的钱?

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. int main(void)
  4. {
  5. int i;
  6. double num_1 = 100.0;
  7. for (i = 0; num_1 > 0; i++)
  8. {
  9. num_1 = num_1 + num_1 * 0.08;
  10. num_1 -= 10;
  11. }
  12. printf("大概 %d 年后Chuckie会取完账户里的钱。\n", i);
  13. return 0;
  14. }

参考结果如下:

18.Rabnud博士加入了一个社交圈。起初他有5个朋友。他注意到他的朋友数量以下面的方式增长。第1周少了1个朋友,剩下的朋友数量翻倍;第2周少了2个朋友,剩下的朋友数量翻倍。一般而言,第N周少了N个朋友,剩下的朋友数量翻倍。编写一个程序,计算并显示Rabnud博士每周的朋友数量。该程序一直运行,直到超过邓巴数(Dunbar's number )。邓巴数是粗略估算一个人在社交圈中有稳定关系的成员的最大值,该值大约是150。

参考代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #define DUN 150
  4. int main(void)
  5. {
  6. int i, fn = 5;
  7. for (i = 1; fn < DUN; i++)//此程序没有什么难点,唯一需要注意的就是 i 要从 1 开始计数
  8. {
  9. fn = fn - i;
  10. fn = fn * 2;
  11. printf("第 %d 周,Rabund博士的朋友数量为:%d\n", i, fn);
  12. }
  13. return 0;
  14. }

参考结果如下:

总结:刚开始学的时候可以用不同方法来实现同样的效果,拓展自己写代码的思路。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/497692
推荐阅读
相关标签
  

闽ICP备14008679号