Avatar
Andy Scheuchzer:28. května 16:23
class Objekt {
        public byte Srovnej (Objekt objekt) {
                //Když se "rovnají", vrátí 1 nebo -1 podle dalších podmínek, jinak 0
        }
}
class Program {
        static void Main (string[] args) {
                //Vytvořím si List objektu
                for (int i = 0; i < List.Count; i++) {
                        for (int j = i; j < List.Count; j++) {
                                switch (list[i].Srovnej(list[j])) {
                                        case 1: list.RemoveAt(j); break;
                                        case 2:
                                                list.RemoveAt(i);
//Tady nastava problem, nevim jak zrusit cyklus j nebo proste abych nepreskocil jeden od i a neco od j
                                                break;
                                }
                        }
                }
        }
}

Nevíte někdo co s tím?

Odpovědět 28. května 16:23
Od ASM úroveň jazyků pouze klesá…
Avatar
Andy Scheuchzer:28. května 16:28

Ještě jsem zapomněl dodat, že vyhazuju podobné, ale to asi chápete.

Nahoru Odpovědět 28. května 16:28
Od ASM úroveň jazyků pouze klesá…
Avatar
Andy Scheuchzer:28. května 17:19

Jo, a má to být sbyte, a ne byte :-).

Nahoru Odpovědět 28. května 17:19
Od ASM úroveň jazyků pouze klesá…
Avatar
Odpovídá na Andy Scheuchzer
Petr Štechmüller:28. května 17:32

Ahoj, stačí se správně zeptat strejdy googla a první odkaz je obvykle ten správný...

Nahoru Odpovědět 28. května 17:32
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Martin Petrovaj
Překladatel
Avatar
Martin Petrovaj:28. května 17:45

Pre lenivých: odkaz smeruje na goto, čo je prasácka a strašne stará vec, ktorá by sa dnes v kóde vo väčšine jazykov objavovať nemala, ale ako pozerám na tie vnorené cykly, veľa možností asi nemáš. Používa sa to nejako takto:

for (…)
        for (…)
                …
                goto Label

Label:
        // sme vonku z cyklov!

Dokumentácia

Nie som si 100% istý čo chceš vlastne robiť, ale znie to, ako keby si chcel dať ten Label dovnútra prvého foru.
Čistejšou alternatívou by mohlo byť spraviť si nejakú rozumnú pomocnú funkciu, z ktorej by si vyskočil proste returnom.

Editováno 28. května 17:46
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  -2 28. května 17:45
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Andy Scheuchzer:28. května 17:59

Díky vám oběma, nicméně jsem předtím pročítal alespoň to od MS (už nevím, co všechno), a byl jsem z toho jedině zmatený. Když jsem to zkoušel hodit do kódu, psalo mi to chybu. Hlavně: to Label je jediná možnost, nebo je možný i jiný název či co to vlastně je?

Editováno 28. května 18:01
Nahoru Odpovědět 28. května 17:59
Od ASM úroveň jazyků pouze klesá…
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Andy Scheuchzer
Martin Petrovaj:28. května 18:06

Môžeš to nazvať ako len chceš, je to proste meno nejakej značky, ku ktorej sa pomocou goto vieš dostať. Predstav si to ako názvy kapitol v knihe. Procesor je čitateľ a niekde v knihe vidí odkaz "viď kapitola 3.4 Vnorené cykly." Nájsť následne kapitolu s daným názvom je preňho jednoduché, tak si ju nalistuje a pokračuje v čítaní tam. To slovo "viď" je goto a názov kapitoly je tvoj Label.

Mimochodom, nedalo by sa to vyriešiť jednoduchšie pomocou LINQ?

List<Object> listA = new List<object>();
List<Object> listB = new List<object>();

listA.RemoveAll(objA => listB.Exists( objB => objA.Srovnej(objB) ));

Pravda, trochu upravené pre tvoju metódu Srovnej.

Editováno 28. května 18:07
Nahoru Odpovědět 28. května 18:06
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Andy Scheuchzer
Petr Štechmüller:28. května 18:11

Minimálně v Javě je tato featura známá jako "návěští".

Nahoru Odpovědět 28. května 18:11
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Martin Petrovaj
Andy Scheuchzer:28. května 18:15

Díky.

Ne, možností je trochu víc, mám tam nějaký string z čísel a srovnávám jestli:

  • je hodnota objektu, která mě zajímá, podobná a součet je větší (odstraním j)
  • to samé, ale součet je menší (odstraním i)
  • je ta hodnota výrazně jiná

a pokud vím, ty používáš bool, který má pouze dvě možné hodnoty.

A ještě jedna otázka: provede se goto i v případě, že na něj neodkážu? (Teda ten kód v odkaze.)

Editováno 28. května 18:16
Nahoru Odpovědět 28. května 18:15
Od ASM úroveň jazyků pouze klesá…
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Andy Scheuchzer
Martin Petrovaj:28. května 18:17
if (false) { goto znacka; }

znacka:
Console.WriteLine("Áno, toto sa vypíše aj tak. Tá značka proste len označuje nejaké miesto v programe, ale sama o sebe flow programu nijako neovplyvňuje.");

Myslel si to takto?

Editováno 28. května 18:18
Nahoru Odpovědět 28. května 18:17
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Andy Scheuchzer:28. května 18:20

Asi jo. Tak ještě jednou díky, v tomto vlákně snad už naposled.

Nahoru Odpovědět 28. května 18:20
Od ASM úroveň jazyků pouze klesá…
Avatar
Odpovídá na Andy Scheuchzer
Erik Šťastný:28. května 19:08

Tyhle situace vždy řeším, tak že cykly rozepíšu do metod zvlášť a použiju v nich return :)

 
Nahoru Odpovědět 28. května 19:08
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Andy Scheuchzer
Martin Dráb:28. května 20:03
for ( . . .) {
  . . .
  for ( . . .) {
    bool stop = false;

    if (stop)
      break;
  }
}

Proměnnou stop můžeš pojmenovat klidně nějak lépe. Já třeba v případě, že ve vnitřním cyklu něco hledám, ji dávám jméno found. Když je true, znamená to, že bylo nalezeno, takže není třeba ve vnitřním cyklu pokračovat.

Pokud potřebuješ vyskočit i z vnějšího cyklu, můžeš tu proměnnou deklarovat tak, aby i z tohoto cyklu byla vidět, takže jen přidáš

if (stop)
  break;

Takhle se vyhneš použití goto, a tak zbytečně neumřou koťátka. Jistě, je to více práce a řádků, ale nestojí život koťátek za tu námahu? :-)

Nahoru Odpovědět  +6 28. května 20:03
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Andy Scheuchzer:28. května 20:13

Řádek tak jeden oproti tomu co mám teď, asi by to mohlo jít i takhle.

Nahoru Odpovědět 28. května 20:13
Od ASM úroveň jazyků pouze klesá…
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Andy Scheuchzer
ostrozan:28. května 21:22

taky můžeš nastavit hodnotu

j = list.Count;

čímž padne podmínka j<list.Count a cyklus se sám přeruší a nemusíš dodávat žádné nové proměnné a koťátka opět přežijí :)

Jinak radši dávej na posouzení nějaký skutečný kód - v té slátanině v úvodu je tolik nesmyslů, že by se ti to červenalo chybama jak jahodové plantáže v tomto čase :)

Když už chceš něco "cucat z prstu" tak by to mělo mít hlavu a patu.

Mimochodem celé mi to připadá jaksi postavené na hlavu - termíny "podobné a menší" , nebo

Když se "rovnají", vrátí 1 nebo -1 podle dalších podmínek,

tak buď se rovnají - bez podmínek , nebo ne

nebo chceš porovnávat všechny prvky v kolekci, ale někdy ne - někdy to chceš zrušit právě tím přerušením for cyklu

No ale budiž ti omluvou tvůj věk - pokud ten uvedený na profilu odpovídá skutečnosti

 
Nahoru Odpovědět  +3 28. května 21:22
Avatar
Odpovídá na ostrozan
Andy Scheuchzer:29. května 15:34

Zajímavý nápad, tohle mě (záhadně) jaksi nenapadlo.

Původní kód je moc dlouhý, to by určitě číst nikdo nechtěl (i proto, že to je dost podobné), ale jestli chceš, podívej se dolů.

Zapomněl jsem na slova "jsou podobné", ale ty uvozovky tam byly právě proto.

Aspoň něco kladného :-) (krom těch koťátek). Ano, je jen s odchylkou několika dní :-).

Tohle ještě pořád nefunguje jak má, kdyby někdo pochopil, co chci, a našel chybu, budu rád. Věřím, že by se toho dalo i dost zjednodušit.

namespace ctverce {
        class Ctverec {
                public string Kod { get; private set; }
                public byte Soucet { get; private set; }
                readonly public byte[][,] barvy;
                private byte[,] Vybarvi(string kod) {
                        byte[,] radek = new byte[4, 4];
                        for (int i = 0; i < radek.GetLength(0); i++) {
                                for (int j = 0; j < radek.GetLength(1); j++) {
                                        radek[i, j] = 0;
                                }
                        }
                        byte[] c = new byte[8];
                        for (int i = 0; i < c.Length; i++) {
                                c[i] = byte.Parse(kod.Substring(i, 1));
                        }
                        for (int i = 0; i < radek.GetLength(1); i++) {
                                for (int j = 0; j < radek.GetLength(0); j++) {
                                        if (c[j] + c[i + 4] <= 2)
                                                radek[i, j] = Convert.ToByte(c[j] + c[i + 4]);
                                }
                        }
                        return radek;
                }
                public Ctverec(string kod) {
                        string[] kody = new string[8];
                        Kod = kody[0] = kod;
                        kody[5] = Kod.Substring(4, 4) + Kod.Substring(0, 4);
                        kody[6] = Kod.Substring(4, 4);
                        for (int i = 0; i < 8; i++) {
                                kody[1] += Kod.Substring(7 - i, 1);
                                if (i < 4) {
                                        kody[2] += Kod.Substring(i, 1);
                                        kody[3] += Kod.Substring(3 - i, 1);
                                        kody[4] += Kod.Substring(3 - i, 1);
                                        kody[6] += Kod.Substring(3 - i, 1);
                                        kody[7] += Kod.Substring(7 - i, 1);
                                } else {
                                        kody[2] += Kod.Substring(7 - i, 1);
                                        kody[3] += Kod.Substring(i, 1);
                                        kody[4] += Kod.Substring(11 - i, 1);
                                }
                        }
                        kody[7] += Kod.Substring(0, 4);
                        barvy = new byte[8][,];
                        for (int i = 0; i < barvy.Length; i++) {
                                barvy[i] = Vybarvi(kody[i]);
                        }
                        Soucet = byte.Parse(Kod.Substring(0, 1));
                        for (int i = 1; i < Kod.Length; i++) {
                                Soucet += byte.Parse(kod.Substring(i, 1));
                        }
                }
                //ToString() nikdo nepotřebuje. Vrací kód a barvy.
                public sbyte Srovnej(Ctverec ctverec) {
                        for (int i = 0; i < ctverec.barvy.Length; i++) {
                                if (barvy[0].Equals(ctverec.barvy[i])) {
                                        if (ctverec.Soucet > Soucet) return 1;
                                        else return -1;
                                }
                        }
                        return 0;
                }
        }
        class Program {
                static void Main(string[] args) {
                        Console.Title = "Ctverce";
                        Console.SetWindowSize(40, 25);
                        Console.SetBufferSize(40, Int16.MaxValue / 2);
                        List<Ctverec> ctverce = new List<Ctverec>();
                        byte a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0;
                        for (int i = 0; i < Math.Pow(4, 8); i++) {
                                ctverce.Add(new Ctverec(a.ToString() + b.ToString() + c.ToString() + d.ToString() + e.ToString() + f.ToString() + g.ToString() + h.ToString()));
                                h++;
                                if (h == 4) {
                                        h = 0;
                                        g++;
                                        if (g == 4) {
                                                g = 0;
                                                f++;
                                                if (f == 4) {
                                                        f = 0;
                                                        e++;
                                                        if (e == 4) {
                                                                e = 0;
                                                                d++;
                                                                if (d == 4) {
                                                                        d = 0;
                                                                        c++;
                                                                        if (c == 4) {
                                                                                c = 0;
                                                                                b++;
                                                                                if (b == 4) {
                                                                                        b = 0;
                                                                                        a++;
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                        Console.WriteLine("Hotovo!!!\n");
                        bool label = false;
                        for (int i = 0; i < ctverce.Count; i++) {
                                label = false;
                                for (int j = i + 1; j < ctverce.Count; j++) {
                                        switch (ctverce[i].Srovnej(ctverce[j])) {
                                                case 1:
                                                        ctverce.RemoveAt(j);
                                                        break;
                                                case -1:
                                                        ctverce.RemoveAt(i);
                                                        i--;
                                                        label = true;
                                                        goto Label;
                                        }
                                }
                                Console.WriteLine("{0} – {1}", i + 1, ctverce.Count);
                                Label: if(label) Console.WriteLine("{0} – {1}", i + 2, ctverce.Count);
                        }
                        Console.WriteLine();
                        for (int i = 0; i < ctverce.Count; i++) {
                                Console.WriteLine(ctverce[i].Kod);
                        }
                        Console.ReadKey();
                }
        }
}

…prostě začátečník.

Nahoru Odpovědět 29. května 15:34
Od ASM úroveň jazyků pouze klesá…
Avatar
Odpovídá na Andy Scheuchzer
Krystof Matejka:30. května 8:47

Omlouvám se, ale jsem VELKÝ začátečník, co znamená to

readonly public byte[][,] barvy;

Konkrétně to byte[][,]

 
Nahoru Odpovědět 30. května 8:47
Avatar
Odpovídá na Krystof Matejka
Andy Scheuchzer:30. května 14:59

To je pole dvourozměrných polí, v seriálu ( https://www.itnetwork.cz/…ozmerna-pole ) to máš popsané. Mohlo by to být i byte[][][] nebo byte[,,], ale takhle je to pro mě srozumitelnější.

Nahoru Odpovědět  +1 30. května 14:59
Od ASM úroveň jazyků pouze klesá…
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Andy Scheuchzer
ostrozan:30. května 17:22

To fakt nevím co to má vlastně dělat ,ale nejde mi do hlavy proč si s tvary a barvami hraješ v konzoli a ne třeba ve WPF?

ale jedno mně zaujalo

for (int i = 0; i < Math.Pow(4, 8); i++)

v čem je to lepší než i < 65536 ????????? :)

 
Nahoru Odpovědět 30. května 17:22
Avatar
Odpovídá na ostrozan
Erik Šťastný:30. května 18:00

Nebo :)

for (int i = 0; i <= ushort.MaxValue; i++)
 
Nahoru Odpovědět 30. května 18:00
Avatar
Odpovídá na ostrozan
Andy Scheuchzer:30. května 21:06

Takhle jsem si prostě jistější, však víš, jak jsem na to přišel. Kód má osm míst, kde může být vždy číslo od 0 do 3. Ale krom té jistoty to asi je horší – musím volat další metodu atd.

Nahoru Odpovědět 30. května 21:06
Od ASM úroveň jazyků pouze klesá…
Avatar
Andy Scheuchzer:30. května 21:10

A s barvama si hraju tady, protože potřebuju hlavně ty kódy. Dostal jsem jednoduchou MS excel aplikaci, kde jsem měl hledat kód k obrázku, a když jsem si to zkoušel vytvořit, nechtělo se mi ty kódy vymýšlet. :-)

Nahoru Odpovědět 30. května 21:10
Od ASM úroveň jazyků pouze klesá…
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 22 zpráv z 22.