Erste Schritte Wie am einfachsten Aufgabe wiederholen

RomanS

Mitglied
Hallo zusammen,

mein erster Post hier im Forum.
Ich habe mich am Anfang der Woche entschloßen java zu lernen, nachdem mir ein Freund dazu geraten hat. Hatte in der Schulzeit Informatik, war ein Jahr lang auf einer Schule zur Ausbildung zum Informationstechnischen Assistenten. Habe dann aber abgebrochen und habe eine Ausbildung begonnen die mit der IT nicht ganz soviel zutun hat( Logistik). Will mich aber jetzt langsam in die IT einarbeiten, weil es einfach schon immer mein Ding war..
Bücher sind bestellt, aber noch nicht da. Habe erstmal par Tutorials bei youtube angeschaut. Und bisschen im Internet gelesen.
Folgendes:
Habe einen einfachen Rechner programmiert.
Zu Anfang soll 1,2,3 oder 4 eingeben werden.Alles sehr einfach gehalten :oops:
Wenn jetzt eine andere Zahl eingetippt wird, soll zu erst erscheinen" Falsche Zahl eingetippt" und dann wieder die Anfrage kommen, was man eintippen möchte.
Wie realisiert man das dabei am einfachsten?
Wie gesagt.. Mein 2ter Tag an dem ich bisschen rumtippe so vor der Arbeit..

Danke für eure Hilfe!

Java:
import java.util.Scanner;


public class Rechnen {
	Scanner rom = new Scanner(System.in);
	public static void main(String args[])
	{
		Scanner rom = new Scanner(System.in);
		double fnum, snum, antwort;
		int eingabe;
		System.out.println("Was wollen Sie rechnen? \n Für Plus 1, für minus 2, für Teilen 3 , für mal nehmen 4 eingeben");
		
	eingabe = rom.nextInt();
		if ( eingabe == 1 ){
			System.out.println("Additionsrechner");
			System.out.println("Bitte die Erste Zahl eintippen");
			fnum = rom.nextDouble();
			System.out.println("Bitte die Zweite Zahl eintippen");
			snum = rom.nextDouble();
			antwort = fnum + snum;
			System.out.println("Ergebniss:"+ antwort);}
		
		else{
			if ( eingabe == 2){
				
		System.out.println("Minusrechnen");
		System.out.println("Bitte die erste Zahl eingeben");
	 fnum = rom.nextDouble();
	 System.out.println("Bitte die zweite Zahl eingeben");
	 snum = rom.nextDouble();
	 antwort = fnum - snum;
	 System.out.println(" Das Ergeniss lautet : " + antwort);}
			else{
				if( eingabe == 3){
					System.out.println(" Teilen \n Bitte die erste Zahl eingeben");
					fnum = rom.nextDouble();
					System.out.println( "Bitte die zweite Zahl eintippen");
					snum = rom.nextDouble();
					antwort= fnum / snum;
					System.out.println("Das Ergebniss lautet : " + antwort);
				}
				else{
					if( eingabe == 4){
						System.out.println(" Mal nehmen \n Bitte die erste Zahl eingeben");
						fnum = rom.nextDouble();
						System.out.println( "Bitte die zweite Zahl eintippen");
						snum = rom.nextDouble();
						antwort= fnum * snum;
						System.out.println("Das Ergebniss lautet : " + antwort);
						
					}
					else {
						if( eingabe <= 5  ) {
							System.out.println(" falsche Zahleingegeben");					}
					}}}}}}
 

timbeau

Gesperrter Benutzer
while(true) {....} um das gesamte Konstrukt.


Aber versuch mal statt Zahlen für die Rechenart, Zeichen zu identifizieren.

Eingabe: "12 + 24"

Die beiden Zahlen identifizieren. Stichwort String.split
Das Zeichen identifizieren und dann in eine switch-Anweisung.
 

RomanS

Mitglied
Ich habe den Rechner jetzt ersteinmal einfach fertig gestellt.
Widme mich dann als nächstes der Switch-Anweisungen und den String.split. Damit dann nochmal komplett neu erstellen.
Leider noch keine Zeit zu gehabt.

Der einfache Rechner:
Java:
import java.util.Scanner;

public class Rechnen {
	
	
	public static void main(String args[])
	{
		Scanner rom = new Scanner(System.in);
		double fnum, snum, antwort;
		String plus,minus,mal,teilen;
		plus = "Plus"; minus = "Minus"; mal = "Mal"; teilen = "Teilen";
		while(true) {		
		System.out.println("Was wollen Sie rechnen? \n " +
				" Plus, Minus, Mal oder Teilen? Bitte eingeben");
		
	String eingabe = rom.next();	
		if (eingabe.equals(plus)){
			System.out.println("Additionsrechner");
			System.out.println("Bitte die Erste Zahl eintippen");
			fnum = rom.nextDouble();
			System.out.println("Bitte die Zweite Zahl eintippen");
			snum = rom.nextDouble();
			antwort = fnum + snum;
			System.out.println("Ergebniss:"+ antwort);}
		else {if ( eingabe.equals(minus)){			
		System.out.println("Minusrechnen");
		System.out.println("Bitte die erste Zahl eingeben");
	 fnum = rom.nextDouble();
	 System.out.println("Bitte die zweite Zahl eingeben");
	 snum = rom.nextDouble();
	 antwort = fnum - snum;
	 System.out.println(" Das Ergeniss lautet : " + antwort);}
			else{if( eingabe.equals(teilen)){
					System.out.println(" Teilen \n Bitte die erste Zahl eingeben");
					fnum = rom.nextDouble();
					System.out.println( "Bitte die zweite Zahl eintippen");
					snum = rom.nextDouble();
					antwort= fnum / snum;
					System.out.println("Das Ergebniss lautet : " + antwort);}
				else{if( eingabe.equals(mal)){
						System.out.println(" Mal nehmen \n Bitte die erste Zahl eingeben");
						fnum = rom.nextDouble();
						System.out.println( "Bitte die zweite Zahl eintippen");
						snum = rom.nextDouble();
						antwort= fnum * snum;
						System.out.println("Das Ergebniss lautet : " + antwort);	}
					else {if(! eingabe.equals(plus)) {
							System.out.println(" Falsch eingegeben, bitte auf Großschreibung achten");}	
							else {if(! eingabe.equals(minus)) {
								System.out.println(" Falsch eingegeben, bitte auf Großschreibung achten");}		
								else {if(! eingabe.equals(mal)) {
									System.out.println(" Falsch eingegeben, bitte auf Großschreibung achten");}		
									else {if(! eingabe.equals(teilen)) {
										System.out.println(" Falsch eingegeben, bitte auf Großschreibung achten");}								
									}}}}}}}				
													}}}
 

DaveIT

Mitglied
Kleiner Programmiergrundsatz: Code kopieren ist meist unnötig.

Java:
System.out.println("Bitte die Erste Zahl eintippen");
fnum = rom.nextDouble();
System.out.println("Bitte die Zweite Zahl eintippen");
snum = rom.nextDouble();

Das gleiche gilt für die Fehlermeldungen. Alles in eine
Code:
switch - case
Konstellation und mit
Code:
default
eine Fehlermeldung ausgeben.

ich nehme an fnum steht für first number? warum nicht zahl1?
 

timbeau

Gesperrter Benutzer
Ok, da sieht man wie wichtig eine gute Formatierung ist :)

zahl1 klingt so deutsch, aber statt fnum vll. firstNumber.

Besser machen kann man da fast alles. Probiers mal wie von mir vorgeschlagen und du wirst von deinem eigenen Code begeistert sein. Und auch von der Benutzbarkeit.
 

RomanS

