Jak zawrzeć sortowanie macierzy w pętli?

0

Cześć, ostatnio mam do napisania program sortujący macierz 5 na 5.
Zastanawiam się jak te 5 kolumn wrzucić w pętle. No bo po co było pisać to 5 razy, skoro wystarczy jeden loop, tylko właśnie nie wiem jak to w ogóle zawrzeć, z góry dziękuję za pomoc.

Mam coś takiego:

#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <time.h>

using namespace std;

    const int n = 5;
    int succesful;

int main(){

    int tab[n][n], line;



    srand(time(NULL));

    cout<<"PRZED SORTOWANIEM"<<endl;

    for(int i = 0; i < n; i++){

        for(int j = 0; j < n; j++){

            tab[i][j] = (rand() %9 ) + 1;
            cout<<tab[i][j]<<" ";

        }
        cout<<endl;
    }

	cout<<endl;

    cout<<"PO SORTOWANIU OD NAJMNIEJSZEJ DO NAJWIEKSZEJ"<<endl;



    for(int i = 0; i < n - 1; i++){
        for(int j = 0; j < n - 1; j++){

            if(tab[0][j] > tab[0][j + 1]) swap(tab[0][j], tab[0][j + 1]);

        }
    }

    for(int i = 0; i < n - 1; i++){
        for(int j = 0; j < n - 1; j++){

            if(tab[1][j] > tab[1][j + 1]) swap(tab[1][j], tab[1][j + 1]);

        }
    }

     for(int i = 0; i < n - 1; i++){
        for(int j = 0; j < n - 1; j++){

            if(tab[2][j] > tab[2][j + 1]) swap(tab[2][j], tab[2][j + 1]);

        }
    }

     for(int i = 0; i < n - 1; i++){
        for(int j = 0; j < n - 1; j++){

            if(tab[3][j] > tab[3][j + 1]) swap(tab[3][j], tab[3][j + 1]);

        }
    }

     for(int i = 0; i < n - 1; i++){
        for(int j = 0; j < n - 1; j++){

            if(tab[4][j] > tab[4][j + 1]) swap(tab[4][j], tab[4][j + 1]);

        }
    }

     for(int i = 0; i < n - 1; i++){
        for(int j = 0; j < n - 1; j++){

            if(tab[5][j] > tab[5][j + 1]) swap(tab[5][j], tab[5][j + 1]);

        }
    }




    for(int i = 0; i < n; i++){

        for(int j = 0; j < n; j++){

            cout<<tab[i][j]<<" ";

        }
        cout<<endl;
    }


 return 1337;

}
2

No bo po co było pisać to 5 razy, skoro wystarczy jeden loop

Napisz funkcję dla tego

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

powtarzającego się fragmentu kodu i wywołaj ją kilka razy w pętli.

0

ja pierdziele czlowieku jestes genialny
znaczy nie
ja jestem debilem bo tego nie skminiłem
ale bez funkcji jakos dalo by rade to zrobic?
tak w tym kodzie w jednym forze

1

Wystarczy dodać kolejne zagnieżdżenie pętli, gdzie indeks będzie odpowiadał stałym dosłownym w indeksach.
Jednak upieram się przy funkcji, bo zdecydowanie poprawisz czytelność kodu.

2
karmelek123123 napisał(a):

ale bez funkcji jakos dalo by rade to zrobic?

Dałoby się – trzeba dodać jeszcze jedną pętlę. :D

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

Przy czym Twój kod jest błędny, bo elementy o indeksach 5 nie istnieją w tablicy. Czyli te pętle są złe:

for(int i = 0; i < n - 1; i++){
  for(int j = 0; j < n - 1; j++){
    if(tab[5][j] > tab[5][j + 1]) swap(tab[5][j], tab[5][j + 1]);
  }
}
0
YooSy napisał(a):

Wystarczy dodać kolejne zagnieżdżenie pętli, gdzie indeks będzie odpowiadał stałym dosłownym w indeksach.
Jednak upieram się przy funkcji, bo zdecydowanie poprawisz czytelność kodu.

No ale nie mieliśmy funkcji jeszcze w szkole (ale wiem o co ci chodzi).
W sensie jeszcze jedna petla i w niej to wszystko?
Nie wiem czy to zadziała bo próbowalem czegos podobnego
Spróbuje z tą funkcją też

1

Masz przykład w poście wyżej – bez problemu zadziała, o ile nie pomieszasz indeksowania.

0
furious programming napisał(a):
karmelek123123 napisał(a):

ale bez funkcji jakos dalo by rade to zrobic?

Dałoby się – trzeba dodać jeszcze jedną pętlę. :D

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

Przy czym Twój kod jest błędny, bo elementy o indeksach 5 nie istnieją w tablicy. Czyli te pętle są złe:

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

No działa ale nie sortuje ostatniej linijki.
Czemu tak?

0

No dobra, już kminię chyba. Dużo mi pomogliście, dzięki chłopaki :3.

0
  1. Algorytm podany przez @furious programming jest prawidłowy.
    2. Tablica ma niezainicjalizowane komórki, a wypisywanie niezainicjalizowanych zmiennych jest Undefined behavior.
    Popraw kod i powinno być OK, bo teraz program może nawet gasić światło w pokoju bez twojej wiedzy :]
0
YooSy napisał(a):
  1. Algorytm podany przez @furious programming jest prawidłowy.
  2. Tablica ma niezainicjalizowane komórki, a wypisywanie niezainicjalizowanych zmiennych jest Undefined behavior.
    Popraw kod i powinno być OK, bo teraz program może nawet gasić światło w pokoju bez twojej wiedzy :]

Ale że jak nezainicjalizowane zmienne, nie rozumiem
jest 5 wierszy i 5 kolumn razem 25 liczb
wszystko jest przeciez wiadome
dodanie do indeksu n +1 sprawia ze nie sortuje pierwszego wiersza a reszte tak samo n nie sortuje tylko ostatniego ale nie wiem jak mam to rozumiec

1

@karmelek123123: macierze w C++ indeksowane są od 0, więc nie ma takiej możliwości, aby pętla pomijała ostatni „wiersz”. Poniższe zagnieżdżone pętle dają indeksy wszystkich istniejących w tablicy komórek:

int size = 5;

for(int row = 0; row < size; row++)
  for(int col = 0; col < size; col++)

gdzie size określa liczbę komórek danego wymiaru, row zawiera kolejne indeksy wierszy, a col kolumn. Jeśli Twój program nie działa poprawnie, pomimo tego, że pętle wyglądają tak jak powyższe, to błąd masz gdzieś indziej.

0
furious programming napisał(a):

@karmelek123123: macierze w C++ indeksowane są od 0, więc nie ma takiej możliwości, aby pętla pomijała ostatni „wiersz”. Poniższe zagnieżdżone pętle dają indeksy wszystkich istniejących w tablicy komórek:

int size = 5;

for(int row = 0; row < size; row++)
  for(int col = 0; col < size; col++)

gdzie size określa liczbę komórek danego wymiaru, row zawiera kolejne indeksy wierszy, a col kolumn. Jeśli Twój program nie działa poprawnie, pomimo tego, że pętle wyglądają tak jak powyższe, to błąd masz gdzieś indziej.

Masz rację ale nie mam pojęcia co jest nie tak, kod wygląda tak ( dodałem dodatkowy wiersz dla testu i też go nie sortuje, nie wiem co mu nie pasuje) Wie ktoś co może być nie tak?

W uzupełnieniu dodam że posortowałem same kolumny ( dodanie +1 do indeksu i a nie j) i nie program również nie sortuje ostatniej kolumny. Zaczynam powoli tracić cierpliwość, z góry dziękuję za wszelkie rady.

#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <time.h>

using namespace std;

int n = 6;
int main(){

    int tab[6][6];
    srand(time(NULL));

    cout<<"PRZED SORTOWANIEM"<<endl;

    for(int i = 0; i < n; i++){

        for(int j = 0; j < n; j++){

            tab[i][j] = rand()%10+1;
            cout<<tab[i][j]<<" ";

        }
        cout<<endl;
    }

	cout<<endl;

    cout<<"PO SORTOWANIU OD NAJMNIEJSZEJ DO NAJWIEKSZEJ"<<endl;


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




    for(int i = 0; i < n; i++){

        for(int j = 0; j < n; j++){

            cout<<tab[i][j]<<" ";

        }
        cout<<endl;
    }

 return 1337;

}
2
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <time.h>

using namespace std;

const int n = 5;
int succesful;

int main() {

   int tab[n][n], line;

   srand(time(NULL));

   cout << "PRZED SORTOWANIEM" << endl;

   for (int i = 0; i < n; i++) {

      for (int j = 0; j < n; j++) {

         tab[i][j] = (rand() % 9) + 1;
         cout << tab[i][j] << " ";

      }
      cout << endl;
   }

   cout << endl;

   cout << "PO SORTOWANIU OD NAJMNIEJSZEJ DO NAJWIEKSZEJ" << endl;


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

   for (int i = 0; i < n; i++) {

      for (int j = 0; j < n; j++) {

         cout << tab[i][j] << " ";

      }
      cout << endl;
   }

   return 0;

}

Tak na koniec dodam.
https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/
https://dsp.krzaq.cc/post/448/n-wymiarowy-widok-na-macierz-w-cxx/

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