Avatar
petrdolan8693:

ahoj všem, mám vytvořit následující program:

Program pracuje s místy v jednom vlaku.

  • Vlak je složen z 5 vozů.
  • V každém voze je 12 oddílů (kupé).
  • V každém oddíle je 6 míst.
  • Číslování je každém voze stejné: 11-16 (1. oddíl), 21-26 (2. oddíl) ... 121-126 (12. oddíl)

Je mi jasné že každý vůz je matice 12X6, jenže netuším, kam mám zanést číslování, program má totiž rezervovat místo v daném oddílu a voze, podle vstupu z klávesnice, moc díky za rady :)

 
Odpovědět 3.6.2015 19:46
Avatar
Matěj Černý
Redaktor
Avatar
Matěj Černý:

Ahoj, pro sedadla bych vytvořil normální 1rozměrné pole a poté bych touto metodou zjistil v kolikátém vagonu a v kolikátém kupé se nachází. ;)

public class Vlak {
    private static final int VAGONU=5;
    private static final int KUPE=12;
    private static final int SEDADEL=6;

    private static final int POCET_SEDADEL=VAGONU*KUPE*SEDADEL;

    private static final int[] sedadla=new int[POCET_SEDADEL];

    public static String getMistoVeVlaku(int cislo_sedadla){
        cislo_sedadla-=1;//Odečtu 1 protože číslování je od 1 a ja chci od 0
        int cislo_vagonu= (int) Math.floor(cislo_sedadla/(KUPE*SEDADEL));
        int zbytek =cislo_sedadla-cislo_vagonu*(KUPE*SEDADEL);
        int cislo_kupe=(int) Math.floor(zbytek/SEDADEL);

        cislo_vagonu+=1;//Přičíst 1 protože číslování je od jedničky a ne od 0
        cislo_kupe  +=1;

        return "["+cislo_sedadla+"]Misto ve "+cislo_vagonu+". vagonu, v "+cislo_kupe+". kupe";
    }
}

Napiš, jestli ti to pomohlo.

Nahoru Odpovědět  +3 14.6.2015 21:49
Všechno jde obejít.
Avatar
Odpovídá na Matěj Černý
petrdolan8693:

Moc děkuji za radu :) jen teď přemýšlím nad tím, jak pracovat s místem, pokud bych ho chtěl rezervovat, myslím, že by bylo nejlepší,abych si vytvořil metodu, které bych předával ono místo, ale nejsem si moc jistý, asi moc přemýšlím a kombinuju :( přikládám celé zadání, abyste byl v obraze, ale kód nepotřebuji, spíš by se mi hodila nějaká ochotná duše,která by byla ochotná se mnou diskutovat, popřípadě jen navést na správnou cestu :)

Program umožňuje:

  • Rezervovat konkrétní jedno místo - zadání z klávesnice: číslo vozu, oddílu, místo
    Výsledek operace
    Rezervace proběhla v pořádku
    Nelze provést, místo je již obsazeno
    Chyba, místo neexistuje
  • Zrušit všechny rezervace
  • Zrušit konkrétní rezervaci na jedno místo - zadání z klávesnice: číslo vozu, oddílu, místo
    Výsledek operace
    Zrušení proběhlo v pořádku, místo bylo uvolněno
    Nelze provést, místo není rezervováno
    Chyba, místo neexistuje
  • Rezervace požadovanného počtu míst v jednom oddíle.
    Výsledek operace
    Pokud se takové místo najde, je vypsána informace o voze, oddíle a místech,

    kde byla rezervace provedena.

    Pokud se takové místo nenajde, je vypsána informace, že rezervaci nelze provést.
  • Zobrazení aktuálního stavu

    Ve vhodné textvé podobě se zobrazí aktuální stav obsazení jednotlivých míst/oddílů/vozů.

Např:

=============­========================­===============
Vůz 1


| 01 02 03 04 05 06 07 08 09 10 11 12


1 | x x .
2 | x . . atd.
3 | . . .
4 | . . .
5 | x . .
6 | x . .
=============­========================­===============

  • Uložení aktuálního stavu do souboru a načtení ze souboru

    Způsob ukládání do souboru je zcela libovolný.

    Program automaticky při svém ukončení uloží akltuální stav vlaku do souboru.

    Program automaticky při svém startu se pokusí nalézt uložený soubor a načte z něj stav.

    Pokud se soubor s uloženým stavem nenajde, bude vlak iniciován se všemi místy volnými (nerezervovanými). Děkuji mockrát za Váš čas :)

 
Nahoru Odpovědět 16.6.2015 12:28
Avatar
Matěj Černý
Redaktor
Avatar
Matěj Černý:

Aha, tak to se omlouvám, pořádně jsem si nepřečetl dotaz. Tak v tom případě se naskytují 2 řešení:
.
.
Každopádně se to bude řešit přes statické pole, jelikož známe přesný počet míst ve vlaku. Dále použijeme novou třídu Sedadlo, protože bychom si asi kromě toho jestli toto místo je rezervované, chtěli zjistit také kým je rezervováno. Sedadlo bude sloužit pouze jako přepravka na hodnoty a bude mít atributy: boolean jeRezervovano, String jmenoTohoCoRe­gistroval.
.
.

1. řešení: je vytvořit 2rozměrné pole, kde 1. rozměr bude zastupovat číslo vagonu a 2. rozměr tohoto pole by zastupoval pořadí sedadla ve vagonu. Čili pole Sedadlo[vagon][po­radi_sedadla_ve_va­gonu]. Pokud bychom použili toto řešení, bylo by nutné, udělat 2 metody: 1. by měla za parametry měla číslo kupe a číslo sedadla v kupé (1.-6. sedadlo) a vracela by index sedadla ve vagonu. 2. by dělala opak: jako parametr by měla index sedadla ve vagonu a vracela by číslo kupé a číslo sedadla v kupé (1.-6. sedadlo)
.
.
2. řešení: je vytvořit 3rozměrné pole, kde 1. rozměr bude číslo vagonu, 2. kupé a 3. bude číslo sedadla v kupé (1.-6. sedadlo). Čili 3rozměrné pole: Sedadlo[vagon][ku­pe][poradi_se­dadla_v_kupe]. Pokud bychom použili toto řešení, museli* bychom do třídy Sedadlo přidat atribut int index_sedadla_ve_va­gonu, čímž bychom vyřešili to číslování. Totiž při vytvoření nového Vlaku = poleSedadel bychom do každého místa v poli vložili sedadlo a rovnou bychom mu dali finální index_sedadla_ve_va­gonu (od 1 do 12x6). To je ale naprosto zbytečné plýtvání pamětí programu a velikostí dat. Pro zjištění index_sedadla_ve_va­gonu bychom jednoduše vynásobili (index_kupé * sedadel_v1_kupe) a přičetli bychom k tomu index_sedadla. Opačně bychom zase vydělili (index_sedadla_ve_va­gonu / sedadel_v1_ku­pe)=index_kupe a zbytek z toho dělení bychom použili jako index_sedadla_v_ku­pe.

Upřímně se kloním k 2. možnosti a to k trojrozměrnému poli. Je to mnohem přehlednější, logičtější a nejlépe se s tím pracuje: stačí zadat vagon, kupe, sedadlo a máte sedadlo co chcete.

Editováno 16.6.2015 16:32
Nahoru Odpovědět  +1 16.6.2015 16:29
Všechno jde obejít.
Avatar
petrdolan8693:

Moc díky za Tvůj čas(až teď jsem si všil, že si tu tykáme.) Já jen uvažuji nad tím, jestli by třeba jeden vůz ve vlaku neměl být rovněž objektem. Dále mám jen problém s tím, že věci fungují do chvíle, pokud píšu třeba metody jen obecně. Pokud mám přejít ke konkrétnímu řešení, třeba příklad vytvořit ten vlak, už mám problém v hlavě, protože i po všech přednáškách nevím jak postupovat, respektive vím, že předám metodám konkrétní parametry jen to technicky nefunguje.

 
Nahoru Odpovědět 27.6.2015 3:59
Avatar
Matěj Černý
Redaktor
Avatar
Odpovídá na petrdolan8693
Matěj Černý:

Záleží na tom, jestli je vytvoření třídy vagon nutné. Jestliže se bude pracovat pouze se sedadly ve vlaku, není zde pro toto řešení žádný důvod. OOP (objektově orientované programování) je sice strašně super věc, avšak nemělo by se to s ním přehánět. (Má to i své nevýhody: př náročnost na paměť a pomalost) Jiná věc by byla, pokud by se mohli vagony měnit (př výměna vagonu v důsledku opravy, přidání 1 vagonu do soupravy kvůli většímu počtu lidí.) V tomto případě se jeví použití třídy vagon jako logické řešení. Vlak by potom spravoval jednotlivé vagony a mohl by libovolně měnit počet vagónů.
..
Pro tento problém je jediné řešení: učit se, učit se a učit se, a samosebou zkoušet si to na příkladech. Např si zkusit udělat nějaký malý program (nejlepší jsou hry:)), je až neuvěřitelné, kolik takových problémů je třeba řešit. Další výborná věc je čtení nějakých source kódů. Neříkám to zkopírovat, ale inspirovat se. :D Teď už můžeš označit správné řešení této diskuse.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 27.6.2015 6:37
Všechno jde obejít.
Avatar
Matěj Černý
Redaktor
Avatar
Matěj Černý:

Doporučuji se kouknout na itnetwork na objektové programování v Javě. Tam jsou i ty příklady. Můžeš si poté stáhnout source kód a třeba si něco přidat nebo upravit.

Nahoru Odpovědět  +2 27.6.2015 6:51
Všechno jde obejít.
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 7 zpráv z 7.