PHP týden Předvánoční slevová akce
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde

Diskuze: Prekerka se zamenou sloupcu u matice

Aktivity (2)
Avatar
Radek Letáček:4. července 20:12

Ahoj, mám takový problém se záměnou sloupců v matici. Jedná o školní příklad. Zkouším to vyřešit, ale nějak jsem se zasekl. Má se vyměnit pouze sloupec s maximálním součtem. Součet jsem nějak udělal a uložil si ho do pole(už tady nevím jestli to řeším správně, ale nevím jak jinak bych součty měl spjaté s indexem - tedy s číslem sloupce) . A měnit by mi to mělo za stejný sloupec z druhé matice. Nechci to od Vás celé vyřešit, baví mě to, ale nějak kousek pošoupnout či poradit :)

Btw: tohle není můj účet, ale kamaráda :)

Zkusil jsem:

public void zamenSloupce(Matice m) {

        int maxSoucet = Integer.MIN_VALUE;
        int[] poleSouctu = new int[pocetSloupcu];
        for (int i = 0; i < pocetSloupcu; i++) {
            int soucet = 0;
            for (int j = 0; j < pocetRadku; j++) {

                soucet += prvkyMatice[j][i];
            }
            poleSouctu[i] = soucet;
            if (poleSouctu[i] > maxSoucet) {
                maxSoucet = poleSouctu[i];
            }

            System.out.println(poleSouctu[i]);

        }
        System.out.println("\n" + maxSoucet);
Editováno 4. července 20:13
 
Odpovědět
4. července 20:12
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Radek Letáček
DarkCoder:4. července 20:58

Znáš-li rozměr matice, znáš počet sloupců matice. Znáš-li počet sloupců matice, znáš kolik iterací cyklu bude třeba pro zjištění sloupce s největším součtem. Chceš-li počítat iterace, musíš založit celočíselnou proměnnou pro iterace. Chceš-li najít sloupec s největším součtem, musíš projít všechny sloupce. Chceš-li porovnávat součty různých sloupců, musíš uchovávat součet dosud prošlého největšího sloupce. Chceš-li uchovávat největší součet, musíš založit proměnnou pro maximální součet. Chceš-li uchovávat index sloupce s největším součtem, musíš založit proměnnou pro index sloupce s největším součtem. Chceš-li zjistit, jaký index má sloupec s největším součtem, musíš aktualizovat proměnnou index. Když je součet aktuálně procházeného sloupce větší než dosud největší hodnota součtu, aktualizuješ index. Průchodem všemi sloupci zjistíš, který sloupec má největší součet a jaký má index. Znáš-li index sloupce s největším součtem, znáš který sloupec máš prohazovat.

Nahoru Odpovědět
4. července 20:58
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Odpovídá na DarkCoder
Radek Letáček:4. července 21:16

Díky, nad tvou odpovědí se zamyslím zítra :) Nicméně zatím jsem domyslel toto:

ublic void zamenSloupce(Matice m) {

        int maxSoucet = Integer.MIN_VALUE;
        int[] poleSouctu = new int[pocetSloupcu];
        for (int i = 0; i < pocetSloupcu; i++) {
            int soucet = 0;
            for (int j = 0; j < pocetRadku; j++) {

                soucet += prvkyMatice[j][i];
            }
            poleSouctu[i] = soucet;
            if (poleSouctu[i] > maxSoucet) {
                maxSoucet = poleSouctu[i];

                for (int k = 0; k <pocetRadku ; k++) {
                    int pom;
                    pom = prvkyMatice[k][i];
                    prvkyMatice[k][i] = m.prvkyMatice[k][i];
                    m.prvkyMatice[k][i]=pom;
                }

            }

            System.out.println(poleSouctu[i]);

        }
        System.out.println("\n" + maxSoucet);

bohužel zase nastal problém s tím, že mi to pokaždé prohodí 1. sloupec. Jelikož podmínka je platná :/

 
Nahoru Odpovědět
4. července 21:16
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Radek Letáček
DarkCoder:4. července 22:58

Řešení je snadné. Nejsem Javista a tak to napíši v C.
Princip činnosti kódu by ale měl být jasný...

// Ověření validity matice (kladné rozměry)

// Kalkulace prvního sloupce
index = 0;
summax = 0;
for (i = 0; i < m; i++) summax += mat[i][0];

// Kompletní kalkulace
for (j = 1; j < n; j++) {
        sum = 0;
        for (i = 0; i < m; i++) sum += mat[i][j];
        if (sum > summax) {
                summax = sum;
                index = j;
        }
}

// proměnná index nyní obsahuje index sloupce s největším součtem

// Prohození sloupců
Nahoru Odpovědět
4. července 22:58
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Radek Letáček:5. července 18:09

Díky moc :) Nakonec z toho vyšlo tohle :) Jelikož ty původní matice mají zůstat nezměněny :)

public Matice[] zamenSloupce(Matice m) {

        Matice[] maticeZamenene = new Matice[2];
        Matice matC = new Matice(pocetRadku, pocetSloupcu);
        Matice matD = new Matice(m.pocetRadku, m.pocetSloupcu);

        //duplikace první první matice
        for (int i = 0; i < matC.pocetRadku; i++) {
            for (int j = 0; j < matC.pocetSloupcu; j++) {
                matC.prvkyMatice[i][j] = prvkyMatice[i][j];
            }
        }
        //duplikace druhé matice
        for (int i = 0; i < matD.pocetRadku; i++) {
            for (int j = 0; j < matD.pocetSloupcu; j++) {
                matD.prvkyMatice[i][j] = m.prvkyMatice[i][j];
            }
        }

        int index = 0;
        int maxSoucet = 0;
        for (int i = 0; i < pocetRadku; i++) {
            maxSoucet += prvkyMatice[i][0];

        }

        for (int i = 1; i < pocetSloupcu; i++) {
            int soucet = 0;
            for (int j = 0; j < pocetRadku; j++) {

                soucet += prvkyMatice[j][i];
            }
// uložení indexu sloupce s max součtem a uložení maxsoučtu do proměnných
            if (soucet > maxSoucet) {
                maxSoucet = soucet;
                index = i;

            }

        }
//záměna prvků slupce matice s maxsoučtem
        for (int i = 0; i < pocetRadku; i++) {

            int pom;
            pom = matC.prvkyMatice[i][index];
            matC.prvkyMatice[i][index] = matD.prvkyMatice[i][index];
            matD.prvkyMatice[i][index] = pom;

        }
        //uložení nových matic do pole
        maticeZamenene[0] = matC;
        maticeZamenene[1] = matD;
        return maticeZamenene;

    }
 
Nahoru Odpovědět
5. července 18:09
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.