Не удается получить правильный вывод

#c #vector #hex

#c #вектор #шестнадцатеричный

Вопрос:

У меня есть проект, который я пытаюсь решить

http://webcache.googleusercontent.com/search ?q=cache:M_EjCxt7T34J:acm.uva.es/archive/nuevoportal/data/problem.php?p=2286 amp;cd=2amp;hl=enamp;ct=clnkamp;gl=us

И проблема, с которой я сталкиваюсь, заключается в том, что вывод продолжает получаться немного неправильным, вместо того, чтобы последние два были E1, это E4, а в середине нулей должно быть 11F, вместо этого это что-то вроде 12D или что-то в этом роде. это подразумевает, что он делает в основном правильные вещи, но я не понимаю.не понимаю, что не так. Это сводит меня с ума.

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

    using namespace std;

    //int count = 0;
    //GOOD
    int hexToInt(vector<char>amp; 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>amp; memory){
      //  cout << "bebn";

        char A = '0';
        char B = '0';
        if ((B>'9'amp;amp;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'amp;amp; memory[64]=='1'amp;amp; memory[65]=='1'amp;amp; memory[66]=='F'amp;amp;memory[255]=='1')cout <<"fuuuu";
        //  cout << memory[255]<<endl;
        }
        cout << endl;
    }

    int hexToInt(vector<char>amp; 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 << "wahhn";
        vector<char> memory(256);
        while(ifs>>memory[0]){
           // cout << "wehn";
            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");
    }
  

Комментарии:

1. Не могли бы вы попробовать отредактировать все отладочные материалы и объяснить свой алгоритм? Вы рассматривали возможность проведения небольшого рефакторинга?

2. Что вы подразумеваете под рефакторингом?

3. Это не работает. Вы имеете в виду сделать его аккуратнее?

Ответ №1:

Ваши коды операций INC и DEC неверны. Если вы посмотрите на ASCII-таблицу, вы увидите, что «A» не следует за «9», поэтому вам нужно «перепрыгнуть» этот пробел.

Лучший способ сделать это — просто преобразовать шестнадцатеричные цифры в целое число, увеличить / уменьшить целое число и преобразовать его обратно. Например, ваш DEC-код операции может выглядеть так:

 int temp = hexToInt(A);

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

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

Комментарии:

1. Было бы неплохо, если бы это было так, но нет, после ‘9’ следует ‘:’ так ('9' 1) == ':' и ('A' - 1) == '@' . Между ними целая куча символов.

2. Я не вижу этой ошибки, хотя, возможно, мы смотрим на что-то другое? В шестнадцатеричном A идет после 9