2014-09-13 70 views
0

这里是一个d运动:为什么break语句无法摆脱while循环?

import std.stdio; 

void main() 
{ 

    int[] narray; 
    while(true) { 
     writeln("Enter your numbers: "); 
     int tmp; 
     readf(" %s", &tmp); 
     if(tmp == -1) { 
      writeln("It's -1, finish reading numbers."); 
      break; 
     } 
     else { 
      writeln("Storing ", tmp, " to array."); 
      narray ~= tmp; 
      printArray(narray); 
     } 
    } 

    int[] narrayOdd; 
    int[] narrayEven; 
    int counter = 0; 
    while(counter < narray.length) { 
     if((counter % 2) == 0) { 
      narrayEven ~= narray[counter]; 
     } 
     else { 
      narrayOdd ~= narray[counter]; 
     } 
    } 

    narrayOdd.sort; 
    narrayEven.sort; 
    writeln("Your numbers in odd positions sorted: "); 
    printArray(narrayOdd); 
    writeln("Your numbers in even positions sorted: "); 
    printArray(narrayEven); 

} 

void printArray(int[] x) { 
    int counter; 
    while(counter < x.length) { 
     write(x[counter], " "); 
     counter++; 
    } 
    write("\n"); 
} 

我的意思是打出来的,而循环,当用户输入-1,但它拒绝这样做。哪里不对了?

我试过了dmd和ldc2。

回答

4

确实当您输入-1时跳出while循环,然后继续陷入下一个while循环。您正在检查while(counter < narray.length)但永远不会递增计数器。 尝试:

while(counter < narray.length) { 
    if((counter % 2) == 0) { 
     narrayEven ~= narray[counter++]; 
    } 
    else { 
     narrayOdd ~= narray[counter++]; 
    } 
} 

或:

foreach(counter , value ; narray) { 
    if((counter % 2) == 0) { 
     narrayEven ~= value; 
    } 
    else { 
     narrayOdd ~= value; 
    } 
} 
在第二形式

,所述foreach环路创建两个临时变量。 counter引用每个元素的索引并自动递增,并且value引用该索引处的值。

如果您不熟悉foreach,请看hereforeach通常优于while迭代集合,除非你有一个很好的理由否则。