你该逆袭了
红色标注的是:错误的答案
蓝色标注的是:正确的答案
绿色标注的是:做题时有疑问的地方
橙色标注的是:答案中需要着重注意的地方
练习题
- 一、复习题
- 1、
- 2、
- 我的答案:第4问 错误
- 正确答案:第4问的答案
- 3、
- 4、
- 5、
- 6、
- 我的答案:错误
- 正确答案:
- 7、
- 我的答案:正确
- 补充知识点:
- 8、
- 我的答案:(有理解不到位的地方,已经在程序中备注)
- 9、
- 我的答案:错误
- 正确答案:
- 10、程序中有注意点
- 二、编程练习
- 1、
- 我的答案:
- 1、方法一
- 2、方法二
- 2、
- 3、
- 我的答案:
- 标准答案:
- 知识点
- 4、不知道该怎么用两个感叹号替换原来的感叹号
- 我的答案:错误,不会做
- 正确答案:看完答案,就是自己想得太多
- 5、同样是第4题的疑问,其实就是自己想多了,很简单
- 正确答案:
- 6、
- 我的答案:
- 标准答案:利用 判断标记
- 7、没什么价值
- 疑问:局部变量,当程序运行结束,空间就释放了,可以这样使用吗?
- 8、
- 我的答案:
- 标准答案:
- 9、
- 我的答案:
- 标准答案:
- 10、这种简单,就不做了,一样的道理
- 标准答案:
- 11、
- 我的答案:自己在做的时候,注意点已经备注在代码中,当时也纠结了很久,逐行代码监视才找出的问题!!!
- 标准答案:其风格明显更简洁,规范
一、复习题
1、
我的答案:
false
true
false
2、
我的答案:第4问 错误
number >= 90 && number < 100;
ch != 'q' && ch != 'k';
number >= 1 && number <= 9 && number != 5;number < 1 && number>9; //错误
正确答案:第4问的答案
number < 1 || number>9;
3、
我的答案:
#include <stdio.h>int main()
{int weight = 0;int height = 0;scanf("%d %d", &weight, &height);if (weight < 100 && height>64){if (height >= 72){printf("you are very tall for your weight.\n");}else if (height < 72 && height>64){printf("you are tall for your weight.\n");}else if (weight > 300 && height < 48){printf("you are quite short for your weight.\n");}}else{printf("your weight is ideal.\n");}return 0;
}
4、
我的答案:
a.1
b.0
c.1
d.6
e.10
f.0
5、
我的答案:
1 *#% 2 *#% 3 $#% 4 *#% 5 *#% 6 $#% 7 *#% 8 *#% 9 $#% 10 *#% 11 *#% 所以结果是:*#%*#%$#%*#%*#%$#%*#%*#%$#%*#%*#%
6、
我的答案:错误
fat hat cat Oh no!
fat hat cat Oh no!
fat hat cat Oh no!
正确答案:
fat hat cat Oh no!
hat cat Oh no!
cat Oh no!
7、
我的答案:正确
#include <stdio.h>int main()
{char ch = 0;int lc = 0;int uc = 0;int oc = 0;while ((ch = getchar()) != '#'){if ('a' <= ch && ch <= 'z'){lc++;}else if (ch >= 'A' && ch <= 'Z'){uc++;}else{oc++;}}printf("%d lowercase, %d uppercase, %d other", lc, uc, oc);return 0;
}
补充知识点:
添加头文件 #include <ctype.h>
if(islower(ch))
if(isupper(ch))
8、
我的答案:(有理解不到位的地方,已经在程序中备注)
#include <stdio.h>int main()
{int age = 20;while (age++ <= 65){ //我自己理解不到位的地方if ((age % 20) == 0) //注意:此时 age 已经变成了 21 ,所以 if 语句不会执行 // 我还以为age 还是 20 呢,这是我理解不到位的地方{printf("you are %d.here is a raise.\n", age);}if (age = 65) //常量赋值{printf("you are %d.here is your gold watch.\n", age);}}return 0;
}//所以结果会一直死循环下去
9、
我的答案:错误
step1
step2
step1
step1
step3
step1
done
正确答案:
这是我理解不到位的地方:以为执行完printf(“step2\n”);之后,laststep:(“step3\n”);是不执行的。其实是我错了,这个laststep 还是要执行的!
10、程序中有注意点
我的答案:
#include <stdio.h>int main()
{char ch = 0;while ((ch = getchar()) != '#'){switch (ch){case '\n': {break;}case 'c':{printf("step 1\n");break;}case 'b':{printf("step 1\n");break;}case 'h':{printf("step 1\n");printf("step 3\n");break; //注意:必须添加 break,否则,default语句 也要再运行一遍!}default:{printf("step 1\n");printf("step 2\n");printf("step 3\n");}}if (ch == 'b'){break;}}printf("done\n");return 0;
}
二、编程练习
1、
我的答案:
1、方法一
while ((scanf("%c", &ch) == 1) && ch != '#')
#include <stdio.h>int main()
{int space = 0;int newline = 0;int other = 0;char ch = 0;while ((scanf("%c", &ch) == 1) && ch != '#'){switch (ch){case ' ':{space++;break;}case '\n':{newline++;break;}default:{other++;break;}}}printf("%d 个空格,%d 个回车键,%d 个其他字符\n", space, newline, other);return 0;
}
2、方法二
while ((ch = getchar()) != '#')
#include <stdio.h>int main()
{int space = 0;int newline = 0;int other = 0;char ch = 0;while ((ch = getchar()) != '#'){switch (ch){case ' ':{space++;break;}case '\n':{newline++;break;}default:{other++;break;}}}printf("%d 个空格,%d 个回车键,%d 个其他字符\n", space, newline, other);return 0;
}
2、
我的答案:
#include <stdio.h>int main()
{char ch = 0;int count = 0;while ((ch = getchar()) != '#'){count++;printf("%c 对应的ascii值是 %d ", ch, (int)ch);if ((count % 8) == 0){putchar('\n');}}return 0;
}
3、
我的答案:
#include <stdio.h>int main()
{int oucount = 0;int jicount = 0;double ousum = 0;double jisum = 0;int input = 0;while ((scanf("%d", &input) == 1) && input != 0){if (input % 2 == 0){oucount++;ousum += input;}else{jicount++;jisum += input;}}printf("一共有 %d 个偶数,平均值是:%lf\n", oucount, ousum / oucount);printf("一共有 %d 个奇数,平均值是:%lf\n", jicount, jisum / jicount);return 0;
}
标准答案:
#include <stdio.h>int main()
{int odd_sum = 0;int even_sum = 0;int odd_count = 0;int even_count = 0;int input = 0;while (scanf("%d", &input)) //这个地方跟我的答案不一样{if (input == 0){break;}if (input % 2 == 0){even_sum += input;even_count++;}else{odd_sum += input;odd_count++;}}printf("%d 个偶数,他们的平均值就是:%lf\n", even_count, (double)even_sum / (double)even_count);printf("%d 个奇数,他们的平均值就是:%lf\n", odd_count, (double)odd_sum / (double)odd_count);return 0;
}
知识点
1.0 * even_sum 将结果隐式转换为浮点型数据
printf("%d 个偶数,他们的平均值就是:%lf\n",even_count, 1.0 * even_sum / even_count);printf("%d 个奇数,他们的平均值就是:%lf\n",odd_count, 1.0 * odd_sum / odd_count);
4、不知道该怎么用两个感叹号替换原来的感叹号
我的答案:错误,不会做
#include <stdio.h>int main()
{int ch = 0;int count = 0;while ((ch = getchar()) != '#'){if (ch == '.'){ch = '!';count++;continue;}if (ch == '!'){printf("%s", "!!"); //该怎么用 两个感叹号 替代 原来的感叹号 ??count++;}}return 0;
}
正确答案:看完答案,就是自己想得太多
#include <stdio.h>int main()
{char ch = 0;int count = 0;while ((ch = getchar()) != '#'){if (ch == '.'){printf("!");count++;}else if (ch == '!'){printf("!!");count++;}else{putchar(ch);}}printf("\n一共进行 %d 次调换\n", count);return 0;
}
5、同样是第4题的疑问,其实就是自己想多了,很简单
正确答案:
#include <stdio.h>int main()
{char ch = 0;int count = 0;while ((ch = getchar()) != '#'){switch (ch){case '.':printf("!");count++;break;case '!':printf("!!");count++;break;default:putchar(ch);break;}}printf("\n一共进行 %d 次调换\n", count);return 0;
}
6、
我的答案:
#include <stdio.h>int main()
{char ch = 0;char now = 0;char pre = 0;int count = 0;while ((ch = getchar()) != '#'){now = ch;if (now == 'i' && pre == 'e'){count++;}pre = ch;}printf("%d 个 ei\n", count);return 0;
}
标准答案:利用 判断标记
#include <stdio.h>int main()
{char ch = 0;int flag = 0;int count = 0;while ((ch = getchar()) != '#'){switch (ch){case 'e':flag = 1; //标记break;case 'i':if (flag == 1) //标记{count++;flag = 0; //标记}break;default:flag = 0; //标记break;}}printf("一共出现了 %d 次\n", count);return 0;
}
7、没什么价值
我的答案:标准答案比较简单,就是数学式子罗列而已
#include <stdio.h>
#define JI 1000double salary(int x)
{double sum = 0;if (x >= 0 && x <= 40){sum = x * JI;}else{sum = 40 * JI + (x - 40) * 1.5 * JI;}return sum;
}double shui(double x)
{double shuijin = 0;if (x <= 300){shuijin = x * 0.15;}else if(x > 300 && x <= 450){shuijin = 45 + (x - 300) * 0.2;}else{shuijin = 45 + 30 + (x - 450) * 0.25;}return shuijin; //这样做可以吗? shuijin是在这个函数里面创建的
} //函数运行结束,这个函数的空间也就释放了,shuijin 也就没有,//那还能 return 回主函数吗?
double lirun(double x, double y)
{int z = 0;z = x - y;return z;
}int main()
{int shijian = 0;double sala = 0;double shu = 0;double li = 0;scanf("%d", &shijian);sala = salary(shijian);shu = shui(sala);li = lirun(sala, shu);printf("%lf 是基本工资,%lf 是税金,%lf 是利润\n", sala, shu, li);return 0;
}
疑问:局部变量,当程序运行结束,空间就释放了,可以这样使用吗?
答:可以,C Primer Plus 书中很多代码,都是这么使用的。
double shui(double x)
{double shuijin = 0;if (x <= 300){shuijin = x * 0.15;}else if(x > 300 && x <= 450){shuijin = 45 + (x - 300) * 0.2;}else{shuijin = 45 + 30 + (x - 450) * 0.25;}return shuijin; //这样做可以吗? shuijin是在这个函数里面创建的
} //函数运行结束,这个函数的空间也就释放了,shuijin 也就没有,//那还能 return 回主函数吗?
8、
我的答案:
#include <stdio.h>void menu()
{printf("*****************************************************************\n");printf("enter the number corresponding to the desired pay rate or action:\n");printf("1) $ 8.75/hr 2) $9.33/hr\n");printf("3) $ 10.00/hr 4) $11.20/hr\n");printf("5) quit\n");printf("*****************************************************************\n");
}double salary(int x,double y)
{double sum = 0;if (x >= 0 && x <= 40){sum = x * y;}else{sum = 40.0 * y + (x - 40.0) * 1.5 * y;}return sum;
}double shui(double x)
{double shuijin = 0;if (x <= 300){shuijin = x * 0.15;}else if(x > 300 && x <= 450){shuijin = 45 + (x - 300) * 0.2;}else{shuijin = 45.0 + 30.0 + (x - 450) * 0.25;}return shuijin; //这样做可以吗? shuijin是在这个函数里面创建的
} //函数运行结束,这个函数的空间也就释放了,shuijin 也就没有,//那还能 return 回主函数吗?
double lirun(double x, double y)
{double z = 0;z = x - y;return z;
}int main()
{int shijian = 0;double sala = 0;double shu = 0;double li = 0;int xuanxiang = 0;do {menu();printf("请输入你的选项:");scanf("%d", &xuanxiang);if (xuanxiang == 5){printf("程序结束!\n");break;}printf("请输入工作的时间:");scanf("%d", &shijian);switch (xuanxiang){case 1:{sala = salary(shijian, 8.75);break; }case 2:{sala = salary(shijian, 9.33);break;}case 3:{sala = salary(shijian, 10.00);break;}case 4:{sala = salary(shijian, 11.20);break;}default:{printf("请输入1~5的数值。\n");break;}}shu = shui(sala);li = lirun(sala, shu);printf("%lf 是基本工资,%lf 是税金,%lf 是利润\n", sala, shu, li);}while(1);return 0;
}
标准答案:
9、
我的答案:
#include <stdio.h>
#include <math.h>int panduan(int x)
{for (int n = 2; n <= sqrt(x); n++){if ((x % n) == 0){return 0;}}return 1; //注意:应该放在这个地方,我也想了一会儿呢
}int main()
{int input = 0;int flag = 0;printf("请输入数据:");while (scanf("%d", &input) == 1){flag = panduan(input);if (flag == 1){printf("%d 是素数\n", input);}else{printf("不是素数\n");}printf("请输入下一个数据:");}return 0;
}
标准答案:
#include <stdio.h>
#include <math.h>int main()
{int input = 0;int flag = 1;do{printf("请输入数据:");scanf("%d", &input);if (input < 2){if (input == 0){break; //直接跳出 do while 循环,程序终止}else{printf("你所输入的数据不在范围内,请重新输入。\n");continue; //注意点:注意这了从程序的哪里开始!!!} }for (int i = input; i > 1; i--){int j = 1;for (j = 2; j < sqrt(i); j++){if ((i % j) == 0){flag = 0;break;}}}if (flag == 1){printf("%d 是素数\n", input);}} while (input != 0);return 0;
}
10、这种简单,就不做了,一样的道理
标准答案:
11、
我的答案:自己在做的时候,注意点已经备注在代码中,当时也纠结了很久,逐行代码监视才找出的问题!!!
#include <stdio.h>
#define YANGYU 2.05
#define TIANCAI 1.15
#define HULUOBO 1.09void menu()
{printf("**************************\n");printf("1)洋芋\n");printf("2)请甜菜\n");printf("3)胡萝卜\n");printf("4)退出订购\n");printf("**************************\n");
}double SUM(double x,double y,double z)
{double zongshoujia = 0;zongshoujia = YANGYU * x + TIANCAI * y + HULUOBO * z;if (zongshoujia >= 100){zongshoujia = zongshoujia - 5;return zongshoujia;}return zongshoujia;
}double YUNFEI(double x)
{double yunfei = 0;if (x <= 5){yunfei = 6.5;return yunfei;}else if (x >= 5 && x <= 20){yunfei = 14.0;return yunfei;}else{yunfei = 14 + (x - 20.0) * 0.5;return yunfei;}
}int main()
{int xuanxiang = 0;//重量double yangyuzhongliang = 0;double tiancaizhongliang = 0;double huluobozhongliang = 0;double yy = 0;double tc = 0;double hlb = 0;double zongzhongliang = 0;//总运费double zongyunfei = 0;//总售价double sum = 0;//总额double zonge = 0;do{menu();scanf("%d", &xuanxiang);if (4 == xuanxiang){break;}switch (xuanxiang){case 1:{printf("请输入洋芋的重量:");scanf("%lf", &yangyuzhongliang);yy += yangyuzhongliang;break;}case 2:{printf("请输入甜菜的重量:");scanf("%lf", &tiancaizhongliang); tc += tiancaizhongliang;break;}case 3:{printf("请输入胡萝卜的重量:");scanf("%lf", &huluobozhongliang);hlb += huluobozhongliang;break;}default:{printf("你输入的选项不存在,请重新选择:");break;}}//不应给把这段话放在这儿,不然每次都要运行一遍,将上一次循环的值再加一遍// //yy += yangyuzhongliang; //tc += tiancaizhongliang;//hlb += huluobozhongliang;} while (1);sum = SUM(yy, tc, hlb);zongzhongliang = yy + tc + hlb;zongyunfei = YUNFEI(zongzhongliang);zonge = sum + zongyunfei;printf("%lf 磅的洋芋,%lf 磅的甜菜,%lf 磅的胡萝卜\n", yy, tc, hlb);printf("这么多蔬菜的售价:%lf\n", sum);printf("这么多蔬菜的总重量:%lf\n", zongzhongliang);printf("这么多蔬菜的总运费:%lf\n", zongyunfei);printf("这么多蔬菜最后加上优惠和运费,总的价格是:%lf\n", zonge);return 0;
}
标准答案:其风格明显更简洁,规范