# Java Array speichern & laden



## Rycon (9. Jun 2012)

Die Berechnung (Volumen und Masse) soll über 2 Unterprogramme erfolgen. (Aluminiumrohr und Stahlrohr) Die Berechnung der beiden Unterprogramme habe ich bereits geschrieben.

Das Transportgewicht eines LKW's darf 20 Tonnen nicht überschreiten.

Ich komme nur hier nicht weiter.

Ich muss eine Funktion erstellen, das nach jedem berechnetem Rohr, das aktuelle Gewicht in einem Array speichert und danach das Gewicht des aktuellen Ladegewichts ausgibt. Wenn das Ladegewícht überschritten wird, soll die Ausgabe erscheinen, dass dieses Rohr nicht mehr verladen werden kann.

Im kurzen Sinne soll er jedes berechnete Rohr in einem Array speichern und das aktuelle Ladegewicht anzeigen (Array zusammen addieren). Wenn dann 20 Tonnen überschritten sind, soll er ausgeben, dass dieses Rohr nicht mehr verladen werden kann.

Außerdem soll nach der Ausgabe und auch während der Auswahl der Unterprogramme, die möglichkeit bestehen, dass Programm mit der Taste "3" zu beenden.

Hier ist mein jetziger Code:

```
import java.util.Scanner;

      class Metallbaufirma
{
  public static void main(String[]args)
  {
    int auswahl;
    int X=0;
    while (X!=1)
    {
      Scanner so=new Scanner(System.in);
      System.out.print("Bitte geben Sie eine 1 für Stahlrohre und eine 2 für Aluminiumrohre ein.");
      auswahl=so.nextInt();
      if (auswahl == 1)
      {
        Stahlrohre();
      }
      else
      {
        Aluminiumrohre();
      }
      System.out.println ("Zum schließen des Programmes geben Sie die Zahl 1 ein!");

      X=so.nextInt();
    }
  }
  
  public static void Stahlrohre()
  {
    double Außendurchmesser;
    double Innendurchmesser;
    double Laenge=10;
    double Pi=3.14;
    double Volumen;
    Scanner so=new Scanner(System.in);
    System.out.print("Bitte geben Sie den Außendurchmesser in Metern an!:");
    Außendurchmesser=so.nextDouble();
    System.out.print("Bitte geben Sie den Innendurchmesser in Metern an!:");
    Innendurchmesser=so.nextDouble();
    System.out.print("Bitte geben Sie die Länge in Metern an!:");
    Laenge=so.nextDouble();
    
    if (Laenge > 10) {
      System.out.print("Die Länge darf nicht 10m überschreiten!");
      System.exit(0);
    }
    else {
      Volumen=Pi*Laenge/4*(Außendurchmesser*Außendurchmesser-Innendurchmesser*Innendurchmesser);
      System.out.println("Das Volumen des Stahlrohres beträgt:"+ Volumen+"m³");
      double Masse;
      double Dichte=9.5;
      Masse=Volumen* Dichte;
      
      System.out.println ("Die Masse des Stahlrohres beträgt:"+Masse+"Kg");
    }
    
  }
  
  public static void Aluminiumrohre()
  {
    double Außendurchmesser;
    double Innendurchmesser;
    double Laenge;
    double Pi=3.14;
    double Volumen;
    Scanner so=new Scanner(System.in);
    System.out.print("Bitte geben Sie den Außendurchmesser in Metern an!:");
    Außendurchmesser=so.nextDouble();
    System.out.print("Bitte geben Sie den Innendurchmesser in Metern an!:");
    Innendurchmesser=so.nextDouble();
    System.out.print("Bitte geben Sie die Länge in Metern an!:");
    Laenge=so.nextDouble();
    if (Laenge > 10) {
      System.out.print("Die Länge darf nicht 10m überschreiten!");
      System.exit(0);
    }
    else {
      Volumen=Pi*Laenge/4*(Außendurchmesser*Außendurchmesser-Innendurchmesser*Innendurchmesser);
      
      System.out.println("Das Volumen des Aluminiumrohres beträgt:"+ Volumen+"m³");
      
      double Masse;
      double Dichte=2.7;
      Masse=Volumen* Dichte;
      
      System.out.println ("Die Masse des Aluminiumrohres beträgt;"+Masse+"Kg");
    }
  }
}
```


----------



## Rycon (10. Jun 2012)

kann keiner mir helfen ??????????


----------



## Runtime (10. Jun 2012)

Was ist denn deine Frage / dein Problem?


----------



## Rycon (10. Jun 2012)

was für eine frage ist das  habe ich mich nicht richtig ausgedrückt oben????


----------



## Runtime (10. Jun 2012)

