Szúdoku megoldás-tömb - Programozás tanítása

Tartalomhoz ugrás
Szúdoku feladat megoldása
folytatás String tömb használatával

3. feladat

Olvassa be a feladvanyok.txt állományban lévő adatokat és tárolja el egy olyan adatszerkezetben, ami a további feladatok megoldására alkalmas! Határozza meg és írja ki a képernyőre a minta szerint, hogy hány feladvány található a forrásállományban!
Általában a String tömb vagy String lista használatát annak javaslom, aki hadilábon áll az objektumokkal, nem tudja használni a LINQ eszközöket.
Előkészületek
A forrásállományt helyezze olyan mappába, ahol könnyen eléri. Amennyiben nem akar bajlódni elérési útvonalakkal, a legegyszerűbb a \sudokuCLI\bin\Debug mappába tenni.
A [program.cs] -re kattintva az egér jobb gombjával, majd az [Open Containing Folder] -t választva ezt könnyen megteheti.
Szöveges fájl olvasása
Mivel a System.IO nem szerepel a using részben, ezért a File osztály metódusait sem tudja használni. Orvosolja a problémát! A még ismeretlen File névre állva Alt+Enter vagy Ctrl+. billentyű kombinációkat használva, beillesztheti a hiányzó using kezdetű sort.
ReadAllLines - A paramétere egy szöveges állomány elérési útja és neve. Visszatérési értéke a beolvasott szöveges állomány sorait tartalmazó tömb.
Length - A tömb elemeinek száma.

4. feladat

Kérjen be a felhasználótól egy 4..9 intervallumba eső (4 ≤ x ≤ 9) egész számot! A beolvasást addig ismételje, amíg a megfelelő értékhatárból érkező számot nem kapjuk! Határozza meg, és írja a képernyőre, hogy ebből a méretből hány feladvány található a forrásállományban!
Amikor valamilyen feltétel teljesülése esetén meg kell ismételni a beolvasást, érdemes hátul tesztelő ciklust használni! A feltételben felsoroljuk az összes olyan rossz esetet, amikor ismétlésre van szükség.
Ezek most: szam < 4 || szam > 9
Console.ReadLine - A billentyűzetről olvas be és stringet ad vissza.
Ebben az esetben ezt még számmá kell alakítani.
A foreach ciklus egy klasszikus megszámolási algoritmust valósít meg. A feltételt arra építjük, hogy az aktuális sor (feladvány) karakterekben mért hossza meg kell egyezzen a megadott méret négyzetével.
A kiíratásban az a fajta formázási lehetőség látható, ahol { } jelek között a behelyettesítendő kifejezés sorszámát adjuk meg. A " " rész után pedig következnek a behelyettesítendő paraméterek, amelyek számozása 0-val kezdődik.

5. feladat

Válasszon ki véletlenszerűen egy feladványt, amely az előző feladatban bekért méretű! A kiválasztott feladványt jelenítse meg a képernyőn a minta szerint! Ha nem sikerült véletlenszerű feladványt kiválasztani, akkor dolgozzon a legelső beolvasott feladvánnyal!
Talán a konzolos feladatsor legnehezebb részének tűnhet, de egy jó ötlettel a későbbi dolgunkat is leegyszerűsíthetjük.
Hozzunk létre egy segédlistát, ami csak azokat a feladványokat tartalmazza, amelyek megfelelnek a feltételnek. Ezt nevezzük leválogatási algoritmusnak.
Random - A véletlenszámok generálását biztosító osztály.
Next - Paramétereként azt az egész számot adjuk meg, amit már nem akarunk a véletlenszerű kiválasztás végén viszont látni. A véletlenszerű kiválasztásban szereplő számok
0 .. (paraméter-1)
A véletlenszám generátor objektumot inicializálja, majd ki kell választani egy random elemet a leválogatott listából! Ezt úgy tehetjük meg, hogy az elem eléréséhez szükséges indexet generáljuk véletlenszerűen.
Mivel nem tudhatjuk előre, hogy a leválogatott lista hány elemű lesz, ezért a lista elemeinek számát használjuk fel a Next paramétereként. Ez ráadásul összhangban van azzal, hogy a lista indexelése 0-val indul.

6. feladat

Határozza meg és írja a képernyőre a kiválasztott feladvány kitöltöttségét %-os formában a minta szerint! A kitöltöttségen a kitöltött mezők arányát értjük az összes mező számához viszonyítva! A százalékos értéket egész számra kerekítve jelenítse meg!
Egy megszámláló algoritmusra van szükség, ahol a feladványban szereplő '0' -ák számát szeretnénk megkapni. Kihasználjuk azt, hogy a karakterláncok karaktertömbként kezelhetők, így egy ciklussal végig tudjuk venni minden karakterét.
Gyakran elfelejtkeznek arról, ha az / művelet mindkét oldalán egész típusú kifejezés van, akkor az eredmény is egész lesz. Ennél a feladatnál ez tipikus hiba lehet, mivel az kitöltöttek_száma/összes_cella*100 kifejezésnél az osztás eredménye 0 lesz! Figyelembe véve, hogy kitöltöttek_száma<=összes_cella

Számos megoldási lehetőség közül kettőt ismertetek, de érdemes a gombra kattintva megnézni, hogy milyen hibákat szoktak még elkövetni az ilyen típusú feladatoknál.

Mindkét megoldásban implicit típuskényszerítést használunk. A 100d literálban megadjuk a d-t, így a fordító tudni fogja, hogy a 100-at double típusú számként kezelje. Lehetne persze explicit módon az osztás bármely tényezője elé (double) típuskényszerítést is írni, a végeredmény ugyanaz.
Math.Round : A matematika szabályai szerinti kerekítést végez. Ebben az esetben egészre kerekít, de double típusú értéket ad vissza.
100d * kitoltott/ valasztott.Length
double * int / int => double / int => double
Ebben a feladatban nincs jelentősége, de annyiban jobb megoldás a második, hogy a változó értékében továbbra is megmaradnak a tizedesjegyek. Későbbi erre épülő számításoknál így nem csökken a pontosság. A feladatbeli elvárását -az egészre kerekített kiírást- formázó karakterekkel biztosítjuk.
Formázott kiírás értelmezése

$"6. feladat: A... {arany:n0}%"
A $ jel jelzi, hogy a karakterláncban a { } között kifejezés van és nem szöveg. A kifejezés kiértékelése után annak értéke kerül a helyébe.
A { } közötti részt a : két részre bontja. Az előtte lévő a kifejezés, az utána lévő rész a formázó leírás.
Ebben az esetben az n0 formázó azt jelenti, hogy 0 tizedesjegyre kerekítetten történjen a kiírás.

7. feladat

A Feladvany osztály megfelelő metódusát felhasználva jelenítse meg a kiválasztott feladványt a konzolon!
Az egyik legkönnyebb feladatrész, amennyiben tud objektumot példányosítani. A korábban beillesztett osztály konstruktorát kell hívni, aminek egyetlen paramétere van a feladványt reprezentáló karakterlánc.
A példányosítás után már lehet használni az objektum metódusait. A megjelenítést a Kirajzol() metódus fogja elvégezni.

8. feladat

Válogassa ki és írja ki fájlba az adott méretű feladványokat! Ha például a felhasználó a 4-es méretet adta meg, akkor a kimeneten egy sudoku4.txt állományba kerüljenek a 4x4-es méretű feladványok! Az állományban soronként egy feladvány kerüljön!
Most jön jól az 5. feladatban bevezetett valogatott nevű lista. Már csak végig kell menni a lista elemein és fájlba kell írni őket.
WriteAllLines - Két paraméterre van szüksége, az első a szöveges állomány elérési útja és neve, a második a kiírandó sorokat tartalmazó adatstruktúra. Jelen esetben ez egy string lista.
Az írás eredménye megjelenik a Debug mappában.
Vissza a tartalomhoz