看流程图,写代码
这道题,是我自己出的题,看起来很简单,大多数人都不会。考过很多人,包括有多年经验的程序员,也有一些新手,也有应聘者,在10分钟内,给出正确答案的人,不超过20%。题目如下:
看流程图,写代码。
先看例子,其中T表示True,F表示False。
例子1:
graph TD
A(Start) --> B(A)
B --> C{C}
C -->|T| B
C -->|F| E[End]
这个流程图的代码如下的方式编写:
do {
A;
} while (C);
例2:
例2的代码可以这样写:
while (C)
{
A;
}
请根据以下流程图,编写代码,不能够使用goto
,也不能使用if
。
请在10分钟之内完成此题目。
1楼
do
{
A
}
while(c&&b)
2004-07-16 19:55 | 浪漫十一狼
2楼
此方式不恰当,如果B一个函数,返回值是False,就退出循环了。如果返回值不是BOOLEAN,在很多语言中,都是无法编译通过的。
2004-07-16 20:12 | 温少
3楼
Do until (C not true)
{
B
A
}
2004-07-16 20:37 | Yifeng Xu
4楼
这个答案不对,自己细细想想 😃
2004-07-16 20:42 | 温少
5楼
A
do until(C not true)
{
B
A
}
2004-07-16 20:47 | 胡争辉
6楼
do
{
A;
while(c)
{B}
}While(c)
是不是这样?
2004-07-16 20:49 | 狮子洋
7楼
A
Do until (C not true)
{
B
A
}
😃 I think 胡争辉 is right
2004-07-16 20:50 | Yifeng Xu
8楼
胡争辉的答案对了,不错!
这道题考的是脑筋急转弯,与编程经验无关。
2004-07-16 20:54 | 温少
9楼
我觉得我的也写对了。
虽然不够简洁
2004-07-16 20:57 | 狮子洋
10楼
其实如果A和B是一个表达式语句,就可以这样写:
for(a;c;b,c);
这是我看到过最简单的答案,虽然在某些情况下不符合要求,但思维不错!
从这个简单的题目看来,一定程度存在goto
还是非常合理的。 😃
2004-07-16 20:58 | 温少
11楼
do{
A
} while (C || ( 0 && B)
?
弄不清 随便写的
2004-07-16 21:04 | progame
12楼
A;
while(C)
{
B;
A;
}
2004-07-16 21:04 | asdf
13楼
A
while(C)
{
B
A
}
2004-07-16 21:35 | Zhou
14楼
同意Zhou及asdf。有没有搞错,中国的程序员素质会这么差么? 写这个一分钟都用不到啊。
2004-07-17 03:36 | techgopher
15楼
楼住的结论的确很正确!这个题目怎么就没有人能够做出来呢?这个题目应该在5秒钟之内就出来答案:
do
{
A
if (C == false) break;
B
} while (true);
2004-07-17 10:54 | sumtec
16楼
A和B后面忘了写分号了,不过明白就行。类似的方法还可以是:
for(;;)
{
A;
if (C == false) break;
B;
}
或者:
while(true)
{
A;
if (C == false) break;
B;
}
2004-07-17 10:59 | sumtec
17楼
当然,从实际执行情况来说,
A;
while(C)
{
B;
A;
}
是可以的,是正确的,但是和题目的流程图相比较,似乎就不是很吻合。这样的代码,流程图应该是:
A
|
B<---
| |
A |
| |
C --T
|
F
|
实际上如果是写程序的话,很可能就用上面这个方法,毕竟从控制的角度来看,应该是比较直观的。但是如果A不是一句话,而是一大段代码的话,那么就不见得简单了,因为前面需要写一遍,后面也需要写一遍。此外这种方法还有一个很大的缺点: 如果你需要对A进行修改的话,很可能你只修改了一个地方,而忘记修改另外一个地方了。
当然,还有一些很硬的方法:
do
{
A;
} while (C && (B || true));
这是基于C#来说的,并且假设B有bool返回值。或者如果有非void的返回值,那么就跟某个东西比较一下例如
B==null
或者B==0
。但是这个方法同样和题目的流程图不完全吻合,甚至有一些多余的东西出现,比如|| true
,甚至有可能被编译器优化掉(我这里只是随便想想的,没有考虑编译器的优化程度问题,如果优化程度比较高,那么B就永远也不会执行,因为(B||true
)肯定是true
)。所以如果从题目吻合的角度来说,还是我一开始提出的方法最为恰当。并且
for(;;)
的方法应该是最好的,绝对没有多余的东西出现,并且完全文和题目的流程图。(while
和do
方案,如果编译器优化做得不好,可能会有一个多余的条件转移语句出现)2004-07-17 11:13 | sumtec
18楼
@sumtec
你的答案都没有留意到题目中,不能使用if
和goto
,如果去了这个条件,几乎每个人都能答出来的。这道题本身不是考编程技巧的熟练程度,而是考思维变换能力。
对于很多人来说,这是一个很简单的问题,有一部分人,一看到题目都能获得正确答案了。
2004-07-17 13:11 | 温少
19楼
for( ; A(),C(); B() );
2004-07-17 15:25 | 周星星
20楼
哦,你说的是不带if。 但是这样的话好像要有一个前提条件,那就是B必须有返回值。
2004-07-17 20:53 | sumtec
21楼
简单问题复杂化, 这就是大牛.
2004-07-18 17:26 | 陶然
22楼
for ( A; C; B,A );
2004-07-18 21:31 | 香依香偎孤旅独行的驿站
23楼
用逗号的人,楼主说这是C码了么?
2004-07-19 12:20 | Guest
24楼
A;
while(C)
{
B;
A;
}
2004-12-16 14:54 | 尹翔
25楼
你是给我写邮件的那个吗?
我是月儿
2005-02-03 18:03 | 月儿
26楼 [楼主]
@月儿
我发过邮件给你吗?你是哪位?
2005-02-05 01:13 | 温少
27楼
有点晕……刚从月儿的博客里留完言出来,又在这里碰到。
月儿应该说的是上面回答对了的那个胡争辉。
2005-03-03 11:33 | 焰
28楼
有点晕,刚从月儿的博客里留言出来,又在这里碰到。
月儿应该说的是上面回答对问题的胡争辉。
2005-03-03 11:35 | 焰
29楼
for (A; C; B)
{
A;
}
哈哈
2005-03-30 11:56 | hoyle
30楼
如果没有IF语句,代码臃肿,重复代码
2005-04-04 20:39 | 老鼠仔
31楼
有趣
2005-04-22 19:17 | 8888888
32楼
死循环: )如果c返回true的话
2005-12-07 17:25 | howcanido
33楼
A
while(c){
b;
a;
}
2006-04-21 20:29 | redhum
34楼
do
{
A;
if(!C) Break;
B;
}while(True)
我的和sumtec的一样,应该能符合你的流程 😃
2006-08-08 11:59 | Steven Ye
35楼
不能够用If的话就比较有趣,
do
{
A;
(C==True)?B:break;
}while(True)
2006-08-08 12:05 | Steven Ye
36楼
int i=0;
do
{
a;
while(i!0)
{
B;
}
}while(c)
这样行吗?
2006-11-22 13:26 | zy1228
37楼
题目有问题,作为一个语句或一个对象集合,不应该有从中间插入的现象,而要保证对象的封闭性。
2007-10-17 05:35 | 看看
38楼
a()
while(c())
{
b();
a();
}
2009-10-30 09:47 | 萝卜青菜2008