Java Problem(e) mit int-Funktion

datalukas

Captain
Registriert
Dez. 2009
Beiträge
3.628
Hallo liebe Community,
ich bin in Sachen Java Anfänger und wollte mal ein einfaches Programm schreiben.
Es sollen zwei Zahlen verglichen werden und die größere ausgegeben werden. Ich weiß, die Funktion wäre nicht nötig, aber soll nur zur Übung sein. Die IDE ist übrigens NetBeans.
Code:
public class NP
{
 public static int Groesser(int a, int b)
 {  
   if (a > b)
       return a;
   else 
       return b;
 }
 public static void main( String[] args )
  {
   System.out.println("Geben sie zwei Zahlen ein:");
   int eingabe = new java.util.Scanner( System.in ).nextInt();
   int eingabe1 = new java.util.Scanner( System.in ).nextInt();   
   System.out.printf("%i ist die größere Zahl", Groesser(eingabe, eingabe1));
  }
}

Im Moment ist das Programm noch falsch, denn wenn a und b gleich wären, würde das Programm b herausgeben. Aber ich weiß nicht, wie ich es mache, dass der Rückgabewert bewirkt, dass das Programm die Meldung "Beide Zahlen sind gleich groß" herausgibt.

Wenn ich jetzt mal davon absehen und das Programm einfach kompiliere und starte, habe ich ein anderes Problem. Der Compiler übersetzt ohne Murren, aber in der Konsole von Netbeans steht nach der Eingabe:

Geben sie zwei Zahlen ein:
2
1
Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = 'i'
at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2646)
at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2675)
at java.util.Formatter.parse(Formatter.java:2528)
at java.util.Formatter.format(Formatter.java:2469)
at java.io.PrintStream.format(PrintStream.java:970)
at java.io.PrintStream.printf(PrintStream.java:871)
at np.NP.main(NP.java:25)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)

Hoffe, ihr könnt mir helfen.
Gruß
Datalukas
 
Warum nimmst du überhaupt die printf Funktion? Die kannte ich noch gar nicht in Java. Und wenn, dann erwartet er als Parameter für %i auch einen int und keinen Methoden-Call sicherlich.
 
War printf noch aus C gewöhnt (hab auch schon ein bisschen C programmiert), außerdem passte mir das mit Platzhalter gut.
Und wenn, dann erwartet er als Parameter für %i auch einen int und keinen Methoden-Call sicherlich.
Ich dachte, wenn die Methode vom Typ int ist, sollte es gehen. Liege ich anscheinend falsch.
 
Funktionsaufruf ist in Ordnung, jedoch anstatt %i ein %d
 
printf ist okay,
nur solltest du mal das %i durch ein %d austauschen
 
Es geht schon, die Meldung beschwert sich ja auch über das i in deinem Formatstring (das müsste ein d sein, siehe etwa dort: http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax)


Was das andere angeht: eine weitere Fallunterscheidung (noch ein if irgendwo) hilft. Davon ab gibt deine Groesser-Methode (dieklein geschrieben werden sollte) das Maximum der beiden Zahlen aus, tut also im Falle gleicher Zahlen nicht das, was der Name nahelegt. Überhaupt würde ich von einer so benannten Methode eher einen Wahrheitswert erwarten.
 
Aber ich weiß nicht, wie ich es mache, dass der Rückgabewert bewirkt, dass das Programm die Meldung "Beide Zahlen sind gleich groß" herausgibt.
public static int Groesser(int a, int b)
{
if(a == b){
System.out.println("a ist gleich b");
}
if (a > b)
return a;
else
return b;

}
So zum Beispiel.
Elegant ist aber anders.
Edit: Zusätzlich bekommst du wenn a = b sein sollte den kleinen Text aus der Methode
zuzüglich zu dem was bei einem return b geschiet.
 
Zuletzt bearbeitet:
Vielen Dank. Jetzt funktioniert es.
@Mika911 Danke. Aber wenn ich das eingebe kommt:
a ist gleich b und darunter steht:
2 ist die größere Zahl.
Gibt es noch eine andere Möglichkeit.
BTW:
Kann ich mit println eigentlich auch eine Variable und Text in eine Zeile schreiben?
 
Ja, das ist der Punkt den ich im Edit nochmal angesprochen hab.
Weil das a=b zutrifft aber a nicht kleiner b ist.
Somit wird der "Else"-zweig auch ausgeführt.
Ich weiß ja nicht was du von der Methode erwartest.
Endweder machst du die Textbearbeitung und ausgabe direkt in der Methode,
oder du entscheidest in der Methode nur welche stellungen die Zahlen genießen und
gibts den ensprechenden Wert zurück,
die Textbearbeitung würde dann in dem Programmcode außerhalb der Methode abgehandelt werden müssen.
Edit:

Wenn dann kann man es so machen(pseudocode):

public static void methode(int a, int b){
wenn a ==b{
textausgabe(a ist gleich b);
}
wenn a > b{
textausgabe(a ist größer b);
}
wenn b > a{
textausgabe(b ist größer a);
}
return;
}
 
Zuletzt bearbeitet:
Wozu denn überhaupt eine eigene Methode zum vergleichen?

Ohne länger darüber nachzudenken würde ich etwas machen wie

if(a == b) System.out.println("a und b gleich");
else System.out.println((a>b?a:b)+" ist groesser");
 
Wie gesagt, die Methode war mehr zum Ausprobieren da. Aber mit einer Funktion mit Rückgabewerten gehts dann anscheinend nicht.
 
