# Zápočtový test 5.2.2009

<{ForumPost(poster="Petr123", timestamp=2009-02-05 20:13:25)}>
Dneska přišel sám pan Bednárek.  
**Zadání:** Naprogramujte emulátor procesoru (tak něco). Zadal nějaké instrukce a co dělají a měli jsme na to 3 hodiny.  

    ADD 3 6 // k registru 3 pricte registr 6
    SUB 3 6 // odecte
    MOV 3 6 // do registru 3 presune registr 6
    SET 3 729 // do registru 3 zapise 729
    JZ 3 11 // if(R3 == 0) goto radek 11
    JNZ 3 12 // if(R3 != 0) goto radek 12
    

ještě řekl něco jako že čísla skoky řádků jsou kladná a SET může přiřadit číslo 0<=maxint.  
Registrů je osm číslované od 0 do 7.  
  
Ještě řekl, že vstup můžeme považovat za korektní, žádné prázdné řádky atd.  
  
pak nam zadal priklad na kterem to testoval

    SET 4 10
    SET 1 1
    SET 2 1
    MOV 3 1
    MOV 1 2
    ADD 2 3
    SET 3 1
    SUB 4 3
    JNZ 4 4
    

Bylo na to 3 hodiny času, já odešel po hodině. Dost lidí odešlo +- po hodině, ale nevím asi méně jak půlka tam po mě ještě zůstala.  
  
Moje řešení:

    // test.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <vector>
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <algorithm>
    
    using namespace std;
    
    class Program {
    private:vector<int> reg;vector<string> ins;int rad;
    public:Program() {}~Program() {reg.clear(); ins.clear();}void priprav(string vstup) {rad = 0;for(int i = 0; i < 8; ++i){reg.push_back(0);}ifstream fin(vstup.c_str());if(fin.fail())cout << "chyba" << endl;string s;while(getline(fin, s)){ins.push_back(s);}fin.close();}void spust() {bool konec = false;string buf;//string instrukce;string::iterator b, e;while(!konec) {buf = ins[rad++];b = e = buf.begin();e = find( b, buf.end(), ' ');string instrukce(b, e);int par1, par2;b = ++e;e = find( b, buf.end(), ' ');par1 = strtol( string(b,e).c_str(), 0, 10);b = ++e;e = find( b, buf.end(), ' ');par2 = strtol( string(b,e).c_str(), 0, 10);
    if(instrukce == "SET") {reg[par1] = par2;}else if(instrukce == "MOV") {reg[par1] = reg[par2];}else if(instrukce == "ADD") {reg[par1] += reg[par2];}else if(instrukce == "SUB") {reg[par1] -= reg[par2];}else if(instrukce == "JZ") {if(reg[par1] == 0)rad = par2 - 1;}else if(instrukce == "JNZ") {if(reg[par1] != 0)rad = par2 - 1;}/*for(int i = 0; i < 8; ++i){cout << reg[i] << " ";}cout << endl;*/if(rad >= ins.size()){konec = true;for(int i = 0; i < 8; ++i){cout << reg[i] << " ";}cout << endl;}}
    }
    };
    
    int main( int argc, char* * argv)
    {vector<string> arg( argv, argv + argc);if (arg.size() > 0){string sv = arg[1];Program program;program.priprav(sv);program.spust();}
    return 0;
    }
    
    
    

Akorád se mu nelíbilo, že v spust() mám string buf a kopíruju do něj string. Lepší by prý bylo pointer, ale uznal mi to i tak.  
  
Jinak atmosféra lepší jak na C#, internet jsme směli používat pro nápovědu, jen jsme nesměli použít přítele na interneu :) nebyl třeba.  
  
Ještě Bednárek říkal, že to bbylo nějaké jednoduché :), když po hodině byla víc jak půlka třídy pryč :)  
  
Někdo používal dědičnost. Bednárkovi se líbil stringstream.
<{/ForumPost}>

