Kezdőoldal » Számítástechnika » Programozás » Elsőéves hallgató vagyok...

Elsőéves hallgató vagyok mérnökinformatika szakon, és kaptunk beadandó feladatot, amit ha nem oldunk meg nem mehetünk vizsgázni. Annyit előrebocsátok, hogy a fő gondom nem maga a probléma megoldása, hanem, hogy mindezt objektumorientáltan kell?

Figyelt kérdés

Kb. három hete tanuljuk az OOP-t, és a problémám még csak nem is az hogy nem értem mire jó az, mert abszolút logikus, csak konkrétan a saját feladatomon nem jövök rá leginkább arra, hogy miket válasszak az objektumaimnak, milyen osztályokat készítsek?


A konkrét feladat tehát:

A feladat szerint egy háztervezőnek olyan programra van szüksége, ami egy kész tervből (txt fájl*) meg kell határoznia, hogy hány új szoba rakható be még a tervbe (vagyis már van egy kész terv n darab szobával, a kérdés, hogy hány új szoba építhető be az épületbe), és ezt kell egy kimeneti fájlban (txt) előállítani, és hogy ezek közül melyik a legnagyobb szoba (szóval egy kétsoros txt fájl az egész program eredménye), viszont a csavar (és egyben valahol könnyítés is) a feladatban, hogy csak bizonyos feltételekkel rakható be új szoba:

- bármely két új szoba, bármely két oldalának nem lehet közös része (ez azért nagy segítség, mert így nem lehet a végtelenségig folytatni egy szoba felezgetését – tehát, ha találtunk egy alkalmasnak tűnő szobát, akkor azt csak 2 új szobára oszthatjuk, és kész, nem is kell már azzal a helységgel foglalkozni)

- a létrejövő szoba mind a négy oldala szomszédos kell, hogy legyen vagy meglévő szobával, vagy a ház oldalával

- minden szoba csak téglalap alakú lehet (tehát nem lehet L alakú szoba, meg semmi lépcsőzetes elrendezés stb...)


* a txt fájl például így néz ki (nem kaptunk konkrét fájlt, bármilyen tervvel működnie kell, ahol az épületben a szobák száma 1 és 1000000 között van):

5 1 1 11 11

1 1 6 6

6 1 11 3

6 3 10 11

1 6 4 11

4 6 5 11


ahol az első sor: szobák száma – a ház bal felső x koordinátája – a ház bal felső koordinátája – a ház jobb alsó x koordinátája – a ház jobb alsó y koordinátája


az összes többi sor az egyes szobák (tehát jelen esetben 5 szoba – 5 sor) koordinátái az első sorral megegyező módon megadva a szobák 2 sarkát


A példamegoldás szerint a kimeneti txt állomány ekkor ez kell hogy legyen:

2

8

Vagyis 2 szoba alakítható ki, és az így létrejövő szobák közül 8 a legnagyobb területű.

Ha jobban megvizsgáljuk, akkor ez az 1 6 4 11 -es szoba, amit tehát csak két részre tudunk bontani, és az így létrejövő szobák közül a kisebbik


(Egyébként a példához tartozik ábra is, egy négyzetrácsos lapon könyű elképzelni)


Addig eljutottam, hogy a szobák nyilván objektumok (mindegyiknek van négy oldala, mondjuk ezen kívül sok más adata nincs), viszont a fő probléma, hogy nem tudom, hogyan járjam be az összes objektumot az összehasonlítgatások végett. Ami adja magát, hogy valahogy tömbökben kéne tárolnom az egyes adatokat, de nem igazán tudom....



Maga a probléma megoldása:

Arra jutottam hosszas kísérletezgetések után (pedig egyébként tök logikus), hogy a feladatban a négy számból teljesen egyértelműen meghatározható a szoba összes falszakaszának 2 végpontja, és így csak végig kell haladni a sorokon, és a megfelelő koordinátákat kell hasonlítgatni a többi sorral, tehát véve egy adott szobát, körül kell azt járni minden oldalról és csak akkor alkalmas a szoba arra, hogy két részre osszuk, ha mind a négy oldalánál igazak maradnak a fent leírt feltételek.


