Trudności z zadaniem (funkcje, tablice)

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;


}
 
0

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

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ł?

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

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?
1

Wystarczy zamienić:

int srednia = srednia (wartosc);

na

int s = srednia(tab);
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ę

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

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?

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

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;


}
0

double srednia (int tab[]) - funkcja "dostaje tablicę" ( nieznanego rozmiaru )

double s=srednia(tab);
double s=srednia(tablica);
  • jak nazwałeś tablice tak ją przekazujesz, nie musi nazywać się tak jak parametr funkcji.
    double s = srednia(tab[]) - puste nawiasy kwadratowe mają sens tylko jako otrzymany parametr, lub przy deklaracji z listą inicjalizującą (jeszcze lambda - ale to inna bajka).
    Można jeszcze wywołać następująco:
double s=srednia(&tab[0]);
double s=srednia(&tab[1]);
double s=srednia(&tab[i]);
double s=srednia(tab+0);
double s=srednia(tab+1);
double s=srednia(tab+i);
0

@_13th_Dragon tak wiem że zmienne globalne to zło ale to był mały program więc można sobie pozwolić :P a co returna, chyba działał XD szczerze rzadko zwracam więcej niż 1 element z funkcji więc nie wiedziałem jak to zapisać

0
aksjio napisał(a):

... szczerze rzadko zwracam więcej niż 1 element z funkcji więc nie wiedziałem jak to zapisać

Nie da się tego zrobić, co najwyżej można zwrócić strukturę poprzez wartość.
Ewentualnie przez parametry przekazane jako wskaźnik bądź referencja.

0

kolejne pytanie z tablic znakowych. polecenie jest, aby cały łańcuch z tablicy str zamienić na duże litery. wykorzystałem więc funkcję toupper, jednak znaki nadal są małe... jest ktoś w stanie pomóc:

tutaj kod:

#include <cstdlib>
#include <iostream>
#include <cstring>


using namespace std;

int main()
{

    char str[] = "W Szczebrzeszynie\nChrzaszcz\nBrzmi W Trzcinie";

    for (int i = 0; str[i]!=0; i++)
    {
        toupper(str[i]);
    }

    cout << str << endl;

}
 
2

Powinno być:

str[i] = toupper(str[i]);

http://en.cppreference.com/w/cpp/string/byte/toupper

0

dzięki wielkie, działa! :) czeka mnie programowanie 2dni na okrągło, więc jak będę miał problemy, z którymi sobie radził nie będę to będę wklejał

0

@_13th_Dragon

Wspomniałeś, aby przekazywać do funkcji również rozmiar tablicy. Jak to zrobić w tym przypadku? Nie wiem co napisać, aby w main wypisało mi wyniki funkcji wyswietl_tablice...

#include <iostream>

using namespace std;


void wyswietl_tablice (int tab[], int rozmiar_tablicy)

{
    for (int i = 0; i < rozmiar_tablicy; i++)
    {
        cout << tab[i] << endl;
    }
}

int main()
{
    int tablica[5] ={1, 2, 3, 4, 5};
   cout << wyswietl_tablice;
}
 
1
int tablica[] ={1, 2, 3, 4, 5};
wyswietl_tablice(tablica,5);
wyswietl_tablice(tablica,sizeof(tablica)/sizeof(*tablica));
wyswietl_tablice(tablica+1,3);
  1. void wyswietl_tablice (int tab[], int rozmiar_tablicy) - int rozmiar_tablicy Czyżby spodziewasz się ujemnych rozmiarów? Jak nie to użyj unsigned lub jeszcze lepiej size_t
0

Mam takie polecenie: Uzupełnij kod tak aby program działał poprawnie. Nie modyfikuj funkcji main!

Ma ktoś pomysł? próbowałem z jakimiś zmiennymi statycznymi, ale chyba nie tędy droga...

Kod:

void przestaw(int* a, int* b)
{
  // ....
}
 
int main()
{
  int a=1, b=2;
  cout << a << " " << b << endl; // wyświetla "1 2"
  przestaw(&a, &b);
  cout << a << " " << b << endl; // teraz ma wyświetlić "2 1"
  a=7;
  b=4;
  cout << a << " " << b << endl; // wyświetla "7 4"
  przestaw(&a, &b);
  cout << a << " " << b << endl; // teraz ma wyświetlić "4 7"
 
}
1

Weź do obu rąk dwa duże kubki i wymień je pomiędzy rękami (w jednej ręce na raz może być tylko jeden kubek).

0

rozumiem, że przypisze wskaźnikowi a wskaźnik b, tylko co wtedy zrobić aby mieć jeszcze do dyspozycji skorzystanie ze wskaźnika a (tego z wcześniejszą wartością)?

2

Połóż kubek na biurku. Albo użyj trzeciej ręki.

0

dzięki wielkie za podpowiedzi! działa! :) pora przejść do kolejnych 9999 zadań...

#include <iostream>
#include <cstdlib>

using namespace std;

void przestaw(int* a, int* b)

{
    int c = *a;

  *a = *b;
  *b = c;
}

int main()
{
  int a=1, b=2;
  cout << a << " " << b << endl; // wyświetla "1 2"
  przestaw(&a, &b);
  cout << a << " " << b << endl; // teraz ma wyświetlić "2 1"
  a=7;
  b=4;
  cout << a << " " << b << endl; // wyświetla "7 4"
  przestaw(&a, &b);
  cout << a << " " << b << endl; // teraz ma wyświetlić "4 7"

} 
0

**Polecenie: **Poniżej macie zdefiniowaną przykładową funkcję wyświetlającą zawartość tablicy. Użyjcie tej funkcji do wyświetlenia dwóch tablic o różnych rozmiarach.

Rozumiem, że w tym wypadku nie mogę zastosować:

cout << "tab1: " << wyswietl(tab1, 10);
  cout << "tab2: " << wyswietl(tab2, 5);

Ale dlaczego? bo to funkcja typu void i nie zwraca wartości? W takim razie jak mogę to zrobić?

Tutaj kod załączony do zadania od prowadzącego:

void wyswietl(int tab[], int size)
{
  int i;
  for(i=0; i<size; ++i)
  {
    cout << tab[i] << " ";
// lub w C:
// printf("%d ", tab[i]);
  }
  cout << endl;
}
 
int main()
{
  int tab1[10] = {1,2,3,4,5,6,7,8,9,10};
  int tab2[] = {1,1,3,5,8};
 
  // wyświetl tab1 
  // wyświetl tab2
}
0

Już odpowiadałem ci na to pytanie: http://4programmers.net/Forum/1098301

0
wyswietl_tablice(tablica,sizeof(tablica)/sizeof(*tablica));

W sumie nie do końca rozumiem ten fragment kodu...

Dlaczego nie może być tak:

wyswietl_tablice(tablica,sizeof(tablica);

Przecież funkcja sizeof(tablica) wyznacza długość tablicy, to po co dalszy fragment: /sizeof(*tablica) ?

1

To zapoznaj się z dokumentacją:

http://en.cppreference.com/w/cpp/language/sizeof

1

Ponieważ:

  1. Brakuje nawiasu zamykającego.
  2. sizeof- zwraca rozmiar w bajtach.
0

Mam taki prosty program, a jednak mimo wszystko coś mi się nie zgadza (mało info w internecie jest):

Co mam poprawić aby funkcja strchr pokazywała mi na której pozycji znajduje się litera "h" w tablicy?

#include <iostream>
#include <cctype>
#include <cstring>

using namespace std;

int main()
{
    char tab [] = "samochod";

    strcat (tab, "h");

    cout << strcat << endl;
}

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