Delphi-PRAXiS

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

3_of_8 21. Okt 2008 18:33

Re: Exponenten
 
Tut es auch.

jfheins 21. Okt 2008 18:35

Re: Exponenten
 
Ich glaube er meint miit obiger Lösung die von nahpets #5. Die fängt nämlich bei 2^1 = 2 an.

Manuels (#11) sollte das gewünschte (#10)
Zitat:

1 1
2 2
3 4
4 8
ausgeben ;)

Moeke Zorn 21. Okt 2008 20:06

Re: Exponenten
 
ich habs endlich...danke nochmals^^

guidok 22. Okt 2008 11:51

Re: Exponenten
 
Zitat:

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.
Ich versteh hier schon das System nicht.

Feld 1 = 1 Cent
Feld 2 = 2 Cent
Feld 3 = 3 Cent (hier bin ich noch dabei)
Feld 4 = 8 Cent (hier nicht mehr)

Die grundsätzliche Frage lautet also erst mal:

Liegt auf jedem Feld ein Cent mehr als auf dem vorherigen Feld oder liegt auf jedem Feld das doppelte des vorherigen Feldes?

Volle 22. Okt 2008 12:04

Re: Exponenten
 
ganzen thread lesen :P, das war ein tippfehler.
die felder sind 2^i. also wie er es in beitrag 10 geschrieben hatte.

schöni 22. Okt 2008 13:25

Re: Exponenten
 
Hallo,

Wenn auf dem ersten Feld 1 Cent, auf dem zweiten 2 Cent auf dem dritten 3 Cent liegensollen, brauchst Du gar keine Exponenten. Die sind nur erforderlich, wenn Du Dich verschrieben hast und in Wirklichkeit
auf jedem nachfolgenden Feld die doppelte Anzahl Cent verglichen mit dem vorhergehenden Feld liegen sollen.

duck42 24. Okt 2008 16:47

Re: Exponenten
 
hallo leute,
hab ein problem mit dem potenzieren.
ich habe einen zahlenwandler gebastelt, der zwischen hexadezimal-, binär- und dezimalzahlen umwandeln kann.
beim unmwandeln von binär- in dezimalzahlen verwende ich den algorithmus

Delphi-Quellcode:
procedure bin_dez(i dez:integer);
var zahl:string;
  begin
  dez:=0;
  zahl:=form1.edit1.text;

  for i:=8 downto 1 do
    begin
    dez:=dez+strtoint(zahl[i])*power(2,i-1);
end;
hierbei kommt bei mir die fehlermeldung [Error] bin_hex.pas(90): Undeclared identifier: 'power'
offensichtlich hat hier jmd ein problem mit der funktion power...
kann mir jmd sagen, was ich falsch gemacht habe?

nahpets 24. Okt 2008 16:52

Re: Exponenten
 
Power ist in der Unit math, hast Du die eingebunden?

duck42 24. Okt 2008 16:57

Re: Exponenten
 
ich habe math bei den uses eingebunden...is das korrekt?

nahpets 24. Okt 2008 17:12

Re: Exponenten
 
Zitat:

Zitat von duck42
ich habe math bei den uses eingebunden...is das korrekt?

Jo, wenn der Compiler jetzt nicht mehr meckert, sollte es funktionieren.

duck42 24. Okt 2008 17:15

Re: Exponenten
 
ne, meckert immer noch. selbe fehlermeldung wie vorher...
irgendwelche anderen möglcihen fehlerquellen?

duck42 24. Okt 2008 17:16

Re: Exponenten
 
ne, meckert immer noch. selbe fehlermeldung wie vorher...
irgendwelche anderen möglcihen fehlerquellen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 Uhr.

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