Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# - Porozcinanie stringa na mniejsze cześci.

Marijusz44 17 Lut 2016 20:16 561 5
  • #1 17 Lut 2016 20:16
    Marijusz44
    Poziom 6  

    Witam.
    Problem przedstawię jak najprościej. Na studiach dostałem zadanie które polega na napisaniu programu konsolowego który po otrzymaniu łańcucha znaków (((1/3+2/3)*(2/8+4/3))/(3/9+1/9))*(2/3+3/5) ma obliczyć równanie. Problem polega na tym, że nie można obliczyć go na zasadzie 1/3 =0,33. Całe równanie ma być obliczane na ułamkach. Jest tu 8 ułamków, które trzeba jakoś inteligentnie wyciągnąć z tego łańcucha znaków, niestety nie mam pojęcia jak to zrobić, kombinowałem już za pomocą "splita" ale nie wiadomo po jakim znaku ma ucinać. Dodam, że program musi być w miarę uniwersalny bo nie wiadomo czy profesor na zaliczeniu nie zechce zmienić jakiejś części równania.

    0 5
  • #2 17 Lut 2016 20:47
    marcinj12
    Poziom 40  

    Ciekawy temat... Choć porozcinanie stringa to akurat najmniejszy problem. Całość można by obliczyć jedną linijką kodu, ale skoro to musisz zrobić na ułamkach, to pewnie musisz napisać własny "parser" równań.

    Sugeruję zacząć od stworzenia 4 dwuargumentowych metod podstawowych operacji na ułamkach, przy czym parametry przekazywane by były jako string, taki też typ byłby zwracany.

    Dodanie i odejmowanie - to kwestia rozbicia ułamka na licznik i mianownik - tu można użyć split'a - znalezienie NWW mianowników, przemnożenie liczników: licznik = licznik * NWW/mianownik, dodanie liczników, zastąpienie mianownika przez NWW... Mnożenie - wiadomo, dzielenie - mnożenie na krzyż. Jeśli dochodzi do tego skracanie ułamka, to dodatkowy kod...

    Potem trzeba by pewnie jakoś ustalić kolejność działań, uwzględniając nawiasy...

    0
  • #3 18 Lut 2016 07:19
    Marijusz44
    Poziom 6  

    działaniami na ułamkach wydaje mi się że sobie poradzę, gorzej z tym wyciągnięciem ułamków ze stringa np. u1.l =1 u1.m=3; u2.l= 2 i u2.m=5; itp.

    0
  • #5 19 Lut 2016 15:24
    wiesniak
    Poziom 31  

    Regex jest średnio pomocny, bo całość trzeba przeanalizować i wykonać w odpowiedniej kolejności (uwzględniając nawiasy).
    Widzę dwie drogi: kalkulator ze stosem. Czytamy znak po znaku (czy może wyraz po wyrazie, bo liczby są wieloznakowe), analizujemy znak i pracując ze stosem wykonujemy kolejne operacje. Przykładowo, jeśli przychodzi nawias otwierający, to odkładamy na stos. Jeśli przychodzi operator, to trzeba wziąć wartość ze stosu i wykonać operację między tą wartością, a następną wartością z wprowadzonego ciągu. Wynik trafia na stos. Nawias zamykający ściąga wartość ze stosu (powinna jakaś być), ściąga nawias otwierający, który powinien być na stosie i wrzuca z powrotem wartość. Generalnie trzeba to przemyśleć, ale to jest do zrobienia.
    Druga opcja to konwerter ze "zwykłego" zapisu na ONP. W zasadzie idea zbliżona do tego co wyżej, tylko wynik trzeba obliczyć po konwersji, a nie w trakcie.
    Opcja trzecia, wydaje mi się najciekawsza i w gruncie rzeczy najprostsza, to zbudować gramatykę i na jej podstawie parsować wyrażenie. Do gramatyki pod C# nadaje się biblioteka Antlr 4. Jak poszukasz, to znajdziesz przykłady użycia. A jak dobrze poszukasz, to i gotowy kalkulator ;]

    0