2011-10-22 3 views
-1

J'ai un projet ici, je suis en train de résoudreImpossible d'obtenir une sortie correcte

http://webcache.googleusercontent.com/search?q=cache:M_EjCxt7T34J:acm.uva.es/archive/nuevoportal/data/problem.php%3Fp%3D2286+&cd=2&hl=en&ct=clnk&gl=us

Et le problème que j'ai est la sortie continue à sortir d'être un peu mal au lieu des deux derniers E1 c'est E4 et au milieu des zéros, il est supposé être 11F au lieu de quelque chose comme 12D ou quelque chose qui implique que c'est la plupart du temps la bonne chose mais je ne comprends pas ce qui ne va pas. Ça me rend dingue.

#include <vector> 
    #include <fstream> 
    #include <iostream> 
    #include <cstdlib> 

    using namespace std; 

    //int count = 0; 
    //GOOD 
    int hexToInt(vector<char>& c); 
    vector<char> intToHex(int n); 
    int hexToInt(char c){ 
     if(c>='A')return c-'A'+10; 
     else return c-'0'; 
    } 
    void execute(vector<char>& memory){ 
     // cout << "beb\n"; 

     char A = '0'; 
     char B = '0'; 
     if ((B>'9'&&B<'A')||(B<'0')||(B>'F')) cout << B << endl; 
     for(size_t i = 0; i<memory.size();i++){ 
      // cout << i << " "<< memory[i] <<endl; 
      // if(count<100){ 
     //  cout << i << " " << memory[i]<<" "<< A << " "<< B <<endl; 
      // count++; 
      //  cout << A << endl; 
      // cout << "I: "<< i<< " memory value: "<<memory[i]<<endl; 
      //} 
      vector<char> c; 
      if(memory[i]-'0' == 0){ 
       c.push_back(memory[i+1]); 
       c.push_back(memory[i+2]); 
       A = memory[hexToInt(c)]; 
       i+=2; 
      } 
      else if(memory[i] -'0' == 1){ 
       c.push_back(memory[i+1]); 
       c.push_back(memory[i+2]); 
       memory[hexToInt(c)] = A; 
       i+=2; 
      } 
      else if(memory[i] -'0' == 2){ 
       char temp = A; 
       A = B; 
       B = temp; 
      } 
      else if(memory[i] -'0' == 3){ 
       int tempy = hexToInt(A)+hexToInt(B); 
      // if (count<100) cout << tempy<< "aaa"<<endl; 
       c = intToHex(tempy); 
      // cout << "LOOK " <<tempy<< temp[0] << " "<<temp[1]<< " "<<A << " "<< B << endl; 
       //Questionable**** 
       A = c[1]; 
       B = c[0]; 
      } 
      else if(memory[i] -'0' == 4){ 
       if(A == 'F') A='0'; 
       else A +=1; 
      } 
      else if(memory[i] -'0' == 5){ 
       if(A == '0') A='F'; 
       else A -=1; 
      } 
      else if(memory[i] -'0' == 6){ 
       if(A=='0'){ 
        c.push_back(memory[i+1]); 
        c.push_back(memory[i+2]); 
        if(hexToInt(c)>=240) i+=2; 
        else i = hexToInt(c)-1; 
       } 
       else i+=2; 
      } 
      else if(memory[i] -'0' == 7){ 
       c.push_back(memory[i+1]); 
       c.push_back(memory[i+2]); 
       if(hexToInt(c)>=240) i+=2; 
       else i = hexToInt(c)-1; 
      // i+=2; 
      } 
      else /*if(memory[i] -'0' == 8)*/{ 
       if(i!=0) { 
       for(size_t b = 0; b<memory.size();b++) cout << memory[b]; 
       } 
       i = memory.size(); 
      // cout <<"yayyyy"; 
      } 
      if(memory[254]=='E'&& memory[64]=='1'&& memory[65]=='1'&& memory[66]=='F'&&memory[255]=='1')cout <<"fuuuu"; 
     // cout << memory[255]<<endl; 
     } 
     cout << endl; 
    } 

    int hexToInt(vector<char>& c){ 
     int ret = 0; 
     int place = 1; 
     for (int i = c.size()-1; i>=0; i--){ 
      if(c[i]>='A') ret= ret+place*(c[i]-'A'+10); 
      else ret= ret+place*(c[i]-'0'); 
      place*=16; 
     } 
     return ret; 
    } 
    //GOOD 
    vector<char> intToHex(int n){ 
     vector<char> ret; 
     int place = 16; 
     while (!(place/16>n)){ 
      int curr = n%place/(place/16); 
    //  if(count<100) cout<<n <<"bbb"<< curr << endl; 
      if(curr<10) ret.push_back('0'+curr); 
      else ret.push_back('A'+(curr-10)); 
      n-=curr; 
      place*=16; 
     } 
     while(ret.size()<2) ret.push_back('0'); 
    // if(count<100)cout << ret[0]<<ret[1]<<endl; 
     int low = 0; 
     int high = ret.size()-1; 
     while(low<high){ 
      char temp = ret[low]; 
      ret[low]=ret[high]; 
      ret[high]=temp; 
      high--; 
      low++; 
     } 
     return ret; 
    } 

    int main() { 
    // int a = 7; 
    // vector<char> b = intToHex(a); 
    // for(int i = 0; i<b.size();i++){ 
    //  cout << b[i]; 
    // } 
    // cout <<" " << hexToInt(b) << hexToInt('F')<< " "<< hexToInt('0') << endl; 
     //GOOD 
     ifstream ifs("test.txt"); 
     if(!ifs) cout << "wahh\n"; 
     vector<char> memory(256); 
     while(ifs>>memory[0]){ 
      // cout << "weh\n"; 
      for (size_t i = 1; i<memory.size();i++){ 
       ifs>>memory[i]; 
       cout<<memory[i]; 
      // cout << memory[i]; 
      } 
      cout<<endl; 
     // cout << endl; 
      execute(memory); 
     } 
    // vector<int> wtf(256); 
    // for(int i = 0; i<wtf.size();i++){ 
    //  cout << i << " "; 
    //  vector<char> temp = intToHex(i); 
    //  for(int d = 0; d<temp.size(); d++){ 
    //   cout <<temp[d]; 
    //  } 
    //  cout <<" "<< hexToInt(temp); 
    //  if(i<16) cout<< " "<<hexToInt(intToHex(i)[1]); 
    //  if(i!=hexToInt(intToHex(i)[1])) cout <<" HIOOOOOOOOOOOOOOOOOOOO"; 
    //  cout << endl; 
    // 
    // } 
     char c = 'A'+1; 
     cout << c; 
     system("PAUSE"); 
    } 
+0

Pourriez-vous essayer d'éditer toutes les choses de débogage, et d'expliquer votre algorithme? Avez-vous envisagé de faire un petit refactoring? –

+0

Que voulez-vous dire par refactoring? – mystycs

+0

http://www.refactoring.com –

Répondre

1

Vos codes d'opération INC et DEC sont erronés. Si vous regardez la table ASCII, vous voyez que 'A' ne suit pas '9', donc vous devez "sauter par-dessus" cet espace. La meilleure façon de le faire est de simplement convertir les chiffres hexadécimaux en nombre entier, d'incrémenter/décrémenter l'entier et de le reconvertir. Par exemple, votre opcode DEC pourrait ressembler à ceci:

int temp = hexToInt(A); 

if(temp == 0) 
    temp = 0xf; 
else 
    temp -= 1; 

vector<char> tempHex = intToHex(temp); 
A = tempHex.back(); 
+0

A fait 9 mais n'est-ce pas? http://www.asciitable.com/ – mystycs

+0

Ce serait bien si c'était comme ça mais non, après '9' suit ':' donc '('9' + 1) == ':'' et '(' A '- 1) ==' @ ''. Il y a toute une cargaison de caractères entre eux. – vstm

+0

Je ne vois pas cette erreur mais peut-être que nous sommes à quelque chose de différent? Dans l'hexagone A vient après 9 – mystycs

Questions connexes