Advertisement
Tues

Versuch

May 25th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.98 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Zeilenrechner
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. String[] terms = new string[] { "(1+2*3)", "2*3", "1+2*3", "1.5+2.5", "4.4/1.2" };
  14.  
  15. try
  16. {
  17. foreach (String term in terms)
  18. {
  19. Console.Write("Berechnung des Terms '");
  20. Console.Write(term);
  21. Console.Write("' = ");
  22. double d = Berechne(term);
  23. Console.Write(d);
  24. Console.Write("\r\n");
  25. }
  26. }
  27. catch (Exception ex)
  28. {
  29. Console.Write("\r\n");
  30. Console.Write("Der folgende Fehler in dem Term wurde gefunden: ");
  31. Console.Write(ex.Message);
  32. }
  33.  
  34. Console.ReadKey();
  35. }
  36.  
  37. public static double Berechne(string term)
  38. {
  39. double result = 0.0;
  40. double a = 0.0;
  41. double b = 0.0;
  42. double c = 0.0;
  43.  
  44. // operatoren reihenfolge prüfen (. vor -)
  45. char ersterOperator = ' ';
  46. char zweiterOperator = ' ';
  47.  
  48. bool klammerAuf = false;
  49.  
  50. string tmpZahlStr = "";
  51.  
  52. char offeneKlammer = ' ';
  53. char geschlosseneKlammer = ' ';
  54.  
  55. // zahlen und operatoren finden und speichern
  56. for (int i = 0; i < term.Length; i++)
  57. {
  58. if (ersterOperator == ' ')
  59. { // noch kein operator erkannt also befinden wir uns in der ersten operation des terms
  60. if (term[i] == '+' || term[i] == '-' || term[i] == '*' || term[i] == '/')
  61. { // wenn char ein operator oder eine klammer, dann als ersten Speichern
  62. if (i == 0)
  63. { // erste stelle ist ein operator!
  64. throw new Exception("Es darf kein Operator am Anfang des Terms stehen!");
  65. }
  66. a = Convert.ToDouble(tmpZahlStr); // erste zahl speichern
  67. tmpZahlStr = ""; // reset tmp var
  68.  
  69. ersterOperator = term[i];
  70. }
  71. else
  72. { // kein operator also erste zahl
  73. tmpZahlStr += term[i];
  74. }
  75. //ZULETZT DAS PROBLEM MIT DEM KLAMMERN ANGEGANGEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  76. if (term[i] == '(')
  77. {
  78. offeneKlammer = term[i];
  79. }
  80. else if (term[i] == ')')
  81. {
  82. geschlosseneKlammer = term[i];
  83. }
  84. }
  85. else if (zweiterOperator == ' ')
  86. { // hat bereits einen operator -> nach weiterem suchen
  87. if (term[i] == '+' || term[i] == '-' || term[i] == '*' || term[i] == '/')
  88. {
  89. b = Convert.ToDouble(tmpZahlStr); // erste zahl speichern
  90. tmpZahlStr = ""; // reset tmp var
  91.  
  92. zweiterOperator = term[i];
  93. }
  94. else
  95. { // kein operator also zweite zahl
  96. tmpZahlStr += term[i];
  97.  
  98. // hat keine weiteren zeichen also zweite zahl komplett
  99. if (i == (term.Length - 1))
  100. {
  101. b = Convert.ToDouble(tmpZahlStr); // erste zahl speichern
  102. tmpZahlStr = ""; // reset tmp var
  103. }
  104. }
  105. }
  106. else
  107. { // hat zweiten operator bereites also ist der rest die letzte zahl
  108. tmpZahlStr += term[i];
  109.  
  110. // hat keine weiteren zeichen also zweite zahl komplett
  111. if (i == (term.Length - 1))
  112. {
  113. c = Convert.ToDouble(tmpZahlStr); // erste zahl speichern
  114. tmpZahlStr = ""; // reset tmp var
  115. }
  116. }
  117. }
  118.  
  119. // berechnen
  120. if (zweiterOperator != ' ')
  121. { // hat zweiten operator
  122. if ((ersterOperator == '+' || ersterOperator == '-') && (zweiterOperator == '*' || zweiterOperator == '/'))
  123. { // punkt vor strich fall tritt ein
  124. switch (zweiterOperator)
  125. {
  126. case '*':
  127. result += b * c;
  128. break;
  129. case '/':
  130. if (c == 0)
  131. { // teilen durch null nicht möglich
  132. throw new Exception("Teilen durch Null nicht möglich");
  133. }
  134.  
  135. result += b / c;
  136. break;
  137. }
  138.  
  139. switch (ersterOperator)
  140. {
  141. case '+':
  142. result += a * b;
  143. break;
  144. case '-':
  145. result += a / b;
  146. break;
  147. }
  148. }
  149. else
  150. { // normale rechnung
  151. switch (ersterOperator)
  152. {
  153. case '+':
  154. result += a * b;
  155. break;
  156. case '-':
  157. result += a / b;
  158. break;
  159. case '*':
  160. result += a * b;
  161. break;
  162. case '/':
  163. if (b == 0)
  164. { // teilen durch null nicht möglich
  165. throw new Exception("Teilen durch Null nicht möglich");
  166. }
  167.  
  168. result += a / b;
  169. break;
  170. }
  171.  
  172. switch (zweiterOperator)
  173. {
  174. case '+':
  175. result += b * c;
  176. break;
  177. case '-':
  178. result += b / c;
  179. break;
  180. case '*':
  181. result += b * c;
  182. break;
  183. case '/':
  184. if (c == 0)
  185. { // teilen durch null nicht möglich
  186. throw new Exception("Teilen durch Null nicht möglich");
  187. }
  188.  
  189. result += b / c;
  190. break;
  191. }
  192. }
  193. }
  194. else
  195. { // keinen zweiten operator
  196. switch (ersterOperator)
  197. {
  198. case '+':
  199. result += a + b;
  200. break;
  201. case '-':
  202. result += a - b;
  203. break;
  204. case '*':
  205. result += a * b;
  206. break;
  207. case '/':
  208. if (b == 0)
  209. { // teilen durch null nicht möglich
  210. throw new Exception("Teilen durch Null nicht möglich");
  211. }
  212.  
  213. result += a / b;
  214. break;
  215. }
  216. }
  217.  
  218. return result;
  219.  
  220. }
  221. }
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement