[C.C++] 20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises08

323 0
Honkers 2025-5-23 18:25:01 来自手机 | 显示全部楼层 |阅读模式

20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises08

P114

  1. /*
  2. 编写一程序P114.C实现以下功能
  3. 编写一个简单计算器程序,输入格式为:data1 op data2。
  4. 其中data1和data2是参加运算的两个数(data1、data2必须定义为int,但二者相加可能超出int能表示的范围),
  5. op为运算符,它的取值只能是+、-、*、/、%。
  6. 编程可用素材:
  7. printf("Please input data1 op data2: ")、
  8. printf("\nError! chu shu wei 0.\n")。
  9. 程序的运行效果应类似地如图1、图2、图3、图4所示,图中的红色部分是从键盘输入的内容。
  10. Please input data1 op data2: 3000 + 2000
  11. 3000+2000=5000
  12. 图1 程序运行效果示例(加法)
  13. Please input data1 op data2: 3000 % 2000
  14. 3000%2000=1000
  15. 图2 程序运行效果示例(取余)
  16. Please input data1 op data2: 3000 % 0
  17. Error! chu shu wei 0.
  18. 图3 程序运行效果示例(取余时除数为0)
  19. Please input data1 op data2: 3000 / 0
  20. Error! chu shu wei 0.
  21. */
  22. #include <stdio.h>
  23. int main(void)
  24. {
  25. int data1, data2;
  26. char op;
  27. printf("Please input data1 op data2: ");
  28. scanf("%d %c %d", &data1, &op, &data2);
  29. // 先不做op输入的有效性检查
  30. if ('+' == op)
  31. {
  32. printf("\n%d%c%d=%.0lf", data1, op, data2, (double)(double)data1 + (double)data2);
  33. }
  34. else if ('-' == op)
  35. {
  36. printf("\n%d%c%d=%d", data1, op, data2, data1 - data2);
  37. }
  38. else if ('*' == op)
  39. {
  40. printf("\n%d%c%d=%.0lf", data1, op, data2, (double)(double)data1 * (double)data2);
  41. }
  42. else if ('/' == op)
  43. {
  44. if (0 == data2)
  45. {
  46. printf("\nError! chu shu wei 0.");
  47. }
  48. else
  49. {
  50. printf("%d%c%d=%d", data1, op, data2, data1 / data2);
  51. }
  52. }
  53. else if ('%' == op)
  54. {
  55. if (0 == data2)
  56. {
  57. printf("\nError! chu shu wei 0.");
  58. }
  59. else
  60. {
  61. printf("%d%c%d=%d", data1, op, data2, data1 % data2);
  62. }
  63. }
  64. return 0;
  65. }
复制代码

P755

  1. /*
  2. 编写一程序P755.C实现以下功能
  3.   从键盘读入一个等级成绩,输出对应的百分制成绩:A→95、B→85、C→75、D→65、E→55、F→45、G→35、H→25、I→15、J→0。
  4. 若输入的等级成绩非A~J,则输出Error。
  5.   编程可用素材:
  6. printf("please input the grade: ")、
  7. printf("\ngrade=…, score=…\n"…、
  8. printf("\ngrade=… Error\n"…。
  9.   程序的运行效果应类似地如图1和图2所示,图中的红色部分是从键盘输入的内容。
  10. please input the grade: A
  11. grade=A, score=95
  12. 图1 程序运行效果示例
  13. please input the grade: K
  14. grade=K Error
  15. */
  16. #include <stdio.h>
  17. int main(void)
  18. {
  19. int score = -1;
  20. char grade;
  21. printf("please input the grade: ");
  22. scanf("%c", &grade);
  23. switch (grade)
  24. {
  25. case 'A':
  26. score = 95;
  27. break;
  28. case 'B':
  29. score = 85;
  30. break;
  31. case 'C':
  32. score = 75;
  33. break;
  34. case 'D':
  35. score = 65;
  36. break;
  37. case 'E':
  38. score = 55;
  39. break;
  40. case 'F':
  41. score = 45;
  42. break;
  43. case 'G':
  44. score = 35;
  45. break;
  46. case 'H':
  47. score = 25;
  48. break;
  49. case 'I':
  50. score = 15;
  51. break;
  52. case 'J':
  53. score = 0;
  54. break;
  55. default:
  56. score = -1;
  57. }
  58. // 判断标志,给结果
  59. if (score != -1)
  60. {
  61. printf("\ngrade=%c, score=%d\n", grade, score);
  62. }
  63. else
  64. {
  65. printf("\ngrade=%c,Error\n", grade);
  66. }
  67. return 0;
  68. }
