C# OOP fálj beolvasása
2021-11-22T13:01:20+01:00
2021-11-22T14:45:15+01:00
2022-08-12T05:45:30+02:00
wiccan
Sziasztok, 

most tanulom az OOP programozást és a mellékelt fálj olvasással problémám akadt. adatok

Négyzet (N) alaku területre falakat teszünk (W), ami egység széles. Bizonyos (S) pontokból kiindulva eljtutunk-e a négyzet szélére.
Bemeneti fálj felépítése:


- az első sor szóközzel elválasztva:
- N - a négyzet oldalhossza
- W - a csillagok száma
- S - kiinduló pontok száma


a következő L sorok négy számot tartalmaz
-X - a fal bal alsó koordinátájának az  X értéke
- Y - a fal bal alsó koordinátájának az  Yértéke
- Dx - a fal X tengelyen vett oldalhossza
- Dy - a fal Y tengelyen vett oldalhossza


az utolsó S sorban az S kezdőopont(ok) koordinátái vannak, szóközzel elválasztva
- Sx - a kezdőopont X koordinátájának ´
- Sy - a kezdőopont Y koordinátájának

lista a linq-t nem használhatok.
A feladat többi részével nincs porblémám, csak a beolvasással OOP-ben.

using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace alle { class Adat { public int N; public int W; public int S; public int X, Y, DX, DY; public Adat(int N, int W, int S, int X, int Y, int DX, int DY) { int N = 0; int S = 0; int W = 0; string adat = sorok[0]; if (adat.Contains(' '.ToString())) { string[] sorOszlop = adat.Split(' '); N = Convert.ToInt32(sorOszlop[0]); S = Convert.ToInt32(sorOszlop[1]); W = Convert.ToInt32(sorOszlop[2]); } this.N = N; this.W = W; this.S = S; this.X = X; this.Y = Y; this.DX = DX; this.DY = DY; } public void beolvas() { int sorSzam = 0; StreamReader sr = new StreamReader("output.txt", Encoding.Default); while (!sr.EndOfStream) { sr.ReadLine(); sorSzam++; } sr.Close(); string[] sorok = new string[sorSzam]; int szamlalo = 0; sr = new StreamReader("output.txt", Encoding.UTF8); while (!sr.EndOfStream) { sorok[szamlalo] = sr.ReadLine().ToUpper(); szamlalo++; } sr.Close(); } } }
Mutasd a teljes hozzászólást!
Én inkább abból indulnék ki, hogy miről is szól a programom világa. Nem tudom, mennyire vannak stabil OOP alapjaid, de ebben a paradigmában arról van szó, hogy a programunkat megpróbáljuk úgy felépíteni, ahogy a mi világunk működik.

Egy program mindig a való világ élőlényein, tárgyain, fogalmain és jelenségein alapul. Amikor OOP szemlélettel készítjük el a programunkat, akkor a mi világunknak egy kis modelljét készítjük el, ami csak azokat a dolgokat tartalmazza, amivel a programnak foglalkoznia kell.

Gondolkozzunk egy kicsit, mit is ír le nekünk a feladat - tekinthetünk rá úgy, mint egy labirintusjátékra. Ez a játék abból áll, hogy van egy N oldalú táblánk, rajta falakkal, illetve van egy "bábunk", amivel el kell jutni a tábla szélére.

Tehát a programunk világában mindenképp szükségünk lesz egy olyan fogalomra, hogy "tábla", amely valamilyen reprezentáció - például egy mátrix - arról, hogy a tábla egyes mezője fal vagy nem fal-e. Erre van beépített nyelvi támogatás (int[,] amiben 0 a nem fal, 1 pedig a fal), szóval nem muszáj erre külön osztályt csinálni (persze ha akarod, megteheted).

Továbbá van maga a játék - ami áll a táblából, a bábunk kezdőpozíciójától, és egy plusz metódusból, amely megmondja, hogy a játék megnyerhető-e.

Tehát amire szükséged van igazából:

class Game { public Game(int[,] board, (int, int) startPosition) { //... } public bool IsWinnable() { //... } }
És a beolvasáskor a te feladatod az lenne, hogy előállítsd ennek a Game osztálynak a példányait:

class Game { public Game(int[,] board, (int, int) startPosition) { //... } public bool IsWinnable() { //... } public static Game[] GetGames(string filename) { //... } }
Annyi, hogy mindegyik játékmenetben ugyanaz lesz a tábla. Annyit lehet még rajta szépíteni, hogy csinálsz egy külön osztályt a GetGames helyett:

class GameFileLoader { public GameFileLoader(string filename) { //... } public Game[] Load() { //... } }
Mutasd a teljes hozzászólást!

  • Hali!

    A probléma első fele, hogy az Adat osztályod konstruktorának a 4. sorában a sorok[0] egy nem definiált változó. Az sem szerencsés, hogy a konstruktor bemenő paramétereinek a neve meg egyezzik az osztály publikus tulajdonságainak a nevével; ilyen esetben illene priváttá tenni az osztály tulajdonságait, hogy ne írhassa boldog boldogtalan bármikor. A konstruktor elején is elhagyható a kezdeti értékadás, ha már eleve a definícióba beírod, hogy az értékük 0. Valamint a fájlt fölösleges 2× is beolvasnod, elég ha az elején beolvasod egy listába, majd a listának lekérdezed a számlálóját, pl.:

    var sorok = File.ReadAllLines("output.txt", Encoding.Default); int sorokSzama = sorok.Length;
    Ez után már dolgozhatsz a meglévő tömböd soraival nincs értelme még 1× betölteni.
    For vagy foreach ciklussal iterálhatsz rajta.
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Én inkább abból indulnék ki, hogy miről is szól a programom világa. Nem tudom, mennyire vannak stabil OOP alapjaid, de ebben a paradigmában arról van szó, hogy a programunkat megpróbáljuk úgy felépíteni, ahogy a mi világunk működik.

    Egy program mindig a való világ élőlényein, tárgyain, fogalmain és jelenségein alapul. Amikor OOP szemlélettel készítjük el a programunkat, akkor a mi világunknak egy kis modelljét készítjük el, ami csak azokat a dolgokat tartalmazza, amivel a programnak foglalkoznia kell.

    Gondolkozzunk egy kicsit, mit is ír le nekünk a feladat - tekinthetünk rá úgy, mint egy labirintusjátékra. Ez a játék abból áll, hogy van egy N oldalú táblánk, rajta falakkal, illetve van egy "bábunk", amivel el kell jutni a tábla szélére.

    Tehát a programunk világában mindenképp szükségünk lesz egy olyan fogalomra, hogy "tábla", amely valamilyen reprezentáció - például egy mátrix - arról, hogy a tábla egyes mezője fal vagy nem fal-e. Erre van beépített nyelvi támogatás (int[,] amiben 0 a nem fal, 1 pedig a fal), szóval nem muszáj erre külön osztályt csinálni (persze ha akarod, megteheted).

    Továbbá van maga a játék - ami áll a táblából, a bábunk kezdőpozíciójától, és egy plusz metódusból, amely megmondja, hogy a játék megnyerhető-e.

    Tehát amire szükséged van igazából:

    class Game { public Game(int[,] board, (int, int) startPosition) { //... } public bool IsWinnable() { //... } }
    És a beolvasáskor a te feladatod az lenne, hogy előállítsd ennek a Game osztálynak a példányait:

    class Game { public Game(int[,] board, (int, int) startPosition) { //... } public bool IsWinnable() { //... } public static Game[] GetGames(string filename) { //... } }
    Annyi, hogy mindegyik játékmenetben ugyanaz lesz a tábla. Annyit lehet még rajta szépíteni, hogy csinálsz egy külön osztályt a GetGames helyett:

    class GameFileLoader { public GameFileLoader(string filename) { //... } public Game[] Load() { //... } }
    Mutasd a teljes hozzászólást!
abcd