Mitglied
Kleiner Programmiergrundsatz: Code kopieren ist meist unnötig.

Java:
System.out.println("Bitte die Erste Zahl eintippen");
fnum = rom.nextDouble();
System.out.println("Bitte die Zweite Zahl eintippen");
snum = rom.nextDouble();

Das gleiche gilt für die Fehlermeldungen. Alles in eine
Code:
switch - case
Konstellation und mit
Code:
default
eine Fehlermeldung ausgeben.

ich nehme an fnum steht für first number? warum nicht zahl1?

Wie ich ja geschrieben habe, habe ich es erstmal ohne Switch - case gemacht. Da ich bis jetzt, mich noch nicht bis dahin vorgearbeitet habe.

Ich lerne halt am besten beim Probieren. Wenn dann Fehler auftreten bzw. man es vereinfachen kann , verankert sich sowas am besten in meinem Schädel :autsch:
 

RomanS

Mitglied
Switch habe ich nun angewendet.
Aber es ist sicher noch möglich das zu komprimieren.. :oops:
Java:
import java.util.Scanner;

class RechnerVersuchZwei{
	
	public static void main(String args[]){
	while(true){
	Scanner sc = new Scanner(System.in);
	double num1,num2,result;
	String plus= "Plus", minus= "Minus", teilen= "Teilen", mal= "Mal";
	String Zahl1 = "Bitte die Erste Zahl eintippen", Zahl2 = "Bitte die Zweite Zahl eintippen"; 
	String Fehler = " Falsche Eingabe, bitte auf Großschreibung achten";
	System.out.println("Was wollen Sie rechnen? \n "+" Plus, Minus, Mal oder Teilen? Bitte eingeben");
	String input = sc.next();
	switch(input){
	case "Plus": 
		System.out.println("Additionsrechner");
		System.out.println(Zahl1);
		num1 = sc.nextDouble();
		System.out.println(Zahl2);
		num2 = sc.nextDouble();
		result = num1 + num2;
		System.out.println("Ergebnis:"+ result);
	break;	
	case "Minus":
		System.out.println("Minus Rechnen");
		System.out.println(Zahl1);
		num1 = sc.nextDouble();
		System.out.println(Zahl2);
		num2 = sc.nextDouble();
		result = num1 - num2;
		System.out.println("Ergebnis:"+ result);
	break;
	case "Teilen":
		System.out.println("Teilen");
		System.out.println(Zahl1);
		num1 = sc.nextDouble();
		System.out.println(Zahl2);
		num2 = sc.nextDouble();
		result = num1 / num2;
		System.out.println("Ergebnis:"+ result);
	break;
	case "Mal":
		System.out.println("Mal nehmen");
		System.out.println(Zahl1);
		num1 = sc.nextDouble();
		System.out.println(Zahl2);
		num2 = sc.nextDouble();
		result = num1 * num2;
		System.out.println("Ergebnis:"+ result);
	break;
	default: 	System.out.println(Fehler);
	break;
	}
	
		
		
		
}}
	}
 

Mujahiddin

Top Contributor
Also Formatierung ist ziemlich wichtig für die Lesbarkeit.
Vor allem, wenn du if-Anweisungen oder for-Schleifen hast, ist die Einrückung ziemlich wichtig. Da siehst du direkt, auf welcher "Ebene" sich der Code befindet.
Worauf ich noch Wert legen würde, ist das Aussehen des Textes (und insbesondere Rechtschreibung)
Dein momentaner Fortschritt ist schon sehr gut und sollte das machen, was du erwartest.
Allerdings würde ich die Zahlen unabhängig voneinander eingeben lassen und am Ende nur die Operationen im switch Fall durchführen.

Java:
import java.util.Scanner;


class RechnerVersuchZwei {
	
	public static void main(String args[]) {
		while( true ) {
			Scanner sc = new Scanner( System.in );
			double num1, num2, result = Double.NaN;
			final String plus = "+", minus = "-", teilen = "/", mal = "*";
			String Zahl1 = "Bitte die erste Zahl eintippen: ", Zahl2 = "Bitte die zweite Zahl eintippen: ";
			String Fehler = "Falsche Eingabe!";
			System.out.println( "Was wollen Sie rechnen?\n" + "+, -, * oder /? Bitte eingeben: " );
			String input = sc.next();
			System.out.println( Zahl1 );
			num1 = sc.nextDouble();
			System.out.println( Zahl2 );
			num2 = sc.nextDouble();
			switch( input ) {
				case plus:
					System.out.println("Additionsrechner");
					result = num1 + num2;
				break;
				case minus:
					System.out.println("Minusrechner");
					result = num1 - num2;
				break;
				case teilen:
					System.out.println( "Teiler" );
					result = num1 / num2;
				break;
				case mal:
					System.out.println( "Mal nehmen" );
					result = num1 * num2;
				break;
				default:
					System.out.println( Fehler );
				break;
			}
			System.out.println( "Ergebnis:" + result );
		}
	}
}

Was mir noch aufgefallen ist bei deinem Code:

1. du hattest plus etc. deklariert aber nicht verwendet. Welchen Compiler benutzt du? Ich würde raten, auf Eclipse umzusteigen (oder netBeans, wie viele meinen). Dort werden sehr viele Tipps und Warnungen angezeigt, wenn etwas mit dem Code nicht stimmt (z.B. unbenutzte Variablen etc.)
2. Bei Stringkonkatenation (also das Hintenanhängen von Strings) ist die Formatierung wichtig. Bei
Code:
"Hallo \n " + " Dies ist ein Rechner."
erscheint das für den Benutzer mit zu vielen Leerzeichen, also beim Zeilenumbruch ist das erste Zeichen um 2 Leerzeichen eingerückt. Sieht nicht so schön aus. Faustregel: Vor/Nach Konkatenation keine Leerzeichen verwenden, außer man braucht sie (zum Trennen von Wörtern etc).
3. Ein while(true) ist zwar in diesem Fall nützlich aber nicht gerne gesehen. Besser wäre es, auf eine Benutzereingabe zu warten. Also z.B. am Anfang einen String "y", und der User gibt am Ende ein ob er weiter machen "y" oder aufhören "n" will. Solang dieser String "y" ist, geht's weiter.

Liebe Grüße.
 
Zuletzt bearbeitet:

RomanS

Mitglied
Was mir noch aufgefallen ist bei deinem Code:

1. du hattest plus etc. deklariert aber nicht verwendet. Welchen Compiler benutzt du? Ich würde raten, auf Eclipse umzusteigen (oder netBeans, wie viele meinen). Dort werden sehr viele Tipps und Warnungen angezeigt, wenn etwas mit dem Code nicht stimmt (z.B. unbenutzte Variablen etc.)
2. Bei Stringkonkatenation (also das Hintenanhängen von Strings) ist die Formatierung wichtig. Bei
Code:
"Hallo \n " + " Dies ist ein Rechner."
erscheint das für den Benutzer mit zu vielen Leerzeichen, also beim Zeilenumbruch ist das erste Zeichen um 2 Leerzeichen eingerückt. Sieht nicht so schön aus. Faustregel: Vor/Nach Konkatenation keine Leerzeichen verwenden, außer man braucht sie (zum Trennen von Wörtern etc).
3. Ein while(true) ist zwar in diesem Fall nützlich aber nicht gerne gesehen. Besser wäre es, auf eine Benutzereingabe zu warten. Also z.B. am Anfang einen String "y", und der User gibt am Ende ein ob er weiter machen "y" oder aufhören "n" will. Solang dieser String "y" ist, geht's weiter.

Liebe Grüße.

Vielen Dank für die Tipps. Ich benutze Eclipse. Das die Variablen unbenutzt sind ist mir klar. Ich wußte bis gerade nicht das ein Final vor dem String abhilfe bringt bei der Switch Anweisung. Da ich ohne final bei Case nicht direkt auf die String Variable zugreifen konnte und "" setzen musste.
Das Zahlen Eingeben vor der Switch Anweisung macht aber auch ein Problem:
Vertippt der User sich beim Eingeben der Rechenart lässt das Programm den User trotzdem die Zahlen eingeben und gibt erst dann die Fehlermeldung(default) aus. Das sollte nicht sein.
Wenn die Zahlen eingabe erst im Switch erfolgte, war dieser Fehler nicht möglich.
Jetzt ist die Frage ob es Sinn macht dann vor der Switch Anweisung noch eine weitere überprüfung einzubauen oder lieber alle Case Varianten größer zu halten.
Und wie sollte diese Überprüfung aussehen? Welche Anweisung nimmt man dann am besten? Eine If Anweisung bläht ja alles nur weiter auf.
Ich merke, dass man gerade beim optimieren und abändern am besten lernt. Leider sind meine bestellten Bücher immer noch nicht da, so kann ich auf der Arbeit leider nicht lernen/lesen, sondern nur zuhause im Inet ;)
 

timbeau

Gesperrter Benutzer
Die Frage ob es Sinn macht eine Rechnung wie "1+2" in 3 Schritten + eine ja/nein Frage einzubauen. Ok, du machst das zur Übung aber auf der anderen Seite ist der Rechner nicht effektiv nutzbar. Ich würde mich jetzt mal dran setzen und einen Rechner bauen der den String "Zahl_Rechenzeichen_Zahl" splittet, auswertet und berechnet.
 

AquaBall

Top Contributor
Hallo Roman.
Ich glaube dein Ansatz ist nicht sehr erfolgreich.

Z.T. hast du schon teilweise recht: "dass man gerade beim Optimieren am besten lernt"
Richtig ist, dass man jedes Programm optimieren kann, und dabei auch manchmal was lernen kann.
Am meisten lernt man, wenn man fremde Code-Snipsels liest, und (kritisch , aber offen!) durchdenkt.
Aber wenn anfangs extrem schlechter Code entsteht, dann ist das keine Basis, um daraus zu lernen.

Andererseits fehlen sehr wichtige Voraussetzungen: "Eine If Anweisung bläht ja alles nur weiter auf."
Das ist BullS...! Wenn ein If für die Logik nötig ist, dann muss du es einbauen.
Man kann es evtl. durch andere Konstrukte (Switch/Schleifen/...) eleganter machen.
Aber wesentlich ist dass die Logik zuerst klar ist.

Vorschlag:
Mach - noch bevor du die erste Zeile programmierst - einen klaren Ablauf, was pasieren soll.
Frei von jeder Programmiersprache, evtl. nur durch "Kästchen malen" auf Papier.
Das wird dann optimiert, und erst dann beginnt das Programmieren.
Nur durch diese Methode kannst du ein "Aufblähen" des Codes verhindern.

Beispiel: (Der Ablauf von deinen ersten Versuchen sieht deutlich chaotischer aus)
. Rechenart abfragen
. Rechenart prüfen
Bei Fehler nochmal versuchen
Zahl1 abfragen
. (evtl. prüfen?)
Zahl2 abfragen
. (evtl. prüfen?)
Abhängig von Rechenart:
. Ergebnis berechnen
Ergebnis ausgeben

Das Ganze kann man auch fachmännisch darstellen:
Nassi-Shneiderman-Diagramm ? Wikipedia
Und der Programmcode ist dann (für jede ProgrammierSprache!) sehr simpel und fast selbstverständlich.
 

DaveIT

Mitglied
Java:
case "Plus": 
        System.out.println("Additionsrechner");
        System.out.println(Zahl1);
        num1 = sc.nextDouble();
        System.out.println(Zahl2);
        num2 = sc.nextDouble();
        result = num1 + num2;
        System.out.println("Ergebnis:"+ result);

wie schon erwähnt, bei doppelverwendung von code lässt sich immer einiges optimieren
-> stichwort Methoden

dadurch wird dein code übersichtlicher und flexibler

eine anmerkung am rande, wenn du variablen mit englischen namen anlegst zieh das durch (englischer bezeichner, deutscher string) zB: statt Zahl1 -> textNum1
 
H

hüteüberhüte

Gast
So auf die Schnelle:

Java:
        Scanner s = new Scanner(System.in);
        System.out.print("Ausdruck: ");
        String[] a = s.nextLine().trim().split("\\s+");
        int i = Integer.parseInt(a[0]), j = Integer.parseInt(a[2]), x = -1;
        if (a[1].equals("+")) {
            x = i + j;
        } else if (a[1].equals("-")) {
            x = i - j;
        } else if (a[1].equals("*")) {
            x = i * j;
        } else if (a[1].equals("/")) {
            x = i / j;
        }
        System.out.println("Ergebnis: " + x);

14 Zeilen... Kommt nur noch nicht so ganz an Wolfram|Alpha ran :D
 
Zuletzt bearbeitet von einem Moderator:

RomanS

Mitglied
So auf die Schnelle:

Java:
        Scanner s = new Scanner(System.in);
        System.out.print("Ausdruck: ");
        String[] a = s.nextLine().trim().split("\\s+");
        int i = Integer.parseInt(a[0]), j = Integer.parseInt(a[2]), x = -1;
        if (a[1].equals("+")) {
            x = i + j;
        } else if (a[1].equals("-")) {
            x = i - j;
        } else if (a[1].equals("*")) {
            x = i * j;
        } else if (a[1].equals("/")) {
            x = i / j;
        }
        System.out.println("Ergebnis: " + x);

14 Zeilen... Kommt nur noch nicht so ganz an Wolfram|Alpha ran :D

:lol: ne ne , dass dauert noch ein wenig bis ich so weit bin ;-)
Auch wenn es für dich auf die schnelle war hilft es mir ungemein! Danke dafür!
 
H

hüteüberhüte

Gast
Hab auch ein bisschen mit
Java:
String[] a = s.nextLine().trim().split("[^\\d\\Q+-*/\\E]+");
experimentiert, aber das löst das Problem, wenn man keine Leerzeichen eingibt, noch nicht
 

Mujahiddin

Top Contributor
Hier:
Java:
public static void main(String... arg) throws Exception {
	System.out.print( "Ausdruck: " );
	Scanner in = new Scanner( System.in );
	String a = in.nextLine();
	if( !a.startsWith( "+" ) && !a.startsWith( "-" ) )
		a = "+" + a;
	String[] numbers = a.split( " *[\\+\\-/\\*]+ *" );
	String[] ops = a.split( " *\\d+ *" );
	for( int i = 0; i < ops.length; i++ ) { // doppelte Operationszeichen möglichst trimmen / Syntaxfehler ausschmeißen
		if( ops[ i ].length() == 1 )
			continue;
		while( ops[ i ].endsWith( "+" ) )
			ops[ i ] = ops[ i ].substring( 0, ops[ i ].length() - 1 );
		if( ops[ i ].length() == 0 ) {
			ops[ i ] = "+";
			continue;
		}
		boolean minus = false;
		while( ops[ i ].endsWith( "-" ) ) {
			minus = !minus;
			ops[ i ] = ops[ i ].substring( 0, ops[ i ].length() - 1 );
		}
		if( ops[ i ].length() == 0 ) {
			ops[ i ] = minus ? "-" : "+";
			continue;
		}
		if( minus )
			numbers[ i + 1 ] = "-" + numbers[ i + 1 ];
		if( ( ops[ i ].contains( "-" ) || ops[ i ].contains( "+" ) ) && ( ops[ i ].contains( "/" ) || ops[ i ].contains( "*" ) ) ) {
			System.out.println("Syntaxfehler. * und / dürfen nicht nach + und - auftauchen." );
			return;
		}
	}
	int result;
	try {
		try {
			result = numbers[ 0 ].length() == 0
				? 0
					: Integer.valueOf( numbers[ 0 ] );
		} catch( ArrayIndexOutOfBoundsException e ) {
			System.out.println( "Keine Eingabe!" );
			return;
		}
		for( int i = 0; i < ops.length; i++ ) {
			int current = Integer.valueOf( numbers[ i + 1 ] );
			switch( ops[ i ] ) {
				case "+":
					result += current;
				break;
				case "-":
					result -= current;
				break;
				case "/":
					result /= current;
				break;
				case "*":
					result *= current;
				break;
				default: // Sollte nie auftreten!
					System.out.println( "Falscher Eingabewert!" );
					return;
			}
		}
	} catch( NumberFormatException e ) {
		System.out.println( "Nur Zahlen erlaubt!" );
		return;
	}
	System.out.println( "Ergebnis: " + result );
}