复制代码

对选择题的解析

14

  1. /*
  2. 1. 没有break语句,顺序从上往下匹配执行
  3. 2. 显然,每一次default都会执行
  4. 3. i从1增长到4,会有四个5累加到a,即20
  5. 4. i从1增长到4,其中1,2,3会有三次3累加,一次2累加,即11
  6. 5. 结果:31
  7. 坑死无数新手啊。。。。。
  8. */
  9. #include <stdio.h>
  10. int main(void)
  11. {
  12. int a = 0, i;
  13. for (i = 1; i < 5; i++)
  14. {
  15. switch (i)
  16. {
  17. case 0:
  18. case 3:
  19. a += 2;
  20. case 1:
  21. case 2:
  22. a += 3;
  23. default:
  24. a += 5;
  25. }
  26. }
  27. printf("%d\n", a);
  28. }
复制代码

17

  1. /*
  2. 1. 至少先做一次,再判断
  3. 2. 先自减,再使用,前缀运算符使用
  4. 3. 取非【翻转】运算
  5. 4. do...while最后一定要加上分号,因为是一个循环语句
  6. */
  7. #include <stdio.h>
  8. int main(void)
  9. {
  10. int x = 3;
  11. do
  12. {
  13. printf("%d ", x -= 2);
  14. } while (!(--x));
  15. }
复制代码

20

  1. /*
  2. 1. 没有break语句
  3. default乱跳:顺序从上往下匹配执行
  4. 只要default执行了,它之后的群魔case也会搭车再执行一次【邪恶啊】
  5. 2. 显然,每一次default都会执行
  6. 显然,case 0 每一次都会搭default的车执行
  7. 3. 'china'里的字符,无论匹配不匹配,default和case 0 都会执行
  8. 4. 结果:5,5
  9. 坑死无数新手啊。。。。。
  10. */
  11. #include <stdio.h>
  12. int main(void)
  13. {
  14. int v1 = 0, v2 = 0;
  15. char ch;
  16. while ((ch = getchar()) != '#')
  17. {
  18. switch (ch)
  19. {
  20. case 'a':
  21. case 'h':
  22. default:
  23. v1++;
  24. case '0':
  25. v2++;
  26. }
  27. }
  28. printf("%d,%d\n", v1, v2);
  29. }
复制代码

23

  1. /*
  2. 1. 什么时候可以整除,什么时候不能整除?
  3. 2. 跟踪x和i的变化,可以画表手工跟踪,这很有助于理解算法,也可以直接跑程序
  4. 3. 思考和运行相结合,是学习的一个好的思路
  5. */
  6. #include <stdio.h>
  7. int main(void)
  8. {
  9. int x, i;
  10. for (i = 1; i <= 50; i++)
  11. {
  12. x = i;
  13. if (x % 2 == 0)
  14. {
  15. x++;
  16. if (x % 3 == 0)
  17. {
  18. x++;
  19. if (x % 7 == 0)
  20. {
  21. x++;
  22. printf("%d", i);
  23. }
  24. }
  25. }
  26. }
  27. return 0;
  28. }
复制代码

24

  1. /*
  2. 常规写法
  3. 1. 再加上++等运算,就让新手抓瞎了
  4. 2. i取9 10 11,最后i增长为12
  5. 3. i对10取商后,取的是0,1,1
  6. 其中只有0匹配一次,执行一次,m,n增1
  7. 4. i的三次取值,default因为有break在前
  8. 只会在1,1匹配不到时执行两次,k,n增2
  9. 5. 最终m,n,k为1,3,2
  10. */
  11. #include <stdio.h>
  12. int main(void)
  13. {
  14. int i, m = 0, n = 0, k = 0;
  15. for (i = 9; i <= 11; i++)
  16. {
  17. switch (i / 10)
  18. {
  19. case 0:
  20. m++;
  21. n++;
  22. break;
  23. case 10:
  24. n++;
  25. break;
  26. default:
  27. k++;
  28. n++;
  29. }
  30. }
  31. printf("%d %d %d\n", m, n, k);
  32. }
复制代码

25

  1. /*
  2. 总结一下:
  3. for(条件①;条件②;条件③){
  4. 循环体④
  5. }
  6. 执行顺序如下:
  7. ①②④③ ②④③ ②④③... ...直到结束
  8. 但上面有个细节没有说到,就是②在最后结束时,仍然会执行判断,在判断结果为假时,就跳出循环
  9. 别有用心的人会在这个②上加上++或是--复合操作,这一步仍然会进行
  10. */
  11. #include <stdio.h>
  12. int main(void)
  13. {
  14. int s, i;
  15. for (s = 0, i = 1; i < 3; i++, s += i)
  16. ;
  17. printf("%d\n", s);
  18. }
  19. /*
  20. 分析:
  21. ① 这里为s=0,i=1
  22. ② 这里为i<3
  23. ④ 这里为空
  24. ③ 这里是i++,s+=i; 即i=i+1,s=s+i
  25. 分析,一目了然的是:i会从1增长到3,当3<3不成立时,跳出循环
  26. 循环的执行过程:
  27. A ①i 取初值,i=1,②判断1<3,满足,执行④③,则i=2,s=0+2=2
  28. B i=2,②判断2<3,满足,执行④③,则i=3,s=2+3=5
  29. C i=3,②判断3<3,不满足,循环终止,跳出
  30. 结束
  31. 输出的s为5
  32. 不好理解的地方:
  33. 1. 只要 ② 判断满足,即结果为真,就一定会执行 ④
  34. 2. 而 ④ 执行完后,紧跟着就一定会执行 ③
  35. 3. 这个程序,把 ③ 搞成了语句块【两条语句】
  36. 一般情况下,只有循环控制变量在这里变化,即i变化
  37. 这里让人易理不清的就是,s也在这里变化了
  38. 【关键】,这个s还要用上刚刚变化后的i的值
  39. 4. 在工程应用中,真的不会这样写,但在学习语法时,确实要对这一点有深入的理解
  40. */
复制代码

28

  1. /*
  2. (1)++或--放在变量前,就先做++或--、再用变量的值;放在变量后,则是先用变量的值,然后++或--。
  3.   (2)因为z初值为3、x初值为0、y初值为5,所以while (z-- > 0 && ++x < 5)将循环进行3次:z变为0(3次while时,先用z的值,为3、2、1,用后变为2、1、0)、x变为3、y变为2。
  4.   (3)当试图进行第4次循环时,此时z已为0,条件不成立,所以循环结束——当然z还要--后变为-1;对于while()里的&& ++x<5,由于是&&,当左边的条件不成立时,右边的就不会进行运算。因此,结果是x=3, y=2,z=-1。
  5.   (4)如果将while改为while (--z > 0 && ++x < 5),则输出结果为2,3,0,请自己思考一下。
  6. 另外,多个运算符构成的表达式,要开始注意到运算符的优先级和结合性
  7. */
  8. #include <stdio.h>
  9. int main(void)
  10. {
  11. int x = 0, y = 5, z = 3;
  12. while (z-- > 0 && ++x < 5)
  13. {
  14. y--;
  15. }
  16. printf("%d,%d,%d\n", x, y, z);
  17. }
复制代码

关于switch中的default讨论

  1. /*
  2. 将default置于switch的开头
  3. 闲得蛋疼的程序员啊
  4. 关键是他还要在中间加上一个break;
  5. 这种程序员如果混进了团队,一定要打死,往死里打;
  6. 如果面试官这么整,吐他口水,他不配当面试官;
  7. 如果老师这样出题,那你只有入坑蹲好,不要乱动;
  8. */
  9. #include <stdio.h>
  10. int main(void)
  11. {
  12. int x = 4;
  13. switch (x)
  14. {
  15. default:
  16. printf("\nDefault");
  17. case 1:
  18. printf("\ncase 1");
  19. case 2:
  20. printf("\ncase 2");
  21. break;
  22. case 3:
  23. printf("\ncase 3");
  24. }
  25. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4013
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行