Standardeingabe und korrekte Klammerung prüfen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Standardeingabe und korrekte Klammerung prüfen

    Hi Leude,

    ich übe gerade ein wenig Java für eine Klausur.

    folgende Problemstellung:
    - die eingabe an das prog wird zeichenweise von der standardeingabe gelesen
    - das prog prüft für jede eingabezeile, ob die klammerung in dieser zeile korrekt ist (das heist gleiche anzahl öffneender und schliessender klammern)
    - wenn keine korrekte klammerung gegeben ist, wird die zeilennr ausgegeben!
    Bsp:
    a * (b + c) - x)
    c * d * ( x* y)
    f(y) + g(x

    soll als ausgabe
    1
    3
    liefern da ja in zeile 1 und 3 fehler sind. hier mein bisheriger Code:

    Quellcode

    1. public class aufgabe1 {
    2. public static void main (String args[]) throws java.io.IOException {
    3. int einlesen = System.in.read();
    4. int oeffnende = 0;
    5. int schliessende = 0;
    6. int zeilennr = 1;
    7. int[] v = new int[5];
    8. while(einlesen != -1)
    9. {
    10. if ((char)einlesen == '(')
    11. {
    12. oeffnende++;
    13. }
    14. if ((char)einlesen == ')')
    15. {
    16. schliessende++;
    17. }
    18. if (oeffnende != schliessende)
    19. {
    20. for (int i =0; i < v.length; i++)
    21. {
    22. v[i] = zeilennr;
    23. }
    24. break;
    25. }
    26. if (einlesen == '\n')
    27. {
    28. zeilennr++;
    29. }
    30. oeffnende = 0;
    31. schliessende = 0;
    32. einlesen = System.in.read();
    33. }
    34. for (int j = 0; j < v.length; j++)
    35. {
    36. System.out.println(v[j]);
    37. }
    38. }
    39. }
    Alles anzeigen



    ich habe ein ganz grosses Problem die Ausgabe richtig hinzubekommen das heist nach Programmabbruch die 1 und die 3. wie ihr seht habe ich versucht, die zeilennr bei denen oeffnende ungleiche schliessende ist in ein array zu schreiben, und dieses array am ende auszugeben, dass fkt aber nicht! Wie kann ich das bewerkstelligen? brauch hilfe!

    gruss
    wurstel
  • Hi,
    das Programm liest in der Schleife Zeichen für Zeichen. Und du setzt oeffnende und schliessende bei jedem Schleifendurchlauf zurück. Also wird der Zähler nie über 1 gehen.
    Das gehört also alles in deine Zeilenende-Bedingung. So sollte es funktionieren:

    Quellcode

    1. if (einlesen == '\n') {
    2. zeilennr++;
    3. if (oeffnende != schliessende) {
    4. System.out.println(zeilennr);
    5. }
    6. oeffnende = 0;
    7. schliessende = 0;
    8. }


    Bei gutem Stil solltest du übrigens auch die CamelCase Notation einhalten. D.h. erster Buchstabe des Klassennamens groß.
    Die Variable v brauchst du nicht. Bzw. ich weiß nicht, was du damit überhaupt vor hattest.
  • Hi Leude,

    ich weiß ich nerve euch, da ich ein so einfaches Prog. nicht alleine hinkriege. Trotzdem frag ich nochmal nach. Also ich habe es fast fertig. Das einzige was mir noch nicht passt ist folgendes:
    wenn ich jetzt eine Zeile eingebe die ungleiche Mengen an Klammern erhält und danach enter drücke wird direkt in der nächsten Zeile die Zeilennr mit der ungleichen Klammernmenge angegeben.

    Bsp:
    ()
    (()
    2
    ()
    (())
    und so weiter...

    es ist aber so gewollt das die 2 und alle Zeilennr mit ungleichen KLammernmengen erst ganz am Ende nach Beendigung des Progs ausgegeben werden, also so:

    ()
    (()
    ()
    (())
    ()))
    <--prog ende -->
    2
    5

    Quellcode

    1. public class aufgabe1 {
    2. public static void main (String args[]) throws java.io.IOException {
    3. int einlesen = System.in.read();
    4. int oeffnende = 0;
    5. int schliessende = 0;
    6. int zeilennr = 0;
    7. while(einlesen != -1)
    8. {
    9. if ((char)einlesen == '(')
    10. {
    11. oeffnende++;
    12. }
    13. if ((char)einlesen == ')')
    14. {
    15. schliessende++;
    16. }
    17. if (einlesen == '\n') {
    18. zeilennr++;
    19. if (oeffnende != schliessende) {
    20. System.out.println(zeilennr);
    21. }
    22. oeffnende = 0;
    23. schliessende = 0;
    24. }
    25. einlesen = System.in.read();
    26. }
    27. }
    28. }
    Alles anzeigen


    habe mal versucht alle betroffenen zeilennr in ein aarray zu schrieben, und das array am ende auszugeben, aber da ging was falsch..
    Was muss ich am Code ändern? und denkt daran das ich nicht unbedingt eure Profi Hinweise verstehe, weil ich absolut kein Programmierer bin [Blockierte Grafik: http://java-forum.org/de/images/smiles/icon_wink.gif]

    thx wurstel
  • 1. Also nach beeindigung des Programms wirst du sicher keine Ausgabe mehr machen können, weil dein Programm zuende ist.
    2. Wenn du aus irgendwelchen Gründen die Zeilen kurz vor Ende ausgeben willst brauchst du ein Array um dir die Zeilen zu merken.*
    3. Ich würde mir eine Funktion schreiben die einen String annimmt und die Zeile dann auf Korrektheit prüft. Das ist eine einfache for-Schleife und ein Zähler, ungefähr so:

    Quellcode

    1. boolean checkLine(String s) {
    2. int count = 0;
    3. for (int i = 1; (i < s.length()) && (count >= 0); ++i) {
    4. if ( s.charAt(i) == '(' ) ++count;
    5. else if ( s.charAt(i) == ')' ) --count;
    6. }
    7. return (count = 0);
    8. }


    Das hab ich aus dem Kopf geschrieben und hab lang kein Java gemacht. Sind sicher noch Fehler drin, aber die Idee sollte klappen. Die Funktion rufst du nun für jede Zeile auf und dann merkst du dir wo false bei rauskommt.

    *Es lässt sich für den Benutzer des Programms kaum erkennen, ob es nun während der Verarbeitung ausgegeben wird oder erst am Ende. Ich bin prinzipiell für eine Ausgabe während der Verarbeitung, da sich das leichter debuggen lässt und bei langen Funktionen die subjektiv wahrgenomme Wartezeit reduziert erscheint, wenn zwischendrin (Teil-)Ergebnisse ausgeben werden. In diesem Fall ist es sogar sowohl Speicherplatz- als auch Laufzeiteffizienter (allerdings vernachlässigbar bei kurzen Eingaben).
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • @wurstel: Unter der Texteingabe findest du übrigens eine Syntaxbar um deinen Code in der richtigen Sprache zu highlighten.

    Wenn du die Ausgabe am Ende haben willst, musst du das ganze Prinzip nochmal überarbeiten.
    Dann würde ich nicht Zeichenweise von der Eingabe lesen sondern Zeilenweise. Und an einer Leerzeile könntest du erkennen, dass die Eingabe zu Ende ist. Und deinen "Algorithmus" durchführen um den Code zu analysieren.

    Außerdem macht es dann natürlich auch Sinn, die Klammerung nicht nur Zeilenweise, sondern im Gesamtkontext zu prüfen.