Autor Beitrag
newbie333 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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.

ausblenden 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; // hier hab ich keine Ahnung was ich addieren muss..
 Summe:=Summe+2// damit wieder eine ungerade Zahl addiert werden kann.
end;

end.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 21.06.09 18:03 
Darf ich hier mal kurz nen Einzeiler einwerfen?

ausblenden Delphi-Quelltext
1:
Result := N * N;					


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107
Erhaltene Danke: 15

win 10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
while n > 0 do
  {...}

Und im {...}-Block schreibst du die letzte Liste. Fertig :D
newbie333 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: So 21.06.09 18:16 
und mit was muss ich dann addieren? :oops:
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 21.06.09 18:22 
Also mal ohne Schleifen :P

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Function FirstNOddSum(N: Integer): Integer;
Begin
    Result := Iif(N = 002*N-1);
    If N > 0 Then Inc(Result, FirstNOddSum(N-1));
end;

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: So 21.06.09 18:25 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Also mal ohne Schleifen :P

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Function FirstNOddSum(N: Integer): Integer;
Begin
    Result := Iif(N = 002*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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: So 21.06.09 18:26 
ausblenden Quelltext
1:
Inc(zahl,2)					

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: So 21.06.09 18:34 
Man könnte es auch so schreiben:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Function FirstNOddSum(N: Integer): Integer;
Begin
   Result := n * n;
end;
Wenn man das ganze vereinfacht :mrgreen: