PAT 1014福尔摩斯的约会

题目分析

大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D,代表星期四;第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A 到 N 表示);后面两字符串第 1 对相同的英文字母 s 出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。

题设分析:第一对字符:必须是大写字母且在A~G之间。   第二对字符:必须在第一对字符之后。

第三对字符:必须是英文字母,且最后记录的不是字符是位置。

输出分析:THU 14:04 

由例子看出对于数字0~9,要写成0x的形式。其他的按格式来就好。

代码设计

用gets函数储存字符串。好处是会把回车转化为‘\0'储存在字符串中。

#include<stdio.h>
int main()
{
    char a[61], b[61],c[61],d[61];
    gets(a); gets(b);gets(c); gets(d);

对第一组字符串的比较。由于我把两次比较写在了一个循环中,所以定义了一个sign变量来区分比较的先后顺序。

int i=0,sign=0;
    for(i=0;i<=61;i++)
    {
    	if(sign==0)
    	{
    		if(a[i]==b[i]&&a[i]>=65&&a[i]<=71)
            {
                    sign=1;
                    switch(a[i])
                    {
                        case 65: printf("MON ");break;
                        case 66: printf("TUE ");break;
                        case 67: printf("WED ");break;
                        case 68: printf("THU ");break;
                        case 69: printf("FRI ");break;
                        case 70: printf("SAT ");break;
                        case 71: printf("SUN ");break;
                    }
            }
		} 
        else if(sign==1)
        {
            if(a[i]==b[i])
            {
                if(a[i]>='0'&&a[i]<='9')
                    {printf("0%d:",a[i]-48);break;}
                if(a[i]>=65&&a[i]<=78)
                    {printf("%d:",a[i]-55);break;}
            }
        }    
    }

最后是对第二组字符串的比较

 for(i=0;i<=61;i++)
    {
    	if(c[i]==d[i])
		{
			if((c[i]>=65&&c[i]<=90)||(c[i]>=97&&c[i]<=122))
			{
				if(i>=0&&i<=9) {printf("0%d",i); break;}
				else {printf("%d",i); break;}
			}
		} 
	}
	return 0;
}

总结

1.gets函数读取字符串时会把字符串末尾的回车转换为\0储存

2.可以把字符用printf函数以ASCII码值的形式打印出来

3.if—else if—else的执行顺序,先从if开始,若if成立,则不管后面的else if—else。若if不成立,则看else if,同样不执行之后的else if—else。直到else。

4.我的代码里嵌套了很多if语句,其实可以合并到一个里面,但为了逻辑清晰,就写开了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值