7-11 计算平均分 (5 分)
已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均成绩(结果按整型输出)。
输入格式:
本题无输入
结尾无空行
输出格式:
按照下列格式输出结果:
math = 87, eng = 72, comp = 93, average = 计算所得的平均成绩
#include <stdio.h>
int main(){
int math = 87;
int eng = 72;
int comp = 93;
int average = (math + eng + comp) / 3;
printf("math = 87, eng = 72, comp = 93, average = %d", average);
return 0;
}
7-12 日期格式化 (5 分)
世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
输入格式:
输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。
输出格式:
在一行中按照“yyyy-mm-dd”的格式给出年、月、日。
输入样例:
03-15-2017
输出样例:
2017-03-15
#include <stdio.h>
int main(){
int year, month, day;
scanf("%d-%d-%d", &month, &day, &year);
printf("%d-%02d-%02d", year, month, day);
return 0;
}
[注]: C语言中,用%(number)d来表示字段的宽度,如:%2d表示字段宽度为2,此时如果输入的数小于宽度,默认以空格填充。但我们可以在百分号后加上0改变填充方式,例:%02d。
7-13 后天 (5 分)
如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。
输入格式:
输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。
输出格式:
在一行中输出D天的后天是星期几。
输入样例:
3
输出样例:
5
#include <stdio.h>
int main(){
int today;
int afterTomorrow;
scanf("%d", &today);
if(today>5){
afterTomorrow = today + 2 - 7;
}else{
afterTomorrow = today + 2;
}
printf("%d", afterTomorrow);
return 0;
}
7-14 然后是几点 (15 分)
有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
输入格式:
输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。
输出格式:
输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310
方法一:
#include <stdio.h>
int main(){
int now, lag, after;
int nowMinute, lagMinute, afterMinute;
int nowHour, lagHour, afterHour;
scanf("%d %d", &now, &lag);
nowMinute = now % 100;
nowHour = now / 100;
lagMinute = lag % 60;
lagHour = lag / 60;
if(nowMinute + lagMinute >= 60){
afterMinute = nowMinute + lagMinute - 60;
afterHour = nowHour + lagHour + 1;
}
else if(nowMinute + lagMinute < 0){
afterMinute = nowMinute + lagMinute + 60;
afterHour = nowHour + lagHour - 1;
}else{
afterMinute = nowMinute + lagMinute;
afterHour = nowHour + lagHour;
}
after = afterHour * 100 + afterMinute;
if(afterHour<10){
printf("%03d", after);
}else{
printf("%d", after);
}
return 0;
}
方法二:
#include <stdio.h>
int main(){
int now, lag, after;
scanf("%d %d", &now, &lag);
int nowMinute, afterMinute;
nowMinute = (now / 100) * 60 + (now % 100);
afterMinute = nowMinute + lag;
after = (afterMinute / 60) * 100 + (afterMinute % 60);
if(afterMinute<600){
printf("%03d", after);
}else{
printf("%d", after);
}
return 0;
}
7-15 BCD解密 (10 分)
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12
#include <stdio.h>
int main(){
int falseNumber,rightNumber;
scanf("%d", &falseNumber);
rightNumber = (falseNumber / 16) * 10 + (falseNumber % 16);
printf("%d", rightNumber);
return 0;
}
[注]:单位表示见图,例:12 = 00010010; 10 = 10000000