Mátrix sorok rendezése c++
2021-03-25T09:56:53+01:00
2021-03-25T22:39:20+01:00
2022-08-12T01:41:50+02:00
csender91
Sziasztok,

Elakadtam az egyik feladatommal. Adatokat kell bekérnem pl:

József, 32 , férfi
Anna, 21, nő

Ezeket le is tárolom egy mátrixba ez működik eddig, majd ezt az első oszlop (jelen esetben nevek szerint rendezni). Találtam már itt régebbi bejegyzésben megoldást, a dolog szépséghibája hogy nem használhatok a programba "break"-et és nemtudom hogyan tudnám kiváltani működőképesen. A másik problémám hogy ha adatfeltöltésnél kor van megadva azt is jól kell rendeznie illetve ha egy szöveg pl. név akkor is(erre jelenleg semmi ötletem nincs hogy lehetne megvalósítani. 

Ha valaki tud segíteni előre is köszönöm!

amit találtam megoldást(5x5-ös mátrixra):

for (int i = 0; i < 4; i++)
            { 
                for (int j = i + 1; j < 5; j++)
                {
                    for (int m = 0; m < 5; m++) // végigmegyünk a két sor elemein
                    {                     
                        if (szorzotabla[i,m] < szorzotabla[j,m]) break;  
                        if (szorzotabla[i,m] > szorzotabla[j,m])
                        { 
                            for (int k = 0; k < 5; k++)
                            {              
                                int x = szorzotabla[i,k];
                                szorzotabla[i,k] = szorzotabla[j,k];
                                szorzotabla[j,k] = x;
                            }
                            break;
                        }
                    }
                }
            }
Mutasd a teljes hozzászólást!

  • A rendezés megoldható így:

    using Row = std::array<std::string, 3>; using Rows = std::vector<Row>; bool CompareRows(const Row &s1, const Row &s2) { return s1[0] < s2[0]; } Rows rows = {{"Alma", "22", "nő"}, {"Zoli", "32", "férfi"}, {"Béla", "22", "férfi"}}; std::sort(rows.begin(), rows.end(), &CompareRows);
    Ez a szöveg karaktereinek kódja szerint fog rendezni, pl. 'a' > 'Z' (és a karakterkódolástól is függ). Ha számokat is jól kell rendezni az első oszlopban, ez nem fog működni, mert pl. '4' > '23'. Mikor kell számként értelmezni az első oszlopot? Pl. ha van köztük szöveg és szám is, mit szeretnél csinálni?
    Amúgy miért ne használhatnál break-et?
    Mutasd a teljes hozzászólást!
  • Amúgy miért ne használhatnál break-et?

    Mert ez egy házi feladat, amit most éppen megoldasz... egy házi feladatban nem kell firtatni mit, miért, csak megcsinálni és kész. :)
    Mutasd a teljes hozzászólást!
  • C++20-ban valami ilyesmi :)

    ranges::sort( persons, {}, &Person::Name );
    Mutasd a teljes hozzászólást!
  • Szia,
    Sajnos a feladatleírás kitér rá hogy beépített függvényeket és break-et ne használjunk mert nem fogadják el.
    Mutasd a teljes hozzászólást!
  • Szia,
    Azt kihagytam hogy beépített függvényeket se használhatunk, ezért küldtem be azt a megoldást mert az felépítésében megfelelne az elvártaknak a 'break' kivételével
    Mutasd a teljes hozzászólást!
  • Ez esetben mi a probléma az általad bemásolt kóddal? A kód az összes oszlop szerint lexikografikusan rendez. Ha csak egy oszlop szerint akarsz rendezni, nem kell végigmenni az összes oszlopon, ezért az a ciklus és a break sem fog kelleni.
    Mondjuk a tömb indexelése egyértelműen rossz, szorzotabla[i,m] helyett szorzotabla[i ][m] kell. (Egyébként szorzotabla[i,m] = szorzotabla[m] a comma operator miatt.)
    Mutasd a teljes hozzászólást!
  • Melyik ciklus és break törlésére gondolsz? ha a legbelső for ciklusra akkor az nem működik, ugyan az első oszlop szerint rendez, azonban a többi értéket már "nem viszi" vele, szóval az elején megadott példával élve az Annát előre teszi de a József "értékeit" kapja meg. Ha mindkét breakes ciklust kitörlöm akkor pedig konkrétan nem történik semmi.

    első leírásom:
                for (int i = 0; i < 4; i++)
                { 
                    for (int j = i + 1; j < 5; j++)
                    {
                        for (int m = 0; m < 5; m++) 
                        {                     
                            if (szorzotabla[i,m] < szorzotabla[j,m]) break;  
                            if (szorzotabla[i,m] > szorzotabla[j,m])
                            { 
                                    int x = szorzotabla[i,m];
                                    szorzotabla[i,m] = szorzotabla[j,m];
                                    szorzotabla[j,m] = x;

                            }
                        }
                    }
                }


    itt az első oszlopot szerint jól rendez de a sor többi elemét "nem viszi" magával

    második:

    for (int i = 0; i < 4; i++)
                { 
                    for (int j = i + 1; j < 5; j++)
                    {
                        
                            if (szorzotabla[i,j] > szorzotabla[j,i])
                            { 
                                            
                                    int x = szorzotabla[i,j];
                                    szorzotabla[i,j] = szorzotabla[j,i];
                                    szorzotabla[j,i] = x;
                                
                            }
                        
                    }
                }

    ennél nem történik semmi
    Mutasd a teljes hozzászólást!
  • Értelemszerűen nem egy az egyben ki kell törölni a ciklusokat. A programozás sajnos már csak ilyen, gondolkodni kell. (Nem egészen értem, mire számítottál, amikor mindkét ciklust kitörölted, hát semmilyen utasítás nem maradt a programodban, ami megváltoztná a mátrixot.)
    Arra a ciklusra gondolok, ami egyenként végigmegy az oszlopokon és összehasonlítja őket az éppen vizsgált két sor esetén. Ha csak az első oszlopot kell összehasonlítani, akkor nincs szükség ciklusra, hiszen egyetlen összehasonlítás lesz.
    Mutasd a teljes hozzászólást!
  • Szia!

    A helycserénél az általad leírt program csak egy értéket cserél a tömbben.

    int x = szorzotabla[i,m]; szorzotabla[i,m] = szorzotabla[j,m]; szorzotabla[j,m] = x;

    ez csak az 'm' számú adatot cseréli. Ha minden egyes elemet cserélni akarod, akkor azt meg kell neki írni. (akár ciklussal.)
    Mutasd a teljes hozzászólást!
  • Pont én mondtam, hogy nem kell kapálózni, hogy miért nem lehet brake-et használni, hanem csak el kell fogadni, hogy nem lehet break-et használni. Szóval én tudtam, hogy nem lehet brake-t, használni, mert feltettem, ez része a házi feladatod leírásának, tehát nem fogadják el, ha break-et használsz, de azért köszi, hogy leirod nekem, hogy nem fogadják el, ha break-et használsz.
    Mutasd a teljes hozzászólást!
  • Te mit akarsz ezzel a szorzótáblával? Látszólag semmi köze a feladathoz, ezért sokat segítene abban, hogy segíthessünk, ha elmondod először, miért írtál szorzótáblát a sima rekordok rendezgetése helyett...
    Mutasd a teljes hozzászólást!
abcd