Klammern einlesen!!! Falsche Ausgabe!!!!

Status
Nicht offen für weitere Antworten.

cris12388

Mitglied
Hallo Leute,

anbei die Aufgabenstellung:

Schreiben Sie mit Hilfe eines Stacks ein Programm, das einen Ausdruck auf korrekte Klammerung testet; dabei sollen die Klammern ()[]{} berücksichtigt werden.

Das Programm habe ich schon aber er gibt die falsche Ausgabe aus:
Es werden, glaube ich die richtigen Klammern irgendwie auf ungleichheit geprüft.

Java:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Part2 {

    public static void main(String[] args) {
        Stack <Character> stack = new Stack<Character>(50);    //Erstelle Feld mit 50 Eintträgen(Character)
        File file = new File(    //Erstelle neue File Datei
                "C:\\Users\\...\\Person.java");
        FileReader reader = null;    //Setze die Filereader Datei auf null
        try {
            reader = new FileReader(file);    //Datei übergeben
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        int ende = 0;    
        int reihe = 1;
        char sign;
        char vergleicheSign = 1;

        for (;;) {    //Endlosschleife
            try {
                ende = reader.read(); //Datei einlesen

                if (ende == -1) {
                    System.out.println("Dateiende");
                    break;
                }
                sign = (char) ende;  //Umwandlung in Char
                switch (sign) {
                case ('['):
                    stack.push(sign); // Klammer wird in Stack eingefügt
                    break;
                case ('('):
                    stack.push(sign);  // Klammer wird in Stack eingefügt
                    break;
                case ('{'):
                    stack.push(sign);  // Klammer wird in Stack eingefügt
                    break;
                case (']'):
                    if (stack.isEmpty()) { //Wenn Stack leer ist, spring zur Methode keinPaar
                        keinPaar(reihe, sign);
                    } else {
                        vergleicheSign = stack.pop(); // löscht das oberste Element
                        if (vergleicheSign != '{') { // Wenn keine schließende Klammer, spring zur Methode fehlerInKlammer
                            fehlerInKlammer(reihe, sign, vergleicheSign);
                        }
                    }
                    break;
                case (')'):
                    if (stack.isEmpty()) {    //Wenn Stack leer ist, Methode keinPaar
                        keinPaar(reihe, sign);
                    } else {
                        vergleicheSign = stack.pop(); //VergleicheSign bzw. pop die Klammer nicht enthält, Methode fehlerInKlammer
                        if (vergleicheSign != '(') {
                            fehlerInKlammer(reihe, sign, vergleicheSign);
                        }
                    }
                    break;
                case ('}'):
                    if (stack.isEmpty()) {    //Wenn Stack leer ist, Methode keinPaar
                        keinPaar(reihe, sign);
                    } else {
                        vergleicheSign = stack.pop();    //VergleicheSign bzw. pop die Klammer nicht enthält, Methode fehlerInKlammer
                        if (vergleicheSign != '[') {
                            fehlerInKlammer(reihe, sign, vergleicheSign);
                        }
                    }
                    break;
                case ('\n'): //Zeile wird hochgezählt
                    reihe++;
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (stack.isFull()) {    //Wenn Stack voll
            System.out.println("Stack voll");
        }
        if (!stack.isEmpty()) {    //Wenn Stack nicht leer ist
            for (;;) {
                if (stack.isEmpty()) { //Wenn Stack leer ist, Abbrechen
                    break;
                }
                vergleicheSign = stack.pop();    //vergleicheSign erhält den Wert von pop
                switch (vergleicheSign) {        //
                case '[':
                    schließendeKlammer(']');
                    break;
                case '(':
                    schließendeKlammer(')');
                    break;
                case '{':
                    schließendeKlammer('}');
                    break;
                }
            }
        }
    }

    public static void keinPaar(int reihe, char sign) {
        System.out.println("Zu der Klammer " + sign + " in der Zeile " + reihe
                + " fehlt die dazu passende Klammer.\n");
    }

    public static void fehlerInKlammer(int reihe, char sign, char vergleicheSign) {
        System.out.println("In der Zeile " + reihe + " passen die Klammern "
                + vergleicheSign + " " + sign + " nicht zusammen.\n");
    }

    public static void schließendeKlammer(char klammer) {
        System.out.println("Die schließende Klammer " + klammer + " fehlt");
    }
}

AUSGABE:

Code:
In der Zeile 11 passen die Klammern [ ] nicht zusammen.

In der Zeile 16 passen die Klammern { } nicht zusammen.

In der Zeile 19 passen die Klammern { } nicht zusammen.

In der Zeile 22 passen die Klammern { } nicht zusammen.

In der Zeile 25 passen die Klammern { } nicht zusammen.

In der Zeile 28 passen die Klammern { } nicht zusammen.

In der Zeile 31 passen die Klammern { } nicht zusammen.

In der Zeile 34 passen die Klammern { } nicht zusammen.

In der Zeile 37 passen die Klammern { } nicht zusammen.

In der Zeile 42 passen die Klammern { } nicht zusammen.

In der Zeile 44 passen die Klammern { } nicht zusammen.

Dateiende

Bin mit meinem (Java-)Latein am Ende!!!

Bitte um Unterstützung.

MfG
cris
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
eine Testdatei wäre doch von essentieller Bedeutung, findest du nicht?
weitere 44 Zeilen wären aber viel, versuche, ein einfaches Beispiel, am besten nur eine Zeile zu finden,
kürze einfach Mittelteile aus deiner Datei,
wenn nicht dann nicht,

am besten auch auf die Datei ganz verzichten und den Teststring als String ins Programm einbauen,
der Zugriff ist dann mit charAt() oder char[] bisschen anders als Reader, aber darauf kommt es wohl nicht an,

dazu noch den Code schön als [ java] [/ java ] codieren und ein bisschen erzählen, was das Programm im ganzen ungefähr macht,
dann wird da jemand was finden
 

0x7F800000

Top Contributor
1) bitte [noparse]
Java:
-tags[/noparse] verwenden, diese smileys mitten im code stinken, formatierung geht so auch verloren
2)
Java:
		File file = new File( // Erstelle neue File Datei
				"C:\\Users\\...\\Person.java");
gehts noch? :eek::autsch:

3)
Java:
		for (;;) { // Endlosschleife
			try {
				ende = reader.read(); // Datei einlesen

				if (ende == -1) {
					System.out.println("Dateiende");
					break;
				}
das ist viel zu umständlich und unverständlich... unendlichschleifen die mit break rausgebrochen werden, obwohl gar kein grund für solchen hack da ist: nee... lieber nicht :noe:

4) Bei 50000 Milliarden case-fällen schreibst du dauernd dasselbe hin... Wieso? Monotone gleichartige Arbeit kann der rechner auch ohne dich wunderbar verrichten, brauchst dir da gar nicht die finger wundzutippen... Ich hab mir mal erlaubt das ganze etwas zu verkürzen:
Java:
import java.io.*;
import java.util.*;
import javax.swing.*;

public class _ {
	public static void main(String[] args) {
		LinkedList<Character> stack = new LinkedList<Character>();
		
		JFileChooser chooser=new JFileChooser();
		chooser.showOpenDialog(null);
		
		//File file = new File("C:\\Users\\0x7F800000\\Desktop\\brackets.txt");
		File file=chooser.getSelectedFile();
		BufferedReader reader=null;
		try {
			reader = new BufferedReader(new FileReader(file));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.exit(1);
		}
		

		Map<Character,Character> bracketPairs=new HashMap<Character,Character>();
		bracketPairs.put('}','{');
		bracketPairs.put(')','(');
		bracketPairs.put(']','[');
		bracketPairs.put('>','<');
		
		int zeile = 1;
		char sign,vergleicheSign;
		String line;
		
		try{
			while((line=reader.readLine())!=null){
				for(int i=0; i<line.length(); i++){
					
					sign=line.charAt(i);
					if(bracketPairs.values().contains(sign)){
						//linke klammer eingelesen
						//auf den stack pushen
						stack.push(sign); 
					}else if(bracketPairs.keySet().contains(sign)){
						//rechte klammer eingelesen
						if(stack.isEmpty()){
							//nichts auf dem stack, klammer zuviel
							keinPaar(zeile,i, sign);
						}else{
							//prüfen, ob die klammer auf dem stack zur eingelesenen klammer passt
							if(!bracketPairs.get(sign).equals(vergleicheSign = stack.pop())){
								fehlerInKlammer(zeile,i, sign, vergleicheSign);
							}
						}
					}else{
						System.out.println("unbekanntes zeichen "+sign);
					}
				}
				zeile++;
			}			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		if (!stack.isEmpty()) {
			schließendeKlammer(stack.pop());
		}
	}

	public static void keinPaar(int reihe, int spalte, char sign) {
		System.out.println("Zu der Klammer " + sign + " (zeile " + reihe+",spalte "+spalte+")"
				+ " fehlt die dazu passende Klammer.\n");
	}

	public static void fehlerInKlammer(int reihe,  int spalte, char sign, char vergleicheSign) {
		System.out.println("In"+"(zeile " + reihe+",spalte "+spalte+")"+ " passen die Klammern "
				+ vergleicheSign + " " + sign + " nicht zusammen.\n");
	}

	public static void schließendeKlammer(char klammer) {
		System.out.println("Die schließende Klammer für " + klammer + " fehlt");
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Eckige Klammern werden nicht erkannt Java Basics - Anfänger-Themen 1
J Klammern werden fälschlicherweise eingelesen Java Basics - Anfänger-Themen 2
T split innerhalb Klammern ignorieren? Java Basics - Anfänger-Themen 6
S Java Text splitten mit Tabs, Zeilen, Zeichen und Klammern. Java Basics - Anfänger-Themen 6
D Werte in eckige Klammern finden Java Basics - Anfänger-Themen 3
D Compiler-Fehler kurze Frage (Fehler): runde Klammern im Println Java Basics - Anfänger-Themen 3
B Java - Reguläre Ausdrücke - RegEx oder Regular Expressions - Eckige Klammern Java Basics - Anfänger-Themen 2
F while Schleife ohne Klammern Java Basics - Anfänger-Themen 9
N enum vergleiche Klammern? Java Basics - Anfänger-Themen 5
K Erste Schritte Geschweifte Klammern Java Basics - Anfänger-Themen 12
H Nur Zahlen, Klammern und Operatoren Java Basics - Anfänger-Themen 3
R alleinstehende geschweifte Klammern Java Basics - Anfänger-Themen 5
H Wohlgeformte Klammern Java Basics - Anfänger-Themen 26
M keine geschwungenen Klammern Java Basics - Anfänger-Themen 9
B Text zwischen geschweiften klammern Java Basics - Anfänger-Themen 11
B bestimmte klammern im string ersetzten Java Basics - Anfänger-Themen 17
B Klammern im String Java Basics - Anfänger-Themen 9
T Syntax für .split mit Klammern Java Basics - Anfänger-Themen 2
E Regex für geschweifte Klammern? Java Basics - Anfänger-Themen 10
StrikeTom Per regex string zwischen klammern raussuchen Java Basics - Anfänger-Themen 14
Luk10 Wo zum Teufel fehlen Hier Klammern? Java Basics - Anfänger-Themen 2
K println - Klammern von Operationen Java Basics - Anfänger-Themen 4
W Suche nach strings zwischen eckigen Klammern mittels regulärer Ausdrücke Java Basics - Anfänger-Themen 3
D Klammern in regulären Ausdrücken Java Basics - Anfänger-Themen 2
Developer_X Problem mit Klammern im Code Java Basics - Anfänger-Themen 17
Daniel_L Geschweifte Klammern nutzen oder nicht? Java Basics - Anfänger-Themen 3
M Wie ersetzt man einen String mit eckigen Klammern Java Basics - Anfänger-Themen 5
E Irgendwo fehlen Klammern ? Java Basics - Anfänger-Themen 6
B Was steht innerhalb von solchen <.> Klammern Java Basics - Anfänger-Themen 2
H Klammern bei replaceAll-Methode Java Basics - Anfänger-Themen 3
W Problem mit Programm (geschweifte Klammern setzen) Java Basics - Anfänger-Themen 11
E Klammern in einem String entfernen! Java Basics - Anfänger-Themen 4
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
S SeriellenPort einlesen Java Basics - Anfänger-Themen 3
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
julian0507 Wörter einlesen lassen und rückwärts ausgeben Java Basics - Anfänger-Themen 7
S JSON einlesen und benutzen Java Basics - Anfänger-Themen 5
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
I Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date" Java Basics - Anfänger-Themen 16
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
sserio Txt Datei einlesen Java Basics - Anfänger-Themen 9
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
G JSP Textfeld einlesen Java Basics - Anfänger-Themen 2
M Einlesen > new Leser Java Basics - Anfänger-Themen 5
W Werte durch Konsole einlesen Java Basics - Anfänger-Themen 10
A Array einlesen und ausgeben Java Basics - Anfänger-Themen 13
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
S Wort einlesen Array ausgeben Java Basics - Anfänger-Themen 4
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
S CSV einlesen und mit Komma trennen Java Basics - Anfänger-Themen 12
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
I Java-Wort einlesen und ausgeben Java Basics - Anfänger-Themen 7
J Csv-Datei einlesen Java Basics - Anfänger-Themen 52
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
L Datein einlesen Java Basics - Anfänger-Themen 1
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 32
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
A Input/Output Dateien einlesen und ausgeben Java Basics - Anfänger-Themen 7
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
A Textdatei mit stream einlesen Java Basics - Anfänger-Themen 2
P Datei einlesen und zurückgeben Java Basics - Anfänger-Themen 5
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
M String in Scanner einlesen Java Basics - Anfänger-Themen 6
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
M Einzelzeichen einlesen Java Basics - Anfänger-Themen 2
C (char) Array einlesen Java Basics - Anfänger-Themen 8
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
E Einteilung der Räume mit einlesen einer .txt datei Java Basics - Anfänger-Themen 16
P Array einlesen von Konsole Java Basics - Anfänger-Themen 8
D Eingaben in String Array einlesen Java Basics - Anfänger-Themen 12
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
R Compiler-Fehler Einlesen von Konsolenparameter funtioniert nichtmehr Java Basics - Anfänger-Themen 4
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
H Einlesen Java Basics - Anfänger-Themen 8
H Einlesen von Zahlen Java Basics - Anfänger-Themen 20
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
R txt Einlesen und Verarbeiten Java Basics - Anfänger-Themen 15
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben