Szukanie ele. maksymalnego tablicy wskaźnikami

0

Witam, mam takie zadanie.

Napisz funkcje, której zadaniem jest znalezienie w tablicy elementu maksymalnego
i zwrócenie jego adresu. Parametry funkcji: wskanik do zmiennej typu int (wskanik do
pierwszego elementu tablicy, wskanik do zmiennej typu int (adres ostatniego elementu
tablicy). Napisz program wykorzystujcy napisan funkcj.

Do tej pory napisałem takie coś:

#include <iostream>

using namespace std;



int f(int *pocz,int *kon){
    int *maks;
        maks=pocz;
   while(pocz<=kon)
   {
                   pocz++;
                   if(*pocz>*maks)
                   {
                                  maks=pocz;
                                  }
                   }

    return *maks;
}


int main()
{
    ///-----------------///
    int a;

    cout<<"Podaj rozmiar tablicy: ";
    cin>>a;

    int tab[a];

    for (int i=0; i<a; i++) cin>>tab[a];

    ///---------------///

    cout<<f(tab, &(tab[a-1]) );







    return 0;
}
 

Program wykonuje się, lecz nie podaje poprawnego wyniku. Podaje za to zawsze tą samą liczbę: "4644900"

Proszę o pomoc.

1

Zacznij od formatowania kodu, bo tego nie da się czytać.

#include <iostream>

using namespace std;

int f(int* pocz, int* kon)
{
    int* maks;
    maks = pocz;
    while (pocz <= kon) {
        pocz++;
        if (*pocz > *maks) {
            maks = pocz;
        }
    }

    return *maks;
}

int main()
{
    ///-----------------///
    int a;

    cout << "Podaj rozmiar tablicy: ";
    cin >> a;

    int tab[a];

    for (int i = 0; i < a; i++)
        cin >> tab[a];
    ///---------------///
    cout << f(tab, &(tab[a - 1]));
    return 0;
}

Proszę.

int tab[a];

To nie jest poprawny kod C++, VLA nie są częścią tego języka.

    while (pocz <= kon) {
        pocz++;
        if (*pocz > *maks) {

UB, wyjeżdżasz poza tablicę i dokonujesz dereferencji takiego wskaźnika. Odczytujesz śmieć z pamięci, który u Ciebie zapewne ma wyżej wymienioną wartość.

Przy okazji, zamiast się męczyć, mógłbyś użyć std::max_element:

cout << *max_element(begin(tab),end(tab)); 
0

Nie mogę polecieć na skróty, muszę zrobić tak jak jest w zadaniu.

1

To zmień w warunku pętli <= na < i powinno śmigać. Od strony logicznej nie jest tak źle, ale popracuj nad formatowaniem kodu, bo to była tragedia.

0

Zrobiłem to zupełnie inaczej, ten odcinek w mainie, zadeklarowałem Od razu tablice z rozmiarem i wartosciami elementów.

int tab[6] = {1, 2, 3, 4, 99, 6};

cout << f( tab , tab+4 ); 

No i to mi działa poprawnie, wynikiem jest 99.

I tu tego nie rozumiem. Podobno ostatnim elementem tablicy jest "tab+rozmiar-1" a tutaj wychodzi na to że jest to "tab"rozmiar-2"

Dlaczego?

1
while (pocz <= kon) {
    pocz++;
    ....
}

Bo nie dość, że masz <=, to zwiększasz wskaźnik na samym początku pętli zamiast na końcu.
W momencie gdy pocz ma wartość tab+rozmiar-1, nadal robisz pocz++ i dopiero zaczynasz patrzeć na wartość pod tym adresem.

0

Podobno ostatnim elementem tablicy jest "tab+rozmiar-1" a tutaj wychodzi na to że jest to "tab"rozmiar-2"

Nieprawda. Tak jak Ci napisałem, w pętli szukającej funkcji f wychodzisz o jeden element poza zakres. Napraw to zamiast robić workaroundy.

0

Zmieniłem znak

 <=

na <

 i nadal to samo.

Czy dobrze wyświetlenie napisałem? 
```cpp
cout << f( tab , tab+a-1 ); 

Nie wiem czy to jest dobre czy tamto było.

0

Haha, jejku. Dobrze już jest wszystko OK. Jak zwykle siędzę nad jednym zadaniem po dwie godziny bo zrobiłem głupi błąd.

W inicjalizacji tablicy

for ( int i = 0;  i < a;  i++ )  
cin >> tab [i]; 

Pierwotnie napisałem,

 cin >> tab[a]

zatem pobierał cały czas..heh element o numerze rozmiaru.

Ale program działa dobrze dla znaku

<= 

Dziękuję za pomoc :)

1

Nie działa poprawnie dla <=: http://melpon.org/wandbox/permlink/sJciQxV5d79dknDj

0

To dlaczego mi działa?

Linijka 32:

 cout << f( tab , tab+a-1 );
0

To jest tzw. UB (tak jak wyżej napisałem). Próbujesz dokonać dereferencji elementu za ostatnim i akurat miałeś takie szczęście, że była tam wartość mniejsza niż maksymalna.

Lepiej wytłumacz mi dlaczego gdy, zgodnie z Twoją ideą, wyszukałem maksymalny element między pierwszym a przedostatnim elementem tablicy, wskazany został ostatni.

0

Nie wiem.

0

Ok sprawdziłem u siebie wyszukałem miedzy pierwszym a przed ostatnim. Rozmiar tab = 5, wartości kolejno: 1, 2, 3, 4, 5 i wynikiem jest 4.

Program u mnie działa poprawnie, teraz.

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