Autor |
Beitrag |
newbie333 
      
Beiträge: 43
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 21.06.09 18:03
Darf ich hier mal kurz nen Einzeiler einwerfen?
Delphi-Quelltext
Die Herleitung überlass ich dem Threadersteller. Tipp: Gibt eine geschlossene Form aus der man das herleiten kann 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: 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
      
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: 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.
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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:
Delphi-Quelltext
Und im -Block schreibst du die letzte Liste. Fertig 
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: So 21.06.09 18:16
und mit was muss ich dann addieren? 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 21.06.09 18:22
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: So 21.06.09 18:24
Wow, doch so einfach
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 
      
Beiträge: 43
|
Verfasst: So 21.06.09 18:25
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: So 21.06.09 18:26
Quelltext
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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); } |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
newbie333 
      
Beiträge: 43
|
Verfasst: 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
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: 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 
|
|
|