>>>> ...the input being the ages (integers), and the output being the average (float)...
Посмотрите на выражение:
average = (a + b + c)/3;
| |_________| |
float int integer constant
Правая часть выражения - все int
, поэтому вывод этоговыражение будет int
печататься, а не float
.Это выражение в конечном итоге присваивает значение int
переменной типа float
.
Чтобы устранить эту проблему, вы должны знать о неявных правилах продвижения и преобразования типов.С По умолчанию тип продвижения и преобразования
Если операция включает в себя два операнда, и один из них имеет тип float, другой преобразуется в float.
[Есть несколько правил над этим правилом, и оно применяется только тогда, когда эти правила не действуют]
Итак, в выражении (a + b + c)/3
, если мы изменим integer constant
до float constant
, тогда результирующий результат всего выражения будет иметь тип float
.
average = (a + b + c)/3.0f;
[Нефиксированная плавающая константа имеет тип double
.Если суффикс представляет собой букву f
или F
, плавающая константа имеет тип float
.]
Согласно правилам продвижения типов, если у вас есть какая-либо (или все) переменная среди a
, b
и c
типа float
результирующее значение выражения с integer constant
будет иметь тип float
.
Например:
float a, b, c;
Or
int a, b;
float c; // Of course you don't want to do this because in your example a, b and c
// represents same thing and you want all of them to be of same type.
// This is just for the understanding.
average = (a + b + c)/3;
|____________|
|
The result of this will be of type float because at least one among a, b and c is
of type float and by the type promotion rule other will be promoted to float and
(a + b + c) will be calculated as all float type.
Вы также можете использовать приведение типа для решения проблемы.Но при этом также не забывайте правило преобразования типов.
Например, в выражении вы можете сделать
either this
average = (float)(a + b + c)/3;
or this
average = (a + b + c)/(float)3;
При этом результирующее значение выражения будет иметь видвведите float
, поскольку тип одного из операндов оператора /
равен float
.Но если вы сделаете:
average = (float)((a + b + c)/3);
, вы не получите желаемый результат, потому что выражение (a + b + c)/3
будет вычислено, будет иметь значение int
, а полученный результат будет иметь тип int
, а это не такимеет смысл набирать это приведение после вычисления выражения.
>>>> Also, any advice on how to more neatly get the age inputs would be nice, is this the best way to do it?
На мой взгляд, это не лучший способ, потому что таким образом пользователь не может указать точный возрастгод / месяц / дни (кажется, что вы берете только год в качестве ввода).Для практики такого рода примеров этот способ может быть приемлемым, так как вы вычисляете среднее число 3
чисел, но когда вы пишете какое-то реальное приложение, в котором вы принимаете возраст в качестве ввода от пользователя, этот способ совсем не подходит.Кроме того, вы не делаете никакой проверки ввода пользователя.10000000
или -50
(отрицательное значение) не является допустимым значением для возраста.