7-12 日期格式化
世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
输入格式:
输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。
输出格式:
在一行中按照“yyyy-mm-dd”的格式给出年、月、日。
思考:
- 把“mm-dd-yyyy”调换顺序输出“yyyy-mm-dd”;需要有三个内存分别存放mm,dd,yyyy。
- mm需要输出2位整数/ dd输出2位整数/ yy输出4位整数;
思路一: mm,dd,yyyy视作字符串
#include<stdio.h>
#include<string.h>
int main(void)
{
char mm[3]={
'\0'}, dd[3]={
'\0'}, yyyy[5]={
'\0'}; //mm占两个字符最后还有一个转义字符'\0',占据三个数组单元。以此类推,dd[2+1]; yyyy[4+1]。如果想给一个大一点的内存空间,一定要初始化数组,房间打扫干净!
scanf("%2s-%2s-%4s", &mm, &dd, &yyyy); //限定读入字符数量,否则输出会露娜吗
//以下代码可以作调试
// { int i;
// for (i=0; i<strlen(yyyy); i++) {
// printf("mm[%d] = %c \t", i, mm[i]);
// printf("dd[%d] = %c \t", i, dd[i]);
// printf("yyyy[%d] = %c\n", i, yyyy[i]);
printf("%s-%s-%s", yyyy, mm, dd);
}
- c语言的字符串是一个数组,一个字符数字的最后一个数组单元内存的是转义字符
'\0'
%c
是输出一个字符,%s
是输出一个字符串scanf("%xs", &a)
可以表示读入x个字符的字符串。(x为几个字符串,a是字符数组)
思路二:mm,dd,yyyy视作整数
#include<stdio.h>
int main(void)
{
int dd, mm, yyyy;
scanf("%d-%d-%d", &mm, &dd, &yyyy);
printf("%04d-%02d-%02d", yyyy, mm, dd); //这个输出整数,%04d表示的是,输出4位的整数,若不足4位则在前面补0
}
- %xyd中的y表示的是输出y位的整数,表示的是若不足y位则在前面用x补足。
7-13 后天
如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。
输入格式:
输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。
输出格式:
在一行中输出D天的后天是星期几。
思考
- 当D是1-5是,后天就是D+2;当D是6、7,后天就不是D+2了,分别是1和2;
- 需要分别把D:1-5和,D:5-6 两种情况分开
思路一:使用switch case
#include<stdio.h>
int main(void)
{
int D, day;
scanf("%d", &D);
switch (D)
{
default :
day = D+2;
break;
case 6 :
day = 1;
break;
case 7 :
day = 2;
break;
}
printf("%d", day);
}
- switch case 在进入case判断的时候会走完剩下的case,如果只想让switch做某一case的操作,一定要配合使用break;
思路二:使用if语句
#include<stdio.h>
int main(void)
{
int D, d1, d2;
scanf("%d", &D);
if ( D>=1 && D<=5 ) {
d1 = D+2;
printf("%d", d1);
} else {
d1 = D+2;
d2 = d1%7;
printf("%d", d2);
}
}
7-14 然后是几点
有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
输入格式:
输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。
输出格式:
输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
思考
- 给出的开始时间是四位整数,如何把四位整数分成小时和分钟(使用整除和取余)
- 给出的经过时间是分钟数,如何与开始时间进行加减运算(需要将开始时间换算成单位为分钟的数)
- 输出格式要求,如果小时数为0,则输出3位数,如果不为
#include<stdio.h>
int main()
{
int start, pass;
scanf("%d %d", &start, &pass);
int hour1, minute1, hour2, minute2, hour3, minute3;
//算出pass的小时/分钟
hour2 = pass/60;
minute2 = pass%60;
//算出start的小时/分钟
hour1 = start/100;
minute1 = start%100;
//如果是正数
if (pass>0){
//改变小时分钟
hour3 = hour1+hour2;
minute3 = minute1+minute2;
} else {
hour3 = hour1-hour2;
minute3 = minute1-minute2;
}
if (minute3 > 59){
minute3 %=60;
hour3 += 1;
if (minute3 < 0){
minute3 += 60;
hour3 =-1;
}
}
printf("%d%02d", hour3, minute3);
return 0;
}
发现整个思路乱七八糟的,而且考虑不周全。。
正确解法:
#include <stdio.h>
int main()
{
int hour1, minute1;
scanf("%d %d", &hour1, &minute1);
int a = hour1 / 100;
int b = hour1 % 100;
int c = a * 60 + b + minute1;
int e = c / 60;
int f = c % 60;
int t = e * 100 + f;
printf("%d", t);
return 0;
}