2014-09-13 2 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

Это делает вырывается из цикла while, когда вы вводите -1, а затем продолжает застревать в следующем цикле. Вы проверяете while(counter < narray.length), но никогда не увеличиваете счетчик. Try:

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, смотрите here. foreach обычно предпочтительнее while для итерации по коллекции, если у вас нет веских оснований для этого.

Смежные вопросы