2016-02-20 7 views
0

Я включил программу, в которой у меня возникла логическая проблема. Программа основана на алгоритме кабины, и я добавил его фрагмент. В этом «рабочем» фрагменте десятичное число принимается от пользователя, преобразованного в десятичную форму с помощью массива (a [0] = 1 LSB), и, наконец, 2s-дополнение вычисляется из массива b []. Теперь, когда я запускаю программу:C++ program Booths Алгоритм 2s Дополнение с использованием массива

#include<iostream> 
    using namespace std; 
    class booth 
    { 
    public: 
    int n; 
    int b[3]; 
    int comb[3], q[3];    //b=multiplicand q=multiplier 
    int bb, qq;      //bb and qq store actual decimal no.s  
    booth() 
    { 
     for(int i=0; i<4; i++) 
     { 
      b[i]=0;     //b array stores multiplicand in binary 
      q[i]=0;     //q array stores multiplier in binary 
      comb[i]=0;    //will store calculated 2s complement in  
             binary 
     } 
     n=4; 
     bb=0; 
     qq=0; 
    } 
void acceptMm(); 
void display(); 
}; 

void booth :: acceptMm()  //function to accept value from user and      
          //converting it into binary in the form of 
          //array and then calculating its 2s complement 
{ 
    cout<<"Enter Multiplicand: "; 
    cin>>bb; 
    cout<<"Enter Multiplier: "; 
    cin>>qq; 
    //decimal to binary 
    int rem1, rem2, i=0, j=0; //rem1 and rem2 are remainders 
    while(qq!=0) 
    { 
     rem2=qq%2; 
     qq/=2; 
     q[i]=rem2; 
     i++; 
    } 
    cout<<q[3]<<q[2]<<q[1]<<q[0]<<endl; // to display binary no. 
    //again decimal to binary 
    while(bb!=0) 
    { 
     rem1=bb%2; 
     bb/=2; 
     b[j]=rem1; 
     j++; 
    } 
    cout<<b[3]<<b[2]<<b[1]<<b[0]<<endl; //to display binary no. 
    // 2s complement: 
    int ii=0; 
    int jj=4; //4 bit binary number 
     while(b[ii]==0 && jj!=0) 
     { 
      comb[ii]=b[ii]; 
      ii++; 
      jj--; 
     } 
     comb[ii]=b[ii]; 
     cout<<b[3]<<b[2]<<b[1]<<b[0]<<endl; //displayed value (problem) 
     ii++; 
     jj--; 
     if(jj==0) 
     { 
      return; 
     } 
     while(jj!=0) 
     { 
     if(b[ii]==0) 
     { 
      comb[ii]=1; 
      ii++; 
      jj--; } 
     else 
     { 
      comb[ii]=0; 
      ii++; 
      jj--; 
     } 
     } 
} 

void booth :: display() 
{ 
    cout<<"multiplicand\n"; 
    for(int x=3; x>=0; x--) 
     { 
      cout<<b[x]<<" "; 
     } 
    cout<<endl; 
    cout<<"multiplier\n"; 
    for(int j=3; j>(-1); j--) 
    { 
     cout<<q[j]<<" "; 
    } 
    cout<<endl; 
    cout<<"compliment of multiplicand\n"; 
    for(int y=3; y>(-1); y--) 
    { 
     cout<<comb[y]<<" "; 
    } 
} 

int main() 
{ 
booth obj; 
cout<<"Booths Algorithm\n"; 
    obj.acceptMm(); 
    obj.display(); 
return 0; 
} 

Выход

Booths Algorithm 
Enter Multiplicand: 5 
Enter Multiplier: 4 
0100 
0101 
1101 
multiplicand 
1 1 0 1 
multiplier 
0 1 0 0 
compliment of multiplicand 
0 0 1 1 

Вот на выходе я ожидаю, что шестая линия, как 0101, но получить 1101. Почему значение массива Ь [] меняется? Значение массива b [] в строке 5 является правильным, так почему это изменяется? В соответствии с кодом значение не должно меняться правильно? Я застрял .. Пожалуйста, помогите !! Любое предложение будет оценено!

ответ

1

b, q и гребень представляют собой массив из 3 элементов, поэтому b [3] представляет собой переполнение массива (значение которого неизвестно). На самом деле гребень выделяется сразу после b, вероятно, что b [3] равно гребенке [0].

+0

omg !! Я не могу поверить, что совершил такую ​​ошибку! Я думал, что будет сформирован массив из b [0] b [1] b [2] b [3]. – user5444075

0

Вы делаете переполнение. Делай это так. Просто .

class booth { 
public: 
    int n; 
    int b[4]; 
    int comb[4], q[4];    //b=multiplicand q=multiplier 
    int bb, qq;      //bb and qq store actual decimal no.s 
    booth() { 
     for (int i = 0; i < 4; i++) { 
      b[i] = 0;     //b array stores multiplicand in binary 
      q[i] = 0;     //q array stores multiplier in binary 
      comb[i] = 0;  //will store calculated 2s complement in  } 
      n = 4; 
      bb = 0; 
      qq = 0; 
     } 
    } 
+0

сделать число циклов до 5 –

+0

Надеюсь, что помогло.: D –