# Zinsrechnung



## Sushi (19. Nov 2008)

Ji, habe folgende Klasse:

public class Zinsen {
	public static void main(String[] args) {
		System.out.println(ertrag(200,5,8));
	}


	public static double[] ertrag(double betrag, int jahre, double zins){


		double[]kapital ;
		kapital = new double[jahre +1];


		for (int i = 1; i <= jahre; i++) {
			betrag = betrag * (100 + zins) / 100;
			kapital_ = betrag;
			}

		 return kapital;}
	}


So eclipse zeigt mir auch keinen fehler mehr an. wenn ich nun auf run klicke kommt folgendes ergebnis in der konsole:

[D@3e25a5


vielleicht weiß jemand von euch wie ich das ding zum laufen bekomme^^


mfg Sushi_


----------



## SlaterB (19. Nov 2008)

du gibst da ja ein Array aus,
quasi

System.out.println(double[]); 

was willst du stattdessen sehen, alle Werte im Array kommagetrennt, in einer oder mehreren Zeilen, sortiert, formatiert, geliftet?

es wäre sicher nicht schlecht, wenn Java da irgendwas beliebiges lesbares hinzaubern würde,
aber überlebensnotwendig ist das auch nicht,
verwende eine for-Schleie und gib jeden Wert einzeln aus


----------



## Guest (19. Nov 2008)

ich möchte, dass die klasse mir dann ein array ausgibt mit dem inhalt {kapital am anfang, kanpital nach einem jahr, kapital nach 2 jahren,usw}


----------



## SlaterB (19. Nov 2008)

hab ich ja schon beantwortet oder ganz bequem:
java.util.Arrays.toString(array);


----------



## Sushi (19. Nov 2008)

also diese java.util.Arrays.toString(array); hatten wir noch nicht^^ keine ahnung was das ist.

Jedes element einzeln auszugeben habe ich auch schon probiert.

da müsste ich ja statt 
return kapital

return ("kapital element " + i + " = " + kapital_)

das problem ist dann kommt folgende meldung

i cannot be resolved.


danke schonmal für die tipps_


----------



## SlaterB (19. Nov 2008)

du musst eine neue for-i bis jahre-Schleife verwenden, ohne das gehts nicht, 
und du musst überlegen, ob das in der Methode vor dem retur passieren soll, dann ändert sich der Rückgabewert,
oder ob das die main-Methode machen soll


----------



## Sushi (19. Nov 2008)

eine 2. for schleife? also irgendwie bin ich gerade bischen überfordert sry XD


----------



## Schandro (19. Nov 2008)

in der main methode speicherst du erst das, was deine ertrag-Methode returnt, in eine Variable. Dann machst du ne for-Schleife die die einzelnen elemente des arrays ausgibt.


----------



## Templon (19. Nov 2008)

```
public class Zinsen {
	public static void main(String[] args) {
		
		double[] ertrag = ertrag(200, 5, 8);
		
		for (int i = 0; i < ertrag.length; ++i) {
			System.out.println(ertrag[i]);
		}
	}

	public static double[] ertrag(double betrag, int jahre, double zins) {

		double[] kapital;
		kapital = new double[jahre + 1];

		for (int i = 1; i <= jahre; i++) {
			betrag = betrag * (100 + zins) / 100;
			kapital[i] = betrag;
		}

		return kapital;
	}
}
```

So z.B. =)


----------



## Guest (19. Nov 2008)

aso^^
ok dann probier ich das mal und sag dann bescheid wies gleuafen ist.


Echt spitzen forum mit super support


----------



## Sushi (19. Nov 2008)

super, danke jetzt spuckt er mir endlich ein richtiges ergebnis aus. jetzt schau ich nur noch, dass im ergebnis auch der anfangsbetrag drin steht. ( das will ich aber alleine schaffen^^)

Also danke an alle.


P.S. gleich mal nen Account hier anlegen.


----------



## Sushi (19. Nov 2008)

Ok die aufgabe get doch noch ein bischen schwerer weiter als gedacht.
und zwar soll man quasi das gleich nochmal für mehrere Spalten machen. in der gleichen Klasse folgende methode:

public static double[][] tabelle (double zins, double min, double max,
			int jahre){

So meine überlegung war ich werde für dieses 2. dimensionale array
2 for schleifen brauchen eine für anzahl der jahre ( selbes wie oben denke ich)
und eine für die anzahl der zu berechnenden werte.
mein problem ist nun:
a)
wenn ich versuche ein array zu definieren wie folgt:
double[][]anlage;
anlage = new double [(max - min)/100 +1][jahre +1];

kann ich min und max aufgrund ihres types nicht benutzen. eine andere definition der länge des array fällt mir aber nicht ein

b)die verknüpfung bzw schreibweise zwischen den einzelnen for schleifen um am schluss ein 2 dim. array zu erhalten.

mfg Sushi


----------



## SlaterB (20. Nov 2008)

> anlage = new double [(max - min)/100 +1][jahre +1]; 

nicht so kompliziert, rechne

int x = ..;
int y = ..;
anlage = new double [x][y]; 

denk dir zwei Schleifen aus, i und j,
schreibe sie ineinander,
fertig


----------



## Sushi (20. Nov 2008)

hm aber int x kann ich ja nur angeben indem ich min und max benutze. das sind aber beides double werte und danns agt er mir sofort, dass ich diese nicht benutzen kann. ein anderer weg die anzahl der positionen anzugeben ohne min und max fällt mir nicht ein.

mfg Sushi


----------



## Sushi (20. Nov 2008)

ok habe mal weiter probiert nd folgendes  ist dabei rausgekommen:

public class Zinsrechnung {
	public static void main(String[] args) {
		double[][]Tabelle = Tabelle(5,300,8000,5);

	      for (int i =0; i < Tabelle.length; ++i) {
	    	  for (int j = 0; j < Tabelle_.length; ++j)
	         System.out.println(" Jahr "+ i +":"  + Tabelle[j]);
	    	  System.out.println();}}





	public static double[][] Tabelle (double zins, double min, double max,int jahre){

			double betrag;
			int x = 5;
			int y = jahre +1;
			double[][]anlage;
			anlage = new double [x][y];

			for (int i = 0; i <= max; i+=100){
				min = min +100;
				anlage[y]= min;
			for (int j = 0;j <= jahre - 1; j++){
				betrag = min * (100 + zins) / 100 ;
				anlage[x][j]= betrag;
			}}
				return anlage;

			}


allerdings stimmt da noch einiges nicht. ich bin mir nicht sicher ob ich die for schleifen richtig verknüpft habe und das array richtig ausgebe._


----------



## SlaterB (20. Nov 2008)

daswegen sollst du ja
int x = ..; 
ausrechnen, das zwingt dich dazu, den double auf int zu runden,
denn ein Array mit 3 1/5 Feldern gibts nicht

nun kannst du natürlich sagen, dass dir generell das Runden fremd ist,
dann sage ich:

int x = (int) (..);


----------



## Sushi (20. Nov 2008)

XD jetzt hab ichs gerallt.

ok dann bleibt nur noch das lösen der for schleifen. den dies kann nicht stimmen:

for (int i = 0; i <= max; i+=100){
				min = min +100;
				anlage_[y]= min;
			for (int j = 0;j <= jahre - 1; j++){
				betrag = min * (100 + zins) / 100 ;
				anlage[x][j]= betrag;
			}}
				return anlage;


kennt jemand eine gute seite wo man erklärt bekommt wie man vorzugehen hat bei so einem array?_


----------



## SlaterB (20. Nov 2008)

du meinst vielleicht

for (int i = 0; i <= max; i+=100){ 
min = min +100; 
anlage_[0]= min; 
for (int j = 1;j <= jahre - 1; j++){ 
betrag = min * (100 + zins) / 100 ; 
anlage[j]= betrag; 
}} 


lernen kann man sowas kaum,
wenn man ein Array durchlaufen kann ist der logische Schritt zu zwei ineinander verschachtelten Schleife eher eine Eigenleistung_


----------



## Sushi (20. Nov 2008)

hm irgendwo ist immer noch der wurm drinnen.

public class Zinsen {
	public static void main(String[] args) {
		double[][]Tabelle = Tabelle(10,500,1000,4);

	      for (int i =0; i < Tabelle.length; ++i) {
	    	  for (int j = 1; j < ertragsTabelle_.length; ++j)
	         System.out.println(" Jahr "+ i +":"  + ertragsTabelle[j]);
	    	  System.out.println();}}








