Консультация № 175290
15.12.2009, 15:06
35.00 руб.
0 4 1
Здравствуйте уважаемые эксперты! Пожалуйста помогите решить задачу, заранее огромное спасибо!
Задача:
Дана текстовая строка, содержащая двоичное число. Перевести его в восьмеричную систему счисления и записать во вторую строку.

Приложение:
язык С++

Обсуждение

давно
Посетитель
7438
7205
15.12.2009, 15:20
общий
"двоичное число" - это последовательность 0 и 1, типа '10100101' ?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
15.12.2009, 15:44
общий
Ased7:
Здравствуйте, Ased7!
Код:
#include <stdio.h>
#include <string>
#include <iostream>


using namespace std;


string BinToOct(string src) // Функция преобразование двоичной строки в восьмеричную.
{
int tmp_res = 0; // Переменная, в которую будет записано число.
for(int i = 0; i < src.length(); i++) // Проход по строке
tmp_res += (src[i] == '1') * (1 << (src.length() - i - 1)); // Запись числа в переменную
char c_str[20] = {0};
sprintf(c_str, "%o", tmp_res); // Преобразование числа в строку. %o означает, что число будет записано в восьмеричном виде
string res(c_str); // Возвращаемое значение
return res;
}

int main(int argc, char *argv[])
{
string str = BinToOct(argv[1]); // Преобразуем первый аргумент программы
return 0;
}
Неизвестный
15.12.2009, 19:37
общий
это ответ
Здравствуйте, Ased7.

Полагаю, что простое преобразование двоичной строки в число, а затем использование sprintf( s, "%o", num ) или _itoa( num, s, 8 ) для преобразования в восьмиричное представление не годится. В предлагаемом варианте двоичное число (строка) преобразуется в восьмиричное число напрямую. Комментарии — в коде.
На Ваш выбор предлагается 2 варианта: с классом string и без него. Оба варианта проверены в MSVC++ 6.0.

Вариант с классом string:
Код:
#include <string>
#include <iostream>
using namespace std;

// Функция преобразует строку, представляющую двоичное число (pszBinary),
// в строку, представляющую восьмиричное число (pszOctal)
// Алгоритм:
// 3 двоичных цифры преобразуются в одну восьмиричную.
// Исходная строка разбивается на группы по 3 цифры, начиная справа; крайняя
// левая группа может содержать от 1 до 3-х двоичных цифр.
// Затем каждая группа переводится в восьмиричную цифру (параллельно проверяется
// корректность исходной строки) и преобразуется в символ прибавлением '0'.
int bin2oct( string &sOctal, string &sBinary )
{
int len = sBinary.length();
int nRes = (len+2)/3; // число 8-ричных цифр в результате
// сколько первых цифр двоичного числа "пойдет" на первую цифру результата?
// 10,111,010,101

int n = len % 3;
if( n == 0 ) n = 3;
int p = 0;
while( len ) {
// преобразуем очередную группу
int d = 0;
for( int i = 0; i < n; ++i, ++p ) {
char ch = sBinary[p];
if( ch > '1' || ch < '0' )
return -1; // ошибка во входной строке - недвоичное число

d = (d << 1) + (ch == '1');
}
sOctal += d + '0';
len -= n;
n = 3;
}
return 0;
}

void main( int argc, char* argv[] )
{
string sOct, sBin;
if( argc > 1 )
sBin = argv[1];
else {
cout << "Enter a number in binary notation: ";
cin >> sBin;
}
if( bin2oct( sOct, sBin ) < 0 )
cout << "The provided string does not represent a number in binary notation!" << endl;
else
cout << "The number in octal notation = " << sOct << endl;
}


Вариант без использования класса string (это тоже C++):
Код:
#include <string.h>
#include <iostream>
using namespace std;


// Функция преобразует строку, представляющую двоичное число (pszBinary),
// в строку, представляющую восьмиричное число (pszOctal)
// Алгоритм:
// 3 двоичных цифры преобразуются в одну восьмиричную.
// Исходная строка разбивается на группы по 3 цифры, начиная справа; крайняя
// левая группа может содержать от 1 до 3-х двоичных цифр.
// Затем каждая группа переводится в восьмиричную цифру (параллельно проверяется
// корректность исходной строки) и преобразуется в символ прибавлением '0'.
int bin2oct( char* pszOctal, const char* pszBinary )
{
int len = strlen( pszBinary );
int nRes = (len+2)/3; // число 8-ричных цифр в результате
// сколько первых цифр двоичного числа "пойдет" на первую цифру результата?
// 10,111,010,101

int n = len % 3;
if( n == 0 ) n = 3;
const char* p = pszBinary;
while( len ) {
int d = 0;
for( int i = 0; i < n; ++i, ++p ) {
if( *p > '1' || *p < '0' )
return -1; // ошибка во входной строке - недвоичное число

d = (d << 1) + (*p == '1');
}
*pszOctal++ = d + '0';
len -= n;
n = 3;
}
*pszOctal = 0;
return 0;
}


void main( int argc, char* argv[] )
{
char sOct[128];
int iRes;
if( argc > 1 )
iRes = bin2oct( sOct, argv[1] );
else {
cout << "Enter a number in binary notation: ";
char sBin[256];
cin >> sBin;
iRes = bin2oct( sOct, sBin );
}
if( iRes < 0 )
cout << "The provided string does not represent a number in binary notation!" << endl;
else
cout << "The number in octal notation = " << sOct << endl;
}


Успехов!
Неизвестный
15.12.2009, 21:29
общий
Из вопроса неясно, можно ли использовать библиотечные функции для преобразования. А то ведь можно просто сделать так:

Код:
// s2 содержит исходное число в двоичной записи
long n = strtol( s2, NULL, 2 );
// s8 будет содержать строковое представление числа в восьмиричной системе
_ltoa( n, s8, 8 );


или даже короче:

// двоичное представление числа замещается восьмиричным
_ltoa( strtol( s, NULL, 2 ), s, 8 );
Форма ответа