题目分析
大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 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语句,其实可以合并到一个里面,但为了逻辑清晰,就写开了