Cześć
Mam pewien problem z zadaniem i nie do końca wiem gdzie.
Oto treść zadania:
Napisz funkcje do obliczania sumy i wartości średniej z elementów tablicy oraz pobierania tablicy od użytkownika.
Prototypy funkcji powinny wyglądać następująco:
int sum(const float* tab, unsigned int size, float *result);
int avg(const float* tab, unsigned int size, float *result);
int read_vector_float(float *vec, int size, float stop_value);
Funkcje avg i sum:
Parametry:
tab - wskaźnik na tablicę typu float, dla której ma zostać wyznaczona suma / wartość średnia,
size - liczba elementów w tablicy,
result - wskaźnik na zmienną typu float, w której ma zostać zapisana obliczona suma / wartość średnia.
Wartość zwrócona:
1 - w przypadku podania błędnych danych,
0 - w przeciwnym przypadku.
Funkcja read_vector_float:
Parametry:
vec - wskaźnik na tablicę typu float, do której mają zostać zapisane wartości podane przez użytkownika,
size - zadeklarowany rozmiar tablicy,
stop_value - wartość oznaczająca koniec danych podawanych przez użytkownika.
Wartość zwrócona:
>=0 - liczba pobranych elementów,
-1 - w przypadku podania błędnych danych w parametrach, podczas wywołania funkcji,
-2 - w przypadku wprowadzenia błędnych danych przez użytkownika.
Napisz program, który pobierze od użytkownika ciąg liczb rzeczywistych (maksymalnie 100, w przypadku mniejszej liczby danych wartość 0 będzie oznaczała koniec wprowadzania danych) i zapisze je do tablicy. Następnie, wykorzystując przygotowane funkcje, program ma wyznaczyć i wyświetlić, z dokładnością dwóch miejsc po przecinku, w kolejnych liniach sumę podanych wartości oraz wartość średnią.
W przypadku niepodania żadnej wartości program ma wyświetlić komunikat Not enough data available i zakończyć działanie z kodem błędu 3, a w przypadku wprowadzenia błędnych danych komunikat Incorrect input i zakończyć działanie z kodem błędu 1. Jeżeli wszystkie operacje się powiodą program powinien zwrócić wartość 0.
Przykładowe wejście:
Podaj liczby: ⏎
5.895462 -2.534116 6.274956 -9.079528 -3.419764 0.000000⏎
Przykładowe wyjście:
Suma: -2.86 ⏎
Srednia: -0.57 ⏎
Uwaga
Nie używaj odwołania tablicowego (T[xx]).
Tak więc rozpisałem kod:
#include <stdio.h>
int sum(const float* tab, unsigned int size, float* result);
int avg(const float* tab, unsigned int size, float* result);
int read_vector_float(float* vec, int size, float stop_value);
int main()
{
printf("Podaj liczby:\n");
int size = 100;
float table[100] = {0};
float* wskaznik = table;
float stop_value = 0.0;
int wynik_pobierania = read_vector_float(wskaznik, size, stop_value);
if(wynik_pobierania==-2 || wynik_pobierania == -1)
{
printf("Incorrect input");
return -1;
}
wskaznik = table;
if (*wskaznik == stop_value)
{
printf("Not enough data available");
return 3;
}
size = wynik_pobierania;
float wynik = 0.0;
float* result = &wynik;
const float* na_tablice = table;
if(sum(na_tablice, size, result) == 0)
{
printf("Suma: %.2f\n", *result);
}
if (avg(na_tablice, size, result) == 0)
{
printf("Srednia: %.2f\n", *result);
}
return 0;
}
int sum(const float* tab, unsigned int size, float* result)
{
unsigned int i = 0;
if (size == 0 || tab==0)
{
return 1;
}
while (i < size)
{
*result = *result+ *(tab+i);
i++;
}
return 0;
}
int avg(const float* tab, unsigned int size, float* result)
{
if (size == 0 || tab == 0)
{
return 1;
}
//printf("\nPrzed wyliczeniem sredniej: %f\n", *result);
*result /= size;
//printf("\nPo wyliczeniu sredniej: %f\n", *result);
return 0;
}
int read_vector_float(float* vec, int size, float stop_value)
{
int i=0;
if (size == 0)
{
return -1;
}
while (i <= (size - 1))
{
if(scanf("%f", vec + i) != 1)
{
return -2;
}
if(*(vec + i) == stop_value)
{
return i;
}
i++;
}
return i;
}
I wysłałem to do sprawdzenia i tutaj zonk, bo wszystko wysypuj się na funkcji avg.
Podam przykładowe dwa testy:
1
printf("#####START#####");
int res = avg((float[]){-3.999821}, 1, &result);
printf("#####END#####");
test_error(res == 0, "Funkcja avg() powinna zwrócić 0, a zwróciłą %d", res);
test_error(result >= -3.9998209414440105 - 0.001 && result <= -3.9998209414440105 + 0.001 , "Funkcja avg() niepoprawnie policzyła średnią, wynik powinien być równy -3.9998209414440105, a jest %f", result);
A tutaj 2
printf("#####START#####");
int res = avg((float[]){-4.673715, -3.585601, -2.372306, -8.870012, 1.795859, -9.126166}, 5, &result);
printf("#####END#####");
test_error(res == 0, "Funkcja avg() powinna zwrócić 0, a zwróciłą %d", res);
test_error(result >= -3.54115513021173 - 0.001 && result <= -3.54115513021173 + 0.001 , "Funkcja avg() niepoprawnie policzyła średnią, wynik powinien być równy -3.54115513021173, a jest %f", result);
Przysiągłbym, że gdy wklepuję w programie wartości z powyższych testów to wszystko jest okej.
Mimo to pokazuje mi po wysłaniu na Dante (stronę politechniczną do sprawdzania zadań z języka C) takie coś:
TEST 2: Sprawdzanie poprawności działania funkcji avg⏎
#####START##########END#####Wynik: PORAŻKA: Funkcja avg() niepoprawnie policzyła średnią, wynik powinien być równy -3.54115513021173, a jest 0.729960⏎
Sprawdź funkcję testującą TEST2(void) z pliku unit_test_v2.c, w linii 94⏎
⏎
TEST 3: Sprawdzanie poprawności działania funkcji avg⏎
#####START##########END#####Wynik: PORAŻKA: Funkcja avg() niepoprawnie policzyła średnią, wynik powinien być równy -3.9998209414440105, a jest -6.377820⏎
Sprawdź funkcję testującą TEST3(void) z pliku unit_test_v2.c, w linii 130⏎
Więc tutaj pierwszy zonk. :O
Aczkolwiek Dante wskazuje mi, że dodatkowym problem może być poniższa linijka kodu w funkcji avg:
*result /= size;
Bardzo proszę o pomoc. :/