Taschenrechner

  • geschlossen
  • Delphi

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Taschenrechner

    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:


    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.
  • 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 :)

    Quellcode

    1. var
    2. variable : Integer;
    3. begin
    4. variable := 7 Mod 3;
    5. if variable > 0 then
    6. // Möglicherweise Primzahl
    7. end
    8. else
    9. // Keine Primzahl
    10. end;
    11. end;
    Alles anzeigen


    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:

    Quellcode

    1. procedure TForm1.Button5Click(Sender: TObject);
    2. var a,b,c,d:integer;
    3. begin
    4. a:=strtoint(edit1.text);
    5. d:=0;
    6. for b:= 1 to a
    7. do c:=a mod b;
    8. if c=0 then d:=d+1;
    9. if d>2 then edit5.text:='nein'
    10. else edit5.text:='ja';
    11. end;
    Alles anzeigen
  • Du darfst nicht bei 1 Anfangen, weil durch 1 ist eine Zahl ja immer teilbar... ich schreib mal pseudocode, ist leichter für mich :)

    Quellcode

    1. funktion isPrim (integer zahl)
    2. boolean isPrim = true;
    3. integer rest;
    4. integer zaehler;
    5. for zaehler = 2 to zahl/2
    6. rest = zahl mod zaehler;
    7. if rest == 0
    8. isPrim = false;
    9. 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:

    Quellcode

    1. 1 procedure TForm1.Button5Click(Sender: TObject);
    2. 2 var isprim: boolean; zaehler: integer; rest, zahl:real;
    3. 3 begin
    4. 4 isprim:=true;
    5. 5 zahl:=strtofloat(edit1.text);
    6. 6 zaehler:=0;
    7. 7 for zaehler:= 2 to zahl do
    8. 8 rest:= zahl mod zaehler;
    9. 9 if rest = 0 then isprim := false
    10. 10 else isprim := true;
    11. 11 if isprim = true then edit5.text:='ja'
    12. 12 else edit5.text:='nein';
    13. end;
    Alles anzeigen


    Dann kommt aber folgende Fehlermeldung:

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

    mfg
  • 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
  • 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:

    Quellcode

    1. procedure TForm1.Button5Click(Sender: TObject);
    2. var isprim: boolean; zaehler, zahl, rest: integer;
    3. begin
    4. isprim:=true;
    5. zahl:=strtoint(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. if isprim = true then edit5.text:='ja'
    11. else edit5.text:='nein';
    12. end;
    Alles anzeigen


    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:

    Quellcode

    1. procedure TForm1.Button5Click(Sender: TObject);
    2. var isprim: boolean; zaehler, zahl, rest: integer;
    3. begin
    4. isprim:=true;
    5. zahl:=strtoint(edit1.text);
    6. zaehler:=0;
    7. for zaehler:= 2 to zahl do begin
    8. rest:= zahl mod zaehler;
    9. if rest=0 then isprim:=false;
    10. end;
    11. if isprim = true then edit5.text:='ja'
    12. else edit5.text:='nein';
    13. end;
    Alles anzeigen


    Fürs Wurzelziehen gibt es auch eine nette Funktion namen sqrt()
    Dafür musst du unit math hinzufügen.

    Quellcode

    1. wurzel := sqrt(zahl);


    Für Potenzen nimmst du am besten die Funktion power()

    Quellcode

    1. 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
  • So, nach längerem recherchieren, hab ich das mit der Wurzel hinbekommen:

    Quellcode

    1. procedure TForm1.Button1Click(Sender: TObject);
    2. var
    3. a, r: Double;
    4. i: Integer;
    5. begin
    6. r := StrToFloat(Edit1.Text); // Die Zahl, aus der die Wurzel ermittelt wird
    7. a := 1; // Startwert
    8. for i := 1 to StrToInt(Edit2.Text) do // Anzahl der Annäherungsdurchläufe
    9. begin
    10. a := 0.5 * (a + r/a); // Heron-Verfahren
    11. end;
    12. Edit3.Text := FloatToStr(a); // Anzeige Wurzel der Zahl
    13. Edit4.Text := FloatToStr(a*a); // Anzeige der Berechneten Zahl zum Quadrat zum überprüfen der Genauigkeit
    14. Edit5.Text := FloatToStr(sqrt(r)); // Ausgabe der "richtigen" Wurzel
    15. end;
    Alles anzeigen


    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:

    Quellcode

    1. bool isPrim = true;
    2. int zahl=9;
    3. for(int i = 2; i<=zahl/2; i++) {
    4. if((zahl % i) == 0) // Modulo auf 0 überprüfen
    5. isPrim = false; // wenn rest 0 dann ist es keine Primzahl
    6. }
    7. if(isPrim)
    8. std::cout << zahl << " ist eine Primzahl" << std::endl;
    9. else
    10. std::cout << zahl << " ist keine Primzahl" << std::endl;
    Alles anzeigen


    Ich hab die primzahlenfunktion mal in c++ implementiert, so funktionierts bei mir... KA was du falsch machst :)
  • Yeah! Habs geschafft:

    Quellcode

    1. procedure TForm1.Button5Click(Sender: TObject);
    2. var isprim: boolean; zaehler, zahl: integer;
    3. begin
    4. isprim:=true;
    5. zahl:=strtoint(edit1.text);
    6. for zaehler:= 2 to Trunc(sqrt(zahl))+1 do
    7. begin
    8. if ((zahl mod zaehler)=0) then
    9. isprim:=false;
    10. end;
    11. if isprim = true then edit5.text:='ja'
    12. else edit5.text:='nein';
    13. end;
    Alles anzeigen


    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