Последовательность 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)