Taschenrechner geschlossen 

  • Ersteller Ersteller ElvisTheKing
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
E

ElvisTheKing

Morgen,
haben wieder eine neue Aufgabe aus der Schule bekommen, ich könnte die zwar 1:1 aus dem Beispiel, was wir bekommen haben übernehmen, wir sollen jedoch auch selbst ma versuchen eigene Funktionen einzubauen.
Es geht um einen Taschenrechner, der so aussieht:
preview.php


Also die einfachen mathematischen Sachen hab ich schon gemacht, wie +, -, *, /, x², sqrt usw.
Was mir jetzt zum Beispiel noch fehlen würde ist, Potenzen in Form von a^b; a ist die Zahl im ersten Eingabefeld, b im zweiten und entsprechend ate Wurzel von b.
Wir sollen mindestens zehn Tasten programmieren. Hab mir noch überlegt die Zahlen auf ihre Anzahl der Teiler, sprich Primzahlen , zu testen.
Hoffe mir kann jemand bei diesem sehr komplexen Problem helfen!
Vielen Dank schon Mal im Vorraus!

mfg
 
Die Primzahlenberechnung ist doch nicht wirklich ein schweres Problem :)

Eine Primzahl ist eine Zahl die NUR durch 1 oder durch sich selber teilbar ist. D.H. du musst in einer schleife von 2 bis (Zahl/2) laufen und überprüfen ob "zahl mod zaehler" ohne Rest auszuführen ist. Wenn die zahl irgendwann in der Schleife ohne Rest teilbar ist hast du keine Primzahl.
 
Wie überprüfe ich denn, ob ein Rest übrigbleibt beim divideiren durch die Zahlen von 1 bis zahl?
 
In delphi gibts auch den operator "mod". mod (Modulo) gibt den Rest einer division zurück.
also bei 4 mod 3 würde 1 zurück gegeben. und bei 4 mod 2 eben 0...
 
Ja, das is mir schon klar, dann steht da zahl mod zaehler entweder 0, also keine Primzahl, wenn das innerhalb der Schleife vorkommt oder irgend ne andere Zahl, dann isses eventuell ne Primzahl. Aber wie frage ich jetzt ab, ob der Rest 0 oder ne adnere Zahl ist. Könntest du mir en kurzes Beispiel geben?
 
Ich kann nicht so wirklich delphi, daher versuch ich mal mein Glück, wenn Syntaxfehler vorhanden sind tut mir das leid :)

Code:
 var
variable : Integer;
begin
variable := 7 Mod 3;
if variable > 0 then
// Möglicherweise Primzahl
end
else
// Keine Primzahl
end;
end;

Das ganze in einer Schleife von 2 bis Zahl/2...
 
So, hab des ma gemacht, aber jetzt schreibt der bei jeder Zahl, das es ne Primzahl is:
Code:
procedure TForm1.Button5Click(Sender: TObject);
var a,b,c,d:integer;
begin
a:=strtoint(edit1.text);
d:=0;
for b:= 1 to a
do c:=a mod b;
if c=0 then d:=d+1;
if d>2 then edit5.text:='nein'
else edit5.text:='ja';

end;
 
Du darfst nicht bei 1 Anfangen, weil durch 1 ist eine Zahl ja immer teilbar... ich schreib mal pseudocode, ist leichter für mich :)

Code:
funktion isPrim (integer zahl)
boolean isPrim = true;
integer rest;
integer zaehler;
for zaehler = 2 to zahl/2
rest = zahl mod zaehler;
if rest == 0
isPrim = false;

return isPrim;

Theoretisch müsste es so gehen. Es wird davon ausgegangen das wir eine Primzahl haben. wenn wir aber eine der Zahen in der Schleife teilen können haben wir bewiesen das es keine Primzahl ist und ändern den Flag isPrim zu false;
 
Hab das jetzt ma, so wie du gesagt hast, versucht umzusetzen:
Code:
1 procedure TForm1.Button5Click(Sender: TObject);
2 var isprim: boolean; zaehler: integer; rest, zahl:real;
3 begin
4 isprim:=true;
5 zahl:=strtofloat(edit1.text);
6 zaehler:=0;
7 for zaehler:= 2 to zahl do
8 rest:= zahl mod zaehler;
9 if rest = 0 then isprim := false
10 else isprim := true;
11 if isprim = true then edit5.text:='ja'
12 else edit5.text:='nein';

