# Algorithmus entwerfen



## stevoo (13. Nov 2011)

Entwerfen Sie einen Algorithmus, der jede zweite Zahl eines Feldes A(i) mit i=1,2,....,n addiert, beginnend mit dem zweiten Element und am Ende das Ergebnis der Addition überprüft. Sollte es sich beim Endresultat um eine grade Zahl handeln, so soll dies durch eine entsprechende Meldung festgehalten werden: "Das Resultat der Addition ist gerade." Handelt es sich jedoch um eine ungerade Zahl, so gibt die Meldung "Das Resultat der Addition ist ungerade" darüber Auskunft.

MEINE FRAGE: IST MEIN PSEUDOCODE RICHTIG?

n.....Feldanzahl
i......Feldelement
A(i).....Feldinhalt von i
a.....Summe der Addition jedes zweiten Feldinhaltes bis n
x.....Summe der Addition zweier Feldinhalte

i=2
a=0

Solange i<n (HIER GEHT i<=n SO WIE BEI EINEM PAP NICHT, ODER?)
A(i)+A(i+2)==x
a=a+x
i=i+4

Wenn Rest(a,2)==0
Ausgabe: "Das Resultat der Addition ist gerade." 
sonst
Ausgabe: "Das Resultat der Addition ist ungerade."


----------



## stevoo (13. Nov 2011)

oder ist das besser(ohne x)?:
Solange i<n (HIER GEHT i<=n SO WIE BEI EINEM PAP NICHT, ODER?)
a=a+((A(i)+A(i+2))
i=i+4

Wenn Rest(a,2)==0
Ausgabe: "Das Resultat der Addition ist gerade."
sonst
Ausgabe: "Das Resultat der Addition ist ungerade."


----------



## HoaX (13. Nov 2011)

Schreib doch deinen Pseudocode einfach in Javacode und probier es aus? Dann siehst du ganz einfach ob er richtig ist.


----------



## stevoo (13. Nov 2011)

HoaX hat gesagt.:


> Schreib doch deinen Pseudocode einfach in Javacode und probier es aus? Dann siehst du ganz einfach ob er richtig ist.



Wie schreibe ich ihn in einen javacode um?


----------



## crackm (13. Nov 2011)

Du nimmst ein Array packs da n generierte Zahlen Math.random() könnte da nützlich sein.
Nimmst ein Schleife und gehst längedes Array /2 Scrhitte.
in der Schlefe selbst multiplizierst du den index mit zwei und addiert 1 drauf.
-> Index 0 -> 2*0+1 damit fängst du automatisch bei zweitem element an.
..


----------



## njans (13. Nov 2011)

```
//n.....Feldanzahl
		//i......Feldelement
		//A(i).....Feldinhalt von i
		//a.....Summe der Addition jedes zweiten Feldinhaltes bis n (summeZweitenFeldes)
		//x.....Summe der Addition zweier Feldinhalte (lokaleSumme)
		
		int[] feld = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
		int feldAnzahl = feld.length;
		int feldElement = 2;
		int summeZweitenFeldes = 0;
		int lokaleSumme;

		while ((feldElement) < feldAnzahl)
		{
			lokaleSumme = feld[feldElement] + feld[feldElement+2];
			summeZweitenFeldes+= lokaleSumme;
			feldElement += 4 ;
		}
		
		if (summeZweitenFeldes%2 == 0)
		{
			System.out.println("Das Resultat der Addition ist gerade.");
		}
		else
		{
			System.out.println("Das Resultat der Addition ist ungerade.");
		}
```

Das wäre dein erste Algorithmus, mal in Java implementiert (so ist er nicht richtig ).


----------



## stevoo (13. Nov 2011)

crackm hat gesagt.:


> Du nimmst ein Array packs da n generierte Zahlen Math.random() könnte da nützlich sein.
> Nimmst ein Schleife und gehst längedes Array /2 Scrhitte.
> in der Schlefe selbst multiplizierst du den index mit zwei und addiert 1 drauf.
> -> Index 0 -> 2*0+1 damit fängst du automatisch bei zweitem element an.
> ..



Lassen wir java doch bei Seite. Ich will nur wissen, ob dieser Pseudocode vom Sinn her richtig ist und nicht ob er jetzt bei java funktioniert. Hier gehts nur um den pseudocode. Wenn er falsch ist, will ich, dass ihn jemand richtig stellt und mir den Fehler zeigt. Wenn jetzt hier alle mit java implementieren kommen, von dem ich Momentan keine Ahnung habe, hilft mir das überhaupt nicht weiter.


----------



## stevoo (13. Nov 2011)

Entwerfen Sie einen Algorithmus, der jede zweite Zahl eines Feldes A(i) mit i=1,2,....,n addiert, beginnend mit dem zweiten Element und am Ende das Ergebnis der Addition überprüft. Sollte es sich beim Endresultat um eine grade Zahl handeln, so soll dies durch eine entsprechende Meldung festgehalten werden: "Das Resultat der Addition ist gerade." Handelt es sich jedoch um eine ungerade Zahl, so gibt die Meldung "Das Resultat der Addition ist ungerade" darüber Auskunft.

MEINE FRAGE: IST MEIN PSEUDOCODE RICHTIG?

n.....Feldanzahl
i......Feldelement
A(i).....Feldinhalt von i
a.....Summe der Addition jedes zweiten Feldinhaltes bis n

i=2
a=0

Solange i<n (HIER GEHT i<=n SO WIE BEI EINEM PAP NICHT, ODER?)
a=a+((A(i)+A(i+2))
i=i+4

Wenn Rest(a,2)==0
Ausgabe: "Das Resultat der Addition ist gerade."
sonst
Ausgabe: "Das Resultat der Addition ist ungerade."

IST ER JETZT RICHTIG?


----------



## njans (13. Nov 2011)

```
Solange i<n (HIER GEHT i<=n SO WIE BEI EINEM PAP NICHT, ODER?)
a=a+((A(i)+A(i+2))
i=i+4
```

Damit greifst du außerhalb deines Feldes zu. Du fängst nicht ab, dass i+2 in deinem Feld ist.
Ein kleiner Einsatz: Mit einer For-Schleife müsstest du dir da keine Sorgen machen


----------



## stevoo (13. Nov 2011)

njans hat gesagt.:


> ```
> Solange i<n (HIER GEHT i<=n SO WIE BEI EINEM PAP NICHT, ODER?)
> a=a+((A(i)+A(i+2))
> i=i+4
> ...



Sorry, aber bei deiner Aussage verstehe ich nur "Bahnhof" :-( Könntest du es so formulieren, dass ich es als Anfänger verstehe.

Aber ich versuche es trotzdem zu verstehen  
Meinst du ,dass das Feld i+2 ab einem gewissen Zeitpunkt nicht stimmt. Weil wenn ich meinen Code so durchführe, dann ist bei Schritt x das Feld i=16 und i+2 wäre 18 und falls n=17 wäre würde es nicht gehen(Auch wenn i immer noch < n ist). Das heißt ich müsste noch eine Bedinung hinzufügen. Sehe ich das richtig?


----------



## njans (13. Nov 2011)

Das siehst du richtig.


----------



## stevoo (13. Nov 2011)

njans hat gesagt.:


> Das siehst du richtig.



Wie wäre es wenn ich statt Solange i<n einfach solange i+2<==n schreibe???


----------



## njans (13. Nov 2011)

dann landest du immer noch über der Feldgrenze.
Lass es bei (i+2 < n) und dann passt es


----------



## stevoo (13. Nov 2011)

njans hat gesagt.:


> dann landest du immer noch über der Feldgrenze.
> Lass es bei (i+2 < n) und dann passt es



Danke, Danke du bist mein Held! Aber trotzdem verstehe ich nicht warum ich bei i+2<==n über die Feldgrenze laufe


----------



## stevoo (13. Nov 2011)

n.....Feldanzahl
i......Feldelement
A(i).....Feldinhalt von i
a.....Summe der Addition jedes zweiten Feldinhaltes bis n

i=2
a=0

Solange i+2<n (muss ich da nicht eher i+2<==n setzen?)
a=a+((A(i)+A(i+2))
i=i+4

Wenn Rest(a,2)==0
Ausgabe: "Das Resultat der Addition ist gerade."
sonst
Ausgabe: "Das Resultat der Addition ist ungerade."

Bei feld = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; würde i+2<n nicht gehen oder? 

1.Schritt A(2)+A(4)
2.Schritt A(6)+A(8)
3.Schritt A(10)+A(12)
4.Schritt A(14)+A(16) -->wenn aber n=16 und i+2(das in diesem Fall 16 wäre)<n ist , dann kann ich ja das letzte Feld eigentlich nicht dazu addieren(obwohl es drinnen ist und eigentlich addiert werden müsste, weil es zu der Reihe "jedes zweite Feld" dazugehört) außer ich setze i+2<==n oder?


----------



## stevoo (13. Nov 2011)

stimmt das was ich um 18:33 gepostet hab?


----------



## njans (13. Nov 2011)

1)Wieso fängst du mit i=2 an? 

2) Entweder fängt das Array mit index 0 oder 1 an (Pseudocode Sache).
Somit wäre das entweder (bei n=10)
A(0) + A(2)
A(4) + A(6)
A(8) + A(10) // tritt nicht mehr auf
oder
A(1) + A(3)
A(5) + A(7)
A(9) + A(11) // tritt auch nicht mehr auf

Dein Problem ist nämlich, dass du 2 Schritte in einem machen willst.
Deine while-Schleife macht da zu viel. Es wäre sinnvoller, wenn du einfach nur jeden zweiten Eintrag in deinem Feld addieren würdest, nicht auf einen Schlag zwei Stück.  Dann hast du die Probleme da oben nicht mehr


----------



## stevoo (13. Nov 2011)

njans hat gesagt.:


> 1)Wieso fängst du mit i=2 an?
> 
> 2) Entweder fängt das Array mit index 0 oder 1 an (Pseudocode Sache).
> Somit wäre das entweder (bei n=10)
> ...



Ich fange mit i=2 an weil es in der Angabe so steht: .."beginnend mit dem zweiten Element"..
..."Es wäre sinnvoller, wenn du einfach nur jeden zweiten Eintrag in deinem Feld addieren würdest, nicht auf einen Schlag zwei Stück.." WIE SCHREIBE ICH DAS AUF?? Ich habe zwei aufeinmal gemacht, weil ich es nicht anders wusste

..."A(8) + A(10) // tritt nicht mehr auf"... Wieso tritt das bei dir nicht mehr auf? Es übersteigt die Feldanzahl ja nicht.


----------



## Marcinek (13. Nov 2011)

```
a = a + A(i)
```

Wie wäre es, wenn du das in einer Programiersprache machen würdest? Oder dir mal das auf einem Blatt papier aufmalst, was der Algo macht? - Dann müsstest Du hier nicht alles nachfragen und hinterfragen.:rtfm:


----------



## njans (13. Nov 2011)

stevoo hat gesagt.:


> Ich fange mit i=2 an weil es in der Angabe so steht: .."beginnend mit dem zweiten Element"..
> ..."Es wäre sinnvoller, wenn du einfach nur jeden zweiten Eintrag in deinem Feld addieren würdest, nicht auf einen Schlag zwei Stück.." WIE SCHREIBE ICH DAS AUF?? Ich habe zwei aufeinmal gemacht, weil ich es nicht anders wusste
> 
> ..."A(8) + A(10) // tritt nicht mehr auf"... Wieso tritt das bei dir nicht mehr auf? Es übersteigt die Feldanzahl ja nicht.



Wenn du mit i=2 anfängst, dann muss dein Feld mit dem Index 1 starten! 

."A(8) + A(10) // tritt nicht mehr auf" weil du n = 10 hast und in dem Beispiel hatte ich gesagt, der index startet bei 0. Dann wären die 10 Elemente auf den Indizes 0,1,2,3,4,5,6,7,8,9. Wenn du auf index 10 zugreifst, ist das nicht vorhanden.  

Damit kriegst du jeden zweiten Wert

```
int summe
while (i <= anzahlFelder)   // Hier startet das Feld mit index 1, deswegen auch <=
{
  summe = summe + i
  i = i + 2 
}
```


----------



## stevoo (13. Nov 2011)

Marcinek hat gesagt.:


> ```
> a = a + A(i)
> ```
> 
> Wie wäre es, wenn du das in einer Programiersprache machen würdest? Oder dir mal das auf einem Blatt papier aufmalst, was der Algo macht? - Dann müsstest Du hier nicht alles nachfragen und hinterfragen.:rtfm:



Hab ihn auf einen Zettel aufgemalt, und sehe keinen Fehler.


----------



## stevoo (13. Nov 2011)

njans hat gesagt.:


> Wenn du mit i=2 anfängst, dann muss dein Feld mit dem Index 1 starten!
> 
> ."A(8) + A(10) // tritt nicht mehr auf" weil du n = 10 hast und in dem Beispiel hatte ich gesagt, der index startet bei 0. Dann wären die 10 Elemente auf den Indizes 0,1,2,3,4,5,6,7,8,9. Wenn du auf index 10 zugreifst, ist das nicht vorhanden.
> 
> ...




DAS iST DIE ANGABE
Entwerfen Sie einen Algorithmus, der jede zweite Zahl eines Feldes *A(i) mit i=1,2,....,n* addiert, *beginnend mit dem zweiten Element* und am Ende das Ergebnis der Addition überprüft. Sollte es sich beim Endresultat um eine grade Zahl handeln, so soll dies durch eine entsprechende Meldung festgehalten werden: "Das Resultat der Addition ist gerade." Handelt es sich jedoch um eine ungerade Zahl, so gibt die Meldung "Das Resultat der Addition ist ungerade" darüber Auskunft.

MEINE ANTWORT:
n.....Feldanzahl
i......Feldelement
A(i).....Feldinhalt von i
a.....Summe der Addition jedes zweiten Feldinhaltes bis n

i=2
a=0

Solange i+2<==n
a=a+((A(i)+A(i+2))
i=i+4

Wenn Rest(a,2)==0
Ausgabe: "Das Resultat der Addition ist gerade."
sonst
Ausgabe: "Das Resultat der Addition ist ungerade."

*Ich verstehe nicht warum das flasch ist??*


----------



## stevoo (13. Nov 2011)

Wir haben acht Feldelemente und beginnen mit dem zweiten
n=8
i=2 (Beginn: zweites Element)

1.(7)
2.(14)
3.(3)
4.(4)
5.(6)
6.(1)
7.(8)
8.(2)

Solange i+2<==n //n=8
a=a+(A(i)+A(i+2))
i=i+4

1. Schritt // i+2=4 also kleiner gleich n(was 8 ist)
1.1. Schritt a=0+14+4=18
i=2+4=6

2.Schritt // i+2=8 also gleich n
2.1. Schritt: a=18+1+2=21
i=6+4=10 //schon größer als n also gehts nicht weiter

Damit ist a=21 und das System müsste "Das Resultat der Addition ist ungerade." ausgebern


----------



## njans (13. Nov 2011)

Das geht auch, aber dann versuch das mal nicht mit n=8, sondern n=7 

Da machst du Schritt 1, 1.1 aber Schritt 2 geht dann nicht mehr, aber du hast Feld 6 (1) nicht berücksichtigt.

Edit: Das Problem bei deinem Vorgehen ist, dass du immer 2 Felder auf einmal addieren willst. Wenn nun aber das 2te Feld der beiden nicht mehr erreichbar ist, dann rechnest du das erste auch nicht mehr drauf.


----------



## Marcinek (13. Nov 2011)

Wenn das array aus 3 Felern besteht, dann erhälst du ein falsches Ergebnis


----------



## stevoo (13. Nov 2011)

njans hat gesagt.:


> Das geht auch, aber dann versuch das mal nicht mit n=8, sondern n=7
> 
> Da machst du Schritt 1, 1.1 aber Schritt 2 geht dann nicht mehr, aber du hast Feld 6 (1) nicht berücksichtigt.
> 
> Edit: Das Problem bei deinem Vorgehen ist, dass du immer 2 Felder auf einmal addieren willst. Wenn nun aber das 2te Feld der beiden nicht mehr erreichbar ist, dann rechnest du das erste auch nicht mehr drauf.



ok ich probiers aus

Die Zwickmühle für mich hier ist. wenn ich 7 Felder hab dann geht i+2<n aber i+2<==n geht nicht und wenn ich 8 Felder habe geht zwar i+2<==n aber i+2<n geht nicht :-( Und da stecke ich fest, weil ich keinen Plan habe welche Bedinung ich sons aufstellen kann.


----------



## stevoo (13. Nov 2011)

njans hat gesagt.:


> Das geht auch, aber dann versuch das mal nicht mit n=8, sondern n=7
> 
> Da machst du Schritt 1, 1.1 aber Schritt 2 geht dann nicht mehr, aber du hast Feld 6 (1) nicht berücksichtigt.
> 
> Edit: Das Problem bei deinem Vorgehen ist, dass du immer 2 Felder auf einmal addieren willst. Wenn nun aber das 2te Feld der beiden nicht mehr erreichbar ist, dann rechnest du das erste auch nicht mehr drauf.



Natürlich hast du Recht bezüglich meines Problems  Nur meinn Hauptproblem ist: Wie löse ich mein Problem?   Ich denke gerade nach.............


----------



## njans (13. Nov 2011)

Indem du eben nicht 2 Zahlen auf einmal addierst, sondern nur eine:

```
int i
while (i <= n)
// Natürlich muss hier noch eine Bedingung hin, dass er nur jedes 2te i zur Summe hinzufügt
summe = summe + A(i)
i = i + 2
```


----------



## stevoo (13. Nov 2011)

stevoo hat gesagt.:


> Natürlich hast du Recht bezüglich meines Problems  Nur meinn Hauptproblem ist: Wie löse ich mein Problem?   Ich denke gerade nach.............



Ich glaube ich habs!! Hoffen wir es


----------



## stevoo (13. Nov 2011)

njans hat gesagt.:


> Indem du eben nicht 2 Zahlen auf einmal addierst, sondern nur eine:
> 
> ```
> int i
> ...



GENAU DAS ist mir jetzt in den Sinn gekommen als ich nochmal mein PAP durchgegangen bin. Warum bin ich nicht früher darauf gekommen? Die Antwort war doch so simple. 

Solange i<==n
a=a+A(i)
i=i+2
usw.


----------



## njans (13. Nov 2011)

Du musst allerdings immer noch sicherstellen, dass du nur jeden 2ten Wert addierst.


----------



## stevoo (13. Nov 2011)

njans hat gesagt.:


> Du musst allerdings immer noch sicherstellen, dass du nur jeden 2ten Wert addierst.



das ist doch sichergestellt, das funktioniert bei z.B. 7 Feldern genauso wie bei 8 Feldern


----------



## stevoo (13. Nov 2011)

1.(7)
2.(14)
3.(3)
4.(4)
5.(6)
6.(1)
7.(8)
8.(2)

Solange i<==n //n=8
a=a+(A(i)
i=i+2

1. Schritt // i=2 also kleiner n(was 8 ist)
1.1. Schritt a=0+14=14
i=2+2=4

2.Schritt // i=4 also kleiner n
2.1. Schritt: a=14+4=18
i=4+2=6

3. Schritt i=6
3.1 Schritt a=18+1=19 
i=6+2=8 --> bei 7 Felder würde es hier aufhören und das Ergebnis wäre 19

4. Schritt i=8 //gleich n
4.1 a=19+2=21
i=8+2=10 //größer n


----------

