求助:控制台程序主循环中的一个小问题

sundonghui 2011-08-01 11:02:01
最近不是很忙,就翻出来当时的教材,《数据结构》,想把书中所有的算法用C语言跑一边,再写一个控制台程序,控制所有的算法。但是在主循环中遇到了一个小问题:

编译环境:visual studio 2010


Status main()
{
// 主函数

int iFuncChoose;
int iSwitchKey = 1;

ShowWelcome();

printf("请输入你的选择(1-9)[ ]\b\b");
scanf_s("%d", &iFuncChoose, sizeof(int));

while(iSwitchKey)
{
switch (iFuncChoose)
{
case 1:
ShowFunctionTitle(1);
UseListSq();
break;
case 9:
ShowFunctionTitle(9);
iSwitchKey = 0;
break;
default:
puts("无效的输入!");
break;

}// End switch

}// End while
return OK;
}


上面是main函数,整个控制台程序的思路是,case选项1-8分别对应顺序表、链表、栈、队列、图、树等基本数据结构的操作。9是退出。

所有的代码都顺利编译通过。

我的疑问在于:
执行完case 1 语句后,break退出switch,但是不能退出while循环,while循环一直进行。ShowFunctionTitle(1)语句用来打开的子界面就一直闪了个不停(是while一直再循环的结果),我不知道应该怎样控制,使程序不会再闪屏!!!
...全文
91 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-08-01
  • 打赏
  • 举报
回复
纠正上帖:
}// End switch
if (9==iFuncChoose) break;//加这句
}// End while

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。

赵4老师 2011-08-01
  • 打赏
  • 举报
回复
}// End switch
if (9==iSwitchKey) break;//加这句
}// End while
sea_spray 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luciferisnotsatan 的回复:]
找个跳出while的条件。或者while后,再提示用户输入。
不然就是不停case 1:,当然闪
[/Quote]
+1
至善者善之敌 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ouyh12345 的回复:]
switch完后,break啊,或者有别的逻辑
[/Quote]

++1
luciferisnotsatan 2011-08-01
  • 打赏
  • 举报
回复
找个跳出while的条件。或者while后,再提示用户输入。
不然就是不停case 1:,当然闪
ouyh12345 2011-08-01
  • 打赏
  • 举报
回复
switch完后,break啊,或者有别的逻辑
lazy_2010 2011-08-01
  • 打赏
  • 举报
回复
应该在 switch 结束之后,如果选择功能不是 9,则继续让用户进行选择的吧?
赵4老师 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sundonghui 的回复:]
谢谢赵哥回复!!!
你说的这一句if (9==iFuncChoose) break;//加这句
不会起到任何作用,
我找到问题的所在了。在case 1 最后一个函数的最后一句加上system(“pause”)就可以了。
另外,赵哥说的while循环的那一点,我还是用的iswitchkey控制入口,在退出的case中置其为假。个人习惯了,~~~呵呵

引用 7 楼 zhao4zhong1……
[/Quote]
少用system("pause");//需要#include <process.h>。因为开销较大
改用printf("\nPress any key ...\n");getch();//需要#include <conio.h>
sundonghui 2011-08-01
  • 打赏
  • 举报
回复
谢谢赵哥回复!!!
你说的这一句if (9==iFuncChoose) break;//加这句
不会起到任何作用,
我找到问题的所在了。在case 1 最后一个函数的最后一句加上system(“pause”)就可以了。
另外,赵哥说的while循环的那一点,我还是用的iswitchkey控制入口,在退出的case中置其为假。个人习惯了,~~~呵呵[Quote=引用 7 楼 zhao4zhong1 的回复:]

纠正上帖:
}// End switch
if (9==iFuncChoose) break;//加这句
}// End while

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) retu……
[/Quote]

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