Autor Beitrag
Lena89
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.03.06 18:17 
Sorry erstmal, ich habmich hier nich zurechtgefunden mit den vielen Unterbereichen, da hab ichs einfach hier rein..

Also, ich soll für die Schule einen Taschenrechner programmieren. das meiste hab ich mitlerweile hinbekommen, aber a hoch b funktioniert einfach nicht.
den befehl Power (hieß er so?) dürfen wir nicht benutzen..

so sieht das ganze jetzt aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Bt_ahochbClick(Sender: TObject);
var i: real;
begin
a:= StrToFloat(edit_a.Text);
b:= StrToFloat(edit_b.Text);

If a > 0 then
 begin
  c := exp(b* ln(a) );
  Edit_c.Text := FloatToStr(c);
 end;

If a <= 0 then
 begin
 i := 0;
 While i <= b do
  begin
   c := a*a;
   i := i + 1;
  end;
  Edit_c.Text := FloatToStr(c);
  end;




für positive a funktioniert es, aber bei den negativen kommt müll raus :(
hatte auch schon eine for schleife probiert, aber da kam immer, dass die variablen nicht zusammen passen oder so..
Könnt ihr mir bitte helfen? :(

lena

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Mi 08.03.06 18:25 
Es gitb auch noch in Delphi die Power Funktion!
Musst du nur noch die Unit Math einbinden.

Alles weiter steht in der Delphi Hilfe...

Aber das , wenn du a^b hast, kannste, wie du schon richtig gesagt hast, schreiben:
e^ln(a^b) = e^(b*ln(a)) => folgt nach dem Logarithmengestez.

gilt, wie du richti sagtset, nur für a>0, da ln(a) nur für a>0 definiert ist....

Aber füg doch dann einfach die Unit Math ein und dann Power;)

PS: Sry, hatte mal wieder was überlesen, ich mach mir ma kurz gedanken darüber, wie man das löst ;)

Theoretisch kannste dann ja sagen:
Wenn du was negatives hast, meintwegen (-3)^3, dann weist du: da wird -27 rauskommen....
Dann kannst du dort einfach den Betrag nehmen, und dann nmusst du gucken, ob b gerade oder ungerade ist, da gabs auch en Funktion für...oder prüf das einfach mit b mod 2 =0
Und wenn b ungerade, dann musste danach noch ein - zeichen davor setzten
ansonsten wenn b gerade, dann einfach mti dem beetrag rechen=)


Zuletzt bearbeitet von Kroni am Mi 08.03.06 18:28, insgesamt 1-mal bearbeitet
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.03.06 18:26 
Power darf ich von der Lehrerin aus aber nicht benutzen!

Ich möchte aber auch negative a potenzieren. Mein normaler Taschenrechner kann das ja auch. :(


mod kann ich noch nich.. :oops: :oops:
Was ist denn an meinem Text falsch? Kannst du mir das vielleicht mal mit der for-schleife aufschreiben?
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Mi 08.03.06 18:33 
Pass auf:
der Operator MOD gibt dir den Rest der Gnazzahligen Divison:
Zb 7 mod 3 = 1 , da 3*2 6 ergibt, und als rest 1 bleibt.

D.h. wenn eine Zahl Gerade ist, ist sie durch Zwei Teilbar.
D.h. bei einer ganzzahligen Divison muss als rest 0 rauskommen, ansonsetn ist sie ungerade.

Abs(x) gibt dir den Betrag aus.....

Und mit For Schleife ist das ganz doch viel zu kompliziert....da haste dann zwei drei Abfragen drin und fertig is=)
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.03.06 18:36 
wenn ich das so abgebe, weiß die genau, dass ichs nich selbst gemacht hab.

Was ist denn ein ordinaler Typ?? :(
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 08.03.06 18:51 
so würde ich es machen, mit deinem delphi wissen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function newpower(zahl, exponent: integer): integer;
var
  i: integer;
begin
  result := zahl;
  for i := 1 to exponent do
    result := result * zahl;
end;

ist aber ungetestet
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Mi 08.03.06 19:00 
Jops, das habe ich ihr auch gerade gesagt^^
Aber jo, mit Ihrem wissen, wie ich ihr grad schon gesagt habe, ist das wohl nur mit ganzen Zahlen möglich =)
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.03.06 19:09 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
so würde ich es machen, mit deinem delphi wissen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function newpower(zahl, exponent: integer): integer;
var
  i: integer;
begin
  result := zahl;
  for i := 1 to exponent do
    result := result * zahl;
end;

ist aber ungetestet


Ich brauche aber Dezimalzahlen... :(
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 08.03.06 19:11 
nimm statt integer einfach double, sollte afaik auch gehen

der exponent darf kein double sein, aber sowas gibts doch garnet oder ?
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.03.06 19:16 
Was ist denn double? :(
blaueled
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 133

Win XP
D5
BeitragVerfasst: Mi 08.03.06 19:19 
Hallo,

guck in der unit math nach, da steht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function Power(Base, Exponent: Extended): Extended;
begin
  if Exponent = 0.0 then
    Result := 1.0               { n**0 = 1 }
  else if (Base = 0.0and (Exponent > 0.0then
    Result := 0.0               { 0**n = 0, n > 0 }
  else if (Frac(Exponent) = 0.0and (Abs(Exponent) <= MaxInt) then
    Result := IntPower(Base, Integer(Trunc(Exponent)))
  else
    Result := Exp(Exponent * Ln(Base))
end;


Es wird kein Power verwendet ...

edit: double ist ein Fließkommawert mit doppelter genauigkeit.

Arne
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 08.03.06 19:23 
dann sollte das hier gehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function newpower(zahl, exponent: double): double;  //float geht auch
var
  i: integer;
begin
  result := zahl;
  for i := 1 to round(exponent) do
    result := result * zahl;
end;

oder man gibt exponent direkt als integer an
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Mi 08.03.06 20:25 
Au weh!!! Wenn man kein Integer als Exponenten angibt dann einfach runden? Da hätte niemand Flugzeuge in das World Trade Center fleigen müssen damit die einstürzen.

@ Blaueled: In der Power Funktion wird kein Power verwendet??? Dass bedeutet zunächst nur dass sie nicht rekursiv ist. Es wird aber EXP aufgerufen, welche genau wie Power eine Exponentialfunktion nur zur Basis e ist. Den Power Quelltext zu nehmen ihn in den eigenen Code einsetzen also manuell inlinen und dann sagen wes wird kein Power aufgerufen entgeht dem Lehrer vielleicht ist aber sicher nicht Sinn der Sache.

Zurück zum Problem:

Für ganze Zahlen als Exponenten geht das Problemlos auszurechnen (Zur Not einfach mit nem if schauen ob der Exponent kleiner oder größer Null ist). Einziger mir bekannter Weg ist: Du benutzt die Taylorreihen. Diese enthalten nur Ganzzahlige Potenzen.

Anm.: Besitzt eine Funktion hinreichend (unendlich) Ableitungen lässt sie sich in eine Taylorreihe entwickeln (Taylor Reihenentwicklung in jedem besseren Nachschlagewerk). Bzw. hat die Funktion nicht unendlich viele Ableitungen kann man damit meist noch hervorragend nähern. Physiker brechen immer nach dem ersten Glied ab (schmunzel).
Grundsätzlich könntest du versuchen die eingegebene Funktion zu entwickeln. Dies ist allerdings überkompiniert. Besser ist es die Taylorreihe für EXP und LN zu programmieren (Diese baust du dir nach Formelsammlung selbst oder du findest sie im Internet da sie selbst so wichtig sind). Anschließend hast du ohne die Funktion Power (obwohl du sie in gewisser Weise imitierst ) die Potenz ausgerechnet.

Anm2. Double ist ein Fließkomma Datentyp, der 64 Bit lang ist und in einer bestimmten Weise kodiert ist (siehe IEEE754) Es gibt auch noch Singel und Extended.

Anm3. Die Funktion EXP gibt es auch in der System.pas dort ist sie allerdings auf dem Mathematischen Coprozessor implementiert, der in diesen Bereichen um einiges schneller ist. (Es ist dann aber eher Hardwareseitig als Softwareseitig implementiert, was also wieder am Unterrichtsstoff vorbeigehen würde solltest du diese Funktion benutzen).
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.03.06 20:58 
@Allesquarks

Danke, jetzt hast du dir ja echt viel Mühe gegeben, aber es hilft mir gar nicht.. :(
Die Lehrerein meinte, das müsste mit ner ganz normalen Schleife (ich kenne Repeat, while und die for-schleife) gehen, und wenn ich da jetzt Sachen, wie Taylorreihen Double benutze, wird die mich super blöd angucken..

Mitlerweile sieht das ganze so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Bt_ahochbClick(Sender: TObject);
var i : integer;
    b : integer;
begin
a:= StrToInt(edit_a.Text);
b:= StrToInt(edit_b.Text);

If a > 0 then
 begin
  c := exp(b* ln(a) );
  Edit_c.Text := IntToStr(c);
 end;
If a <= 0 then
begin
  c:=a;
for i:=1 to b-1 do
 c:=c*a;

  end;
  Edit_c.Text := FloatToStr(c);
end;


Und es kommt ein Haufen Fehlermeldungen :crying:

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Mi 08.03.06 21:06 
Ich würde mir der Einfachheit halber die Regeln für die Potenzierung vor Augen führen (gehe mal davon aus, daß die Lehrerin EXP und LN zuläßt):

1) Sonderfälle aussortieren: x^0=1, 0^y=0
2) Bei positivem Argument x sind alle Exponenten (neg. und gebrochene Dezimalzahlen) zulässig
3) Bei negativem x sind nur ganzzahlige Exponenten möglich. Hier merkt man sich das Vorzeichen, verwendet Erg = exp(y*ln(ABS(x))) und setzt dann das Vorzeichen des Ergebnisses abhängig davon, ob der Exponent gerad- oder ungeradzahlig ("odd") ist.

Falls bei 3) ein gebrochener Exponent eingegeben wird, sollte eine Fehlermeldung erfolgen.
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.03.06 21:10 
Hört sich gut an.. aber wie merkt man sich ein vorzeichen? und was ist ABS?
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Mi 08.03.06 21:18 
Noch aus meinen Schul Turbo-Pascal-Zeiten. Der STil ist auch sehr schlecht zumindest für Delphi:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
function ehoch(Wert:real):real;
var  check,n,glied,eh:real;
     switch:boolean;

begin
n:=0;  eh:=1;   glied:=1;
switch:=false;
if Wert<0 then begin
Wert:=Wert*(-1);
switch:=true;
end;

repeat                      //hier beginnt die Taylorreihe
n:=n+1;
glied:=glied*Wert/n;
check:=eh;
eh:=eh+glied;
until (abs (check-eh)<0.000000000001);               //hier endet sie

if switch=true then begin
eh:=1/eh;
end;
ehoch:=eh;
end;


function ln(Wert:real):real; {fr Werte nahe 0 ist die Pr?zision nicht exakt.
Vielleicht gibt es generell leichte Abweichungen bei Werten kleiner 1?
Vielleicht wieder ber Subtraktion von einen Fixlogarithmus ausfhren!}

var n,check,lna,glied,lnfix,lnafertig,wertur,zerlegln :real;

begin
wertur:=wert;   zerlegln:=0;    lnfix:=0.40546510811;

while Wert>1.5 do begin
Wert:=wert/1.5;  zerlegln:=zerlegln+1;
end;
while Wert<1 do begin
Wert:=Wert*1.5; Zerlegln:=zerlegln-1;
end;
lna:=Wert-1;  n:=1; glied:=(Wert-1);

repeat                       //hier beginnt die eigentliche Taylorreihe
n:=n+1;
glied:=glied/n*(n-1)*(Wert-1)*(-1);
check:=lna;
lna:=lna+Glied;
until (abs(check-lna)<0.0000000000000000000001);  //hier endet sie mit Abbruchkriterium

lnafertig:=(zerlegln*lnfix)+lna;
ln:=lnafertig;
end;


Wie man sieht ist das nicht so schwer der Rest in den Funktionen sind spielereien um die Konvergenz zu erweitern.
Ich versteh nur nicht was die Lehrerin daran so witzig findet power zu verbieten um dann exp und Ln zuzulassen. Das erscheint mir unlogisch, deshalb habe ich das auch nur vorgeschlagen.
Lena89 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.03.06 21:24 
user profile iconAllesquarks hat folgendes geschrieben:

Wie man sieht ist das nicht so schwer der Rest in den Funktionen sind spielereien um die Konvergenz zu erweitern.
Ich versteh nur nicht was die Lehrerin daran so witzig findet power zu verbieten um dann exp und Ln zuzulassen. Das erscheint mir unlogisch, deshalb habe ich das auch nur vorgeschlagen.

Sie kannte Power nicht, und als wir sie drauf hingewiesen haben hat sie uns angemeckert, weil wir im Internet ohne Nachzudenken blöde Funktionen abschreiben, die man auch leicht selbst entwickeln kann. haha, lustig die Frau. Ich verzweifel.
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Mi 08.03.06 21:31 
Warum kennt eine Frau Power nicht, und warum sollte man das Rad zweimal erfinden, wenn es schon überall zugänglich ist?

Naja, ist ja ok, wenn ihr das Prinzip kennt, nachdem man sowas machen kann, aber dann Power nicht zu verwenden?

Ich würde die schon mehrfach genannte Lösung benutzen, in dem man dann mit abs(x) und der mod Operation arbeitet.....

Das ist für mich die einfachste Lösung, als dass ich das ganze mti einer Schleife machen müsste.

Und bei negativem a würde ich ebenfalls nur ganze Exponenten zulasse, da alles andere viel zu viel arbeit ergibt, da gebrochene Exponenten zwangsläufig auf wurzeln führen, und diese unter Umständen ebenfalls nicht zu lösen sind, zuminest, wenn man nur mit der Zahlenmenge R arbeitet....
aim65
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 312

Win 9x, Win XP
Delphi 3pro, 7PE
BeitragVerfasst: Mi 08.03.06 21:34 
Hallo Alesquarks,
hast im Prinzip recht, aber hier wird wohl eher das Verständnis dafür gefordert, daß "Potenz" (neben der Reihenentwicklung) eben nur über Logarithmen errechnet werden kann (die natürlich auch eine Reihenentwicklung...usw). Kann mich noch gut an meine Schulzeit erinnern, in der es nur Rechenschieber und Logarithmentafel gab.
Die Reihenentwicklung gab es erst kurz vor dem Abi. Aber da gab es noch keinen PC, der so etwas sehr simpel macht. :mrgreen: