Witam
Mam za zadanie napisać w Pascalu program, który wykona coś takiego:
DANE:='2351; 4410; 104*1';
WYNIK:='11;18;15';
Kompletnie nie wiem jak się do tego zabrać. ;/
Ps. Na moim kierunku studiów programowanie jest tylko przez ten rok, nie zamierzam zostawać programistą, dlatego jeśli nie można tego wytłumaczyć t zadowolę się gotowym kodem z małym komentarzem.
Czekam na Waszą pomoc.
Odwrotna notacja polska. Gotowe kody szybko znajdziesz.
Ew na wiki jest opis: http://pl.wikipedia.org/wiki/Odwrotna_notacja_polska
Dzis spedze pare godzin w pociagu to Ci to napisze :D .. chodzi tylko o dodawanie tych liczb nic wiecej?
Arthan napisał(a)
Dzis spedze pare godzin w pociagu to Ci to napisze :D .. chodzi tylko o dodawanie tych liczb nic wiecej?
Generalnie ma być wybór (przynajmniej tak zrozumiałam), czy dodać, czy odjąć, czy pomnożyć. Ale jak będzie na samo dodawania to i tak będzie super.
I musi być opcja wprowadzania różnch danych, te które podałam to tylko przykładowe do sprawdzenia czy działa.
Aha, czyli zamiast gwiazdki ma być po prostu jakaś operacja, np.jak ktoś wybierze dodawanie to z 2*2*2
zrobi się 2+2+2
, a dla odejmowania tak 2-2-2
?
Patryk27 napisał(a)
Aha, czyli zamiast gwiazdki ma być po prostu jakaś operacja, np.jak ktoś wybierze dodawanie to z
2*2*2
zrobi się2+2+2
, a dla odejmowania tak2-2-2
?
Tak
Patryk27 napisał(a)
Aha, czyli zamiast gwiazdki ma być po prostu jakaś operacja, np.jak ktoś wybierze dodawanie to z
2*2*2
zrobi się2+2+2
, a dla odejmowania tak2-2-2
?
Na to wygląda.. jak w działaniu występuje tylko jeden znak to wystarczy przeanalizować pokolei każdy znak w stringu ;)
Jedno z rozwiązań:
{$APPTYPE CONSOLE}
(* Uwaga : program obsługuje wyłącznie liczby całkowite!
Uwaga 2: mogą być problemy z liczbami ujemnymi!
*)
Program Test;
Uses SysUtils;
Var Res, A : Integer;
Tmp, Expr: String;
Chr : Char;
Begin
Expr := '1*2*3'; // Wyrażenie, które będziemy obliczać
Chr := '+'; // '*' zostanie zamieniona na ten znak
(* ----- *)
Res := 0; //Wynik; póki co zerowy, ponieważ nie zaczęliśmy obliczeń
if (Chr = '*') Then
Res := 1; //Jeżeli mnożymy, to musimy najpierw ustawić wynik na 1, inaczej zawsze byłoby mnożenie przez zero, więc wynik zawsze byłby zerem
Expr := StringReplace(Expr, '*', Chr, [rfReplaceAll]); // Zamieniamy wszystkie '*' na wartość ze zmiennej 'Char'
While (True) Do //Dopóki "true == true" powtarzaj (nieskończona pętla)
Begin
if (Expr = '') Then //Jeżeli wyrażenie jest już puste to...
Break; //...wychodzimy z pętli
Tmp := Copy(Expr, 1, Pos(Chr, Expr)-1); // Chcemy tylko liczbę, bez znaku
Delete(Expr, 1, Pos(Chr, Expr)); //Usuwamy fragment wyrażenia
if (Tmp = '') Then //Jeżeli nie ma już żadnego znaku (pozostała tylko liczba), to...
Begin
Tmp := Expr; //...nie kopiujemy od 1 do znaku, ponieważ go nie ma, a że została tylko liczba, więc możemy ją bezpośrednio przypisać do tej zmiennej
Expr := ''; //Czyścimy wyrażenie
End;
if (Not TryStrToInt(Tmp, A)) Then //Jeżeli nie udało się zamienić na liczbę...
WriteLn('Blad: niewlasciwa liczba '''+Tmp+'''') Else //...to wywalamy błąd
Begin //...a jeżeli udało się, to idziemy dalej
Case Chr Of //jeżeli Chr jest równe...
'+': Res := Res + A; //'+' to dodajemy
'-': Res := Res - A; //'-' do odejmujemy
'*': Res := Res * A; //'*' to mnożymy
'/': Res := Res Div A; //'/' to dzielimy, lecz wynik musi być liczbą całkowitą (stąd użycie 'div')
End;
End;
End;
(* ----- *)
WriteLn(Res); //Wyświetlenie wyniku
ReadLn; //Oczekiwanie na enter
End.
W dziale C++ zamieszaliśmy gotowe ONP, także w Delphi. Więc zobacz w historię mych postów a znajdziesz.
on chce tylko zrobić jedną wybraną operację, a wy mu czołg dajecie. robisz sobie tablice funkcji dwuargumentowych które obliczają sumę, różnicę, iloczyn i co tam jeszcze chcesz.
używając operacji: copy,pos,delete wyciągaj fragment stringa aż do # lub do końca, i wyciągnięty fragment przekaż do innej funkcji która z kolei dzieli stringa po * i usuwa białe znaki. powinieneś w wyniku otrzymać liczby na których masz wykonać daną operacją.
A propos to do takich rzeczy C++ sprawuje się tysiące razy lepiej.
Patryk27 napisał(a)
Jedno z rozwiązań:
{$APPTYPE CONSOLE}
(* Uwaga : program obsługuje wyłącznie liczby całkowite!
Uwaga 2: mogą być problemy z liczbami ujemnymi!
*)
Program Test;
Uses SysUtils;
Var Res, A : Integer;
Tmp, Expr: String;
Chr : Char;
Begin
Expr := '1*2*3'; // Wyrażenie, które będziemy obliczać
Chr := '+'; // '*' zostanie zamieniona na ten znak
(* ----- *)
Res := 0; //Wynik; póki co zerowy, ponieważ nie zaczęliśmy obliczeń
if (Chr = '*') Then
Res := 1; //Jeżeli mnożymy, to musimy najpierw ustawić wynik na 1, inaczej zawsze byłoby mnożenie przez zero, więc wynik zawsze byłby zerem
Expr := StringReplace(Expr, '*', Chr, [rfReplaceAll]); // Zamieniamy wszystkie '*' na wartość ze zmiennej 'Char'
While (True) Do //Dopóki "true == true" powtarzaj (nieskończona pętla)
Begin
if (Expr = '') Then //Jeżeli wyrażenie jest już puste to...
Break; //...wychodzimy z pętli
Tmp := Copy(Expr, 1, Pos(Chr, Expr)-1); // Chcemy tylko liczbę, bez znaku
Delete(Expr, 1, Pos(Chr, Expr)); //Usuwamy fragment wyrażenia
if (Tmp = '') Then //Jeżeli nie ma już żadnego znaku (pozostała tylko liczba), to...
Begin
Tmp := Expr; //...nie kopiujemy od 1 do znaku, ponieważ go nie ma, a że została tylko liczba, więc możemy ją bezpośrednio przypisać do tej zmiennej
Expr := ''; //Czyścimy wyrażenie
End;
if (Not TryStrToInt(Tmp, A)) Then //Jeżeli nie udało się zamienić na liczbę...
WriteLn('Blad: niewlasciwa liczba '''+Tmp+'''') Else //...to wywalamy błąd
Begin //...a jeżeli udało się, to idziemy dalej
Case Chr Of //jeżeli Chr jest równe...
'+': Res := Res + A; //'+' to dodajemy
'-': Res := Res - A; //'-' do odejmujemy
'*': Res := Res * A; //'*' to mnożymy
'/': Res := Res Div A; //'/' to dzielimy, lecz wynik musi być liczbą całkowitą (stąd użycie 'div')
End;
End;
End;
(* ----- *)
WriteLn(Res); //Wyświetlenie wyniku
ReadLn; //Oczekiwanie na enter
End.
Bardzo dziękuję za próbę pomocy jednak mój kompilator( taki jak na zajęciach) freepascal nie chce tego kodu skompilować. próbowałam różnych modyfikacji ale nijak nie chce zadziałać. Jeszcze raz dziękuję za pomoc.
krwq napisał(a)
propos to do takich rzeczy C++ sprawuje się tysiące razy lepiej.
Możliwe, ale ja mam zajęcia na freepascalu
zamień integer na longint
a na przyszłość to nie pisz, że się nie kompiluje, napisz czemu!
kompilator zwykle dość jednoznacznie wskazuje rodzaj i miejsce błędu ,
tu narzeka że typ parametru przekazywanego przez zmienną nie jest zgodny
nie rozumiesz angielskiego to przepisz na forum nie rozumiejąc
Xitami napisał(a)
zamień integer na longint
a na przyszłość to nie pisz, że się nie kompiluje, napisz czemu!
kompilator zwykle dość jednoznacznie wskazuje rodzaj i miejsce błędu ,
tu narzeka że typ parametru przekazywanego przez zmienną nie jest zgodny
nie rozumiesz angielskiego to przepisz na forum nie rozumiejąc
Teraz program kompiluje się, nie pojawiają się komunikaty o błędach. Jednak kiedy uruchamiam program to nic się nie dzieje. Mam samo okno i nie mogę nic wpisać, a nic się nie wyświetla.
ten program?
http://4programmers.net/Forum/Delphi_Pascal/187999-pascal_-_operacja_na_danych?p=788626#id788626
ale jakiś wynik się wyświetla?
popatrz na pierwszy wiersz po begin
wyrażenie wpisane jest na stałe, możesz zamienić na readln