Avatar
dinokino
Člen
Avatar
dinokino:

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:

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
Inspiration is for amateurs - I just get to work.
Avatar
Odpovídá na dinokino
Petr Štechmüller:

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:

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:

Vyfocený výstup (obrázek)

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

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í
+1 bodů
Řešení problému
Nahoru Odpovědět 18.4.2015 17:21
Inspiration is for amateurs - I just get to work.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na dinokino
Jan Vargovský:
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.