Sortowanie przez wstawianie C++

0

Czesc,
staram sie od 2 tygodni ogarnac temat projektu i w chwili obecnej utknalem w martwym punkcie ... program nie chce sie kompilowac, pokazuje bledy w sortowaniu

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <ctime>
#include <Windows.h>

using namespace std;

void wprowadz(int n, int m, int tab[][10]) // generator losowej tablicy
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
rand();
tab[i][j] = int(rand()%15 + -5);
}
}

}
void pisz_tab(int n, int m, int tab[][10]) // funkcja wypisująca daną tablicę
{
cout << endl;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout << tab[i][j] << "\t";
}
cout << endl;
}
}
void sortuj(int tab[], int rozmiar)
{
 
        for(int i = (rozmiar-2); i>=0; i--)
        {
                int temp = tab[i];
                int j = i++;
                while((temp > tab[j]) && (j < rozmiar))
                {
                        tab[j-1] = tab[j];
                        j++;
                }
                tab[j-1] = temp;
        }
 
}
int main()
{
srand((unsigned) time(NULL)); // deklaracja zmiennych DONE
short int n;
short int m;
short int wyb1;
short int wyb2;
short int wyb3;
short int pow;
int tab[10][10];
do // loop do...while powtarzająca
{
do // loop do...while sprawdzajaca poprawnosc
{
system("cls");

cout << "Witaj!" << endl << "Program ten wygeneruje macierz o maksymalnym " << endl << // wyswietlenie pierwszego MENU DONE
"rozmiarze 10x10 o losowych elementach z zakresu [-5;10] i go posortuje..." << endl <<
"(to do: sortowanie)" << endl << endl << "\tMENU"<< endl <<
"1. Reczne wpisanie rozmiaru tablicy" << endl <<
"2. Losowy rozmiar tablicy"<< endl <<
"Twoj wybor: ";
cin >> wyb1;
cin.clear();
cin.sync();
switch(wyb1) // wybranie opcji przez uzytkownika z pierwszego MENU
{
case 1: // case ktory pobiera rozmiar tablicy od uzytkownika
{
do // petla do...while sprawdzajaca poprawnosc wprowadzonych danych
{
cout << endl << "Podaj liczbe wierszy: ";
cin >> n;
cin.clear();
cin.sync();
if (n>10 || n<1)
{
cout << "Podaj liczbe z zakresu 1-10: ";
}
}
while(n>10 || n<1);
cout << "Podaj liczbe kolumn: ";
do // petla do...while sprawdzajaca poprawnosc wprowadzonych danych
{
cin >> m;
cin.clear();
cin.sync();
if (m>10 || m<1)
{
cout << "Podaj liczbe z zakresu 1-10: ";
}
}
while(m>10 || m<1);
pow=0;
break;
}
case 2: // case ktory losuje rozmiar macierzy
{
n=int(rand()%10 + 1);
m=int(rand()%10 + 1);
pow=0;
break;
}
default : // default-jezeli zostaly wprowadzone bledne dane
{
cout << endl << "Bledne dane";
cin.clear();
cin.sync();
pow=1;
_getch();
}
}
}
while(pow==1);
cout << endl << "Ilosc wierszy: " << n; // wypisanie rozmiarów wygenerowanej tablicy
cout << endl << "Ilosc kolumn: " << m << endl << endl;
cout << "Wcisnij dowolny klawisz by przejsc do kolejnego menu.";

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

do // petla do...while sprawdzajaca poprawnosc
{
_getch();
system("cls");
wprowadz(n,m,tab); // uzycie funkcji wprowadzajacej losowe dane do tablicy
cout << "\t MENU" << endl << // wyswietlenie drugiego MENU
"1. Wyswietlenie tablicy pierwotnej." << endl <<
"2. Wyswietlenie tablicy posortowanej." << endl <<
"3. Wyswietlenie tablicy pierwotnej i posortowanej." << endl <<
"Twoj wybor: ";

cin >> wyb2;
cin.clear();
cin.sync();
switch(wyb2) // wybranie opcji przez uzytkownika z drugiego MENU
{
case 1: // case wypisujacy pierwotna tablice
{
pisz_tab(n,m,tab);
pow=0;
break;
}
case 2: // case sortujacy i wypisujacy posortowana tablice
{
sortuj(n,m,tab);
pisz_tab(n,m,tab);
pow=0;
break;
}
case 3: // case wypisujacy macierz pierwotna, sortujacy ja
{ // i wypisujacy posortowana tablice
pisz_tab(n,m,tab);
cout << endl << endl << "===================================" <<
endl << endl;
sortuj(n,m,tab);
pisz_tab(n,m,tab);
pow=0;
break;
}
default : // default
{
cout << endl << "Bledne dane";
cin.clear();
cin.sync();
pow=1;
break;
}

}
}
while(pow==1);

cout << endl << "Wcisnij dowolny klawisz aby przejsc do kolejnego menu";

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

do
{ // petla do...while sprawdzajaca poprawnosc wprowadzonych danych DONE
_getch();
system("cls");
cout << "\tMENU" << endl << // wyswietlenie trzeciego MENU
"1. Powrot do poczatkowego menu." << endl <<
"2. Zakonczenie dzialania programu." << endl <<
"Twoj wybor: ";

cin >> wyb3;
cin.clear();
cin.sync();
switch(wyb3) // wybranie opcji przez uzytkownika z drugiego MENU
{
case 1: // case powracajacy na poczatek programu
{
pow=1;
break;
}
case 2: // case konczacy program
{
cout << endl << endl << "Dziekuje za skorzystanie z programu!";
pow=2;
break;
}
default: // default-jezeli zostaly wprowadzone bledne dane
{
cout << endl << "Bledne dane";
cin.clear();
cin.sync();
pow=3;
break;
}
}
}
while(pow==3);
}
while(pow==1);
_getch();
return 0;
}
0

Pokazuje błąd przy próbie wywołania funkcji sortuj z trzema parametrami, kiedy to funkcja sortuj przyjmuje tylko dwa.

0

Czyli jezeli wywale zbedny parametr powinno smigac? czy ewentualnie zmienic cos musze dodatkowo?

0

Funkcja sortuj jest przeznaczona dla tablicy jednowymiarowej, a masz do posortowania dwuwymiarową.

0

2h testow i nic ;o jakas dobra dusza jest w stanie to poprawic ?

0

no tosz mowie ze testowalem rozwiazania w tyl i w przod i nic... nie kompiluje sie przez blad w skrypcie sortowania i NIE WIEM jak rozwiazac ten blad... wszystko ladnie, pieknie - pokazaliscie mi bledy (za co dziekuje btw) ale nie jestem w stanie ich rozwiazac ;x

0

To ja proponuje zacząć myśleć zamiast "testować" jak małpa. Kod sortowania który skądś ukradłeś nijak nie pasuje do problemu który masz rozwiązać i tyle. Napisz funkcje sortującą tablice DWUWYIMAROWE, podmieć funkcje sortuj na tą nową i voila.

0

kozystajac ze skryptu z wykladow:

 

void Sortuj_Przez_Wstawianie(int A[])
/*  Funkcja sortuje n liczb tablicy A metoda */
/*  sortowania przez wstawianie.             */
{
  int i, j, tmp;
    for (i = 0; i < n-1; i++)
      { j = i + 1;
	tmp = A[j];
	while ((j > 0) && (A[j-1] > tmp))
	  { A[j] = A[j-1];
	    j--;
	  }
	A[j] = tmp;
       }
} 

doszedlbym do tego samego miejsca... jak widac na zalaczonym obrazku sortowanie tablic dwuwymiarowych dysponujac kodem dla 1wymiarowej i zadnymi informacjami (bylem na wykladach, mam wszystkie zapisane) na temat adaptacji tego kodu dla 2wymiarowych tablic mam prawo miec problemy...

