如何使这个程序在c中高效?

时间:2011-07-09 15:30:29

标签: c

这是代码

void main()
{
    int x,y,i=0,o,p;


    printf("enter the command");
    scanf("%s",dir);
    printf("enter the limit");
    scanf("%d%d",&o,&p);
    printf("enter the place");
    scanf("%d%d",&x,&y);
    clrscr();
    if(((x>0)&&(x<o))&&((y>0)&&(y<p)))
    {
        while(dir[i]!='\0')
        {
            for(i=0;i<strlen(dir);i++)
            {
                if(dir[i]=='l')
                {
                    if(a=='n')
                    a='w';
                    else if(a=='w')
                    a='s';
                    else if(a=='s')
                    a='e';
                    else
                    a='n';
                }
                else if(dir[i]=='r')
                {
                    if(a=='n')
                    a='e';
                    else if(a=='e')
                    a='s';
                    else if(a=='s')
                    a='w';
                    else
                    a='n';
                }

            }
        }
        printf("%d %d %c",x,y,a);
    }
    else printf("out of area");
    getch();
}

如何使用c或某种方式使用oops概念使上述程序高效?

2 个答案:

答案 0 :(得分:1)

你应该尝试逐步改进程序,因为它是用C语言编写的,因此OOPSy可能不是最高优先级。例如,首先通过引入switch()语句来改进选择逻辑:

switch (dir[i]) {
    case 'l':
        ...
        break;
    case 'r':
        ...
        break;
    default:
        ....
        break;
}

您也可以用开关替换内部if-chain,但这会变得相当混乱。所以,在函数中打破内部结构。

char newa (char olda) {
    if(olda=='n') return 'w';
    if(olda=='w') return 's';
    if(olda=='s') return 'e';
    return 'n';
}

请参阅?即使用普通的if :-)也更容易看到眼睛 这样内部块变为

a = newa(a);

如果您弄清楚如何将3个非常相似但不完全相同的内部区块折叠成1个函数,则可获得奖励积分!

等等。继续逐步改进,使您的程序在每次迭代时都更具可读性。

啊,是的,当你在这里时,在这里和那里发表一些有用的评论,特别是评论将帮助你在3个月内弄清楚&amp;!@%#&amp;你试图通过某种功能实现: - )

编辑:根据Wikipedia缩进

  

将文字放置得更远   将其与周围环境分开的权利   文本。

令我非常困惑的是,这个概念对你来说似乎很陌生。

答案 1 :(得分:0)

一个小到足以让人容易错过的东西是:

for(i=0;i<strlen(dir);i++)

编译器(至少通常)没有任何方式知道strlen将从每次调用返回相同的结果,因此它最终会在循环的每次迭代中被调用。为了防止这种情况,您需要执行以下操作:

size_t len = strlen(dir);
for (i=0; i<len; i++) /* ... */

您目前正在使用级联if语句转换(显然)方向。我可能会构建一个小表,然后进行表查找:

char results[2]['z'-'a'];

results[0]['n'-'a'] = 'w';
results[0]['w'-'a'] = 's';
results[0]['s'-'a'] = 'e';
results[0]['e'-'a'] = 'n';
results[1]['n'-'a'] = 'e';
results[1]['e'-'a'] = 's';
results[1]['s'-'a'] = 'w';
results[1]['w'-'a'] = 'n';

a = results[dir[i]=='r'][a-'a'];