Pascal - operacja na danych

0

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.

0

Odwrotna notacja polska. Gotowe kody szybko znajdziesz.
Ew na wiki jest opis: http://pl.wikipedia.org/wiki/Odwrotna_notacja_polska

0

Dzis spedze pare godzin w pociagu to Ci to napisze :D .. chodzi tylko o dodawanie tych liczb nic wiecej?

0
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.

0

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?

0
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 tak 2-2-2?
Tak

0
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 tak 2-2-2?

Na to wygląda.. jak w działaniu występuje tylko jeden znak to wystarczy przeanalizować pokolei każdy znak w stringu ;)

0

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.
0

W dziale C++ zamieszaliśmy gotowe ONP, także w Delphi. Więc zobacz w historię mych postów a znajdziesz.

0

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.

0
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

0

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

0
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.

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1