Für Vorlesungen, bitte die Webseite verwenden. https://flavigny.de/lecture
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 line
3.7KB

  1. #include "cpp_headers/fcpp.hh"
  2. #include <string.h> // fuer strlen, Laenge eines C-Strings
  3. #define MAX(a,b) a > b ? a : b // gibt stets die groeßere zahl zurueck
  4. // Taschenrechner Stack mit aktuellem Index und Zahlenspeicher
  5. struct RechnerStack {
  6. int current = 0; // zeigt auf das erste leere Element, anfangs 0
  7. int numbers[64]; // der Zahlenstack
  8. };
  9. // initialisiere den Stack
  10. RechnerStack stack;
  11. // gibt das letzte Element zurück
  12. int pop() {
  13. // letztes Element ist eins vor dem ersten leeren
  14. int last = stack.numbers[stack.current-1];
  15. // setze den alten Eintrag auf 0
  16. stack.numbers[stack.current-1] = 0;
  17. // reduziere den Index um 1, aber falle nicht unter 0
  18. stack.current = MAX(stack.current-1, 0);
  19. // gebe letztes Element zurueck
  20. return last;
  21. }
  22. // fuege ein Element dem Stack hinzu
  23. void push(int element) {
  24. stack.numbers[stack.current] = element; // setze letztes leeres auf neuen wert
  25. stack.current += 1; // erhöhe den aktuellen Index
  26. }
  27. int main(int argc, char* argv[]) {
  28. // Setzen Sie hier auf einen leeren Stack
  29. // fange kein Kommandozeilenargument ab
  30. if(argc < 2) {
  31. print("Eingabe für den Taschenrechner erwartet!");
  32. return 1;
  33. }
  34. // arg enthaelt die als Eingabe von der Kommandozeile uebergebene Zeichenfolge
  35. char* arg = argv[1];
  36. // Schleife, die die Zeichen der Eingabe nacheinander ablaeuft
  37. // strlen gibt die Anzahl der Zeichen in der Zeichenkette
  38. bool inNumber = false; // merkt, ob aktuell eine zahl eingelesen wird
  39. int digitCount = 0; // zaehlt die anzahl der ziffern
  40. for (int i = 0; i <= strlen(arg); i = i+1) {
  41. char zeichen = arg[i]; // aktuelles Zeichen
  42. // 48: 0, 49: 1, ..., 57: 9 in ASCII
  43. if (zeichen >= 48 && zeichen <= 57) {
  44. inNumber = true; // setze auf true, da gerade Zahl eingelesen wird
  45. digitCount += 1;
  46. push(zeichen - 48); // fuege die neue Ziffer dem stack hinzu
  47. } else if (inNumber) {
  48. // erstes Zeichen nach Ziffern, das keine Ziffer ist
  49. inNumber = false;
  50. int newNumber = 0; // summiere nun alle ziffern auf
  51. for (int i = 0; i < digitCount; i++) {
  52. // nehme ziffer vom stack und multipliziere sie mit der
  53. // richtigen Zehnerpotenz fuer diese Dezimalstelle
  54. newNumber += pop()*pow(10, i);
  55. }
  56. // fuege neue Zahl dem Stack hinzu
  57. push(newNumber);
  58. // setze Zifferzahl zurueck
  59. digitCount = 0;
  60. } if (zeichen == '+' || zeichen == '-' || zeichen == '*' || zeichen == '/') {
  61. // falls zeichen ein Rechenoperator
  62. if (stack.current < 2) {
  63. // nicht genug argumente im stack fuer den operator
  64. print("Invalid: Not enough arguments for operator!");
  65. return 1;
  66. }
  67. // nehme die zwei letzten Argumente
  68. int b = pop(); // letztes Element
  69. int a = pop(); // vorletztes Element
  70. // und fuehre Operation auf a und b aus, je nach zeichen
  71. // und fuege sie dem stack hinzu
  72. if (zeichen == '+') {
  73. push(a+b);
  74. } else if (zeichen == '-') {
  75. push(a-b);
  76. } else if (zeichen == '*') {
  77. push(a*b);
  78. } else if (zeichen == '/') {
  79. push(a/b);
  80. }
  81. }
  82. }
  83. if (stack.current > 1) {
  84. // falls mehr als eine Zahl im Stack uebrig,
  85. // haben Operatoren gefehlt, werfe also Fehler
  86. print("Invalid: Not enough operators for argument");
  87. return 1;
  88. }
  89. // drucke das Ergebnis aus (letztes Element auf dem Stack)
  90. print(pop());
  91. }