Hogy tegyem egy tömbbe egy másik tömbből a csak egyszer előforduló elemeket?
C# nyelv.
A lényeg, hogy ezt egy sorban gyönyörűen meg lehetne oldani úgy, hogy int[] amibe = amibol.Distinct.ToArray();
Viszont programozási tétel használatával kellene, írtam egy függvényt, linkelem: [link] (nem enged linkrövidítőt használni, de a pastebin nem ad "rendes" linket, ha mégis, akkor nyugodtan mutasd meg válaszban, hol)
A függvényt a programozási tétel pszeudokódja alapján írtam, amiről a képet itt linkelem: [link]
Ugye pszeudoban az indexelés 1-ről, C#-ban pedig 0-ról kezdődik, azért térnek el a számok/relációs jelek, de valószínűleg ebben a részében követtem el mégis hibákat, amikre sehogy se jövök rá, és ebben kérem a segítséget. A függvény nem azt csinálja, amit szeretnék, hogy csináljon.)
Amit írtam függvényt, tudom, hogy nem pontosan a programozási tétel lemásolása, mert nem az eredeti tömb elejére szeretném tenni a különböző elemeket (a végét pedig meghagyni "memóriaszemét"nek), hanem egy új tömböt szeretnék létrehozni, amiben csak a különböző elemek vannak, és pontosan annyi eleme van, amennyi a kiszűrés után marad.
Nem tudom, tétel-e, de én készítenék egy listát.
Sorban megyek az eredeti tömbön, és ha a listában nincs olyan elem még (mylist.Contains()), akkor felveszem. Ha van benne (azaz true a contains), akkor remove-olom a listből. Aztán ha végigértünk, lehet másolni tömbbe. Nem szép megoldás, de működik.
A szép megoldás a distinct toarray...
A forrás tömb rendezett, így néz ki kb.: {1, 3, 4, 4, 5, 7, 8, 8, 8, 10, 10}
és ebből kéne {1, 3, 4, 5, 7, 8, 10}
De listát nem lehet használni, csak tömböket.
Lehet, hogy valami fontosat nem értettem meg a feladatból, de elsőre nem tűnik bonyolultnak. Először egy ciklusban megszámolod a nem ismétlődő elemeket (ezek a rendezett tömbben onnan ismerszenek meg, hogy nagyobbak az előzőnél), azután létrehozol egy ilyen méretű új tömböt, amelybe egy újabb ciklussal belemásolod őket az eredetiből. Egyszerűen lekezelhető különleges eset, ha a forrástömb lehet üres vagy egyetlen elemű.
Végigmész az egyiken elemenként (külső, számlálós), majd minden elem esetében egy belső while ciklussal (eldöntés tétele) eldöntöd, hogy a másik tömb tartalmazza-e az előző tömb éppen vizsgált elemét.
Az unió tétele is ilyen (ilyesmi), az egyik tömb teljes egészében másolásra kerül, a másik tömbből pedig azok az elemek, amiket az első nem tartalmaz. Ehhez kell egy eldöntés tétel.
Én egyébként szeretem a programozási tételeket, én magamtól túl bonyolultan oldanám meg, ezek meg egyszerűbb megoldást tanítanak.
Az se baj, ha az ember tudja, mi történik egy-egy Contains(), Distinct() vagy LINQ metódus mögött.
Köszi, próbálkozom vele!
Tök megörültem az URL-nek, azt hittem, forráskódot fog rejteni, de nem baj, nagyobb sikerélmény, ha nekem sikerül, de nagyon zsibbad az agyam. :D
A 11 elemű tömb kiírásánál 1-ről kezdtél el indexelni, hogy az 1 értékű, 0. indexű elemet "megette"?
Nem feltétlen muszáj rendezni:
A = {8,8,4,3,3,1,10,1,8,3};
B = {0,0,0,0,0,0,0,0,0,0};
J = 0;
CIKLUS I = 0-TÓL 9-IG 1-VEL
B[J] = A[I];
K = 0;
CIKLUS AMIG B[K]<>B[J]
K = K + 1;
CIKLUS VÉGE
HA K = J AKKOR
J = J + 1;
ELÁGAZÁS VÉGE
CIKLUS VÉGE
ez esetben J az elemek számát tartalmazza
utolsó (12:49) voltam, persze dinamikus tömbbel valahogy így:
A := {8,8,4,3,3,1,10,1,8,3};
B := {};
J := 0;
K := 0;
CIKLUS I = 0-TÓL 9-IG 1-VEL
HA K = J AKKOR
B.PUSH(A[I]);
KÜLÖNBEN
B[J] := A[I];
K := 0;
CIKLUS AMIG B[K]<>B[J]
K := K + 1;
CIKLUS VÉGE
HA K = J AKKOR
J = J + 1;
ELÁGAZÁS VÉGE
CIKLUS VÉGE
HA K < J AKKOR
B.POP();
ELÁGAZÁS VÉGE
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!