Entwickler-Ecke
Sonstiges (Delphi) - Die Summe der ersten n ungeraden Zahlen berechnen..
newbie333 - So 21.06.09 16:16
Titel: Die Summe der ersten n ungeraden Zahlen berechnen..
Und gleich das nächste Anfängerproblem!
Wir sollen ein Programm schreiben, welches die Summe der ersten n ungeraden Zahlen berechnen kann.
Also zum Beispiel:
man gibt 5 ins Editfeld ein, dann soll berechnet werden: 5+5+5+5+5 also 5x5.
=> wenn man n eingibt, soll n*n berechnet werden, oder?
deshalb hab ich mir folgendes gedacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button1Click(Sender: TObject); var n, summe, Ergebnis: integer; begin n:=strtoint(edit1.text); while n <> 0 do begin summe:=n*n; n:=n-1; end; label1.caption:=inttostr(ergebnis); end; end. |
funktioniert aber nicht.. :(
Wäre nett, wenn mir jemand helfen könnte.
newbie333 - So 21.06.09 16:18
ups, ergebnis brauch ich in dem Fall als Variable gar nicht.. und am Ende dann in die Klammer (summe)..
funktioniert aber auch nicht.
michaaaaa - So 21.06.09 16:20
du solltest dein programm hier mal hochladen ( auch das fehlerhafte programm)
Marc. - So 21.06.09 16:22
newbie333 hat folgendes geschrieben : |
Wir sollen ein Programm schreiben, welches die Summe der ersten n ungeraden Zahlen berechnen kann. |
Für mich klingt das mehr nach: (5) --> 3 + 5 + 7 + 9 + 11 = ...
Bist du dir sicher, dass dein Beispiel passt? :nixweiss:
michaaaaa - So 21.06.09 16:25
das debk ich auch fast...
außerdem steht in der aufgabe was von Summe...
und das ergebnis der multiplikation ist keine Summe...
newbie333 - So 21.06.09 16:25
Oh.. ja, stimmt. @ Marc.
Also brauch ich noch ne if-Anweisung? Und wie mach ich das dann, dass Delphi zwischen geraden und ungeraden Zahlen unterscheidet?
Marc. - So 21.06.09 16:28
newbie333 hat folgendes geschrieben : |
Und wie mach ich das dann, dass Delphi zwischen geraden und ungeraden Zahlen unterscheidet? |
mod gibt dir den Rest einer Division zurück. Damit solltest du weiterkommen. ;)
bole - So 21.06.09 16:31
Du nimmst wieder die MOD funktion wie in deinem letzten Programm (teiler)
Delphi-Quelltext
1:
| if Zahl mod 2 <> 0 then |
So trifft die Bedingung nur zu wenn die Zahl ungerade ist
newbie333 - So 21.06.09 16:31
geht das nicht auch so irgendwie?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var n, summe, Ergebnis: integer; begin n:=strtoint(edit1.text); summe := 1; while n <> 0 do begin ergebnis:=summe+n; summe:=summe+2; n:= n-1; end; label1.caption:=inttostr(ergebnis);
end; end. |
bzw. was ist daran falsch?
newbie333 - So 21.06.09 16:33
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Button1Click(Sender: TObject); var n, summe, Ergebnis: integer; begin n:=strtoint(edit1.text); summe := 1; if n mod 2 <> 0 then begin while n <> 0 do begin ergebnis:=summe+n; summe:=summe+2; n:= n-1; end; end; label1.caption:=inttostr(ergebnis);
end; end. |
das ändert auch nichts am Ergebnis :(
Marc. - So 21.06.09 16:47
Es gibt auch einen Editier-Button. :D
Zu deinem Code: Du überprüfst nur einmal zu Beginn auf gerade/ungerade. Überdenk noch einmal dein Konzept. ;)
newbie333 - So 21.06.09 16:53
Dann muss ich doch normal noch programmieren,
was es tun soll, wenn die Zahl gerade ist, oder?
Ich bin verwirrt! :nixweiss:
bole - So 21.06.09 16:57
Hoi Newbie
Ich denke bevor Du etwas Codierst solltest Du dein Programmfluss mal in einem Diagram aufzeichnen... Ich denke da würde Dir einiges klar!
Als ich programmieren lernte mussten wir für jedes Programm zuerst ein Nassi Schneiderman Diagram zeichnen.
http://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm
Das war zwar mühsam, aber schlussendlich ist man so schneller als deine Try and Error Variante.... und Gelernt hat man auch noch was!
Gruss
Bole
newbie333 - So 21.06.09 17:02
Ja, sowas ähnliches haben wir auch schon gemacht :)
Aber irgendwie hab ich dieses mal keine Ahnung wie ich das machen sollte, bzw. was für Variablen ich brauch etc..
DaS Programm soll, wenn der mögliche summand ungerade ist, diesen mit dem nächsten addieren, aber wie programmier ich das?
Marc. - So 21.06.09 17:07
Du willst jede zweite beziehungsweise, in diesem Fall, ungerade Zahl zur Gesamtsumme addieren.
Also lautet es schon einmal wie folgt: if Zahl mod 2 <> 0 then
Da nur die ersten n ungeraden Zahlen addiert werden sollen, musst du diesen Schritt solange wiederholen bis Zahl = n * 2 + 1. ;)
I.e. bei 5 wäre die höchste ungerade Zahl die 11, bei 6 13 usw...
Das gilt es jetzt umzusetzen. :)
newbie333 - So 21.06.09 17:10
muss es nicht if Zahl mod 2 <> 0 then heißen?
Ich versuchs mal, danke :)
ich versteh jetzt irgendwie nicht mehr genau was n, zahl, summe usw. ist :nixweiss:
Marc. - So 21.06.09 17:12
newbie333 hat folgendes geschrieben : |
muss es nicht if Zahl mod 2 <> 0 then heißen?
Ich versuchs mal, danke :) |
Korrekt, hab es bereits berichtigt. Na dann, viel Erfolg. ;)
Edit: Die If-Abfrage kannst dir im Grunde auch komplett sparen, es reicht ja, die Zahl in jedem Schritt, um 2 zu erhöhen. :zwinker: :roll:
bole - So 21.06.09 17:14
Wenn Du in deinem alten Programm (Teiler) die If Bedingung durch folgende ersetzt schreibt das Programm in das memo all ungeraden Zahlen... Das Summieren sollte nicht wirklich ein Problem darstellen!
Delphi-Quelltext
1:
| if teiler mod 2 <> 0 then |
Bitte nicht zuerst rausschreiben und am Schluss die zahlen im memo summieren! Sofort in der Schleife beim schreiben ins memo gleich aufsummieren!
Gruss
Bole
newbie333 - So 21.06.09 17:14
Das hatte ich eben doch, oder? :shock:
und wie siehts damit aus?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button1Click(Sender: TObject); var n, summe, Ergebnis: integer; begin n:=strtoint(edit1.text); summe:=1; while summe <> n*2+1 do ergebnis:=summe+n; summe:=summe+2; end; label1.caption:=inttostr(ergebnis);
end. |
Edit: Achja, ich weiß, dass da immer die Quadratzahl der eingegeben Zahl rauskommen soll.
und das wäre ja bei n*2+1 nicht der Fall..
also wenn man 5 eingibt, soll 1+3+5+7+9=25 berechnet werden!
bole - So 21.06.09 17:48
Das ist ja wieder was anderes....
Ich denke Du solltest Dir erst im klaren sein was Du von deinem Programm erwartest!
Nur wenn man das Problem verstanden hat kann man es auch programmieren...
newbie333 - So 21.06.09 17:57
Ich denke schon, dass ich das Problem verstanden habe:
Wenn zum Beispiel 4 ins Editfeld eingegeben wird, soll das Programm die ersten 4 ungeraden Zahlen miteinander addieren, sprich: 1+3+5+7=16 und dieses Ergebnis dann in einem Label ausgeben.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button1Click(Sender: TObject); var n, Summe, Ergebnis: integer; begin n:=strtoint(Edit1.text); Summe:=1; while n <> 0 do begin Ergebnis:=Summe+n; Summe:=Summe+2; end;
end. |
BenBE - So 21.06.09 18:03
Darf ich hier mal kurz nen Einzeiler einwerfen?
Die Herleitung überlass ich dem Threadersteller. Tipp: Gibt eine geschlossene Form aus der man das herleiten kann ;-)
newbie333 - So 21.06.09 18:08
dass das Ergebnis n*n ist weiß ich ja, aber wie ichs als Summe in Delphi berechne leider nicht und so sollen wirs machen.. :?
bole - So 21.06.09 18:12
n darfst Du nich zur Summe addieren, den n dient lediglich als Schleifenzähler. Dafür musst du in der Schleife bei jedem Durchgang n um 1 reduzieren.
So wie Du es programmiert hast ergibt das eine Endlosschleife weil n nirgens verändert wird, da wird die Schleifenbedingung auch nie false.
Yogu - So 21.06.09 18:15
Also, klären wir erstmal die Variablen.
n gibt die Anzahl der Schleifendurchläufe an
Zahl enthält die momentane (ungerade) Zahl
Summe enthält die Summe aller bisher addierten Zahlen
Dann die Startwerte:
n wird vom Benutzer eingegeben
Zahl ist im ersten Schleifendurchlauf 1
Summe ist am Anfang 0
Dann, was passiert:
n dekrementieren wir jedes Mal
Zahl inkrementieren wir jedes Mal um 2 (dadurch entstehen nur ungerade Zahlen)
zur
Summe addieren wir in jedem Schleifenduchlauf
Zahl
Mach daraus einfach mal einen Code.
Ergebnis ist vollkommen unnötig.
Du kannst den ersten Block zu Variablendeklarationen umformen (
var), dann nach dem
begin den Variablen ihre Werte zuweisen, und schließlich eine
while-Schleife bauen:
Und im
-Block schreibst du die letzte Liste. Fertig :D
newbie333 - So 21.06.09 18:16
und mit was muss ich dann addieren? :oops:
BenBE - So 21.06.09 18:22
Also mal ohne Schleifen :P
Delphi-Quelltext
1: 2: 3: 4: 5:
| Function FirstNOddSum(N: Integer): Integer; Begin Result := Iif(N = 0, 0, 2*N-1); If N > 0 Then Inc(Result, FirstNOddSum(N-1)); end; |
newbie333 - So 21.06.09 18:24
Wow, doch so einfach 8)
Habs jetzt sogar verstanden, vielen Dank! :)
Noch eine Frage:
Was kann man statt Zahl := Zahl +2; noch schreiben? inc(Zahl) und wo muss dann die zwei hin oder geht das hier nicht? :)
Danke!
newbie333 - So 21.06.09 18:25
BenBE hat folgendes geschrieben : |
Also mal ohne Schleifen :P
Delphi-Quelltext 1: 2: 3: 4: 5:
| Function FirstNOddSum(N: Integer): Integer; Begin Result := Iif(N = 0, 0, 2*N-1); If N > 0 Then Inc(Result, FirstNOddSum(N-1)); end; | |
Das versteh ich nun leider garnicht ;) Wie gesagt, bin Anfänger und wir lernen das in der Schule.. aber danke trotzdem :)
jakobwenzel - So 21.06.09 18:26
BenBE - So 21.06.09 18:31
Naja, um Rekursion zu verstehen muss man zuerst Rekursion verstehen, solange, bis man anfängt, Rekursion zu verstehen ;-)
Der Source ist komplett Rekursiv geschrieben und benutzt die Funktion IIf zu der es mehr Informationen in der Hilfe gibt. Da leider zuerst alle Argumente ausgewertet werden, statt wie bei anderen Sprachen nur benötigte Code-Stellen lässt sich das nicht wie in C, C#, Java und PHP auf eine Zeile kürzen:
C#-Quelltext
1: 2: 3:
| long FirstNOddSum(long N) { return N ? 0 : 2*N-1 + FirstNOddSum(N-1); } |
newbie333 - So 21.06.09 18:34
Okaaaaay, dankeschön ;)
hab das nächste sogar alleine hinbekommen:
Man soll das Produkt der ersten n Zahlen berechnen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button1Click(Sender: TObject); var n, zahl,produkt:integer; begin n:=strtoint(edit1.text); produkt:=1; zahl:=1;
while n>0 do begin produkt:= produkt*zahl; n:=n-1; zahl:=zahl+1; end; label1.caption:=inttostr(produkt); end; end. |
Vielen Dank ;)
jfheins - So 21.06.09 18:34
Man könnte es auch so schreiben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Function FirstNOddSum(N: Integer): Integer; Begin if N = 0 then Result := 0; else Result := 2*N-1 + FirstNOddSum(N-1); end; |
Der Code nutzt folgendes: Die n-te ungerade Zahl errechnet sich durch 2*n-1 (also die 7. ungerade Zahl ist 2*7-1 = 13)
Und die Summe der ersten N ungeraden Zahlen ist daher die Summe aus der N-ten ungeraden Zahl plus die Summe aus den ersten (n-1) ungeraden Zahlen.
Also die Summe der ersten 7 ungeraden Zahlen ist die Summe der 7. ungeraden Zahl (13) plus die Summe der ersten 6 ungeraden Zahlen (also 1+3+5+7+9+11)
Das ganze ist dann eine Funktion, die sich selbst wieder aufruft - nennt sich Rekursion ;)
Oder natürlich so:
Delphi-Quelltext
1: 2: 3: 4:
| Function FirstNOddSum(N: Integer): Integer; Begin Result := n * n; end; |
Wenn man das ganze vereinfacht :mrgreen:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!