Input/Output Scanner Eingaben auf Console farbig darstellen, wie?

The_Virus

Mitglied
Hallo,
Ich bin Wirtschafts-Informatik Student im 1. Semester und muss eine Übung schreiben, die ich soweit auch fertig habe. Doch eine Kleinigkeit fehlt:
  • Die Eingaben auf der Console, die per Scanner eingelesen werden, sollen farbig dargestellt werden.
Hier die Aufgabe: Prog I

Hier mein Programm:
Java:
package paketGeldautomat;
import java.util.Scanner;

public class Geldautomat {
	private String weiter;
	private String euro_cent;
	private float betrag;
	private int[] muenz = new int[8];
	private String[] muenz2 = new String[8];
	
	public void einzahlen() {
		Scanner einlesen = new Scanner(System.in);
		System.out.println("Wollen Sie den Betrag in Euro oder Cent eingeben? (e / c)");
		euro_cent = einlesen.next();
		
		if(euro_cent.equals("e")) {
			System.out.println("Bitte geben Sie einen Betrag in Euro ein!");
			betrag = einlesen.nextFloat();
			System.out.printf("\n------Ihr Geldbetrag = %,2.2f €------\n", betrag);
			betrag *= 100;
		}
		if(euro_cent.equals("c")) {
			System.out.println("Bitte geben Sie einen Betrag in Cent ein!");
			betrag = einlesen.nextFloat();
			System.out.printf("\n------Ihr Geldbetrag = %,2.2f €------\n", (betrag/100));
		}
		
	}
	public float getBetrag() {
		return betrag;
	}
	public void umrechnen() {
		while(betrag >= 200) {
			muenz[0] += 1;
			betrag -= 200;
		}
		while(betrag >= 100) {
			muenz[1] += 1;
			betrag -= 100;
		}
		while(betrag >= 50) {
			muenz[2] += 1;
			betrag -= 50;
		}
		while(betrag >= 20) {
			muenz[3] += 1;
			betrag -= 20;
		}
		while(betrag >= 10) {
			muenz[4] += 1;
			betrag -= 10;
		}
		while(betrag >= 5) {
			muenz[5] += 1;
			betrag -= 5;
		}
		while(betrag >= 2) {
			muenz[6] += 1;
			betrag -= 2;
		}	
		while(betrag >= 1) {
			muenz[7] += 1;
			betrag -= 1;
		}
	}
	public void stringArrayFuellen() {
		muenz2[0] = "2,00 €";
		muenz2[1] = "1,00 €";
		muenz2[2] = "  50 cent";
		muenz2[3] = "  20 cent";
		muenz2[4] = "  10 cent";
		muenz2[5] = "   5 cent";
		muenz2[6] = "   2 cent";
		muenz2[7] = "   1 cent";
	}
	public void ausgabe() {
		System.out.println("----------Muenz-Ausgabe:----------");
		for(int i = 0; i < muenz.length; i++) {
			System.out.printf("%4d Muenze(n) zu %s \n", muenz[i], muenz2[i]);
		}
	}
	
	public void weiterRechnen() {
		Scanner einlesen = new Scanner(System.in);
		System.out.print("\nweiter rechnen? (j / n)");
		weiter = einlesen.next();
		
		System.out.println();		
		if(weiter.equals("n")) {
			System.out.println("Schönen Tag noch! :-)");
		}
	}
	public String getWeiter() {
		return weiter;
	}
}
-----------------------------------------------------------------------------------------------
package paketGeldautomat;

public class GeldautomatStart {
	public static void main(String[] args) {
		
		Geldautomat automat = new Geldautomat();
		do{
			automat.einzahlen();
			if(automat.getBetrag() == 0) {
				System.out.println("Ohne Moos nix los! ;-)"); break;
			} 
			automat.umrechnen();
			automat.stringArrayFuellen();
			automat.ausgabe();
			automat.weiterRechnen();
		} while( automat.getWeiter().equals("j") );
	}
}
Und bitte keine allzu komplizierten Lösungen. Es soll so einfach wie möglich sein.
 
So trivial ist das nicht bestimmte Textstellen in der Windows Konsole farblich zu machen. Da wirst du um JNI/JNA und dlls wohl nicht drum rum kommen.

