Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen

Bitte aktiviere JavaScript!
Sehr geehrte Community,

ich habe eine Frage bezüglich des Einlesens von Variablen für 2 Vektoren.
Ich würde gerne die Koordinaten der Punkte A, B und C nicht einzeln einlesen, sondern dies in einer Schleife realisieren.
Ich bin noch blutiger Anfänger und bräuchte einmal Tipps wie ich dies tun könnte...

was ich bisher geschrieben habe ist folgendes:

Java:
public class RaeumlichesDreieck
{
public static int xA;
public static int xB;
public static int xC;
public static int yA;
public static int yB;
public static int yC;
public static int zA;
public static int zB;
public static int zC;
public static int xb;
public static int yb;
public static int zb;

  public static void main(String[] args)
  {
  
//Startmeldung des Programms
  
  
//Eingabeaufforderung
ScreenOut.kPrintln("Bitte geben Sie einen Wert für die x-Koordinate des Punktes A ein: ");
xA=KeyboardIn.kReadInt();
ScreenOut.kPrintln("Bitte geben Sie einen Wert für die y-Koordinate des Punktes A ein: ");
yA=KeyboardIn.kReadInt();
ScreenOut.kPrintln("Bitte geben Sie einen Wert für die z-Koordinate des Punktes A ein: ");
zA=KeyboardIn.kReadInt();

int [] PunktA = {xA, yA, zA};
int [] PunktB = {xB, yB, zB};
int [] PunktC = {xC, yC, zC};
int [] vektorb = new int [3];
vektorb [xb] = PunktB [xB]-PunktA[xA];
vektorb [yb] = PunktB [yB]-PunktA[yA];
vektorb [zb] = PunktB [zB]-PunktA[zA];
}
}
über Tipps dazu würde ich mich sehr freuen.
 
Zuletzt bearbeitet von einem Moderator:
Hier sehe ich mehrere Möglichkeiten:
PunktA, PunktB und PunktC sind Arrays und damit Referenztypen. Daher kann man die Eingabe des Punktes in einer Methode machen, der man den einzugebenden Punkt übergibt bzw. die Methode übergibt einen neuen, eingegebenen Punkt.

Statt einzelner Punkte könnte man auch ein Array nehmen. (Also dann ein zweidimensionales Array.)

Und dann sind Deine Zeilen bezüglich vektorb Werte zuweisen zumindest dubios. Aber ich denke mal, dass Du da [0], [1] und [2] schreiben wolltest und nicht xA, yA, zA und so. Das sind ja die Inhalte, die Du da rein geschrieben hast aber nicht die Indices der Array Elemente.
 
Hier sehe ich mehrere Möglichkeiten:
PunktA, PunktB und PunktC sind Arrays und damit Referenztypen. Daher kann man die Eingabe des Punktes in einer Methode machen, der man den einzugebenden Punkt übergibt bzw. die Methode übergibt einen neuen, eingegebenen Punkt.

Statt einzelner Punkte könnte man auch ein Array nehmen. (Also dann ein zweidimensionales Array.)

Und dann sind Deine Zeilen bezüglich vektorb Werte zuweisen zumindest dubios. Aber ich denke mal, dass Du da [0], [1] und [2] schreiben wolltest und nicht xA, yA, zA und so. Das sind ja die Inhalte, die Du da rein geschrieben hast aber nicht die Indices der Array Elemente.
Stimmt :D ich habe da ausversehen die Inhalte reingehauen.
Vielen Dank für deine Anregungen! =)
 
So verkehrt ist Dein Ansatz nicht. Ich würd aber jeweils den zweiten Buchstaben nicht großschreiben. Und das static müsste weg, sd es Instanzvariablen werden...

Ein Dreieck hat nunmal immer genau drei Punkte... ( die Erklärung dient @kneitzel , der sich nicht so gut damit auskennt)
 
So verkehrt ist Dein Ansatz nicht. Ich würd aber jeweils den zweiten Buchstaben nicht großschreiben. Und das static müsste weg, sd es Instanzvariablen werden...

Ein Dreieck hat nunmal immer genau drei Punkte... ( die Erklärung dient @kneitzel , der sich nicht so gut damit auskennt)
Bitte sachlich bleiben und Trollen und Beleidigen sein lassen...
 
