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

Zwracanie tablicy z funkcji.

0 głosów
181 wizyt
pytanie zadane 26 listopada 2020 w C i C++ przez mik53r Nowicjusz (150 p.)

Hej, mam problem ze zwracaniem tablicy z funkcji. Funkcja losuje liczby bez powtórzeń i zapisuje je w tablicy, następnie taką tablicę chcę zwrócić z funkcji. Nie do końca ogarniam jak to zrobić.

Kod wygląda następująco: 

#include <iostream>
#include <ctime>

int losowanie(int ile_losow, int zakres)
{
    
int* tab = new int [ile_losow+1];
bool sprawdzenie;
int ile=0;
int n;

for(int i=1; i<=ile_losow; i++)
{
    
    do
    {
        int liczba=(rand()%zakres)+1;
        sprawdzenie=true;

        for(int j=1; j<=ile_losow; j++)
        {
            if(liczba==tab[j])
            {
                sprawdzenie=false;
            }
        }
        if(sprawdzenie==true)
        {
            ile++;
            tab[ile]=liczba;

        }
    }while(sprawdzenie!=true);
}
// sprawdzenie, czy funkcja poprawnie losuje liczby 
/*
for(int k=1; k<=ile_losow; k++)
     {
         std::cout<<tab[k]<<std::endl;
     }
*/

return tab[2];
}

int main() 
{
srand(time(NULL));





return 0;
}

Moim zamiarem było wykorzystanie funkcji do wygenerowania  tablic liczb losowych, a następnie chciałem wykorzystać tą tablice w dalszej części programu, do wypisania jej forem na ekran i wyznaczenia wartości maksymalnej. W momencie gdy chcę zwrócić tablice w funkcji wyskakuje błąd. Domyślam się, że jest to spowodowane wykorzystaniem wskaźników, niestety teorię staram się nadrabiać jak najszybciej, ale musiałem nagle wskoczyć w C++ i jeszcze nie do końca wszystko ogarniam. 

Z góry, dziękuję za pochylenie się nad tematem. 

1 odpowiedź

+2 głosów
odpowiedź 26 listopada 2020 przez tangarr VIP (136,880 p.)
wybrane 26 listopada 2020 przez mik53r
 
Najlepsza

Zwracasz jedną liczbę zamiast tablicy;

int * stworz_tablice(int rozmiar) {
    int *tablica = new int [rozmiar];
    return tablica;
}

Kilka uwag:
- dlaczego tworzysz tablicę o 1 większą?
- dlaczego iterujesz po tablicy od indeksu 1? Tablice w C++ są indeksowane od zera.
- pętla do {} while jest bez sensu - iterujesz po niezainicjowanych elementach. Przemyśl ją ponownie

komentarz 26 listopada 2020 przez mik53r Nowicjusz (150 p.)

Dzięki, kod się już kompiluje i funkcja zwraca tablice. Teraz mam pytanie, jak ją poprawnie wyświetlić. 

int* losowanie(int ile_losow, int zakres)
{
    
int* tab = new int [ile_losow];
bool sprawdzenie;
int ile=0; //zmienna pomocnicza umozliwajaca porownanie czy liczby sie nie powtorzyly 


for(int i=1; i<=ile_losow; i++) // petla ktora okresla ilosc losowanych liczb
{
    
    do //petla losujaca liczbe
    {
        int liczba=(rand()%zakres)+1; //losowanie
        sprawdzenie=true;

        for(int j=1; j<=ile_losow; j++) //petla sprawdzajaca czy wylosowana liczba sie nie powtarza
        {
            if(liczba==tab[j])
            {
                sprawdzenie=false; //jesli sie powtarza mamy FALSE i losujemy nastepna liczbe
            }
        }
        if(sprawdzenie==true) //warunek ktory zapisuje wylosowana liczbe do tablicy (jesli sie nie powtarza)
        {
            ile++;
            tab[ile]=liczba;

        }
    }while(sprawdzenie!=true); //do-while trwa do momentu gdy niepowtorzona liczba zapisze sie do tablicy, po czym wracamy do fora i tak "ile_losow"
}
// sprawdzenie, czy funkcja poprawnie losuje liczby 
/*
for(int k=1; k<=ile_losow; k++)
     {
         std::cout<<tab[k]<<std::endl;
     }
*/

return tab;
}

int main() 
{
srand(time(NULL));
int tab[4];

for(int i=1; i<=5; i++)
{
    tab[i]=*losowanie(5,5); // kompilator dopuszcza tylko taki zapis z gwiazdka ale w tym momencie na ekran zostają wyświetlone same zera
    std::cout<<tab[i]<<std::endl;
}


return 0;
}

W momencie gdy, próbuje w taki sposób wyświetlić tablice, program wypisuje same zera. 

komentarz 26 listopada 2020 przez tangarr VIP (136,880 p.)

Nie można przypisać wskaźnika do tablicy (ani tablicy do tablicy).

int *tab = losowanie(5,5);
for (int i=0; i<5; i++) {
   cout << tab[i] << " ";
}

// na koniec programu/zasięgu zmiennej
delete [] tab;

Ponadto zupełnie olałeś to co ci napisałem o indeksowaniu tablicy.
Tablica składająca się X elementów jest indeksowana od 0 do X-1.

komentarz 26 listopada 2020 przez mik53r Nowicjusz (150 p.)
Wielkie dzięki za pomoc, ewidentnie brakuje mi jeszcze zaplecza teoretycznego i bardzo mi pomogłeś. Wskazówki odnośnie indeksowania tablicy nie olałem, wiem że indeksuje się od 0 do n-1, ale w moim przypadku nie mogę w ten sposób zapisać pętli, gdyż kod zostaje podany do programu symulacyjnego, który nie przyjmuje takiego indeksowania i powoduje to duże komplikacje, stąd niejako mam odgórnie narzucone takie indeksowanie.

Jeszcze raz wielkie dzięki za szybką i rzetelną pomoc.

Podobne pytania

0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 25 kwietnia 2020 w C i C++ przez Anahan89 Obywatel (1,240 p.)
0 głosów
2 odpowiedzi 2,860 wizyt
pytanie zadane 17 listopada 2016 w C i C++ przez intensick Początkujący (440 p.)
0 głosów
3 odpowiedzi 210 wizyt
pytanie zadane 12 stycznia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)

86,541 zapytań

135,291 odpowiedzi

300,649 komentarzy

57,288 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...