在摆烂了两周之后终于跟上版本了,感人!
话不多说,直接看题吧
目录
上机实验
很欣慰这次终于没有书上的题了
3-11 比较大小
本题要求编写程序,将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
529
输出样例:
2 -> 5 -> 9
排序是非常经典的算法,要讲的话可以有很多能说道的东西。但这道题只需要给三个数排序,简单比较大小就行。不过作为第一道排序题,还是得重点关注一下排序的逻辑。
先看代码吧
#include <stdio.h>
int main()
{
int a, b, c, x;
scanf("%d%d%d", &a, &b, &c);
if(a > b)
{
x = a;
a = b;
b = x;
if(b > c)
{
x = c;
c = b;
b = x;
}
}
else if(b > c)
{
x = c;
c = b;
b = x;
}//将最大的数放到了c
if(a > b)
{
x = a;
a = b;
b = x;
}//进行ab的排序
printf("%d -> %d -> %d", a, b, c);
return 0;
}
考虑到这么讲解可能会很难理解,我将debug录成了视频,大家看视频内a b c的数据变化或许会更好理解。视频如下
C语言课程代码参考(第六周)3-11debug视频
视频被csdn压缩过了,非常模糊(悲。需要原视频的可以私聊我
3-12 输出三角形面积和周长
本题要求编写程序,根据输入的三角形的三条边a、b、c,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:area=√s(s−a)(s−b)(s−c),其中s=(a+b+c)/2。
输入格式:
输入为3个正整数,分别代表三角形的3条边a、b、c。
输出格式:
如果输入的边能构成一个三角形,则在一行内,按照下列格式输出,保留两位小数。
area = 面积; perimeter = 周长
否则,输出
These sides do not correspond to a valid triangle
输入样例1:
5 5 3
输出样例1:
area = 7.15; perimeter = 13.00
输入样例2:
1 41
输出样例2:
These sides do not correspond toa valid triangle
这与之前的算三角形面积相比只多了一个参数合法性判断,即两边之和大于第三边。
在这里我想教大家一个小技巧,就是使用写过的代码,不要重复造轮子。这可以大大减少我们写代码的量。比如这一题,若我们直接写,就是这样
#include <stdio.h>
#include <math.h>
int main()
{
int a, b, c;
float s;
scanf("%d%d%d", &a, &b, &c);
if(a + b > c
&& a + c > b
&& b + c > a)
{
s = (a + b + c) / 2;
printf("area = %.2f, perimeter = %.2f\n", sqrt(s * (s - a) * (s - b) * (s - c)), 2 * s);
}
else
printf("These sides do not correspond to a valid triangle\n");
return 0;
}
但如果我们先用上一题的代码排序,需要写另外写的东西就少了很多。只要写成这样就行
#include <stdio.h>
#include <math.h>
int main()
{
int a, b, c, x;
float s;
scanf("%d%d%d", &a, &b, &c);
if(a > b)
{
x = a;
a = b;
b = x;
if(b > c)
{
x = c;
c = b;
b = x;
}
}
else if(b > c)
{
x = c;
c = b;
b = x;
}//将最大的数放到了c
if(a > b)
{
x = a;
a = b;
b = x;
}//进行ab的排序
// printf("%d -> %d -> %d", a, b, c);//上一题,这题用不到
/**************新写的代码***************/
if(a + b > c)
{
s = (a + b + c) / 2;
printf("area = %.2f, perimeter = %.2f\n", sqrt(s * (s - a) * (s - b) * (s - c)), 2 * s);
}
else
printf("These sides do not correspond to a valid triangle\n");
return 0;
}
乍一看好像代码量变多了,实际上都是调用之前的代码,新写的只有最后的几行。相比第一种办法直接上if判断,第二种的if就相对简单一些。
3-13 计算电费
本题要求编写程序,为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时,若用电量小于0,则输出"Invalid Value!"。要求计算电费。
输入格式:
输入在一行中给出某用户的月用电量(单位:千瓦时)。
输出格式:
在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。
输入样例1:
10
输出样例1:
cost = 5.30
输入样例2:
100
输出样例2:
cost
=
55.50
这题并没有前面的几题复杂,在此直接列出代码
#include <stdio.h>
int main()
{
float a;
scanf("%f", &a);
if(a < 0)
printf("Invalid Value!");
else if(a <= 50)
printf("cost = %.2f", a * 0.53);
else
printf("cost = %.2f", 50 * 0.53 + (a - 50) * 0.58);
return 0;
}
3-14 出租车计价
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:
- 起步里程为3公里,起步费10元;
- 超起步里程后10公里内,每公里2元;
- 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
- 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。
输入格式:
输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。
输出格式:
在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。
输入样例1:
2.6 2
输出样例1:
10
输入样例2:
5.1 4
输出样例2:
14
输入样例3:
12.5 9
输出样例3:
34
#include <stdio.h>
int main()
{
float a;
int b;
scanf("%f%d", &a, &b);
if (a < 3)
printf("%d", 10 + 2 * (b / 5));
else if (a <= 10)
printf("%.0f", (a - 3) * 2 + 10 + 2 * (b / 5));
else
printf("%.0f", 24 + (a - 10) * 3 + 2 * (b / 5));
return 0;
}
计算稍微复杂,逻辑还是很简单的。
为什么这个出租车这么贵啊!
3-15 计算个人所得税
本题要求编写程序,计算应缴的所得税。假设个人所得税为:税率×(工资−1600),其中税率定义为:
- 当工资不超过1600时,税率为0;
- 当工资在区间(1600, 2500]时,税率为5%;
- 当工资在区间(2500, 3500]时,税率为10%;
- 当工资在区间(3500, 4500]时,税率为15%;
- 当工资超过4500时,税率为20%。
输入格式:
输入在一行中给出非负工资。
输出格式:
在一行输出个人所得税,精确到小数点后2位。
输入样例1:
1600
输出样例1:
0.00
输入样例2:
1601
输出样例2:
0.05
输入样例3:
3000
输出样例3:
140.00
输入样例4:
4000
输出样例4:
360.00
输入样例5:
5000
输出样例5:
680.00
逻辑并不复杂,直接看代码吧
#include <stdio.h>
int main()
{
float a, b;
scanf("%f", &a);
if (a <= 1600)
b = 0;
else if (a <= 2500)
b = 0.05;
else if (a <= 3500)
b = 0.1;
else if (a <= 4500)
b = 0.15;
else
b = 0.2;
printf("%.2f", b * (a - 1600));
return 0;
}
3-16 计算油费
现在92号汽油6.95元/升、95号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。(现在明明不是这个价
本题要求编写程序,根据输入顾客的加油量a,汽油品种b(92、95或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。
输入格式:
输入在一行中给出两个整数和一个字符,分别表示顾客的加油量a,汽油品种b(92、95或97)和服务类型c(m - 自助,e - 协助)。
输出格式:
在一行中输出应付款额,保留小数点后2位。
输入样例:
40 97 m
输出样例:
301.34
直接看代码吧
#include <stdio.h>
int main()
{
float dis, pri;
int a, b;
char c;
scanf("%d%d%c%c", &a, &b, &c, &c);
switch (c)
{
case 'm':
dis = 0.95;
break;
case 'e':
dis = 0.97;
break;
}
switch (b)
{
case 92:
pri = 6.95;
break;
case 95:
pri = 7.44;
break;
case 97:
pri = 7.93;
break;
}
printf("%.2f", (float)a * pri * dis);
return 0;
}
注意这里的scanf()会将空格识别为一个字符,所以进行了两次赋值
3-17 计算绝对值(二)
本题目要求计算下列分段函数 y=|x|的值(利用条件运算符实现)
输入格式:
输入在一行中给出实数x。
输出格式:
在一行中按“|x| = y”的格式输出,
输入样例1:
7
输出样例1:
|7.0| = 7.0
输入样例2:
-3
输出样例2:
|-3.0|
=
3.0
先看看啥是条件运算符
这东西…真的有人用吗…
直接拿之前代码的if改就好了,直接看代码
#include <stdio.h>
int main()
{
float a;
scanf("%f", &a);
(a >= 0)?
printf("|%.1f| = %.1f", a, a)
:
printf("|%.1f| = %.1f", a, -a);
return 0;
}
直接写一行读起来麻烦,分行写也没有if简洁直观
3-18 四则运算(二)
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除运算。题目保证输入和输出均不超过整型范围。
输入格式:
输入在一行中依次输入操作数1、运算符、操作数2、=,操作数的数据类型为整型,且保证除法的分母非零。
输出格式:
当运算符为+
、-
、*
、/
时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除四种运算符以外的其他符号)则输出ERROR
。
输入样例1:
7/2=
输出样例1:
3
输入样例2:
2&7=
输出样例2:
ERROR
只要善用%d, %c这些字符,这题也可以比较简单地做出来。看代码
#include <stdio.h>
int main()
{
int a, b;
char c;
scanf("%d%c%d", &a, &c, &b);
switch (c)
{
case '+':
printf("%d", a + b);
break;
case '-':
printf("%d", a - b);
break;
case '*':
printf("%d", a * b);
break;
case '/':
printf("%d", a / b);
break;
default:
printf("ERROR");
break;
}
return 0;
}
3-19 成绩转换(三)
本题要求编写程序,将一个百分制成绩转换为五分制成绩。(利用switch语句实现),转换规则:
- 大于等于90分为A;
- 小于90且大于等于80为B;
- 小于80且大于等于70为C;
- 小于70且大于等于60为D;
- 小于60为E。
输入格式:
输入在一行中给出一个整数的百分制成绩。
输出格式:
在一行中输出对应的五分制成绩。
输入样例:
95
输出样例:
A
那个啥…咱上次好像就是用switch case实现的…?所以上次是得用if是吧。不过无所谓了,直接拷上次的代码来就行
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
a /= 10;
switch (a)
{
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("E");
break;
}
return 0;
}
3-20 计算天数
本题要求编写程序计算某年某月某日是该年中的第几天。(利用switch语句实现)
输入格式:
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
输出格式:
在一行输出日期是该年中的第几天。
输入样例1:
2009/03/05
输出样例1:
64
输入样例2:
2000/03/07
输出样例2:
67
咱先复习一下小学二年级学过的口诀 “一三五七八十腊,三十一天永不差”、“四年一闰,百年不闰,四百年又润”
#include <stdio.h>
int main()
{
int year, month, day;
int leap = 28;
char c;
scanf("%d%c%d%c%d", &year, &c, &month, &c, &day);
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//闰年判断
leap = 29;
for (c = 1; c < month; c++)//遍历每个月, 本月不计入
{
switch (c)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day += 31;
break;
case 2:
day += leap;
break;
default:
day += 30;
break;
}
}
printf("%d", day);
return 0;
}
可能会有同学有疑惑,为什么能将char类型的c作为整形使用?这个其实问题不大啦,实际上char本身就是存储-128~127的整形,所以混用也没啥关系(但最好不要)。
结语
本周作业部分题目有一点难度,可以仔细研究一下,不是很理解的可以在评论区提问哦。
呼~终——于!写完了!好不容易赶上版本。不过这周不是学习的循环吗,为什么作业还是以条件判断为主。另外条件判断语句,那个"?",感觉真的没咋用过,刚看到题目的时候都没反应过来是啥