So verkehrt ist Dein Ansatz nicht. Ich würd aber jeweils den zweiten Buchstaben nicht großschreiben. Und das static müsste weg, sd es Instanzvariablen werden...

Ein Dreieck hat nunmal immer genau drei Punkte... ( die Erklärung dient @kneitzel , der sich nicht so gut damit auskennt)
Schaf
So verkehrt ist Dein Ansatz nicht. Ich würd aber jeweils den zweiten Buchstaben nicht großschreiben. Und das static müsste weg, sd es Instanzvariablen werden...

Ein Dreieck hat nunmal immer genau drei Punkte... ( die Erklärung dient @kneitzel , der sich nicht so gut damit auskennt)
Auch auf die Gefahr hin, dass ich einen Troll füttere:

Dreiecke haben 3 Punkte. Und nur weil er 3 Punkte eingelesen hat, muss er etwas mit Dreiecken machen? Und was genau will er mit den 3 Punkten machen? "Dreicke" besagt diesbezüglich eigentlich nichts aus. Aber ok, Du bist der Held, der ohne Anforderungen zu kennen richtigen Code schreibt und Dein Code ist richtig, auch wenn die Anforderungen nicht erfüllt sind. Daher ist verständlich, dass Dich sowas nicht interessiert.

Was bitte bringt es, diese ganzen statischen Variablen nicht mehr statisch zu haben? Wenn Du schon auf diese eingehst, dann würde ich doch sagen: Die sollten ganz verschwinden. Er möchte die Punkte ja in einem Array haben. Zum einen erkennt man das an seinem Code und zum anderen hat er es explizit erwähnt. Und wieso den zweiten Buchstaben nicht Gross schreiben? Nach CamelCase würde ich den eben doch mit Großbuchstaben schreiben, denn es sind eben zwei Teile die in einem Variablennamen zusammengesetzt wurden.

Ich denke, dass ich zwei valide Lösungen genannt habe: Einmal die Methode, die ein Array aus 3 Werten füllt (egal ob als Parameter übergeben oder als Rückgabewert.) oder eben die Befüllung eines Mehrdimensionalen Arrays.

Und bezüglich Nachfrage: Wenn man die Anforderung kennt, dann könnte man einem interessierten TE auch entsprechende Lösungen vorschlagen, die objektorientiert sind (Und die dann auch noch deutlich besser lesbar sind und so).

Aber mit Deiner kurzsichtigen Sichtweise und Deinem Bedürfnis, mich blöd anzumachen gibst Du hier eine Witzfigur ab.
 
ich habe jetzt ungefähr eine für mich zufriedenstellende Lösung gefunden für diese Übungsaufgabe:
sicher geht es bestimmt noch kürzer.
Java:
//Eingabeaufforderung, Einlesen der Koordinaten und zuweisen dieser zu Variablen
for (i=0; i<=8; i++) {
  switch (i)
  {
  case 0: xA = leseInt(); break;
  case 1: yA = leseInt(); break;
  case 2: zA = leseInt(); break;
  case 3: xB = leseInt(); break;
  case 4: yB = leseInt(); break;
  case 5: zB = leseInt(); break;
  case 6: xC = leseInt(); break;
  case 7: yC = leseInt(); break;
  case 8: zC = leseInt(); break;
  }
}
//Erstellen der Punkte A, B, C und der Vektoren vektorb und vektorc mithilfe eines Arrays
int [] PunktA = {xA, yA, zA};
int [] PunktB = {xB, yB, zB};
int [] PunktC = {xC, yC, zC};
int [] vektorb = new int [3];
int [] vektorc = new int [3];
/*Zuweisen der x,y und z-Werte zu den Vektoren vektorb und vektorc
durch elementweises subtrahieren der Koordinaten der Punkte A und B und A und C*/

