Aufrufen einer Methode mit unterschiedlichen Basistypen

N.Klaas

Mitglied
Hallo allerseits,

danke nochmal für die nette Hilfe bei meinem Problem gestern. Bin leider heute wieder über etwas gestolpert wo ich nicht weiter komme, trotz Suche und Bücher wälzen.
Die Aufgabenstellung ist follgende:

Java:
Schreiben Sie eine Methode
double[] replizieren(double[] d, int n)
welche das Eingabe-Array n-mal hintereinanderhaengt.
Beispiel: Der Aufruf replizieren({1.2, 4.2, -2.0}, 3)
ergibt das Array
{1.2, 4.2, -2.0, 1.2, 4.2, -2.0, 1.2, 4.2, -2.0}

ich habe dazu folgende Methode geschrieben innerhalb einer Klasse. Die main Methode soll dann bei dem definierten Eingabewert das Ergebnis auf der Konsole ausgeben. So sieht mein Ansatz aus:

Java:
public class Array{
	
	public Array(double[] d, int n){}
	
	static double[] replizieren(double[] d, int n){
		double[] x = new double[d.length*n];
		for( int i = 0; i< n*d.length; i++){
			x[i] = d[i % (n-1)];
		}
		return x;
	}
	public static void main(String[] args){
		double[] y = new double[]{1.2, 4.2, -2.0};
		System.out.println(replizieren(y, 3));
	}
}

