Trudności z zadaniem (funkcje, tablice)

Odpowiedz Nowy wątek
2015-01-04 13:36
0

Witam serdecznie. Mam do napisania zadanie, 7 stycznia kolos więc już się przygotuję, bo bardzo mało czasu... mam nadzieję, że mi pomożecie, a dla was to pewnie będzie banał :)

Treść zadania:
W tablicy o rozmiarze N znajdują sie wyniki eksperymentu. Napisz funkcje (dwie osobne) wyznaczające wartość średnią i odchylenie standardowe. Funkcje mają zwrócić (nie wyświetlić tylko zwrócić) obliczony wynik

Zadania starałem się zrobić i tutaj efekty mojej pracy. Napisałem funkcję, która oblicza średnią z tablicy. Potem zabrałem się za odchylenie standardowe. Póki co skupiłem się, żeby napisać funkcję dla wariancji (potem odchylenie to już łatwo powinno być). Mój problem pojawia się w momencie, kiedy w funkcji odchylenie chcę pobrać średnią z funkcji średnia, w jaki sposób mogę to uczynić? chodzi konkretnie o linijkę w kodzie, w którym napisałem: int srednia = srednia (wartosc);. Dodam, że jestem początkującym programistą. Liczę na pomoc, z góry bardzo dziękuję :)

#include <iostream>
#include <conio.h>
#include <math.h>
 
using namespace std;
 
int srednia (int tab[])
{
 
    int wartosc = 0;
 
    for (int i = 0; i < 5; i++)
    {
        wartosc = wartosc + tab[i];
    }
 
return wartosc;
}
 
int odchylenie (int tab[])
 
{
 
    int srednia = srednia (wartosc);
 
    int wariancja_calkowita = 0;
    int wariancja = 0;
 
     for (int i = 0; i < 5; i++)
   {
       wariancja = (tab [i] - srednia);
       wariancja = wariancja *  pow(wariancja, 2);
       wariancja_calkowita = wariancja_calkowita + wariancja;
   }
   return wariancja_calkowita /= 5;
 
}
 
int main()
{
 
    int tablica[5] = {5, 7, 9, 2, 10};
 
    cout << "srednia z tablicy wynosi: " << srednia(tablica) << endl;
    cout << "wariancja wynosi: " << odchylenie(tablica) << endl;
 
}
 

Pozostało 580 znaków

2015-01-04 13:39
aksjio
0

daj zmiennej średnia przydomek static i możesz ją traktować jak zmienną globalną

Pozostało 580 znaków

2015-01-04 13:51
0

zrobiłem to, a mimo to nadal wyskoczył błąd: "wartosc" was not declared in this scope. tak więc zadeklarowałem zmienną w funkcji odchylenie int wartosc, to potem kolejny błąd: 'srednia' cannot be used as a function. ale dzięki za szybką odpowiedź, ma ktoś może jeszcze jakiś pomysł?

Pozostało 580 znaków

2015-01-04 14:00
aksjio
0
 
#include <iostream>
#include <conio.h>
#include <math.h>
 
using namespace std;
 
int srednia, wartosc;
int sredniat (int tab[])
{
    wartosc = 0;
    for (int i = 0; i < 5; i++)
    {
        wartosc = wartosc + tab[i];
    }
    srednia=wartosc/5;
    return (wartosc,srednia);
 
}
 
int odchylenie (int tab[])
 
{
 
    int wariancja_calkowita = 0;
    int wariancja = 0;
 
     for (int i = 0; i < 5; i++)
   {
       wariancja = (tab [i] - srednia);
       wariancja = wariancja *  pow(wariancja, 2);
       wariancja_calkowita = wariancja_calkowita + wariancja;
   }
   return wariancja_calkowita /= 5;
 
}
 
int main()
{
 
    int tablica[5] = {5, 7, 9, 2, 10};
 
    cout << "srednia z tablicy wynosi: " << sredniat(tablica) << endl;
    cout << "wariancja wynosi: " << odchylenie(tablica) << endl;
 
}

taki efekt miał być? XD

Pozostało 580 znaków

2015-01-04 14:02
1

@sedan,

  1. Czy rozumiesz różnicę pomiędzy średnią a sumą?
  2. Jeżeli masz zmienną i funkcje o tej samej nazwie to masz kolizje nie do opanowania przez kompilator, to tak jak w filmie "Kiedy jaja miały kły" wszyscy faceci mieli imię Adam.
  3. Do funkcji liczących średnią oraz odchylenie warto przekazać rozmiar tablicy.
  4. Czy słyszałeś o operatorze += ?
  5. Po kiego ci /=przy return ?
  6. Nie używaj i++ jeżeli możesz użyć ++i zwłaszcza w pętlach, bo ci ten brzydki nawyk się zemści.
  7. Średnia oraz wariancja nawet dla liczb całkowitych jest typu rzeczywistego.
  8. Radził bym te funkcje robić dla wartości rzeczywistych.
  9. Użycie pow dla obliczenia kwadratu - barbarzyństwo, pow się liczy jako exp(Eksponenta*log(Baza)), zapewniam cię że to znacznie dłużej niż Baza*Baza

@aksjio,

  1. Dopóki nie zrozumiesz że zmienne globalne to wielkie zło, lepiej nie zawracaj głowy początkującym.
  2. return (wartosc,srednia); - doprawdy? A wiesz co robisz?

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 3x, ostatnio: _13th_Dragon, 2015-01-04 14:11

Pozostało 580 znaków

2015-01-04 14:05
1

Wystarczy zamienić:

int srednia = srednia (wartosc);

na

int s = srednia(tab);

Pozostało 580 znaków

2015-01-04 14:52
0

#aksjio
mniej więcej o to, przerobiłem trochę i efekt jest taki jak chciałem, wielkie dzięki :)

#13thDragon

  1. rozumiem
  2. domyślam się, miałem tez to na zajęciach, jednak dla mnie początkującego programisty byłoby to mimo wszystko utrudnienie, chyba, że podpowiesz mi jak to ma wyglądać :)
  3. tak, słyszałem, jednak z przyzwyczajenia nadal piszę jak newbie. wezmę to pod uwagę, dzięki
  4. bo wariancja całkowita to te wszystkie wyniki podzielone przez ilość liczb w tablicy (5)
  5. wezmę również pod uwagę, dzięki
  6. poprawiłem, do wariancji i średniej zamiast int dałem typ zmiennej float (czy lepiej może double?)
  7. też zmieniłem

dzięki wielkie za szybkie odpowiedzi i pomoce :)

#some_ONE
dzięki, zaraz również spróbuję

edytowany 1x, ostatnio: sedan, 2015-01-04 14:53

Pozostało 580 znaków

2015-01-04 14:56
1

Trochę dodałem punktów po przeczytaniu bezsensownych rad od @aksjio, więc nieco się rozjechała numeracja
Ad 2. - nie bardzo rozumiem czego w tym nie rozumiesz.
Ad 6. - odradzam użycia float


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-04 15:00
0

#13h_Dragon
w jaki sposób przekazać do funkcji rozmiar tablicy, aby nie wyskoczyły błędy... dlaczego nie float? to jakiego typu zmiennoprzecinkowego użyć do obliczania odchylenia standardowego i średniej?

Pozostało 580 znaków

2015-01-04 15:10
1
#include <iostream>
using namespace std;
 
double avg(int tab[],size_t size)
  {
   double sum=0;
   for(size_t i=0;i<size;++i) sum+=tab[i];
   return sum/size;
  }
 
int main()
  {
   int A[]={5, 7, 9, 2, 10};
   cout<<"srednia z tablicy wynosi: "<<avg(A,sizeof(A)/sizeof(*A))<<endl;
   int B[]={1,2,3,4,5,6,7,8,9,10};
   cout<<"srednia z tablicy wynosi: "<<avg(B,sizeof(B)/sizeof(*B))<<endl;
   return 0;
  }

http://ideone.com/K1w53b


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-04 15:42
0

#13th_Dragon
Zajmę się tym i postaram się ogarnąć później, aczkolwiek wielkie dzięki.

Mam jeszcze pytanie: Co dokładnie oznacza ten kod:

double srednia (int tab[]) 

? To znaczy, że do funkcji średnia przesyłam wyniki z tablicy, tak?
I dlaczego np. jak chce "przekazać" wynik średniej z jednej funkcji do drugiej to piszę

double s = srednia(tab);

a nie np: double s = srednia (tab[])

 lub <code class="cpp"> double s = srednia(tablica); 

Zrobiłem drobne poprawki, program w końcu oblicza odchylenie a nie wariancję i nie wyskakują błędy. Wiem, że 13th_Dragon pewnie widzisz wiele błędów i napisałbyś to zupełnie inaczej, ale aktualnie mam tyle rzeczy do zrobienia, że no są priorytety (co nie zmienia faktu, że jestem tobie wdzięczny i przyjrzę się jeszcze dokładniej temu co napisałeś). Program dobrze oblicza i średnią i wariancję:

#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;

double srednia (int tab[])
{

    double wartosc = 0;

    for (int i = 0; i < 4; i++)
    {
        wartosc += tab[i];
    }

    wartosc /= 4;

return wartosc;
}

double odchylenie (int tab[])

{

    double s = srednia(tab);

    double wariancja_calkowita = 0;
    double wariancja = 0;

     for (int i = 0; i < 4; i++)
   {
       wariancja = (tab [i] - s);
       wariancja = pow(wariancja, 2);
       wariancja_calkowita += wariancja;
   }
   wariancja_calkowita /= 4;
   double pierwiastek = sqrt (wariancja_calkowita);

   return pierwiastek;

}

int main()
{

    int tablica[4] = {2, 5, 1, 3};

    cout << "srednia z tablicy wynosi: " << srednia(tablica) << endl;
    cout << "wariancja wynosi: " << odchylenie(tablica) << endl;

}
edytowany 1x, ostatnio: sedan, 2015-01-04 15:43

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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