vektorb [0] = PunktB [0]-PunktA[0];
vektorb [1] = PunktB[1]-PunktA[1];
vektorb [2] = PunktB [2]-PunktA[2];
vektorc [0] = PunktC [0]-PunktA[0];
vektorc [1] = PunktC [1]-PunktA[1];
vektorc [2] = PunktC [2]-PunktA[2];
ScreenOut.kPrintln("Vektor b hat die Koordinaten: (" +vektorb [0]+","+vektorb [1]+","+vektorb [2]+")");
ScreenOut.kPrint("Vektor c hat die Koordinaten: (" +vektorc [0]+","+vektorc [1]+","+vektorc [2]+")");
HoldScreen.stop();
}


  private static int leseInt()
  {
    int zahl=0;
    char a = ' ';
    char Punkt = ' ';
    if (i == 0)
    {
      a='x';
      Punkt='A';
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +a+ "-Koordinate des Punktes "+Punkt+" ein: ");
      zahl = KeyboardIn.kReadInt();
    }
    if (i == 1)
    {
      a='y';
      Punkt='A';
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +a+ "-Koordinate des Punktes "+Punkt+" ein: ");
      zahl = KeyboardIn.kReadInt();
    }
    if (i == 2)
    {
      a='z';
      Punkt='A';
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +a+ "-Koordinate des Punktes "+Punkt+" ein: ");
      zahl = KeyboardIn.kReadInt();
    }
    if (i == 3)
    {
      a='x';
      Punkt='B';
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +a+ "-Koordinate des Punktes "+Punkt+" ein: ");
      zahl = KeyboardIn.kReadInt();
    }
    if (i == 4)
    {
      a='y';
      Punkt='B';
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +a+ "-Koordinate des Punktes "+Punkt+" ein: ");
      zahl = KeyboardIn.kReadInt();
    }
    if (i == 5)
    {
      a='z';
      Punkt='B';
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +a+ "-Koordinate des Punktes "+Punkt+" ein: ");
      zahl = KeyboardIn.kReadInt();
    }
    if (i == 6)
    {
      a='x';
      Punkt='C';
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +a+ "-Koordinate des Punktes "+Punkt+" ein: ");
      zahl = KeyboardIn.kReadInt();
    }
    if (i == 7)
    {
      a='y';
      Punkt='C';
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +a+ "-Koordinate des Punktes "+Punkt+" ein: ");
      zahl = KeyboardIn.kReadInt();
    }
    if (i == 8)
    {
      a='z';
      Punkt='C';
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +a+ "-Koordinate des Punktes "+Punkt+" ein: ");
      zahl = KeyboardIn.kReadInt();
    }
    return zahl;
    }
 
Zuletzt bearbeitet von einem Moderator:
Jetzt geht es noch darum einen Winkel zwischen den das Dreieck aufspannenden Vektoren zu berechnen... das muss ich jetzt noch für mich herausfinden. Mit der Klasse Java.lang.math geht es ja nur zwischen x Achse und einem Punkt durch den Koordinatenursprung und das ist ja auch nur eine 2D Variante...
 
Ich mächte ja nicht negativ klingen, aber das ist doch im wesentlichen deine ursprüngliche Variante (die Dir zu viel war), in extra unleserlich mit ganz viel Bloat drum herum o_O
 
Ich mächte ja nicht negativ klingen, aber das ist doch im wesentlichen deine ursprüngliche Variante (die Dir zu viel war), in extra unleserlich mit ganz viel Bloat drum herum o_O
ja etwas abgewandelt ^^
ich bin wie gesagt noch blutiger Anfänger :D und brauche noch einige tausende Stunden an Übung :D
ich muss mich erstmal mit allem vertraut machen.
Du kannst mir aber sehr gerne eine viel kürzere Variante anbieten =)
 
Zuletzt bearbeitet:
sicher geht es bestimmt noch kürzer.
Kürzer ist nicht immer besser aber bei Deinem Code auf jeden Fall. Eine Schleife ist beispielsweise dazu da, Code wiederholt auszuführen und nicht um den Code unnötig aufzublähen.

Fangen wir mal von vorne an: Du willst drei Punkte (eines Dreiecks) einlesen. Für jeden Punkt hast Du drei Koordinaten (x,y,z), die Du Dir vom Anwender geben lassen willst. Du könntest also eine Methode schreiben, die vom Anwender die x-, y- und z-Koordinate entgegennimmt und daraus einen Punkt bastelt.

