• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźniki i funkcje - średnia i suma

VPS Starter Arubacloud
0 głosów
826 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

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.  :/

2 odpowiedzi

0 głosów
odpowiedź 16 marca 2020 przez j23 Mędrzec (194,920 p.)
wybrane 17 marca 2020 przez Hubertius
 
Najlepsza

Przysiągłbym, że gdy wklepuję w programie wartości z powyższych testów to wszystko jest okej.

Jakim cudem, przecież ta twoja implementacja avg jest niekompletna?

 

int avg(const float* tab, unsigned int size, float* result)
{
    if (size == 0 || tab == 0) return 1;

    for (unsigned int i = 0; i < size; ++i) {
        *result += tab[i];
    }

    *result /= size;
    return 0;
}

 

komentarz 17 marca 2020 przez Hubertius Bywalec (2,970 p.)
@j23

Racja, zapomniałem, że przy sprawdzeniu funkcje avg i sum są traktowane jako osobny byt.

Więc średnia uzyskana w sum i zapisana w zmiennej, do której mam dostęp za pomocą wskaźnika result sprawdziłaby się pod kątem działania całości. Tutaj muszę traktować każdą z tych funkcji jako osobne od siebie.
komentarz 17 marca 2020 przez mokrowski Mędrzec (155,460 p.)

Nie używaj odwołania tablicowego (T[xx]).

+1 głos
odpowiedź 16 marca 2020 przez mokrowski Mędrzec (155,460 p.)

A nie lepiej tak? I podobnie dla avg(...):

#include <stdio.h>
#include <stdlib.h>

#define SUCCESS 0
#define FAILURE 1

int sum(const float* tab, unsigned int size, float* result)
{
    *result = 0.0f; /* Na wszelki wypadek jeśli nie wyzerujesz przed wywołaniem */
    if ((size == 0) || (tab == NULL))
    {
        return FAILURE;
    }
    while (size--)
    {
        *result = *result + *(tab + size);
    }
    return SUCCESS;
}


int main(void) {
    const float data[] = {1.1f, 1.2f, 1.3f};
    float result = 0.0f;
    if ( sum(data, 3, &result) == SUCCESS)
    {
        printf("%f\n", result);
    }
    else
    {
        puts("Caclulation error.");
        return FAILURE;
    }
    return SUCCESS;
}

 

komentarz 16 marca 2020 przez Hubertius Bywalec (2,970 p.)
A ciekawe, nawet całkiem lepiej wyglądający zapis kodu od mojego.  ^^

Podobne pytania

0 głosów
1 odpowiedź 127 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Quanti994 Początkujący (340 p.)
0 głosów
1 odpowiedź 244 wizyt
pytanie zadane 4 stycznia 2017 w C i C++ przez Dawid Sobierajski Nowicjusz (170 p.)
0 głosów
3 odpowiedzi 173 wizyt
pytanie zadane 13 października 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...