na githubie tez same jednowymiarowki widzialem ;o

0

Jeżeli rozumiesz jak to działa, to nie masz prawa mieć problemów z adaptacją. Jeżeli zaś nie rozumiesz to bez sensu marnowałeś czas na wykładach.

0
PGSYoGi napisał(a):

kozystajac ze skryptu z wykladow:

 

void Sortuj_Przez_Wstawianie(int A[])
/*  Funkcja sortuje n liczb tablicy A metoda */
/*  sortowania przez wstawianie.             */
{
  int i, j, tmp;
    for (i = 0; i < n-1; i++)
      { j = i + 1;
	tmp = A[j];
	while ((j > 0) && (A[j-1] > tmp))
	  { A[j] = A[j-1];
	    j--;
	  }
	A[j] = tmp;
       }
} 

doszedlbym do tego samego miejsca... jak widac na zalaczonym obrazku sortowanie tablic dwuwymiarowych dysponujac kodem dla 1wymiarowej i zadnymi informacjami (bylem na wykladach, mam wszystkie zapisane) na temat adaptacji tego kodu dla 2wymiarowych tablic mam prawo miec problemy...

na githubie tez same jednowymiarowki widzialem ;o

Chyba wiem, skąd masz to zadanie, z jakiej uczelni. Tak się składa ze też wiem coś na ten temat. Faktem jest ze prowadzący powiedział coś co mogło by poprawić rozumienie tego zadania, ale powiedział to tylko paru osobą które spytały go po wykładzie. Szczęście, że przechodziłem i usłyszałem. Klu problemu jest skorzystanie z biblioteki brain.hpp. Podobno korzystając z niej można w prosty sposób przerobić algorytmy na tablice jednowymiarową na tablice 2 wymiarową, a podobno jakieś kujony co odpowiadały na pytania w pierwszym rzędzie zrobiły algorytmy na n=wymiarowe tablice. Z tego co wiem, to brain.hpp nie jest dostępne publiczne ale darmowe tylko trzeba poszukać. Powodzenia!

0

ehh ta ironia ...

0

Ja bym zaczął od zadania sobie pytania "jak wygląda posortowana tablica 2 wymiarowa?".

0

void sortuj(int tab[][10], int i, int j)
{
        int y;
        bool sorted = false;
        while(sorted==false)
        {
            sorted=true;
            for(i;i>=0;i--)
            {
                for(j; j>=0; j--)
                {
                    if(tab[j+1][i] < tab[j][i])
                    {
                        y = tab[j][i];
                        tab[j][i] = tab[j+1][i];
                        tab[j+1][i] = y;
                        sorted=false;
                    }
                }
            }
            
        }
 
}

gdyby tylko sortowanie dzialalo i nie wyswietlalo liczb .... conajmniej dziwnych (np.: 8374928391)

razem z tym caly program sie kompiluje bez problemu, nie pokazuje bledow ale po prostu nie trybi i juz...

0

lol
'i' oraz 'j' początkowo są rozmiarami tablicy (np. 10, 10), więc dlaczego masz jakieś warunki

if(tab[j+1][i] < tab[j][i])

i operacje na indeksach i, i+1, j, j+1? Przepraszam ale od kiedy ta tablica ma elementy o takich indeksach? Ja myślałem że ma od 0 do i-1 oraz od 0 do j-1...

0

no niestety, nie ukrywam, ze nie wiem dlaczego nie dziala... pisanie programow nigdy nie bylo i pewnie nie bedzie moja mocna strona ;o

tak - staram sie szczesliwym trafem zgadnac byc moze dane rozwiazanie bedzie trafne - skoro wszyscy maja w dupie i sypia ironiami na kazdym kroku to wydaje sie najrozsadniejszym wyjsciem w danym momencie... oh well

0

Nie da się programować szczęśliwym trafem. Musisz zrozumieć co robisz. Jak niezbyt rozumiesz to narysuj sobie to na kartce w postaci schematu.

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