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

Wpisywanie danych do tablicy, wskaźniki

Cloud VPS
0 głosów
1,126 wizyt
pytanie zadane 24 sierpnia 2018 w C i C++ przez Hrabia_ Nowicjusz (120 p.)
edycja 24 sierpnia 2018 przez Hrabia_

Hej, z góry zaznaczam, że jestem bardzo początkujący i proszę o wyrozumiałość. Chciałem zrobić program do obliczania średniej liczb, które sobie wpiszemy użyciem wskaźników i napotkałem problem. Bawiłem się kodem, ale nic nie dało mi pożądanego efektu, jedynie zbliżyłem się do tego, że wyświetla się poprawna suma (poprzez usunięcie w drugiej pętli w kodzie fragmentu "tablica++"), ale tylko gdy jest wpisywana jedna ocena. Proszę o pomoc.

#include <iostream>

using namespace std;

float srednia(float *t, int ile)
{
    float suma=0;

    for (int i=0;i<ile;i++)
    {
        suma+=*t;
        t++;
    }

    cout<<"Sprawdzenie, czy suma jest odpowiednio liczona: "<<suma<<endl;
    return suma/ile;
}


int main()
{
  int liczba;

 cout<<"Ile ocen mamy: ";
 cin>>liczba;

  float *tablica;
  tablica= new float [liczba];

 float *wskaznik= tablica;



 for (int i=1;i<=liczba;i++)
 {
     cout<<"Wprowadz "<<i<<". ocene: ";
     cin>>*tablica;
    tablica++;
 }

    cout<<"Srednia wynosi: "<<srednia(tablica,liczba);
    delete [] tablica;
    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 24 sierpnia 2018 przez criss Mędrzec (172,570 p.)

Problemów masz kilka:

  1.     for (int i=0;i<ile;i++)
        {
            suma+=3*t;
            t++;
        }

    To ci się kompiluje? IMO nie powinno.. W każdym razie... `t` jest wskaźnikiem. Wskaźnik to najprościej mówiąc zwykły unsigned int (o właściwiej dla platformy długości bitowej) którego wartości są adresami. Aby dostać się pod adres przechowywany przez wskaźnik używamy operatora dereferencji - czyli stawiamy gwiazdke przed nazwą wskaźnika. Zatem powinieneś zmienić ciało pętli na:
     

    suma+=3 * *t;
    t++;
    
  2. Operator new[] zwraca ci adres (wskaźnik) do zaalokowanej pamięci. Aby ją zwolnić, musisz użyć operatora delete[] i podać mu dokładnie ten sam adres. Dlatego masz problem gdy robisz tablica++; a potem delete[] tablica; Swoją drogą - zrobiłeś sobie wskaźnik `wskaznik` - dlaczego z niego nie korzystasz? Najlepiej by było jakbyś z tablicy zrobił const wskaźnik (właśnie, żebyś nie miał możliwości popełnienia błędu zmienienia jego wartości i w efekcie podania niewłaściwego adresu do delete[]), a inkrementował jedynie `wskaznik`. Wrzuce tutaj, poprawiony wg tego co napisałem powyżej, kod:
     

      float *const tablica = new float [liczba];
     
     float *wskaznik= tablica;
     
     for (int i=1;i<=liczba;i++)
     {
         cout<<"Wprowadz "<<i<<". ocene: ";
         cin>>*wskaznik;
         wskaznik++;
     }
     
        cout<<"Srednia wynosi: "<<srednia(tablica,liczba);
        delete [] tablica;
    
0 głosów
odpowiedź 24 sierpnia 2018 przez Hiskiel Pasjonat (22,830 p.)
edycja 24 sierpnia 2018 przez Hiskiel
for (int i=0;i<ile;i++)
    {
        suma+=3*t; <----
        t++;
    }

Co ty chcesz tu zrobić? Swoją drogą, czemu nie użyjesz normalnego indeksowania. Czy nie chodzi Ci o coś takiego? :
 

#include <iostream>
 
using namespace std;
 
float srednia(float *t, int ile)
{
    float suma=0;
 
    for (int i=0;i<ile;i++)
    {
        suma+=3*t[i];
    }
 
    cout<<"Sprawdzenie, czy suma jest odpowiednio liczona: "<<suma<<endl;
    return suma/ile;
}
 
 
int main()
{
  int liczba;
 
  cout<<"Ile ocen mamy: ";
  cin>>liczba;
 
  float *tablica;
  tablica = new float [liczba];
 
  float *wskaznik= tablica;
 
 
 
 for (int i=1;i<=liczba;i++)
 {
     cout<<"Wprowadz "<<i<<". ocene: ";
     cin>>tablica[i];
 }
 
    cout<<"Srednia wynosi: "<<srednia(tablica,liczba);
    delete [] tablica;
    return 0;
}

?

Swoją drogą program nie działa, dla pięciu ocen 5, 4, 3, 2, 1 podaje mi średnią 8.20.

komentarz 24 sierpnia 2018 przez Hrabia_ Nowicjusz (120 p.)

Ta trójka to przypadkowo miało być tak "*t[i]" bez trójki. Widzę, że twój kod też nie działał. Ale chwilę zabawy i powstał działający kod. Dzięki za pomoc ;). Oto kod:


#include <iostream>

using namespace std;

float srednia(float *t, int ile)
{
    float suma=0;

    for (int i=1;i<=ile;i++)
    {
        suma+=t[i];
    }

    cout<<"Sprawdzenie, czy suma jest odpowiednio liczona: "<<suma<<endl;
    return suma/ile;
}


int main()
{
  int liczba;

  cout<<"Ile ocen mamy: ";
  cin>>liczba;

  float *tablica;
  tablica = new float [liczba];

  float *wskaznik= tablica;



 for (int i=1;i<=liczba;i++)
 {
     cout<<"Wprowadz "<<i<<". ocene: ";
     cin>>tablica[i];
 }

    cout<<"Srednia wynosi: "<<srednia(tablica,liczba);
    delete [] tablica;
    return 0;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 850 wizyt
pytanie zadane 25 grudnia 2020 w C i C++ przez dark41 Użytkownik (760 p.)
0 głosów
1 odpowiedź 1,401 wizyt
0 głosów
1 odpowiedź 430 wizyt
pytanie zadane 8 grudnia 2022 w C i C++ przez Pysa6 Nowicjusz (220 p.)

93,488 zapytań

142,422 odpowiedzi

322,772 komentarzy

62,906 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

Kursy INF.02 i INF.03
...