end;

Dann kommt aber folgende Fehlermeldung:

Inkompatible Typen: 'Integer' und 'Real' in Zeile 7
Operator ist auf diesen Operandentyp nicht anwendbar Zeile 8

mfg
 
Was ist denn Real für ein Datentyp? Wieso verwendest du da nicht einfach auch Integer für?
Edit: ach und das "else isprim := true;" muss weg :) Weil du sonst den alten wert wieder überschrieben könntest
 
Real sind halt alle zahlen, wo es gibt, integer sind ja nur positive und gerade zahlen.
Und da der Taschenrechner möglichst auch mit komma, bruch, irrationalen und negativen zahlen umgehen sollte, verwende ich real.
Es geht aber auch trotzdem nicht, wenn ich das wegmache.
 
Okay, dann benutz auch für den zaehler Real, sollte denke ich gehen...

*edit* Oder du rundest die Real zahl mit der funktion round dann sollte der fehler auch weggehen...

Muss jetzt erstmal weg, mit meinen ansätzen solltest du eigentlich weiter kommen :) Ansonsten bin ich denk ich heut Abend wieder online, oder vielleicht findet sich hier ja sonst noch einer der dir helfen kann :)
 
So, erst ma vielen Dank für deine Mühe, bin schon ein ganzes Stück weiter.
Das man den zaehler las real macht geht schon ma gar nicht, da die for-schleife sonst ins unendliche gehen würde, das es z.b. zwischen 2 und 3 unendlich viele Zahlen gibt.
Die round-funktion habe ich noch nie benutzt, aber ich bin mir auch sicher, dass es ohne die gehen muss, da der zaehler integer wegen der for-schleife sein muss.
Nochmals vielen Dankf für deine Mühe!!!
Vielleicht hat jemand anderes ja noch en paar Ideen.

mfg
 
Einen hab ich noch ;)

round rundet die Realzahl und wandelt sie dabei in Integer um, damit bekommst du die Fehlermeldung weg (bin ich mir fast sicher). Das du für den zaehler kein Real verwenden kannst macht Sinn :)
 
könntest du mir erklären wie die Fuktion round funktionier? Haben die noch nie benutzt, jedenfalls kann ich mich nicht mehr dran erinnern.

mfg
 
Ähm.. ja... Round(Zahl) ? :)
Dabei wird dann ab 5 aufgerundet und vorher abgerundet:
also
13.4 rounds to 13
13.5 rounds to 14

Solche kleinen Fragen kann man aber meistens ganz schnell bei google beantworten ;)
 
So, habs nach einstündigem probieren hinbekommen, dass sich das Programm endlich wieder starten lässt. Es funktioniert sogar, dass die eins als Primzahl erkannt wird, die restlichen nich:
Code:
procedure TForm1.Button5Click(Sender: TObject);
var isprim: boolean; zaehler, zahl, rest: integer;
begin
isprim:=true;
zahl:=strtoint(edit1.text);
zaehler:=0;
for zaehler:= 2 to zahl do
rest:= zahl mod zaehler;
if rest=0 then isprim:=false;
if isprim = true then edit5.text:='ja'
else edit5.text:='nein';

end;

Das mit den Primzahlen is mir aber auch nciht so wichtig, es wäre besser wenn mir jemand mit den Potenzen und den Wurzeln helfen könnte.

mfg
 
Ich nehme and das das Problem ist das die for schleife nur den ersten ausdruck mehrfach mach? (Wenn nicht liegts an meinen nicht vorhandenen delphi kenntnissen ;) )

Aber ich würde vermuten das es so richtig sein müsste:
Code:
procedure TForm1.Button5Click(Sender: TObject);
var isprim: boolean; zaehler, zahl, rest: integer;
begin
isprim:=true;
zahl:=strtoint(edit1.text);
zaehler:=0;
for zaehler:= 2 to zahl do begin
rest:= zahl mod zaehler;
if rest=0 then isprim:=false;
end;

if isprim = true then edit5.text:='ja'
else edit5.text:='nein';

end;

Fürs Wurzelziehen gibt es auch eine nette Funktion namen sqrt()
Dafür musst du unit math hinzufügen.
Code:
wurzel := sqrt(zahl);

Für Potenzen nimmst du am besten die Funktion power()
Code:
erg := power(basis, exponent);
 
Es funktioniert trotzdem nicht, das gleiche Problem wie vorhin :( . Wenn ich eine unit hinzuziehen muss, muss ich doch nur nach begin math schreiben, oder? Das funktioniert nämlich auch nicht. Bei randomize schon. Ich benutze Delphi 3 :D . Vielleicht liegts ja an der Version.
Habe aber eine andere Methode für die Berechnung von Quadratwurzeln gefunden:
Heron-Verfahren
Wäre es vielleicht zuviel verlangt wenn mir JEMAND das kurz umsetzen könnte?
Vielen vielen Dank schon Mal im Vorraus für die Mühe und vor allem dir, Zerd!!!!

mfg
 
nein du musst ganz oben uses Math hinschreiben wo du schon die anderen units hinzufügst...
 
So, nach längerem recherchieren, hab ich das mit der Wurzel hinbekommen:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
a, r: Double;
i: Integer;
begin
r := StrToFloat(Edit1.Text); // Die Zahl, aus der die Wurzel ermittelt wird

a := 1; // Startwert

for i := 1 to StrToInt(Edit2.Text) do // Anzahl der Annäherungsdurchläufe
begin
a := 0.5 * (a + r/a); // Heron-Verfahren
end;

Edit3.Text := FloatToStr(a); // Anzeige Wurzel der Zahl
Edit4.Text := FloatToStr(a*a); // Anzeige der Berechneten Zahl zum Quadrat zum überprüfen der Genauigkeit
Edit5.Text := FloatToStr(sqrt(r)); // Ausgabe der "richtigen" Wurzel
end;

Aber zu dem Problem mit den Primzahlen und den Potenzen weiß das www keine Lösung.

mfg

P.S: hatte vergessen zu sagen, dass wir alles selbsts chreiben sollen, ohne verwendung anderer units!
Außerdem hat mein Delphi noch nicht die Unit Math
 
Ich weiß nicht wie das Programm Innen aussieht, aber was ich bei solchen Aufgaben immer gerne mache, ist das Programm (vom Lehrer) vernünftig neu zu schreiben.
Im Fall vom Taschenrechner wäre es sicher cool, einen vernünftigen RPN/UPN Stack zu schreiben. Das kommt je nach Lehrer ziemlich gut an.
 
Na okay, potenzen selbst schreiben ist nicht wirklich schwer ;)

2² = 2 * 2 = 4;
2³ = 2 * 2 * 2 = 8;

Aaaalso einfach basis so oft mit sich selbst multiplizieren wie du es im exponenten angegeben hast... Wäre dann ganz gut in einer Schleife zu lösen :)

*Edit:
Code:
 bool isPrim = true;
int zahl=9;

for(int i = 2; i2; i++) {
if((zahl % i) == 0) // Modulo auf 0 überprüfen
isPrim = false; // wenn rest 0 dann ist es keine Primzahl
}

if(isPrim)
std::cout  else
std::cout CODE]

Ich hab die primzahlenfunktion mal in c++ implementiert, so funktionierts bei mir... KA was du falsch machst :)
 
Yeah! Habs geschafft:
Code:
procedure TForm1.Button5Click(Sender: TObject);
var isprim: boolean; zaehler, zahl: integer;
begin
isprim:=true;
zahl:=strtoint(edit1.text);
for zaehler:= 2 to Trunc(sqrt(zahl))+1 do
begin
if ((zahl mod zaehler)=0) then
isprim:=false;
end;
if isprim = true then edit5.text:='ja'
else edit5.text:='nein';

end;

Jetzt hab ich also +,-,*,/,Primzahlen,Wurzel und Potenzen. Insgesamt brauch ich 10 verschiedene Rechenoperationen, also fehlen mir noch drei. Ich hab mir überlegt ich mache Fakultät, Quersumme und ggT/kgV.
Das dürfte eigentlich nicht so schwer sein!!!
Vielen Dank an dich zerd!!!

mfg
 
So, kriegs doch nit hin :D . Ich sitz schon fast den ganzen Tag davor und kreigs einfach nit gebacken! :confused: Könnte ich ein letztes Mal noch eure hilfe in Anspruch nehmen?? Hab zwar Ansätze, aber die sind alles andere als brauchbar!
Vielen Dank im Vorraus!

mfg
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten