• 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

Object Storage Arubacloud
0 głosów
507 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ź 265 wizyt
pytanie zadane 7 października 2016 w Nasze projekty przez unbearable Początkujący (450 p.)
0 głosów
2 odpowiedzi 311 wizyt
0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 25 maja 2016 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...