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.