egy szoba 4 adata így határozható meg és így hasonlítható a többi szoba 4 adatéval:

legyen pl. a szöveges állományból: 2 2 4 4 egy szoba bal felső x és y, illetve jobb alsó x és y koordinátái

a felülről való vizsgálatra a BF-JF szakasz: 2 2 4 2, de ami igazából kell az ezek x koordinátái, vagyis 2 és 4 (az 1. és a 3. adat)

jobbról való vizsgálathoz a JF-JA szakasz: 4 2 4 4, viszont ebből most az y koordináták kellenek: szintén 2 és 4 (de ami fontos – sajnos nem éppen a legszemléletesebb példát választottam, hogy a 4 adatból kettő-kettő megegyezik – hogy ez most az 2. és 4. adat)

alulról azt kapjuk, hogy ugyanaz, mint az első, és végül balról, hogy az ugyanaz mint jobbról


Így a feltételvizsgálatok egy szobához:

amelyik szobánkat vizsgáljuk a 4 oldalról nevezzük aktuálisnak, és a körüljáráskor összehasonlított szobákat vizsgáltnak. Ekkor tehát az alábbi feltételeknek kell teljesülnie ahhoz, hogy a szoba osztható legyen:

felülről: (vizsgát 1.=>aktuális 1.)&&(vizsgált 3.=<aktuális 3.)

jobbról: (vizsgát 2.=>aktuális 2.)&&(vizsgált 4.=<aktuális 4.)

alulról: (vizsgát 1.=>aktuális 1.)&&(vizsgált 3.=<aktuális 3.)

balról: (vizsgát 2.=>aktuális 2.)&&(vizsgált 4.=<aktuális 4.)

tehát lényegében az alulról és felülről való vizsgálat ugyan az, és a jobbról balról is megegyezik egymással, és ugyebár a 4 vizsgált szobák közül, a felülről vizsgáltnak a BA-JA, jobbról vizsgáltnak BF-BA, az alulról vizsgáltnak a BF-JF, a balról vizsgáltnak pedig a JF-JA koordinátái kellenek


Még egy észrevétel: valahogy esetleg lehetne javítani a hatékonyságon, ha megjegyeznénk egy szoba vizsgálatánál, hogy a mellette lévő szoba nem jó, azt meg lehetne jegyezni, és nem kéne már vizsgálni.



Szóval tudom, hogy nagyon sok idő mire valaki ezt végig olvassa és megérti, nagyon remélem, hogy tud valaki segíteni, csak egy pár tippet várnék, hogy hogyan lehetne ezt OOP-módon megoldani, milyen osztályokat készítsek?



2014. nov. 4. 16:54
 1/3 anonim ***** válasza:
Tesó, nincsenek neked csoporttársaid? Egy az, hogy ez hosszú, a franc se fogja itt elolvasni, a másik meg az, hogy egy ilyen problémát itt senki sem fog neked kivesézni.
2014. nov. 4. 18:03
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:

Részemről is TL;DR, az elejét és a végét olvastam.


> milyen osztályokat készítsek?


Hát egy Szoba osztály nyilván kell. Egy Ház sem árt. A Ház-ban meg egy List-ben lehetnének a szobák. Máris van egy szép OOP felépítésed.


Ezen kívül nyilván kell egy Main osztály. Hasznos lehet egy külön fájlbeolvasó osztály, mert később, más projektekben is tudod majd használni - érdemes tehát univerzálisra megírni.


Ennyi jutott eszembe hirtelen.

2014. nov. 4. 18:15
Hasznos számodra ez a válasz?
 3/3 anonim ***** válasza:

TL;DR


Foglald össze

2014. nov. 4. 20:36
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!