baskon Ответов: 2

C, if ..else if..else проблема


Здравствуйте, у меня есть проблема с операторами if..
Меня попросили взять 0+4*n и 3+4n элементов Арая, но только для N-5 значений массива.. Для оставшихся 5 значений взять первое и последнее..
Затем только в этих значениях проверьте, равно ли значение в массиве 0, а если оно равно нулю, сделайте его 1.
Мой код ниже..Это немного изменено, так как в моем коде общее число предоставляется через txt-файл, который я пропустил здесь..
Проблема в конце концов...
оператор else активируется вместе с другими операторами else if ...
Есть предложения?

Что я уже пробовал:

#include <stdio.h>
int main(void)
{
int array[63];
int i,n,total;
total=50;

char selection;

for (i=0; i<total; i++)
array[i] = 0;

do{
printf("0.Exit \n");
printf("1.List array \n");
printf("2.Change value of array: \n");
scanf(" %c",&selection);

if (selection=='1')
{   
    for (i=0; i<total; i++)
    printf("%d \n", array[i]);
}

else if (selection=='2')
    {
        for (i=0; i<(total); i++)
        {
            for (n=0; n<((total)/4); n++)
            {   if (i==(0+(n*4)) && i<(total-5)&&(array[i]==0))
                {
                    array[i]=1;
                    printf("You changed array value in place %d, ",i);
                    i=n=total+1;
                    break;
                }


                else if ((i==(3+(n*4)))&&i<(total-5)&&(array[i]==0))
                {
                    array[i]=1;
                    printf("You changed array value in place %d, ",i);
                    i=n=total+1;
                    break;
                }
                else if (i==(total-5)&&(array[i]==0))
                {
                    array[i]=1;
                    fprintf("You changed array value in place %d, ",i);
                    i=n=total+1;
                    break;
                }
                else if (i==(total-1)&&(array[i]==0))
                {
                    array[i]=1;
                    printf("You changed array value in place %d, ",i);
                    i=n=total+1;
                    break;
                }
                else
                    printf("Nothing to change");

            }
        }
    }
  } while (selection!='0');
}

[no name]

"Любые предложения", да. Научитесь использовать отладчик для отладки кода.

baskon

Я нахожусь на самых первых шагах программирования на языке Си! Так что спасибо всем за помощь!
Я также постараюсь научиться использовать отладчик!

Jochen Arndt

"оператор else активируется вместе с другими операторами else if"
- Откуда ты это знаешь?

Это будет определенно не так. Вместо того чтобы печатать "что-то", выведите значения i, n и array[i], чтобы увидеть, когда предшествующие условия не совпадают.

КСТАТИ:
- Условие i==(total) никогда не будет совпадать
- Вместо использования i=n=500 для завершения циклов используйте i=n=total+1

Richard MacCutchan

Если selection == '2' ваш цикл не будет работать, потому что вы не установили значение для total Вы также, похоже, используете случайные числа (63, 53,50) для доступа к элементам вашего массива. Использовать #define оператор для определения размера массива и использования этого числа во всем вашем коде.

baskon

Большое вам спасибо за ответ!
Да, я допустил небольшую ошибку, потому что это часть более крупной программы, которая также считывает информацию из txt-файла..
Поэтому при преобразовании его во что-то, что работает без txt-файла, я допустил ошибку.я думаю, что теперь я это исправил...но все равно проблема с петлей существует..

Richard MacCutchan

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

2 Ответов

Рейтинг:
1

Albert Holguin

Если я правильно понял ваш вопрос, вы говорите, что оператор печати "else" печатается, когда вы ожидаете, что будет выполняться "else if". Это невозможно, но у вас есть это внутри вложенного цикла for, так что, возможно, он добирается до "else" на следующей итерации, когда этого не ожидается.

Я не уверен, что вы пытаетесь сделать с этим кодом (его трудно читать, я бы предложил рефакторинг), но вы хотите, чтобы там были операторы "break"? Это выведет вас из цикла for.


baskon

Меня попросили взять 0+4*n и 3+4n элементов Арая, но только для N-5 значений массива.. Для оставшихся 5 значений взять первое и последнее..
Затем только в этих значениях проверьте, равно ли значение в массиве 0, а если оно равно нулю, сделайте его 1.

Вот почему у меня есть этот большой цикл for... и так много операторов if..

Проблема правильно заключается в последнем операторе else, где я хочу написать сообщение "no zero values find"...
Но он выполняется в других операторах несколько раз...

Если у вас есть какое-то лучшее решение для форматирования, конечно, я весь внимание! Большое спасибо!

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.
И завершите свой код, чтобы мы могли его скомпилировать и запустить.
добавьте также точное утверждение.

Albert Holguin

Ну, во-первых... Я спросил, не нарочно ли ты там ломаешься... ты понимаешь, что это значит?

Рейтинг:
0

Patrice T

Ваш код не завершен, мы не можем придумать, что он должен делать. Пожалуйста, завершите его, чтобы мы могли понять, что вы пытаетесь сделать.
Единственно возможный совет:
Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.

[обновление]
С помощью отладчика проверьте это

i=n=total+1;

делать то, что вы думаете, она должна.


baskon

Хорошо, я обновил свой код выше...
Попробуем сегодня же проверить и попробовать изучить отладчик!
Спасибо!