Hoppla, das hab ich übersehen. Btw: Satzzeichen sind keine Rudeltiere und kommen sehr unfreundlich rüber. Muss es ein Array sein? Weil ein double-Wert kann das bisherige Gesamtgewicht genauso speichern. Was ist denn dein Ansatz? Ist das dein Code?


----------



## Rycpm (10. Jun 2012)

ja ist mein Code nur ich komme wie ich mich auch oben versucht auszudrücken mit Array net weiter. wenn ich ein rohr aufladen sollte dann z.b 1kg von 20000k aufgeladen und dann wenn ich weider ein rohr auflade der auch 1 kg wiegt sollte dann 2kg von 20000kg erscheinen


----------



## Runtime (10. Jun 2012)

Runtime hat gesagt.:


> Was ist denn dein Ansatz?


Überleg dir mal, was du tun musst und poste dann, was für Gedanken du dir dazu gemacht hast, ich werde dir deine Hausaufgaben bestimmt nicht lösen.


----------



## Rycon (10. Jun 2012)

was für Ha???? ich komme ja ohne nichts zu machen hierhin, wollte nur eine funktion habe wo ich keine erfahrung habe mit Array func


----------



## tuttle64 (10. Jun 2012)

Rycon hat gesagt.:


> was für Ha???? ich komme ja ohne nichts zu machen hierhin, wollte nur eine funktion habe wo ich keine erfahrung habe mit Array func



Tutorial / Java Grundlagen / Arrays

mir ist nicht klar was du unter speichern verstehst, zur laufzeit oder persistent?


----------



## Rycon (10. Jun 2012)

morgen ,

ich wollte ersten eine Gewichtsbgrezung machen, der LWk nur 20000kg aufnehmen kann.
Mann lädt ja rohre, wenn die Rohre den von 20t erreicht habe sollte es 
System.out.print("Das Ladegewicht wurde überschritten, es können keine Rohre mehr verladen werden!");


2. wenn man Rohre auflädt, sollte auch direkt aktuelle Gesamgewicht erscheinen, und wenn man ein zweitens auflädt addiert werdenz.b Rohr1=1kgvon20000kg Rohr2=2kgvon20000k.


----------



## Ry (11. Jun 2012)

hat jemand für mich keine Antwort


----------



## Runtime (11. Jun 2012)

Hier hast du keine.


----------



## Olli_M (12. Jun 2012)

Also was mir so spontan dazu einfällt: man könnte z.B. eine Klasse namens "Rohr" erstellen.
Das Teil hat Länge, Gewicht und ggf. noch andere Eigenschaften. Ok.
Ist ja ein klassisches Beispiel, wo ein Objekt wirklich Sinn macht.

Dann könnte man freilich ein Array daraus erstellen, aber in sehr vielen Fällen sind Listen eleganter.
Ich persönlich würde ArrayList empfehlen, weil diese die (oft angenehme) Eigenschaft hat, variabel in der Länge zu sein, sie hat add und remove Funktionen und etliche andere Sachen mehr, die das Leben leicht machen. Arrays nehme ich nur dann, wenn ich mir ganz sicher bin, dass die Anzahl der Elemente wirklich fix bleibt. Bei den Rohren scheint mir die fixe Anzahl nun weniger sinnvoll.

Wenn man nun so eine ArrayList von Rohren hat, kann man auch leicht Funktionen schreiben, die einem die Gesamtlänge und das Gesamtgewicht der Rohre ausgeben, indem man über die ArrayList iteriert und die einzelnen Längen und Gewichte addiert.

Nun hast du noch was von "Speichern" geschrieben. Da war ja die Frage: auf Platte speichern (als File?) oder nur zur Laufzeit "speichern"? Das macht natürlich einen Unterschied. Natürlich kann man eine Klasse schreiben, die Inhalte von ArrayListen in ein txt File (z.B.) schreibt. Aber ich weiß nicht, ob dies nun gefordert war.

freundliche Grüße
Olli


----------



## HimBromBeere (12. Jun 2012)

Olli_M hat gesagt.:
			
		

> Da war ja die Frage: auf Platte speichern (als File?) oder nur zur Laufzeit "speichern"?





			
				rycon hat gesagt.:
			
		

> das aktuelle Gewicht in einem Array speichert



Dem Rest von Olli kann ich mich aber nur anschließen, schreib dir eine Klasse Rohr mit den Maßen und packe sie in eine Liste (Array geht auch, ist aber wie bereits erwähnt nicht so flexibel). Für die Gesamtlast musst du dann über diese Liste/das Array (bestehend aus einzelnen Rohren) iterieren und die jeweiligen Massen aufsummieren.


----------



## Rycon (13. Jun 2012)

