Я написал программу под названием mediumFloat, которая должна сканировать ввод числа. Это позволяет пользователю вводить несколько входных данных с плавающей запятой, а затем функция берет среднее значение этих входных данных.
Однако, когда я скомпилировал и запустил программу, она приняла мой ввод, но вернула -1610612736.
Я уже пытался изменить хранилище для scanf, я добавил указатель и включил глобальные переменные, которые scanf будет вызывать в основной функции и функции mediumFloat.
#include <stdio.h>
float averageFloat(int a);
int y;
float z;
int main()
{
int n;
printf("Please input a number of floats you want to include ");
n = scanf("%d", &y);
averageFloat(n);
return 0;
}
float averageFloat(int a){
for(int i = 0; i < a; i++){
printf("Please enter the float variables you want your program to average");
scanf("%f", &z);
z += z;
}
printf("the average float is %d", z/a);
return z / a;
}
Я ожидаю, что это примет мой ввод n, скажем, n = 5.
Я ожидаю, что смогу ввести 5 чисел с плавающей запятой, скажем, 0,5, 0,2, 0,3, 0,1 и 1,5, а затем разделить это на n
Спасибо за чтение.
Во-первых, переменные не должны быть глобальными. Во-вторых, ты добавляешь к z, а потом читаешь. И вы, вероятно, имеете в виду вызов функции mediumFloat(y).
Когда вы делаете scanf("%f", &z);
, вы уничтожаете любую ценность z
. Вы также не проверяете, был ли scanf
успешным.
Вы должны сделать что-то в этом роде:
float zz= 0.0;
scanf("%f", &zz);
z += zz;
Кроме того, после того, как вы закончите, вы можете сделать следующее:
printf("the average float is %d", (int) z/a);
return z / a;
Или:
printf("the average float is %f", z/a);
return z / a;
Первое усечение до int
(%d
), а второе печатание float
.
Вы также должны проверить, что a
не равно нулю.
Вы также должны использовать:
averageFloat(y);
Это сработало, я выбрал нижний метод. Спасибо! :) Но я не понимаю, что произошло. Все, что я сделал, это объявил глобальную переменную zz и поместил локальную переменную z внутрь mediumFloat. Почему это все исправило?
3 вещи: во-первых, вы перезаписали z
на scanf
, поэтому объявление переменной только для ввода чисел — правильный путь (zz
). Во-вторых, вы сказали, что собираетесь напечатать целое число (%d
), но присвоили ему число с плавающей запятой (результат деления, включающего число с плавающей запятой; в любом современном компиляторе должно быть предупреждение об этом). В-третьих, n= scanf("%d", &y);
означает: вставьте прочитанное число в y
и включите индикатор успеха n
, поэтому, если вы введете 3, y
будет иметь 3, а n
будет иметь 1.
@paxdiablo Нет. (int)(z/a)
усекает дробную часть.
Мирко, я намеревался отложить усечение как можно дольше, поскольку (int) z / a
усекает z
тогда выполняет целочисленное деление, а (int)(z/a)
выполняет деление как число с плавающей запятой и только потом усекает значение с плавающей запятой. Однако при тестировании я не смог найти пример, в котором была бы разница, поскольку усечение округляется до нуля. Я подозреваю, что округление будет другим делом.
@paxdiablo Отмечено. Я думал, вы имели в виду, что это было лучше, чем альтернатива float
. В любом случае, я думаю, что пока a
является целым числом, не имеет значения, что вы делаете ((int)z)/a
или (int)(z/a)
(первая форма может быть выполняет целочисленное деление, а последняя выполняет деление с плавающей запятой, а затем округление).
В вашем коде есть пара проблем:
Использование scanf
для записи в переменную z
, которая также является вашей
суммирующая переменная. Вы в основном перезаписываете сумму каждый раз, когда читаете ввод
Сканирование десятичного числа в переменную с плавающей запятой приведет к непредвиденным результатам. Нужно заменить scanf("%d",&z);
на scanf("%f",&z);
Оператор printf ожидает целое число, а вы передаете указатель на число с плавающей запятой. Так что нужно изменить printf("the average float is %d", z/a);
на printf("the average float is %f", z/a);
В функцию averageFloat
нужно передать переменную y, а не возвращаемое значение функции scanf
в предыдущей строке.
(голос Мегатрона) Даааа. . . Понимаю. Теперь так ясно.
Я заметил еще одну проблему, играя с ней: когда я добавляю 2 входа, а затем ввожу 2,5 и 3,5, он возвращает 2,5, когда должен возвращать 3,0, почему это так?
При ближайшем рассмотрении вы также используете возвращаемое оператором scanf значение в качестве числа элементов для усреднения: n = scanf("%d", &y);averageFloat(n);
. Переменная y должна использоваться при вызове AverageFloat.
Но разве y и n здесь не должны быть одинаковыми, или я что-то упускаю? (Я определенно что-то упускаю, потому что я сделал то, что вы сказали, и это сработало правильно.)
Нет. Возвращаемое значение — это количество элементов, отсканированных из ввода. Так что scanf("%f, %f, %f", &x,&y,&z)
вернет 3 в случае успеха. Значения, фактически полученные из ввода, находятся в переменных x, y и z (если сканирование прошло успешно). Возможно, выполните поиск «man scanf», чтобы получить страницу руководства scanf, чтобы лучше понять.
ВОТ почему он продолжал возвращать 2,5, и поэтому я должен использовать y, потому что значение, которое он возвращает при назначении, - это просто количество элементов. Я просто продолжу читать, я еще не продвинулся достаточно далеко в своей книге, но позже будет раздел об ограничениях scanf.
(int)(z/a)
было бы лучше, так как он сохраняет больше информации.