Brauche Hilfe bei meinem Taschenrechner!

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

  • Brauche Hilfe bei meinem Taschenrechner!

    Ich bräuchte Hilfe bei meinem Taschenrechner.
    Das Problem ist das die Schleife bei mehrfacheingabe wegen dem getch() so oft ausgefürt, bis die im getch eingegebenen eingaben abgearbeitet sind.
    Hier der Code:

    Quellcode

    1. // Taschenrechner.cpp : ein Taschenrechner mit Auswahl, Schleife und Modulen.
    2. #include "stdafx.h"
    3. #include <iostream>
    4. #include <conio.h>
    5. #include <tchar.h>
    6. using namespace std;
    7. // Auswahl der Rechenart.
    8. char f_wahl(char wahl)
    9. {
    10. cout << "Bitte geben Sie die gew"<<(char)129<<"nschte Funktion ein" << endl;
    11. cout << "1 f"<<(char)129<<"r Addition. \n2 f"<<(char)129<<"r Subtraktion. \n3 f"<<(char)129<<"r Multiplikation. \n4 f"<<(char)129<<"r Division." << endl;
    12. cin >> wahl;
    13. return wahl;
    14. };
    15. // Hier werden die Werte eingegeben, wenn das Programm gestarten wird oder wenn das alte Ergebnis verworfen werden soll.
    16. void p_eingabe_n(double &wert1, double &wert2)
    17. {
    18. cout << "Bitte geben Sie jetzt die erste Zahl ein." << endl;
    19. cin >> wert1;
    20. cout << "Jetzt bitte die zweite Zahl." << endl;
    21. cin >> wert2;
    22. };
    23. // Hier wird der zweite Wert eingegeben, wenn mit einem ergebnis weiter gearbeitet wird.
    24. void p_eingabe_w(double &wert2)
    25. {
    26. cout << "Bitte geben sie die zweite Zahl ein." << endl;
    27. cin >> wert2;
    28. };
    29. // Hier wird eine Falsche eingabe angefangen, wenn vorher noch kein Ergebnis vorhanden war.
    30. void p_abfang(char &cTaste)
    31. {
    32. do
    33. {
    34. cout << "\nWollen Sie mit dem Taschenrechner weiter arbeiten? \n\nj fuer ja\na zum aufzuhoeren" << endl;
    35. cTaste=getch();
    36. }
    37. // Hier musste leider a und j genutzt werden, um nicht durch andere Abfragen fehlgeleitet zu werden.
    38. while((cTaste!='j')&&(cTaste!='a'));
    39. };
    40. // die addition mit den Werten aus p_eingabe_n oder p_eingabe_w.
    41. double f_addition(double wert1, double wert2)
    42. {
    43. double ergebnis=0;
    44. ergebnis=wert1+wert2;
    45. return ergebnis;
    46. };
    47. // die subtraktion mit den Werten aus p_eingabe_n oder p_eingabe_w.
    48. double f_subtraktion(double wert1, double wert2)
    49. {
    50. double ergebnis=0;
    51. ergebnis=wert1-wert2;
    52. return ergebnis;
    53. };
    54. // die multiplikation mit den Werten aus p_eingabe_n oder p_eingabe_w.
    55. double f_multiplikation(double wert1, double wert2)
    56. {
    57. double ergebnis=0;
    58. ergebnis=wert1*wert2;
    59. return ergebnis;
    60. };
    61. // die addition mit den Werten aus p_eingabe_n.
    62. double f_division_n(double wert1, double wert2, char &cTaste)
    63. {
    64. double ergebnis=0;
    65. // Hier wird die Division durch 0 abgefangen.
    66. if (wert2 == 0)
    67. {
    68. cout << "Die Division durch " << wert2 << " ist nicht moeglich!";
    69. // cTaste wird auf d gesetzt damit zwischen einem fehler ohne vorherigen und
    70. // mit vorherigen Ergebnis unterschieden werden kann.
    71. cTaste='d';
    72. }
    73. else
    74. ergebnis=wert1/wert2;
    75. return ergebnis;
    76. };
    77. // die division mit den Werten aus p_eingabe_w.
    78. double f_division_w(double wert1, double wert2, char &cTaste)
    79. {
    80. double ergebnis=0;
    81. if (wert2 == 0)
    82. {
    83. cout << "Die Division durch " << wert2 << " ist nicht moeglich!" << endl;
    84. cout << "Die erste Zahl wird wieder auf ihr altes Ergebnis zurueck gesetzt" << endl;
    85. // cTaste wird auf d gesetzt damit zwischen einem fehler ohne vorherigen und
    86. // mit vorherigen Ergebnis unterschieden werden kann.
    87. cTaste='g';
    88. }
    89. else
    90. ergebnis=wert1/wert2;
    91. return ergebnis;
    92. };
    93. // Wird aufgerufen beim ersten Programm durchlauf oder bei neu berechnung.
    94. void p_switch_n(char &cTaste, char wahl, double wert1, double wert2, double &ergebnis)
    95. {
    96. switch (wahl)
    97. {
    98. case '1': p_eingabe_n(wert1,wert2);
    99. ergebnis=f_addition(wert1,wert2); break;
    100. case '2': p_eingabe_n(wert1,wert2);
    101. ergebnis=f_subtraktion(wert1,wert2); break;
    102. case '3': p_eingabe_n(wert1,wert2);
    103. ergebnis=f_multiplikation(wert1,wert2); break;
    104. case '4': p_eingabe_n(wert1,wert2);
    105. ergebnis=f_division_n(wert1,wert2,cTaste);break;
    106. default: cout << endl << wahl << " ist keine g"<<(char)129<<"ltige Eingabe!";
    107. p_abfang(cTaste);
    108. };
    109. };
    110. // Wird durchlaufen wenn mit dem Ergebnis aus case n weiter rechne.
    111. void p_switch_w(char &cTaste, char wahl, double wert1, double wert2, double &ergebnis)
    112. {
    113. switch (wahl)
    114. {
    115. case '1': p_eingabe_w(wert2);
    116. ergebnis=f_addition(wert1,wert2); break;
    117. case '2': p_eingabe_w(wert2);
    118. ergebnis=f_subtraktion(wert1,wert2); break;
    119. case '3': p_eingabe_w(wert2);
    120. ergebnis=f_multiplikation(wert1,wert2); break;
    121. case '4': p_eingabe_w(wert2);
    122. ergebnis=f_division_w(wert1, wert2, cTaste); break;
    123. default: cTaste='g';
    124. };
    125. };
    126. // Kommt nach einer Division durch 0 ohne vorherigen Ergebnis.
    127. char f_schluss(double ergebnis,double &wert1 , char cTaste)
    128. {
    129. if (cTaste == 'd')
    130. p_abfang(cTaste);
    131. // Ausgabe des Ergebnis wenn der Anwender keine Fehler gemacht hat.
    132. else if (cTaste=='n' || cTaste=='w')
    133. {
    134. cout << endl << "das Ergebnis lautet " << ergebnis << endl;
    135. wert1=ergebnis;
    136. cout << endl << "Esc zum Abbrechen." << endl;
    137. cout << "w um das Ergebnis weiter zu nutzen.";
    138. cout << endl << "n um die alten werte zu verwerfen." << endl;
    139. cTaste = getch();
    140. }
    141. // Kommt nach einer Division durch 0 mit einem vorhandenen ergebnis.
    142. else if (cTaste == 'g')
    143. {
    144. cout << endl << "Esc zum Abbrechen." << endl;
    145. cout << "w dr"<<(char)129<<"cken um mit dem alten Ergebnis weiter zu arbeiten." << endl;
    146. cout << "n um die alten werte zu verwerfen." << endl;
    147. cTaste = getch();
    148. }
    149. return cTaste;
    150. };
    151. // Hier wird jede falsche Eingabe abgefangen, wenn das Programm min. einmal erfolgreich
    152. // durchgelaufen wurde und mit dem Ergebnis weiter gearbeitet wurde.
    153. char f_abfang(char cTaste)
    154. {
    155. do
    156. {
    157. cout << "\nIhnen stehen folgene Optionen zu verf"<<(char)129<<"gung: \n\nn fuer eine neue Berechnung.";
    158. cout << "\nw um mit dem Ergebnis weiter zu arbeiten.\nEsc fuer Abbruch." << endl;
    159. cTaste=getch();
    160. }
    161. while((cTaste !=27)&&(cTaste !='w')&&(cTaste !='n'));
    162. return cTaste;
    163. };
    164. void main(void)
    165. {
    166. double wert1=0;
    167. double wert2=0;
    168. double ergebnis=0;
    169. char wahl=' ';
    170. char cTaste = 'n';
    171. do
    172. { // Damit nicht unnötig und falscherweise Text ausgegeben wird,
    173. // kommt man hier nur mit gültigen Werten rein.
    174. if (cTaste=='n' || cTaste=='w')
    175. {
    176. // Löscht das Fenster und der Text erscheint neu.
    177. system("cls");
    178. // Abfrage der Grundrechenarten.
    179. wahl=f_wahl(wahl);
    180. // Durch dieses switch/case wird das Arbeiten mit vorherrigen Ergebnis realisiert.
    181. switch (cTaste)
    182. {
    183. case 'n': p_switch_n(cTaste,wahl,wert1,wert2,ergebnis);break; // Auslagerung der Case.
    184. case 'w': p_switch_w(cTaste,wahl,wert1,wert2,ergebnis);break; // Auslagerung der Case.
    185. default:;
    186. }
    187. }
    188. // Hier werden richtige Durchläufe abgefangen und das Ergebnis dem Anwender ausgegeben.
    189. if (cTaste=='d' || cTaste=='g' || cTaste=='n' || cTaste=='w')
    190. cTaste=f_schluss(ergebnis,wert1,cTaste);
    191. // Hier wird der Rückwert einer abfang Schleife abgefangen und ans Konzept angepasst.
    192. else if (cTaste=='a')
    193. cTaste=27;
    194. // Hier wird der Rückwert einer abfang Schleife abgefangen und ans Konzept angepasst.
    195. else if (cTaste=='j')
    196. cTaste='n';
    197. // Das ist die letzte Abfang möglichkeit, wenn cTaste weder d,g,n,w,j,a oder Esc ist.
    198. else if (cTaste != 27)
    199. cTaste=f_abfang(cTaste);
    200. }
    201. // Abbruchbedingung für den Taschenrechner (27 steht in der ASCII-Tabelle für die Esc Taste
    202. while(cTaste != 27);
    203. };
    Alles anzeigen