2017-02-08 10 views
-1

Цикл while ниже должен вводить пользователю пять чисел от 1 до 10 и распечатывать их обратно.Невозможно получить это, пока функция в C работает

Что я делаю неправильно?

Мой код

#include <stdio.h> 

int array[5]; 
int main() 
{ 
    int ctr= 0, 
    nbr = 0; 
    printf("Enter 5 numbers from 1-10\n"); 

    while(ctr<5) 
    { 
    while(nbr < 1 || nbr > 10) 
    { 
     printf("\nEnter number %d of 5: ",ctr+1); 
     scanf("%d",&nbr); 
    } 

    array[ctr]= nbr; 
    ctr++; 
    } 
    for (ctr=0;ctr<5;ctr++) 
    printf("Value %d is %d\n",ctr+1,array[ctr]); 

    return(0); 
} 
+2

Почему это не работает? –

+4

В чем проблема? Не могли бы вы рассказать об этом? Разве он не строится? Сбой при запуске программы? Дать неожиданные результаты? Пожалуйста, найдите время, чтобы [прочитать о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask). –

+0

@KamiKaze Это не имело ничего общего с его проблемой. –

ответ

0

while(nbr < 1 || nbr > 10) работает только один раз, в первый раз, когда nbr 0.

После этого nbr действует, так что вы не входите в цикл снова и ваш массив заполняется номером имени. Вы должны объявить и инициализировать int nbr = 0; в цикле (в любом случае вы не нуждаетесь во вне цикла).

while(ctr<5) 
    { 
    int nbr = 0; 

или использовать do/while вместо условии, что требует от вас аннулирует значение первого:

do 
{ 
    printf("\nEnter number %d of 5: ",ctr+1); 
    scanf("%d",&nbr); 
} while(nbr < 1 || nbr > 10); 
+0

@Someprogrammerdude имена переменных настолько явны! Как мог пропустить это :) –

+0

Джин, его петли в порядке. Он только забыл сбросить 'nbr'. Я не согласен с вашим обновленным циклом; это менее понятно. –

+0

@PaulOgilvie Действительно ли мой ответ правильный? –

1
while(nbr < 1 || nbr > 10) 
{ 
    printf("\nEnter number %d of 5: ",ctr+1); 
    scanf("%d",&nbr); 
} 

array[ctr]= nbr; 
ctr++; 

// Add this line after `ctr++` 
nbr = 0; // <====== 

Вы должны сбросить nbr, чтобы повторно ввести то время как цикл.

(Потому что после того, как первый правильный номер nbr вводится условие, а всегда ложно.)

3

Рассмотрим этот цикл вашей программы:

while(nbr < 1 || nbr > 10) 
    { 
    printf("\nEnter number %d of 5: ",ctr+1); 
    scanf("%d",&nbr); 
    } 

Здесь Этот цикл будет работать в первый раз потому что вы определили nbr = 0, поэтому он удовлетворяет условию цикла и входит в него, затем до тех пор, пока вы не возьмете число между 1 и 10, оно продолжает работать, как только вы берете число, которое находится между 1 и 10, вы lea ve, но теперь, потому что nbr теперь находится между 1 и 10, вы больше не войдете в цикл.

Этот цикл будет выполняться только один раз, поэтому вы не можете принимать ввод всех 5 номеров.

Если вы после хранения nbr в массиве, назначьте nbr = 0, теперь он снова перейдет в цикл, и ваш код будет работать нормально.

Правильный код

#include <stdio.h> 

int array[5]; 

int main(){ 

    int ctr= 0, 
    nbr = 0; 
    printf("Enter five numbers from 1-10\n"); 

    while(ctr<5){ 

    while(nbr < 1 || nbr > 10)//First time it enter the loop because nbr = 0 
           //But after that nbr is between 1 and 10 
           //So it does not enter again and you can not input more number. 
    { 
     printf("\nEnter number %d of 5: ",ctr+1); 
     scanf("%d",&nbr); 
    } 

    array[ctr]= nbr; 
    nbr = 0;   //So That Loop Run Again 
    ctr++; 
    } 
    for (ctr=0;ctr<5;ctr++)     
    printf("Value %d is %d\n",ctr+1,array[ctr]); 

    return(0); 
} 

Также Там другие способы, которые вы можете подойти к этой проблеме, вы можете использовать do-while цикл, который выполняется в первый раз, все время, а затем проверить состояние.

Другой метод, используя делать-то время цикла

do 
     { 
     printf("\nEnter number %d of 5: ",ctr+1); 
     scanf("%d",&nbr); 
     } while (nbr < 1 || nbr > 10); 

Теперь здесь сначала введите номер и хранится в nbr, если он находится между 1 и 10 выхода из цикла и сохраняется в массив, и теперь вы снова запускаете внешний цикл, и снова вы сталкиваетесь с этим, он всегда выполняется в первый раз, а затем проверяет состояние, поэтому вам не нужно повторно инициализировать nbr = 0 каждый раз.

Совет
Всегда Опишите проблему более четко и сказать, что вы ожидали это делать и то, что он делает так, что другие могут лучше понять его и дать вам лучше и быстрые решения.

+0

Почему мне нужно установить nbr = 0; когда это было сделано до первого цикла? – RhodosCoder

+0

Потому что он войдет внутрь цикла только в том случае, если он удовлетворяет условию '(nbr < 1 || nbr > 10)', теперь вы сначала инициализировали nbr, чтобы это условие выполнялось, и мы проходим внутри цикла, а затем он продолжает работать до тех пор, пока nbr не будет находиться между 1 - 10 и после этого мы выходим из цикла, а nbr хранится в массиве, теперь для другого номера вы снова переходите к циклу, но на этот раз, поскольку nbr находится между 1- 10, вы не входите в цикл и никогда не сможете ввести какое-либо другое число, см. мой ответ еще раз и спросите, есть ли у вас сомнения. Внимательно прочитайте ответ. –

+0

@RhodosCoder См. Выше :) –

0

Вы должны изменить a, a; после инициализации переменной ctr или записать ее как показано ниже.

#include <stdio.h> 

main() 
{ 
     int array[5]; 
     int ctr= 0, nbr = 0; 
     printf("Enter 5 numbers from 1-10\n"); 

     while(ctr<5) 
     { 
      //greater than zero includes 1, less than 11 includes 10 
      while(nbr > 0 || nbr < 11) 
      { 
       printf("\nEnter number %d of 5: ",ctr+1); 
       scanf("%d",&nbr); 
      } 

      array[ctr]= nbr; 
      ctr++; 
     } 
    for (ctr=0;ctr<5;ctr++) 
    { 
     printf("Value %d is %d\n",ctr+1,array[ctr]); 
    } 
return(0); 
} 
+0

Пожалуйста, смотрите его код снова, он такой же, как ваш код, его код просто трудно понять, он сделал int ctr = 0, а на следующей строке nbr = 0; поэтому он такой же, как ваш. –