NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Zásobník

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
dinokino
Člen
Avatar
dinokino:17.4.2015 23:51

Dobrý den, neporadil by prosím někdo kde jsem udělal chybu? :) Mám dvě třídy:
(třída s metodou main:)

public class Zasobnik {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
TridaProZasobnik z1= new TridaProZasobnik(5);
TridaProZasobnik z2= new TridaProZasobnik(z1);
char[] pole={'a','D','T'};
TridaProZasobnik z3= new TridaProZasobnik(pole);

for(int i=0;i<7;i++){
    z1.vloz((char)('a'+i));
}
for(int i=0;i<7;i++){
    System.out.println(z1.vyjmi());
    }

    System.out.println("\n\n");


for(int i=0;i<7;i++){
    System.out.println(z2.vyjmi());
    }





    }

}

a

public class TridaProZasobnik {
    private int vel;
    char[] zasobnik;
    int indexvloz,indexvyzvedni;
    TridaProZasobnik (TridaProZasobnik a){
        zasobnik=new char[a.zasobnik.length];
        for(int i=0;i<a.zasobnik.length;i++){
            zasobnik[i]=a.zasobnik[i];
        }

    }
    TridaProZasobnik(char a[]){
        zasobnik= new char[a.length];
        for(int i=0;i<a.length;i++){
            zasobnik[i]=a[i];
        }
    }
    TridaProZasobnik(int velikost){
        vel=velikost+1;
        zasobnik=new char[vel];
        indexvloz=0;
        indexvyzvedni=1;
    }
    public void vloz(char znak){
        if(indexvloz<vel-1){
        zasobnik[indexvloz]=znak;
        indexvyzvedni++;
        indexvloz++;

        }
    }
    public char vyjmi(){
        if(indexvyzvedni>=1){
            indexvyzvedni--;
            return zasobnik[indexvyzvedni];
        }
        return '0';
    }
}

Je to napsané tak, aby se při překročení hranic zásobníku vypsalo místo uloženého znaku '0'. Problém je v tom, že jsem chtěl vytvořit zásobník a později z něj vytvořit další. Na výstupu se mi u prvního zásobníku zobrazí správně hodnoty, které jsem tam s pomocí metody

vloz(char znak)

vložil. U druhého se mi ale vypíší samé nuly (a ne stejné znaky jako u prvního zásobníku). viz obrázek :)

 
Odpovědět
17.4.2015 23:51
Avatar
wgamez101
Člen
Avatar
Odpovídá na dinokino
wgamez101:18.4.2015 9:49

Problém je v tom že objekt z2 vytváraš ešte predtým než si do z1 vložil znaky, tzn. že v konštruktore TridaProZasobnik sa skopíruje prázdne pole zo z1 do z2. Taktiež indexvyzvedni bude stále 0 pretože ho v konštruktore nenastavuješ.

Nahoru Odpovědět
18.4.2015 9:49
There are only two kinds of programming languages: those people always bitch about and those nobody uses. -- Bjarne...
Avatar
Odpovídá na dinokino
Petr Štechmüller:18.4.2015 9:54

Ahoj, toto chování je správné. Problém je v tom, že Ty nejdříve vytvoříš zásobník z2 ze z1, který je prázdný (definuješ jenom velikost) a až potom naplňuješ zásobník z1. Takže když vypisuješ druhý zásobník, dostaneš samé nuly.

Nahoru Odpovědět
18.4.2015 9:54
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
dinokino
Člen
Avatar
dinokino:18.4.2015 14:12

Tak jsem tu třídu s hlavní metodou upravil na:

public class Zasobnik {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
TridaProZasobnik z1= new TridaProZasobnik(5);

char[] pole={'a','D','T'};
TridaProZasobnik z3= new TridaProZasobnik(pole);

for(int i=0;i<7;i++){
    z1.vloz((char)('a'+i));
}

TridaProZasobnik z2= new TridaProZasobnik(z1);


for(int i=0;i<7;i++){
    System.out.println(z2.vyjmi());
    }





    }

}

Teď by se měli do zásobníku z1 vložit prvky ae. Následně by se měli zobrazit, ale místo toho se zobrazují zase jen nuly :O. Nevíte co s tím je teď? :D (už jsem dal deklaraci zásobníku z2 za vložení prvků do z1; na přiloženém obrázku je vyfocený výstup)

Editováno 18.4.2015 14:14
 
Nahoru Odpovědět
18.4.2015 14:12
Avatar
dinokino
Člen
Avatar
Odpovídá na dinokino
dinokino:18.4.2015 14:15

Vyfocený výstup (obrázek)

 
Nahoru Odpovědět
18.4.2015 14:15
Avatar
wgamez101
Člen
Avatar
Odpovídá na dinokino
wgamez101:18.4.2015 17:21

Už som to tu spomínal že indexvyzvedni z2 bude 0 pretože nebol nastavený. Dobré by bolo pridať do konštruktora TridaProZasobnik niečo takéto

indexvyzvedni = a.indexvyzvedni;
indexvloz = a.indexvloz;
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
18.4.2015 17:21
There are only two kinds of programming languages: those people always bitch about and those nobody uses. -- Bjarne...
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na dinokino
Jan Vargovský:18.4.2015 17:24
TridaProZasobnik (TridaProZasobnik a){
    zasobnik=new char[a.zasobnik.length];
    for(int i=0;i<a.zasobnik.length;i++){
        zasobnik[i]=a.zasobnik[i];
    }
    indexvloz = a.indexvloz;
    indexvyzvedni = a.indexvyzvedni;
}

Btw, u zasobníku je zbytečné si držet 2 indexy, když stejně vždycky můžeš pracovat jen s jedním.

 
Nahoru Odpovědět
18.4.2015 17:24
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.