Последовательность if-else if в C

Я использую следующую логику для проверки, является ли треугольник равнобедренным, равносторонним, разносторонним или прямоугольным.

if (side1 == side2 || side2 == side3 || side1 == side3)
    printf("Isosceles triangle.");
else if (side1 == side2 && side2 == side3 && side3 == side1)
    printf("equilateral triangle");

Я получаю выходные данные для сторон 3 3 3 как равнобедренные, но не равносторонние, но когда я чередую логику, то есть пишу логику равностороннего, сначала я получаю равносторонний. Я не могу понять, что происходит?

5 ответов

Вы не должны использовать else в этом случае.

Код:

if (condition)
     code
else if (condition2)
     code2

Проверяет, выполняется ли условие. Если это так, он выполняет код. Только если условие ложно, условие 2 проверяется и код2 может быть выполнен.

Ваш код "проверяет" второй if только когда первый if ложно
логически второе, если может быть правдой, только если первое if правда...

Я бы изменил код на:

if (side1 == side2 || side2 == side3 || side1 == side3)
{
    printf("Isosceles triangle.");
    if (side1 == side2 && side2 == side3 && side3 == side1)
        printf("equilateral triangle");
}

Side1 = 3, side2 = 3, side = 3, что означает, что side1 == side2 имеет значение true. Вот почему ваша программа распечатывает "Равнобедренные". Beacuse first, если true, второе не будет проверено. Это было бы только в том случае, если первый был ложным.

else выполняется только если if не выполняется. Просто удали else и он сможет напечатать оба заявления в таком случае.

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

if (side1 == side2 && side2 == side3 && side3 == side1)
    printf("Equilateral triangle");
else if (side1 == side2 || side2 == side3 || side1 == side3)
    printf("Isosceles triangle.");

В качестве альтернативы, вы можете вкладывать равносторонний блок if внутри равнобедренного блока if, если хотите, чтобы оба результата были напечатаны:

if (side1 == side2 || side2 == side3 || side1 == side3){
    if (side1 == side2 && side2 == side3 && side3 == side1){
        printf("Equilateral triangle");
    }
    printf("Isosceles triangle.");
}

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

(side1 == side2 && side2 == side3) => (side1 == side3)

Итак, оператор if может выглядеть так:

if (side1 == side2 && side2 == side3)
Другие вопросы по тегам