Skocz do zawartości

[C++] Kalkulator całkowitoliczbowy


cinek68

Rekomendowane odpowiedzi

Witam,

mam do zrobienia takie zadanie na jutro a jesatem początkujący w programowaniu i niezbyt wiem co z tym zrobić, liczę na waszą pomoc :) Interesuje mnie wersja podstawowa zadania.

 

 

 

KALKULATOR CAŁKOWITOLICZBOWY

Zadanie polega na symulacji działania programowalnego kalkulatora całkowitoliczbowego. Instrukcje dla kalkulatora podawane są w specjalnym języku PPCALC, a wszyskie operacje wykonywane są w ciele Galois GF(p) (na liczbach całkowitych ze zbioru {0,...,p-1}, gdzie p jest liczbą pierwszą). Program będący rozwiązaniem zadania powinien odczytać parametry kalkulatora, oraz kod programu w PPCALC-u, a następnie przeprowadzić symulację jego działania (należy przyjąć, że podany program jest poprawny). Kalkulator pozwala na wykonywanie pewnych operacji arytmetycznch oraz dysponuje pamięcią.

 

Zadanie składa się z części obowiązkowej (podstawowej) oraz nieobowiązkowej - dla chętnych (rozszerzonej).

 

 

Opis danych wejściowych

Najpierw podane są parametry kalkulatora:

 

  • 2 <= p < 232,
  • mem - liczba komórek pamięci kalkulatora (początkowo wartości we wszystkich komórkach pamięci są ustawione na 0).
Dla wersji podstawowej mem=4.

 

Następnie podany jest program w PPCALC-u. Program składa się z wierszy, a każdy wiersz może być:

 

  • instrukcją przypisania
  • instrukcją PRINT
  • deklaracją etykiety (tylko wersja rozszerzona)
  • instrukcją skoku (tylko wersja rozszerzona)
Ostatnim wierszem każdego programu jest:

END

 

Instrukcja przypisania ma postać:

$[numer komórki pamięci] [operator] [liczba]

 

lub:

$[numer komórki pamięci] [operator] $[numer komórki pamięci]

 

Instrukcja PRINT ma postać:

PRINT $[numer komórki pamięci]

 

Deklaracja etykiety ma postać:

:[label name]

 

Instrukcją skoku ma postać:

JMPNZ $[numer komórki pamięci] [label name]

skok następje tylko w przypadku, gdy wartość we wskazanej komórce pamięci jest różna od zera.

 

[numer komórki pamięci] - to liczba num, że 0 <= num < mem.

 

[label name] - to nazwa etykiety składająca się z nie więcej niż 8 liter.

 

[operator] - oznacza jeden z dostępnych operatorów:

 

  • += działanie w grupie addytywnej (suma modulo p - w komórce docelowej powinna znaleźć się reszta z dzielenia przez p sumy zawartości komórki docelowej i drugiego argumentu),
  • *= działanie w grupie multiplikatywnej (iloczyn modulo p - w komórce docelowej powinna znaleźć się reszta z dzielenia przez p iloczynu zawartości komórki docelowej i drugiego argumentu),
  • ^= potęgowanie (wielokrotne działanie grupy multiplikatywnej) - w komórce docelowej powinna znaleźć się reszta z dzielenia przez p zawartości komórki docelowej podniesiona do drugiego argumentu,
  • -= działanie odwrotne w grupie addytywnej (różnica modulo p - - w komórce docelowej powinna znaleźć się reszta z dzielenia przez p różnicy zawartości komórki docelowej i drugiego argumentu),
  • /= działanie odwrotne w grupie multiplikatywnej (tylko wersja rozszerzona).

Opis danych wyjściowych

Dla każdej instrukcji PRINT powinna zostać wyświetlona jedna liczba, która znajduje się w żądanej komórce pamięci.

 

 

Przykład 1

Input:

7 4

$1 += 1

$1 *= 2

$1 *= 3

PRINT $1

$1 *= 4

PRINT $1

$2 -= 2

PRINT $2

$1 ^= $2

PRINT $1

END

 

Output:

6

3

5

5

 

Przykład 2 (dla wersji rozszerzonej)

Input:

7 4

$1 += 1

$2 += 1

$3 += 5

:next

$0 -= $0

$0 += $1

$1 -= $1

$1 += $2

$2 += $0

$3 -= 1

JMPNZ $3 next

PRINT $2

END

 

Output:

6

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm... napisanie języka skryptowego w jeden dzień nie jest łatwym zadaniem. Powiedz, co umiesz, a ja postaram ci się pomóc :P . Przede wszystkim - Ten "język " interpretuje pliki z tymi poleceniami, tak? Dobra, zakładamy, że znasz przydatne w C++ funkcje ze standardowych bibliotek no i mniej więcej składnię. Najpierw zajmij się odczytem pliku. Będę dawał pseudokod.

otwórz plik 'skrypt.txt'
dopóki ( nie jest koniec pliku )
  odczytaj linię
  parsuj linię

Funkcja parsuj będzie interpretowała konkretną linię. Najpierw jednak należy odczytywać poszczególne parametry i nazwy funkcji / poleceń. Przyda się więc funkcja, której pierwszym argumentem będzie linia, a drugiej numer (0 - n-1) parametru. Dla tekstu 'hej1 luk ha h' i numeru 2, funkcja zwróci 'luk'. Pseudokod:

dla ( i jest równe 0; i jest mniejsze długość linii; zwiększ i o jeden )
  odczytaj i - ty znak linii
  jeśli ( znak jest równy spacji )
    a równa się pustemu łańcuchowi
    b zwiększa się o jeden
      jeśli ( b jest równe numer )
        zwróć a
  w przeciwnym razie
    a zwiększa się o znak

Teraz trzeba sprawdzić za pomocą tej funkcji pierwszy argument linii - nazwę polecenia, ew. nazwę zmiennej, np.:

jeśli ( pierwszy znak pierwszego argumentu linii jest równy '$' )
  zmienna jest równa od drugiego do ostatniego znaku linii
  jeśli ( znajdź zmienną jest równe - 1 )
    jeśli ( drugi argument jest równy '=' )
      dodaj zmienną zmienna argument trzeci
    w przeciwnym razie 
      wyświetl 'Nie ma takiej komórki!'
  w przeciwnym razie
    operacja na zmiennej argument pierwszy drugi trzeci
...

Ciąg dalszy za chwilę - idę zjeść kolację :) .

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...