Es geht schon, nur musst du dir eben überlegen, was du möchtest: du willst scheinbar von der Methode wissen, ob eine Zahl größer ist und wenn ja den Wert der größeren Zahl. Für letztere Information muss schon den komplette Integerbereich zur Verfügung stehen, als ist im Rückgabetyp "kein Platz" mehr für die andere Information.

D.h. entweder müsstest du einen geeigneten Rückgabetyp wählen, der die gewünschten Informationen auch transportieren kann, oder aber entsprechend auf mehrere Stellen bzw. Methoden aufteilen.
 
Eine weniger schöne Lösung wäre (falls man bei int als Rückgabewert bleiben möchte):

public static int Groesser(int a, int b)
{
if(a == b){
return Integer.MAX_VALUE;
}
if (a > b)
return a;
else
return b;
}

In der Main-Methode MAX_VALUE abfangen und sonst das Ergebnis liefern.
 
Dann ist die Methode aber schlicht falsch (bzw. ihr Verhalten entfernt sich noch weiter von dem was man dem Namen nach erwarten würde), falls eine der übergebenen Zahlen den reservierten Wert (in dem Fall also Integer.MAX_VALUE) hat.

Falls man schon weiß, dass die Daten nur aus einem bestimmten Bereich stammen, kann man darüber zwar nachdenken, sollte es imho aber nicht so machen.


Ansonsten bleibe ich dabei, dass die Methode eher maximum oder so heißen sollte...
 
Code:
	public static Integer groesser(int a, int b) {
		if (a == b)
			return null;
		else if (a > b)
			return a;
		else
			return b;
	}
Du musst nur noch vor der Ausgabe prüfen, ob der Rückgabewert null oder eine Zahl ist. Wenn du eine rein textuelle Ausgabe willst, die in deine Abfrage passt:
Code:
	public static String groesser(int a, int b) {
		if (a == b)
			return "Keine";
		else if (a > b)
			return String.valueOf(a);
		else
			return String.valueOf(b);
	}
(Du musst nur noch %i in %s ändern)
 
Da hat xbrtll gar nicht so unrecht. Hat man keine Eingrenzungen und bleibt der Name der Methode weiterhin so, verwirrt es nur und man sollte sich eine andere Möglichkeit überleben. (Man könnte z.b. Strings zurückgeben, welche man vorher definiert)

So ungefähr:
Code:
	private static final String A_IST_GROESSE = "a";
	private static final String B_IST_GROESSE = "b";
	private static final String A_UND_B_SIND_GLEICH = "a=b";

	public static String Groesser(int a, int b) {
		if (a > b)
			return A_IST_GROESSE;
		if (b > a)
			return B_IST_GROESSE;

		return A_UND_B_SIND_GLEICH;
	}

	public static void main(String[] args) {
		System.out.println("Geben sie zwei Zahlen ein:");
		int eingabe = new java.util.Scanner(System.in).nextInt();
		int eingabe1 = new java.util.Scanner(System.in).nextInt();

		String str = Groesser(eingabe, eingabe1);

		if (str.equals(A_IST_GROESSE)) {
			System.out.printf("%d ist die größere Zahl", eingabe);
		} else if (str.equals(B_IST_GROESSE)) {
			System.out.printf("%d ist die größere Zahl", eingabe1);
		} else if (str.equals(A_UND_B_SIND_GLEICH)) {
			System.out.printf("%s %d %d %s", "Die Zahlen", eingabe, eingabe1,
					"sind gleich groß");
		}

	}

Wobei der Methoden Name immer noch etwas unpassend ist, wenn man es den so aufblähen will, aber davon mal ab. (Macht man bei sowas kurzes normalerweise NICHT!)

Edit:
Natürlich könnte man auch gleich die Ausgabe zurück geben. Macht bei sowas kurzem vllt. auch etwas mehr Sinn. ; )
 
Zuletzt bearbeitet:
xbrtll schrieb:
Dann ist die Methode aber schlicht falsch (bzw. ihr Verhalten entfernt sich noch weiter von dem was man dem Namen nach erwarten würde), falls eine der übergebenen Zahlen den reservierten Wert (in dem Fall also Integer.MAX_VALUE) hat.

Natürlich ist es klar, dass das Programm nicht richtig arbeitet, wenn man den Wertebereich nicht abgrenzt. Deswegen ist die Lösung auch nicht so schön. Daher hier eine verbesserte Version ^^

public static int Groesser(int a, int b)
{
if(a == b){
return Integer.MAX_VALUE-a;
}
if (a > b)
return a;
else
return b;
}

In der Main-Methode MAX_VALUE-a abfangen und sonst das Ergebnis liefern.
Die Ausgabe in der Main-Methode berücksichtigt z.Z. den Fall nicht, dass die Zahlen gleich sind. Daher muss hier so und so was geändert werden.

PS: arrg und gleich einen Fall gefunden, wo es nicht richtig funktionieren würde. Und zwar bei b=MAX_VALUE und a=0. arrg^^
 
Zuletzt bearbeitet:
tshape, gibt es auf. Egal wie du es machst, du hast immer Fälle, wo es nicht passt. Sowas abzufangen ist Unsinn, weil die Lesbarkeit des Codes unnötig leidet und man alles künstlich aufbläht.

Er hat jetzt alternativen zur Hand bekommen mit dem man es besser machen könnte, je nach Komplexität.
 
Würde es mit einem Try-Pattern machen oder null zurückgeben bei Gleicheit (erfordert Integer statt int). Aber irgendeine Zahl zurückgeben ist eher so 80er Stil mit C.
 
Zurück
Oben