Java:
static int[] lesePunkt() {
    int[] koordinaten = new int[3]; // speichert die x-, y- und z-Koordinate eines Punktes
    for (int i = 0; i < koordinaten.length; i++) {
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +(i+1)+ "-Koordinate des Punktes "+punkt+" ein: ");
      koordinaten[i] = KeyboardIn.kReadInt();
    }
    return koordinaten;
}
Hier haben wir allerdings noch zwei Probleme:
1. die Variable "punkt" existiert nicht, es soll aber der Name des Punkts ausgegeben werden. Die Lösung ist einfach: wir sagen der Methode einfach, welchen Punkt sie gerade einliest, indem wir die Signatur ein wenig ändern:
Java:
public static int[] lesePunkt(String punkt) {
2. Der Benutzer wird nach der 1-,2-,3-Koordinate gefragt, wir hätten hier aber gerne die Achsen-Bezeichner stehen. Die sind immer gleich, wir können also ein statisches Array verwenden. Wir können sogar so weit gehen und sagen, dass dieses Achsen-Array bestimmt, wie viele Koordinaten eingelesen werden...

Java:
static final String[] ACHSE = {"x","y","z"};

static int[] lesePunkt(String punkt) {
    int[] koordinaten = new int[ACHSEN.length]; 
    for (int i = 0; i < koordinaten.length; i++) {
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +ACHSE[i]+ "-Koordinate des Punktes "+punkt+" ein: ");
      koordinaten[i] = KeyboardIn.kReadInt();
    }
    return koordinaten;
}
Wenn Du in dem Programm im Array ACHSE die z-Koordinate entfernst, werden automatisch nur noch 2D-Punkte eingelesen.

Damit sind wir schon ganz komfortabel unterwegs:
Java:
int[] punktA = lesePunkt("A");
int[] punktB = lesePunkt("B");
int[] punktC = lesePunkt("C");
 
Kürzer ist nicht immer besser aber bei Deinem Code auf jeden Fall. Eine Schleife ist beispielsweise dazu da, Code wiederholt auszuführen und nicht um den Code unnötig aufzublähen.

Fangen wir mal von vorne an: Du willst drei Punkte (eines Dreiecks) einlesen. Für jeden Punkt hast Du drei Koordinaten (x,y,z), die Du Dir vom Anwender geben lassen willst. Du könntest also eine Methode schreiben, die vom Anwender die x-, y- und z-Koordinate entgegennimmt und daraus einen Punkt bastelt.

Java:
static int[] lesePunkt() {
    int[] koordinaten = new int[3]; // speichert die x-, y- und z-Koordinate eines Punktes
    for (int i = 0; i < koordinaten.length; i++) {
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +(i+1)+ "-Koordinate des Punktes "+punkt+" ein: ");
      koordinaten[i] = KeyboardIn.kReadInt();
    }
    return koordinaten;
}
Hier haben wir allerdings noch zwei Probleme:
1. die Variable "punkt" existiert nicht, es soll aber der Name des Punkts ausgegeben werden. Die Lösung ist einfach: wir sagen der Methode einfach, welchen Punkt sie gerade einliest, indem wir die Signatur ein wenig ändern:
Java:
public static int[] lesePunkt(String punkt) {
2. Der Benutzer wird nach der 1-,2-,3-Koordinate gefragt, wir hätten hier aber gerne die Achsen-Bezeichner stehen. Die sind immer gleich, wir können also ein statisches Array verwenden. Wir können sogar so weit gehen und sagen, dass dieses Achsen-Array bestimmt, wie viele Koordinaten eingelesen werden...

Java:
static final String[] ACHSE = {"x","y","z"};

static int[] lesePunkt(String punkt) {
    int[] koordinaten = new int[ACHSEN.length];
    for (int i = 0; i < koordinaten.length; i++) {
      ScreenOut.kPrint("Bitte geben Sie einen Wert für die " +ACHSE[i]+ "-Koordinate des Punktes "+punkt+" ein: ");
      koordinaten[i] = KeyboardIn.kReadInt();
    }
    return koordinaten;
}
Wenn Du in dem Programm im Array ACHSE die z-Koordinate entfernst, werden automatisch nur noch 2D-Punkte eingelesen.

Damit sind wir schon ganz komfortabel unterwegs:
Java:
int[] punktA = lesePunkt("A");
int[] punktB = lesePunkt("B");
int[] punktC = lesePunkt("C");
Super herzlichen Dank!
Das sieht ja schon wesentlich besser aus =)
 
Es geht nicht darum, ob das besser aussieht, sondern dass Du das Prinzip verstehst.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben