IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Dvourozměrné pole

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Malý Daněk
Člen
Avatar
Malý Daněk:31.10.2018 23:37

Ahoj prosím potřeboval bych pomoc vyhledat tři největší hodnoty ve dvourozměrné poli.
Mám pole[4][4] které jsem naplnil náhodnými čísly.
Najdu pouze největší hodnotu.
for (int i = 0; i < 4; i++)
{
for (int k = 0; k < 4; k++)
{
if (pole[i][k] > max)
max = pole[i][k];
}
}
cout << max << endl;

Chtěl bych najít tři nejvyšší hodnoty.Napadlo mě ještě použít funkci sort() že seřadí prvky v poli. Bohužel fci sort() neumím použít u dvourozměrného pole.Děkuji za pomoc.

Zkusil jsem: Google

Chci docílit: Chtěl bych najít tři nejvyšší hodnoty ve dvourozměrné poli .A chtěl bych vědět jak se použije fce sort() ve dvourozměrné poli.Děkuji

 
Odpovědět
31.10.2018 23:37
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Malý Daněk
DarkCoder:1.11.2018 0:38

Možností je spousta. Např. vytvoř druhé pole o stejném rozměru jako pole první a inicializuj jeho prvky na nulu. Při procházení prvního pole testuješ zároveň souřadnici druhého pole na to, zda hodnota vzatého prvku na téže souřadnici je nulová. Pokud ano, může být tento prvek vyhodnocen jako maximální. Kompletním průchodem pole získaš souřadnici prvku který je největší. Poté změníš hodnotu druhého pole na této souřadnici na jedna, čímž zabrániš opakovanému vzetí prvků jako největší. Dalšími průchody získáš opět největší prvek z těch prvků, které ještě nebyly vzaty. Třemi průchody pole získáš tři největší prvky aniž bys musel něco transformovat.

Nahoru Odpovědět
1.11.2018 0:38
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.11.2018 10:55

Najdes jednu a ulozis si ji do promenne.
Tak ji uloz do pole a porovnavej s tim polem, ne? Pseudokod

//max = array();
// samozrejme idealne, kdybys to delal cyklem
if (n > max[0]) {max[2] = max[1]; max[1] = max[0]; max[0] = n; continue;}
if (n > max[1]) {max[2] = max[1]; max[1] = n; continue;}
if (n > max[2]) {max[2] = n; continue;}
 
Nahoru Odpovědět
1.11.2018 10:55
Avatar
Malý Daněk
Člen
Avatar
Odpovídá na Malý Daněk
Malý Daněk:1.11.2018 15:52

Včera v noci jsem ještě přišel na jeden způsob.

int max = matice[0][0];
int min = matice[0][0];
int sum = 0;

for (int i = 0; i < 4; i++)
{
for (int k = 0; k < 4; k++)
{
if (matice[i][k] > max)
max = matice[i][k];
if (matice[i][k] < min)
min = matice[i][k];
}

}
cout << max << endl;

int max1 = matice[0][0];

for (int i = 0; i < 4; i++)
{
for (int k = 0; k < 4; k++)
{
if ((matice[i][k] > max1)and(mati­ce[i][k] < max))
{

max1 = matice[i][k];
}
if (matice[i][k] < min)
min = matice[i][k];
}

}
cout << max1 << endl;

Děkuji za nápovědy

 
Nahoru Odpovědět
1.11.2018 15:52
Avatar
Jirka
Člen
Avatar
Odpovídá na Malý Daněk
Jirka:1.11.2018 18:57

Ahoj.

To samé za pomoci Javy:

package itn.forum;

import java.util.concurrent.ThreadLocalRandom;

public class Top3 {
static int[] top = new int[3];
static int[][] array = new int[4][4];

static int getRandInt() {
        return ThreadLocalRandom.current().nextInt(0, 16);
}

static void ini() {
        //naplnit top nejnizsimi hodnotami
        for(int i = 0; i < top.length; i ++) {
                top[i] = Integer.MIN_VALUE;
        }
        //naplnime pole nahodnymi hodnotami
        for(int i = 0; i < array.length; i ++) {
                for(int j = 0; j < array[i].length; j ++) {
                        array[i][j] = getRandInt();
                }
        }
}

static void shift() {
        for(int t = 0; t < top.length - 1; t ++) {
                top[t] = top[t + 1];
        }
}

static void findMax() {
        //ziskat nejvyssi hodnotu
        for(int t = 0; t < top.length; t ++) {
                for(int i = 0; i < array.length; i ++) {
                        for(int j = 0; j < array[i].length; j ++) {
                                if(array[i][j] > top[top.length - 1]) {
                                        shift();
                                        top[top.length - 1] = array[i][j];
                                }
                        }
                }
        }
}

public static void printArray() {
        String s = "";
        //Radky
        for(int i = 0; i < array.length; i ++) {
                if(i > 0) { s += "\n"; }
                //Sloupce
                for(int j = 0; j < array[i].length; j ++) {
                        if(j == 0) { s += "{" + array[i][j] + "}"; }
                        else { s += ", {" + array[i][j] + "}"; }
                }
        }
        System.out.println("{" + s + "}\n");
}

public static void printTop() {
        String s = "";
        for(int i = 0; i < top.length; i ++) {
                if(i == 0) { s += "{" + top[i] + "}"; }
                else { s += ", {" + top[i] + "}"; }
        }
        System.out.println("{" + s + "}\n");
}

public static void printAll() {
        printTop();
        printArray();
}

public static void main(String[] args) {
        ini();
        printAll();
        findMax();
        printAll();
}
}
Nahoru Odpovědět
1.11.2018 18:57
Kdo nic nedělá, nic nezkazí.
Avatar
Jirka
Člen
Avatar
Jirka:1.11.2018 19:09

oprava:

static void shift() {
        for(int t = 0; t + 1 < top.length; t ++) {
                top[t] = top[t + 1];
        }
}
Nahoru Odpovědět
1.11.2018 19:09
Kdo nic nedělá, nic nezkazí.
Avatar
Odpovídá na Jirka
Matúš Olejník:1.11.2018 20:48

Trocha mimo témy keďže je to vo vlákne pre C/C++, ale od Javy 8 môžeš robiť aj takéto niečo :D

int rows = 4, columns = 5;
Random r = new Random();
Integer[][] array = new Integer[rows][columns];

for(int i = 0; i < rows * columns; i++){
    array[i % rows][i % columns] =  r.nextInt(100);
}
System.out.println(Arrays.deepToString(array));

Arrays.stream(array)
    .flatMap(Arrays::stream)
    .distinct()
    .sorted(Comparator.reverseOrder())
    .limit(3)
    .forEach(System.out::println);
Nahoru Odpovědět
1.11.2018 20:48
/* I am not sure why this works but it fixes the problem */
Avatar
Jirka
Člen
Avatar
Jirka:12.11.2018 18:58

Ještě trošku obecněji za použití Javy:

package itn.forum;

import java.util.concurrent.ThreadLocalRandom;

class Top {
private int[] arr; //maximum top je na arr[0], minimum na arr[arr.length - 1]
private void shiftRight(final int ix) {
        for(int i = arr.length - 2; i >= ix; i --) { //posouvame odzadu
                arr[i + 1] = arr[i];
        }
}
public void update(final int value) { //pokud value patri do top-zatridit
        for(int i = 0; i < arr.length; i ++) {
                if(value >= arr[i]) { //pokud je value vetsi nez prvek pole, aktualizovat
                        if(value > arr[i]) {
                                shiftRight(i); //vytvorit misto pro nove objevene maximum
                                arr[i] = value; //maximum updatovat
                        }
                        return;
                }
        }
}
public void ini() { for(int i = 0; i < arr.length; i ++) { arr[i] = 0; } }
public Top(int[] array) { arr = array; ini(); }
@Override
public String toString() {
        String s = "";
        for(int i = 0; i < arr.length; i ++) {
                s += (i != 0?", ":"") + "{" + arr[i] + "}";
        }
        return "{" + s + "}\n";
}
}

class Matrix {
private int[][] arr;
private int getRandInt() { return ThreadLocalRandom.current().nextInt(0, 16); }
public void ini() {
        //matici naplnime nahodnymi hodnotami z rozsahu 0 az 16
        for(int i = 0; i < arr.length; i ++) {
                for(int j = 0; j < arr[i].length; j ++) {
                        arr[i][j] = getRandInt();
                }
        }
}
public void findMaxTop(Top top) {
        //zpracovat matici
        for(int i = 0; i < arr.length; i ++) {
                for(int j = 0; j < arr[i].length; j ++) {
                        top.update(arr[i][j]);
                }
        }
}
public Matrix(int[][] array) { arr = array; ini(); }
@Override
public String toString() {
        String s = "";
        for(int i = 0; i < arr.length; i ++) {
                if(i > 0) { s += "\n"; }
                for(int j = 0; j < arr[i].length; j ++) {
                        s += (j != 0?", ":"") + "{" + arr[i][j] + "}";
                }
        }
        return "{" + s + "}\n";
}
}

public class Top3 {
public static void main(String[] args) {
        Top top = new Top(new int[3]); //obsahuje nejvyssi dosud nalezene hodnoty
        Matrix matrix = new Matrix(new int[4][4]); //obsahuje testovane hodnoty
        System.out.println(matrix);
        System.out.println(top);
        matrix.findMaxTop(top);
        System.out.println(top);
}
}
Nahoru Odpovědět
12.11.2018 18:58
Kdo nic nedělá, nic nezkazí.
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 8 zpráv z 8.