今天,我解决了Google的一个问题:模仿手机键盘短信。
下面是带有goto语句的程序。我知道使用goto是一种非结构化的风格,但我仍然这样做,因为它提高了速度。
#include <stdio.h>
int main()
{
char c, c1 = NULL;
int top;
top:
while((c = getchar()) != '\n')
{
if (c == ' ')printf("0");
if(c == 'a' || c == 'b' || c == 'c')
{
if(c1 == 'a' || c1 == 'b' || c1 == 'c')
printf(" ");
if(c == 'a') printf("2");
if(c == 'b') printf("22");
if(c == 'c') printf("222");
c1 = c;
goto top;
}
if(c == 'd' || c == 'e' || c == 'f')
{
if(c1 == 'd' || c1 == 'e' || c1 == 'f')
printf(" ");
if(c == 'd') printf("3");
if(c == 'e') printf("33");
if(c == 'f') printf("333");
c1 = c;
goto top;
}
if(c == 'g' || c == 'h' || c == 'i')
{
if(c1 == 'g' || c1 == 'h' || c1 == 'i')
printf(" ");
if(c == 'g') printf("4");
if(c == 'h') printf("44");
if(c == 'i') printf("444");
c1 = c;
goto top;
}
if(c == 'j' || c == 'k' || c == 'l')
{
if(c1 == 'j' || c1 == 'k' || c1 == 'l')
printf(" ");
if(c == 'j') printf("5");
if(c == 'k') printf("55");
if(c == 'l') printf("555");
c1 = c;
goto top;
}
if(c == 'm' || c == 'n' || c == 'o')
{
if(c1 == 'm' || c1 == 'n' || c1 == 'o')
printf(" ");
if(c == 'm') printf("6");
if(c == 'n') printf("66");
if(c == 'o') printf("666");
c1 = c;
goto top;
}
if(c == 'p' || c == 'q' || c == 'r' || c == 's')
{
if(c1 == 'p' || c1 == 'q' || c1 == 'r' || c1 == 's')
printf(" ");
if(c == 'p') printf("7");
if(c == 'q') printf("77");
if(c == 'r') printf("777");
if(c == 's') printf("7777");
c1 = c;
goto top;
}
if(c == 't' || c == 'u' || c == 'v')
{
if(c1 == 't' || c1 == 'u' || c1 == 'v')
printf(" ");
if(c == 't') printf("8");
if(c == 'u') printf("88");
if(c == 'v') printf("888");
c1 = c;
goto top;
}
if(c == 'w' || c == 'x' || c == 'y' || c == 'z')
{
if(c1 == 'w' || c1 == 'x' || c1 == 'y' || c1 == 'z')
printf(" ");
if(c == 'w') printf("9");
if(c == 'x') printf("99");
if(c == 'y') printf("999");
if(c == 'z') printf("9999");
c1 = c;
goto top;
}
}
}上面没有goto的程序:
#include <stdio.h>
int main()
{
char c, c1 = NULL;
while((c = getchar()) != '\n')
{
if (c == ' ')printf("0");
if(c == 'a' || c == 'b' || c == 'c')
{
if(c1 == 'a' || c1 == 'b' || c1 == 'c')
printf(" ");
if(c == 'a') printf("2");
if(c == 'b') printf("22");
if(c == 'c') printf("222");
}
if(c == 'd' || c == 'e' || c == 'f')
{
if(c1 == 'd' || c1 == 'e' || c1 == 'f')
printf(" ");
if(c == 'd') printf("3");
if(c == 'e') printf("33");
if(c == 'f') printf("333");
}
if(c == 'g' || c == 'h' || c == 'i')
{
if(c1 == 'g' || c1 == 'h' || c1 == 'i')
printf(" ");
if(c == 'g') printf("4");
if(c == 'h') printf("44");
if(c == 'i') printf("444");
}
if(c == 'j' || c == 'k' || c == 'l')
{
if(c1 == 'j' || c1 == 'k' || c1 == 'l')
printf(" ");
if(c == 'j') printf("5");
if(c == 'k') printf("55");
if(c == 'l') printf("555");
}
if(c == 'm' || c == 'n' || c == 'o')
{
if(c1 == 'm' || c1 == 'n' || c1 == 'o')
printf(" ");
if(c == 'm') printf("6");
if(c == 'n') printf("66");
if(c == 'o') printf("666");
}
if(c == 'p' || c == 'q' || c == 'r' || c == 's')
{
if(c1 == 'p' || c1 == 'q' || c1 == 'r' || c1 == 's')
printf(" ");
if(c == 'p') printf("7");
if(c == 'q') printf("77");
if(c == 'r') printf("777");
if(c == 's') printf("7777");
}
if(c == 't' || c == 'u' || c == 'v')
{
if(c1 == 't' || c1 == 'u' || c1 == 'v')
printf(" ");
if(c == 't') printf("8");
if(c == 'u') printf("88");
if(c == 'v') printf("888");
}
if(c == 'w' || c == 'x' || c == 'y' || c == 'z')
{
if(c1 == 'w' || c1 == 'x' || c1 == 'y' || c1 == 'z')
printf(" ");
if(c == 'w') printf("9");
if(c == 'x') printf("99");
if(c == 'y') printf("999");
if(c == 'z') printf("9999");
}
c1 = c;
}
}哪一个更好?我如何才能认识到X程序比Y更好?
顺便说一句,我没有使用任何派生数据类型和指针,因为我发现它在这里没有用。
发布于 2013-01-12 15:55:30
在过去的几年里,我没有编写任何C语言,但是我认为您可以在第一个版本中使用continue而不是goto。
发布于 2013-01-12 20:40:42
因为你的外层测试是相互排斥的。),您应该使用else而不是goto或continue。当else测试的条件为false时,将使用if:
if (c == ' ') {
printf("0");
}
else if (c == 'a' || c == 'b' || c == 'c')
{
if(c1 == 'a' || c1 == 'b' || c1 == 'c')
printf(" ");
if(c == 'a') printf("2");
else if(c == 'b') printf("22");
else if(c == 'c') printf("222");
c1 = c;
}
else if(c == 'd' || c == 'e' || c == 'f')
{ ... }
else if ...
etc还要注意,c和c1应该声明为int,而c1 = NULL是错误的(因为NULL被声明为(void *) 0;使用c1 = '\0' )。
此外,在编译器中打开更多警告。
https://codereview.stackexchange.com/questions/20462
复制相似问题