Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Exponenten (https://www.delphipraxis.net/122752-exponenten.html)

Moeke Zorn 21. Okt 2008 15:47


Exponenten
 
Guten Tag,
ich bin ein Delphi Anfänger und behandel es erst seit ein paar Wochen in der Schule..

meine Aufgabe lautet:

Auf einem Schachbrett wird auf das erste Feld ein Cent, auf das zweite Feld zwei Cent, auf das dritte Feld 3 Cent, auf das vierte Feld acht Cent usw gelegt.
Schriebe ein Projekt, das die Centbeträge auf den Feldern berechnet..

Wie es mathematisch funktioniert weiß ich, jetzt muss ich es noch aufschrieben.
Das Programm soll es in einer Listbox wieder geben. Mein Quelltext

procedure TForm1.Button1Click(Sender: TObject);
var n,i:integer ; zeile:string;
begin
for i:=1 to 64 do begin
for n:=power(2,0) to power (2,63) do begin
zeile:=inttostr (i)+' '+inttostr(n);
listbox1.items.add(zeile);
end;
end;

end;



Das Problem, die Syntaxprüfung spuckt jetzt immer aus:

[Fehler] Unit1.pas(31): Inkompatible Typen: 'Integer' und 'Extended'
[Fehler] Unit1.pas(31): Inkompatible Typen: 'Integer' und 'Extended'
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


kann mir jemand sagen, wo der Fehler liegt, und wie ich ihn behebe?

Danke!!!

3_of_8 21. Okt 2008 15:53

Re: Exponenten
 
Nimm statt "power" einfach "intpower". Power gibt eine Gleitkommazahl zurück, du willst aber eine ganze Zahl ausgeben. Am einfachsten erreicht du das in dem Fall, indem du einfach "intpower" aufrufst, welches einen Integer zurückgibt.

Wenn du allerdings bis 2^63 gehen willst, wird dir das nicht reichen - in dem Fall brauchst du wirklich einen Gleitkommatypen. Also einfach das "power" lassen und statt "inttostr" "floattostr" verwenden, oder gleich ein "format". (siehe Delphi-Hilfe)

Im übrigen gibt es für Delphi-Quellcode die [delphi]-Tags. Einfach
Delphi-Quellcode:
Code
schreiben, und schon wird das ganze richtig formatiert.

Dein Algorithmus ist übrigens relativ ineffizient, es wäre deutlich einfacher und schneller, einfach eine Variable zu nehmen, mit 1 zu initialisieren und sie dann in einer Schleife 63 mal auszugeben und zu verdoppeln.

Dbof 21. Okt 2008 16:00

Re: Exponenten
 
benutz floatToStr anstatt IntToStr ....

#edit: oh, da war jemand schneller...

leddl 21. Okt 2008 16:03

Re: Exponenten
 
Zitat:

Zitat von 3_of_8
Dein Algorithmus ist übrigens relativ ineffizient, es wäre deutlich einfacher und schneller, einfach eine Variable zu nehmen, mit 1 zu initialisieren und sie dann in einer Schleife 63 mal auszugeben und zu verdoppeln.

:gruebel: Ähm, der ist nicht nur ineffizient, der ist auch noch Unfug :stupid: Wozu braucht es denn die zweite Schleife? In i steckt schließlich der Exponent, aus dem der jeweilige Centbetrag berechnet werden kann. Da braucht man keine innere Schleife :zwinker:

nahpets 21. Okt 2008 16:05

Re: Exponenten
 
Hallo,

versuche es mal so:
Delphi-Quellcode:
  i := 1;
  repeat
    zeile := inttostr(i) + ' ' + Format('%64.0n',[power(2,i)]);
    listbox1.items.add(zeile);
    inc(i);
  until i > 64;
Power ist kein Integer und kann daher nicht in einer For-Schleife benutzt werden.

Fussball-Robby 21. Okt 2008 16:12

Re: Exponenten
 
Zitat:

Zitat von 3_of_8
Am einfachsten erreicht du das in dem Fall, indem du einfach "intpower" aufrufst, welches einen Integer zurückgibt.

Aus der Math.pas:
Zitat:

function IntPower(const Base: Extended; const Exponent: Integer): Extended;
IntPower gibt also keinen Integer zurück. Darüber habe ich mich auch schon öfters gewundert :gruebel:

3_of_8 21. Okt 2008 16:34

Re: Exponenten
 
Nicht? Oha. Ist aber auch völlig klar: Die Basis ist nicht unbedingt ganzzahlig, daher muss das Ergebnis auch nicht unbedingt ganzzahlig sein.

Moeke Zorn 21. Okt 2008 17:00

Re: Exponenten
 
Hallo nochmal, erstmal viele Dank, für eine schnelle Antwort, ich glaube jedoch, euch unterliegt ein Denkfehler, nicht was die Programmierung angeht, sondern das mathematische...

Denn

Feld 1: 1 Cent = 2^0
Feld 2: 2 Cent = 2^1
Feld 3: 4 Cent = 2^2
Feld 4: 8 Cent = 2^3


Wenn ich i (sihe Quelltext) als Exponenten nehme, erhalte ich später in der Listbox nur die Quadratzahl, und nicht das, was ich euch oben aufgeführt habe.

procedure TForm1.Button1Click(Sender: TObject);
var n,i:integer ; zeile:string;
begin
for i:=1 to 64 do begin
n:=2;
zeile:=inttostr (i)+' '+inttostr(i*i);
listbox1.Items.Add(zeile);
end;


end;

end.

Oder war da wieder ein Missverständnis meiner Seits? ich brauch ja schließlich die Rechnung 1^x...also Exponentionell

Wenn ich für meinen Grundqquelltext von oben statt InttoStr floattostr nehme, muss ich bei der variablenbestimmung doch auch n als extended nehmen, wobei mir mein Delphi dann wieder sagt, dass für die FOR-Schleifen eine Variable von ordinalem Typ gebraucht wird, ich weiß nichtmal, was diese ordinale Typen seien sollen...

Desweiteres:
Wie gesagt, ich habe erst seit Anfang des Schuljahres mit Delphi zu tun, und bin ehrlich gesagt noch nicht soweit. Es müsste eine einfachere Lösung geben, da wir heute erst mit den FOR-Schleifen angefangen haben, und ich soll, selbst wenn ich eure Gedanken nachvollziehen könnte, es dem Kurs präsentieren, die es glaube ich nicht nachvollziehen könnten...

Bitte um weitere Hilfe!!!

DANKE!!

3_of_8 21. Okt 2008 17:08

Re: Exponenten
 
Bitte benutze doch die delphi-Tags und rücke das ganze ein bisschen ein, dann ist es deutlich leichter zu lesen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
    n: Double;
begin
  n:=1;
  for i:=1 to 64 do begin
    listbox1.Items.Add(inttostr(i)+' '+floattostr(n));
    n:=n*2;
  end;
end;
So würde ich das machen. n muss hier ein Double sein (oder ein Single oder ein Extended), weil Integer nicht ausreiche - der geht nur bis 2^31-1 (bzw. Cardinal bis 2^32-1), du brauchst es aber bis 2^63, ich glaube das schafft nichtmal ein Int64 (der geht glaube ich nur bis 2^63-1).

Was passiert jetzt da genau? Du fängst bei n=1 an und dann machst du 64 mal folgendes: Du gibst n aus und verdoppelst es dann. n ist daher im i. Durchlauf 2^(i-1). Passt. ;)

Moeke Zorn 21. Okt 2008 17:20

Re: Exponenten
 
Problem:

Nach der obrigen Lösung, bekomme ich bei Feld 1 2 Cent, cih will aber nur 1 Cent^^

ich brauch am schluss 2^i, dass halt logischerweise am passedem I steht, am ende soll in der Listbox da stehen:

1 1
2 2
3 4
4 8
.
.
.

Also die Exponenten (Hochzahlen) müssen bei 0 anfangen..


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:28 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz