System.in.read() Boolsche Werte vergleichen

Carlo12345

Mitglied
Hallo liebe Leute,

ich hab mich wegen diesem Problem hier angemeldet. Ich versuche seit Tagen eine Lösung zu finden stehe aber immer wieder vor neuen Hürden und Fehlern. Ich habe die Aufgabe ein Programm zu schreiben, dass vom User eingegebene Werte miteinander vergleicht.

Also zuerst gebe ich T oder F ein, dann wird ein Operator abgefragt "&" oder "|" oder "^", dann ein weiteres mal T oder F eingeben( Groß - und Kleinschreibung soll möglich sein und wenn jeweils ein unerlaubtes Zeichen eingegeben wird soll eine passende Fehlermeldung erscheinen). Die eingegebenen Werte sollen dann eben das richtige Ergebnis ausspucken also T&T = True usw.

Jedenfalls berechnet mein Programm die falschen Werte. Ich bitte um Hilfe!

Tut mir leid. Wie füge ich einen Code ein?

Danke für eure Hilfe
________________________________________________________________________________________________________________________________________________________
Java:
package AnalyseMeb2;

public class AnalyseMeb2 {
	public static void main(String[]args) 
			throws java.io.IOException {
		boolean a = false;
		boolean b = false;
		
		char input1;
		char input2;
		char input3;
		int operator = 0;
		
		
		String error = "Bitte tippe T oder F ein";
		String error2 = "Bitte wähle '&' oder '|' oder '^'";
		
	System.out.println("Enter first Character");
	input1 = (char) System.in.read();
	if ((input1 == 'T') || (input1 == 't' ))  a = true;	
	if ((input1 == 'F') || (input1 == 'f' )) a = false;
	
	else {
		System.out.println(error);
		System.in.close();
	}
	
	input1 = (char) System.in.read();
	input1 = (char) System.in.read();
	
	
	System.out.println("Bitte geben Sie einen Operanden ein");
	input2 = (char) System.in.read();
	if(input2 == 38) { operator = 0; // &
	if(input2 == 124) // |
		operator = 1;
	if(input2 == 94) // ^
		operator = 2;
	System.out.println("Bitte geben sie einen zweiten Character ein");
	}
	else {
		System.out.println(error2);
	}
	
	input2 = (char) System.in.read();
	input2 = (char) System.in.read();
	input2 = (char) System.in.read();
	
	
	System.out.println("Enter first Character");
	input3 = (char) System.in.read();
	if ((input3 == 'T') || (input3 == 't' )) {
		a = true;	
	if ((input3 == 'F') || (input3 == 'f'))
		a = false;
	}
	else {
		System.out.println(error);
		System.in.close();
	
			}
	
	  //Figure out result
   boolean result;
   switch (operator) {
    case 0:
     result = a&b;   
    case 1:
      result = a|b;
    case 2:
      result = a^b;

      System.out.println("Das Ergebnis lautet: " );
      System.out.println(result);
	
    	}
	}
}
 
Zuletzt bearbeitet von einem Moderator:
Also da gibt es viele Dinge, die direkt ins Auge fallen:

if ((input1 == 'T') || (input1 == 't' )) a = true;
if ((input1 == 'F') || (input1 == 'f' )) a = false;

else {

Hier hast Du zwei Dinge:
1) das erste if.
2) Das if / else.
Also wenn input1 T oder t ist, dann wird a auf true gesetzt und danach wird der else Zweig des zweiten ifs ausgeführt, da input1 nicht F oder f ist.

Wieso machst du nicht einfach ein switch Befehl? Erst case 'T' und case 't' mit Befehl und break; dann 'F' und 'f' mit der Zuweisung und break; Der else Block ist dann der default part.

System.in.close();

Wo hast Du den System.in geöffnet? Wenn Du etwas nicht geöffnet hast, dann schließt Du es auch in der Regel nicht.

input2 = (char) System.in.read();
if(input2 == 38) { operator = 0; // &
if(input2 == 124) // |
operator = 1;
if(input2 == 94) // ^
operator = 2;
System.out.println("Bitte geben sie einen zweiten Character ein");
}
else {
System.out.println(error2);
}
Wenn input2 38 ist, dann setzt Du operator auf 0 und prüfst, ob es 124 ist (kann es ja nicht sein, ist ja 38. Dann die Prüfung auf 94 ..... dann kommt die Ausgabe .... Der Else Zweig ist vom ersten if - also immer wenn es nicht 38 ist, dann wird error2 ausgegeben ....

switch (operator) {
case 0:
result = a&b;
case 1:
result = a|b;
case 2:
result = a^b;
Also wenn operator 0 ist, dann wird resultat a&b; dann a|b und dann a^b, denn er "fällt durch". Also so ein case immer mit break; beenden so du nicht z.B. mit einem return die Methode verlässt.

Das sind hoffentlich erst einmal genug Hinweise, um Fehler zu beheben. Zur Not noch einmal die Grundlagen zu if und switch durchlesen und paar einfachere Beispiele durchgehen.
 
Das sind schon mal einige Dinge für die ich noch ein Auge entwickeln muss. Ist mir nicht aufgefallen.

Ich danke dir sehr!

Ich versuche es weiter. Melde mich dann wieder 😉 🙂
Gruß
 
Ich habe den ganzen Code jetzt nochmal geschrieben.

Bei der Auswahl des Operanden war es mir nicht möglich einen Switch Befehl anzuwenden. Wegen den Sonderzeichen?

Jedenfalls rutscht er jetzt bei Eingabe des ersten Characters einmal komplett durch. Was übersehe ich?

Vielen vielen Dank!


Java:
public class Progauf3b {

    public static void main(String[]args)
            throws java.io.IOException {
      
        boolean a = true;
        boolean b = true;
        char input;
        char chosenOp = 0;
              
        // Ersten Character festlegen
      
      
        System.out.println("Ersten Character bitte:");
        input = (char) System.in.read();
        switch(input) {
        case 'T':
            a = true;
            System.out.println("Geben Sie einen Operanden ein.");
        break;
        case 't':
            a = true;
            System.out.println("Geben Sie einen Operanden ein.");
        break;
        case 'F':
            a = false;
            System.out.println("Geben Sie einen Operanden ein.");
        break;
        case 'f':
            a = false;
            System.out.println("Geben Sie einen Operanden ein.");
        break;
        default:
            System.out.println("Wählen Sie T/t oder F/f");
          
            input = (char) System.in.read();
            input = (char) System.in.read();
          
        // Operand festlegen
      
        input = (char) System.in.read();
      
        if (input == 38) {
            chosenOp = 0;
        } else if(input == 124) {
            chosenOp = 1;
        } else if (input == 94) {
            chosenOp = 2;
        } else {
            System.out.println("Wählen Sie '&' oder '|' oder '^'");   
        }
      
        input = (char) System.in.read();
        input = (char) System.in.read();
          
        // zweiten Character fetlegen   
          
        }
        input = (char) System.in.read();
      
        switch(input) {
        case 'T':
            b= true;
            System.out.println("Das Ergebnis lautet.");
        break;
        case 't':
            b = true;
            System.out.println("Das Ergebnis lautet.");
        break;
        case 'F':
            b = false;
            System.out.println("Das Ergebnis lautet.");
        break;
        case 'f':
            b = false;
            System.out.println("Das Ergebnis lautet.");
        break;
        default:
            System.out.println("Wählen Sie T/t oder F/f");
        }
      
      
        // Ergebnis berechnen
      
        boolean result;
        switch (chosenOp) {
        case 0:
            result = a&b;
            System.out.println("Das Ergebnis lautet: " + result);
        break;
        case 1:
            result = a|b;
            System.out.println("Das Ergebnis lautet: " + result);
        break;
        case 2:
            result = a^b;
            System.out.println("Das Ergebnis lautet: " + result );
        break;
        }   
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Was übersehe ich?
Dass Du code in [CODE][/CODE] Tags packen solltest, damit er lesbar ist.

Und wie schreibst Du Code? Hoffentlich nutzt Du eine IDE, welche Code automatisch einrückt! Denn dann erkennst Du auf einfache Art und Weise, wie weit welcher Block geht.

Einfache Frage: Bis wohin geht der Code von deinem default: Part?
 
Ach, das mit dem großen default Block bei dem ersten switch soll evtl. so sein. Dein Problem liegt evtl. einfach an der Eingabe über System.in.read().

Er nimmt die Eingabe des ersten Zeichens ja erst, wenn auch die Enter Taste gedrückt wurde, d.h. es gibt noch mehr Informationen in dem Stream, außer eben dem eingegebenen Zeichen.

Hier würde ich dir empfehlen, evtl. bei der Eingabe ein Tool zu nutzen. Ansonsten könntest Du auch vom Stream lesen, bis du ein Return gelesen hast. Also etwas in der Art wie while (System.in.read() != '\n');, was du nach jedem gelesenen Zeichen aufrufst.
Dann wertet er immer das erste Zeichen aus und ignoriert alle anderen folgenden... Oft wird aber z.B. die Scanner Klasse verwendet, um Eingaben vom Benutzer zu lesen....
 
Ja sorry wegen dem Code. Bei meinem ersten Beitrag in diesem Thread hab ich es auch einfach so hinein kopiert und dennoch zeigt es ihn richtig an. Vllt wurde es ja von einem Moderator nachträglich geändert.

Ja ich benutze eine IDE (Eclipse).

Die Aufgabe erlaubt es mir nur sie mit System.in.read() zu lösen. Ich hab schon gehört das Scanner um einiges leichter sein soll 🙂.

Ich benutze System.in.read() 2x zwischen den blöcken um das Return abzufangen. Habe ich aus einem Youtube video.

Ich hab´s jetzt mit deiner Variante gemacht. Ergebnis hab ich hineinkopiert.

Die erste Eingabe akzeptiert er. Nachdem ich der Aufforderung folge und den Operanden eingebe "springt" das Programm zum Ende und fragt die 3 Eingabe vom 2 Character gar nicht mehr ab sondern zeigt mir gleich das Ergebnis. Könnte das damit zusammenhängen, dass ich die "Shift" Taste bzw. AltGr Taste betätigen muss um die Operanden einzugeben und diese Tasten genau wie "Enter" einen Platz einnehmen?

Gruß

Code:
public class Progauf3b {

	public static void main(String[]args)
			throws java.io.IOException {
		
		boolean a = true;
		boolean b = true;
		char input;
		char chosenOp = 0;
				
		// Ersten Character festlegen
		
		
		System.out.println("Ersten Character bitte:");
		input = (char) System.in.read();
		while (System.in.read() != '\n');
		
		switch(input) {
		case 'T':
			a = true;
			System.out.println("Geben Sie einen Operanden ein.");
		break;
		case 't':
			a = true;
			System.out.println("Geben Sie einen Operanden ein.");
		break;
		case 'F':
			a = false;
			System.out.println("Geben Sie einen Operanden ein.");
		break;
		case 'f':
			a = false;
			System.out.println("Geben Sie einen Operanden ein.");
		break;
		default:
			System.out.println("Wählen Sie T/t oder F/f");
		
		
			//input = (char) System.in.read();
			//input = (char) System.in.read();
			
		// Operand festlegen
		
		input = (char) System.in.read();
		while (System.in.read() != '\n');
		
		if (input == 38) {
			chosenOp = 0;
		} else if(input == 124) {
			chosenOp = 1;
		} else if (input == 94) {
			chosenOp = 2; 
		} else { 
			System.out.println("Wählen Sie '&' oder '|' oder '^'");	
		}
		
		//input = (char) System.in.read();
		//input = (char) System.in.read(); 
			
		// zweiten Character fetlegen	
			
		}
		input = (char) System.in.read();
		while (System.in.read() != '\n');
		
		switch(input) {
		case 'T':
			b= true;
		break;
		
		case 't':
			b = true;
		break;
		
		case 'F':
			b = false;
		break;
		
		case 'f':
			b = false;
		break;
		
		default:
			System.out.println("Wählen Sie T/t oder F/f");
		}
		
		
		// Ergebnis berechnen
		
		boolean result;
		switch (chosenOp) {
		case 0:
			result = a&b;
			System.out.println("Das Ergebnis lautet: " + result);
		break;
		case 1:
			result = a|b;
			System.out.println("Das Ergebnis lautet: " + result);
		break;
		case 2:
			result = a^b;
			System.out.println("Das Ergebnis lautet: " + result );
		break;
		}	
	}
}
 
Java:
public static void main(String[] args) {

  boolean bool1;

  switch ( new Scanner( System.in ).next().toLowerCase() ) {
    case "t": bool1 = true; break;
    case "f": bool1 = false; break;
    default:
      System.err.println("Fehlerhafte Eingabe!"); return;
  }

  String operator = new Scanner( System.in ).next();

  boolean bool2;

  switch ( new Scanner( System.in ).next().toLowerCase() ) {
    case "t": bool2 = true; break;
    case "f": bool2 = false; break;
    default:
      System.err.println("Fehlerhafte Eingabe!"); return;
  }

  switch ( operator ) {
    case "|" : System.out.println( bool1 | bool2 ); break;
    case "&" : System.out.println( bool1 & bool2 ); break;
    case "^" : System.out.println( bool1 ^ bool2 ); break;
    default: System.err.println("Fehlerhafter Operator!");
  }
}
 

Neue Themen


Zurück
Oben