» »

[NALOGA][JAVA] oklepaji - skladi

[NALOGA][JAVA] oklepaji - skladi

bijonda ::

Pomoc pri oklepajih. Ne vem kaj naj popravim, da mi bo koda pravilno delala. Ne vraca mi kakor bi mo moglo. Za (((())))"znak za manjse" "oglati zaklepaj"[] je odgovor NAPAČEN! Glede na pravila, je pravi odgovor (((())))"znaka za manjse in vecje kako treba"[].

Spodaj so vsi potrebni programi!.

#############################
Moj razred:
/* 11.Domaca naloga - Oklepaji
   Sestavimo metodo popraviIzraz, ki popravi napacno grajen izraz ter vrne pravilno zgrajenega.
   Pomagamo si s tremi pravili:
   i) ce naletimo na zaklepaj, pred katerim ni bilo nobenega predklepaja, ga preskocimo
   ii) ce naletimo na zaklepaj, ki zakljucuje napacen predklepaj, ga nadomestimo s pravilnim zaklepajem
   iii) ce je po koncu izraza ostal se kaksen predklepaj nezakljucen, jih zapremo

*/

public class Naloga11 {
  public static String popraviIzraz(String izraz, DovoljeniOklepaji oklepaji) throws Exception {
    String noviNiz = "";
    Sklad<Oklepaj> s = new Sklad<Oklepaj>();
    Oklepaj o = new Oklepaj();
    for(int i = 0; i < izraz.length(); i++) {
      char znak = izraz.charAt(i);
      try {
        o = oklepaji.vrniOklepaj(znak);
      }
      catch(Exception ex) { // spregledamo znak
      }
      if(o.vrniPredklepaj() == znak) {
        noviNiz = noviNiz + znak;
        s.vstavi(o);
      }
      else {
        if(s.prazen()) { }
        else if(s.vrh().vrniZaklepaj() != znak) {
          noviNiz = noviNiz + s.vrh().vrniZaklepaj();
          s.odstrani();
        }
      }
    }

    while(!s.prazen()) {
      noviNiz = noviNiz + s.vrh().vrniZaklepaj();
      s.odstrani();
    }
    return noviNiz;
  }
}



#####################################
Dodatni razredi:

/**
 * Summary description for DovoljeniOklepaji.
 */
public class DovoljeniOklepaji
{
	Oklepaj[] tabelaOklepajev;

	public DovoljeniOklepaji()
	{
		tabelaOklepajev = null;
	}

	public DovoljeniOklepaji(Oklepaj[] oklepaji) 
	{
		this.tabelaOklepajev = (Oklepaj[])oklepaji.clone();
	}

	public Oklepaj vrniOklepaj(char znak) throws Exception 
	{
		if(tabelaOklepajev == null)
			throw new Exception("Tak oklepaj ne obstaja");

		for(int i=0; i<tabelaOklepajev.length; i++) 
		{
			if(tabelaOklepajev[i].vrniPredklepaj() == znak || tabelaOklepajev[i].vrniZaklepaj() == znak) 
			{
				return tabelaOklepajev[i];
			}
		}
		throw new Exception("Tak oklepaj ne obstaja");
	}


	public Oklepaj vrniPredklepaj(char znak) throws Exception
	{
		if(tabelaOklepajev == null)
			throw new Exception("Tak oklepaj ne obstaja");

		for(int i=0; i<tabelaOklepajev.length; i++) 
		{
			if(tabelaOklepajev[i].vrniPredklepaj() == znak) 
			{
				return tabelaOklepajev[i];
			}
		}
		throw new Exception("Tak oklepaj ne obstaja");
	}


	public Oklepaj vrniZaklepaj(char znak) throws Exception
	{
		if(tabelaOklepajev == null)
			throw new Exception("Tak oklepaj ne obstaja");

		for(int i=0; i<tabelaOklepajev.length; i++) 
		{
			if(tabelaOklepajev[i].vrniZaklepaj() == znak) 
			{
				return tabelaOklepajev[i];
			}
		}
		throw new Exception("Tak oklepaj ne obstaja");
	}
}




ublic class Oklepaj
{
	private char predklepaj;
	private char zaklepaj;

	public Oklepaj() 
	{
		predklepaj = '(';
		zaklepaj = ')';
	}

	public Oklepaj(char predklepaj, char zaklepaj) throws Exception
	{
		this();
		if(predklepaj != zaklepaj)  
		{
			this.nastaviPredklepaj(predklepaj);
			this.nastaviZaklepaj(zaklepaj);
		}
		else throw new Exception("Predklepaj in zaklepaj morata biti razlicna znaka");
	}


	public void nastaviPredklepaj(char predklepaj) throws Exception 
	{
		if(this.zaklepaj != predklepaj)
			this.predklepaj = predklepaj;
		else 
			throw new Exception("Predklepaj in zaklepaj morata biti razlicna znaka");
	}


	public void nastaviZaklepaj(char zaklepaj)  throws Exception
	{
		if(this.predklepaj != zaklepaj)
			this.zaklepaj = zaklepaj;
		else 
			throw new Exception("Predklepaj in zaklepaj morata biti razlicna znaka");
	}


	public char vrniPredklepaj() 
	{
		return this.predklepaj;
	}

	public char vrniZaklepaj() 
	{
		return this.zaklepaj;
	}

}



############################3
ter se testni program
public class TestniProgram {
  public static void main(String[] argc) throws Exception {
    char[] predklepaji = {'(', '<', '[', '{'};
    char[] zaklepaji = {')', '>', ']', '}'};
    Oklepaj[] tabelaOklepajev = new Oklepaj[predklepaji.length];
    
    for(int i=0; i<predklepaji.length; i++)
      tabelaOklepajev[i] = new Oklepaj(predklepaji[i], zaklepaji[i]);
    
    DovoljeniOklepaji oklepaji = new DovoljeniOklepaji(tabelaOklepajev);
    String[] testniNizi = {"(a + b)[c)", ")(]{[", "((((a + b))))", "((((a+b))", "][", "]]]"};
    
    for(String niz : testniNizi) {
      if(preveriIzraz(niz, oklepaji)) {
        System.out.println("Izraz " + niz + " je pravilen");
      }
      else {
        System.out.println("Izraz " + niz + " ni pravilen!");
        System.out.println("Popravljen izraz se glasi: " + popraviIzraz(niz, oklepaji));
      }
    }
  }
  
  public static String popraviIzraz(String izraz, DovoljeniOklepaji oklepaji) throws Exception {
    String noviNiz = "";
    Sklad<Oklepaj> s = new Sklad<Oklepaj>();
    Oklepaj o = new Oklepaj();
    for(int i = 0; i < izraz.length(); i++) {
      char znak = izraz.charAt(i);
      try {
        o = oklepaji.vrniOklepaj(znak);
      }
      catch(Exception ex) { // spregledamo znak
      }
      if(o.vrniPredklepaj() == znak) {
        noviNiz = noviNiz + znak;
        s.vstavi(o);
      }
      else {
        if(s.prazen()) { }
        else if(s.vrh().vrniZaklepaj() != znak) {
          noviNiz = noviNiz + s.vrh().vrniZaklepaj();
          s.odstrani();
        }
      }
    }
    
    while(!s.prazen()) {
      noviNiz = noviNiz + s.vrh().vrniZaklepaj();
      s.odstrani();
    }
    return noviNiz;
  }
  
  public static boolean preveriIzraz(String izraz, DovoljeniOklepaji oklepaji) throws Exception {
    Sklad<Oklepaj> s = new Sklad<Oklepaj>();
    Oklepaj o = new Oklepaj();
    for(int i=0; i<izraz.length(); i++) {
      char znak = izraz.charAt(i);
      try {
        o = oklepaji.vrniOklepaj(znak);
      }
      catch(Exception ex) {
      }
      if(o.vrniPredklepaj() == znak) {
        s.vstavi(o);
      }
      else {
        if(s.prazen())
          return false;
        if(s.vrh().vrniZaklepaj() != znak) 
          return false;
        s.odstrani();
      }
    }
    return s.prazen();
  }
}

@LOL ::

LOL dej ti kar odpri eno centralno temo za reševanje teh problemov, ne pa vsak dan svojo za vsako nalogo posebej;)

bijonda ::

PO resnisi povedano. Jaz teh naloge ne bi vec rada delala in vam morila!
Samo mene prfoks mori in ste zadnji ki mi lahko pomagate, ker se ze sama matram kak mesec, ce ne ze dle.
Se opravicujem, ce morim.
:8)

darkolord ::

Hm, jaz te čist nič ne zastopim, kaj hočeš narest oziroma kaj te muči. Pa kaj so tej (((())))) []. Dvomim da te ostali kaj bolj razumejo

bond007 ::

Nop, nič kaj bolje:) . Sem se pa potrudil, pa 3krat prebral. Ampak ne zastopim, kaj želi povedati. Punca ti samo navodilo naloge prilepi, ki ti ga je dal "prfoks". Tko bo še najbolj razumljivo...

bijonda ::

Navodila naloge!!! Upam da vam bo zdaj bolj razumljivo. Priznam, sem cudno napisala in zedeno! :'(

Sestavi metodo public static String popraviIzraz(String izraz, DovoljeniOklepaji oklepaji), ki "popravi" napačno grajen izraz ter vrne pravilno zgrajenega. Pri tem naj se posluži treh pravil:
če naleti na zaklepaj, pred katerim ni bilo nobenega predklepaja, naj ga preskoči. Primer: v nizu "())" naj zadnji zaklepaj preskoči.
če naleti na zaklepaj, ki zaključuje napačen predklepaj, naj ga nadomesti s pravilnim zaklepajem. Primer: v nizu "< tu pride predklepaj>>" naj prvi znak '>' nadomesti z znakom ')', tako da dobimo niz "< tu pride oklepaj >".
če je po koncu izraza ostal še kakšen predklepaj nezaključen, naj jih zapre. Primer: v nizu < tu je oklepaj manjka zaklepaj >, ki ga dodamo na konec niza, tako da dobimo "< manjka oklepaj>".
Primeri: (dovoljeni oklepaji so (,), znak za manjse, znak za vecje, [, ], {, }
(a + b)[c) ---> (a + b)[c]
)(]{[ ---> (){[]}
((((a + b)))) ---> ((((a + b))))
((((a + b)) ---> ((((a + b))))
][ ---> []
]]] ---> .. prazen niz ..

P.S. nekje sem morala z besedno napisati kaj manjka, ker mi potem javlja napako nedovoljena html oznako.

Genetic ::

import java.util.*;

public class Main {

	public static void main(String[] args) {
		for (int i = 0; i< args.length; ++i)
		{
			String izraz = args[i];
			String popravljen_izraz = Oklepaji.popraviIzraz(izraz);
			System.out.println(izraz + " -> " + popravljen_izraz);
		}
	}
}

class Oklepaji {
	private static final String oklepaji = "()[]{}<>";

	//znak je predklepaj, ce je na sodem mestu v stringu oklepajev
	public static boolean jePredklepaj(char znak)
	{
		int idx = oklepaji.indexOf(znak);
		return (idx >= 0 && idx%2 == 0);
	}

	//znak je zaklepaj, ce je na lihem mestu v stringu oklepajev
	public static boolean jeZaklepaj(char znak)
	{
		int	idx = oklepaji.indexOf(znak);
		return (idx >= 0 && idx%2 == 1);
	}

	//vrni predklepaj podanemu zaklepaju
	public static char vrniPredklepaj(char znak)
	{
		if (jeZaklepaj(znak))
			return oklepaji.charAt(oklepaji.indexOf(znak) - 1);
		else
			return 0;
	}

	//vrni zaklepaj podanemu predklepaju
	public static char vrniZaklepaj(char znak)
	{
		if (jePredklepaj(znak))
			return oklepaji.charAt(oklepaji.indexOf(znak) + 1);
		else
			return 0;
	}

	public static String popraviIzraz(String izraz)
	{
		Stack<Character> skladPredklepajev = new Stack<Character>();
		StringBuffer nov_izraz = new StringBuffer();
		for (int i = 0; i < izraz.length(); ++i)
		{
			char znak = izraz.charAt(i);
			// daj predklepaj na sklad in v nov izraz
			if (jePredklepaj(znak))
			{
				skladPredklepajev.push(znak);
				nov_izraz.append(znak);
			}
			// delo s prebranim zaklepajem
			else if (jeZaklepaj(znak))
			{
				//ignoriraj zaklepaj, ce ni prej nobenega predklepaja na skladu
				if (skladPredklepajev.empty()) 
				{
				} 
				//zaklepaj je enak ali pa ni enak tistemu na skladu, 
				//v vsakem primeru izpisi tistega, ki je na skladu
				else
				{
					nov_izraz.append(vrniZaklepaj(skladPredklepajev.pop()));
				}
			}	 
			//ni ne predklepaj ne zaklepaj, dodaj v nov izraz
			else
			{
				nov_izraz.append(znak);
			}
		}
		//poglej se vse predklepaje na skladu in izpisi ustrezne zaklepaje
		while (!skladPredklepajev.empty())
			nov_izraz.append(vrniZaklepaj(skladPredklepajev.pop()));
		return nov_izraz.toString();
	}
}


Se rezultati:

)(]{[ -> (){[]}
((((a + b)))) -> ((((a + b))))
((((a + b)) -> ((((a + b))))
][ -> []
]]] ->

bijonda ::

Hvala za vse! Samo jaz jo rabim s skladi! Bom vsaj idejo vzela!

Genetic ::

Popravljena tvoja metoda popraviIzraz (primerjaj s svojo). Podobno popravi preveriIzraz.

  public static String popraviIzraz(String izraz, DovoljeniOklepaji oklepaji) throws Exception {
    String noviNiz = "";
    Sklad<Oklepaj> s = new Sklad<Oklepaj>();
    Oklepaj o = null;
    for(int i = 0; i < izraz.length(); i++) {
      char znak = izraz.charAt(i);
      try {
        //ce znak ni oklepaj, gre v catch
        o = oklepaji.vrniOklepaj(znak);
        //znak je predklepaj
        if(o.vrniPredklepaj() == znak) {
          noviNiz = noviNiz + znak;
          s.vstavi(o);
        }
        //znak je zaklepaj
        else {
          if(s.prazen()) { }
          else //if(s.vrh().vrniZaklepaj() != znak) {
          {
            noviNiz = noviNiz + s.vrh().vrniZaklepaj();
            s.odstrani();
          }
        }
      } // konec try
      catch(Exception ex) { // spregledamo znak
        //ampak ker ni oklepaj, ga dodamo v nov niz
        noviNiz = noviNiz + znak;
      }
    }
    
    while(!s.prazen()) {
      noviNiz = noviNiz + s.vrh().vrniZaklepaj();
      s.odstrani();
    }
    return noviNiz;
  }

bijonda ::

Ej kaj pa si ti da obvladas javo?

Genetic ::

Sem pac v takem fohu :) (sicer trenutno bolj C++ in C#, ampak...)

Zgodovina sprememb…

  • spremenil: Genetic ()

bijonda ::

Kaj si programer v kaki veliki firmi?
Koliko casa pa se ze ukvarjas s tem, da obvladas? Si kak faks koncala ali si samouk?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Kalkulator

Oddelek: Programiranje
111328 (1095) lebdim
»

osnove v Javi - zvezdice

Oddelek: Programiranje
403575 (2797) Tutankhamun
»

[c++] stil kodiranja, informativno

Oddelek: Programiranje
171942 (1758) CCfly
»

Coding Style

Oddelek: Programiranje
433470 (2662) 64202

Več podobnih tem