Danke für die Rückantworten,

ich habe mein code bisschen erweitert


```
import java.util.Scanner;
class Metallbaufirma {

  public static void main(String[]args){
    
    int auswahl;
    int X=0;
    while (X!=1){
      
      Scanner so=new Scanner(System.in);
      System.out.print("Bitte geben Sie eine 1 für Stahlrohre und eine 2 für Aluminiumrohre ein.");
      auswahl=so.nextInt();
      if (auswahl == 1){
        Stahlrohre();
      }
      if (auswahl == 2) {
        Aluminiumrohre();
      }
      if (auswahl > 2) {
        System.exit(1);
      }
      System.out.println ("Zum schließen des Programmes geben Sie die Zahl 1 ein!");
      System.out.println ("Um weiter zu rechnen geben Sie die Zahl 2 ein!");
      X=so.nextInt();
    }
  }
  public static void Stahlrohre(){
    double Außendurchmesser;
    double Innendurchmesser;
    double Volumen;
    double Laenge;
    double Mgewicht= 20000;
    double Masse;
    double Dichte = 9.5;
    Scanner so=new Scanner(System.in);
    
    System.out.print("Bitte geben Sie den Außendurchmesser in Metern ein!:");
    Außendurchmesser=so.nextDouble();
    
    System.out.print("Bitte geben Sie den Innendurchmesser in Metern ein!:");
    Innendurchmesser=so.nextDouble();
    
    System.out.print("Bitte geben Sie die Länge in Metern ein!:");
    Laenge=so.nextDouble();
    
    if (Laenge > 10) {
      
      System.out.print("Die Länge darf nicht 10m überschreiten!");
      System.exit(1);
    }
    if (Mgewicht > 20000 ) {
      
      System.out.print("Das Ladegewicht wurde überschritten, es können keine Rohre mehr verladen werden!");
      System.exit(1);
    }
    else {
      
      Volumen=Math.PI*Laenge/4*(Außendurchmesser*Außendurchmesser-Innendurchmesser*Innendurchmesser);
      System.out.println("Das Volumen des Stahlrohres beträgt:"+ Volumen+"m³");
      
      Masse=Volumen* Dichte;
      System.out.println ("Die Masse des Stahlrohres beträgt:"+Masse+"Kg");
      
      Mgewicht=Mgewicht-Masse;
      System.out.println ("Das aktuelle Gewicht beträgt:"+Mgewicht+"Kg");
    }
  }
  public static void Aluminiumrohre(){
    double Außendurchmesser;
    double Innendurchmesser;
    double Laenge=10;
    double Pi=3.14;
    double Volumen;
    double Mgewicht=20000;
    double Masse1;
    double Dichte=2.7;
    Scanner so=new Scanner(System.in);
    
    System.out.print("Bitte geben Sie den Außendurchmesser in Metern ein!:");
    Außendurchmesser=so.nextDouble();
    
    System.out.print("Bitte geben Sie den Innendurchmesser in Metern ein!:");
    Innendurchmesser=so.nextDouble();
    
    System.out.print("Bitte geben Sie die Länge in Metern ein!:");
    Laenge=so.nextDouble();
    if (Laenge >= 10){
      
      System.out.print("Die Länge darf nicht 10m überschreiten!");
      System.exit(1);
    }
    if (Mgewicht >= 20000 ){
      
      System.out.print("Das Ladegewicht wurde überschritten, es können keine Rohre mehr verladen werden!");
      System.exit(1);
    }
    else{
      
      Volumen=Pi*Laenge/4*(Außendurchmesser*Außendurchmesser-Innendurchmesser*Innendurchmesser);
      System.out.println("Das Volumen des Aluminiumrohres beträgt:"+ Volumen+"m³");
      
      Masse1=Volumen* Dichte;
      System.out.println ("Die Masse des Aluminiumrohres beträgt;"+Masse1+"Kg");
      
      Mgewicht=Mgewicht-Masse1;
      System.out.println ("Das aktuelle Gewicht beträgt:"+Mgewicht+"Kg");
      
    }
  }
}
```


nun was ich ganz konkret will ist, wenn ich einen Rohr verlade z.b dies ist dann 1000kg und am ende des berechnungs kommt ja das Aktuellegewicht das wäre dann theoretisch 19000kg.
Ab hier weiß ich nicht was ich machen soll.
die 19000kg sollte es speichern und wieder ausgeben wenn ich den zweiten Rohr verlade z.b dies ist auch wieder 1000kg, dann sollte es von 19t abziehen, aber nicht von 20t wie es bei mir zurzeit ist .

ich hoffe ich konnte mich gut ausdrücken, ich brauche eure hilfe!!!!!!


----------



## freez (13. Jun 2012)

Du hast bei dem 2. Rohr 2t Gewicht. Die ziehst du einfach von den 20t ab. 

Du hast 2 Varianten: entweder du merkst dir wie viel du schon drauf hast oder du merkst dir wie viel noch drauf kann. Den anderen Wert kannst du dir ja jeweils ausrechnen, da du ja weist, wie viel drauf passt.


----------



## rycon (13. Jun 2012)

wie muss ich das denn als code schreiben??


und wohin ??? könntest du mir als beispielo helfen


----------



## HimBromBeere (13. Jun 2012)

Den Tipp mit der Rohr-Klasse haste aber schon mitbekommen, oder? Denn Stahl- und Aluminumrohre sind ja prädestiniert für sowas. 

```
class Rohr {
    double Außendurchmesser;
    double Innendurchmesser;
    double Volumen;
    double Laenge;
    double Mgewicht;
    double Masse;
    double Dichte;

    Rohr (double außen, double innen, double volumen, double gewicht, double masse, double dichte) {
        Außendurchmesser = außen;
        Innendurchmesser = innen;
        ...
    }

    double getGewicht() {return Mgewicht;}
}
```


```
class Stahlrohr extends Rohr {
    Stahlrohr(...) {
        super(...)
    }
}
```


```
class AluRohr extends Rohr {
...
}
```

In deiner Hauptklasse baust du dir eine Liste von Rohren und eine Methide, die über diese Liste iteriert, um das Gesamtgewicht zu bekommen:


```
class MyClass {
    List<Rohr> rohre = new ArrayList<Rohr>();

    public static void main(String[] args) {
        Rohr stahl = new StahlRohr(<alle Eingangsparameter>);
        Rohr alu = new AluRohr(<alle Eingangsparameter>);

        rohrLaden(stahl);  
        rohrLaden(alu);
    }

    public rohrLaden(Rohr rohr) {
        if (gesamtGewicht() + rohr.getGewicht() < 20000) rohre.add(rohr);
        else System.out.printf("Kann nicht geladen werde");
    }

    public double gesamtGewicht() {
        double gesamt = 0;
        for (Rohr r: rohre) gesamt += r.getGewicht();
        return gesamt;
    }
}
```
Aber wenn du´s unbedingt anders haben willst, musst du dir nur in deiner Hauptklasse das Gesamtgewicht merken und das dann jedes Mal, wenn du ein neues Rohr anlegen willst, neu berechnen (die methode sieht so ähnlich aus wie die, die ich gerade beschrieben habe).


----------



## Rycon (13. Jun 2012)

was meinst du mit dem alle Eingangsparameter ????


----------



## rYCON (13. Jun 2012)

Ich finde schon sehr gut das du mir geholfen hast; aber leider ist es was du hingeschrieben hast; hat mich verwirrt. 

1:eingangsparameter?
2:es gibt zu viele einzelne codes die du für mich gepostet hast aber ich wei? Nicht wo hin die ich hunzufügen muss?? Z:b muss ich da eigene classe machen oder unter classe metallbaufirma hinzuüfge????


----------



## HimBromBeere (14. Jun 2012)

> was meinst du mit dem alle Eingangsparameter ????


Die ganzen Maße zur Erzeugung eines Rohres (also Außen- und Innendurchmesser, Masse, ...), also die, die im Konstruktor der Klasse Rohr gefragt werden. Z.B. so:

```
Rohr stahl = new Stahlrohr(12.7, 12.0, 2000, 2000, 34)
```
Standardmäßig kommt jede Klasse in eine eigene Datei mit dem selben Namen (du kannst zwar auch mehrere Klassen in einer Datei haben, aber darum kümmern wir uns später vlcht.). Also eine Datei 
	
	
	
	





```
Rohr.java
```
, eine 
	
	
	
	





```
AluRohr.java
```
, 
	
	
	
	





```
Stahlrohr.java
```
, 
	
	
	
	





```
Metallbaufirma.java
```


----------



## rycon (15. Jun 2012)

du jast ja geschrieben das ich in eine datei mehrere klassen e8nbauen kann aber das geht leider beir mir nicht koenntest du vllt die bsp in mein code e8nbauen


----------



## Gast2 (15. Jun 2012)

Jede Datei darf nur eine public Toplevel Class haben. Was geht ist folgendes:

Datei Punkt.java

```
public class Punkt {

}

class AndererPunkt {

}

class NochEinPunkt {

}
```


----------



## HimBromBeere (15. Jun 2012)

Ich hab geschrieben, dass du das machen kannst, nicht, dass du´s auch machen sollst. Pack mal lieber deine Klassen in versch. Dateien, das ist erstmal übersichtlicher.


----------

