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

Średnia arytmetyczna przez wskaźniki

0 głosów
368 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Quanti994 Początkujący (340 p.)
#include <iostream>

using namespace std;

void setNumbers(int &x,float *tab,float *ind)
{
    cout <<"Podaj ilosc liczb: ";
    cin >> x;

    tab = new float[x];
    ind = tab;

    for(int i=0;i<x;i++)
    {
        cout<<"Podaj "<<i+1<<" liczbe: ";
        cin >> *ind;
        ind++;
    }

}

float getAverage(int x,float &y,float *tab,float *ind)
{
    ind=tab;

    for(int i=0;i<x;i++)
    {
        y+=*ind;
        ind++;
    }

    return y/=x;
}


int main()
{
    int quantity;
    float *w;
    float *numbers;
    float average=0;

    setNumbers(quantity,numbers,w);
    cout <<"Srednia liczb wynosi: "<<getAverage(quantity,average,numbers,w)<<endl;

    delete[]numbers;

    return 0;
}

Po skompliowaniu program zamiast poprawnej średniej wyrzuca śmieci.

Wiecie może gdzie jest błąd i dlaczego tak się dzieje ? Mam problem z przekazywaniem dynamicznych tablic i wskaznikow do funkcji i ich wykorzystywanie...

1 odpowiedź

0 głosów
odpowiedź 16 marca 2020 przez Quanti994 Początkujący (340 p.)

Ok,problem został rozwiązany smiley.

Po prostu popełniłam błąd deklarując tablicę dynamiczną w procedurze.

Niech ktoś oceni obecny kod:

#include <iostream>

using namespace std;

void setNumbers(int x,float *ind)
{

    for(int i=0;i<x;i++)
    {
        cout<<"Podaj "<<i+1<<" liczbe: ";
        cin >> *ind;
        ind++;
    }

}

void setQuantity(int &x)
{
    cout <<"Podaj ilosc liczb: ";
    cin >> x;
}

float getAverage(int x,float &y,float *ind)
{

    for(int i=0;i<x;i++)
    {
        y+=*ind;
        ind++;
    }

    return y/=x;
}


int main()
{
    int quantity;
    float *w;
    float *numbers;
    float average=0;

    setQuantity(quantity);
    numbers = new float[quantity];
    w = numbers;

    setNumbers(quantity,w);
    cout <<"Srednia liczb wynosi: "<<getAverage(quantity,average,w)<<endl;

    delete[]numbers;

    return 0;
}

 

1
komentarz 16 marca 2020 przez tkz Nałogowiec (42,040 p.)

Znaczące nazwy, zmienna "x" jest kompletnie nijaka. "size", albo "capacity" jest zdecydowanie lepsza. 

 return y/=x;

Dlaczego "/="? Co zyskujesz przypisaniem?

Działanie na zmiennych referencyjnych jest mylące i narusza dobre praktyki. 

Nie deklaruj zmiennych sporo przed ich użyciem.

    int quantity;
    setQuantity(quantity);
    float *numbers; = new float[quantity];
    float *w = numbers;
    float average=0;
    setNumbers(quantity,w);
    cout <<"Srednia liczb wynosi: "<<getAverage(quantity,average,w)<<endl;

Na koniec, dlaczego działasz na wskaźnikach?

komentarz 16 marca 2020 przez Quanti994 Początkujący (340 p.)

Na koniec, dlaczego działasz na wskaźnikach?

Wybrałam sobie taki przykład,aby po prostu nauczyć się wprawy w ich wykorzystywaniu :P

 Dlaczego "/="? Co zyskujesz przypisaniem?

Mój błąd.

 Działanie na zmiennych referencyjnych jest mylące i narusza dobre praktyki. 

Z ciekawości,dlaczego ? Chodzi tutaj o ryzyko przypadkowej ingerencji w oryginał ? 

komentarz 16 marca 2020 przez tkz Nałogowiec (42,040 p.)
Między innymi, ale zadaj sobie pytanie, czy potrzebujesz, by Twoja funkcja modyfikowała/zwracała więcej niż jedną rzecz? Jeżeli tak, prawdopodobnie robi za dużo. Skoro chcesz wysłać coś przez referencję, a tego nie modyfikujesz, pamiętaj o const, uchroni przed błędami.

Oczywiście są wyjątki, i odpowiedź "to zależy".

Podobne pytania

0 głosów
2 odpowiedzi 1,418 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 1,620 wizyt
pytanie zadane 14 lipca 2019 w C i C++ przez Padomen Początkujący (260 p.)
+2 głosów
3 odpowiedzi 2,038 wizyt

93,788 zapytań

142,754 odpowiedzi

323,429 komentarzy

63,394 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...