C语言PTA刷题笔记

7-12 日期格式化

世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
输入格式:
输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。
输出格式:
在一行中按照“yyyy-mm-dd”的格式给出年、月、日。

思考:

  1. 把“mm-dd-yyyy”调换顺序输出“yyyy-mm-dd”;需要有三个内存分别存放mm,dd,yyyy。
  2. 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天的后天是星期几。

思考

  1. 当D是1-5是,后天就是D+2;当D是6、7,后天就不是D+2了,分别是1和2;
  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;
}

猜你喜欢

转载自blog.csdn.net/m0_71290816/article/details/127203339