Предположим, вам нужно найти площадь треугольника, зная основание и высоту.
#include <stdio.h>
int main ()
{
float base,height,area;
printf("Enter base and height of triangle: \n");
scanf("%f%f",&base,&height);
area=0.5*base*height;
printf("The area of the triangle is %f",area);
return 0;
}
Почему программа дает правильный ответ с приведенным выше кодом, но не с тем, что ниже??
#include <stdio.h>
int main ()
{
float base,height,area;
printf("Enter base and height of triangle: \n");
scanf("%f%f",&base,&height);
area=(1/2)*base*height;
printf("The area of the triangle is %f",area);
return 0;
}
Этот показывает 0 независимо от того, какие значения вы вводите. Какую очевидную вещь я здесь упускаю?
В C оператор «/» возвращает только целую часть деления, поэтому формула для площади принимает вид 0 * основание * высота.
попробуйте что-то вроде 1.0f/2
или 1/2.0f
, чтобы сообщить компилятору, что вам нужно разделение с плавающей запятой.
Ни то, ни другое не правильно. Двоичный *
имеет ассоциативность слева направо, поэтому в случае 0.5*base*height
все выражение будет оцениваться как double
.
@kmalarski пытается привести тип, это тоже не сработает?
@Lundin извините, я не знаю, что это значит, не могли бы вы объяснить немного подробнее, пожалуйста?
Это означает, что если вы используете типы float
, вы всегда должны использовать константы с плавающей запятой, оканчивающиеся на f
. То есть: 0.5f
. В противном случае вы могли бы также использовать double
везде (что, вероятно, в любом случае является правильным выбором, если программировать для ПК).
@Lundin ааа, хорошо, спасибо за объяснение
Выражение
(1/2)
делит два целых числа. В отличие от Python или некоторых других языков, это не будет неявно преобразовано в число с плавающей запятой, а останется целым числом. Следовательно, результат равен 0.
Изменение выражения на
(1./2)
решает вашу проблему.
Второй вычисляет 1/2 как целое число, которое всегда равно 0.