头歌C语言实验 辅助练习4:选择结构II

第1关:计算邮资

问题描述
邮局通常会根据邮件的重量和用户是否选择加急计算邮资。以下是邮资的计算规则:

重量在1000克以内(含1000克),收基本费8元;
超过1000克的部分,每500克加收超重费4元,不足500克部分按500克计算;
如果用户选择加急,则多收5元。
聪明的你能够运用所学的知识帮忙计算邮资吗?
输入
输入只有一行,包含用空格分开的一个正整数和一个字符,分别表示重量(单位为克)和是否加急,小写字母y表示需要加急,n表示不需要加急。

输出
一个正整数,即计算出来的邮资。

输入示例
1200 y

输出示例
17

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<math.h>
int main(){
int weight,money;
char urgent;
scanf("%d %c",&weight,&urgent);
if(weight<=1000){
money=8;
}else
{
weight-=1000;
money=8+ceil(weight/500.0)*4;
}
if(urgent=='y')
money+=5;
printf("%d",money);
return 0;
}

第2关:3、5和7 II

问题描述
给定一个正整数n,找出n能被3、5和7中的哪几个数整除。

输入
一个正整数n。

输出
按照从小到大的顺序依次输出在3、5和7中能整除n的数,即除数,两两之间用一个空格分开。
如果三个数都不能被n整除,则输出None。

输入示例
105

输出示例
3 5 7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>
int main(){
int n,flag=0;
scanf("%d",&n);
if(n%3==0)
flag+=3;
if(n%5==0)
flag+=5;
if(n%7==0)
flag+=7;
switch(flag){
case 15:
printf("3 5 7");
break;
case 12:
printf("5 7");
break;
case 10:
printf("3 7");
break;
case 8:
printf("3 5");
break;
case 7:
printf("7");
break;
case 5:
printf("5");
break;
case 3:
printf("3");
break;
default:
printf("None");
}
return 0;
}

第3关:字符加密

问题描述
Tom和Jack是密码学爱好者,他们在彼此发送消息聊天时经常使用一些特殊的语言。最近一段时间,他们在使用一种简单的暗语:将他们要讲的每句话中的英文字母按照一种特殊的规则替换成另外一个英文字母,这样,对于不知道替换规则的其他人,就看不懂他们说的是什么内容了。
他们使用的字符加密规则是:

对于非字母字符,保持不变;
对于a~w的小写字母,替换为其后的第三个小写字母,即把字母a替换成d;
小写字母x,y,z则相应地替换为a,b,c;
对于大写字母,使用和小写字母类似的替换方法。
聪明的你能帮助Tom和Jack编写一段程序,按照规则自动实现对字符的加密吗?
输入
一个英文字符,即需要进行加密的字符。

输出
加密后的字符。

输入示例
H

输出示例
K

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main(){
char input;
scanf("%c",&input);
if((input>='a'&&input<='w')||(input>='A'&&input<='W'))
printf("%c",input+3);
else if(input>='x'&&input<='z'||input>='X'&&input<='Z')
printf("%c",input-('x'-'a'));
else
printf("%c",input);
return 0;
}

第4关:计算月份天数

问题描述
平年一年共有365天,闰年一年共有366天,原因只在于2月份闰年和平年的天数不同,平年2月份只有28天,而闰年2月份有29天。
请使用switch多分支结构编写一段程序,根据用户输入的年份与月份,计算这一年的这个月有多少天。

输入
两个用空格分开的正整数,第一个表示年份,第二个表示月份。
输入数据保证月份一定在1~12的范围中。

输出
输出一个整数,即该年该月的天数。

输入示例
2021 3

输出示例
31

提示
可以使用switch和if的嵌套形式;
平年和闰年的区别仅仅体现在2月份的天数不同;
闰年和平年的判定依据可以参见“平年和闰年”。
大部分月份的天数都是相同的,因此可以合并这些分支。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
int main(){
int y,m;
scanf("%d %d",&y,&m);
switch(m){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("31");
break;
case 4:
case 6:
case 9:
case 11:
printf("30");
break;
case 2:
if(y%4==0 && y%100!=0 || y%400==0)
printf("29");
else
printf("28");
break;
default:
;
}
return 0;
}

第5关:老梁买稻种 II

问题描述
聪明的你,能使用switch多分支选择结构编写程序为老梁计算买稻种的实际支付价格吗?
农民老梁去城里买稻种,稻种价格为3元/斤,一次性买得越多,每斤价格的折扣(可以少支付的金额)率就越大,购买斤数(weight)和折扣率Cost关系如下:

如果weight≥500,折扣率Cost为0.15;
如果500>weight≥300,折扣率Cost为0.10;
如果300>weight≥100,折扣率Cost为0.075;
如果100>weight≥50,折扣率Cost为0.05;
否则折扣率Cost为0。
这可难倒了没读过几年书的老梁。请你帮忙算一算,如果老梁需要买x斤稻种,折扣率是多少?老梁实际需要支付多少元呢?
输入
一个正整数,即老梁需要购买的稻种斤数。

输出
两个用空格分开的浮点数:第一个是折扣率,保留3位小数;第二个是老梁需要支付的钱数,以元为单位,保留2位小数。

输入示例
278

输出示例
0.075 771.45

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
#define PRICE 3
int main(){
int weight;
float cost,money;
scanf("%d",&weight);
switch (weight/100)
{
case 5:
cost=0.15;
break;
case 4:
case 3:
cost=0.10;
break;
case 2:
case 1:
cost=0.075;
break;
case 0:
if(weight>=50&&weight<100)
cost=0.05;
break;
default:
cost=0.15;
break;
}
money=(1-cost)*PRICE*weight;
printf("%.3f %.2f",cost,money);
return 0;
}