	public static double[][] ertragsTabelle (double zins, double min, double max,
			int jahre){
			double betrag;
			int x =(int)(max - min)/100 +1;
			int y = jahre +1;
			double[][]anlage;
			anlage = new double [x][y];

			for (int i = 0; i <= max; i+=100){
				min = min +100;
				anlage[0]= min;
			for (int j = 1;j <= jahre - 1; j++){
				betrag = min * (100 + zins) / 100 ;
				anlage[j]= betrag;
			}}
				return anlage;

			}

}

das ist jetzt die komplette methode. Als fehler gibt er mir an:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
	at Geldanlage.ertragsTabelle(Geldanlage.java:45)
	at Geldanlage.main(Geldanlage.java:4)


Ich habe zahlreiche tutorials und bücher zum thema array durchgemacht. In keinem waren auch nur ansatzweise hilfreiche besipiele angefügt. für mich, der noch nie etwas mit programmierung zu tun hatte, ist das natürlich nich gerade super. Mit den grundinformationen (deklaration usw) komm ich leider nicht besonders weit. Das heißt selbst üben üben üben... Ich hoffe auch, dass mir diese übung ein bischen verständnis für arrays bringt, damit ichd as nächste mal vlt auch ohne Hilfe auf die Lösung komme.
Aber ich finde es echt super, dass ihr hier anfängern helft._


----------



## Sushi (20. Nov 2008)

ups habe vergessen die alten bezeichnungen noch zu ändern.
ich hoffe ihr wisst trotzdem was gemeint ist^^


----------



## SlaterB (20. Nov 2008)

tja, das Array hat eine Länge von x und eine 'Breite' von y

wieso läuft dann die Schleife bis max bzw. bis jahre-1 und nicht nur bis x und y?


----------



## Sushi (20. Nov 2008)

hm das problem ist immer noch da. er verweist auf 

anlage_[j]= betrag;
und

double[][]Tabelle = Tabelle(5,300,800,4);_


----------



## SlaterB (20. Nov 2008)

ist ja hoffnungslos, ich kann auch nicht alle Besonderheiten, die man bedenken muss, vorher sehen und erwähnen,

hier Generalüberholung:

```
public class Test
{
    public static void main(String[] args)
    {
        double[][] tabelle = ertragsTabelle(10, 500, 1000, 4);

        DecimalFormat df = new DecimalFormat("0.00");
        for (int i = 0; i < tabelle.length; ++i)
        {
            System.out.println("    Min: "+df.format(tabelle[i][0]));
            for (int j = 1; j < tabelle[i].length; ++j)
                System.out.println(" Jahr " + j + ": " + df.format(tabelle[i][j]));
            System.out.println();
        }
    }


    public static double[][] ertragsTabelle(double zins, double min, double max, int jahre)
    {
        double betrag;
        int x = (int)(max - min) / 100 + 1;
        int y = jahre + 1;
        double[][] anlage;
        anlage = new double[x][y];

        double zinsFactor = (100.0 + zins) / 100.0;
        for (int i = 0; i < x; i++)
        {
            min = min + 100;
            anlage[i][0] = min;
            betrag = min;
            for (int j = 1; j < y; j++)
            {
                betrag = betrag * zinsFactor;
                anlage[i][j] = betrag;
            }
        }
        return anlage;

    }


}
-----------
   Min: 600,00
 Jahr 1: 660,00
 Jahr 2: 726,00
 Jahr 3: 798,60
 Jahr 4: 878,46

   Min: 700,00
 Jahr 1: 770,00
 Jahr 2: 847,00
 Jahr 3: 931,70
 Jahr 4: 1024,87

   Min: 800,00
 Jahr 1: 880,00
 Jahr 2: 968,00
 Jahr 3: 1064,80
 Jahr 4: 1171,28

   Min: 900,00
 Jahr 1: 990,00
 Jahr 2: 1089,00
 Jahr 3: 1197,90
 Jahr 4: 1317,69

   Min: 1000,00
 Jahr 1: 1100,00
 Jahr 2: 1210,00
 Jahr 3: 1331,00
 Jahr 4: 1464,10

   Min: 1100,00
 Jahr 1: 1210,00
 Jahr 2: 1331,00
 Jahr 3: 1464,10
 Jahr 4: 1610,51
```


----------



## Sushi (20. Nov 2008)

danke schonmal für die lösung. damit ist wohl die aufgabe fertig. kennt hier jemand zufällig noch weitere Aufgaben für solche arrays würde gerne am wochenende noch bischen üben und finde leider nichts vergleichbares.


----------



## Sushi (20. Nov 2008)

eine frage habe ich noch. wie baue ich ein, dass wenn ungültige eingaben kommen z.b. -1 oder false kommen soll. das geht doch dann nur über if - else oder?


----------



## SlaterB (20. Nov 2008)

genau


----------



## Sushi (20. Nov 2008)

public static double[][] ertragsTabelle (double zins, double min, double max,
			int jahre){

		double betrag;
	        int x = (int)(max - min) / 100 + 1;
	        int y = jahre + 1;
	        double[][] anlage;
	        anlage = new double[x][y];
	        anlage[0][0]= min;
	        min = min -100;
	        double zinsFaktor = (100.0 + zins) / 100.0;

	        if (min > max||zins < 0|| zins >=100||jahre < 1){

	        	return null;}
	        else{

	        for (int i = 0; i < x; i++)
	        {
	            min = min + 100;
	            anlage_[0] = min;
	            betrag = min;
	            for (int j = 1; j < y; j++)
	            {
	                betrag = betrag * zinsFaktor;
	                anlage[j] = betrag;
	            }
	        }
	        return anlage;

	    }
	}
}

