# ersetzungen



## da*vinci (19. Dez 2005)

hallo!

ich muss für mein studium folgende aufgabe lösen: 
es werden beliebig viele Zeichenketten eingelsen, wobei eine gültig eingabe aus einer "start-zeichenkette" gefolgt von "zeichenketten-paaren" besteht.
die vorkommen der zweiten zeichenkette in der ersten werden durch die dritte zeichenkette ersetzt - die dadurch erhaltene zeichenkette ist die neue erste zeichenkette die nächste zweite und dritte zeichenkette liest man wiederum ein. also schaut das ganze dann so aus:

in: hallo ll mm mm nn
out: 1 1 hanno

wobei die zwei einser davor für die jeweilige anzahl der ersetzungen in jedem schritt stehen!

ich hab das ganze so gelöst - es funktioniert aber nicht so richtig!! bitte helft mir!!

danke! gruß da*vinci

ach ja das eprog-packet muss ich verwenden



```
import eprog.*;
import java.util.*; 

public class Replace {
	
	public static void main(String agrs[]) {
	
		String zeichen1=""; //erste Zeichenkette
		String zeichen2=""; //zweite Zeichenkette
		String zeichen3=""; //dritte Zeichenkette
		String ausgabe=""; //Zeichenkette mit Ersetzungen
		int anzahl=2; //Anzahl der einzulesenden Zeichenketten
		int count=0; //Anzahl der Ersetzungen (temporär)
		int index=-1; //Position beim Abzählen der Ersetzungen
		Vector<Integer> counter = new Vector<Integer>(); // Anzahl der Ersetzungen

	
		try {
			zeichen1 = EprogIO.readWord(); //erstes Wort wird eingelesen
			
			if (anzahl==2) {	//wenn anzahl auf 2 steht.....					
				zeichen2 = EprogIO.readWord();		//.... wird die zweite Zeichenkette eingelesen...
				anzahl=1;	//... danach wird anzahl auf 1 gestellt
			} 
			else if (anzahl==1) {	// wenn anzahl auf 1 steht ....					
				zeichen3 = EprogIO.readWord();	//... wird die dritte Zeichenkette eingelesen...		
				anzahl=2; //.... und danach anzahl auf 2 zurückgestellt um die nächsten Paare einlesen zu können
				if(zeichen1.contains(zeichen2)) { //wenn die erste Zeichenkette die zweite beinhaltet...
					ausgabe = zeichen1.replaceAll(zeichen2, zeichen3); //... werden die Vorkommen der zwieten Zeichenkette in der ertsen durch die dritte Zeichenkette ersetzt
				}
			}

			index = zeichen1.indexOf(zeichen2); //abzählen der Vorkommen der zweiten Zeichenkette in der ersten
			while(index >= 0) {
				++count;
				index += zeichen2.length(); 
				index = zeichen1.indexOf(zeichen2, index);
			}
					
			counter.add(count);		//Anzahl der Vorkommen in Vector abspeichern
			index = -1; 	//index zurück auf -1 setzen
		}
		catch (EprogEOFException e) { //wenn eine Exception auftritt ...
			EprogIO.println("?"); //... ein ? ausgeben
		}


		while (!EprogIO.isEOF()) {	// solange EOF nicht erreicht wird ...
			
			try {	

					if (anzahl==2) {		//wenn anzahl auf 2 steht				
						zeichen2 = EprogIO.readWord();	//.... wird die zweite Zeichenkette eingelesen...	
						anzahl=1;	//... danach wird anzahl auf 1 gestellt
					} 
					else if (anzahl==1) {	// wenn anzahl auf 1 steht ....						
						zeichen3 = EprogIO.readWord();	//... wird die dritte Zeichenkette eingelesen...	
						anzahl=2; 	//.... und danach anzahl auf 2 zurückgestellt um die nächsten Paare einlesen zu können
					}	
					if(ausgabe.contains(zeichen2)) { //wenn die bereits ersetzte Zeichenkette die neue zweite Zeichenkette beinhaltet...
						index = ausgabe.indexOf(zeichen2); //abzählen der Vorkommen der zweiten Zeichenkette in der ersten
						while(index >= 0) { 
							++count;
							index += zeichen2.length(); 
							index = ausgabe.indexOf(zeichen2, index);
						}
						//countArray[x++] = count;
						counter.add(count);	//Anzahl der Vorkommen in Vector abspeichern
						index = -1; //index zurück auf -1 setzen
					
						ausgabe = ausgabe.replaceAll(zeichen2, zeichen3); //.... werden die Vorkommen durch die neue dritte Zeichenkette ersetzt
					}
					
				}
				catch (EprogEOFException e) { //wenn eine Exception auftritt ...
					EprogIO.println("?"); //... ein ? ausgeben
				}					
		}
		
		EprogIO.println(counter+ " " +ausgabe);
	}
	
}
```


----------



## Lim_Dul (19. Dez 2005)

da*vinci hat gesagt.:
			
		

> hallo!
> ich hab das ganze so gelöst - es funktioniert aber nicht so richtig!! bitte helft mir!!
> 
> danke! gruß da*vinci


Meine Glaskugel ist in Reperatur. Was funktioniert nicht richtig?


----------



## da*vinci (19. Dez 2005)

also wenn ich jetzt z.b. mit dem input output paar test das ich oben schon erwähnt hab (hallo ll mm mm nn)
bekomm ich nicht 1 1 hanno sondern:
?
[1]

irgendwelche vorschläge??

gruß da*vinci


----------



## da*vinci (19. Dez 2005)

hab mich jetzt ein bissl herumgespielt und denke das problem liegt irgendwo bei den anzahl sachen!!


----------



## SlaterB (19. Dez 2005)

zweimal über längere Strecken der gleiche Code klingt sehr schlimm, 
gerade bei so komplexen Sachen wie dieser Bearbeitung,

keine Ahnung wann isEOF() true oder fals ergibt, aber funktioniert nicht stattdessen folgendes?:


```
try {
        ausgabe = EprogIO.readWord(); //erstes Wort wird eingelesen
         
      }
      catch (EprogEOFException e) { //wenn eine Exception auftritt ...
         EprogIO.println("?"); //... ein ? ausgeben
      }


      while (!EprogIO.isEOF()) {   // solange EOF nicht erreicht wird ...
         
         try {   

               if (anzahl==2) {      //wenn anzahl auf 2 steht            
                  zeichen2 = EprogIO.readWord();   //.... wird die zweite Zeichenkette eingelesen...   
                  anzahl=1;   //... danach wird anzahl auf 1 gestellt
               }
               else if (anzahl==1) {   // wenn anzahl auf 1 steht ....                  
                  zeichen3 = EprogIO.readWord();   //... wird die dritte Zeichenkette eingelesen...   
                  anzahl=2;    //.... 
               }   
               if(ausgabe.contains(zeichen2)) { //
                  index = ausgabe.indexOf(zeichen2); //
                  while(index >= 0) {
                     ++count;
                     index += zeichen2.length();
                     index = ausgabe.indexOf(zeichen2, index);
                  }
                  //countArray[x++] = count;
                  counter.add(count);   //Anzahl der Vorkommen in Vector abspeichern
                  index = -1; //index zurück auf -1 setzen
               
                  ausgabe = ausgabe.replaceAll(zeichen2, zeichen3); //.... 
               }
               
            }
            catch (EprogEOFException e) { //wenn eine Exception auftritt ...
               EprogIO.println("?"); //... ein ? ausgeben
            }               
      }
      
      EprogIO.println(counter+ " " +ausgabe);
   }
```

-------------

wozu eigentlich die Ausgabe von "?" bei Fehlern?, danach wird ja im Programm normal fortgefahren,
egal ob anzahl gerade auf 1 oder 2 oder was auch immer ist..,
falls das "?" für eine Neueingabe des Benutzers stehen soll dann sollte das in eine eigene Operation,



```
public static String liesZeichenKette() {
         while (!korrekt) {
            try/ catch { read }
         }
         return zeichenkette;
     }
```
spart dir auch die nervigen try/catches im Hauptprogramm

----------------

falls du derzeit für jeden Testdurchlauf die Strings selber eintipppen musst:
sowas läßt sich auch automatisieren, benutz doch einfach als Testdaten ein String[] {hallo, ll, mm, mm, nn}

geht auch mit einer Operation damit du das alternativ zu EprogIO.readWord() verwenden kannst:


```
public static boolean eof = false;
public static int index = -1;
public static String[] eingabe = {"hallo", ....};

public static String readWord() {
     index++;
     if (index < eingabe.length) {
         return eingabe[index];
     }  else {
         eof = true;
         return null; // or: throw Exception
     }
}

public static boolean isEOF {
     return eof;
}
```


----------

