Taschenrechner Problem

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

  • Taschenrechner Problem

    Habe gerade mit C++ begonnen
    Zahlen werden kontinuirlich addiert subtrahiert etc
    Reset funktioniert auch
    mein problem ist das wenn ich 6 drücke um die schleife zu beenden springe das programm noch einmal in die else verzweigung
    hat irgendjemand eine idee wie sich das vermeiden liesse ?
    ich darf keine goto anweisung verwenden
    cin >> value2; gefolgt cin >> value2; darf ich im switch auch nicht verwenden :p
    ich bin ehrlich gesagt mit meinem latein am ende und wiess nicht mehr weiter

    Quellcode

    1. void add(float &x, float y)
    2. {
    3. float erg;
    4. erg = x+y;
    5. cout << x << "+" << y << "=" << erg <<endl ;
    6. x = erg;
    7. }
    8. void subtract(float &x, float y)
    9. {
    10. float erg;
    11. erg = x-y;
    12. cout << x << "-" << y << "=" << erg <<endl;
    13. x = erg ;
    14. }
    15. void multiply (float &x,float y)
    16. {
    17. float erg;
    18. erg = x*y;
    19. cout << x << "*" << y << "=" << erg <<endl;
    20. x = erg;
    21. }
    22. void divide (float &x, float y)
    23. {
    24. if(y==0)
    25. {
    26. cout << "0 ist nicht zulässig"<<endl;
    27. }
    28. else
    29. {
    30. float erg;
    31. erg = x/y;
    32. cout << x << "/" << y << "=" << erg <<endl;
    33. x = erg ;
    34. }
    35. }
    36. int main ()
    37. {
    38. int calc;
    39. float value1;
    40. float value2;
    41. cout << "Wähle 1(+) 2(-) 3(*) 4(/) 5(R) 6(END)"<<endl;
    42. cin >> calc;
    43. cout << "1: ";
    44. cin >> value1;
    45. cout << "2: ";
    46. cin >> value2;
    47. while(calc<6)
    48. {
    49. switch(calc)
    50. {
    51. case 1: add(value1,value2);break;
    52. case 2: subtract(value1,value2);break;
    53. case 3: multiply(value1,value2);break;
    54. case 4: divide(value1,value2);break;
    55. }
    56. cin>>calc;
    57. if(calc == 5)
    58. {
    59. cout << "Wähle 1(+) 2(-) 3(*) 4(/) 5(R) 6(END)"<<endl;
    60. cin >> calc;
    61. cout << "1: ";
    62. cin >> value1;
    63. cout << "2: ";
    64. cin >> value2;
    65. }
    66. else
    67. {
    68. cout<<"2:";
    69. cin>>value2;
    70. }
    71. }
    72. cout<<"Programm beendet";
    73. return 0;
    74. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Sylar ()

  • hm. also erstmal hast du Redundanz im Code, also du hast haargenau die gleichen Befehle mehrmals drinstehen, also diese hier:

    Quellcode

    1. cout << "Wähle 1(+) 2(-) 3(*) 4(/) 5(R) 6(END)"<<endl;
    2. cin >> calc;
    3. cout << "1: ";
    4. cin >> value1;
    5. cout << "2: ";
    6. cin >> value2;

    das solltest du auf jedenfall vermeiden, Redundanz ist immer sehr fehleranfällig und schwierig zu warten. Du könntest z.B. innerhalb der while Schleife einfach die Switch-Block ans Ende setzen und evtl um die Cases 5,6 und am besten noch nen default-case, der ausgeführt wird wenn die eingabe falsch ist.

    und folgenden Teil versteh ich nicht:

    Quellcode

    1. if(calc == 5)
    2. {
    3. [...]
    4. }
    5. else
    6. {
    7. cout<<"2:";
    8. cin>>value2;
    9. }

    Wenn die Eingabe ungleich 5 ist wird nochmal value2 eingelesen? Warum?
  • hallo,

    klar, wenn du 6 eingiebst hast du keinen case dafür und dein if wird auch nicht ausgeführt sondern er landet im else zweig!

    1) ich würde immer (außer in super ausnahmesituationen) einen default zweig im switch machen... du kannst dir fast nie sicher sein das einer deiner cases zutrifft!
    2) mach doch einfach einen case für 6 der dann das programm beendet... z.b.:

    Quellcode

    1. case 1:...
    2. case 2:...
    3. case 3:...
    4. case 4:...
    5. case 5:...
    6. case 6: return 0;


    dann sollte das auch funktionieren.
    hoffe ich konnte helfe!

    thx, truespin
  • Quellcode

    1. cout<<"|***CALCULATOR***|"<<endl;
    2. cout<< "enter digit 1 > (+) (-) (*) (/) > digit 2 > solve with '=' ENTER "<<endl;
    3. do
    4. {
    5. cout << endl;
    6. cout << "<: ";
    7. cin >> value1;
    8. bool iloop;
    9. bool show; //var zeige letztes erg
    10. //bool wait;
    11. do
    12. {
    13. cout<<"<: ";
    14. if(show)
    15. {
    16. cout<<value1;
    17. }
    18. cin >> calc;
    19. if ((calc =='+') || (calc =='-') || (calc =='*') || (calc =='/'))
    20. {
    21. iloop = true;
    22. show = true;
    23. cin >> value2 >> solve;
    24. if(solve == '=')
    25. {
    26. switch(calc)
    27. {
    28. case '+': add(value1,value2);break;
    29. case '-': subtract(value1,value2);break;
    30. case '*': multiply(value1,value2);break;
    31. case '/': divide(value1,value2);break;
    32. }
    33. //mem = value1;
    34. //cout<<endl<<mem<<"zwischenspeicher";
    35. cout << endl << "1[Continue]"<<"--"<<"2[Reset]"<<"--"<<"3[END]"<< endl;
    36. cin >> options;
    37. }
    38. }
    39. else
    40. {
    41. cout << endl << "eingabe nicht definiert" << endl;
    42. }
    43. if(options == 1)
    44. {
    45. iloop=false;
    46. }
    47. }while(!iloop);
    48. if (options == 2)
    49. {
    50. oloop = false;
    51. }
    52. if(options == 3)
    53. {
    54. cout<<"program terminated";return 0;
    55. }
    56. }while(!oloop);
    Alles anzeigen


    habe ihn mal komplett neugeschrieben da der rechner recht fehleranfällig und auch mein lehrer recht unzufrieden war

    es ist nun möglich 2/34= einzugeben und vor allem hab ich hoffentlich nun die redudanzen grossteils entfernt :p

    nun muss allerdings der rechner noch erweitert werden ich soll nun 1+2+4+3+4+2 eingeben können und wie schon in meinem quellcode zu sehen soll bei eingabe des "=" berechnet werden
    es soll aber auch möglich sein 2+2 direkt danach eingeben zu können dann "=" und zu lösen
    ich habe aber keine ahnung wie ich lösen könnte mein plan value1 in einer zwischnvariable zu speichern hat nicht funktioniert zumindest hatte ich keine idee mehr wie man weiter vorgehen könnte/müsste

    funktions prototypen :

    Quellcode

    1. void add(float &x, float y)
    2. {
    3. float erg;
    4. erg = x+y;
    5. cout << x << "+" << y << "=" << erg <<endl ;
    6. x = erg;
    7. }
    8. void subtract(float &x, float y)
    9. {
    10. float erg;
    11. erg = x-y;
    12. cout << x << "-" << y << "=" << erg <<endl;
    13. x = erg ;
    14. }
    15. void multiply (float &x,float y)
    16. {
    17. float erg;
    18. erg = x*y;
    19. cout << x << "*" << y << "=" << erg <<endl;
    20. x = erg;
    21. }
    22. void divide (float &x, float y)
    23. {
    24. if(y==0)
    25. {
    26. cout << "0 ist nicht zulässig"<<endl;
    27. }
    28. else
    29. {
    30. float erg;
    31. erg = x/y;
    32. cout << x << "/" << y << "=" << erg <<endl;
    33. x = erg ;
    34. }
    35. }
    Alles anzeigen


    ich beginne konsolen anwendungen langsam zu hassen komme von Java und habe hauptsächlich programme mit oberflächen erstellet was wesentlich besser von der hand ging

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Sylar ()