Ist leicht erweitert, aber sollte noch einigermaßen zu verstehen sein!
 
Zuletzt bearbeitet:

Mujahiddin

Top Contributor
Ja, um ehrlich zu sein, wird's erst ab der 34. Zeile spannend. Das davor dient dazu, Terme wie "22++--++-+--+-+-33" aufzulösen (schließlich handelt es sich dabei um mathematisch korrekte Terme). Wobei ich gerade sehe, dass es trotzdem nicht funktioniert. Also, ich habe es umgeschrieben, jetzt sieht es so aus:

Java:
public static void main(String... arg) throws Exception {
	System.out.print( "Ausdruck: " );
	Scanner in = new Scanner( System.in );
	String a = in.nextLine().replace( " ", "" );
	if( a.length() == 0 ) {
		System.out.println("Fehler! Leere Eingabe.");
		return;
	}
	if( a.replaceAll( "[0-9\\+\\-\\*/]", "" ).length() > 0 ) {
		System.out.println( "Ungültige Zeichen! Nur Zahlen und Operationen (+-*/) gestattet!" );
		return;
	}
	if( a.substring( a.length()-1, a.length() ).matches( "[\\+\\-\\*/]" ) ) {
		System.out.println("Syntaxfehler. Term muss mit einer Zahl enden.");
		return;
	}
	a = "+" + a;
	String[] numbers = a.split( "[\\+\\-/\\*]+" );
	String[] ops = a.split( " *\\d+ *" );
	for( int i = 0; i < ops.length; i++ ) { // doppelte Operationszeichen möglichst trimmen / Syntaxfehler ausschmeißen
		if( ops[ i ].length() == 1 )
			// Standardfall: Term besteht nur aus einem Zeichen.
			continue;
		if( ( ops[ i ].startsWith( "+" ) || ops[ i ].startsWith( "-" ) ) && ( ops[ i ].contains( "/" ) || ops[ i ].contains( "*" ) ) ) { // Operation started mit "+" bzw. "-" und beinhaltet ein
																																			// "/" bzw. "*"
			System.out.println( "Syntaxfehler. * und / dürfen nicht nach + und - auftauchen." ); // Terme wie "2+/2" sind nicht gestattet!
			return;
		}
		if( ops[ i ].contains( "/" ) && ops[ i ].indexOf( "/" ) != ops[ i ].lastIndexOf( "/" ) // mehrere "/"
			|| ops[ i ].contains( "*" ) && ops[ i ].indexOf( "*" ) != ops[ i ].lastIndexOf( "*" ) // mehrere "*"
			|| ops[ i ].contains( "*" ) && ops[ i ].contains( "/" ) ) { // gemischte "*" und "/"
			System.out.println( "Syntaxfehler. * und / dürfen nicht gemischt oder mehrfach auftauchen!" );
			return;
		}
		ops[ i ] = ops[ i ].replace( "+", "" ); // alle "+" entfernen (sind unerheblich in einem Term)
		if( ops[ i ].length() == 0 ) { // falls Operation nur aus "+" besteht, beibehalten und zur nächsten Operation.
			ops[ i ] = "+";
			continue;
		}
		// ab hier kann die Operation nur noch so aussehen: "[/\\*]?\\-+" (als Regex), also z.B: "/-" oder "-----" oder "*---" etc.
		boolean minus = false;
		int length = ops[ i ].length();
		minus = length % 2 == 0 ? false : true; // gerade Anzahl von "-" => "+", sonst "-"
		ops[ i ] = ops[ i ].replace( "-", "" ); // da gezählt wurde, können sie gelöscht werden.
		if( ops[ i ].length() == 0 ) { // falls Operation nur aus "-" bestand, passenden Operator setzen und zur nächsten Operation
			if( minus ) // ungerade Anzahl von "-"
				ops[ i ] = "-";
			else // gerade Anzahl von "-"
				ops[ i ] = "+";
			continue;
		}
		if( ops[ i ].startsWith( "*" ) || ops[ i ].startsWith( "/" ) ) // falls Mal-/Divisionszeichen vorangehend, Wahrheitswert umtauschen
			minus = !minus;
		if( minus ) // vor die nächste Zahl ein "-" setzen (wird beim Parsen zum Integer erkannt)
			numbers[ i + 1 ] = "-" + numbers[ i + 1 ];
		//fertig!
	}
	//hier beginnt das eigentliche Rechnen
	int result = 0;
	for( int i = 0; i < ops.length; i++ ) {
		int current = Integer.valueOf( numbers[ i + 1 ] ); // bei numbers[1] anfangen. numbers[0] ist leerer String, da ein "+" vor den Term gesetzt wurde.
		switch( ops[ i ] ) {
			case "+":
				result += current;
				break;
			case "-":
				result -= current;
				break;
			case "/":
				result /= current;
				break;
			case "*":
				result *= current;
				break;
		}
	}
	System.out.println( "Ergebnis: " + result );
}

Lange Reder, kurzer Sinn: Das ist ein extrem einfacher Taschenrechner, der nur 4 Operatoren kennt. Ich wüsste nicht, wie man das mit weniger Code bewerkstelligen sollte! Sowas ist schwerer als man erst denkt.
 
Zuletzt bearbeitet:

DaveIT

Mitglied
Ich glaube das schießt ein wenig über die Aufgabenstellung hinaus (;

Ja, um ehrlich zu sein, wird's erst ab der 34. Zeile spannend. Das davor dient dazu, Terme wie "22++--++-+--+-+-33" aufzulösen (schließlich handelt es sich dabei um mathematisch korrekte Terme).
Kein normaler Taschenrechner wertet solche Terme aus (; schon bei zwei Operatoren hintereinander gibst SYNTAX ERROR

Lange Reder, kurzer Sinn: Das ist ein extrem einfacher Taschenrechner, der nur 4 Operatoren kennt. Ich wüsste nicht, wie man das mit weniger Code bewerkstelligen sollte! Sowas ist schwerer als man erst denkt.
Extrem einfacher Taschenrechner:

Zahl1 eingeben -> Enter -> Operator eingeben -> Enter -> Zahl2 eingeben -> Enter => Ergebnis

So funktioniert jeder kleine Taschenrechner und der Codeaufwand ist minimal :)
 
H

hüteüberhüte

Gast
Ich weiß noch, dass man bei der Infixnotation Operatoren auf einen Stack/Queue schmeißt und Operanden auf einen anderen. Wie genau, müsste ich jetzt erst nach gucken

Bei einem echten Taschenrechner wird aber auch nicht viel programmiert :p

Taschenrechner ? Wikipedia :
Praktisch alle heutigen Taschenrechner benutzen elektronische Schaltkreise, verwenden LC-Displays als Anzeige und werden von einer Batterie oder Solarzelle mit Strom versorgt
 

Mujahiddin

Top Contributor
@DaveIT, wir reden aneinander vorbei.
Ich weiß, dass man einen Taschenrechner mit 3 Eingaben programmieren kann, die Frage war aber nach einem Taschenrechner, den man direkt mit einem Term (wie "3 + 3") füttert. Und nein, kein "halbwegs gescheiter" Taschenrechner gibt einen Syntaxfehler bei aneinandergereihten Plus und Minus aus. So ziemlich alle Taschenrechner sollten in der Lage sein, "3++-+-+-+-+-+--+3" aufzulösen (Mein Casio-Taschenrechner tut das auch). Du kannst sogar deinen eigenen Compiler hernehmen und wirst feststellen, dass ich Recht hatte.
Java:
int i = 3+-+-+-+-+-+-+-+-+-+-+3;
gibt keinen Compile-Error. Beim Compiler ist noch die Beschränkung gegeben, dass gleiche Operatoren nicht hintereinander auftauchen dürfen, da der Compiler dies als Inkrementierung wahrnimmt, ein
Code:
3+-+-[B]++[/B]3
artet also in einem Compile-Error aus, da der Compiler versucht, einen konstanten Ausdruck (hier das Literal "3") zu inkrementieren, also daraus ein
Code:
3 = 3+1;
macht. Das ist aber verboten.

Mit extrem einfachen Taschenrechner meinte ich, dass er lediglich zwei Zahlen mittels Addition und Multiplikation miteinander verknüpft. Ein extrem komplizierter Taschenrechner wäre einer, der Terme vereinfacht, Nullstellen von Polynomen ermittelt oder deren n-te Integration oder Ableitung angibt und was nicht sonst alles.

@hüteüberhüte, bei einem echten Taschenrechner hast du aber ein eigenes Eingabefeld, du musst dort keinen String umwandeln/auflösen, in dem alles mögliche stehen könnte. Außerdem handelt es sich dort um extrem komplizierte elektronische Schaltkreise - dieses Zitat aus Wikipedia sagt kein wenig über die Komplexität oder den Aufwand des Taschenrechners. Ein Computer ist schließlich auch nur ein riesiges Netz von Schaltkreisen.

Liebe Grüße.
 

timbeau

Gesperrter Benutzer
Extrem einfacher Taschenrechner:

Zahl1 eingeben -> Enter -> Operator eingeben -> Enter -> Zahl2 eingeben -> Enter => Ergebnis

So funktioniert jeder kleine Taschenrechner und der Codeaufwand ist minimal :)

Zu Zeiten der Lochkarten vll. Und der Codeaufwand ist größer als beim splitten eines "3+3" Strings.

@hüteüberhüte, bei einem echten Taschenrechner hast du aber ein eigenes Eingabefeld, du musst dort keinen String umwandeln/auflösen, in dem alles mögliche stehen könnte.

Ich kann in meine Taschenrechner am Pc (gcaltool) alles eintippen
 
H

hüteüberhüte

Gast
dieses Zitat aus Wikipedia sagt kein wenig über die Komplexität oder den Aufwand des Taschenrechners.

Viel mehr stand darüber auch nicht drin

Ein Computer ist meilenweit von einem Taschenrechner entfernt. Programmieren in einer high-level Programmiersprache hat rein gar nichts mit elektronischen Schaltungen zu tun

Dein Programm kann trotz allen Aufwands auch nicht alle möglichen Terme parsen

Wer so was schreibt: 22++--++-+--+-+-33, der kann auch kein vernünftiges Ergebnis erwarten (jetzt mal unabhängig davon, ob das je nach Definition ein korrekter Term ist oder net)
 

Mujahiddin

Top Contributor
Ein Programm sollte möglichst unanfällig für Fehler sein.
Ein Informatiker muss alle möglichen Eingaben berücksichtigen. Wenn du in deinem Programm nach dem Alter einer Person fragst, dann baust du logischerweise eine try-catch Formulierung ein und catchst eine NumberFormatException anstatt zu sagen "Wer 'fjji4f' als Alter eingibt, braucht kein Ergebnis zu warten" und die Exception irgendwo quer durch deinen Code fliegen zu lassen.
 

RomanS

Mitglied
Da ist ja eine Diskussion entbrannt... :autsch:
Ist ja auch egal. Da ich dem Ratschlag gefolgt bin, eher an etwas ran zu gehen, was auch wirklich Sinn macht. Habe ich heute mal einen Haushaltsrechner erstellt. Den kann ich wirklich gebrauchen.
Meine Freundin und ich machen am Ende jeden Monates einen Ausgabenvergleich(z.b. Lebensmittel usw) und dann muss der eine blechen und der andere kassiert :applaus:
Hier der Code:
Java:
import java.util.Scanner;
import java.util.ArrayList;

public class HaushaltsRechner {
	
	public static void main(String args[]){
	Scanner sc = new Scanner(System.in);
	ArrayList<Double> money1 = new ArrayList<Double>();
	ArrayList<Double> money2 = new ArrayList<Double>();
	System.out.println("Herzlich Willkommen zum Haushaltsrechner");
	System.out.println("Wie heisst Ihr?");
	String[] input = sc.nextLine().trim().split("\\s+");
    final String person1 = input[0], person2 = input[2];
	System.out.print("Hallo " + person1);System.out.println(" und " + person2);
	String no = "n";
	double inputMoney = 0;
	String inData;
	
	
	  while (true )
      {
		  
          System.out.print(person1);System.out.print(" bitte Ausgabe eingeben:");
          inData = sc.nextLine();
          inputMoney = Double.parseDouble(inData);	// Die erste Person gibt die Ausgaben ein
          money1.add(inputMoney);
          System.out.println("Eine weitere Ausgabe eingeben? j/n "); //Anwort mit n springt auf zweite Person
          no = sc.nextLine();
          if(no.equals("n"))        
          { break;}
          else continue;
       
          }
           
      System.out.println("Die Ausgaben lauten: " + money1.toString());           // gibt jede Ausgabe einzeln an
             
      // Summe  Ausgaben von Person 1 
      double sum1 = 0.0;
      for ( int index = 0; index < money1.size(); index++ )
      {
      
    	  sum1 = sum1 + money1.get( index ) ;}
      System.out.println("Die Summe der Ausgaben beträgt " + sum1 );  
      
      
      while (true)
      {
		  
          System.out.print(person2);System.out.print(" bitte Ausgabe eingeben:");
          inData = sc.nextLine();
          inputMoney = Double.parseDouble(inData);	// Die zweite Person gibt die Ausgaben ein
          money2.add(inputMoney);
          System.out.println("Eine weitere Ausgabe eingeben? j/n "); 
          no = sc.nextLine();
          if(no.equals("n"))        
          { break;}
          else continue;
       
          }
           
      System.out.println("Die Ausgaben lauten: " + money2.toString());           // gibt jede Ausgabe einzeln an
             
      double sum2 = 0.0;
      for ( int index = 0; index < money2.size(); index++ )
      {
    	  sum2 = sum2 + money2.get( index ) ;}
      
      System.out.println("Die Summe der Ausgaben beträgt " + sum2 ); 
  
	double sumComplete, sum3, get1, get2, Person = 2;
	
	sumComplete = sum1 + sum2;
    if(sum1 > sum2){   // Welche Person hat mehr ausgegeben?
    sum3 = sumComplete/Person;
    get1 = sum1 - sum3;  // berechnet wieviel die 1.Person von 2.Person bekommt
    System.out.println(person1 + " hat " + sum1 + " ausgegeben."); 
    System.out.println(person2 + " hat " + sum2 + " ausgegeben.");
    System.out.println(person1 +" bekommt von " + person2 + " " + get1 + " Euro");}
    else{
    sum3 = 	sumComplete/Person;
    get2 = sum2 - sum3;     // berechnet wieviel die 2.Person von 1.Person bekommt
    System.out.println(person1 + " hat " + sum1 + " ausgegeben.");  
    System.out.println(person2 + " hat " + sum2 + " ausgegeben.");
    System.out.println(person2 +" bekommt von " + person1 + " " + get2 + " Euro");}   	
    }    
	}

Das gute daran ist, dass man das Progamm immer schön erweitern kann. Habe mir vorgestellt dann als nächstes zu Beginn abzufragen wieviel Personen im Haushalt leben. Das Programm dann auf 3 bis 4 Personen zu erweitern. Dann dazu vielleicht, wer zu welchen Anteil sich beteiligt(Beispiel, nicht 50:50, weil der eine mehr verdient). Jede Ausgabe einzeln benennen(z.B. Lebensmittel, Möbel, Benzin, Versicherung usw.) und das in eine Statistik packen. Und das natürlich dann irgendwann auf einer schönen Oberfläche.
Das wird dauern, aber gibt eine gute Übung.
Tipps nehme ich gerne an ;-)
 

timbeau

Gesperrter Benutzer
Ich meinte in erster Linie einen TASCHENrechner, den man in der Tasche trägt. Zum Beispiel Casio fx-85ES. Wenn man einen erweiterten Taschenrechner schreiben will, würde sich sowieso ein Parser eher eignen.

Ein Widerspruch in sich. Einen Taschenrechner für die Tasche programmiert man nicht so wie in diesem Fall, da die Hardware nicht vorhanden ist. Reden wir von einem Javaprogramm oder einem fertigen Taschenrechner? Ich denke ersteres. Ich bezweifel auch, dass dein "++--++"-Wirrwar mathematisch korrekt ist. Zumindest nicht per inorder-Schreibweise und bei pre-Order muss die Operanden-Menge stimmen. Lasse mich aber gerne eines besseren belehren.

@Roman:

Java:
 System.out.print("Hallo " + person1);System.out.println(" und " + person2);

:autsch:


Java:
 System.out.print("Hallo " + person1 + " und " + person2);

Die Formatierung ist weiter miserabel.

Java:
for ( int index = 0; index < money1.size(); index++ )
      {
      
          sum1 = sum1 + money1.get( index ) ;}
:autsch:

Java:
for ( int index = 0; index < money1.size(); index++ ) {
                sum1 = sum1 + money1.get( index ) ;
          }

2mal eine (while-true) Schleife mit identischem code. Auslagern in Methoden!
Person als String anstatt als eigenes Objekt mit eigenen Ausgaben etc.

Summenberechnungen:
sum3 2x berechnet.
Wieder Code doppelt und unnötig.

Java:
sum3 = sum1 -sum2;
if(sum3 < 0) {
// dann hat Person 2 wohl mehr ausgegeben. 
}

Du hast noch echt viel vor dir. Finds ja gut aber bevor du dich an die GUI setzt erstmal die Grundlagen lernen. Sonst wirst du keinen guten Code schreiben
 
Zuletzt bearbeitet:
H

hüteüberhüte

Gast
Ein Widerspruch in sich. Einen Taschenrechner für die Tasche programmiert man nicht so wie in diesem Fall, da die Hardware nicht vorhanden ist. Reden wir von einem Javaprogramm oder einem fertigen Taschenrechner? Ich denke ersteres. Ich bezweifel auch, dass dein "++--++"-Wirrwar mathematisch korrekt ist. Zumindest nicht per inorder-Schreibweise und bei pre-Order muss die Operanden-Menge stimmen. Lasse mich aber gerne eines besseren belehren.

Das meinte ich ja. Man kann natürlich alle möglichen Definitionen heranziehen, aber normalerweise gehören zu einem Operator zwei Operanden, was in diesem Fall natürlich eindeutig nicht so ist

Ein Informatiker muss alle möglichen Eingaben berücksichtigen.

Nö, muss er nicht :D Ein Programmierer muss das implementieren, was die Anforderungsdefinition/Spezifikation festlegt :D
 
Zuletzt bearbeitet von einem Moderator:

DaveIT

Mitglied
@DaveIT, wir reden aneinander vorbei.
Ich weiß, dass man einen Taschenrechner mit 3 Eingaben programmieren kann, die Frage war aber nach einem Taschenrechner, den man direkt mit einem Term (wie "3 + 3") füttert. Und nein, kein "halbwegs gescheiter" Taschenrechner gibt einen Syntaxfehler bei aneinandergereihten Plus und Minus aus. So ziemlich alle Taschenrechner sollten in der Lage sein, "3++-+-+-+-+-+--+3" aufzulösen (Mein Casio-Taschenrechner tut das auch).

Ja ich glaube wir haben uns da in verschiedene philosophien verrannt (;

also mein texas instruments ti 30x iis kann das nicht, hab damit meine reifeprüfung in mathematik und elektrotechnik abgelegt und bin daher von diesem rechner ausgegangen.

bin nach dem einfachsten taschenrechner prinzip vorgegangen das ich kannte (wie auf jedem desktop zB)... hat halt beides seine vor- und nachteile :)

@Roman: neben der formatierung schau dir doch noch ein wenig mehr die java grundlagen an. prozentuale anteile und namen können wunderbar in objekten abgelegt werden. setz dich auch mit methoden intensiver auseinander, so vermeidest du eine lange main - methode.

eine konkrete aufgabenstellung ist aber jedenfalls ein super ansatz (;
 
H

hüteüberhüte

Gast
@RomanS: Habs einfach mal kopiert, compiliert und laufen lassen:

Code:
Herzlich Willkommen zum Haushaltsrechner
Wie heisst Ihr?
foo und bar
Hallo foo und bar
foo bitte Ausgabe eingeben:11.11
Eine weitere Ausgabe eingeben? j/n 
j
foo bitte Ausgabe eingeben:10
Eine weitere Ausgabe eingeben? j/n 
n
Die Ausgaben lauten: [11.11, 10.0]
Die Summe der Ausgaben beträgt 21.11
bar bitte Ausgabe eingeben:9.99
Eine weitere Ausgabe eingeben? j/n 
j
bar bitte Ausgabe eingeben:9
Eine weitere Ausgabe eingeben? j/n 
n
Die Ausgaben lauten: [9.99, 9.0]
Die Summe der Ausgaben beträgt 18.990000000000002
foo hat 21.11 ausgegeben.
bar hat 18.990000000000002 ausgegeben.
foo bekommt von bar 1.0599999999999987 Euro

Sieht schon gut aus, allerdings könnte auch noch vieles verbessert werden. Damit nicht diese double-Ungenauigkeiten auftreten, sollte man immer mit Cent rechnen
 
Zuletzt bearbeitet von einem Moderator:

RomanS

Mitglied
Ich habe es jetzt nochmal neu geschrieben. Ich hoffe so sieht es schon besser aus?
Die double ungenauigkeit habe ich noch nicht abgeschaltet. Das mache ich, wenn nochmal alles überarbeitet wird. Es kommt noch eine Schleife bei EingabeAusgaben rein. Es soll abgefragt werden, wieviele Ausgaben eingeben werden. Es nerbt nach jeder Ausgabe wieder mit j/n antworten zu müssen.
Dazu wird das Programm dann auf bis zu 4 Personen erweitert.

Hier der Code:
Java:
import java.util.ArrayList;
import java.util.Scanner;


public class HaushaltsRechner2 {
	static Scanner sc = new Scanner(System.in);
	static ArrayList<Double> money1 = new ArrayList<Double>();
	static ArrayList<Double> money2 = new ArrayList<Double>();
	
	public HaushaltsRechner2(){
		
	welcome();
	Person person1 = new Person();
	Person person2 = new Person();
	String[] input = sc.nextLine().trim().split("\\s+");// Namen eingabe
    person1.setName(input[0]); 
    person2.setName(input[2]);
	name(person1,person2);
	String p1 = person1.getName();
	String p2 = person2.getName();
	int[] person = {0,1,2,3,4};
	eingabeAusgaben(p1,person[1]);
	double sum1 =0.0,sum2= 0.0, sumcomplete = 0.0;
	sum1=rechneSum(sum1, person[1]);
	eingabeAusgaben(p2, person[2]);
	sum2=rechneSum(sum2, person[2]);
	sumcomplete=rechneSumComplete(sum1,sum2);
	rechneVergleich(sumcomplete,sum1,sum2,p1,p2);
	
	}
	
	public void welcome(){
		System.out.println("Herzlich Willkommen zum Haushaltsrechner");
		System.out.println("Wie heisst Ihr?");
	}
	public void name(Person person1, Person person2){  
		System.out.println("Hallo " + person1.getName() + " und " + person2.getName());				
	}
		
	public void eingabeAusgaben(String person, int p){
		String no = "n";
		double inputMoney = 0;
		String inData;	
		while (true )
	      {  
	          System.out.print(person + " bitte Ausgabe eingeben:");
	          inData = sc.nextLine();
	          inputMoney = Double.parseDouble(inData);	// Person gibt die Ausgaben ein
	          switch(p)
	          {
	          case 1: money1.add(inputMoney); break;
	          case 2: money2.add(inputMoney);
	          }   
	          System.out.println("Eine weitere Ausgabe eingeben? j/n "); //Anwort mit n springt auf nächste Person
	          no = sc.nextLine();
	          if(no.equals("n"))        
	          { break;}
	          else continue;
	       }
	}
	public double rechneSum(double sum , int p){
	sum = 0.0;
		switch(p){
			
		case 1: System.out.println("Die Ausgaben lauten: " + money1.toString());           // gibt jede Ausgabe einzeln an
		   for ( int index = 0; index < money1.size(); index++ )
		   {  sum = sum + money1.get( index ) ;}
		   System.out.println("Die Summe der Ausgaben beträgt " + sum );  break;
			
		case 2: System.out.println("Die Ausgaben lauten: " + money2.toString()); 		     
		   for ( int index = 0; index < money2.size(); index++ )
		   {  sum = sum + money2.get( index ) ;}
		   System.out.println("Die Summe der Ausgaben beträgt " + sum ); break; } // Summe  Ausgaben von Person 2 
			
	return sum;
	}
	public double rechneSumComplete(double sum1, double sum2){
	return sum1 + sum2;
	}
	public void rechneVergleich(double sumComplete,double sum1, double sum2, String p1, String p2){
	double sum3 = 0.0, get1 = 0.0, get2 = 0.0, Person = 2;
	 sum3 = sumComplete/Person;
	    if(sum1 > sum2){   // Welche Person hat mehr ausgegeben?
	    get1 = sum1 - sum3;  // berechnet wieviel die 1.Person von 2.Person bekommt
	    System.out.println(p1 + " hat " + sum1 + " ausgegeben."); 
	    System.out.println(p2+ " hat " + sum2 + " ausgegeben.");
	    System.out.println(p1 +" bekommt von " + p2 + " " + get1 + " Euro");}
	    else{
	    get2 = sum2 - sum3;     // berechnet wieviel die 2.Person von 1.Person bekommt
	    System.out.println(p1+ " hat " + sum1 + " ausgegeben.");  
	    System.out.println(p2+ " hat " + sum2 + " ausgegeben.");
	        if(sum2 == sum3){
	    	System.out.println(p2 +" und " + p1 + " haben beide das gleiche ausgeben");}
	    	else{
	        System.out.println(p2 +" bekommt von " + p1 + " " + get2 + " Euro");}}
	    }
	
	public static void main(String args[]){
	new HaushaltsRechner2();

	
}
}
 

DaveIT

Mitglied
Auf die Schnelle:

> Ich würde die Ausgaben gleich in der Klasse Person speichern.
> Wenn du eine Klasse mit einer nicht wechselnden Variable hast (z.B.: der Name) kannst du diese auf final setzten und im Konstruktor übergeben. So vermeidest du ungenutzte Objekte.

Als Beispiel:

Java:
public class Person{
        private final String name;
        private final ArrayList<Integer> ausgaben = new ArrayList<>();

        public Person(String name) {
            this.name = name;
        }
        
        public boolean addAusgabe(double ausgabe){
            return ausgaben.add((int) (ausgabe * 100));
        }
        
        public double gesamtAusgaben(){
            int gesamt = 0;
            for(int ausgabe: ausgaben)
                gesamt += ausgabe;
            return (double)gesamt / 100;
        }

        public ArrayList<Integer> getAusgaben() {
            return ausgaben;
        }
                
        public String getName() {
            return name;
        }                
    }

LG
 

AquaBall

Top Contributor
[OT]
Habe ich heute mal einen Haushaltsrechner erstellt. Den kann ich wirklich gebrauchen.
Meine Freundin und ich machen am Ende jeden Monates einen Ausgabenvergleich(z.b. Lebensmittel usw) und dann muss der eine blechen und der andere kassiert :applaus:

Das gute daran ist, dass man das Progamm immer schön erweitern kann. Habe mir vorgestellt dann als nächstes zu Beginn abzufragen wieviel Personen im Haushalt leben. Das Programm dann auf 3 bis 4 Personen zu erweitern. Dann dazu vielleicht, wer zu welchen Anteil sich beteiligt(Beispiel, nicht 50:50, weil der eine mehr verdient).
Tipps nehme ich gerne an ;-)

Wenn du so weit bist, dann gib mal folgendes ein, und sag mir die Antwort:
In einem alten arabischem Rätsel treffen die zwei Wanderer Achmed und Bashir auf einen Hirten beim Flötenspiel. Achmed hat drei Fladen und Baschir fünf Fladen Brot bei sich hat. Alle acht Brote sind gleich gross. Das Flötenspiel und der Zuspruch des Hirten ermuntert die beiden zu einer Rast im Schatten des Baumes, und alle drei verspeisen die Brote gemeinsamen. Jeder isst gleichviel. Nach dem Essen gibt der Hirte den Wanderern vor der Weiterreise acht Münzen. Welcher Anteil des Geldes steht nun jedem fairerweise zu?

Lösung 1: A=4:B=4, mit der Begründung: beide hat alles gegeben und es wird gerecht geteilt?
Lösung 2: A=3:B=5, mit der Begründung: jeder hat genau soviel Brote hergegeben?
Lösung 3: A=1:B=7, mit der Begründung: Achmed hat 1/3 Fladen abgegeben und Bashir 7/3?
Lösung 4: A=2.67:B=2.67 mit der Begründung: sie haben ein gemeinsames Mahl gehabt, und jeder hat dazu beigetragen?
Lösung 5: A=0:B=0 mit der Begründung: das Einschieben einer Rast, die Gesellschaft und Flötenspiel des Hirten war mehr wert, eine Entlohnung wäre unehrenhaft?

Was heißt schon: "richtige" Antwort?
[/OT]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
1 Wie dieses Muster am einfachsten erkennen? Java Basics - Anfänger-Themen 32
V wie kann man am einfachsten für ein Element der JavaFX die Umrandung aktiwieren ? auch ohne css ? Java Basics - Anfänger-Themen 4
H Unterschied zwischen 2 Date in Sekunden am einfachsten? Java Basics - Anfänger-Themen 5
-horn- Wie am Einfachsten mit Config-Datei umgehen. Welches Format? Java Basics - Anfänger-Themen 6
H Objekte in einer Hashtable am einfachsten sortieren Java Basics - Anfänger-Themen 13
Jere58 Aufgabe zu Mustern Java Basics - Anfänger-Themen 1
M Interfaces Aufgabe Java Basics - Anfänger-Themen 2
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
Justin4687 Benötige Hilfe bei folgender Aufgabe Java Basics - Anfänger-Themen 2
A Erste Schritte Aufgabe mit while Schleife Java Basics - Anfänger-Themen 11
S Hilfe zu einer Aufgabe Java Basics - Anfänger-Themen 5
M Java Programmierung Aufgabe Anfänger Java Basics - Anfänger-Themen 1
R Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
Mikejr Java Berg aufgabe Java Basics - Anfänger-Themen 6
frager2345 Aufgabe Hash Objekt Elemente ausgeben Java Basics - Anfänger-Themen 2
berserkerdq2 Habe ich die Aufgabe richtig gelöst? Java Basics - Anfänger-Themen 3
D Hilfe bei einer Aufgabe mit for-Schleife Java Basics - Anfänger-Themen 6
Neuling47 Ich zerbreche mit den kopf an einer Aufgabe Java Basics - Anfänger-Themen 61
G Fragen zu Kompelierfehler in Aufgabe. Java Basics - Anfänger-Themen 25
Robert_Klaus Hamster java Simulation Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
T Informatik Studium Aufgabe Java Basics - Anfänger-Themen 4
T Aufgabe Informatik Studium Java Basics - Anfänger-Themen 10
I matrix aufgabe Java Basics - Anfänger-Themen 22
J Brauche Hilfe bei for-each Aufgabe Java Basics - Anfänger-Themen 1
9 Aufgabe Bruttorechner Java Basics - Anfänger-Themen 14
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
J Brauche Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
J boolean aufgabe Java Basics - Anfänger-Themen 9
D Snake-Spiel ähnliche Aufgabe Hilfe Java Basics - Anfänger-Themen 3
M Hilfe - Array Aufgabe Java Basics - Anfänger-Themen 8
StevenGG Aufgabe im Studium Java Basics - Anfänger-Themen 36
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
S Schulaufgabe - verstehe leider die Aufgabe nicht Java Basics - Anfänger-Themen 4
Leo0909 Ich brauche Hilfe bei dieser Aufgabe Java Basics - Anfänger-Themen 2
R Eclipse Aufgabe Java Basics - Anfänger-Themen 4
J OOP-Aufgabe Java Basics - Anfänger-Themen 15
Helix19 Informatik Grundkurs (Haus-)Aufgabe Java Basics - Anfänger-Themen 5
P eine kleine Aufgabe mit Audio Java Basics - Anfänger-Themen 1
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
TimoN11 Java spezielle Suchprobleme - Aufgabe Java Basics - Anfänger-Themen 5
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 2
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 9
dieter000 Aufgabe Hilfe Java Basics - Anfänger-Themen 18
jonathanpizza Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
Q Hilfe auf Aufgabe(Matrixmultiplikation) Java Basics - Anfänger-Themen 1
jonathanpizza Hilfe bei der Aufgabe Java Basics - Anfänger-Themen 19
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
C Rechnungen-Aufgabe Java Basics - Anfänger-Themen 18
C Biene-Aufgabe Java Basics - Anfänger-Themen 2
K Algorithmen und Datenstrukturen Programmier Aufgabe Java Basics - Anfänger-Themen 10
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Aufgabe Flussdiagramm, kann jemand checken? Java Basics - Anfänger-Themen 8
B Methoden Ausgeben Aufgabe Java Basics - Anfänger-Themen 15
M Lösung Aufgabe - Java Programmiren lernen für Dummies Java Basics - Anfänger-Themen 11
J Rekursion Klausur Aufgabe Java Basics - Anfänger-Themen 2
J Exception-Aufgabe Java Basics - Anfänger-Themen 8
I Methoden char Array Aufgabe (bitte hierbei um Hilfe) Java Basics - Anfänger-Themen 3
F Aufgabe: Abstand von einem Punkt zu einem anderen Punkt Java Basics - Anfänger-Themen 10
T Aufgabe zum Verschlüsselungsalgorithmus Java Basics - Anfänger-Themen 11
J Erste Schritte Aufgabe Java Basics - Anfänger-Themen 24
T Methoden BinaryTree transformieren Aufgabe Java Basics - Anfänger-Themen 36
J Brauche Hilfe bei einer aufgabe Java Basics - Anfänger-Themen 1
J Hat jemand einen Lösungsansatz für diese Aufgabe? Java Basics - Anfänger-Themen 1
S Sortieralgorithmus - Aufgabe mit Lösungsidee Java Basics - Anfänger-Themen 20
A Aufgabe: Gleitkommazahlen Java Basics - Anfänger-Themen 3
A Java-Programmierungs Aufgabe Java Basics - Anfänger-Themen 2
U Aufgabe zu Kontrollstrukturen Java Basics - Anfänger-Themen 8
G Probleme bei Aufgabe Java Basics - Anfänger-Themen 12
J Aufgabe als Feuertaufe Java Basics - Anfänger-Themen 8
S Unbedingte hilfe bei Java Aufgabe [Schleife / Zinsrechnung] Java Basics - Anfänger-Themen 14
J Hilfe bei Java Aufgabe (Restschuld berechnen) Java Basics - Anfänger-Themen 11
G Ratlosigkeit zur Aufgabe im Anhang (boolean, equals.) Java Basics - Anfänger-Themen 20
S Hilfe bei Java Aufgabe (Schleifen) Java Basics - Anfänger-Themen 25
B Probleme bei einer Aufgabe Java Basics - Anfänger-Themen 19
B BITTE!! Ich brauche dringende Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 17
H aufgabe 4 Java Basics - Anfänger-Themen 297
M Hilfe bei Projektorientierungs-Aufgabe !! Java Basics - Anfänger-Themen 3
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
H java aufgabe Java Basics - Anfänger-Themen 7
E Mathematische Aufgabe: Antwort entspricht nicht der Lösung Java Basics - Anfänger-Themen 5
H was verlangt die aufgabe ? Java Basics - Anfänger-Themen 10
H java aufgabe Java Basics - Anfänger-Themen 68
H java aufgabe Java Basics - Anfänger-Themen 25
H aufgabe java luhn algorithmus Java Basics - Anfänger-Themen 10
R Java Aufgabe (Teilbarkeit) Java Basics - Anfänger-Themen 7
H java aufgabe Java Basics - Anfänger-Themen 44
H java aufgabe Java Basics - Anfänger-Themen 7
H java string aufgabe Java Basics - Anfänger-Themen 10
H array aufgabe Java Basics - Anfänger-Themen 13
D Erste Schritte Lösen dieser Aufgabe, Hilfe! Java Basics - Anfänger-Themen 12
H aufgabe Java Basics - Anfänger-Themen 9
H lösung aufgabe Java Basics - Anfänger-Themen 12
S Hilfe für Aufgabe Java Basics - Anfänger-Themen 4
H java online aufgabe Java Basics - Anfänger-Themen 4
H Array aufgabe Java Basics - Anfänger-Themen 7
H oop aufgabe probe kalusur Java Basics - Anfänger-Themen 11
H oop aufgabe Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben