首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟T9信元消息

模拟T9信元消息
EN

Code Review用户
提问于 2013-01-12 14:38:56
回答 2查看 693关注 0票数 3

今天,我解决了Google的一个问题:模仿手机键盘短信。

下面是带有goto语句的程序。我知道使用goto是一种非结构化的风格,但我仍然这样做,因为它提高了速度。

代码语言:javascript
复制
#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的程序:

代码语言:javascript
复制
#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更好?

顺便说一句,我没有使用任何派生数据类型和指针,因为我发现它在这里没有用。

EN

回答 2

Code Review用户

发布于 2013-01-12 15:55:30

在过去的几年里,我没有编写任何C语言,但是我认为您可以在第一个版本中使用continue而不是goto

票数 1
EN

Code Review用户

发布于 2013-01-12 20:40:42

因为你的外层测试是相互排斥的。),您应该使用else而不是gotocontinue。当else测试的条件为false时,将使用if

代码语言:javascript
复制
    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

还要注意,cc1应该声明为int,而c1 = NULL是错误的(因为NULL被声明为(void *) 0;使用c1 = '\0' )。

此外,在编译器中打开更多警告。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/20462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档