Поэтому я хочу написать программу, которая принимает двоичное значение в качестве входного и преобразует его в серый код и наоборот.
Вот что я написал изначально:
#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 бит, но
Я хочу что-то, что определяет размер введенного двоичного / серого кода пользователем во время выполнения.
Я провел небольшое исследование и узнал об использовании векторов в таком случае, но так как в колледже мы только начали C ++, я не знаком с векторами или даже массивами. Есть ли что-то еще, что я могу использовать для достижения этого? Если нет, может кто-нибудь сказать мне, как векторы могут быть использованы для этого?
Во-вторых, я хочу взять ввод в одну строку без пробелов.
Пример:
1011
скорее, чем 1 0 1 1
или принимая вход для каждого бита в отдельной строке.
Теперь я также понимаю, что я не смогу узнать нет. битов заранее, поэтому формула битов, которую я использовал для выполнения операции XOR, также будет изменена. Можно ли объявить двоичный и серый код bool
переменная и как-то выполнить операцию XOR над этими переменными, а не отдельные биты, используя более простые операторы, ничего сложного?
Вы можете прочитать строку и оценить символ за раз, чтобы начать что-то вроде этого:
#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;
}
Это стоило мне 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: (возьмите 4 бита в качестве примера)
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;
объяснить 1: (возьмите 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
объяснить 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