# Monatsdurchschnittstemperaturen



## Punica (7. Apr 2011)

Hallo,
Wir haben in Informatik eine Aufgabe bekommen, doch ich weiß nicht wie ich diese mit 
Arrays lösen kann könntet ihr mir vielleicht einen Ansatz dazu geben?


Ich habe nur diesen Ansatz der glaube ich auch falsch ist.
Ich weiß nicht wie ich das lösen könnte ich dachte mir mit for-Schleifen, aber dann kam
ich auch nicht weiter, weil ich nicht weiß wie ich anfangen soll. Ich bin gerade total verwirrt.
Ich hoffe ihr könnt mir helfen!

```
double monat[]= new double[11]
```





3) Auswerten von Klimadaten
a) Die folgende Tabelle zeigt die Monatsdurchschnittstemperaturen der Stadt Jakutsk (Sibirien).
Monat   1   2    3   4  5  6  7   8 9  10 11   12
Temp.-42 -35 -20 -9 4 13 18 15 6 -8 -30 -40
°C

Mit einem Java-Programm soll nun die Jahresdurchschnittstemperatur (Summe der
Monatsdurchschnittstemperaturen dividiert durch 12) sowie für jeden Monat die Abweichung von der
Jahresdurchschnittstemperatur angegeben werden.
Die Eingabe soll wie folgt durchgeführt werden:
Geben Sie die Temperatur für den 1. Monat ein: -42
Geben Sie die Temperatur für den 2. Monat ein: -35
...
Geben Sie die Temperatur für den 12. Monat ein: -40
Die Ausgabe ist z. B.
Die Jahresdurchschnittstemperatur ist -10.67 Grad.
Der 1. Monat ist um 31.33 Grad kälter als der Durchschnitt.
Der 2. Monat ist um 24.33 Grad kälter als der Durchschnitt.
...
Ergänzung: Die Monatsnamen sollen angezeigt werden
b) Ergänze das Programm so, dass die Monatsnamen bei der Eingabe und Ausgabe als Text
ausgeschrieben werden. Weiterhin soll beim dem Text in der Ausgabe immer eine positive Zahl und
entweder kälter oder wärmer angezeigt werden.
Die Temperatur im Februar ist um 24.333333333333336 kälter als der Durchschnitt.
Die Temperatur im März ist um 9.333333333333334 kälter als der Durchschnitt.
Die Temperatur im April ist um 1.666666666666666 wärmer als der Durchschnitt.


----------



## eRaaaa (7. Apr 2011)

Mhm, eine wirklich konkrete Frage ist ja jetzt nicht erkennbar, aber wie kommst du auf 11? Es sind zwölf Monate  (0-11 als Index im Array, dennoch sinds 12 )
Kannst du auch direkt initialiseren eig. = {-42, -35, -20 ,-9, 4 ,13, 18, 15, 6, -8 ,-30 ,-40}
Wobei hast du jetzt bei 3a) ein Problem? Schleife hört sich schon nicht schlecht an. Einfach eben alle Werte addieren!


----------



## Punica (7. Apr 2011)

muss ich für die monate auch ein array machen oder muss man die soll als string deklarieren?


----------



## eRaaaa (7. Apr 2011)

Ich vermute enums hattet ihr noch nicht? Ja dann _könnte_ man das sicherlich mit einem Array machen (du beziehst dich aber auf b) oder?  )


----------



## Punica (7. Apr 2011)

ja ich beziehe mich auch die b.
und enums hatten wir noch nicht.


----------



## Punica (7. Apr 2011)

ist es egal ob ich die zahlen als int oder double mache?


----------



## muckelzwerg (7. Apr 2011)

Na imme rmit der Ruhe, das lässt sich doch recht gut zerlegen.
Du sollst die Monatsdaten vom Benutzer eingeben lassen. Ok. -> Funktionen für das Lesen von Benutzereingabe?
Dann musst Du diese Werte natürlich irgendwie speichern, denn Du wirst sie ja später in der Berechnung verwenden wollen.
-> Eine Temperatur eingelesen? Wohin damit?
Da würde sich dann doch gleich mal ein erstes Array anbieten. -> Was sind Arrays? Wie funktionieren sie? Ein Array für Zahlen.
Soweit so gut. Du hast ein Array mit den Zahlen darin. Woher bekommst Du die Monate? Die stehen einfach fest, ändern sich ja nicht. Also machst Du gleich mal noch ein Array und schreibst alle zwölf Monatsnamen da hinein. -> Array für Strings.
Durchschnittstemperatur kannst Du mit Deiner Formel berechnen. Dafür musst Du alle zwölf Temperaturen nacheinander aus dem Array herausholen und zu einem Wert "Summe" zusammenrechnen. -> Summe beginnt bei 0
Der Ablauf passt genau zu einer Schleife. -> "für jeden T-Wert von 0 bis 11, erhöhe die Summe um Wert x"
Wie Arrays funktionieren hast Du Dir angesehen. -> Wie funktioneren "For-Schleifen"? Start, Ende, Schrittweite?
Jetzt gibst Du die Durchschnittstemperatur erstmal auf der Konsole aus. -> Ausgabe von Text und Daten?
Wenn Du eine Schleife für die zwölf Temperaturen machen kannst, dann kannst Du auch genauso eine für die zwölf Monatsnamen machen.
Also wieder eine Schleife für zwölf Einträge und diesmal holst Du Dir gleich den Namen des Monats aus dem einen Array und seine Temperatur aus dem anderen. -> Zweite Schleife für die Ausgabe der Monate und Abweichungen.
Du berechnest die Differenz zur Durchschnittstemperatur und gibst dann "Monatsname" und "Differenz" aus.

-> Funktionen für das Lesen von Benutzereingabe?
-> Eine Temperatur eingelesen? Wohin damit?
-> Was sind Arrays? Wie funktionieren sie? Ein Array für Zahlen
-> Array für Strings.
-> Summe beginnt bei 0
-> "für jeden T-Wert von 0 bis 11, erhöhe die Summe um Wert x"
-> Wie funktioneren "For-Schleifen"? Start, Ende, Schrittweite?
-> Ausgabe von Text und Daten?
-> Zweite Schleife für die Ausgabe der Monate und Abweichungen.

Wenn Du soweit bist, fällt Dir entweder von selbst ein, wie Du das mit "kälter" und "wärmer" machst, oder wir schauen uns das nochmal an.


----------



## Punica (7. Apr 2011)

```
int [] werte = new int [12]; 
          int werte = eingabe.nextInt();
```

Warum kann ich das nicht machen?


----------



## eRaaaa (7. Apr 2011)

weil du 2 x den gleichen Namen vergibst?


----------



## Punica (7. Apr 2011)

Punica hat gesagt.:


> ```
> int [] werte = new int [12];
> int werte = eingabe.nextInt();
> ```
> ...



Ich mache erstmal ne Pause und mache morgen weiter


----------



## Punica (7. Apr 2011)

aber ich will doch für den array die werte einlesen, wie soll ich das dann machen?


----------



## eRaaaa (7. Apr 2011)

:rtfm: wäre angebracht
werte[x] = ..... z.B.


----------



## Punica (7. Apr 2011)

funktioniert irgendwie nicht, der sagt das immernoch,dass 2 mal das gleiche da ist

```
Scanner eingabe = new Scanner (System.in);
        int x=0;
        int [] werte = new int [11];
        int werte[x] = eingabe.nextInt();
```


----------



## eRaaaa (7. Apr 2011)

Du hast noch immer nicht gelesen oder? Siehst du vor meinem werte[x] ein int? 
So kommst du nicht voran und so macht es dir sicher auch kein Spaß oder wenn du bei jedme kleinen bisschen nachfragen musst. Lies dich doch einfach mal in die Themen Array + for-Schleife ein und die Aufabe sollte in null Komma nichts erledigt sein.


----------



## Firephoenix (7. Apr 2011)

Hi,
und für die Arrays kriegst du von mir auch gleich noch meinen Favoriten-Array-NachschlageLink 
Tutorial / Java Grundlagen / Arrays
Gruß


----------



## ARadauer (8. Apr 2011)

Punica hat gesagt.:


> funktioniert irgendwie nicht, der sagt das immernoch,dass 2 mal das gleiche da ist


Das int brauchst du beim benutzen nicht mehr dazu schreiben... nur das erste mal beim "initialiseren" der variable




```
package abstracttest;

import java.util.Scanner;

public class Test {

   public static void main(final String[] args) {
      Scanner eingabe = new Scanner (System.in);
      int [] werte = new int [12];
      for(int i = 0; i < werte.length; i++){
         System.out.println("Wert "+(i+1)+" eingeben:");
         werte[i] = eingabe.nextInt();   
      }
      
      System.out.println("Danke");
      for(int i = 0; i < werte.length; i++){
         System.out.print(werte[i]+", ");
      }      
   }
}
```


----------



## Punica (8. Apr 2011)

ok schonmal danke für die tipps habe mir auch schon das array tutorial durchgelesen. eine frage habe ich trotzdem noch wie kann ich den array jetzt dividieren? brauch ich da wieder eine andere variable, weil der sagt immer wenn ich werte dividieren will, dass der operator damit nicht funktioniert.


----------



## ARadauer (8. Apr 2011)

Punica hat gesagt.:


> ok schonmal danke für die tipps habe mir auch schon das array tutorial durchgelesen. eine frage habe ich trotzdem noch wie kann ich den array jetzt dividieren?


Wie willst du eine liste divideren?



> brauch ich da wieder eine andere variable, weil der sagt immer wenn ich werte dividieren will, dass der operator damit nicht funktioniert.


für die summe? ja klar, die musst du dir aber erst ausrechnen...


```
public static int getSum(int[] values){
      int sum =0;
      for(int i = 0; i<values.length;i++){
         sum +=values[i];
      }
      return sum;
   }
```


----------



## akimoon (8. Apr 2011)

Stell dir ein array mal wie einen kleinen Schrank vor, wobei in jeder Schublade irgendwas stecken kann.

Beispiel: Der Schrank(array) heißt "int_array" ~~> dann kannst du mit int_array[0] auf den Wert in der 1. Schublade zugreifen, mit int_array[1] auf den in der zweiten usw... durch int[] gibst du vor, dass in den Schubladen lauter int-Werte liegen.

Ein Array an sich ist aber keine Zahl, sondern eben ein Array, daher kannst du es auch nciht so einfach teilen. 

Aber du könntest ja zum Beispiel die Werte der Reihe nach durchgehen, zusammenzählen und dann die Summe dividieren?


----------



## Punica (8. Apr 2011)

So es funktioniert jetzt soweit alles, aber bei der Abweichung gibt er zwar die richtigen Werte raus aber verschoben also für den falschen Wert und dann habe ich noch ein Problem mit den Textstrings ich weiß nicht wie die gehen denn auf dem Zettel die uns der Lehrer gegeben hat sind nur int und double Arrays.

```
import java.util.Scanner;
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
              Scanner eingabe = new Scanner (System.in);



      int [] werte = new int [12];


         for(int i = 0; i < werte.length; i++){
            System.out.println("Wert "+(i+1)+" eingeben:");
            werte[i] = eingabe.nextInt();


      }
            int sum =0,durch;
        for(int i = 0; i<werte.length;i++){
            sum +=werte[i];

      }

     durch= sum/12;

      System.out.println("Temperaturdurchschnitt in Jakutsk:    "+durch);
        for(int i = 0; i < werte.length; i++){
            System.out.print(werte[i]+", ");

      }
        for(int i =0; i< werte.length; i ++){
            System.out.println(werte[i]-durch+"     beträgt die Abweichung");

        }

   }
}
```


----------



## ARadauer (8. Apr 2011)

> noch ein Problem mit den Textstrings ich weiß nicht wie die gehen


Was?
Galileo Computing :: Java ist auch eine Insel – 4 Der Umgang mit Zeichenketten


----------



## Punica (8. Apr 2011)

Ups ich meinte Stringarrays


----------



## ARadauer (8. Apr 2011)

und? frage?
ob du jetzt 
int [] werte = new int [12];
schbreibst oder
String [] werte = new String [12];
... dann hast du dein String array...
ach wurscht... 
 ich mach feierarbend...


----------



## Punica (11. Apr 2011)

So ich habe mir jetzt alles nochmal durchgelesen und habe es jetzt auch einigermaßen verstanden und bin jetzt fast fertig. Ich muss nur noch die letzte Aufgabe machen:

b) Ergänze das Programm so, dass die Monatsnamen bei der Eingabe und Ausgabe als Text ausgeschrieben werden. Weiterhin soll beim dem Text in der Ausgabe immer eine positive Zahl und entweder kälter oder wärmer angezeigt werden.
Die Temperatur im Februar ist um 24.333333333333336 kälter als der Durchschnitt. Die Temperatur im März ist um 9.333333333333334 kälter als der Durchschnitt. Die Temperatur im April ist um 1.666666666666666 wärmer als der Durchschnitt.

Man muss das mit einer If-Abfrage machen nur komme ich da gerade nicht weiter, weil ich nicht weiß wie ich da mit den Arrays umgehen kann und wie ich ein Int in ein Double umwandeln kann damit das mit den Kommazahlen funktioniert.
Hier ist erstmal mein Quellcode soweit:


```
import java.util.Scanner;
public class Main {




    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
      Scanner eingabe = new Scanner (System.in);



      double [] werte = new double [12];
      String monat [] =  {"Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"};


         for(int i = 0; i < werte.length; i++){
            System.out.println("Temperatur für "+monat[i]+" eingeben:");
            werte[i] = eingabe.nextInt();


      }
            int sum =0,durch;


        for(int i = 0; i<werte.length;i++){
            sum +=werte[i];

      }

     durch= sum/12;

      System.out.println("Temperaturdurchschnitt in Jakutsk:    "+durch);
     
      
        //for(int i=0; i<werte.length; i ++){
            //System.out.println(werte[i]-durch+"     °C beträgt die Abweichung im "+monat[i]);


      int j=0;
            if (j<=durch){
                j++;
                j=0;
                System.out.println ("Der Monat"+monat[j]+"ist");
            }


            
      }
    }
```

Ich hoffe ihr könnt mir hierbei nochmal helfen


----------



## XHelp (11. Apr 2011)

Warum speicherst du die Werte in einem Double-Array, wenn du ohnehin nur Integer eingeben kannst?
int/int ergibt nun mal int. Zudem ist auch 
	
	
	
	





```
durch
```
 als int deklariert.
Auf welches Programmteil bezieht sich überhaupt die Frage?


----------



## Punica (11. Apr 2011)

ok dann lasse ich das einfach so, aber wie kann ich jetzt nur positive zahlen ausgeben oder machen das der monat immer eins weiter geht in der if-abfrage? ist das genauso wie bei der for-schleife?


----------



## XHelp (11. Apr 2011)

Ja, du brauchst schon eine Schleife drumherum


----------



## Punica (11. Apr 2011)

So ist das ja soweit richtig oder? aber bei mir zeigt er bei der else-Abfrage noch einen Fehler brauch ich da wieder eine andere Variable?


```
for(int z=0; z<monat.length;z++){
            if (j<=durch){
                j++;
                j=0;
                diff= werte[z]-durch;

                System.out.println ("Der Monat "+monat[z]+"  ist"+diff+" kälter als der Durchschnitt");
            }
            else(j>=durch){

}

 }
```


----------



## muckelzwerg (11. Apr 2011)

Nein, da fehlt nur ein weiteres "if"
else if(...)
sonst kann der Parser deinen Programmcode nicht korrekt zerlegen und Dein Programm nicht verstehen.


----------



## Punica (11. Apr 2011)

ok dann wäre ich jetzt fertig mit dem programm nur wie mache ich das da kein + oder - mehr vorsteht, wie das in der aufgabe gefordert ist?


----------



## muckelzwerg (11. Apr 2011)

java.lang.Math.abs(...)
oder ein
"diff *= -1" an der richtigen Stelle.


----------



## Punica (11. Apr 2011)

Wie geht das mit diesem java.lang.Math.abs?
-ok schon selbst rausgefunden


----------



## akimoon (12. Apr 2011)

klappt ja echt super, so lob ich mir das 
aber eine kleine Frage hätte ich noch:

Für was verwendest du das folgende: 

```
if (j<=durch){
                j++;
                j=0;
```

Du könntest dir außerdem wegen dem Fließkommazahl-Problem evtl. auch die Methode _nextDouble()_ der Klasse java.util.Scanner anschauen und vllt die Summenberechnung etc anpassen? 

Was du zusätzlich tun könntest, um etwas neues zu lernen, wäre einen ternären Operator zu verwenden. Dies ist quasi eine kurze Schreibweise für if-else.

```
System.out.println("Der Monat "+monat[z]+"  ist "+((j<=durch)?"kälter":"wärmer")+" als der Durchschnitt");
```


----------

