Forum: Kalkylator

Forum huvudsida -> Programmering -> Kalkylator

Sidor: 1

Till botten

jockepockee 21:36 - 27:e Februari 2007 | Post #1
Medlem
Inlägg: 192


Skicka PM
  1.  
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. int tempnum1;
  9. int tempnum2;
  10. int integer1;
  11. int integer2;
  12. int integer3;
  13. int summa;
  14. int skillnad;
  15. int produkt;
  16. int kvot;
  17. cout << "----------Mini\x84knare----------\n";
  18. while (true)
  19. {
  20. cout << "\nHur m\x86nga tal vill du anv\x84nda? (Minst 2 st och H\x94gst 3 st)\n";
  21. cout << "Antal: ";
  22. cin >> tempnum1;
  23. cout << "\nVilket r\x84knes\x84tt vill du anv\x84nda?\n\n";
  24. cout << "[1] +\n";
  25. cout << "[2] -\n";
  26. cout << "[3] *\n";
  27. cout << "[4] /\n";
  28. cout << "Antal: ";
  29. cin >> tempnum2;
  30. switch (tempnum2)
  31. {
  32. case 1:
  33. if (tempnum1 == 2)
  34. {
  35. cout << "\nTal1: ";
  36. cin >> integer1;
  37. cout << "Tal2: ";
  38. cin >> integer2;
  39. summa = integer1 + integer2;
  40. cout << "Summa: " << summa << "\n";
  41. }
  42. else if (tempnum1 == 3)
  43. {
  44. cout << "\nTal1: ";
  45. cin >> integer1;
  46. cout << "Tal2: ";
  47. cin >> integer2;
  48. cout << "Tal3: ";
  49. cin >> integer3;
  50. summa = integer1 + integer2 + integer3;
  51. cout << "Summa: " << summa << "\n";
  52. }
  53. else
  54. {
  55. cout << "\nDu har anget f\x94r m\x86nga eller f\x94r n\x86gra tal!\n";
  56. }
  57. break;
  58. case 2:
  59. if (tempnum1 == 2)
  60. {
  61. cout << "\nTal1: ";
  62. cin >> integer1;
  63. cout << "Tal2: ";
  64. cin >> integer2;
  65. skillnad = integer1 - integer2;
  66. cout << "Skillnad: " << skillnad << "\n";
  67. }
  68. else if (tempnum1 == 3)
  69. {
  70. cout << "\nTal1: ";
  71. cin >> integer1;
  72. cout << "Tal2: ";
  73. cin >> integer2;
  74. cout << "Tal3: ";
  75. cin >> integer3;
  76. skillnad = integer1 - integer2 - integer3;
  77. cout << "Skillnad: " << skillnad << "\n";
  78. }
  79. else
  80. {
  81. cout << "\nDu har anget f\x94r m\x86nga eller f\x94r n\x86gra tal!\n";
  82. }
  83. break;
  84. case 3:
  85. if (tempnum1 == 2)
  86. {
  87. cout << "\nTal1: ";
  88. cin >> integer1;
  89. cout << "Tal2: ";
  90. cin >> integer2;
  91. produkt = integer1 * integer2;
  92. cout << "Produkt: " << produkt << "\n";
  93. }
  94. else if (tempnum1 == 3)
  95. {
  96. cout << "\nTal1: ";
  97. cin >> integer1;
  98. cout << "Tal2: ";
  99. cin >> integer2;
  100. cout << "Tal3: ";
  101. cin >> integer3;
  102. produkt = integer1 * integer2 * integer3;
  103. cout << "Produkt: " << produkt << "\n";
  104. }
  105. else
  106. {
  107. cout << "\nDu har anget f\x94r m\x86nga eller f\x94r n\x86gra tal!\n";
  108. }
  109. break;
  110. case 4:
  111. if (tempnum1 == 2)
  112. {
  113. cout << "\nTal1: ";
  114. cin >> integer1;
  115. cout << "Tal2: ";
  116. cin >> integer2;
  117. kvot = integer1 / integer2;
  118. cout << "Kvot: " << kvot << "\n";
  119. }
  120. else if (tempnum1 == 3)
  121. {
  122. cout << "\nTal1: ";
  123. cin >> integer1;
  124. cout << "Tal2: ";
  125. cin >> integer2;
  126. cout << "Tal3: ";
  127. cin >> integer3;
  128. kvot = integer1 / integer2 / integer3;
  129. cout << "Kvot: " << kvot << "\n";
  130. }
  131. else
  132. {
  133. cout << "\nDu har anget f\x94r m\x86nga eller f\x94r n\x86gra tal!\n";
  134. }
  135. break;
  136. default:
  137. cout << "\nDu har inte ange n\x86got gilltigt r\x84knes\x84tt!\n";
  138. break;
  139. }
  140. }
  141. cin.get();
  142. cin.get();
  143. return 0;
  144. }


Den klarar av att räkna upp till 3 tal med alla räknesätt.

Ge gärna kritik på koden!

-------------------------





Slash 21:50 - 27:e Februari 2007 | Post #2
Medlem
Inlägg: 141


Skicka PM
Rent spontant så tycker jag att det är väldigt mycket duplicerad kod. Det enda som skiljer mellan case-satserna är i stort sett bara två rader. Om du skulle försöka dra ut den gemensamma koden så hade du möjligen kunnat göra samma sak på lite mindre plats. Positivt är ju att du har välindenterad kod!

-------------------------
Ingen sigantur!

Senast redigerad 21:55 - 27:e Februari 2007


jockepockee 22:12 - 27:e Februari 2007 | Post #3
Medlem
Inlägg: 192


Skicka PM
vet men jag är inte så duktig på å koda kompakt

-------------------------





Slash 22:20 - 27:e Februari 2007 | Post #4
Medlem
Inlägg: 141


Skicka PM
Tillexempel om du ska räkna något godtyckligt antal så kan en for-loop vara bra att använda (visserligen har du bara två eller tre). För att illustrera:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int count;
  6. int op;
  7. int integer;
  8. cout << "----------Minix84knare----------n";
  9. cout << "nHur mx86nga tal vill du anvx84nda?n";
  10. cout << "Antal: ";
  11. cin >> count;
  12. cout << "nVilket rx84knesx84tt vill du anvx84nda?nn";
  13. cout << "[1] +n";
  14. cout << "[2] -n";
  15. cout << "[3] *n";
  16. cout << "[4] /n";
  17. cout << "Ange: ";
  18. cin >> op;
  19. int total = 0;
  20.  
  21. /* kolla att indata är korrekt här */
  22. for (int i = 1; i <= count; i++)
  23. {
  24. cout << "nTal" << i << ": ";
  25. cin >> integer;
  26. if (i == 1)
  27. total = integer;
  28. else
  29. switch (op)
  30. {
  31. case 1:
  32. total += integer;
  33. break;
  34. case 2:
  35. total -= integer;
  36. break;
  37. case 3:
  38. total *= integer;
  39. break;
  40. case 4:
  41. total /= integer;
  42. break;
  43. }
  44. }
  45. switch (op)
  46. {
  47. case 1:
  48. cout << "Totala summan x84r: " << total << endl;
  49. break;
  50. case 2:
  51. cout << "Totala skillnaden x84r: " << total << endl;
  52. break;
  53. case 3:
  54. cout << "Totala produkten x84r: " << total << endl;
  55. break;
  56. case 4:
  57. cout << "Totala kvoten x84r: " << total << endl;
  58. break;
  59. }
  60. cin.get();
  61. cin.get();
  62. return 0;
  63. }


Kolla lite på det exemplet ser du var jag menar. Nu görs inmatningen för talet bara på ett ställe.

EDIT
Flyttade en liten förvirrande konstruktion.

-------------------------
Ingen sigantur!

Senast redigerad 22:26 - 27:e Februari 2007


Mulven 17:03 - 6:e Mars 2007 | Post #5
Medlem
Inlägg: 10


Skicka PM
Du har ingen felhantering om man skriver bokstäver hänger programmet sig. använd get().
Det går inte att dela med noll för då hänger också programmet.




NetNinja 20:11 - 6:e Mars 2007 | Post #6
Medlem
Inlägg: 116


Skicka PM
Om man ska göra en optimerad miniäknare så finns det ingenting bättre än denna koden:

  1. int main()
  2. {
  3. int tal1, tal2;
  4. char typ;
  5. cout<<"Mata in uträkning: ";
  6. cin<<tal1<<typ<<tal2;
  7. switch (typ){
  8. case '+':
  9. tal1+=tal2;
  10. break;
  11. case '-':
  12. tal1-=tal2;
  13. break;
  14. case '*':
  15. tal1*=tal2;
  16. break;
  17. case'/':
  18. tal1/=tal2;
  19. }
  20. cout<<"Svar: "<<tal1;
  21. return 0;
  22. }


Försökt komma på något sätt att göra så att man kan skriva in längre uträkningar (ex. 2+2+2), men kan inte komma på något...

-------------------------



Senast redigerad 20:12 - 6:e Mars 2007


Slash 20:30 - 6:e Mars 2007 | Post #7
Medlem
Inlägg: 141


Skicka PM
    Citat av NetNinja:
Om man ska göra en optimerad miniäknare så finns det ingenting bättre än denna koden:

Försökt komma på något sätt att göra så att man kan skriva in längre uträkningar (ex. 2+2+2), men kan inte komma på något...


Skrev faktiskt ihop en recursive descent-parser för just detta förr någon förmiddag när jag hade tråkigt. Tyvärr har jag inte fixat felhanteringen ordentligt (den är inte riktigt konsekvent överallt). Provkör den om du är intresserad: Kod!

Den ska klara basic artimetik (+, -, *, /, ^) samt paranterser och egendefinierade funktioner (av typen T function(T value)) där T är typen som du valt expression parsern att vara (double i exemplet). Så för double fungerar sin, cos, abs etc. i cmath utmärkt. ,,ven konstanter kan man definiera. Main-funktionen hittas längst ner.

EDIT. Ops, såg nu att jag har lagt till en grej fel. Rad 238 ska ju såklart vara "ep.addFunction("cos", cos); " och inget annat.

-------------------------
Ingen sigantur!

Senast redigerad 20:32 - 6:e Mars 2007


Sidor: 1

Forum huvudsida -> Programmering -> Kalkylator
Atom feed

Du får inte posta i den här tråden | Till toppen