Auch hier gibt es wieder keinen Kompilierfehler, die Ausgabe der Konsole ist: [D@4e82701e
Spreche ich die Methode falsch an? Und wieder habe ich das Problem, dass ich meine Methode statisch machen muss, obwohl ich das eigentlich nicht möchte. bei 'nicht-Arrays' hat das ja geklappt. Nun brachte mir auch der Objektaufruf ala
Code:
Array n = new Array()
nichts. Danke schonmal für eure Hilfe.
 
Ein Array musst du mit einer Schleife ausgeben 🙂 Wenn du einfach nur
Code:
println(x);
schreibst, wird nur die Referenz ausgegeben. Du musst sowas in der Art machen:

Java:
for(int i = 0; i < array.length; i++)
{
    System.out.println(array[i]);
}
 
Ahh ok danke, mit der Schleife klappts, leider ist sein Output etwas schwer für mich nachzuvollziehen.

Mein Code:

Java:
public class Array{
	
	public Array(double[] d, int n){}
	
	static double[] replizieren(double[] d, int n){
		double[] x = new double[d.length*n];
		for( int i = 0; i< n*d.length; i++){
			x[i] = d[i % (n-1)];
		}
		return x;
	}
	public static void main(String[] args){
		double[] y = new double[]{1.2, 4.2, 2.0};
		double[] k = replizieren(y, 3);
		for(int i=0; i< k.length; i++){
			System.out.println(k[i]);
		}
	}
}

auf der Konsole kommt:

Java:
1.2
4.2
1.2
4.2
1.2
4.2
1.2
4.2
1.2

die Länge stimmt, aber warum vernachlässigt er den dritten Eintrag des Ausgangsarrays (-2.0)?
 
Code:
d[i % (n-1)]
Wenn n = 3 ist, dann ist
0%(3-1)=0%2=0
1%(3-1)=1%2=1
2%(3-1)=2%2=0
3%(3-1)=3%2=1
 
ok super Danke, ausgabe stimmt. sonst ne idee wie ich die methode aufrufen kann ohne sie static zu machen?

btw.
es sind leider keine packages erlaubt.
 
ok super Danke, ausgabe stimmt. sonst ne idee wie ich die methode aufrufen kann ohne sie static zu machen?

btw.
es sind leider keine packages erlaubt.

Dafür brauchst du erstmal eine Instanz einer Klasse.
Da du alles von der (statischen) main aus machst, kannst du auch nur Statische Klassen aufrufen.
Machst du es allerdings so:
Java:
Array instanz = new Array();
instanz.deineMethode();

Muss deine Methode auch nicht mehr statisch sein.
 
Wie immer das gleiche: Objekt der Klasse anlegen und anhand dessen die Methode aufrufen. Dann muss sie nicht static sein.
 
Ok, danke nochmal für eure Hilfe, so ganz mit dem Aufrufen komme ich leider immer noch nicht klar. Vielleicht hat jemand nen Beispiel. Zum Beispiel habe ich noch folgendes Problem. Ich habe eine Klasse 'Klausur' in der verschiedene Bedingungen geprüft werden. In einer zweiten Klasse 'Student' sind die Basistypen der einzelnen Parameter hinterleget (Name, Vorname etc.). In einer dritten Klasse 'Test' will ich nun (in Form eines Arrays) mittels Klasse 'Student' die Methode aus der Klasse 'Klausur' nutzen.

Zur Veranschaulichung:

Student.java:

Java:
class Student{ 
	String name ; 
	String vorname ; 
	int matrikel ;
	
	boolean hatSchein ; 
	float note ;
}

Klausur.java:

Java:
class Klausur { 
	Student[] teilnehmer ;
	
	// hat der i-te Teilnehmer bestanden? 
	boolean bestanden(int i) {
		return teilnehmer[i].note >= 1.0f & teilnehmer[i].note <= 4.0f ;
		
	}//bestanden
	
	//gibt es doppelt eingetragene Studenten?
	boolean doppelt(){
		int x = 0;
		boolean y = true;
		for(int i=0; i<teilnehmer.length; i++){
			//int x = 0;
			if(teilnehmer[i].matrikel == teilnehmer[i+1].matrikel){
				x++;
			}//if
			
		}//for
		if(x != 0){
			y = false;
		}
		return y;
	}//doppelt
	
	//hat jemand keinen Schein?
	void disqualifizieren(){
		for(int i=0; i<teilnehmer.length; i++){
			if(teilnehmer[i].hatSchein != true){
				teilnehmer[i].note = 5;
			}// if
		}//for
	}//disqualifizieren
	
        //Wie ist die Durchschnittsnote aller Teilnehmer?
	float durchschnittsnote(){
		float sum = 0;
		float schnitt = 0;
		for(int i=0; i<teilnehmer.length; i++){
			sum = sum+teilnehmer[i].note;
		}//for
		schnitt = sum / teilnehmer.length;
		return schnitt;
	}//durchschnittsnote
	
        //Wieviel Prozent der Teilnehmer sind durchgefallen?
	float durchfallquotient(){
		int sum = 0;
		float quot = 0;
		for(int i=0; i<teilnehmer.length; i++){
			if(teilnehmer[i].note > 4){
				sum++;
			} //if
			return sum;
		}//for
		quot = (sum / teilnehmer.length)*100;
		return quot;
	}//durchfallquotient
	
        //Gibt alle erfolgreichen Prueflinge aus
	void ausgabeBestanden(){
		for(int i=0; i<teilnehmer.length; i++){
			if(teilnehmer[i].note <= 4){
				System.out.println(teilnehmer[i].name + ", " + teilnehmer[i].vorname);
			}//if
		}//for
	}//ausgabeBestanden
	
}//Klausur

der Klassen Kopf inkl.
Code:
Student[] teilnehmer
war vorgegeben. Es müssen also die Studentendaten ja eigentlich als eine Art verschachteltes Array vorliegen, ungefähr so:

{{name_1, vorname_1, matrikel_1, hatSchein_1, note_1} . . . . {name_n, vorname_n, matrikel_n, hatSchein_n, note_n}}

Wie also konstruiere ich in meiner Test-Klasse so etwas und wie rufe ich dann die Methode auf.
Sorry für die vielen Fragen, finde aber leider nicht wirklich ne Antwort. Danke nochmal
 
Wenn du ein Array [c]Student[] teilnehmer[/c] hast, kannst du über einen Index auf einen Studenten zugreifen, und auf diesem wiederum ganz normal Methoden aufrufen oder Felder lesen und schreiben:

Java:
Student[] teilnehmer = ...

//Der Name vom ersten Studenten:
Student ersterStudent = teilnehmer[0];
String name = ersterStudent.name;

//oder in einem Ruck
String name = teilnehmer[0].name; 

//Alle Studentennamen ausgeben
for(Student student : teilnehmer) {
   System.out.println(student.name);
}
//oder wenn man auch den Index braucht
for(int i = 0; i < teilnehmer.length; i++) {
   System.out.println(i + ":  " + teilnehmer[i].name);
}
 
Ok super konnte so erstmal ne Bibliothek erzeugen. Hab das jetzt wie folgt gelöst, er kompiliert das auch. Gibt mir aber nen
Code:
java.lang.NullPointerException
-Fehler beim Ausführen aus. Das verstehe ich nicht, weil er mir doch eigentlich jedes Element aus den Studierendendaten in mein teilnehmer[] überführen sollte oder?

hier mal der Code:

Java:
public class Test{
	
	
	public static void main(String[] args){
		
		Student[] teilnehmer = new Student[8];

		String[] name  = {
		"Heribert ",
		"Lutz ",
		"Sarah ",
		"Konrad ",
		"Peter ",
		"Hans ",
		"Ulrike ",
		"Anna ",
		};
		String[] nachname = {
		"Mueller",
		"Schmidt",
		"Hahnfeld",
		"Huhn",
		"Kerold",
		"Itze",
		"Hainrich",
		"Bruck",
		};
		int[] matrikel = {
		1010,
		1233,
		2353,
		3453,
		4564,
		5675,
		5643,
		1244,
		};
		boolean[] hatSchein = {
		true,
		true,
		false,
		true,
		true,
		true,
		false,
		true,
		};
		float[] note = {
		1,
		2,
		3,
		4,
		5,
		1,
		2,
		3,
		};
		
		//teilnehmer[0].name = "Horst";
		
		//	System.out.println(teilnehmer[0].name);
		
		for(int i = 0; i < teilnehmer.length; i++){
		
			teilnehmer[i].vorname = name[i];
			teilnehmer[i].name = nachname[i];
			teilnehmer[i].matrikel = matrikel[i];
			teilnehmer[i].hatSchein = hatSchein[i];
			teilnehmer[i].note = note[i];
		}
	
	}	
}

Der auskommentierte Teil war nen Test, ob er mir denn überhaupt den array-platz belegt.
Danke für die viele Hilfe
 
du musst dein StudentenArray noch mit Studenten füllen, bevor du denen die Attribute zuweisen kannst:

[java=63]for(int i = 0; i < teilnehmer.length; i++){
teilnehmer = new Student();
teilnehmer.vorname = name;
teilnehmer.name = nachname;
teilnehmer.matrikel = matrikel;
teilnehmer.hatSchein = hatSchein;
teilnehmer.note = note;
}[/code]
 
Ah super ja so klappts. Jetzt hoffentlich mein letztes Problem (ich werd hier noch bekloppt heute).

Wie kann ich nun meine Studentenbibliothek an die Methoden der Klasse Klausur übergeben und mir das ergebnis ausgeben lassen. Mein Ansatz:


Java:
public class Test{
	
	
	public static void main(String[] args){
		
               ....
               ....
               ....


		//boolean doppelt = Klausur.bestanden(teilnehmer);
		System.out.println(Klausur.doppelt(teilnehmer));
	}	
}



klappt leider nicht.
 
irgendwie so halt...eigentlich macht man das über entsprechende get-Methoden


Java:
Klausur klausur = new Klausur();
		klausur.teilnehmer=teilnehmer;
		System.out.println(klausur.doppelt());
 
was funktioniert nicht???
Java:
public class Test {

	public static void main(String[] args) {

		Student1[] teilnehmer = new Student1[8];

		String[] name = { "Heribert ", "Lutz ", "Sarah ", "Konrad ", "Peter ",
				"Hans ", "Ulrike ", "Anna ", };
		String[] nachname = { "Mueller", "Schmidt", "Hahnfeld", "Huhn",
				"Kerold", "Itze", "Hainrich", "Bruck", };
		int[] matrikel = { 1010, 1233, 2353, 3453, 4564, 5675, 5643, 1244, };
		boolean[] hatSchein = { true, true, false, true, true, true, false,
				true, };
		float[] note = { 1, 2, 3, 4, 5, 1, 2, 3, };

		// teilnehmer[0].name = "Horst";

		// System.out.println(teilnehmer[0].name);

		for (int i = 0; i < teilnehmer.length; i++) {
			teilnehmer[i] = new Student1();
			teilnehmer[i].vorname = name[i];
			teilnehmer[i].name = nachname[i];
			teilnehmer[i].matrikel = matrikel[i];
			teilnehmer[i].hatSchein = hatSchein[i];
			teilnehmer[i].note = note[i];
		}
		Klausur klausur = new Klausur();
		klausur.teilnehmer = teilnehmer;
		System.out.println(klausur.doppelt());
		System.out.println(klausur.durchfallquotient());
		System.out.println(klausur.durchschnittsnote());

	}
}

class Student1 {
	String name;
	String vorname;
	int matrikel;

	boolean hatSchein;
	float note;
}

class Klausur {
	Student1[] teilnehmer;

	// hat der i-te Teilnehmer bestanden?
	boolean bestanden(int i) {
		return teilnehmer[i].note >= 1.0f & teilnehmer[i].note <= 4.0f;

	}// bestanden

	// gibt es doppelt eingetragene Studenten?
	boolean doppelt() {
		int x = 0;
		boolean y = true;
		for (int i = 0; i < teilnehmer.length; i++) {
			// int x = 0;
			if ((i + 1) < teilnehmer.length)
				if (teilnehmer[i].matrikel == teilnehmer[i + 1].matrikel) {
					x++;
				}// if

		}// for
		System.out.println(x);
		if (x != 0) {
			y = false;
		}
		return y;
	}// doppelt

	// hat jemand keinen Schein?
	void disqualifizieren() {
		for (int i = 0; i < teilnehmer.length; i++) {
			if (teilnehmer[i].hatSchein != true) {
				teilnehmer[i].note = 5;
			}// if
		}// for
	}// disqualifizieren

	// Wie ist die Durchschnittsnote aller Teilnehmer?
	float durchschnittsnote() {
		float sum = 0;
		float schnitt = 0;
		for (int i = 0; i < teilnehmer.length; i++) {
			sum = sum + teilnehmer[i].note;
		}// for
		schnitt = sum / teilnehmer.length;
		return schnitt;
	}// durchschnittsnote

	// Wieviel Prozent der Teilnehmer sind durchgefallen?
	float durchfallquotient() {
		int sum = 0;
		float quot = 0;
		for (int i = 0; i < teilnehmer.length; i++) {
			if (teilnehmer[i].note > 4) {
				sum++;
			} // if
			return sum;
		}// for
		quot = (sum / teilnehmer.length) * 100;
		return quot;
	}// durchfallquotient

	// Gibt alle erfolgreichen Prueflinge aus
	void ausgabeBestanden() {
		for (int i = 0; i < teilnehmer.length; i++) {
			if (teilnehmer[i].note <= 4) {
				System.out.println(teilnehmer[i].name + ", "
						+ teilnehmer[i].vorname);
			}// if
		}// for
	}// ausgabeBestanden

}// Klausur
 
Ich krieg folgende Fehlermeldung (abgesehen davon, dass das bei mir Student ohne 1 heisst ist alles gleich)

Java:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
	at Klausur.doppelt(Klausur.java:16)
	at Test.main(test.java:30)


(übrigens kein kompilier, sondern ein Laufzeitfehler)
 
musste
Code:
Student
in
Code:
Student1
umbenennen, da ich schon eine
Code:
Klasse
Student hatte.

Du hast dir das aber weder kopiert, noch angeschaut:
Dein Methode
Code:
doppelt
läuft durch das Array und vergleicht den aktuellen Wert mit dem folgenden Wert...was passiert wenn du nun beim letzten Wert von teilnehmer angekommen bist?
Du willst wieder auf den nächsten, nicht vorhandenen zugreifen.
Das musst du verhindern, indem du das wie ich einfach abfragst, oder die for-Scheife bspw nur bis
Code:
 teilnehmer.length-1
laufen lässt.
 
Ahhh ja gut super danke. Das habe ich tatsächlich nicht gesehen, dass du das geändert hast. Macht aber natürlich auch Sinn, dass ich außerhalb des def Bereichs bin wenn ich nen [8] array hab und irgendwas mit dem nicht vorhandenen 9 vergleich. Danke nochmal, hast mir sehr geholfen
 
das sind halt auch immer wieder kehrende Probleme, dass du etwas mit dem Vorgänger/Nachfolger vergleichen willst und bei einem Array dann eine "Sonderbehandlung" für das erste, bzw. das letzte Element benötigst.
 

Zurück
Oben