Цифры после запятой исчезают после возврата из другой функции

Я новичок в программировании, и недавно я делал домашнее задание в школах. Содержание домашнего задания состоит в вычислении среднего значения набора данных. Ниже мой код. Я обнаружил, что правильное значение — 93,974998, но значение, отображаемое в терминале, — всего 93,000000.

#include <stdlib.h>
#include <stdlib.h>
#include <stdio.h>
#include "stats.h"
int findmean(unsigned char *ptr, float count);

int main() {

  unsigned char test[SIZE] = {34, 201, 190, 154,   8, 194,   2,   6,
                              114, 88,   45,  76, 123,  87,  25,  23,
                              200, 122, 150, 90,   92,  87, 177, 244,
                              201,   6,  12,  60,   8,   2,   5,  67,
                                7,  87, 250, 230,  99,   3, 100,  90};

    float mean = 0;
    float length_data = SIZE;
    
    mean = findmean( &test[0] , length_data);
    printf(" mean of the data is %f \n", mean );

    return 0;
}

int findmean(unsigned char *ptr, float count){

    float total = 0;
    for(int i = 0; i < count; i++){
            
            total += *ptr;
            ptr++;
                    
    }
    printf("count is %f\n", count);
    
    return total/count;
}

Если я изменю код, вместо деления общего значения в функции findmean, а в функции printf наподобие printf(" mean of the data is %f \n", mean/lenght_data );, то ответ будет правильным.

Я просто не понял, в чем проблема? Может ли кто-нибудь, где я сделал неправильно?

Кстати, я использую geany, а версия GCC — 9.4.0, если кто-то захочет знать.

int не имеет десятичной точки.
tkausl 20.03.2022 03:37

Вы возвращаете int.

kaylum 20.03.2022 03:37

Для будущего справочного кода, который мы не можем скомпилировать, это бесполезно (для )_вашей_ причины). Кажется, что SIZE, вероятно, определено в stat.h, но в любом случае не требуется. Удалите из объявления test: unsigned char test[] = ..., затем int float length_data = sizeof(test)/sizeof(*test) ;. Хотя проблема явно в том, что findmean() возвращает int, ваш подход к типам данных довольно «случайный» и непродуманный. Например, length_data должно быть целым числом, как и параметр findmean()count, учитывая, что вы затем используете его в целочисленном цикле for.

Clifford 20.03.2022 09:02
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вернуть тип плавающая точка, а не int

// int findmean(unsigned char *ptr, float count);
...
// int findmean(unsigned char *ptr, float count){

float findmean(unsigned char *ptr, float count);
float findmean(unsigned char *ptr, float count){

float против double

Лучше всего использовать double в качестве типа с плавающей запятой по умолчанию в C. Оба имеют ограниченную точность. «Правильное значение ist 93,974998» печатается, когда используется float, но математически правильный ответ — 93,975. Используйте double, если нет особой необходимости использовать float.

Передовой

Ниже показано, как я бы закодировал вычисление иметь в виду.

// Use `double` return type.
// Array length in `size_t` - not too wide, not to narrow type for arrays sizing.
// Length first to allow for diagnostics on ptr[]
// Use `const`  to indiacte the refeneced data in `ptr[]` does not change.
double findmean_alt(size_t count, const unsigned char ptr[count]) {
  // Accumulate the integer sum of `unsigned chars in a wider integer
  unsigned long total = 0;
  for (size_t i = 0; i < count; i++) {
    total += ptr[i];  // Index into the data with `i`
  }

  printf("total is %lu\n", total);
  printf("count is %zu\n", count);

  // Perform the division with `double` math
  return 1.0 * total / count;
}

... и назвал это

// mean = findmean( &test[0] , length_data);
// Declare `mean` and initialize in one step.
double mean = findmean_alt(sizeof test/ sizeof test[0], test);

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