Почему моя программа возвращает адрес памяти?

Я написал программу под названием 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

Спасибо за чтение.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
367
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Во-первых, переменные не должны быть глобальными. Во-вторых, ты добавляешь к 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);
(int)(z/a) было бы лучше, так как он сохраняет больше информации.
paxdiablo 07.04.2019 03:58

Это сработало, я выбрал нижний метод. Спасибо! :) Но я не понимаю, что произошло. Все, что я сделал, это объявил глобальную переменную zz и поместил локальную переменную z внутрь mediumFloat. Почему это все исправило?

user10643054 07.04.2019 04:05

3 вещи: во-первых, вы перезаписали z на scanf, поэтому объявление переменной только для ввода чисел — правильный путь (zz). Во-вторых, вы сказали, что собираетесь напечатать целое число (%d), но присвоили ему число с плавающей запятой (результат деления, включающего число с плавающей запятой; в любом современном компиляторе должно быть предупреждение об этом). В-третьих, n= scanf("%d", &y); означает: вставьте прочитанное число в y и включите индикатор успеха n, поэтому, если вы введете 3, y будет иметь 3, а n будет иметь 1.

Mirko 07.04.2019 04:09

@paxdiablo Нет. (int)(z/a) усекает дробную часть.

Mirko 08.04.2019 07:03

Мирко, я намеревался отложить усечение как можно дольше, поскольку (int) z / a усекает zтогда выполняет целочисленное деление, а (int)(z/a) выполняет деление как число с плавающей запятой и только потом усекает значение с плавающей запятой. Однако при тестировании я не смог найти пример, в котором была бы разница, поскольку усечение округляется до нуля. Я подозреваю, что округление будет другим делом.

paxdiablo 08.04.2019 07:14

@paxdiablo Отмечено. Я думал, вы имели в виду, что это было лучше, чем альтернатива float. В любом случае, я думаю, что пока a является целым числом, не имеет значения, что вы делаете ((int)z)/a или (int)(z/a) (первая форма может быть выполняет целочисленное деление, а последняя выполняет деление с плавающей запятой, а затем округление).

Mirko 08.04.2019 21:31
Ответ принят как подходящий

В вашем коде есть пара проблем:

  • Использование 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 в предыдущей строке.

(голос Мегатрона) Даааа. . . Понимаю. Теперь так ясно.

user10643054 07.04.2019 04:08

Я заметил еще одну проблему, играя с ней: когда я добавляю 2 входа, а затем ввожу 2,5 и 3,5, он возвращает 2,5, когда должен возвращать 3,0, почему это так?

user10643054 07.04.2019 04:20

При ближайшем рассмотрении вы также используете возвращаемое оператором scanf значение в качестве числа элементов для усреднения: n = scanf("%d", &y);averageFloat(n);. Переменная y должна использоваться при вызове AverageFloat.

drclaw 07.04.2019 04:28

Но разве y и n здесь не должны быть одинаковыми, или я что-то упускаю? (Я определенно что-то упускаю, потому что я сделал то, что вы сказали, и это сработало правильно.)

user10643054 07.04.2019 05:16

Нет. Возвращаемое значение — это количество элементов, отсканированных из ввода. Так что scanf("%f, %f, %f", &x,&y,&z) вернет 3 в случае успеха. Значения, фактически полученные из ввода, находятся в переменных x, y и z (если сканирование прошло успешно). Возможно, выполните поиск «man scanf», чтобы получить страницу руководства scanf, чтобы лучше понять.

drclaw 07.04.2019 05:19

ВОТ почему он продолжал возвращать 2,5, и поэтому я должен использовать y, потому что значение, которое он возвращает при назначении, - это просто количество элементов. Я просто продолжу читать, я еще не продвинулся достаточно далеко в своей книге, но позже будет раздел об ограничениях scanf.

user10643054 07.04.2019 06:08

Другие вопросы по теме