2016-06-10 7 views
0

Я не уверен, что я делаю неправильно, но цикл for не инициализируется
Код сразу же переходит к отображению printfs. Это не имеют значения в них, так как цикл не активировалиПочему это для цикла игнорируется?

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <stdlib.h> 
#define PAUSE system("Pause") 

main() { 
    // INITALIZE VARIABLES 
    int number = 0; 
    int i = 0; 
    int odd = 0; 
    int even = 0; 
    int totalNum = 0; 
    int tempNum = 0; 
    int count; 

    printf("Enter a number between 2 and 25\n"); 
    scanf("%i", &number); 

    do{ 
     if (number < 2 || number > 25) 
      printf("That was an invalid number please try again\n"); 
      scanf("%i", &number); 
    } while (number < 2 || number > 25); 

    printf("Enter how many numbers you want to input\n"); 
    scanf("%i", &count); 

    for (i = 1; i == count; ++i){ 
     printf("input numbers\n"); 
     scanf("%i", &tempNum); 
     if (tempNum % 2 == 0) 
      even++; 
     else 
      odd++; 
     totalNum = totalNum + tempNum; 
    } // END FOR LOOP 

    // DISPLAY OUTPUT 
    printf("You entered %i numbers\n", count); 
    printf("The sum of the %i numbers is %i\n", count, totalNum); 
    printf("The average of the %i numbers is %i\n", count, totalNum/count); 
    printf("You entered %i odd numbers and %i even numbers\n", odd, even); 

    PAUSE; 
} // END MAIN 
+0

ответы не дают исправление, 'я == count' ->' я <= подсчет голосов, чтобы закрыть из-за простой опечатки. –

+0

Нормальная идиома для повторения цикла 'n' times is' for (i = 0; i Barmar

ответ

0

i = 1, так i == count; дает false поэтому цикл игнорируется.

+1

oh спасибо Я изменил операторы сравнения, и он работает –

+0

@PastelitosSlim. Добро пожаловать. Не забудьте выбрать свой лучший ответ;) – ktalik

1

Ваш цикл будет выполняться в лучшем случае один раз, когда count == 1 при инициализации i - 1.

Если ввести 1 для подсчета,

printf("Enter how many numbers you want to input\n"); 
    scanf("%i", &count); 

цикл будет работать ровно один раз, пока i шагом в 2

Вы, вероятно, хотите:

for (i = 1; i <= count; ++i){ 
+0

см. Мой комментарий. –

+0

@WeatherVane Я добавил исправление прямо перед вашим голосом – Ray

+0

Нет вашего исправления 'i

0

для цикла в C работает следующим образом:

for (variable initialization; condition; variable update) { 
    /* Do something... */ 
} 

Цикл будет выполняться до тех пор, пока Условие is true. Итак, когда вы делаете:

for (i = 1; i == count; ++i) 

Цикл будет выполняться до тех пор, пока я == рассчитывать верно. Итак, если count имеет , когда эта строка выполнена, цикл никогда не будет запущен.

Как и другие отметили, вы, вероятно, хотите:

for (i = 1; i <= count; ++i) 

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

Как примечание стороны я должен указать, что обычный способ писать для петель в C-то вроде этого:

for (i = 0; i < count; i++) 

Начнем с я = 0 потому, что C массивы с нуля, поэтому N-й элемент массива имеет индекс n-1

0

Вы были так близко. В дополнение к исправлению вашего предложения теста цикла for (i = 1; i <= count; i++), я бы предложил использовать " %d" для вашего спецификатора формата . Ваш цикл do должен быть только циклом while, чтобы не печатать ваше сообщение invalid number каждый раз.

Кроме того, в то время как не ошибка, стандартный стиль кодирования для C позволяет избежать caMelCase переменных в пользу всех нижний регистр. См. NASA - C Style Guide, 1994.

С этими изменениями (и смена нечетных/даже чек на простой &) вы можете написать свой код следующим образом.

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <stdlib.h> 
// #define PAUSE system("Pause") 

int main (void) 
{ 
    int number, i, odd, even, totalnum, tempnum, count; 
    number = i = odd = even = totalnum = tempnum = count = 0; 

    printf ("enter a number between 2 and 25: "); 
    scanf (" %d", &number); 

    while (number < 2 || number > 25) { 
     printf ("invalid number, again (between 2 and 25): "); 
     scanf (" %d", &number); 
    } 

    printf ("numbers to input: "); 
    scanf (" %d", &count); 

    for (i = 1; i <= count; i++) { 
     printf ("input number %2d: ", i); 
     scanf (" %d", &tempnum); 
     if ((tempnum & 1) == 0) 
      even++; 
     else 
      odd++; 
     totalnum = totalnum + tempnum; 
    } 

    printf ("You entered %d numbers\n", count); 
    printf ("The sum of the %d numbers is %d\n", 
      count, totalnum); 
    printf ("The average of the %d numbers is %d\n", 
      count, totalnum/count); 
    printf ("You entered %d odd numbers and %d even numbers\n", 
      odd, even); 

//  PAUSE; 
    return 0; 
} 

Примечание:main имеет тип int (например, int main (int argc, char **argv) или просто int main (void) не указать никаких аргументов, принятых). Так как это тип int, он будет return значение для оболочки. Хотя исторические реализации, возможно, разрешили void main, что больше не относится к переносимому коду.

Пример использования/вывода

$ /bin/forskipped 
enter a number between 2 and 25: 4 
numbers to input: 4 
input number 1: 1 
input number 2: 2 
input number 3: 3 
input number 4: 4 
You entered 4 numbers 
The sum of the 4 numbers is 10 
The average of the 4 numbers is 2 
You entered 2 odd numbers and 2 even numbers 

Посмотрите его и дайте мне знать, если у вас есть какие-либо вопросы.

1
do{ 
    if (number < 2 || number > 25) 
     printf("That was an invalid number please try again\n"); 
     scanf("%i", &number); 
} while (number < 2 || number > 25); 

должно быть ...

do{ 
    if (number < 2 || number > 25){ 
     printf("That was an invalid number please try again\n"); 
     scanf("%i", &number); 
    } 
} while (number < 2 || number > 25); 

иначе он спрашивает всегда другой номер

+0

Хороший улов, было бы лучше иметь 'while (number <2 || number> 25) {' loop. –

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