TuringMaschine Fehler suchen

  • Themenstarter Themenstarter docciman
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
D

docciman

Gast
Hi,

habe versucht so was ähnliche wie eine Turing Maschine zu programmieren..nun geht sie soweit nicht...
:roll:

das erste ist das ich nicht verstehe warum mein Index auf 10 hochzählt ? er dart nicht höher als das IndexArray ded Startwortes zählen also ("1","1","1","M","1","=") 0-5, und nach dem ablauf wie ich es definiert habe in der klasse state dürfte er eignentlich auch nicht aus dem bereich tretten ?!...
also der index zählt auf 10, weil ich transition() 10 durchlaufen lasse
for(int r=0;r<10;r++){
State.transition();

aber das will ich ja nicht.

Bitte um Hilfe :bahnhof:

danke ..es sind 3 Klassen

Code:
import java.util.ArrayList;

public class Tape {
	
	static ArrayList band = new ArrayList();
	
	public Tape() {
				
				
				
				 
				      // Band mit den ersten Elementen füllen entspricht Startzustand der Tabelle !!
//		              nicht des Startwortes, diese ist in Turing definiert!!!
				
				      band.add("1");
				      band.add("1");
				      band.add("1");
				      band.add("R");
				      band.add("1");
				      
				      
	}
	
	
	
	}


// und nun die klasse State :







//Zustände ermitteln, und neue Zustände an neuen IndexPositionen setzten

public class State {
	
	private static String state;
	private static String stateHALT;
	
	public static int aIndex=0;
	
	private static boolean operation_HALT;
	
	// Aktuellen Zustand ermitteln und setzen!
	
	public static String current_State(){
		
		state="";
		
		
		if(Tape.band.get(0).equals("1")){
			
		   Tape.band.set(0,"1");
		   
		   state ="1";
		  }
		
		if(Tape.band.get(0).equals("2")){
			
			 Tape.band.set(0,"2");
		   state ="2";
		  }
		if(Tape.band.get(0).equals("3")){
			
			 Tape.band.set(0,"3");
		   state ="3";
		  }
		if(Tape.band.get(0).equals("4")){
			
			 Tape.band.set(0,"4");
		   state ="4";
		  }
		
	          
	  return state;
	  
	
	}
	
	
	   public static void transition(){
	   	//new Tape();
	   	
	   	current_State();
//	   	aIndex=0;
	   	
	   	
//	   	wenn State auf "1" ist dann 4 Möglichkeiten 
	   	
	   	            if (state.equals("1")){
	   	            	
	   	            		
	   	            	
	   	            
	   	            
	   	                      if(Tape.band.get(1).equals("1")){
	   	                     		
	   	                     		writeT("1");
	   	                     		aIndex++;//move("R");
	   	                     	Tape.band.set(0,"1");
	   	                     	current_State();
	   	                     	
	   	                     	
	   	                     
	   	                     				  }
	   	                     
	   	                   if(Tape.band.get(1).equals("M")){
					   	                 	
			   	                  			writeT("M");
				                     		aIndex++;//move("R");
				                     		Tape.band.set(0,"1");
				                     		current_State();			}
	   	                if(Tape.band.get(1).equals("_")){
						   	               	
										   	               writeT("_");
									                 		aIndex++;//move("R");
									                 		Tape.band.set(0,"1");
									                 		
									                 		current_State();
									                 		}
										   	               
						   	               
	   	             if(Tape.band.get(1).equals("=")){
									   	            	
											   	            		writeT("_");
										                    		aIndex--;//move("L");
										                    		Tape.band.set(0,"2");
										                    		current_State();
									   	            						}
									   	            
									   	            
									   	            
									   	            
									   	            
									   	            }
	   	            
	   	            
	   	            
//	   	 	   	wenn State auf "2" ist dann 2 Möglichkeiten 
	   	 	   	   	            
	   	            
	   	         if (state.equals("2")){
   	            	
   	            		
   	            	
   	            
   	            
   	                      if(Tape.band.get(1).equals("1")){
   	                     		
   	                     		writeT("=");
   	                     		aIndex--;//move("L");
   	                     	Tape.band.set(0,"3");
   	                     	current_State();
   	                     	
   	                     	
   	                     
   	                     				  }
   	                     
   	                   if(Tape.band.get(1).equals("M")){
				   	                 	
		   	                  			writeT("_");
			                     		aIndex--;//move("L");
			                     		state="HALT";
			                     		System.exit(0);
			                     		
			                     		IO.write("ENDE");
			                     		current_State();		
			                     		
   	                   						}
   	                  	            
								   	            
								   	            
								   	            
								   	            
								   	            }
//	   	      wenn State auf "3" ist dann 2 Möglichkeiten   
	   	         
	   	      if (state.equals("3")){
	            	
	            		
	            	
	            
	            
	                      if(Tape.band.get(1).equals("1")){
	                     		
	                     		writeT("1");
	                     	aIndex--;//	move("L");
	                     	Tape.band.set(0,"3");
	                     	current_State();
	                     	
	                     	
	                     
	                     				  }
	                     
	                   if(Tape.band.get(1).equals("M")){
			   	                 	
	   	                  			writeT("M");
		                     		aIndex--;//move("L");
		                     		Tape.band.set(0,"4");
		                     		
		                     		current_State();		
		                     		
	                   						}
	                  	            
							   	            
							   	            
							   	            
							   	            
							   	            }
			   	
//	   	      wenn State auf "4" ist dann 2 Möglichkeiten   
	   	         
	   	      if (state.equals("4")){
	            	
	            		
	            	
	            
	            
	                      if(Tape.band.get(1).equals("_")){
	                     		
	                     		writeT("_");
	                     	aIndex--;//	move("L");
	                     	Tape.band.set(0,"4");
	                     	current_State();
	                     	
	                     	
	                     
	                     				  }
	                     
	                   if(Tape.band.get(1).equals("1")){
			   	                 	
	   	                  			writeT("_");
		                     	aIndex++;// oder so 	move("R");
		                     	Tape.band.set(0,"1");
		                     		
		                     		current_State();		
		                     		
	                   						}
	                  	            
							   	            
							   	            
							   	            
							   	            
							   	            }
			   	
	   	            
	    
	     
	   
	   }
	   
	   
	   public static int move(String move){
	   	
	     if(move.equals("R")){
	     	
	     
	     	aIndex++;
	     	
	       }
	     
	     if(move.equals("L")){
	     	
	     
	       aIndex--;
	       }
	    return aIndex;
	    
	   }
	   public static int getIndex(){
	   	
	   return aIndex;
	   }
	   
	   public static void  writeT(String s){
			
	   	
	   	try {
			   
//	   		getIndex();
	   		
	   		
	   		Turing.startWort.set(aIndex,s);
			   	}
			   	
			   	catch  (Exception e){}
			                  }

}








// und noch die main Klasse :

import java.util.ArrayList;

public class Turing {

	
	
	       
	
	      static ArrayList startWort = new ArrayList();
	               
	  
	
	public static void main(String[] args)throws Exception {
	 	
	 	new Tape();
	 	
//		Startwort definieren
		
		 String [] ausKonsole={"1","1","1","M","1","="};
        
        
        /*Start Wort füllen */
        
        
        for(int i=0;i<ausKonsole.length;i++){
        	
        
        		startWort.add(ausKonsole[i]);
        		
        }
		
		//		Startwort ausgeben, dann 2. Position etc..
		for(int x=0;x<ausKonsole.length;x++){
	 		
	 		
			IO.write(""+startWort.get(x));
			
			
			
	 	}
		// an die zweite stelle rücken
		System.out.println();
	 	
	 //Transition starten
	
		
	for(int r=0;r<10;r++){	
		State.transition();
		
		//wieder das neue Wort ausgeben
		for(int x=0;x<ausKonsole.length;x++){
	 		
	 		
			IO.write(""+startWort.get(x));
			
			
			
	 	}
		System.out.println();
	}
		
		
		
		// Indexposition des Startwortes ausgeben 
		IO.write("\n die aktuelle IndexPos. von Start/End Wort  :  "+State.getIndex());
		
		
	 	
		
	}
	
	
}
 
BITTE: Formatiere deinen Code... ich kann da sehr schwer lesen was wo wie steht.....
 
docciman hat gesagt.:
das erste ist das ich nicht verstehe warum mein Index auf 10 hochzählt ? er dart nicht höher als das IndexArray ded Startwortes zählen also ("1","1","1","M","1","=") 0-5, und nach dem ablauf wie ich es definiert habe in der klasse state dürfte er eignentlich auch nicht aus dem bereich tretten ?!...
also der index zählt auf 10, weil ich transition() 10 durchlaufen lasse
for(int r=0;r<10;r++){
State.transition();

aber das will ich ja nicht.

Code:
	for(int r=0;r<10;r++){	
		State.transition();
		
		//wieder das neue Wort ausgeben
		for(int x=0;x<ausKonsole.length;x++){
	 		
	 		
			IO.write(""+startWort.get(x));
			
			
			
	 	}
		System.out.println();
	}

ich sehe nicht, wieso r nicht bis 10 laufen sollte.
die innere for schleife wird nicht den durchlauf der äußeren beenden nur
weil x = der länge ausKonsole ist
denn wenn das ding wieder zurückkehrt, wird x ja wieder auf 0 gesetzt!!
wenn du das nur einmal durchlaufen möchtest, nimm eine while schleife

Code:
for (....)
{
   while(x<ausKonsole.length)
    {
           ...
     }
}

- wenn du das nicht gemeint haben solltest, definiere deine Frage bitte deutlicher und
verständlicher
 
..danke

1. wie formatiert man einen Code ?
2. das problem ist wohl nicht ganz angekommen, die for Schleife ist nur dazu da um um es auf der Konsole 10 mal auszugeben.. die anzahl getIndex() bezieht sich auf die Klasse State dieses(aIndex) wird je nach Zeichen entweder erhöht oder erniedrigt ...ich hoffe es ist nun etwas deutlicher? :bahnhof:

danke
 
docciman hat gesagt.:
..danke

1. wie formatiert man einen Code ?

1. indem man zusammengehörige Teile so postet das man sie besser auseinanderhalten kann
2. indem man für das Problem unwichtigen code weglässt -sofern möglich
3. Viele leere Zeilen zwischen einzelnen Abschnitten sind im Code selbst nicht hilfreich

docciman hat gesagt.:
2. das problem ist wohl nicht ganz angekommen, die for Schleife ist nur dazu da um um es auf der Konsole 10 mal auszugeben.. die anzahl getIndex() bezieht sich auf die Klasse State dieses(aIndex) wird je nach Zeichen entweder erhöht oder erniedrigt ...ich hoffe es ist nun etwas deutlicher? :bahnhof:

danke


in welcher Zeile hat welche Variable einen Wert den sie nicht haben sollte

was ist dein Problem? Bitte beschreib doch ein bisschen was nicht stimmt.

Es ist einfach anstrengend den Code so da zu durchsuchen
Du solltest die einzelnen Klassen in unterschiedlichen Code-Tags unterbringen
;-)

gruß
apfelsine
 
Ich versteh ja ehrlich gesagt nicht ganz, wie man überhaupt solchen Code schreiben kann... aber formatiert sollte das so aussehen:

Code:
import java.util.ArrayList;

public class Tape {
	static ArrayList band = new ArrayList();
	
	public Tape() {
		// Band mit den ersten Elementen füllen entspricht Startzustand der Tabelle !!
		// nicht des Startwortes, diese ist in Turing definiert!!!

	      band.add("1");
	      band.add("1");
	      band.add("1");
	      band.add("R");
	      band.add("1");
	}
}

Code:
//Zustände ermitteln, und neue Zustände an neuen IndexPositionen setzten
public class State {
	private static String state;
	private static String stateHALT;
	
	public static int aIndex=0;
	private static boolean operation_HALT;
	
	// Aktuellen Zustand ermitteln und setzen!
	public static String current_State(){
		state="";
		
		if(Tape.band.get(0).equals("1")){
			Tape.band.set(0,"1");  
		   	state ="1";
		}
		
		if(Tape.band.get(0).equals("2")){
			Tape.band.set(0,"2");
			state ="2";
		}
		if(Tape.band.get(0).equals("3")){
			Tape.band.set(0,"3");
			state ="3";
		}
		if(Tape.band.get(0).equals("4")){
			Tape.band.set(0,"4");
			state ="4";
		}
		  
		return state;
	}
	
	public static void transition(){
		// new Tape();
	   	
		current_State();
		// aIndex=0;
	   	
	   	
		// wenn State auf "1" ist dann 4 Möglichkeiten 
	   	
		if (state.equals("1")){
			if(Tape.band.get(1).equals("1")){
				writeT("1");
				aIndex++;	
				// move("R");
				Tape.band.set(0,"1");
				current_State();
			}             
			if(Tape.band.get(1).equals("M")){
				writeT("M");
				aIndex++;
				// move("R");
				Tape.band.set(0,"1");
				current_State();
			}
			if(Tape.band.get(1).equals("_")){
				writeT("_");
				aIndex++;
				// move("R");
				Tape.band.set(0,"1");
				current_State();
			}
			if(Tape.band.get(1).equals("=")){
				writeT("_");
				aIndex--;
				// move("L");
				Tape.band.set(0,"2");
				current_State();
			}
		}
	   	            
            
		// wenn State auf "2" ist dann 2 Möglichkeiten 
		if (state.equals("2")){
			if(Tape.band.get(1).equals("1")){
				writeT("=");
   	                     	aIndex--;//move("L");
   	                     	Tape.band.set(0,"3");
   	                     	current_State();
			}
			if(Tape.band.get(1).equals("M")){
				writeT("_");
				aIndex--;
				// move("L");
				state="HALT";
				System.exit(0);
			                     		
				IO.write("ENDE");
				current_State();		
			}          	            
		}
		// wenn State auf "3" ist dann 2 Möglichkeiten   
	   	         
		if (state.equals("3")){
			if(Tape.band.get(1).equals("1")){
				writeT("1");
				aIndex--;
				// move("L");
	                     	Tape.band.set(0,"3");
	                     	current_State();
			}
			if(Tape.band.get(1).equals("M")){
				writeT("M");
				aIndex--;
				// move("L");
				Tape.band.set(0,"4");
				current_State();
			}
		}
			   	
		// wenn State auf "4" ist dann 2 Möglichkeiten   
		if (state.equals("4")){
			if(Tape.band.get(1).equals("_")){
				writeT("_");
				aIndex--;
				// move("L");
				Tape.band.set(0,"4");
				current_State();
			}
			if(Tape.band.get(1).equals("1")){
				writeT("_");
				aIndex++;
				// oder so 	move("R");
				Tape.band.set(0,"1");
				current_State();		
			}
		}
	}
	
	public static int move(String move){
		if(move.equals("R")){
			aIndex++;
		}
		if(move.equals("L")){
			aIndex--;
		}
		return aIndex;
	}

	public static int getIndex(){
		return aIndex;
	}

	public static void  writeT(String s){
		try {		   
			// getIndex();
			Turing.startWort.set(aIndex,s);
		}
		catch  (Exception e){}
		}
	}
Code:
import java.util.ArrayList;

public class Turing {
	static ArrayList startWort = new ArrayList();
	
	public static void main(String[] args)throws Exception {
		new Tape();	 	
		// Startwort definieren
		String [] ausKonsole={"1","1","1","M","1","="};
        
        	/*Start Wort füllen */
		for(int i=0;i<ausKonsole.length;i++){
			startWort.add(ausKonsole[i]);
		}

		// Startwort ausgeben, dann 2. Position etc..
			for(int x=0;x<ausKonsole.length;x++){
			IO.write(""+startWort.get(x));
		}

		// an die zweite stelle rücken
		System.out.println();
	 	
		//Transition starten
		for(int r=0;r<10;r++){	
			State.transition();
		
			//wieder das neue Wort ausgeben
			for(int x=0;x<ausKonsole.length;x++){
				IO.write(""+startWort.get(x));
			}
			System.out.println();
		}

		// Indexposition des Startwortes ausgeben 
		IO.write("\n die aktuelle IndexPos. von Start/End Wort  :  "+State.getIndex());
	}
}
 
..Hi Beni..
wie meinst du das, das ich so einen Code überhaupt schreiben kann?? Vielleicht kannst du mir ja Tipps geben wie ich es besser machen kann..

danke
 
Das bezog sich vorallem auf die Formatierung :wink:

Ich glaub da brauchst du keine Tipps, du siehst ja den Unterschied zwischen "meinem" Post, und deinem Code :wink:
 
also ... du machst 10 mal aIndex++;
und wunderst dich das am ende eine 10 herrauskommt?
wie soll denn auch was anderes herrauskommen wenn bei dir getState immer 1 ist?

if(Tape.band.get(0).equals("1")){
Tape.band.set(0,"1");
state ="1";

du fragst immer Tape.band.get(0) ab
das hat doch immer den gleichen wert!
nämlich 1!!!
also hat state immer den wert 1
also wird aIndex immer addiert und am ende kommt eben 10 dabei raus!

gleich beim ersten Mal überbügelst du auchnoch dein Tape indem du gleich
in der ersten if abfrage
Tape.band.set(0,"1"); machst.
irgendwie sehe ich überhaupt nicht wie da ein anderer Wert rauskommen soll
???:L
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben