这是代码
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概念使上述程序高效?
答案 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'];