Ich verstehe das aber auch eher so, dass mit der grünen farbe die Benutzereingaben auf dem blatt gekennzeichnet sind, damit du weißt was der benutzer einzugeben hat.
Also
Code:
7,46 €
und
Code:
j
 
Die Übung sagt gar nicht, dass dies farblich hervorgehoben sein sollte. Sie sagt nur, dass im angegebenen Beispiel dies der Fall ist.
Einfach gesagt: es geht gar nicht. Das ist Sache der Konsole / cmd / Shell / Bash / ..., wie sie das erledigt. Z.B. die Bash kennt AFAIK gewisse ASCII Codes, welche bei der Ausgabe als "Farbcodes" erkannt und dementsprechend umgesetzt werden. Ich hab in der cmd noch nie was farbiges gesehen!?
 
ja genau,
"Die Eingaben auf der Console, die per Scanner eingelesen werden, sollen farbig dargestellt werden."
steht da überhaupt nicht, sondern es wird allein über die Darstellung des Aufgabentextes selber gesprochen!

"Beispiel für einen Programmlauf (Benutzereingaben sind farblich hervorgehoben): "
sind != sollen werden, wie kommst du auf diese Transformation?
 
@faetzminator / SlaterB:
Ihr habt Recht! :lol:
Unsere Professorin hat die Benutzereingaben in der Aufgabe nur farblich hervorgehoben, damit wir das besser erkennen. Danke!

Aber noch eine andere Frage:
Wenn ich bei dem Programm z.B. "6,89€" eingebe, kriege ich einen Fehler. Wenn ich aber nur "6,89" oder "6,89 €" eingebe, läuft das Programm normal durch.
Was muss ich hinzufügen, damit das "€"-Zeichen beim Einlesen wieder entfernt wird? So das es nicht in die Varibale "betrag" geschrieben wird.
 
Wert als String einlesen und eben nicht über nextFloat().

Und ich empfehle die lustigen Sprüche sowie Smilies zu entfernen (im Code..).

[edit] ich bin so verdammt schnell heute, zu langsam...
 
Danke, das mit dem String hab ich mir schon gedacht...
Die Smilies hab ich ich entfernt, die Sprüche lass ich drin. Die haben eine Funktion, sie zeigen an, wann das Programm abgebrochen wird. Denn das soll es im Fall von "0" und wenn man weiterRechnen mit "n" beantwortet.
 
du kannst auch es mit einem try/catch - Block versuchen und beim catchen der Exception, dann einfach wieder die gleiche Methode nochmals aufrufen.
Da du schon vorher nachgefragt hast, ob die Eingabe € oder Cent sein soll...hat sie meiner Meinung beim Betrag nichts zu suchen.
Außerdem würde ich die
Code:
equalsIgnoreCase("e")
Methode benutzen, da dann zumindest ein großes "E" auch als Euro erkannt wird.

[java=16] if (euro_cent.equalsIgnoreCase("e")) {
System.out.println("Bitte geben Sie einen Betrag in Euro ein!");
try {
betrag = einlesen.nextFloat();
} catch (Exception e) {
System.out
.println("Hier halt irgendeine Fehlermeldung, oder was auch immer...");
einzahlen();
}
System.out.printf("\n------Ihr Geldbetrag = %,2.2f €------\n",
betrag);
betrag *= 100;
}[/code]
 
Ich hab das jetzt mit String einlesen und Double.parseDouble(String) probiert, doch er gibt mir immer nen Fehler. "Empty String"

Java:
package paketGeldautomat;

import java.util.Scanner;

public class Geldautomat {
	
	private String weiter;
	private String euro_cent;
	private String betragString = "";
	private double betrag = 1;
	private int[] muenz = new int[8];
	private String[] muenz2 = new String[8];
	
	public void einzahlen() {
		Scanner einlesen = new Scanner(System.in);
		System.out.println("Wollen Sie den Betrag in Euro oder Cent eingeben? (e / c)");
		euro_cent = einlesen.next();
		
		if(euro_cent.equals("e")) {
			System.out.println("Bitte geben Sie einen Betrag in Euro ein!");
			betragString = einlesen.nextLine();
			betragString = betragString.replaceAll("€","").replaceAll("cent","");
			betrag = Double.parseDouble(betragString);
			System.out.printf("\n------Ihr Geldbetrag = %,2.2f €------\n", betrag);
			betrag *= 100;
		}
		if(euro_cent.equals("c")) {
			System.out.println("Bitte geben Sie einen Betrag in Cent ein!");
			betragString = einlesen.nextLine();
			betragString = betragString.replaceAll("€","").replaceAll("cent","");
			betrag = Double.parseDouble(betragString);
			System.out.printf("\n------Ihr Geldbetrag = %,2.2f €------\n", (betrag/100));
		}
		
	}
	public double getBetrag() {
		return betrag;
	}

	public void umrechnen() {
		while(betrag >= 200) {
			muenz[0] += 1;
			betrag -= 200;
		}
		while(betrag >= 100) {
			muenz[1] += 1;
			betrag -= 100;
		}
		while(betrag >= 50) {
			muenz[2] += 1;
			betrag -= 50;
		}
		while(betrag >= 20) {
			muenz[3] += 1;
			betrag -= 20;
		}
		while(betrag >= 10) {
			muenz[4] += 1;
			betrag -= 10;
		}
		while(betrag >= 5) {
			muenz[5] += 1;
			betrag -= 5;
		}
		while(betrag >= 2) {
			muenz[6] += 1;
			betrag -= 2;
		}	
		while(betrag >= 1) {
			muenz[7] += 1;
			betrag -= 1;
		}
	}
	
	public void stringArrayFuellen() {
		muenz2[0] = "2,00 €";
		muenz2[1] = "1,00 €";
		muenz2[2] = "  50 cent";
		muenz2[3] = "  20 cent";
		muenz2[4] = "  10 cent";
		muenz2[5] = "   5 cent";
		muenz2[6] = "   2 cent";
		muenz2[7] = "   1 cent";
	}
	
	public void ausgabe() {
		System.out.println("----------Muenz-Ausgabe:----------");
		for(int i = 0; i < muenz.length; i++) {
			System.out.printf("%4d Muenze(n) zu %s \n", muenz[i], muenz2[i]);
		}
	}
	
	public void weiterRechnen() {
		Scanner einlesen = new Scanner(System.in);
		System.out.print("\nweiter rechnen? (j / n)");
		weiter = einlesen.next();
		
		System.out.println();		
		if(weiter.equals("n")) {
			System.out.println("Schönen Tag noch!");
		}
	}
	public String getWeiter() {
		return weiter;
	}
}
Habe eigentlich nur einlesen() geändert und den Datentyp von "betrag" (float zu double). Main ist gleich...
 
verwende anstatt:

[java=21]betragString = einlesen.nextLine();[/code]

wieder deine ursprüngliche Methode
[java=21]betragString= einlesen.next()[/code]

dann hast du das, was du wolltest. (wahrscheinlich)

Eingaben, die aber bspw nur aus Buchstaben bestehen, oder auch die (eigentlich) korrekte Eingabe von 22,43 führen aber zum Programmabsturz, da für ein double der Punkt als Trennzeichen vorgesehen ist.
Klar, kannst du natürlich weiterhin mit der [c]replaceAll()[/c] Methode, ein Komma in einen Punkt verwandeln...der o.g. try/catch -Mechanismus erscheint mir weiterhin in diesem Fall als sinnvoll.
 
Danke, mit next() klappt es sofort. :toll:

try / catch habe ich zwar schonmal gehört bzw. gesehen, aber offiziell hatten wir das halt noch nicht in der Vorlesung. Und ohne dein Bespiel hier, wüsste ich auch nicht, wie ich das selbst schreiben sollte. Daher verwende ich das lieber noch nicht...
 
Einfach um try / catch zu verstehen, habs ich es jetzt doch mal eingebaut. Funktioniert wirklich sehr elegant, nicht schelcht. Bin nur nicht sicher, ob ich das verwenden sollte...
 
ist m.E. absolut legitim, auch Code-Fragmente zu benutzen...die man noch nicht kennengelernt hat.

und der try/catch Mechanismus wird dir früher, oder später eh begegnen.
 

Zurück
Oben