Programovani C#, Zapocet 18.1. 2024

Cílem semináře je seznámit posluchače s jazykem C#, prostředím platformy .NET a tvorbou aplikací s grafickým uživatelským rozhraním. Předpokládají se znalosti objektově orientovaného programování.
AlesPapacek

Programovani C#, Zapocet 18.1. 2024

Příspěvek od AlesPapacek »

Zadání: Jednoduchý simulátor registrového stroje (register machine)

Registrový stroj je teoretický výpočetní model, který pozůstává z konečného množství registrů a programu ve formě sekvenčního seznamu instrukcí.

Registry
Registry jsou indexovány přirozenými čísly vzestupně od 0. Každý register drží jedno přirozené číslo. V teoretickém modelu může být toto číslo neomezeně velké, pro účely této úlohy ale můžete předpodkládat, že všechny hodnoty v průběhu výpočtu se vejdou do typu int.

Instrukce
Program je konečný seznam instrukcí. Instrukce jsou implicitně očíslovány vzestupně od 1. Pozor na rozdíl v číslování registrů a instrukcí! Uvažujeme následující 3 typy instrukcí.

Inkrement
Instrukce inkrementu má následující formát:
inc r t

kde inc je identifikátor instrukce, r je index registru a t je index instrukce. Provedení této instrukce znamená, že hodnota v registru r se zvýší o 1 a program skočí na instrukci s indexem t, tedy to bude instrukce která se má provést jako další.

Dekrement
Instrukce dekrementu má následující formát:
dec r t1 t2

kde dec je identifikátor instrukce, r je index registru a t1,t2 jsou indexy instrukcí. Provedení této instrukce znamená, že pokud je hodnota v registru r větší než 0, tak se zníží o 1 a program skočí na instrukci s indexem t1. Jinak program skočí na instrukci s indexem t2 (hodnota v registru r se nemění).

Zastavení
Instrukce zastavení má následující formát:
halt

Vykonáním této instrukce se běh registrového stroje úspěšně zastaví.

Při vykonávání instrukcí inc a dec se může stát, že stroj chce pokračovat na neexistující instrukci. V takovém případě dojde k chybovému zastavení stroje.

POZOR: K chybovému zastavení dojde jen když by se mělo na neexistující instrukci skutečně skočit. Samotná existence takového indexu v instrukcích programu nevadí.

Podobně k chybovému zastavení dojde i při přístupu k neexistujícímu registru.

Běh simulátoru
Aplikace dostane na příkazové řádce jeden parametr a to název souboru obsahující popis registrového stroje. Formát souboru je následující:

První řádek obsahuje N přirozených čísel oddělených mezerou. Ty reprezentují počáteční hodnoty v registrech stroje. Ten tedy bude mít N registrů.
Od druhého řádku dál je na každém řádku jedna instrukce ve formátu popsaném výše.
Vaším úkolem je načíst registrový stroj ze vstupního souboru, odsimulovat jeho běh, a po úspěšném zastavení stroje vypsat konečné hodnoty všech jeho registrů. Běh stroje vždy začíná vykonáním první instrukce (která má index 1). Hodnoty registrů se vypisují na standardní výstup na jeden řádek, oddělené právě jednou mezerou.

Pokud běh stroje skončí chybovým zastavením, aplikace na standardní výstup vypíše hlášku Erroneous halt! (a nevypisuje obsah registrů).

Ukázka běhu simulátoru
Pro následující program

0 1 2
dec 1 2 3
inc 0 1
dec 2 4 5
inc 0 3
halt
se registrový stroj úspešně zastaví s hodnotami registrů

3 0 0
Odpovědět

Zpět na „NPRG035 Jazyk C# a platforma .NET“