Цикл в C пошел не так

#c #arrays #loops #variables

#c #массивы #циклы #переменные

Вопрос:

У меня есть этот код

 for (i = 0; i < s; i  ) // for i from 0 to Runners
{
    for (j = 0; j < 4; j  ) //for j from 0 to laps
    {
        printf("nEnter the time of lap %d for runner %d in minutes: ", j 1, i 1); // prompt for time for each runner in minutes
        while (scanf("%d", amp;Runnerm[i][j]) != 1) // While scanf returns not equal to 1 (value parsed == TRUE)
        {
            while ((ch = getchar()) != 'n') putchar(ch); // check if ch=character, compare last entry (n if character)
            printf(" is not an integer.nPlease enter only an "); // print error
            printf("integer, such as 1, 5, or 9 : n"); // cnt print error
        }

        printf("Enter the time of lap %d for runner %d in seconds: ", j 1, i 1); //prompt for time for each runner in seconds
        while (scanf("%d", amp;Runners[i][j]) != 1) // While scanf returns not equal to 1 (value parsed == TRUE)
        {
            while ((ch = getchar()) != 'n') putchar(ch); // check if ch=character, compare last entry (n if character)
            printf(" is not an integer.nPlease enter only an "); // print error
            printf("integer, such as 1, 5, or 9 : n"); // cnt print error
        }

        printf(" n check 1 n ");
        printf("n %d minutes -- %d seconds n", Runnerm[i][j], Runners[i][j]); // Correct Check!

        printf(" n check 1.5 n ");
        printf("n %d minutes -- %d seconds n", Runnerm[i][0], Runners[i][0]); // Incorrect Check!
        printf("n %d minutes -- %d seconds n", Runnerm[i][1], Runners[i][1]); // Incorrect Check!
        printf("n %d minutes -- %d seconds n", Runnerm[i][2], Runners[i][2]); // Incorrect Check!
        printf("n %d minutes -- %d seconds n", Runnerm[i][3], Runners[i][3]); // Incorrect Check!

    }
}
 

Проблема в том, что когда проверка 1.5 выполняется во второй раз, Runnerm[i][j] получает значения из Runners[i 1][j]

Короче говоря, когда я изменяю значение, предыдущее сохраненное значение Runnerm получит значение бегунов, которое в данный момент сохраняется..

Почему это? Я не могу найти причину..

Редактировать: «проверка 1» и «проверка 1.5» существуют для всей цели — проверки- значений в любой момент времени цикла. Итак, даже если я их удалю, программа все равно будет нарушена. ТАКЖЕ, когда все это будет исправлено, проверки будут удалены, потому что мне больше не нужно будет проверять значения. Спасибо всем за ответы, но я не понимаю, почему вы предлагаете что-то делать с проверками, они предназначены для отладки. :

Редактировать Найдено, что вызвало проблему, когда я использовал другую версию программы, которая использовала меньше массивов, проблема была решена, когда я начал добавлять случайные неиспользуемые массивы, проблема появляется. Почему это? (Новая проблема) Может ли быть так, что память перекрывается с той, которую используют бегуны [i] [j]?

Комментарии:

1. Как определяются массивы?

2. int Runnerm[s][4]; // Бегуны / минуты int Бегуны [s] [4]; // Бегуны / секунды

3. Вы говорите, что from check 1 to check 1.5 i изменяет значения, то есть оно увеличивается на 1 ?

4. Что вы пытаетесь увидеть в своем check 1.5 ? Вы будете выводить много неназначенных значений (например Runnerm[i][1] , когда j = 0)

5. да, потому что я объявляю в первом цикле i Проверка 1.5 выполняется отлично в 1-й раз, начиная со 2-го раза (когда я изменяю значение), все это прерывается, и значения и предыдущий запуск изменяются на текущие значения бегунов

Ответ №1:

Похоже, что ваш printf оператор показывает следующий бегун / следующий раз, но записывает для бегуна / времени раньше:

 printf("nEnter the time of lap %d for runner %d in minutes: ", j 1, i 1);
                                                                ^^^^ ^^^^
 

Почему бы и нет i j

Комментарии:

1. Хороший улов. Люблю эти проблемы с базой 0 до базы 1 🙂

2. Случается со всеми нами 🙂

3. потому что я хочу, чтобы пользователь видел runner 1, а не runner 0. это ничего не меняет в данных. обычный пользователь будет сбит с толку, увидев бегуна 99 как максимум, когда ввод составлял около 100 бегунов.

Ответ №2:

Переместите эти строки кода:

 printf(" n check 1.5 n ");
printf("n %d minutes -- %d seconds n", Runnerm[i][0], Runners[i][0]);
printf("n %d minutes -- %d seconds n", Runnerm[i][1], Runners[i][1]);
printf("n %d minutes -- %d seconds n", Runnerm[i][2], Runners[i][2]);
printf("n %d minutes -- %d seconds n", Runnerm[i][3], Runners[i][3]);
 

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

 #define RUNNERS s
#define LAPS 4

for (i = 0; i < RUNNERS; i  )
{
    for (j = 0; j < LAPS; j  )
    {
        printf("Enter the time of lap %d for runner %d in seconds: ", j 1, i 1)
        while (scanf("%d", amp;Runners[i][j]) != 1)
        {
            while ((ch = getchar()) != 'n') putchar(ch);
            printf(" is not an integer.nPlease enter only an integer, such as 1, 5, or 9 : n");
        }

        printf(" n check 1 n ");
        printf("n %d minutes -- %d seconds n", Runnerm[i][j], Runners[i][j]);

    }

    printf(" n check 1.5 n ");

    for (j = 0; j < LAPS; j  )
        printf("n %d minutes -- %d seconds n", Runnerm[i][j], Runners[i][j]);
}
 

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

Комментарии:

1. Проверки НЕ ПРОБЛЕМА, сколько раз я должен это говорить? проверки существуют для ПРОВЕРКИ значений, даже без проверки 1 или проверки 1.5 значения ВСЕ РАВНО МЕНЯЮТСЯ : O

Ответ №3:

Уточнил код вопроса для реальной программы:

 #include <stdio.h>

int main()
  {
  int s = 3;
  int i;
  int j;
  int ch;
  int Runnerm[s][4]; //Runners / minutes
  int Runners[s][4]; //Runners / seconds

  for (i = 0; i < s; i  ) // for i from 0 to Runners
     {
     for (j = 0; j < 4; j  ) //for j from 0 to laps
        {
        printf("nEnter the time of lap %d for runner %d in minutes: ", j 1, i 1); // prompt for time for each runner in minutes
        while (scanf("%d", amp;Runnerm[i][j]) != 1) // While scanf returns not equal to 1 (value parsed == TRUE)
           {
           while ((ch = getchar()) != 'n') putchar(ch); // check if ch=character, compare last entry (n if character)
           printf(" is not an integer.nPlease enter only an "); // print error
           printf("integer, such as 1, 5, or 9 : n"); // cnt print error
           }

        printf("Enter the time of lap %d for runner %d in seconds: ", j 1, i 1); //prompt for time for each runner in seconds
        while (scanf("%d", amp;Runners[i][j]) != 1) // While scanf returns not equal to 1 (value parsed == TRUE)
           {
           while ((ch = getchar()) != 'n') putchar(ch); // check if ch=character, compare last entry (n if character)
           printf(" is not an integer.nPlease enter only an "); // print error
           printf("integer, such as 1, 5, or 9 : n"); // cnt print error
           }

        printf("check 1 n ");
        printf("t %d minutes -- %d seconds n", Runnerm[i][j], Runners[i][j]); // Correct Check!

        printf("check 1.5 n ");
        printf("t %d minutes -- %d seconds n", Runnerm[i][0], Runners[i][0]); // Incorrect Check!
 

Добавлено следующее if(j > ... , чтобы не печатать неинициализированные значения массива:

         if(j > 0) printf("t %d minutes -- %d seconds n", Runnerm[i][1], Runners[i][1]); // Incorrect Check!
        if(j > 1) printf("t %d minutes -- %d seconds n", Runnerm[i][2], Runners[i][2]); // Incorrect Check!
        if(j > 2) printf("t %d minutes -- %d seconds n", Runnerm[i][3], Runners[i][3]); // Incorrect Check!
        }
     }

  return(0);
  }
 

Затем я скомпилировал код:

 SLES11SP2:~/SO> gcc -Wall -o test *.c
 

И запустил код:

 SLES11SP2:~/SO> ./test

Enter the time of lap 1 for runner 1 in minutes: 1
Enter the time of lap 1 for runner 1 in seconds: 2
check 1
   1 minutes -- 2 seconds
check 1.5
   1 minutes -- 2 seconds

Enter the time of lap 2 for runner 1 in minutes: 3
Enter the time of lap 2 for runner 1 in seconds: 4
check 1
   3 minutes -- 4 seconds
check 1.5
   1 minutes -- 2 seconds
   3 minutes -- 4 seconds

Enter the time of lap 3 for runner 1 in minutes: 5
Enter the time of lap 3 for runner 1 in seconds: 6
check 1
   5 minutes -- 6 seconds
check 1.5
   1 minutes -- 2 seconds
   3 minutes -- 4 seconds
   5 minutes -- 6 seconds

Enter the time of lap 4 for runner 1 in minutes: 7
Enter the time of lap 4 for runner 1 in seconds: 8
check 1
   7 minutes -- 8 seconds
check 1.5
   1 minutes -- 2 seconds
   3 minutes -- 4 seconds
   5 minutes -- 6 seconds
   7 minutes -- 8 seconds

Enter the time of lap 1 for runner 2 in minutes: 9
Enter the time of lap 1 for runner 2 in seconds: 10
check 1
   9 minutes -- 10 seconds
check 1.5
   9 minutes -- 10 seconds

Enter the time of lap 2 for runner 2 in minutes: 11
Enter the time of lap 2 for runner 2 in seconds: 12
check 1
   11 minutes -- 12 seconds
check 1.5
   9 minutes -- 10 seconds
   11 minutes -- 12 seconds

Enter the time of lap 3 for runner 2 in minutes: 13
Enter the time of lap 3 for runner 2 in seconds: 14
check 1
   13 minutes -- 14 seconds
check 1.5
   9 minutes -- 10 seconds
   11 minutes -- 12 seconds
   13 minutes -- 14 seconds

Enter the time of lap 4 for runner 2 in minutes: 15
Enter the time of lap 4 for runner 2 in seconds: 16
check 1
   15 minutes -- 16 seconds
check 1.5
   9 minutes -- 10 seconds
   11 minutes -- 12 seconds
   13 minutes -- 14 seconds
   15 minutes -- 16 seconds

Enter the time of lap 1 for runner 3 in minutes: 17
Enter the time of lap 1 for runner 3 in seconds: 18
check 1
   17 minutes -- 18 seconds
check 1.5
   17 minutes -- 18 seconds

Enter the time of lap 2 for runner 3 in minutes: 19
Enter the time of lap 2 for runner 3 in seconds: 20
check 1
   19 minutes -- 20 seconds
check 1.5
   17 minutes -- 18 seconds
   19 minutes -- 20 seconds

Enter the time of lap 3 for runner 3 in minutes: 21
Enter the time of lap 3 for runner 3 in seconds: 22
check 1
   21 minutes -- 22 seconds
check 1.5
   17 minutes -- 18 seconds
   19 minutes -- 20 seconds
   21 minutes -- 22 seconds

Enter the time of lap 4 for runner 3 in minutes: 23
Enter the time of lap 4 for runner 3 in seconds: 24
check 1
   23 minutes -- 24 seconds
check 1.5
   17 minutes -- 18 seconds
   19 minutes -- 20 seconds
   21 minutes -- 22 seconds
   23 minutes -- 24 seconds
SLES11SP2:~/SO> 
 

Кажется, все работает нормально.

Комментарии:

1. можете ли вы сделать это для двух бегунов и посмотреть, работает ли он одинаково? потому что проблема появляется только тогда, когда есть более 2 бегунов

2. Вот и все… 3 бегуна.

3. Но я получаю те же неправильные результаты, я скопировал ваш код в eclipse, и все же runnerm изменяется :

4. Обнаружена проблема, когда я использовал предыдущую резервную копию, которая работает, и начал добавлять случайные массивы, проблема появляется, поэтому мне нужно понять, почему добавление случайных массивов привело к сбою программы, даже если массивы не используются