2013-04-19 2 views
1

그래서 이진 값을 입력으로 받아 그레이 코드로 변환하거나 그 반대로 변환하는 프로그램을 작성하고 싶습니다.이진 코드와 그 반대로

#include <iostream> 

using namespace std; 

int main() 
{ 

    int Choice; 
    bool g0,g1,g2,g3,b0,b1,b2,b3; 

    cout<<"For Binary To Gray Code Enter 1." << endl <<"For Gray Code to Binary Enter 2." << endl;; 
    cin>>Choice; 

    if(Choice==1) 
    { 

     cout<<"Enter the Binary Bits." << endl; 

     cin>>b0>>b1>>b2>>b3; 


     cout<<"Orginal Binary Form: "<<b3 <<b2 <<b1 <<b0 << endl; 

     g3=b3; 
     g2=b3^b2; 
     g1=b2^b1; 
     g0=b1^b0; 

     cout<<"Converted Gray Code Form: "<<g3 <<g2 <<g1 <<g0 << endl; 
    } 
    else if(Choice==2) 
    { 

     cout<<"Enter The Gray Code Bits." << endl; 

     cin>>g0>>>g1>>g2>>g3; 


     cout<<"Original Gray Code Form: "<<g3 <<g2 <<g1 <<g0 << endl; 

     b3=g3; 
     b2=b3^g2; 
     b1=b2^g1; 
     b0=b1^g0; 

     cout<<"Converted Binary Form: "<<b3 <<b2 <<b1 <<b0 << endl; 
    } 

    return 0; 
} 

지금이 4 개 비트를 위해 작동하지만

  1. 을 내가 런타임시 사용자가 입력 한 바이너리/그레이 코드의 크기를 결정 뭔가를 원하는 : 여기

    내가 처음 쓴거야 .

    저는 약간의 연구를했는데 그러한 경우 벡터 사용에 대해 알아 냈습니다. 그러나 대학에서 우리는 C++을 시작 했으므로 벡터 나 배열에 익숙하지 않습니다. 그것을 성취하는데 사용할 수있는 것이 있습니까? 그렇지 않다면, 벡터가 벡터에 어떻게 사용될 수 있는지 말해 줄 수 있습니까?

  2. 두 번째로 공백없이 한 줄에 입력하고 싶습니다.

    예 :

    1011보다는 1 0 1 1 또는 별도의 라인에서 각각의 비트에 대한 입력을 가지고.

  3. 이제 나는 아뇨를 알 수 없을 것입니다. XOR 연산을 수행하는 데 사용 된 비트 공식도 변경 될 수 있습니다. 바이너리와 그레이 코드 bool 변수를 선언 할 수 있습니까? 그리고 어떻게 든 단순한 명령문을 사용하는 개별 비트 대신 이러한 변수에 대해 XOR 연산을 수행합니까?

답변

1

당신은 당신이 이런 식으로 뭔가를 시작하는 문자열을 읽고 얻기 위해, 한 번에 문자를 평가할 수 :

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    std::string input 
    int Choice; 

    cout<<"For Binary To Gray Code Enter 1." << endl <<"For Gray Code to Binary Enter 2." << endl;; 
    cin>>Choice; 
    cout << "Enter input string: "; 
    cin >> input; 

    if(Choice==1) 
     Gray2Binary(input.c_str(), input.length()); 
    else 
     Binary2Gray(input.c_str(), input.length()); 

    return 0; 
} 

void Gray2Binary(char s[], int n) 
{ 
    int state = s[0]=='1' ? 1 : 0; 
    int i=0; 

    do { 
     if (i > 0) 
      state ^= s[i++]=='1' ? 1 : 0; 

     cout << state; 
    }while (i<n); 

    cout << endl; 
} 
+0

참고 : 'std :: string const'를 'Gray2Binary' 함수는 무엇입니까? 왜 속성을 괴롭 히 느냐? –

+0

@Matthiu : 맞습니다. const 문자열을 전달하면 반복문에 문자열 반복자를 사용하는 것이 더 낫습니다. 원래 코드는 "단순"으로 보였고 작업을 위해 너무 많은 것을 던지지 않으려했습니다. – Exceptyon

+0

컴파일 할 때 오류가 발생하는 이유는 무엇입니까? – user2299599

0

테스트 및 디버그를 작성하는 나에게 30 분 비용.

#include <iostream> 
#include <cstdlib> 
#include <string> 

using namespace std; 

void printReverse(bool* arr, int size){ 
    for(int i = size - 1; i >= 0 ; i--) 
     cout << arr[i]; 
    cout << endl; 
} 
int main(){ 
    int choice; 
    string str; 

    cout << "For Binary To Gray Code Enter 1." << endl 
     << "For Gray Code to Binary Enter 2." << endl; 
    cin >> choice; 

    if(choice != 1 && choice != 2) 
     return 1; 

    if(choice == 1) cout << "Enter the Binary Bits." << endl; 
    else cout << "Enter the Gray Code Bits." << endl; 

    cin >> str; 

    int size = str.size(); 
    bool arr[size]; 

    for(int i = 0; i < size; i++) 
     if(str[i] == '0') 
      arr[i] = false; 
     else 
      arr[i] = true; 

    if(choice == 1) cout << "Orginal Binary Form: "; 
    else cout << "Orignal Gray Code Form: "; 

    printReverse(arr, size); 

    if(choice == 1){ 
     for(int i = 0; i < size - 1 ; i++) // explain 1 
      arr[i] = arr[i]^arr[i + 1]; 
     cout << "Converted Gray Code Form: "; 
     printReverse(arr, size); 
    } else { 
     for(int i = str.size() - 2; i >= 0 ; i--) // explain 2 
      arr[i] = arr[i]^arr[i + 1]; 
     cout << "Converted Binary Form: "; 
     printReverse(arr, size); 
    } 
    system("pause"); 
    return 0; 
} 

printReverse는 1을 설명

cout << arr[3]; // cout << b3; or cout << g3; 
cout << arr[2]; // cout << b2; or cout << g2; 
cout << arr[1]; // cout << b1; or cout << g1; 
cout << arr[0]; // cout << b0; or cout << g0; 

(예로서 4 개 비트를 취할)

// at the beggining, arr[0], arr[1], arr[2], arr[3] are b0, b1, b2, b3 
arr[0] = arr[0]^arr[1]; // g0 = b0^b1; // arr[0] becomes g0 after assignment 
arr[1] = arr[1]^arr[2]; // g1 = b1^b2; // arr[1] becomes g1 after assignment 
arr[2] = arr[2]^arr[3]; // g2 = b2^b3; // arr[2] becomes g2 after assignment 
arr[3] = arr[3];   // g3 = b3;  // arr[3] becomes g3 after assignment 

설명 (예를 들어 4 개 비트를 취할) 2 (같이 4 개 비트를 취할 예)

// at the beggining, arr[0], arr[1], arr[2], arr[3] are g0, g1, g2, g3 
arr[3] = arr[3];   // b3 = g3;  // arr[3] becomes b3 after assignment 
arr[2] = arr[2]^arr[3]; // b2 = g2^b3; // arr[2] becomes b2 after assignment 
arr[1] = arr[1]^arr[2]; // b1 = g1^b2; // arr[1] becomes b1 after assignment 
arr[0] = arr[0]^arr[1]; // b0 = g0^b1; // arr[0] becomes b0 after assignment 
+0

설명을 위해 다음을 설명 할 수 있습니까? (int i = 0; i user2299599

+0

@ user2299599 이해하기 쉽게 코드를 변경했습니다. – johnchen902

+0

OK 설명을 이해합니다. :)하지만 내가 얻지 못하는 한 가지는 함수 printReverse for (int i = size - 1; i> = 0; i--)입니다.그게 어떻게 작동합니까? 또한이 어레이가 g와 b의 차이점을 어떻게 설명합니까? arr [0] = arr [0]^arr [1]; // g0 = b0^b1; – user2299599