Zápočtový test 5.2.2009

Petr123 at 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.