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

program sortujacy liczby losowe

VPS Starter Arubacloud
0 głosów
575 wizyt
pytanie zadane 20 marca 2021 w C i C++ przez paweł007 Nowicjusz (180 p.)

witam natknałem sie na mały problem mianowicie mam zadanie ktorego polecenie brzmi 

Stwórz program, który wypełnia tablicę jednowymiarową o dowolnym rozmiarze i ustawia rosnąco elementy z zastosowaniem algorytmu sortowania bąbelkowego.

Program zawiera funkcje (void!!!):

 - wprowadzania danych (rozmiar tab),1funkcja void

 - losującą (gen. l. pseudolosowych) 2funkcja void

 - sortowania danych (alg. s. bąbelkowego) 3funkcja void

poki co mam to:

 

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void WprowadzenieDanych()
{
 int n; //początkowy rozmiar tablicy

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

 int tab [n];
}

void GenerowanieLiczbLososwych()
{
    int i;
    srand (time(NULL));
    cout << "Elementy tablicy: "<<endl;

    for (i=1;i<=n; i++)
        {
            tab[i] = rand () %1000;
            cout << tab[i] <<" ";
        }
}





int main()
{

 WprowadzenieDanych();
 GenerowanieLiczbLososwych();

return 0;
}

 wyswietla mi sie błąd dotyczacy drugiej funkcji void ze nie zadeklarowałem tablicy "tab" a ja to zrobiłem w pierwszej funkcji i rozumiem dlaczego tak sie dzieje no bo to sa dwie funkcje oddzielne i jezeli jakies dane stworzyłem w pierwszej to nie istnieja one w drugiej funkcji tylko w takim razie jak mam zrobic druga funkcje no bo musi ona korzystac z danych stworzonych w pierwszej funkcji tak samo bedzie w trzeciej funkcji ktora ma za zadanie posortowac te liczby wiec bedzie musiala znać liczby wylosowane w drugiej funkcji 

2 odpowiedzi

0 głosów
odpowiedź 20 marca 2021 przez Landu Stary wyjadacz (11,880 p.)
Do głowy przychodzą mi dwa rozwiązania:

1. Jeżeli możesz, to zwróć z funkcji WprowadzanieDanych() zmienną tab[] i przekaż ją w argumencie do funkcji GenerowanieLiczbLosowych()

2. Wewnątrz funkcji WprowadzanieDanych() wywołaj funkcję GenerowanieLiczbLosowych() i przekaż do niej tab[]
komentarz 20 marca 2021 przez paweł007 Nowicjusz (180 p.)
ale chwila jak przekazać w sensie wydaje mi sie ze tą drugą opcje bardziej rozumiem tylko wlasnie jak przekazac ta funkcje, co zrobic zeby funkcja   GenerowanieLiczbLosowych() "wiedziała" o istnieniu tablicy tab. Jest jakas konkretna funkcja ktora pozwoli mi na takie "przekazanie"?
komentarz 20 marca 2021 przez Landu Stary wyjadacz (11,880 p.)
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void GenerowanieLiczbLososwych(int tab[], int tab_dlugosc) {
    srand(time(NULL));
    cout << "Elementy tablicy: " << endl;

    for (int i = 0; i < tab_dlugosc; i++) {
        tab[i] = rand() % 1000;
        cout << tab[i] << " ";
    }

    delete[] tab;
}

void WprowadzenieDanych() {
    int n; //początkowy rozmiar tablicy

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

    int* tab = new int[n];
    GenerowanieLiczbLososwych(tab, n);
}


int main() {
    WprowadzenieDanych();

    return 0;
}

 

komentarz 20 marca 2021 przez paweł007 Nowicjusz (180 p.)

o kurde to ja nawet nie wiedziałem ze tak sie da surprise w kazdym razie dziekuje jakbym mial jakis jeszcze problem to zapytam

 

komentarz 20 marca 2021 przez paweł007 Nowicjusz (180 p.)

@Landu, a tak w ogole to po co jest ta linijka 16?

 

komentarz 20 marca 2021 przez Landu Stary wyjadacz (11,880 p.)

Ogólnie to nie możesz tworzyć tablicy o danej długości poprzez:

cout << "Podaj rozmiar tablicy: ";
cin >> n;
int tab [n];

Musisz to zrobić przez wskaźnik, tak jak podałem:

cout << "Podaj rozmiar tablicy: ";
cin >> n;
int* tab = new int[n];

Musisz jednak pamiętać, żeby w ostatnim miejscu, gdzie potrzebna jest zmienna użyć:

delete[] tab;

delete[] usuwa zmienną i zwalnia pamięć. W tak krótkim programie nic się nie stanie, jak o tym zapomnisz, ale sprawdzający zadanie może się przyczepić.

komentarz 20 marca 2021 przez paweł007 Nowicjusz (180 p.)
a dlaczego musze przez wskaźnik? no bo wpisując samo int tab[n] to program tez działa
komentarz 20 marca 2021 przez Landu Stary wyjadacz (11,880 p.)
Zależy od kompilatora, w Visual Studio int tab[n] nie zadziała, ale kompilator MinGW już na to pozwala.
komentarz 20 marca 2021 przez paweł007 Nowicjusz (180 p.)

@Landu, i czym jest zmienna tab_dlugosc, w sensie no domyslam sie czym jest ale w calym programie ta zmienna nigdzie nie ma przypisanej zadnej wartosci to skad program wie ile ona wynosi

komentarz 20 marca 2021 przez Landu Stary wyjadacz (11,880 p.)

tab_dlugosc to jest argument funkcji GenerowanieLiczbLosowych:

void GenerowanieLiczbLososwych(int tab[], int tab_dlugosc) {

wartość tego argumentu (czyli takiej zmiennej dostępnej w danej funkcji) jest ustawiany tutaj:

GenerowanieLiczbLososwych(tab, n);

 

komentarz 20 marca 2021 przez paweł007 Nowicjusz (180 p.)
nie no troche mnie to przytłacza bo wiekszosci tych ezeczy nie mialem nawet na zajeciach
komentarz 20 marca 2021 przez Landu Stary wyjadacz (11,880 p.)
Ja bym powiedział, że to jest totalna podstawa do tego typu zadania.
komentarz 21 marca 2021 przez paweł007 Nowicjusz (180 p.)
dlatego wlasnie zdziwilem sie ze dostalem takie zadanie
komentarz 21 marca 2021 przez paweł007 Nowicjusz (180 p.)
a tak wracajac do zadania to teraz musze dodac funkcje void odpowiedzialna za posortowanie tych liczb, czyli musze przekazac tablice tab z funkcji GenerowanieLiczbLososwych(int tab[], int tab_dlugosc) i jej wielkosc czyli "n" z funkcji WprowadzenieDanych() tak?
komentarz 21 marca 2021 przez tkz Nałogowiec (42,000 p.)

@Landu,

#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
void GenerowanieLiczbLososwych(int tab[], int tab_dlugosc) {
    srand(time(NULL));
    cout << "Elementy tablicy: " << endl;
 
    for (int i = 0; i < tab_dlugosc; i++) {
        tab[i] = rand() % 1000;
        cout << tab[i] << " ";
    }
 
    delete[] tab;
}
 
void WprowadzenieDanych() {
    int n; //początkowy rozmiar tablicy
 
    cout << "Podaj rozmiar tablicy: ";
    cin >> n;
 
    int* tab = new int[n];
    GenerowanieLiczbLososwych(tab, n);
}
 
 
int main() {
    WprowadzenieDanych();
 
    return 0;
}

Ten kod jest bezsensu. Delegujesz zwalnianie tablicy gdzieś, gdzie nie ma to sensu. 

#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
void GenerowanieLiczbLososwych(int tab[], int tab_dlugosc) {
    srand(time(NULL));
    cout << "Elementy tablicy: " << endl;
    for (int i = 0; i < tab_dlugosc; i++) {
        tab[i] = rand() % 1000;
        cout << tab[i] << " ";
    }
}
 
void WprowadzenieDanych(int tab[], int tab_dlugosc) { //ta funckja jest kompletnie zbędna, ale skoro polecenie tego wymaga...
    GenerowanieLiczbLososwych(tab, tab_dlugosc);
} 

int main() {
    int n;
    cout << "Podaj rozmiar tablicy: ";
    cin >> n;
    int* tab = new int[n];
    WprowadzenieDanych();
    Sortowanie(tab, n); //do implementacji
    delete[] tab;
    return 0;
}

Tak to powinno wyglądać. 

komentarz 21 marca 2021 przez paweł007 Nowicjusz (180 p.)
dobra wreszcie sie udało nie wiem czy program jest dobrze zbudowany czy nie ale dziala jak ma dzialac wiec ja sie nie przejmuje juz
0 głosów
odpowiedź 31 marca 2021 przez BedrisK Użytkownik (600 p.)

Sortowanie bąbelkowe

#include<iostream>

using namespace std;

main()
{
    int tab[100], n, zap;
    cout<<"Ile liczb chcesz posortowac: ";
    cin>>n;

    for(int i=0; i<n; i++)
    {
        cout << "Wypisz liczbe " << i+1 << ": ";
        cin>>tab[i];
    }

    for(int i=0; i<n; i++)
    {
        for(int j=1; j<n-i; j++)
        {
            if(tab[j-1]>tab[j])
            {
                zap=tab[j-1];
                tab[j-1]=tab[j];
                tab[j]=zap;
            }
        }
    }

    cout << "Liczby po posortowaniu: ";
    for(int i=0; i<n; i++)
    {
        cout << tab[i] << " ";
    }
}

 

Podobne pytania

0 głosów
0 odpowiedzi 714 wizyt
pytanie zadane 21 maja 2020 w C i C++ przez Szarlotka Użytkownik (890 p.)
0 głosów
2 odpowiedzi 139 wizyt
pytanie zadane 15 września 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 422 wizyt
pytanie zadane 13 stycznia 2017 w C i C++ przez pokrywa1 Użytkownik (990 p.)

92,452 zapytań

141,262 odpowiedzi

319,079 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...