20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises08
P114
- /*
- 编写一程序P114.C实现以下功能
- 编写一个简单计算器程序,输入格式为:data1 op data2。
- 其中data1和data2是参加运算的两个数(data1、data2必须定义为int,但二者相加可能超出int能表示的范围),
- op为运算符,它的取值只能是+、-、*、/、%。
- 编程可用素材:
- printf("Please input data1 op data2: ")、
- printf("\nError! chu shu wei 0.\n")。
- 程序的运行效果应类似地如图1、图2、图3、图4所示,图中的红色部分是从键盘输入的内容。
- Please input data1 op data2: 3000 + 2000
- 3000+2000=5000
- 图1 程序运行效果示例(加法)
- Please input data1 op data2: 3000 % 2000
- 3000%2000=1000
- 图2 程序运行效果示例(取余)
- Please input data1 op data2: 3000 % 0
- Error! chu shu wei 0.
- 图3 程序运行效果示例(取余时除数为0)
- Please input data1 op data2: 3000 / 0
- Error! chu shu wei 0.
- */
- #include <stdio.h>
- int main(void)
- {
- int data1, data2;
- char op;
- printf("Please input data1 op data2: ");
- scanf("%d %c %d", &data1, &op, &data2);
- // 先不做op输入的有效性检查
- if ('+' == op)
- {
- printf("\n%d%c%d=%.0lf", data1, op, data2, (double)(double)data1 + (double)data2);
- }
- else if ('-' == op)
- {
- printf("\n%d%c%d=%d", data1, op, data2, data1 - data2);
- }
- else if ('*' == op)
- {
- printf("\n%d%c%d=%.0lf", data1, op, data2, (double)(double)data1 * (double)data2);
- }
- else if ('/' == op)
- {
- if (0 == data2)
- {
- printf("\nError! chu shu wei 0.");
- }
- else
- {
- printf("%d%c%d=%d", data1, op, data2, data1 / data2);
- }
- }
- else if ('%' == op)
- {
- if (0 == data2)
- {
- printf("\nError! chu shu wei 0.");
- }
- else
- {
- printf("%d%c%d=%d", data1, op, data2, data1 % data2);
- }
- }
- return 0;
- }
复制代码
P755
- /*
- 编写一程序P755.C实现以下功能
- 从键盘读入一个等级成绩,输出对应的百分制成绩:A→95、B→85、C→75、D→65、E→55、F→45、G→35、H→25、I→15、J→0。
- 若输入的等级成绩非A~J,则输出Error。
- 编程可用素材:
- printf("please input the grade: ")、
- printf("\ngrade=…, score=…\n"…、
- printf("\ngrade=… Error\n"…。
- 程序的运行效果应类似地如图1和图2所示,图中的红色部分是从键盘输入的内容。
- please input the grade: A
- grade=A, score=95
- 图1 程序运行效果示例
- please input the grade: K
- grade=K Error
- */
- #include <stdio.h>
- int main(void)
- {
- int score = -1;
- char grade;
- printf("please input the grade: ");
- scanf("%c", &grade);
- switch (grade)
- {
- case 'A':
- score = 95;
- break;
- case 'B':
- score = 85;
- break;
- case 'C':
- score = 75;
- break;
- case 'D':
- score = 65;
- break;
- case 'E':
- score = 55;
- break;
- case 'F':
- score = 45;
- break;
- case 'G':
- score = 35;
- break;
- case 'H':
- score = 25;
- break;
- case 'I':
- score = 15;
- break;
- case 'J':
- score = 0;
- break;
- default:
- score = -1;
- }
- // 判断标志,给结果
- if (score != -1)
- {
- printf("\ngrade=%c, score=%d\n", grade, score);
- }
- else
- {
- printf("\ngrade=%c,Error\n", grade);
- }
- return 0;
- }
复制代码
对选择题的解析
14 - /*
- 1. 没有break语句,顺序从上往下匹配执行
- 2. 显然,每一次default都会执行
- 3. i从1增长到4,会有四个5累加到a,即20
- 4. i从1增长到4,其中1,2,3会有三次3累加,一次2累加,即11
- 5. 结果:31
- 坑死无数新手啊。。。。。
- */
- #include <stdio.h>
- int main(void)
- {
- int a = 0, i;
- for (i = 1; i < 5; i++)
- {
- switch (i)
- {
- case 0:
- case 3:
- a += 2;
- case 1:
- case 2:
- a += 3;
- default:
- a += 5;
- }
- }
- printf("%d\n", a);
- }
复制代码
17 - /*
- 1. 至少先做一次,再判断
- 2. 先自减,再使用,前缀运算符使用
- 3. 取非【翻转】运算
- 4. do...while最后一定要加上分号,因为是一个循环语句
- */
- #include <stdio.h>
- int main(void)
- {
- int x = 3;
- do
- {
- printf("%d ", x -= 2);
- } while (!(--x));
- }
复制代码
20 - /*
- 1. 没有break语句
- default乱跳:顺序从上往下匹配执行
- 只要default执行了,它之后的群魔case也会搭车再执行一次【邪恶啊】
- 2. 显然,每一次default都会执行
- 显然,case 0 每一次都会搭default的车执行
- 3. 'china'里的字符,无论匹配不匹配,default和case 0 都会执行
- 4. 结果:5,5
- 坑死无数新手啊。。。。。
- */
- #include <stdio.h>
- int main(void)
- {
- int v1 = 0, v2 = 0;
- char ch;
- while ((ch = getchar()) != '#')
- {
- switch (ch)
- {
- case 'a':
- case 'h':
- default:
- v1++;
- case '0':
- v2++;
- }
- }
- printf("%d,%d\n", v1, v2);
- }
复制代码
23 - /*
- 1. 什么时候可以整除,什么时候不能整除?
- 2. 跟踪x和i的变化,可以画表手工跟踪,这很有助于理解算法,也可以直接跑程序
- 3. 思考和运行相结合,是学习的一个好的思路
- */
- #include <stdio.h>
- int main(void)
- {
- int x, i;
- for (i = 1; i <= 50; i++)
- {
- x = i;
- if (x % 2 == 0)
- {
- x++;
- if (x % 3 == 0)
- {
- x++;
- if (x % 7 == 0)
- {
- x++;
- printf("%d", i);
- }
- }
- }
- }
- return 0;
- }
复制代码
24 - /*
- 常规写法
- 1. 再加上++等运算,就让新手抓瞎了
- 2. i取9 10 11,最后i增长为12
- 3. i对10取商后,取的是0,1,1
- 其中只有0匹配一次,执行一次,m,n增1
- 4. i的三次取值,default因为有break在前
- 只会在1,1匹配不到时执行两次,k,n增2
- 5. 最终m,n,k为1,3,2
- */
- #include <stdio.h>
- int main(void)
- {
- int i, m = 0, n = 0, k = 0;
- for (i = 9; i <= 11; i++)
- {
- switch (i / 10)
- {
- case 0:
- m++;
- n++;
- break;
- case 10:
- n++;
- break;
- default:
- k++;
- n++;
- }
- }
- printf("%d %d %d\n", m, n, k);
- }
复制代码
25 - /*
- 总结一下:
- for(条件①;条件②;条件③){
- 循环体④
- }
- 执行顺序如下:
- ①②④③ ②④③ ②④③... ...直到结束
- 但上面有个细节没有说到,就是②在最后结束时,仍然会执行判断,在判断结果为假时,就跳出循环
- 别有用心的人会在这个②上加上++或是--复合操作,这一步仍然会进行
- */
- #include <stdio.h>
- int main(void)
- {
- int s, i;
- for (s = 0, i = 1; i < 3; i++, s += i)
- ;
- printf("%d\n", s);
- }
- /*
- 分析:
- ① 这里为s=0,i=1
- ② 这里为i<3
- ④ 这里为空
- ③ 这里是i++,s+=i; 即i=i+1,s=s+i
- 分析,一目了然的是:i会从1增长到3,当3<3不成立时,跳出循环
- 循环的执行过程:
- A ①i 取初值,i=1,②判断1<3,满足,执行④③,则i=2,s=0+2=2
- B i=2,②判断2<3,满足,执行④③,则i=3,s=2+3=5
- C i=3,②判断3<3,不满足,循环终止,跳出
- 结束
- 输出的s为5
- 不好理解的地方:
- 1. 只要 ② 判断满足,即结果为真,就一定会执行 ④
- 2. 而 ④ 执行完后,紧跟着就一定会执行 ③
- 3. 这个程序,把 ③ 搞成了语句块【两条语句】
- 一般情况下,只有循环控制变量在这里变化,即i变化
- 这里让人易理不清的就是,s也在这里变化了
- 【关键】,这个s还要用上刚刚变化后的i的值
- 4. 在工程应用中,真的不会这样写,但在学习语法时,确实要对这一点有深入的理解
- */
复制代码
28 - /*
- (1)++或--放在变量前,就先做++或--、再用变量的值;放在变量后,则是先用变量的值,然后++或--。
- (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。
- (3)当试图进行第4次循环时,此时z已为0,条件不成立,所以循环结束——当然z还要--后变为-1;对于while()里的&& ++x<5,由于是&&,当左边的条件不成立时,右边的就不会进行运算。因此,结果是x=3, y=2,z=-1。
- (4)如果将while改为while (--z > 0 && ++x < 5),则输出结果为2,3,0,请自己思考一下。
- 另外,多个运算符构成的表达式,要开始注意到运算符的优先级和结合性
- */
- #include <stdio.h>
- int main(void)
- {
- int x = 0, y = 5, z = 3;
- while (z-- > 0 && ++x < 5)
- {
- y--;
- }
- printf("%d,%d,%d\n", x, y, z);
- }
复制代码
关于switch中的default讨论 - /*
- 将default置于switch的开头
- 闲得蛋疼的程序员啊
- 关键是他还要在中间加上一个break;
- 这种程序员如果混进了团队,一定要打死,往死里打;
- 如果面试官这么整,吐他口水,他不配当面试官;
- 如果老师这样出题,那你只有入坑蹲好,不要乱动;
- */
- #include <stdio.h>
- int main(void)
- {
- int x = 4;
- switch (x)
- {
- default:
- printf("\nDefault");
- case 1:
- printf("\ncase 1");
- case 2:
- printf("\ncase 2");
- break;
- case 3:
- printf("\ncase 3");
- }
- }
复制代码 |