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

[Zadanie 11] Pytanie o wskaźniki i tablice

Mały hosting, OGROMNE możliwości
0 głosów
1,279 wizyt
pytanie zadane 3 czerwca 2016 w C i C++ przez iai Nowicjusz (200 p.)

Witam, oto mój kod na zadane z odcinka 11 oraz rozwiązanie zadania domowego z tego odcinka, wszysko w formie funkcji. Jedna rzecz mnie zastanawia, mianowicie dlaczego we funkcji highest() moge sobie przpisac do zmiennych *tab i program sobie leci pokolei bo wiadomo wskaznik tablicy jest jej 0 elementem Tutaj jest wszystko ok, ale w przypadku funkcji closest() juz nie moge zastosowac tego samego sposobu bo program niby sie kompiluje ale nie oblicza tej wartosci (napisalem w komentarzu te miejsca gdzie chcialem zastosowac to samo). Ja chyba nie rozumem wskaznikow do konca.Moze ktos wytlumaczyc o co tu chodzi.

 

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <cmath>
#include <math.h>
 
using namespace std;
 
int avg(int *tab, int ilosc);
int highest(int *tab, int ilosc);
int closest(int *tab,int ilosc,int sredniawka,int w_bezw);
 
int main()
{
    int ile;
    cout << "Podaj ilosc liczb: ";
    cin >> ile;
 
    int *tablica; tablica = new int [ile]; int *wskaznik; wskaznik = tablica;
 
 
    int maks = highest(wskaznik, ile);
    int srednia = avg(wskaznik, ile);
    int x = abs(srednia - tablica[0]);
    int najbl = closest(wskaznik, ile,srednia,x );
 
 
    cout << "Srednia wynosi: " << srednia << "\n";
    cout << "Najwieksza liczba to: " << maks << "\n";
    cout << "Najblizsza liczba to: " << najbl;
 
 
    delete[]tablica;
    return 0;
}
 
int avg(int *tab, int ilosc)
{
    int suma = 0;
    for(int i = 0; i < ilosc; i++)
    {
        suma += *tab;
        tab++;
    }
    return suma/ilosc;
}
 
int highest(int *tab, int ilosc)
{
    int maks = *tab;
 
    for(int i=0;i<ilosc;i++)
        {
            cout << "liczba  " << i+1 << " : ";
            cin >> *tab;
            if(*tab>maks)
            maks = *tab;
            tab++;
        }
    return maks;
 
}
 
int closest(int *tab,int ilosc,int sredniawka,int w_bezw)
{
    int najbl = tab[0]; // tutaj da rade przypisac *wskaznik
    for (int i = 0; i < ilosc; i++)
        {
            if(abs(sredniawka - tab[i])< w_bezw) // tutaj po przypisaniu *wskaznik juz program nie dziala jak trzeba
                {
                    najbl = tab[i]; // tutaj to samo
                }
        }
                    return najbl;
}

 

 

2 odpowiedzi

+1 głos
odpowiedź 3 czerwca 2016 przez dubgron Mądrala (5,620 p.)
wybrane 8 czerwca 2016 przez iai
 
Najlepsza

Mówiąc szczerze to zastanawiam się, jak ten kod się w ogóle kompiluje, ale zacznijmy od początku.

  • W jakim celu tworzysz dodatkowy wskaźnik, który wskazuje na tablicę? To można załatwić jedną linią i będzie działało tak samo.
    int *tablica = new int [ile];
    
  • Podczas pracowania na wskaźniku do tablicy, zapomnij o tym, o czym mówił Mirosław Zelent. Nie przesuwaj się po tabeli za pomocą tab++, tylko w pętli używając tab[i]. Jest to kluczowe przy zwalnianiu pamięci, ponieważ gdy użyjesz kilka razy takiego przesunięcia, a następnie użyjesz delete, to kompilator może wyrzucić błąd
  • Funkcja hightest() nie działa, ponieważ na początku zapisujesz, do zmiennej maks, jeszcze nie podaną zmienną. Co powoduje zapisanie jakiejś śmieciowej liczby, która sprawia, że funkcja zwraca niepoprawną wartość.
  • W funkcji closest() program nie działa jak trzeba przy użyciu *tab, ponieważ wcześniej przestawiłeś ten wskaźnik o kilka bitów. Dlatego powinieneś używać tab[i], zamiast *tab, ponieważ jest to dużo bezpieczniejsze.

Mam nadzieję, że pomogłem. Pozdrawiam. 

komentarz 7 czerwca 2016 przez iai Nowicjusz (200 p.)

Dzięki za porady, ale juz wszystko działa. Wywaliłem tylko ten podwójny wskaźnik. Ani razu nie wywala błędu więc nie wiem po co zmieniać *tab na tab[i] skoro to jest to samo. Nie używać tab++? ale przecież wskaźnik powstał po to żeby poruszać się po adresie pokolei zamiast po wartościach zmiennych. więc nie rozumiem. Podaję kod:

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <cmath>
#include <math.h>

using namespace std;

int avg(int *tablica, int ilosc);
int highest(int *tablica, int ilosc);
int closest(int *tabica,int ilosc,int sredniawka,int w_bezw);

int main()
{
    int ile;
    cout << "Podaj ilosc liczb: ";
    cin >> ile;

    int *tablica = new int [ile];


    int maks = highest(tablica, ile);
    int srednia = avg(tablica, ile);
    int x = abs(srednia - *tablica);
    int najbl = closest(tablica, ile,srednia,x );


    cout << "Srednia wynosi: " << srednia << "\n";
    cout << "Najwieksza liczba to: " << maks << "\n";
    cout << "Najblizsza liczba to: " << najbl;


    delete[]tablica;
    return 0;
}



int avg(int *tab, int ilosc)
{
    int suma = 0;
    for(int i = 0; i < ilosc; i++)
    {
        suma += *tab;
        tab++;
    }
    return suma/ilosc;
}

int highest(int *tab, int ilosc)
{
    int maks = *tab;

    for(int i=0;i<ilosc;i++)
        {
            cout << "liczba  " << i+1 << " : ";
            cin >> *tab;
            if(*tab>maks)
            maks = *tab;
            tab++;
        }
    return maks;

}

int closest(int *tab,int ilosc,int sredniawka,int w_bezw)
{

    int najbl = *tab;
    for (int i = 0; i < ilosc; i++)
        {
            if(abs(sredniawka - *tab)< w_bezw)
                {
                    najbl = *tab;
                }

                tab++;
        }
                    return najbl;
}

 

komentarz 7 czerwca 2016 przez dubgron Mądrala (5,620 p.)
Jeżeli chodzi o problem przesuwania się po wskaźniku, to nie będę się produkował, bo zrobił to już ktoś za mnie pod tym wpisem w komentarzu: http://forum.pasja-informatyki.pl/127590/cr-c-%2310-wskazniki-dynamiczne-alokowanie-pamieci?show=127590#q127590.

Kod (oprócz tych tab++ oraz podwójnego załączenia biblioteki cmath) wygląda ok. Pozdrawiam.
komentarz 8 czerwca 2016 przez iai Nowicjusz (200 p.)
Jakbyś miał czas to mógłbyś wrzucić tutaj swój zmieniony kod, będę wdzięczny. Pozdrawiam :)
komentarz 8 czerwca 2016 przez dubgron Mądrala (5,620 p.)
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
  
int avg(int *tablica, int ilosc);
int highest(int *tablica, int ilosc);
int closest(int *tabica,int ilosc,int sredniawka,int w_bezw);
 
int main() {
	
    int ile;
    std::cout << "Podaj ilosc liczb: ";
    std::cin >> ile;
 
    int *tablica = new int [ile];
 
 
    int maks = highest(tablica, ile);
    int srednia = avg(tablica, ile);
    int x = abs(srednia - *tablica);
    int najbl = closest(tablica, ile,srednia,x );
 
 
    std::cout << "Srednia wynosi: " << srednia << "\n";
    std::cout << "Najwieksza liczba to: " << maks << "\n";
    std::cout << "Najblizsza liczba to: " << najbl;
 
 
    delete [] tablica;
    return 0;
}
 
 
 
int avg(int *tab, int ilosc) {
	
    int suma = 0;
    for(int i = 0; i < ilosc; i++)
    {
        suma += tab[i];
    }
    return suma/ilosc;
}
 
int highest(int *tab, int ilosc) {
	
	std::cout << "liczba  " << 1 << " : ";
    std::cin >> tab[0];
    int maks = tab[0];
 
    for(int i=1; i<ilosc; i++)
        {
            std::cout << "liczba  " << i+1 << " : ";
            std::cin >> tab[i];
			
            if(tab[i] > maks)
            maks = tab[i];
        }
    return maks;
 
}
 
int closest(int *tab,int ilosc,int sredniawka,int w_bezw) {
 
    int najbl = tab[0];
	
    for (int i = 1; i < ilosc; i++)
        {
            if(abs(sredniawka - tab[i])< w_bezw)
                {
                    najbl = tab[i];
                }
        }
	return najbl;
}

 

komentarz 8 czerwca 2016 przez iai Nowicjusz (200 p.)
Dzięki wielkie ;)
+1 głos
odpowiedź 3 czerwca 2016 przez Włóczykij Użytkownik (750 p.)

No nie wiem dlaczego tak nie działa, ale jak byś zrobił tak jak w funkcji highes, odwoływać się przez *tab i inkrementować pod koniec pętli tab++.

komentarz 3 czerwca 2016 przez iai Nowicjusz (200 p.)
właśnie gdy tak próboję to wynik jest niepoprawny
komentarz 3 czerwca 2016 przez Włóczykij Użytkownik (750 p.)

Na początek dodaj taki coś:

tablica = new int [ile] {0};

to wyzeruje elementy tablicy.

A błąd co do funkcji closest masz taki że nie zmieniasz wartości w_bezw po znalezieniu najbliższej.

komentarz 3 czerwca 2016 przez iai Nowicjusz (200 p.)
o kurde problem leżał w tym ze umieszczałem inkrementacje w ifie zamiast w pętli...Czyli wszystko jasne, a wartości w_bezw w jakim celu zmieniać?
komentarz 3 czerwca 2016 przez Włóczykij Użytkownik (750 p.)
Ma ci szukać najbliższej liczby a jam masz np. w_bezw jest 4 bo taka jest odległość pierwszej liczby od średniej a później mamy dwie liczby o odległościach 2 i 3 i według twojej funkcji zostanie przypisana ostatnia liczba.

Podobne pytania

0 głosów
1 odpowiedź 365 wizyt
pytanie zadane 7 października 2016 w Nasze projekty przez unbearable Początkujący (450 p.)
0 głosów
2 odpowiedzi 906 wizyt
0 głosów
1 odpowiedź 446 wizyt
pytanie zadane 25 maja 2016 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)

93,718 zapytań

142,631 odpowiedzi

323,262 komentarzy

63,266 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.

...