Rechenterm in string ausrechenen

  • geschlossen
  • C#

  • xparet0209
  • 3051 Aufrufe 16 Antworten

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

  • Rechenterm in string ausrechenen

    ich habe ein kleines problem
    und zwar liegt mir ein string vor, der einfache grundrechenarten beinhaltet
    z.b.:
    (1+-2)*(3+4/2)*(5+6*(7+8*9)+10)-(-3+5-8*(-5+2)/(3-5))

    nun versuche ich diesen string zu analysieren also vorher zu splitten und auszurechnen
    allerdings scheitere ich bei verschachtelten klammern
    und bei der punkt vor strich regel
    außerdem weiß ich noch nicht wie ich mit den vorzeichen umgehen soll

    könnte mir jmd ein paar tipps geben?
    mfg xparet0209
    [SIZE="4"][FONT="Comic Sans MS"]Ich knalle keine Menschen ab, sonder treffe die Hitbox eines Polygonmodells.[/FONT][/SIZE]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xparet0209 ()

  • Ich habe mal in Java einen Parser geschrieben, der Arithmetische Ausdrücke nach der Methode des Rekursiven Abstiegs analysiert und automatisch berechnet.

    Lies dir dazu mal den Artikel durch: Parser ? Wikipedia

    Prinzipiell wird der Ausdruck in atomare Elemente +,-, nummer, (, ), expression, Konstante, und Funktionen aufgeteilt. Rekursiv werden diese Symbole angeschaut und je nach match die entsprechende Berechnung durchgeführt.
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Man kann es sich (aus meiner Sicht) einfacher machen, wenn man über UPN (umgekehrte polnische Notation) dran geht. Da lösen sich solche Klammern sehr elegant auf (kenne ich von meinem HP-Taschenrechner). Ein nettes Beispiel findet sich hierActiveVB - Die Umgekehrte Polnische Notation
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...
  • also UPN hab ich erst letzte woche ein kleinen taschenrechner geschrieben^^
    aber wie "konvertiere" ich den string in UPN schreibweise?
    denn die eingabe soll halt ganz normal wie beim schreiben sein (prog ist für andere, die UPN wahrscheinlich nciht kennen)
    [SIZE="4"][FONT="Comic Sans MS"]Ich knalle keine Menschen ab, sonder treffe die Hitbox eines Polygonmodells.[/FONT][/SIZE]
  • UPN ist letztendlich kein Unterschied zu meinem Vorschlag, auch da brauchst du einen Parser der dir den String in seine Einzelteile zerlegt.

    UPN beschreibt doch nur wie der Baum letztendlich traversiert (nämlich postfix) wird oder erinner ich mich da falsch??
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • also bei einem upn rechner gibt man statt
    (1+2)*(3+4) ein
    1 2 + 3 4 + *
    dort kann ich super mit einem stack arbeiten und die operationen abarbeiten^^
    allerdings hab ihc das ja schon bzw. mein programm soll leichter verständlich sein
    und daher macht sich diese postfixnotation eher schlecht
    außer es gäbe ein möglichkeit die vom nutzer eingegebenen normale rechenterme
    in die postfix notation umzuwandel...
    [SIZE="4"][FONT="Comic Sans MS"]Ich knalle keine Menschen ab, sonder treffe die Hitbox eines Polygonmodells.[/FONT][/SIZE]
  • UPN beschreibt doch nur wie der Baum letztendlich traversiert (nämlich postfix) wird oder erinner ich mich da falsch??


    Nein, passt genau.

    außer es gäbe ein möglichkeit die vom nutzer eingegebenen normale rechenterme
    in die postfix notation umzuwandel...


    Genau das versuchen dir Zerd und wasawasa ja gerade vorzuschlagen, wenn ich das jetzt richtig herauslese. ;)

    Tja, wäre ganz praktisch gewesen wenn du die Sprache erwähnt hättest.


    C#, steht doch im Threadtitel...
  • Dem kann ich nur zustimmen.
    Das kleine Tutorial hinter meinem Link sollte auch die esten Schritte ermöglichen.
    Zudem sind es jetzt genug Informationen um sich den Rest zusammenzusuchen.
    Ein Frage bei Google mit "upn postfix parser c# t-60420.html" liefert ein Link.
    Dort finden sich sogar fertige Codebeispiele in Java und C#.
    Um nicht wieder Punkte unter meinem Namen zu haben, verlinke ich nicht direkt.
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...
  • also der parser an sich ist nicht das problem aber der string an isch liegt in normaler notation dar
    das heißt die rechenzeichen sind zwischen den zahlen und klammern
    wie wandle ich das denn um in postfix notation?

    meiner meinung nach müsste das ungefähr so gehen:
    1)
    operator zwischen speichern
    zahl2* -> stack
    operator verarbeiten

    * wenn zahl x ein klammer abschnitt ist, ermittle klammertiefe
    zähle schließende klammern bis klammertiefe
    das ist dann der komplette klammer term
    rechne den aus wie 1)

    dabei muss ich das glaub ich rekursiv aufrufen
    jetzt hab ich das problem mit der punkt vor stich regel...
    wie kann ich das lösen?
    [SIZE="4"][FONT="Comic Sans MS"]Ich knalle keine Menschen ab, sonder treffe die Hitbox eines Polygonmodells.[/FONT][/SIZE]
  • also der parser an sich ist nicht das problem aber der string an isch liegt in normaler notation dar das heißt die rechenzeichen sind zwischen den zahlen und klammern
    wie wandle ich das denn um in postfix notation?


    Das ist ja gerade die Aufgabe des Parsers. Er liefert dir aus dem in Standardnotation eingegebenen Term einen relativ einfach verarbeitbaren Term in UPN Notation.

    wie kann ich das lösen?


    Durch lesen ;)

    wasawasa schrieb:

    Ein Frage bei Google mit "upn postfix parser c# t-60420.html" liefert ein Link.
    Dort finden sich sogar fertige Codebeispiele in Java und C#.


    Wobei dir das eigentlich die Sache schon zu einfach macht, eigentlich reicht sollte dir dieser Ansatz reichen bzw. das "Wie" beantworten:

    Zerd schrieb:

    Prinzipiell wird der Ausdruck in atomare Elemente +,-, nummer, (, ), expression, Konstante, und Funktionen aufgeteilt. Rekursiv werden diese Symbole angeschaut und je nach match die entsprechende Berechnung durchgeführt.
  • Richtig, der Parser dient dazu den string so vorzubereiten wie du ihn brauchst (ob es jetzt UPN oder eine andere lösungsart ist).

    Die Tipps die wir dir gegeben haben müssten eigentlich reichen... wenn nicht schreib ich dir vielleicht morgen mal ein wenig pseudocode, aber dafür hab ich heute keine Zeit ;)

    Viel Spaß!!
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • mir war langweilig also hab ich einfach mal einen parser für einfache rechnungen geschrieben
    er kann mit klammern und +,-,*,/ umgehen
    kommas sind ganz normal wie um deutschen mit "," einzugeben


    die methode RechneString() aus liefert einen double wert zurück
    zuvor muss der eingegebene string nach "=" geslpittet werden

    allerdings ist der code eher schlecht kommentiert, was ich evt. noch verbessern werde
    das auffangen von exceptions habe ich mit eingebaut allerdings gibt das programm ncoh kein hinweis wenn ein fehler aufgetreten ist
    war mir noch zu aufwendig die fehlermeldungen zu schreiben
    achja da mir die standart split methoden nciht gefallen haben, hab ich meine split methoden selber geschrieben

    Quellcode

    1. //Überprüfen
    2. #region
    3. private void textBox_rechung_KeyDown(object sender, KeyEventArgs e)
    4. {
    5. textBox_rechung.BackColor = Color.Empty;
    6. if (e.KeyCode == Keys.Enter)
    7. {
    8. char TA = '=' ;
    9. char TB = '+';
    10. string[] TeilA = textBox_rechung.Text.Split(TA);
    11. if (RechneStringaus(TeilA[0], TB) == RechneStringaus(TeilA[1], TB))
    12. //if (Convert.ToDouble(Rechne.Berechne(TeilA[0])) == Convert.ToDouble(TeilA[1]))
    13. {
    14. textBox_rechung.BackColor = Color.Green;
    15. }
    16. else
    17. {
    18. textBox_rechung.BackColor = Color.Red;
    19. }
    20. }
    21. }
    22. private double RechneStringaus(string Str, char T)
    23. {
    24. char TC1 = '*' ;
    25. char TC2 = '/' ;
    26. char TD1 = '+' ;
    27. char TD2 = '-' ;
    28. double ergebnis = 0;
    29. try
    30. {
    31. ergebnis = Convert.ToDouble(Str);
    32. }
    33. catch (Exception)
    34. {
    35. //Klammern erkennen in term spalten
    36. string[] strArraystrArrayT = SplitStringKlammern(Str);
    37. //wenn die länge von strArrayT = 1 dann nach operatoren splitten, sonst für jedenterm RechneStringaus methode verwenden
    38. if (strArraystrArrayT.Length == 1)
    39. {
    40. #region
    41. try
    42. {
    43. switch (T)//nur so geschrieben
    44. {
    45. case '+':
    46. string[] strArrayplus = SplitStringPlus(strArraystrArrayT[0]);
    47. if (strArrayplus.Length != 1)
    48. {
    49. for (int a = 0; a < strArrayplus.Length; a++)
    50. {
    51. ergebnis += RechneStringaus(strArrayplus[a],TD1);
    52. }
    53. }
    54. else
    55. {
    56. ergebnis = RechneStringaus(strArrayplus[0], TD2);
    57. }
    58. break;
    59. case '-':
    60. string[] strArrayminus = SplitStringMinus(strArraystrArrayT[0]);
    61. if (strArrayminus.Length != 1)
    62. {
    63. for (int a = 0; a < strArrayminus.Length; a++)
    64. {
    65. if (a == 0)
    66. {
    67. ergebnis += RechneStringaus(strArrayminus[a], TD1);
    68. }
    69. else
    70. {
    71. ergebnis -= RechneStringaus(strArrayminus[a], TD1);
    72. }
    73. }
    74. }
    75. else
    76. {
    77. ergebnis = RechneStringaus(strArrayminus[0], TC1);
    78. }
    79. break;
    80. case '*':
    81. string[] strArraymal = SplitStringMal(strArraystrArrayT[0]);
    82. if (strArraymal.Length != 1)
    83. {
    84. for (int a = 0; a < strArraymal.Length; a++)
    85. {
    86. if (a == 0)
    87. {
    88. ergebnis += RechneStringaus(strArraymal[a], TC1);
    89. }
    90. else
    91. {
    92. ergebnis *= RechneStringaus(strArraymal[a], TC1);
    93. }
    94. }
    95. }
    96. else
    97. {
    98. ergebnis = RechneStringaus(strArraymal[0], TC2);
    99. }
    100. break;
    101. case '/':
    102. string[] strArraygeteilt = SplitStringGeteilt(strArraystrArrayT[0]);
    103. if (strArraygeteilt.Length != 1)
    104. {
    105. for (int a = 0; a < strArraygeteilt.Length; a++)
    106. {
    107. if (a == 0)
    108. {
    109. ergebnis += RechneStringaus(strArraygeteilt[a], TC2);
    110. }
    111. else
    112. {
    113. try
    114. {
    115. ergebnis *= 1 / RechneStringaus(strArraygeteilt[a], TC2);
    116. }
    117. catch (Exception ex)
    118. {
    119. Console.WriteLine("Fehler: "+ex);
    120. }
    121. }
    122. }
    123. }
    124. else
    125. {
    126. ergebnis = RechneStringaus(strArraygeteilt[0], TC2);
    127. }
    128. break;
    129. }
    130. }
    131. catch (Exception)
    132. {
    133. }
    134. #endregion
    135. }
    136. else//tritt nur ein wenn operator vor/nach klammer
    137. {
    138. // erst alles nach / und dann nach * danach nach - und dann nach +
    139. // am besten methode für rechenzeichen nach/vor klammern suchen
    140. // prüft ob / vor klammer und dann ob / nach klammer
    141. // prüft ob * vor klammer und dann ob * nach klammer usw...
    142. #region
    143. for (int a = 0; a < strArraystrArrayT.Length; a++)
    144. {
    145. char[] cArrayT = strArraystrArrayT[a].ToCharArray();
    146. string temp;
    147. if (OperatorVorKlammer(strArraystrArrayT[a], '/'))
    148. {
    149. if (OperatorNachKlammer(strArraystrArrayT[a], '/') && cArrayT.Length == 1)
    150. {
    151. // tritt ein wenn ...)/(...
    152. ergebnis += RechneStringaus(strArraystrArrayT[a - 1], TD1) / RechneStringaus(strArraystrArrayT[a + 1], TD1);
    153. }
    154. else
    155. {
    156. // .../(...
    157. cArrayT[cArrayT.Length - 1] = ' ';// sonderfall denn / bindet an nächsten term
    158. temp = new string(cArrayT);
    159. ergebnis += RechneStringaus(temp, TD1) / RechneStringaus(strArraystrArrayT[a + 1], TD1);
    160. a++;
    161. }
    162. }
    163. if (OperatorNachKlammer(strArraystrArrayT[a], '/'))
    164. {
    165. //...)/...
    166. temp = new string(cArrayT);
    167. string[] tempArr = new string[1];
    168. bool bindung, mal;
    169. if (SplitStringPlus(temp).Length != 1)//ermittelt ob die mit dem rechneoperator verbundenen zahl noch eine stärkere bindung zu etwas anderem hat
    170. {
    171. tempArr = SplitStringPlus(temp);
    172. bindung = true;
    173. mal = false;
    174. }
    175. else
    176. {
    177. if (SplitStringMinus(temp).Length != 1)
    178. {
    179. tempArr = SplitStringMinus(temp);
    180. bindung = true;
    181. mal = false;
    182. }
    183. else
    184. {
    185. if (SplitStringMal(temp).Length != 1)
    186. {
    187. tempArr = SplitStringMal(temp);
    188. bindung = true;
    189. mal = true;
    190. }
    191. else
    192. {
    193. tempArr[0] = temp;
    194. bindung = false;
    195. mal = false;
    196. }
    197. }
    198. }
    199. cArrayT = tempArr[0].ToCharArray();//nur den teil des term der an die klammer gebunden ist wird in ein cahr array gewandelt
    200. cArrayT[0] = ' ';
    201. temp = new string(cArrayT);
    202. strArraystrArrayT[a - 1] = (RechneStringaus(strArraystrArrayT[a - 1], TD1) / RechneStringaus(temp, TD1)).ToString();//die klammer und der bindene term ausgerechnet und auf speicherplatz von klammer gesetzt
    203. char[] tempCharArr = strArraystrArrayT[a].ToCharArray(); ;
    204. char[] cArrayT2;
    205. if (bindung)
    206. {
    207. cArrayT2 = new char[tempCharArr.Length - cArrayT.Length - 1];
    208. Array.Copy(tempCharArr, cArrayT.Length + 1, cArrayT2, 0, cArrayT2.Length);//kopiert den ehemaligen term in cArray und lässt dabei das bereits berrechnete weg
    209. }
    210. else
    211. {
    212. cArrayT2 = new char[tempCharArr.Length - cArrayT.Length];
    213. Array.Copy(tempCharArr, cArrayT.Length, cArrayT2, 0, cArrayT2.Length);//löscht bindenden term hinter der klammer, da er nicht mehr gebunden wird
    214. }
    215. temp = new string(cArrayT2);
    216. if (mal)
    217. {
    218. ergebnis += RechneStringaus(strArraystrArrayT[a - 1], TD1) * RechneStringaus(temp, TD1);
    219. }
    220. else
    221. {
    222. ergebnis += RechneStringaus(strArraystrArrayT[a - 1], TD1) + RechneStringaus(temp, TD1);
    223. }
    224. }
    225. //------------------------------------------------------
    226. if (OperatorVorKlammer(strArraystrArrayT[a], '*'))
    227. {
    228. if (OperatorNachKlammer(strArraystrArrayT[a], '*') && cArrayT.Length == 1)
    229. {
    230. // tritt ein wenn ...)*(...
    231. ergebnis += RechneStringaus(strArraystrArrayT[a - 1], TD1) * RechneStringaus(strArraystrArrayT[a + 1], TD1);
    232. }
    233. else
    234. {
    235. // ...*(...
    236. cArrayT[cArrayT.Length - 1] = ' ';// sonderfall denn * bindet an nächsten term
    237. temp = new string(cArrayT);
    238. ergebnis += RechneStringaus(temp, TD1) * RechneStringaus(strArraystrArrayT[a + 1], TD1);
    239. a++;
    240. }
    241. }
    242. if (OperatorNachKlammer(strArraystrArrayT[a], '*'))
    243. {
    244. //...)*...
    245. temp = new string(cArrayT);
    246. string[] tempArr = new string[1];
    247. bool bindung;
    248. if (SplitStringPlus(temp).Length != 1)//ermittelt ob die mit dem rechneoperator verbundenen zahl noch eine stärkere bindung zu etwas anderem hat
    249. {
    250. tempArr = SplitStringPlus(temp);
    251. bindung = true;
    252. }
    253. else
    254. {
    255. if (SplitStringMinus(temp).Length != 1)
    256. {
    257. tempArr = SplitStringMinus(temp);
    258. bindung = true;
    259. }
    260. else
    261. {
    262. tempArr[0] = temp;
    263. bindung = false;
    264. }
    265. }
    266. cArrayT = tempArr[0].ToCharArray();//nur den teil des term der an die klammer gebunden ist wird in ein cahr array gewandelt
    267. cArrayT[0] = ' ';// sonderfall denn * bindet an vorherigen term
    268. temp = new string(cArrayT);
    269. strArraystrArrayT[a - 1] = (RechneStringaus(strArraystrArrayT[a - 1], TD1) * RechneStringaus(temp, TD1)).ToString();//die klammer und der bindene term ausgerechnet und auf speicherplatz von klammer gesetzt
    270. char[] tempCharArr = strArraystrArrayT[a].ToCharArray(); ;
    271. char[] cArrayT2;
    272. if (bindung)
    273. {
    274. cArrayT2 = new char[tempCharArr.Length - cArrayT.Length - 1];
    275. Array.Copy(tempCharArr, cArrayT.Length + 1, cArrayT2, 0, cArrayT2.Length);//kopiert den ehemaligen term in cArray und lässt dabei das bereits berrechnete weg
    276. }
    277. else
    278. {
    279. cArrayT2 = new char[tempCharArr.Length - cArrayT.Length ];
    280. Array.Copy(tempCharArr, cArrayT.Length, cArrayT2, 0, cArrayT2.Length);//löscht bindenden term hinter der klammer, da er nicht mehr gebunden wird
    281. }
    282. temp = new string(cArrayT2);
    283. ergebnis += RechneStringaus(strArraystrArrayT[a - 1], TD1) + RechneStringaus(temp, TD1);
    284. }
    285. //------------------------------------------------------
    286. if (OperatorVorKlammer(strArraystrArrayT[a], '-'))
    287. {
    288. if (OperatorNachKlammer(strArraystrArrayT[a], '-') && cArrayT.Length == 1)
    289. {
    290. // tritt ein wenn ...)-(...
    291. ergebnis += RechneStringaus(strArraystrArrayT[a - 1], TD1) - RechneStringaus(strArraystrArrayT[a + 1], TD1);
    292. }
    293. else
    294. {
    295. // ...-(...
    296. cArrayT[cArrayT.Length - 1] = ' ';
    297. temp = new string(cArrayT);
    298. ergebnis += RechneStringaus(temp, TD1) - RechneStringaus(strArraystrArrayT[a + 1], TD1);
    299. a++;
    300. }
    301. }
    302. if (OperatorNachKlammer(strArraystrArrayT[a], '-'))
    303. {
    304. //...)-...
    305. cArrayT[0] = ' ';
    306. temp = new string(cArrayT);
    307. ergebnis += RechneStringaus(strArraystrArrayT[a - 1], TD1) - RechneStringaus(temp, TD1);
    308. }
    309. //------------------------------------------------------
    310. if (OperatorVorKlammer(strArraystrArrayT[a], '+'))
    311. {
    312. if (OperatorNachKlammer(strArraystrArrayT[a], '+')&& cArrayT.Length==1)
    313. {
    314. // tritt ein wenn ...)+(...
    315. ergebnis += RechneStringaus(strArraystrArrayT[a - 1], TD1) + RechneStringaus(strArraystrArrayT[a + 1], TD1);
    316. }
    317. else
    318. {
    319. // ...+(...
    320. cArrayT[cArrayT.Length - 1] = ' ';
    321. temp = new string(cArrayT);
    322. ergebnis += RechneStringaus(temp, TD1) + RechneStringaus(strArraystrArrayT[a + 1], TD1);
    323. a++;
    324. }
    325. }
    326. if (OperatorNachKlammer(strArraystrArrayT[a], '+'))
    327. {
    328. //...)+...
    329. cArrayT[0] = ' ';
    330. temp = new string(cArrayT);
    331. ergebnis += RechneStringaus(strArraystrArrayT[a - 1], TD1) + RechneStringaus(temp, TD1);
    332. }
    333. }
    334. #endregion
    335. }
    336. }
    337. return ergebnis;
    338. }
    339. private bool OperatorVorKlammer(string Str, char Operator)
    340. {
    341. char[] cArrayT = Str.ToCharArray();
    342. if (cArrayT[cArrayT.Length-1] == Operator)
    343. {
    344. return true;
    345. }
    346. else
    347. {
    348. return false;
    349. }
    350. }
    351. private bool OperatorNachKlammer(string Str,char Operator)
    352. {
    353. char[] cArrayT = Str.ToCharArray();
    354. if (cArrayT[0] == Operator)
    355. {
    356. return true;
    357. }
    358. else
    359. {
    360. return false;
    361. }
    362. }
    363. private string[] SplitStringKlammern(string Str)
    364. {
    365. string[] strArraystrArrayT = new string[1];
    366. //Klammern erkennen in term spalten
    367. #region
    368. char[] cArray = Str.ToCharArray();
    369. int Klammerauf = 0;
    370. int Klammerzu = 0;
    371. bool inKlammer = false;
    372. int counterT = 1;
    373. for (int a = 0; a < cArray.Length; a++)
    374. {
    375. if (cArray[a] == '(')
    376. {
    377. Klammerauf++;
    378. if (!inKlammer)//erzeugt neuen termabschnitt nach öffnender klammer
    379. {
    380. inKlammer = true;
    381. try
    382. {
    383. if (strArraystrArrayT[counterT - 1].Length != 0)//wenn das erste zeichen eine klammer ist wird kein neuer termabschnitt erzeugt
    384. {
    385. string[] temp = (string[])strArraystrArrayT.Clone();
    386. strArraystrArrayT = new string[strArraystrArrayT.Length + 1];
    387. temp.CopyTo(strArraystrArrayT, 0);
    388. counterT++;
    389. }
    390. }
    391. catch (Exception)
    392. {
    393. }
    394. }
    395. else
    396. {
    397. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArray[a].ToString();//aufgehende klammer innerhalb eines klammer abschnittes
    398. }
    399. }
    400. else
    401. {
    402. if (cArray[a] == ')')
    403. {
    404. Klammerzu++;
    405. if (Klammerauf == Klammerzu && Klammerauf != 0)//erzeugt neuen termabschnitt nach schließender klammer
    406. {
    407. if (a != cArray.Length - 1)//wenn die schließende klammer nicht das letzte zeichen ist
    408. {
    409. inKlammer = false;
    410. Klammerauf = 0;
    411. Klammerzu = 0;
    412. string[] temp = (string[])strArraystrArrayT.Clone();//
    413. strArraystrArrayT = new string[strArraystrArrayT.Length + 1];
    414. temp.CopyTo(strArraystrArrayT, 0);
    415. counterT++;
    416. }
    417. }
    418. else
    419. {
    420. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArray[a].ToString();//schließende klammer innerhalb eines klammer abschnittes
    421. }
    422. }
    423. else
    424. {
    425. if (cArray[a] != ' ')
    426. {
    427. if (!inKlammer)
    428. {
    429. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArray[a].ToString();//term außerhalb der klammer aufschreiben
    430. }
    431. else
    432. {
    433. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArray[a].ToString(); //term in klammer aufschreiben
    434. }
    435. }
    436. }
    437. }
    438. }
    439. #endregion
    440. return strArraystrArrayT;
    441. }
    442. private string[] SplitStringPlus(string Str)
    443. {
    444. string[] strArraystrArrayT = new string[1];
    445. int counterT = 1;
    446. char[] cArrayT = Str.ToCharArray();
    447. #region
    448. for (int a = 0; a < cArrayT.Length; a++)
    449. {
    450. if (cArrayT[a] == '+')
    451. {
    452. try
    453. {
    454. if (strArraystrArrayT[counterT - 1].Length != 0)//wenn das erste zeichen eine klammer ist wird kein neuer termabschnitt erzeugt
    455. {
    456. string[] temp = (string[])strArraystrArrayT.Clone();
    457. strArraystrArrayT = new string[strArraystrArrayT.Length + 1];
    458. temp.CopyTo(strArraystrArrayT, 0);
    459. counterT++;
    460. }
    461. else
    462. {
    463. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArrayT[a].ToString();
    464. }
    465. }
    466. catch (Exception)
    467. {
    468. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArrayT[a].ToString();
    469. }
    470. }
    471. else
    472. {
    473. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArrayT[a].ToString();
    474. }
    475. }
    476. #endregion
    477. return strArraystrArrayT;
    478. }
    479. private string[] SplitStringMinus(string Str)
    480. {
    481. string[] strArraystrArrayT = new string[1];
    482. int counterT = 1;
    483. char[] cArrayT = Str.ToCharArray();
    484. #region
    485. for(int a = 0; a<cArrayT.Length;a++)
    486. {
    487. if (cArrayT[a] == '-')
    488. {
    489. try
    490. {
    491. if (strArraystrArrayT[counterT - 1].Length != 0)//wenn das erste zeichen eine klammer ist wird kein neuer termabschnitt erzeugt
    492. {
    493. string[] temp = (string[])strArraystrArrayT.Clone();
    494. strArraystrArrayT = new string[strArraystrArrayT.Length + 1];
    495. temp.CopyTo(strArraystrArrayT, 0);
    496. counterT++;
    497. }
    498. else
    499. {
    500. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArrayT[a].ToString();
    501. }
    502. }
    503. catch (Exception)
    504. {
    505. }
    506. }
    507. else
    508. {
    509. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArrayT[a].ToString();
    510. }
    511. }
    512. #endregion
    513. return strArraystrArrayT;
    514. }
    515. private string[] SplitStringMal(string Str)
    516. {
    517. string[] strArraystrArrayT = new string[1];
    518. int counterT = 1;
    519. char[] cArrayT = Str.ToCharArray();
    520. #region
    521. for (int a = 0; a < cArrayT.Length; a++)
    522. {
    523. if (cArrayT[a] == '*')
    524. {
    525. string[] temp = (string[])strArraystrArrayT.Clone();
    526. strArraystrArrayT = new string[strArraystrArrayT.Length + 1];
    527. temp.CopyTo(strArraystrArrayT, 0);
    528. counterT++;
    529. }
    530. else
    531. {
    532. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArrayT[a].ToString();
    533. }
    534. }
    535. #endregion
    536. return strArraystrArrayT;
    537. }
    538. private string[] SplitStringGeteilt(string Str)
    539. {
    540. string[] strArraystrArrayT = new string[1];
    541. int counterT = 1;
    542. char[] cArrayT = Str.ToCharArray();
    543. #region
    544. for (int a = 0; a < cArrayT.Length; a++)
    545. {
    546. if (cArrayT[a] == '/')
    547. {
    548. string[] temp = (string[])strArraystrArrayT.Clone();
    549. strArraystrArrayT = new string[strArraystrArrayT.Length + 1];
    550. temp.CopyTo(strArraystrArrayT, 0);
    551. counterT++;
    552. }
    553. else
    554. {
    555. strArraystrArrayT[counterT - 1] = strArraystrArrayT[counterT - 1] + cArrayT[a].ToString();
    556. }
    557. }
    558. #endregion
    559. return strArraystrArrayT;
    560. }
    561. #endregion
    Alles anzeigen





    also wenn mir jmd erklären kann wie ich eine dll in ein c# projekt einbinde wäre es nett xDD
    [SIZE="4"][FONT="Comic Sans MS"]Ich knalle keine Menschen ab, sonder treffe die Hitbox eines Polygonmodells.[/FONT][/SIZE]

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von xparet0209 ()


  • also wenn mir jmd erklären kann wie ich eine dll in ein c# projekt einbinde wäre es nett xDD


    Theorie:

    Quellcode

    1. // Externe dll-Funktion Importieren
    2. [DllImport('Name.dll')]
    3. protected static extern int dll_Funktionsname(Datentyp Parametername);
    4. // Methode die es ermöglicht von C# aus auf die dll
    5. // zuzugreifen
    6. public int Funktionsname_in_C_sharp()
    7. {
    8. return dll_funktionsname(Übergabeparamter);
    9. }


    Praxis:

    Quellcode

    1. // using System.Runtime.InteropServices;
    2. [DllImport('kernel32.dll')]
    3. public static extern bool Beep(int Frequenz, int Dauer);
    4. // gibt einen Alarmton aus
    5. private void Alarm()
    6. {
    7. for (int i = 0; i < 3; i++)
    8. {
    9. Beep(500, 1000);
    10. Beep(1000, 1000);
    11. }
    12. }
    13. // gibt einen einfachen beep aus
    14. private void Beep()
    15. {
    16. Beep(1000, 1000);
    17. }
    Alles anzeigen
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...