Przekazywanie wartości z funkcji do funkcji

0

Witam,
przychodzę z konkretnym zapytaniem, gdyż mam problem z jedną kwestią. Zacząłem realizować zadania ukazane w załączniku i oto efekt mojej pracy:

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

#define N 30

typedef int tablica[N];

void wypelnienie(tablica array)
{
	srand(time(0));
	int i;
	for(i=0; i<N; i++)
		array[i]=-100+rand()%201;
}

void wyswietlanie(tablica array)
{
    unsigned int i;
    for(i=0; i<N; i++)
        printf("%d\n",array[i]);
}

double srednia(tablica array)
{
    double srednia, suma;
    unsigned int i;
    suma=0;
    srednia=0;
    for(i=0;i<N;i++)
        suma=suma+array[i];
        srednia=suma/N;
    return srednia;
}

double odchylenie(tablica array)
{
    double srednia, suma, wariancja, odchylenie;
    unsigned int i;
    suma=0;
    for(i=0;i<N;i++)
        suma=suma+array[i];
        srednia=suma/N;
        for(i=0, suma=0; i<N; i++)
        suma += pow( array[i] - srednia, 2);
        wariancja= suma/N;
        odchylenie=sqrt(wariancja);
    return odchylenie;
}

int znajdz_min(tablica array)
{
	int min;
	unsigned int i;
	min=array[0];
	for(i=0; i<N; i++)
		if(min>array[i])
			min=array[i];
	return min;
}

int znajdz_max(tablica array)
{
	int max;
	unsigned int i;
	max=array[0];
	for(i=0; i<N; i++)
		if(max<array[i])
			max=array[i];
	return max;
}


int main(){
	tablica liczby;
	wypelnienie(liczby);
    printf("Wartosci tablicy:\n");
	wyswietlanie(liczby);
	printf("\nSrednia wartosci tablicy: %lf\n",srednia(liczby));
	printf("\nOdchylenie standardowe: %lf\n",odchylenie(liczby));
	printf("\nWartosc minimalna tablicy: %d\n",znajdz_min(liczby));
	printf("\nWartosc maksymalna tablicy: %d\n",znajdz_max(liczby));

	return 0;
}

Zadaniem było również aby każda czynność była realizowana osobną funkcją co też zrobiłem, więc można powiedzieć że w zasadzie wszystko gra, poza jedną rzeczą. Mianowicie w funkcji która liczy odchylenie standardowe (zad2) średnia elementów tablicy która między innymi jest potrzebna do jego obliczenia jest realizowana kolejny raz, gdyż istnieje już funkcja która liczy tą średnią i ją zwraca i tutaj właśnie jest moje pytanie. W jaki sposób zrobić tak, aby funkcja licząca odchylenie pobierała wartość średniej od funkcji srednia i z nią wykonywała dalsze obliczenia zamiast liczyć ją po raz kolejny? Próbowałem to jakoś zrozumieć ale za każdym razem mi nie wychodzi, wobec tego postanowiłem zapytać tutaj, czy ktoś mógł by przerobić to, w taki sposób jaki opisałem i wytłumaczyć mi na tym konkretnym przykładzie dlaczego trzeba to zrobić tak a nie inaczej? Był bym bardzo wdzięczny.

Zadania.PNG

0

W jaki sposób zrobić tak, aby funkcja licząca odchylenie pobierała wartość średniej od funkcji srednia i z nią wykonywała dalsze obliczenia

Przekaż jej w argumencie tą wartość

 double odchylenie(tablica array, srednia)
{

double suma, wariancja, odchylenie;
    unsigned int i;
    suma=0;
    for(i=0;i<N;i++)
        suma=suma+array[i];
    
        for(i=0, suma=0; i<N; i++)
//srednia masz z funkcji srednia jako wartosc możesz też dać:

// suma+=pow(array[i] - srednia(array[i]); // chyba? :)
        suma += pow( array[i] - srednia, 2);
        wariancja= suma/N;
        odchylenie=sqrt(wariancja);

    return odchylenie;
}
2

Bracie, po kodzie sądząc przed C++ pisałeś w Pythonie. Powstaje zatem następujący problem z twym kodem:

double odchylenie(tablica array)
{
    double srednia, suma, wariancja, odchylenie;
    unsigned int i;
    suma=0;
    for(i=0;i<N;i++)
        suma=suma+array[i];
        srednia=suma/N;
        for(i=0, suma=0; i<N; i++)
        suma += pow( array[i] - srednia, 2);
        wariancja= suma/N;
        odchylenie=sqrt(wariancja);
    return odchylenie;
}

to tak naprawę jest

double odchylenie(tablica array)
{
    double srednia, suma, wariancja, odchylenie;
    unsigned int i;
    suma=0;
    for(i=0;i<N;i++)
    {
        suma=suma+array[i];
    }
    srednia=suma/N;
    for(i=0, suma=0; i<N; i++)
    {
        suma += pow( array[i] - srednia, 2);
    }
    wariancja= suma/N;
    odchylenie=sqrt(wariancja);
    return odchylenie;
}

czy aby na pewno taka była twoja intencja?
Wniosek - w C++ nie warto żydzić na nawiasach wąsatych.

0

@MasterBLB: Owszem, jednakże mi chodzi aby tę część funkcji odchylenie:

    for(i=0;i<N;i++)
        suma=suma+array[i];
        srednia=suma/N;

Wyeliminować poprzez pobranie wartości średniej z funkcji srednia.

0

@youmound:

Zastosowałem się do tego i otrzymałem następujący błąd:

error: expected declaration specifiers or '...' before 'srednia'

0

Teraz, co do przesyłania parametrów do funkcji - poczytaj sobie o tym, generalnie można przez wartość, albo przez referencję/wskaźnik. Poza tym, nic nie stoi na przeszkodzie aby jakaś funkcja wywoływała inną, ba! Może nawet wołać samą siebie! (zowie się to rekurencją)

W twoim wypadku Bracie, pomijając kwestię pythonowego zapisu który musisz poprawić, najłatwiej to uzyskać modyfikując funkcję odchylenie tak, aby wywoływała funkcję srednia:

double odchylenie(tablica array)
{
    double suma, wariancja, odchylenie;
    double srednia = ::srednia(array);//poniewaz nazwa srednia występuje jako zmienna i nazwa funkcji konieczny jest operator globalnego zakresu ::
    unsigned int i;
    suma=0;
//tutaj to już sam rozkmiń jak chcesz liczyć to odchylenie
        for(i=0, suma=0; i<N; i++)
        suma += pow( array[i] - srednia, 2);
        wariancja= suma/N;
        odchylenie=sqrt(wariancja);
    return odchylenie;
}
0

@MasterBLB: Dziękuję bardzo za wytłumaczenie jednakże po zastosowaniu tej przerobionej już funkcji otrzymuję następujący błąd:

error: expected expression before ':' token

0

Wklej pełen komunikat błędu, bo tak, to nie wiadomo nawet w jakiej linii. Dalej, onawiasowanie {} kodu należy przeprowadzić z sensem, to co ja wcześniej podałem to to, co rzeczywiście widzi kompilator. Zapewne chciałeś coś w poniższy deseń, ale tutaj to musisz określić sam co miałeś na myśli:

double odchylenie(tablica array)
{
    double srednia, suma, wariancja, odchylenie;
    unsigned int i;
    suma=0;
    for(i=0;i<N;i++)
    {
        suma=suma+array[i];
        srednia=suma/N;
        for(i=0, suma=0; i<N; i++)
        {
              suma += pow( array[i] - srednia, 2);
        }
        wariancja= suma/N;
        odchylenie=sqrt(wariancja);
    }
    return odchylenie;
}
0

@MasterBLB: Dokładnie, no i właśnie kwestia eliminacji ten pierwszej pętli.
Co to błędu to jest dosłownie cały komunikat:
błąd.PNG

0

Jak wygląda linia 39? Komunikat sugeruje, że się fiknąłeś i zamiast średnika dałeś dwukropek.

0

@MasterBLB:
to jest linia nr.39

    double srednia = ::srednia(array);

0

Hmm sprawdź linijkę wyżej/niżej, bo na pewno nie chodzi o zapis z 2 dwukropkami - https://onlinegdb.com/70H0RcWET

0

@MasterBLB: To znaczy linikka wyżej i niżej to tylko deklarację:

    double suma, wariancja, odchylenie;
    double srednia = ::srednia(array);
    unsigned int i;

U ciebie kompiluje się bez błędu? Jeśli tak to wstaw proszę cały kod, to porównam co jest nie tak

0

Może inaczej - wstaw cały swój kod do tego online IDE z mojego linka z postu wyżej, i wtedy sprawdzę co jest pomieszane.

1

Ok, wyjaśniło się - w C jednak nie ma operatora ::, zatem trzeba zmienić nazwę zmiennej z srednia na coś innego, np. average. Tu kompilujący się twój kod https://onlinegdb.com/pQ5ZhUu1S

0

Super, bardzo dziękuję za pomoc! ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1