logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C++] Jak posortować macierz wczytaną z pliku w C++? Proste metody sortowania

krazin 26 Sty 2010 14:55 3210 10
REKLAMA
  • #1 7594663
    krazin
    Poziom 10  
    Posty: 59
    Ocena: 4
    Witam.
    Potrzebuję pomocy dotyczącej sortowania macierzy wczytywanej z pliku.

    Oto mój kod programu , w którym brakuje sortowania, jeśli mógłbym prosić o pomoc jak posortować taka macierz byłbym bardzo wdzięczny.Próbowałem coś wykombinować szukając w sieci, niestety nie udało mi się przerobić tego do mojej wersji. Najlepiej aby to było jakieś proste sortowanie (bąbelkowe , przez wstawianie itp)(program Visual C++)

    Pozdrawiam

    #include "stdafx.h"
    #include<fstream>
    #include<iostream>
    #include<iomanip>
    #include<conio.h>
    using namespace std;                            
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    const int n=4, m=5;        //wymiary macierzy
    double  M[n][m];  //deklaracja macierzy
    fstream file;   
    //------------------------------------------------------------------
    //odczytanie danych z pliku do macierzy
    file.open("w_4x5.txt",ios_base:: in);   
    for (int i=0;i<n;i++)
      for (int j=0; j<m; j++)
            file>>M[i][j];
    file.close();                          
    //------------------------------------------------------------------
    //modyfikacja macierzy
    for (int i=0;i<n;i++)
      for (int j=0; j<m; j++)
             M[i][j]=M[i][j]+1;
    ???????????????????????
    //------------------------------------------------------------------
    //zapisywanie do pliku
    file.open("M_4x5.txt",ios_base::out | ios_base::trunc);  
    for (int i=0;i<n;i++)
    { 
      for (int j=0; j<m; j++)
           file<<left<<setw(10)<<M[i][j]<<"   ";
      file<<endl;
    }
    file.close();  
    //------------------------------------------------------------------
    //wyswietlanie na konsoli
    for (int i=0;i<n;i++)
    { 
      for (int j=0; j<m; j++)
           cout<<left<<setw(10)<<M[i][j]<<"   ";
      cout<<endl;
    }
    //------------------------------------------------------------------
    getch();
    return 0;
    }


    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • REKLAMA
  • #2 7595323
    redie
    Poziom 16  
    Posty: 169
    Pomógł: 25
    Ocena: 1
    Można by utworzyć, wskaźnik na double i uznać to za tablice i posortować jako zwykłą tablicę:
    double *tab=(double *)M;
    SortowanieBabelkoweTablicy(tab,n*m); //<--długość tej tablicy to n*m
    
  • REKLAMA
  • #3 7600294
    krazin
    Poziom 10  
    Posty: 59
    Ocena: 4
    Zapomniałem dodać że jestem początkującym , więc nie bardzo wiem o co chodzi, próbowałem posortować z takiego przykładu i niestety jakieś bzdury wyświetlały się
    Link,
    więc jeśli ktoś mógłby podać jakiś przykład lub odnośnik do sortowania z wczytywaniem macierzy z pliku byłbym bardzo wdzięczny.

    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #4 7601092
    redie
    Poziom 16  
    Posty: 169
    Pomógł: 25
    Ocena: 1
    To ja proponuję zmodyfikować troszkę twój kod, co podałeś wcześniej.
    Najpierw dodać dwie zmienne na początku:
    
    double *t2,tmp;      //<----- dodatkowe zmienne
    


    a następnie dodać algorytm sortowania bąbelkowego przed zapisaniem do pliku:
    //Sortowanie bąbelkowe
    t2=(double *)M;
    for (int i=0; i<n*m-1; i++)
    for (int j=0; j<n*m-1-i; j++)
    if (t2[j] > t2[j+1])
    {
                  tmp=t2[j+1];
                  t2[j+1]=t2[j];
                  t2[j]=tmp;    
    }


    dzieki temu do pliku zapisze się posortowana tablica.
  • #5 7602010
    krazin
    Poziom 10  
    Posty: 59
    Ocena: 4
    Bardzo dziękuję za pomoc, program działa, lecz czy można by było odsortować elementy wierszy np od maksymalnego do minimalnego ? (każdy wiersz z osobna posortować i zapisać jako macierz)

    Dziękuje raz jeszcze za pomoc, pozdrawiam.
  • Pomocny post
    #6 7606067
    redie
    Poziom 16  
    Posty: 169
    Pomógł: 25
    Ocena: 1
    Jasne, i to nawet bez tej dodatkowej zmiennej, prosze bardzo:
    //sortowanie babelkowe wierszy w macierzy
    for (int i=0; i<n; i++)
             for (int j=0; j<m-1; j++)
             for (int k=0; k<m-1-j; k++)
             if (M[i][k] > M[i][k+1])
             {
                  tmp=M[i][k+1];
                  M[i][k+1]=M[i][k];
                  M[i][k]=tmp;    
             }
  • REKLAMA
  • #7 7606341
    krazin
    Poziom 10  
    Posty: 59
    Ocena: 4
    Dziękuję , w końcu zrozumiałem na czym to polega (przykłady są najlepsze),
    Czy mógłbym prosić jeszcze o przykład jak wyglądało by takie samo sortowanie tylko metoda wstawiania? Chciałbym też to przeanalizować i zrozumieć.

    Pozdrawiam.
  • #8 7608576
    redie
    Poziom 16  
    Posty: 169
    Pomógł: 25
    Ocena: 1
    To będzie mniej więcej w ten sposób:
    //sortowanie przez wstawianie dla wierszy w macierzy
    double value;
    int k;
    for (int i=0; i<n; i++)
             for (int j = 1; j < m; ++j) {
                   value = M[i][j];
                   for (k = j-1; k >= 0 && M[i][k] > value; --k)
                       M[i][k + 1] = M[i][k];
                   M[i][k + 1] = value;
             }

    niestety nie testowałem, a kod przerobiłem z wiki. Na pocieszenie powiem że poprzednich fragmentów też nie testowalem :D Gdyby jednak nie działał to napisz.
  • #9 7614778
    krazin
    Poziom 10  
    Posty: 59
    Ocena: 4
    Witam,
    Wydaje mi się że czegoś brakuje po tych sortowaniach, ponieważ wynik nie zapisuje się do pliku(pusty plik).
    Poza tym macierz sortuje się.

    Pozdrawiam.
  • Pomocny post
    #10 7615552
    redie
    Poziom 16  
    Posty: 169
    Pomógł: 25
    Ocena: 1
    Po odczytaniu liczb z pliku wrzuć taką linijkę:

    kiedyś się spotkałem z takim czymś, ta funkcja czyści flagi, które się poustawiały przy poprzednim korzystaniu z tej zmiennej.
  • #11 7616062
    krazin
    Poziom 10  
    Posty: 59
    Ocena: 4
    Dziękuję, wszystko działa jak należy.

    Pozdrawiam , jeszcze raz dziękuję za pomoc.

Podsumowanie tematu

✨ W dyskusji poruszono problem sortowania macierzy wczytanej z pliku w języku C++. Użytkownik prosił o pomoc w implementacji prostych metod sortowania, takich jak sortowanie bąbelkowe i przez wstawianie. Odpowiedzi zawierały przykłady kodu, które umożliwiały sortowanie całej macierzy oraz poszczególnych wierszy. Użytkownik zadał również pytanie o zapis posortowanej macierzy do pliku, na co otrzymał wskazówki dotyczące użycia funkcji `file.clear()`, aby uniknąć problemów z pustym plikiem. Na koniec użytkownik potwierdził, że program działa poprawnie.
Wygenerowane przez model językowy.
REKLAMA