你该逆袭了
红色标注的是:错误的答案蓝色标注的是:正确的答案
绿色标注的是:做题时有疑问的地方
橙色标注的是:答案中需要着重注意的地方
练习题
- 一、复习题
- 二、编程练习
-
- 1、
- 2、
- 3、
- 4、不知道该怎么用两个感叹号替换原来的感叹号
- 5、同样是第4题的疑问,其实就是自己想多了,很简单
- 6、
-
- 我的答案:
- [标准答案:利用 判断标记](#标准答案:利用 判断标记)
- 7、没什么价值
- 8、
- 9、
- 10、这种简单,就不做了,一样的道理
- 11、
一、复习题
1、
我的答案:
false
true
false
2、
我的答案:第4问 错误
c
number >= 90 && number < 100;
ch != 'q' && ch != 'k';
number >= 1 && number <= 9 && number != 5;
number < 1 && number>9; //错误
正确答案:第4问的答案
c
number < 1 || number>9;
3、
我的答案:
c
#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、
我的答案:
c
1 *#% 2 *#% 3 $#% 4 *#% 5 *#% 6 $#% 7 *#% 8 *#% 9 $#% 10 *#% 11 *#%
所以结果是:*#%*#%$#%*#%*#%$#%*#%*#%$#%*#%*#%
6、
我的答案:错误
c
fat hat cat Oh no!
fat hat cat Oh no!
fat hat cat Oh no!
正确答案:
c
fat hat cat Oh no!
hat cat Oh no!
cat Oh no!
7、
我的答案:正确
c
#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;
}
补充知识点:
c
添加头文件 #include <ctype.h>
if(islower(ch))
if(isupper(ch))
8、
我的答案:(有理解不到位的地方,已经在程序中备注)
c
#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、
我的答案:错误
c
step1
step2
step1
step1
step3
step1
done
正确答案:
这是我理解不到位的地方:以为执行完printf("step2\n");之后,laststep:("step3\n");是不执行的。其实是我错了,这个laststep 还是要执行的!
10、程序中有注意点
我的答案:
c
#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、方法一
c
while ((scanf("%c", &ch) == 1) && ch != '#')
c
#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、方法二
c
while ((ch = getchar()) != '#')
c
#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、
我的答案:
c
#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、
我的答案:
c
#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;
}
标准答案:
c
#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 将结果隐式转换为浮点型数据
c
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、不知道该怎么用两个感叹号替换原来的感叹号
我的答案:错误,不会做
c
#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;
}
正确答案:看完答案,就是自己想得太多
c
#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题的疑问,其实就是自己想多了,很简单
正确答案:
c
#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、
我的答案:
c
#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;
}
标准答案:利用 判断标记
c
#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、没什么价值
我的答案:标准答案比较简单,就是数学式子罗列而已
c
#include <stdio.h>
#define JI 1000
double 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 书中很多代码,都是这么使用的。
c
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、
我的答案:
c
#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、
我的答案:
c
#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;
}
标准答案:
c
#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、
我的答案:自己在做的时候,注意点已经备注在代码中,当时也纠结了很久,逐行代码监视才找出的问题!!!
c
#include <stdio.h>
#define YANGYU 2.05
#define TIANCAI 1.15
#define HULUOBO 1.09
void 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;
}
标准答案:其风格明显更简洁,规范