eingebaut ist es funktionieren tuts aber noch nich -.-_


----------



## SlaterB (20. Nov 2008)

ich würde die Prüfung ganz an den Anfang schreiben, bevor du x usw. ausrechnest,

solange aber die main-Methode mit den Parametern fehlt,
kann man eh nicht sagen, ob das if aktiv werden sollte oder nicht


----------



## Sushi (20. Nov 2008)

ok habe grade mal durchlaufen lassen die methode ist endlich gemeistert^^

jetzt meldet sich aber die methode in der man nur einen betrag über einen zeitraum beobachten sollte (siehe seite 1)

folgende meldung:

 Caused an ERROR
11
java.lang.ArrayIndexOutOfBoundsException: 11
    at Geldanlage.ertragsZeile(Geldanlage.java:20)
    at TestGeldanlageFunctionPublic.testZeile(TestGeldanlageFunctionPublic.java:94)
    at TestGeldanlageFunctionPublic.testZeile(TestGeldanlageFunctionPublic.java:28)


----------



## SlaterB (20. Nov 2008)

ich habe grad 10 Sekunden hin und gescrollt und auch erfolglos nach 'ertragsZeile' gesucht,

möchtest du nicht lieber vollständige Fragen mit allem aktuellen Code, Parametern und sonstigen Eingaben formulieren?


----------



## Sushi (20. Nov 2008)

XD das kommt davon wenn man zuoft die bezeichnungen ändert. ich habe sie nun um es besser auseinanderhalten zu können ertragszeile genannt. es handelt sich hierbei um die ethode ertrag von seite 1


----------



## SlaterB (20. Nov 2008)

die damals (im ersten Posting) nach deinen Angaben funktioniere, bei mir im Test auch,
und nun soll sie auf einmal nicht mehr gehen?
soetwas passiert in dieser Welt nicht..


lass mich raten, du meinst gar nicht den Code vom ersten Posting,
sondern den nach Änderung aus Posting x und y mit den Parametern von Posting z

alles klar..,
ein weiteres Posting zum Thema 'was verstehe ich nicht' werde ich nicht schreiben,
demnächst kommt nur noch 'keine Ahnung wovon du redest'


----------



## Sushi (20. Nov 2008)

es ging um folgende methode:

public class Zinsen {
   public static void main(String[] args) {

      double[] ertrag = ertrag(200, 5, 8);

      for (int i = 0; i < ertrag.length; ++i) {
         System.out.println(ertrag_);
      }
   }

   public static double[] ertrag(double betrag, int jahre, double zins) {

      double[] kapital;
      kapital = new double[jahre + 1];
      kapital[0] = betrag

      for (int i = 1; i <= jahre; i++) {
         betrag = betrag * (100 + zins) / 100;
         kapital = betrag;
      }

      return kapital; 


folgende meldung: testZeile took 0.002 sec
    Caused an ERROR
11
java.lang.ArrayIndexOutOfBoundsException: 11


anscheinend stimmt irgendwas mit dem array und dessen inhalt nich. aber was..._


----------



## SlaterB (20. Nov 2008)

bei mir ohne Fehler abgesehen von einem fehlenden Semikolon


----------



## Sushi (20. Nov 2008)

ich hab es herausgefunden:

das idiotische programm hat in der schleife i = 1 nicht angenommen.

musste erst i = 0 machen ne if else anweisung dran hängen dann hat ers gefressen.


Danke aber an alle und speziell an SlaterB dem ich jetzt wohl 1  millionen Euro schulde^^


----------

