De simpele rekenmachine

De simpele rekenmachine

Bij het programmeren van een rekenmachine in Python komt heel wat wiskundige techniek kijken. We beginnen eenvoudig, met vooral aandacht voor het grafische aspect. We maken gebruik van een zogenaamde grafische user interface (GUI). In dit artikel gaan we vooral in op eigenschappen van deze interface.

Er zijn in dit programma vier functies: Eval, Click, Showbuttons en Destroybuttons. De laatste twee worden beide maar eenmaal aangeroepen. In Showbuttons wordt de tekst (text) op de knoppen (buttons) gezet en worden de knoppen geïnitialiseerd. Aan elke knop wordt een tekst, tekstkleur, achtergrondkleur, lettertype en aan de knop verbonden functie. Je ziet staan:

        button = tk.Button(root, text=TEKSTEN[nr], width=3, height=1,
                                 bg=color, fg="black", borderwidth = 1,
                                 font=(FontName, FontSize, 'bold'),
                                 command=lambda nr = nr: Click(nr))
Het lastigste deel van deze toekenning is command=lambda nr = nr: Click(nr). Hier wordt verwezen naar de functie Click. Bovendien wordt aan de knop de waarde nr toegekend. nr loopt van 0 t/m 19 (de rode getallen in figuur 1). In de functie Click wordt voor de opeenvolgende waarden van nr de opdracht uitgevoerd horende bij die knop. Bijvoorbeeld bij de knop met opschrift 7 wordt een 7 in het display toegevoegd.

Daarna volgen een paar technische handelingen, voor de wiskundige niet zo boeiend, maar wel verplicht om de knoppen op het scherm te krijgen. Bijvoorbeeld moet met grid aangegeven worden op welke locatie de knop kan worden getoond. De knoppen worden per rij gebundeld (button_row) en de rijen worden daarna weer samengebracht in de variabele buttons.

Click is de functie die steeds wordt aangeroepen. Alleen nr (loopt van 0 tot 19) varieert. Als je Click bekijkt, dan zie je dat er 20 mogelijkheden worden bekeken, waarbij iedere mogelijkheid overeenstemt met de betreffende knop. In de laatste twee regels van deze functie wordt het tekstveld leeggemaakt en wordt de nieuwe tekst geplaatst.

De functie Eval wordt alleen gebruikt om tussenresultaten te berekenen.

Deze rekenmachine werkt met de variabele R. De bijbehorende string staat in het tekstveld. Om te switchen tussen tekst en getallen kun je int en str gebruiken. Dan heb je wel een probleem als het getal niet geheel is. Daarom hebben we bij deze simpele rekenmachine gekozen om gebruik te maken van float. Tekst wordt nu omgezet naar een getal met decimale punt.

Het is gebruikelijk om in plaats van wortel op twee knoppen te drukken: eerst op “inv”, en daarna op “kwadraat”. Als op “inv” gedrukt wordt, dan wordt een vlag inv op TRUE gezet. Bij het drukken op “kwadraat” wordt altijd gecontroleerd of inv TRUE is. In dat geval wordt de wortel genomen. Ongeacht welke knop wordt ingedrukt (anders dan “inv”) krijgt inv de waarde FALSE.

Opdracht 1

Vervang de knop “wortel” door de knop inv. Zorg er voor dat de wortel in het display verschijnt bij gebruik van de knoppen “inv” + “kwadraat”.

We gaan de rekenmachine iets uitbreiden, met de knoppen “exp”, “sin”, “cos” en “tan”. Na Opdracht 1 is er ook al een “inv”, zodat we nu ook “inv”+“exp” = “log”, “inv”+“sin” = “arcsin”, “inv”+“cos” = “arccos” en “inv”+“tan” = “arctan” kunnen maken.

Opdracht 2

Lukt het jou om die knoppen te programmeren? Je moet een keuze maken of je in radialen werkt of in graden.

De code voor de knoppen die kan worden gebruikt staat op onze website.

Opdracht 3

Kun je de rekenmachine zo aanpassen dat als het getal geheel is dat dan het getal wordt getoond en niet de benadering.

De “uit”-knop zit op een heel ongelukkige plaats. Er is nog voldoende ruimte om die naast het tekstveld te zetten. Dan is er ruimte om de decimale punt een plaatsje te geven.

Opdracht 4

Hoe moet het programma worden aangepast? Wat doe je als er een tweede decimale punt wordt ingetikt?

Als je 1 : 0 intoetst krijg je 0. Eigenlijk wil je “Fout”. zien. De code horende bij Opdracht 5 is op deze manier aangepast.

Opdracht 5

Bestudeer deze code. Pas de rekenmachine naar eigen inzicht verder aan. We zijn zeer geïnteresseerd in je ideeën. Stuur ze naar pypy@pyth.eu.

Bekijk oplossing