Methoden Methoden in Java

Herbert1955

Mitglied
Hallo liebes Javaforum, da dies mein erster Post hier bei euch ist, möchte ich mich zunächst kurz vorstellen.

Mein Name ist Herbert, ich bin 57 Jahre jung und habe beruflich eigentlich nichts mit der Java Programmierung zu tun. Privat beschäftige ich mich aber sehr gerne mit Dingen rund um den PC und so bin ich dann auch zur Programmierung gestoßen. Das Thema interessierte mich und so versuche ich mir die Java Programmierung, so gut es geht, selber bei zu bringen.

Die ersten Kapitel habe ich soweit auch erfolgreich hinter mir gelassen und erste, kleine "Programmchen" geschrieben. Doch nun stehe ich vor dem ersten großen Hinderniss, welches ich nicht so ohne weiteres mit Hilfe von Büchern hinter mir lassen konnte.

Ich hoffe das mir hier jemand unter die Arme greifen und vielleicht eine Art Beispiel Code schreiben kann. Und zwar bin ich inzwischen bei den Java Methoden angekommen. Dazu habe ich mir einiges an Lesestoff zu Gemüte geführt und mir eine Beispielaufgabe aus einem Java Buch herausgesucht.

Nun ist es aber leider so, dass ich nicht wirklich einen Anfang finde und einfach nicht weiß, wie ich die Methoden aufbauen, aneinander reihen und in einer Art Hauptprogramm ausführen kann. Sämtliche Versuche die ich getätigt habe sind kläglich gescheitert.

Falls jemand die Zeit und Lust hat, mir die Beispielaufgabe mit kleinen Erklärungen zu lösen, wäre ich darüber wirklich froh, denn es fuchst mich doch schon arg, dass ich es nicht allein hinbekomme, aber wenn man nun mal nicht weiter weiß soll man ja fragen und dies tue ich an dieser Stelle.

Die Aufgabenstellung lautet wie folgt:
1.Methode "Die Mittlere Zahl"
Parameter: drei ganze Zahlen n1,n2,n3
Rückgabe: diejenige Zahl die zwischen den beiden anderen liegt, also zb. die 3 bei 2,3,4

2.Methode "Kleinstes gemeinsames Vielfaches"
Parameter: zwei ganze Zahlen a und b
Rückgabe: das kleinste gemeinsame Vielfache von a und b (zum Beispiel bei 4 und 6 = 12)
(zur Lösung habe ich es mit a*b/ggT versucht, allerdings habe ich wohl auch dort einen Fehler gemacht.

3. Methode "arithmetisches Mittel"
Parameter: Array mit beliebig vielen Zahlen mit Nachkommastellen
Rückgabe: Arithmetisches Mittel der Arrayeinträge (also die Summe der Einträge geteilt durch ihre Anzahl)

Diese Methoden möchte ich in ein "Hauptprogramm" einbetten, sodass man sie über ein "Auswahlmenü" anwählen und eine der drei Methoden auswählen kann. Man soll dann Werte eingeben könne, die bei MEthodenaufruf als aktuelle Parameter genutzt werden.. Bei MEthode 3 soll zunächst die Arraylänge n und dann die n einzelnen Arryeinträge eingegebn werden können. Das Hauptprogramm soll dann die Methoden aufrufen und nach ihrer Rückkehr das Ergebnis auf den Bildschirm ausliefern. Zwischen den Methoden sollen KEINE Tastatureingaben (einer meiner Fehler) erfolgen. Das ganze soll solange wiederholt werden, bis der Benutzer ein Ende wünscht.

Falls jemand einem alten *hust*, aber interessiertem Java Anfänger helfen möchte, so würde ich mich sehr über einen Quellcode, den ich dann bei mir ausprobieren und nachvollziehen kann, freuen. Nun wünsche ich euch allen noch ein gutes neues JAhr und freue mich auf eure Antworten.

Mit freundlichen Grüßen Herbert.:rtfm:
 
Sämtliche Versuche die ich getätigt habe sind kläglich gescheitert.
Was hast du denn bisher versucht? Wo hakts, oder welche Fehler sind dabei aufgetreten?

Wenns am drumherum scheitert (Werte einlesen von der Konsole oder ähnliches), dann teste die Methode erst in nem kleineren Rahmen, mit hartkodierten WErten z.b.
 
Hallo,

zunächst hatte ich versucht, direkt alle Methoden zu schachteln und ins Hauptprogramm einzubetten. Doch dabei entstanden viel zu viele Fehler sodass ich total den Überblick verloren habe.

Dann versuchte ich es, indem ich die einzelnen Aufgaben der Methoden näher angeschaut habe und versuchte diese zunächst für sich allein aufzustellen.

Hier zum Beispiel mein Versuch die "MittlereZahl" als "eigenes" Programm umzusetzen.

Java:
 public class MittlereZahl{
   public static void main(String[] args) {
     int n1 = Integer.parseInt(args[0]);
     int n2 = Integer.parseInt(args[1]);
     int n3 = Integer.parseInt(args[2]);
         if(n1 < n2)
               if(n2 < n3)
                     System.out.println(n2);
         else
             if(n1 < n3)
                     System.out.println(n3);
         else
                     System.out.println(n1);
     else
         if(n2 < n3)
               if(n1 < n3)
                     System.out.println(n1);
               else
                     System.out.println(n3);
         else
             System.out.println(n2);

Später wusste ich dann aber nicht mehr weiter, wie ich diesen Code (zumal er auch irgendwie nicht läuft) in das Hauptprogramm einzubetten, sodass man ihn später auswählen könnte und während der Methode keine Eingabe tätigen muss.
 
In der Aufgabe steht doch dass du das als Methoden umsetzen sollst, das macht dein Programm sehr viel einfacher 😉

Java:
	public static void main(String[] args) {
		int n1 = 3;
		int n2 = 5;
		int n3 = 7;

		System.out.println("Die mittlere Zahl lautet: " + mittlereZahl(n1, n2, n3));
	}

	private static int mittlereZahl(int n1, int n2, int n3) {
		if (n1 < n2)
			if (n2 < n3)
				return n2;
			else if (n1 < n3)
				return n3;
			else
				return n1;
		else if (n2 < n3)
			if (n1 < n3)
				return n1;
			else
				return n3;
		else
			return n2;
	}
Und so kannst du dann eine Methode nach der anderen erstellen. Wenn die dann alle Funktionieren kannst du dir Gedanken über das Menü machen. Immer kleine Schritte machen.
 
Dein Ansatz hat bereits das Grundproblem, dass du statt echten Rückgaben nur irgendwas auf die Konsole schreibst. Mit solchen Ausgaben kannst du nunmal nicht weiterrechnen. Rückgabe bedeutet z.B.
Java:
...
public int berechneMittlereZahl(final int zahl1, final int zahl2, final int zahl3) {
	... // Berechnung
	return ergebnis;
}
...

Ansonsten enthält dein Code 2 sofort ins Auge springende Fehler:
  • Zugriff auf ein Array unbekannter Größe (nämlich args). Hier unbedingt eine Überprüfung einbauen!
  • If-else-Konstrukte mit Klammern versehen! In der jetzigen Form ist der Code total unübersichtlich.
 
Hallo,

zunächst hatte ich versucht, direkt alle Methoden zu schachteln und ins Hauptprogramm einzubetten. Doch dabei entstanden viel zu viele Fehler sodass ich total den Überblick verloren habe.

Dann versuchte ich es, indem ich die einzelnen Aufgaben der Methoden näher angeschaut habe und versuchte diese zunächst für sich allein aufzustellen.

Hier zum Beispiel mein Versuch die "MittlereZahl" als "eigenes" Programm umzusetzen.

Java:
 public class MittlereZahl{
   public static void main(String[] args) {
     int n1 = Integer.parseInt(args[0]);
     int n2 = Integer.parseInt(args[1]);
     int n3 = Integer.parseInt(args[2]);
         if(n1 < n2)
               if(n2 < n3)
                     System.out.println(n2);
         else
             if(n1 < n3)
                     System.out.println(n3);
         else
                     System.out.println(n1);
     else
         if(n2 < n3)
               if(n1 < n3)
                     System.out.println(n1);
               else
                     System.out.println(n3);
         else
             System.out.println(n2);

Später wusste ich dann aber nicht mehr weiter, wie ich diesen Code (zumal er auch irgendwie nicht läuft) in das Hauptprogramm einzubetten, sodass man ihn später auswählen könnte und während der Methode keine Eingabe tätigen muss.

Ich würde an deiner Stellen die if's und else's vollständig Klammern. Vor allem als Anfänger vertut man sich ansonsten sehr leicht.

Java:
if(...){
   ...
}
else{
   ...
}
 
Vielen Dank schonmal für deine Antwort.

Zunächst muss ich gestehen, dass ich den Befehl "privat" noch nicht gesehen habe und nicht weiß, was dieser bewirkt?!

Ich werde nun zunächst versuchen die 3 MEthoden einzeln zu erstellen. Hast du vielleicht ein paar Tips zu den beiden anderen? Wie könnte ich es am besten angehen? Wie setze ich es am besten (mit einfachsten Mitteln) um?

Puh, ich habe jetzt bereits einige Stunden "herum gedoktert" und mein Kopf ist erst einma zu für Java Codes. Ich werde wohl erst einmal ein kleines Päuschen einlegen und später weiter probieren.

Falls jemand in der zwischenzeit ein paar Anregungen für die Methoden hat, so werde ich mir diese interessiert durchlesen.

Bis später, Herbert.
 
Zunächst muss ich gestehen, dass ich den Befehl "privat" noch nicht gesehen habe und nicht weiß, was dieser bewirkt?!
Ist nen access modifier, kannst du auch weglassen...

Hast du vielleicht ein paar Tips zu den beiden anderen? Wie könnte ich es am besten angehen? Wie setze ich es am besten (mit einfachsten Mitteln) um?
Lös das Problem zunächst auf nem Blatt papier, wenn du dann weißt wie du vorgehen musst setz die Arbeitsschritte in Java um.
 
Also nach den letzten Antworten bin ich nun noch verwirrter! Erbarmt sich jemand und fügt einmal einen richtigen Quellcode für die erste Methode seinem Post an??? Das wäre wirklich lieb, weil ich so langsam aber sicher verzweifle und weder die Methode als "eigenes" Programm, noch als Methode zum laufen bekomme.
 
Ich halte ehrlich gesagt den gesamten Ansatz mit einer if-else-Kaskade für enorm umständlich und nicht sonderlich elegant.

Nur mal so als Denkansätze, wie man solche Trivialprobleme auch als Dreizeiler implementieren könnte:
Java:
	private static int mittlereZahl1(int zahl1, int zahl2, int zahl3) {
		int[] sortedArray = new int[] { zahl1, zahl2, zahl3 };
		Arrays.sort(sortedArray);
		return sortedArray[1];
	}

	private static int mittlereZahl2(int zahl1, int zahl2, int zahl3) {
		List<Integer> zahlen = Arrays.asList(zahl1, zahl2, zahl3);
		Collections.sort(zahlen);
		return zahlen.get(1);
	}
 
Ich halte ehrlich gesagt den gesamten Ansatz mit einer if-else-Kaskade für enorm umständlich und nicht sonderlich elegant.

Nur mal so als Denkansätze, wie man solche Trivialprobleme auch als Dreizeiler implementieren könnte:
Java:
	private static int mittlereZahl1(int zahl1, int zahl2, int zahl3) {
		int[] sortedArray = new int[] { zahl1, zahl2, zahl3 };
		Arrays.sort(sortedArray);
		return sortedArray[1];
	}

	private static int mittlereZahl2(int zahl1, int zahl2, int zahl3) {
		List<Integer> zahlen = Arrays.asList(zahl1, zahl2, zahl3);
		Collections.sort(zahlen);
		return zahlen.get(1);
	}

Ja, so ein Beispiel macht bei einem Anfänger, der nicht mal eine Methode hinbekommt, auch sehr viel Sinn...

Also nach den letzten Antworten bin ich nun noch verwirrter! Erbarmt sich jemand und fügt einmal einen richtigen Quellcode für die erste Methode seinem Post an??? Das wäre wirklich lieb, weil ich so langsam aber sicher verzweifle und weder die Methode als "eigenes" Programm, noch als Methode zum laufen bekomme.

Hat dir EikeB doch hingeschrieben?
 
Ja, so ein Beispiel macht bei einem Anfänger, der nicht mal eine Methode hinbekommt, auch sehr viel Sinn...
Um im gleichen pampigen Ton zu antworten: Eine dreistufige If-Else-Kaskade ohne Klammern ist natürlich für einen Anfänger weit besser lesbar und nachvollziehbar, als 3 Zeilen Quellcode, aus denen sich schon fast natürlichsprachig der Algorithmus ablesen lässt:
  1. Die 3 Zahlen nach Größe sortieren
  2. Die mittlere Zahl zurückgeben -> fertig
 
Um im gleichen pampigen Ton zu antworten: Eine dreistufige If-Else-Kaskade ohne Klammern ist natürlich für einen Anfänger weit besser lesbar und nachvollziehbar, als 3 Zeilen Quellcode, aus denen sich schon fast natürlichsprachig der Algorithmus ablesen lässt:

Ich würde mal sagen schon, außer du erklärst noch zusätzlich was Arrays, Listen, Collections usw. sind.

Außerdem soll bei der Aufgabe wahrscheinlich die Umgang mit if/else Bedingungen geübt werden.
 
Zuletzt bearbeitet:
Um im gleichen pampigen Ton zu antworten: Eine dreistufige If-Else-Kaskade ohne Klammern ist natürlich für einen Anfänger weit besser lesbar und nachvollziehbar, als 3 Zeilen Quellcode, aus denen sich schon fast natürlichsprachig der Algorithmus ablesen lässt

Ich seh das genau so, ja. Hier ist nicht das Ziel ein bestimmtes Problem (möglichst schnell/einfach) zu lösen, sondern Java/programmieren zu lernen. Dazu gehören nunmal auch if Abfragen. Das Lernergebnis bei deinem Code, so einfach er auch sein mag, ist einfach gleich Null.
 
Also ich wollte hier keinen Streit von Zaun brechen. Vielleicht lass ich das ganze doch besser, es scheint ja 100 Möglichkeiten zu geben, wie dies umgesetzt werden kann.

Der Code den Eike mir geantwortet hatte, erzeugt bei mir einen Fehler. Zudem arbeitet er doch mit festen varibalen, oder nicht? Es sollte aber doch so sein, dass man beliebige integer Zahlen eingeben kann und er dann die Mittlere heraus sucht.

Wäre es möglich wenn jemand den Anfang des Hauptprogrammes hier herein schreibt, sodass ich dann versuchen kann das "Mittlere Zahl" als 1. Methode ins Hauptprogramm zu schreiben? Vielleicht wird es für mich ja ersichtlicher, wenn ich einmal sehe, wie die Methode sich überhaupt in das Hauptprogramm einfügt.

Aber wie gesagt, falls meine Fragestellung hier zu einem "Krieg" führt, dann bitte ich die Gemüter sich zu beruhigen.
 
Der Wortlaut der Aufgabe aus dem Buch lautet an diesem Punkt wie folgt "Innerhalb der Methoden sollen keine Tastatureingaben oder Bildschirmausgaben erfolgen" Es soll wohl so sein, dass es die Methode anwählt. Dann die Methode die Variablen (hier kommen soweit ich weiß aktuelle Variablen gegenüber den foramlen zum Einsatz) erfragt, seine "Rechnung" durchführt und das Ergebnis an das Hauptprogramm übergibt.

Ich glaube ehrlich gesagt nicht mehr daran, dass ich es allein schaffen kann. ICh wäre daher immer noch sehr, sehr dankbar wenn jemand die komplette Aufgabe lösen könnte, natürlich nur wenn dieser jemand Spaß daran hat und es nicht als Zeitverschwendung ansieht. Mit dem fertigen Programm könnte ich dann weiterarbeiten und als Muster für die nächste Aufgabe (ähnliche Aufgabenstellung mit anderen Methoden) nutzen.

MfG ein verzweifelter, offenbar zu alter, Java Anfänger 🙁
 
Vielleicht kannst du da was mit anfangen:

Java:
public class Programm {

    public static void main(String[] args) {
        int Mittelwert = ermittleMittelwert(args);
        System.out.println("Der Mittelwert ist: " + Mittelwert);// TODO code application logic here
    }

    public static int ermittleMittelwert(String[] values)
    {
        int n1, n2, n3;
        n1 = Integer.parseInt(values[0]);
        n2 = Integer.parseInt(values[1]);
        n3 = Integer.parseInt(values[2]);
        
        if (n1 < n2){
            if (n2 < n3){
                return n2;
            }
            else if (n1 < n3){
                return n3;
            }
            else{
                return n1;
            }
        }
        else if (n2 < n3){
            if (n1 < n3){
                return n1;
            }
            else{
                return n3;
            }
        }
        else{
            return n2;
        }
    }
}
 
Alles klar, das Schlüsselwort "Innerhalb" hat gefehlt. So wie du schriebst sollen in den Methoden lediglich die "Berechnungen" durchgeführt werden, die Eingaben werden im Hauptprogramm getätigt.

Werde mal versuchen das ganze möglichst einfach darzustellen.
 
So eine mögliche Lösung:
Java:
import java.util.Scanner;

public class MethodenTest {

	public static void main(String[] args) {

		System.out.println("MENUE");
		System.out.println("------------");
		System.out.println("[1] Mittlere Zahl");
		System.out.println("[2] kleinste gemeinsame Vielfache");
		System.out.println("[3] Arithmetisches Mittel");
		System.out.println("[0] Exit\n");

		while (true) {
			Scanner scanner = new Scanner(System.in);
			System.out.print("\n>>> ");
			char c = scanner.nextLine().charAt(0);
			switch (c) {
			case '1':
				System.out.print("1. Zahl: ");
				int n1 = scanner.nextInt();
				System.out.print("2. Zahl: ");
				int n2 = scanner.nextInt();
				System.out.print("3. Zahl: ");
				int n3 = scanner.nextInt();
				System.out.println("Die mittlere Zahl ist "
						+ methode1(n1, n2, n3));
				break;
			case '2':
				System.out.print("1. Zahl: ");
				int a = scanner.nextInt();
				System.out.print("2. Zahl: ");
				int b = scanner.nextInt();
				System.out.println("Das kleinste gemeinsame Vielfache ist "
						+ methode2(a, b));
				break;
			case '3':
				System.out.print("Anzahl Zahlen: ");
				int anz = scanner.nextInt();
				double[] arr = new double[anz];
				for (int i = 0; i < anz; i++) {
					System.out.print((i + 1) + ". Zahl: ");
					arr[i] = scanner.nextDouble();
				}
				System.out.println("Das Arithmetisches Mittel ist "
						+ methode3(arr));
				break;
			case '0':
				System.exit(0);
			default:
				System.out.println("Falsche Eingabe!");
				break;
			}
		}
	}

	public static int methode1(int n1, int n2, int n3) {

		if (n1 < n2) {
			if (n2 < n3) {
				return n2;
			} else if (n1 < n3) {
				return n3;
			} else {
				return n1;
			}
		} else if (n2 < n3) {
			if (n1 < n3) {
				return n1;
			} else {
				return n3;
			}
		} else {
			return n2;
		}
	}

	public static int methode2(int a, int b) {

		int max, rest;
		if (a == 0 || b == 0) {
			return 0;
		} else if (a < b) {
			rest = a;
			max = b;
		} else {
			rest = b;
			max = a;
		}

		while (true) {
			if (max % rest == 0) {
				break;
			}
			rest = max % rest;
		}
		return a * b / rest;
	}

	public static double methode3(double[] arr) {

		double sum = 0.0;
		for (int i = 0; i < arr.length; i++) {
			sum = sum + arr[i];
		}
		return sum / arr.length;
	}
}
 
Hallo, bitte entschuldigt, dass ich mich erst so spät wieder melde, aber Samstags hat man ja dann doch auch noch mal etwas anderes zu tun.

Ich danke euch für die vielen Antworten. Für heute werde ich es erst einmal gut sein lassen. Morgen sehe ich mir dann deine Hilfestellung genau an Camill.

Nochmals vielen Dank und einen schönen Restabend.
 
Einen wunderschönen Sonntag wünsche ich allerseits.

Camill, die Lösung die du geschrieben hast, funktioniert perfekt und sieht im Grunde auch so aus, wie ich es mir gedacht habe. Nun ist es aber leider so, dass du einige Befehle verwendet hast, die ich noch nicht kenne und daher einige Schritte nicht ganz nachvollziehen kann.

Da ich aber gerne verstehen möchte, was ich tue und da an Code vor mir sehe, wäre meine Frage, ob das Ganze auch mit "einfacheren Befehlen" realisierbar ist?!

So kenne ich zum Beispiel die Scanner Funktion noch gar nicht und hätte darauf nicht zurückgreifen können. Wie wäre dein Programm ohne diese Funktion realisierbar? Auch den Abschnitt mit den cases verstehe ich nicht komplett, da ich auch diese Funktion noch nicht kennen gelernt habe. ISt die Aufgabe nur so zu lösen gewesen? Oder hätte es auch die Möglichkeit gegeben, dies mit "meinen MItteln", den denkbar einfachsten, zu lösen?

Ich weiß es ist viel verlangt, da du dich schon extra ran gesetzt hast und eine Lösung erabeitet hattest, aber wäre es möglich, dass ganze noch einfacher zu schreiben?

Mit freundlichen Grüßen.
 
Anstatt nach ner einfacheren Lösung zu fragen könntest du dir doch einfacher die Sachen die du nicht verstehst mal anschauen, du willst doch was lernen oder nicht?
 
So kenne ich zum Beispiel die Scanner Funktion noch gar nicht und hätte darauf nicht zurückgreifen können. Wie wäre dein Programm ohne diese Funktion realisierbar?

Mithilfe der Scanner Klasse ist es möglich einen Datenstrom(eine Zeichenkette) einzulesen, das
Code:
System.in
gibt an das das dieser von der Kommandozeile gelesen wird.
Näheres dazu kann man in der Insel nachlesen: Scanner-Klasse

Natürlich wäre es auch möglich den Methoden direkt im Programm feste Parameter zu übergeben sodass kein Einlesen mehr nötig wäre, ein Aufruf der ersten Methode würde dann zum Beispiel so aussehen:
Java:
System.out.println("Die mittlere Zahl ist " + methode1(10, 2, 7));

Da ich die Aufgabe jedoch so verstanden habe das eine Eingabe erfolgen soll habe ich dieses mit Hilfe der Scanner-Klasse realisiert da diese aufgrund ihrer Methoden(nextInt(), nextDouble(), ...) relativ leicht zu verstehen ist.

Auch den Abschnitt mit den cases verstehe ich nicht komplett, da ich auch diese Funktion noch nicht kennen gelernt habe.

Der Aufbau einer switch-Anweisung ist folgender:
Java:
		switch (key) {
		case value:
			break;

		default:
			break;
		}
In den Klammern hinter
Code:
switch
wird ein "Key" erwartet, in dem Programm ist dies die Eingabe die durch [JAVA=17] char c = scanner.nextLine().charAt(0);[/code] eingelesen wird, mithilfe von
Code:
charAt(0)
wird erreicht das nur das erste Zeichen der Eingabe entnommen wird (bei Eingabe von "1abc" würde trotzdem noch auf die erste Methode zugegriffen werden).
Nach einer Eingabe wird in den einzelnen "cases" nach den Key gesucht (in dem Programm sind dies die Zeichen 1, 2, 3 und 0). Sofern eine übereinstimmung vorhanden ist wird dieser case ausgeführt, ansonsten wird der
Code:
default
case ausgeführt (default muss nicht unbedingt vorhanden sein). Das
Code:
break;
in den einzelnen "cases" sorgt lediglich dafür das die switch Anweißung nach einem case dirkt verlassen wird (kannst ja mal ausprobieren was passiert wenn das break im ersten case weggelassen wird und dann auf die erste Methode zugegriffen wird).
Das ganze zum Nachlesen auch nochmal in der Insel zu finden: switch

Ich hoffe das nun einiges noch deutlicher wurde 😉
 
So, da bin ich zurück vom Kaffee trinken.

Vielen Dank für deine Antwort und die guten Erklärungen Camill. ICh werde mir das mal ganz in Ruhe ansehen und versuchen es zu verstehen.

Nun habe ich etwas, worauf ich aufbauen kann. Vielen Dank dafür.

BEi weiteren Fragen melde ich mich einfach wieder an dieser Stelle.

Bis dahin, alles Gute.
 

Neue Themen


Zurück
Oben