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

Wskaźniki funkcja sortująca c++ zad dom

Object Storage Arubacloud
0 głosów
1,381 wizyt
pytanie zadane 16 września 2018 w C i C++ przez Archeon Początkujący (480 p.)

Witam,

Treść zadania domowego : 

Napisz funkcję void sortuj(int* begin, int* end), która dowolną metodą sortuje liczby w tablicy, podanej przez wskaźnik na pierwszy element i element za końcem tablicy. Weź funkcję wypisz() z przykładu i użyj tego main():

Kod z którego mam skorzystać : 

#include <iostream>

void sortuj( int * begin, int * end )
{
    
}

void wypisz( int * begin, int size )
{
    while( size > 0 )
    {
        std::cout << * begin << ' ';
        ++begin;
        --size;
    }
}

int main()
{
  int tab[ 10 ] = { 0, 9, 1, 3, 8, 2, 6, 7, 5, 4 };
    sortuj( tab, tab + 10 );
    wypisz( tab, 10 );
}

Czy ktoś może mi dać jakieś wskazówki jak powinienem się za to zabrać?

 

 

komentarz 16 września 2018 przez Hiskiel Pasjonat (22,830 p.)
Czemu każą Ci używać kamienia, żeby wbić kółek, skoro masz wkrętarkę i śruby?
komentarz 16 września 2018 przez Archeon Początkujący (480 p.)
Jestem otwarty na sprytniejsze sposoby.. Aktualnie przerabiam wskaźniki i chciałbym się tego nauczyć.

Takie polecenie jest na podane na forum "kursu"
komentarz 16 września 2018 przez Hiskiel Pasjonat (22,830 p.)
Okay. Poczytaj tutaj o jakimś algorytmie typu bubble sort czy quick sort I spróbuj zaimplementować. Najprościej byłoby użyć std::sort.

2 odpowiedzi

0 głosów
odpowiedź 16 września 2018 przez Poczprogramista123 Bywalec (2,900 p.)
Bubble sort
0 głosów
odpowiedź 16 września 2018 przez k4to Początkujący (310 p.)
Podejdz do tego zadania w taki sposób jak byś miał to wszystko robić za pomocą prostych instrukcji : pętla, if i zastanów się jak można zadać programowi porównanie liczb i zamianę miejscami. Jak sam na to nie wpadniesz to poczytaj np. o sortowaniu bąbelkowym czyli tak jak inni wcześniej wspomniali bubble sort, tam jest to wyjaśnione.
komentarz 16 września 2018 przez Archeon Początkujący (480 p.)
Okej, wiem juz co i jak np z sort buble, ale mój problem polega na tym że nie wiem jak to zaimplementować do funkcji ze wskaznikami..
komentarz 16 września 2018 przez Archeon Początkujący (480 p.)

@k4to, czy jestem chociaż na dobrej drodze ?

#include <iostream>
#include <cstdlib>
using namespace std;

/*

void sort_buble ( int *tab, int size )
{
    for( int i = 0; i < size; i++ )
    {
        for( int j = 0; j < size - 1; j++ )
        {
            if( tab[ j ] > tab[ j + 1 ] )
                 swap( tab[ j ], tab[ j + 1 ] );
            
        }
    }
}
*/
void sortuj (int * begin, int * end)
{
	int size;
	size = begin - end;
	int tab[size];
	* begin =  tab[size];
	for( int i = 0; i < size; i++ )
    {
        for( int j = 0; j < size - 1; j++ )
        {
            if( tab[ j ] > tab[ j + 1 ] )
                 swap( tab[ j ], tab[ j + 1 ] );
            
        }
    }
	
	
}



void wypisz( int * begin, int size )
{
    while( size > 0 )
    {
        std::cout << * begin << ' ';
        ++begin;
        --size;
    }
}

int main(int argc, char** argv) {
	
	int tab[ 10 ] = { 0, 9, 1, 3, 8, 2, 6, 7, 5, 4 };
    sortuj( tab, tab + 10 );
    wypisz( tab, 10 );
	
	
	
	
	
	return 0;
}

 

komentarz 16 września 2018 przez k4to Początkujący (310 p.)
edycja 16 września 2018 przez k4to
Idziesz w dobrym kierunku , natomiast w ifie można obejść sie bez swap'a, a wskazniki wlasnie masz w argumentach wiec ich tam użyj.
komentarz 16 września 2018 przez Archeon Początkujący (480 p.)

Więc tak.. zrobiłem i działa, ale nie użyłem wskaznika * end..

Jak mam go zaimplementować do tego kodu ?

#include <iostream>
#include <cstdlib>
using namespace std;

/*

void sort_buble ( int *tab, int size )
{
    for( int i = 0; i < size; i++ )
    {
        for( int j = 0; j < size - 1; j++ )
        {
            if( tab[ j ] > tab[ j + 1 ] )
                 swap( tab[ j ], tab[ j + 1 ] );
            
        }
    }
}
*/
void sortuj (int * begin, int * end)
{
	for( int i = 0; i < 9; i++ )
	{
        for( int j = 0; j < 9; j++ )
        {
            if( begin[ j ] > begin[ j + 1 ] )
                 swap( begin[ j ], begin[ j + 1 ] );
            
        }  
    }
    
}



void wypisz( int * begin, int size )
{
    while( size > 0 )
    {
        std::cout << * begin << ' ';
        ++begin;
        --size;
    }
}

int main(int argc, char** argv) {
	
	int tab[ 10 ] = { 0, 9, 1, 3, 8, 2, 6, 7, 5, 4 };
    sortuj( tab, tab + 10 );
    wypisz( tab, 10 );
	
	
	
	
	
	return 0;
}

 

komentarz 16 września 2018 przez Archeon Początkujący (480 p.)

Kurde nie chce spamować.. ale chyba sobie poradziłem

void sortuj (int * begin, int * end)
{
	int size = end - begin;
	for( int i = 0; i < size; i++ )
	{
        for( int j = 0; j < size-1; j++ )
        {
            if( begin[ j ] > begin[ j + 1 ] )
                 swap( begin[ j ], begin[ j + 1 ] );
            
        }  
    }
    
}

Wiec funkcja teraz działa dobrze, ale nie rozumiem dlaczego musiałem np 

Z tego:                   for( int j = 0; j < 9; j++ )

Zmienić tak for( int j = 0; j < size-1; j++ ) że jest to ( -1) ?

 

 

komentarz 16 września 2018 przez k4to Początkujący (310 p.)
Wskaźniki end i begin możesz wykorzystać do obliczenia wielkości tablicy, wtedy funkcja będzie bardziej uniwersalna, niezależna od wielkości tablicy, a tak teraz masz ta funkcje ograniczoną do tablicy 10 elementowej ;)
komentarz 16 września 2018 przez k4to Początkujący (310 p.)
Ponieważ w tablicy 10 elementowej numerujemy indeksy elementów od 0 do 9, nie istnieje element o indeksie 10, a size masz wlasnie liczbe równą 10 bo 10 elementów tablicy.
komentarz 17 września 2018 przez Archeon Początkujący (480 p.)
Już wszystko zrozumiałem, dziękuję.

Podobne pytania

0 głosów
1 odpowiedź 471 wizyt
pytanie zadane 10 stycznia 2019 w C i C++ przez Mavannkas Bywalec (2,290 p.)
0 głosów
1 odpowiedź 1,266 wizyt
pytanie zadane 18 grudnia 2018 w C i C++ przez pysiek Początkujący (280 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 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!

...