看流程图,写代码open in new window

这道题,是我自己出的题,看起来很简单,大多数人都不会。考过很多人,包括有多年经验的程序员,也有一些新手,也有应聘者,在10分钟内,给出正确答案的人,不超过20%。题目如下:

看流程图,写代码。

先看例子,其中T表示True,F表示False。

例子1:

32_flow_1.png

graph TD
A(Start) --> B(A)
B --> C{C}
C -->|T| B
C -->|F| E[End]

这个流程图的代码如下的方式编写:

do {
    A;
} while (C);

例2:

32_flow_2.png

例2的代码可以这样写:

while (C)
{
    A;
}

请根据以下流程图,编写代码,不能够使用goto,也不能使用if

32_flow_3.png

请在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(;;)的方法应该是最好的,绝对没有多余的东西出现,并且完全文和题目的流程图。(whiledo方案,如果编译器优化做得不好,可能会有一个多余的条件转移语句出现)

2004-07-17 11:13 | sumtec

18楼

@sumtec
你的答案都没有留意到题目中,不能使用ifgoto,如果去了这个条件,几乎每个人都能答出来的。

这道题本身不是考编程技巧的熟练程度,而是考思维变换能力。

对于很多人来说,这是一个很简单的问题,有一部分人,一看到题目都能获得正确答案了。

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

Contributors: FHL