Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > int to binary - как конвертировать в бинарный?


Автор: DragoonFighter 27.1.2009, 21:45
Здравствуйте Программисты, 

мне нужно скажем int=123; преобразовать в бинарный код. 
Я искал в гоогле и нашёл очень хорошую и рабочую функцию:
Код

void binary(int number) {
    int remainder;

    if(number <= 1) {
        cout << number;
        return;
    }

    remainder = number%2;
    binary(number >> 1);    
    cout << remainder;
}
...
int number;

    cout << "Please enter a positive integer: ";
    cin >> number;
    if (number < 0) 
        cout << "That is not a positive integer.\n";
    else {
        cout << number << " converted to binary is: ";
        binary(number);
        cout << endl;
    }


Всё работает прекрасно! Но есть одна проблема. Этот бинарный код мне нужно преоброзовать снова в int.
То есть: ввод 123 вывод 1111011 и это число записывается в int.

Как это сделать в самом void я знаю, но мне нужно создать этот int в main а так как я незнаю и не могу не где найти как вытащить int из void и засунуть его в int в main, мне нужна функция которая полностью работает в main.
Я ну думаю что это можно сделать с while() поскольку я пробовал всё что мог и не чего не вышло, но если это возможно, то прошу пожалуйста пример с whiel(). 
За ранние спасибо!
Надеюсь я не очень плохо выразился?

Автор: destrd 27.1.2009, 21:54
Ну переведите в строку, а потом типа atoi с основанием 10

Автор: DragoonFighter 27.1.2009, 22:03
Цитата(destrd @ 27.1.2009,  21:54)
Ну переведите в строку, а потом типа atoi с основанием 10

Это как? Можно пример?

Автор: GoldFinch 27.1.2009, 22:42
бгг тема
учите системы счисления и не задавайте глупых вопросов %)

Добавлено через 52 секунды
а код в 1м посте однозначно жжот)))

Автор: mes 27.1.2009, 22:58
вывод целочисленного числа числа в двоичной системе:

Код

int n = 122;
for (int i=0; i<=sizeof(n)*8; ++i) std::cout<< (n>>i & 1);

ну а в остальном 
Цитата(DragoonFighter @  27.1.2009,  20:45 Найти цитируемый пост)
Надеюсь я не очень плохо выразился?

не хочется Вас разочаровывать, но правда дороже smile

Автор: DragoonFighter 27.1.2009, 23:19
Цитата(mes @ 27.1.2009,  22:58)
вывод целочисленного числа числа в двоичной системе:

Код

int n = 122;
for (int i=0; i<=sizeof(n)*8; ++i) std::cout<< (n>>i & 1);

ну а в остальном 
Цитата(DragoonFighter @  27.1.2009,  20:45 Найти цитируемый пост)
Надеюсь я не очень плохо выразился?

не хочется Вас разочаровывать, но правда дороже smile

Вот, как рас то что искал. Благодарю! А можно изменить общую длину так, чтобы так много нулей не было. То есть чтобы длинна вывода зависела от полной длинны ввода.

Например:
int 10:

вывод:
010100000000000000000000000000000

чтобы вывод был:
0101

а если int = 9876543210

то чтобы вывод был не:
010111100000000000000000000000000

а:
0101111

Автор: xvr 28.1.2009, 17:41
Цитата(mes @ 27.1.2009,  22:58)
вывод целочисленного числа числа в двоичной системе:

Код

int n = 122;
for (int i=0; i<=sizeof(n)*8; ++i) std::cout<< (n>>i & 1);


Угу, только задом-наперед   smile 

Код

int n = 122;
for (int i=sizeof(n)*8; i--;) std::cout<< (n>>i & 1);


Автор: mes 28.1.2009, 18:29
Цитата(xvr @  28.1.2009,  16:41 Найти цитируемый пост)
Угу, только задом-наперед   smile 

точно  smile 


Цитата(DragoonFighter @  27.1.2009,  22:19 Найти цитируемый пост)
То есть чтобы длинна вывода зависела от полной длинны ввода.

Код

int n = 8;

 std::cout<<0;
 for (int i=sizeof(n)*8; i--;)
 if (n>>(i-1))
 {
     for (int j=i; j--;) std::cout<< (n>>j & 1);
     break;
 }
 std::cout<<"b";
 


пример содержит ошибку.. исправление смотрите ниже..

Автор: DragoonFighter 28.1.2009, 19:12
Цитата(xvr @ 28.1.2009,  17:41)
Цитата(mes @ 27.1.2009,  22:58)
вывод целочисленного числа числа в двоичной системе:

Код

int n = 122;
for (int i=0; i<=sizeof(n)*8; ++i) std::cout<< (n>>i & 1);


Угу, только задом-наперед   smile 

Код

int n = 122;
for (int i=sizeof(n)*8; i--;) std::cout<< (n>>i & 1);

Да, я уже переделал задом на перёд, но всё равно спасибо!

Добавлено @ 19:14
Цитата(mes @ 28.1.2009,  18:29)
Цитата(xvr @  28.1.2009,  16:41 Найти цитируемый пост)
Угу, только задом-наперед   smile 

точно  smile 


Цитата(DragoonFighter @  27.1.2009,  22:19 Найти цитируемый пост)
То есть чтобы длинна вывода зависела от полной длинны ввода.

Код

int n = 8;

 std::cout<<0;
 for (int i=sizeof(n)*8; i--;)
 if (n>>(i-1))
 {
     for (int j=i; j--;) std::cout<< (n>>j & 1);
     break;
 }
 std::cout<<"b";
 

Класс благодарю! Спасибо вам за помощь! 
Мне надо было использовать sizeof()

Огромное спасибо! 

Один вопрос: зачем cout << "0"; и cout << "b"; ?

Автор: mes 28.1.2009, 21:24
Цитата(DragoonFighter @  28.1.2009,  18:12 Найти цитируемый пост)
Один вопрос: зачем cout << "0"; и cout << "b"; ?

закомментируй, посмотри на результат, и сравни с  некомментированным результатом   smile 

Автор: DragoonFighter 28.1.2009, 21:40
Цитата(mes @ 28.1.2009,  21:24)
Цитата(DragoonFighter @  28.1.2009,  18:12 Найти цитируемый пост)
Один вопрос: зачем cout << "0"; и cout << "b"; ?

закомментируй, посмотри на результат, и сравни с  некомментированным результатом   smile

Теоретически я могу убрать "b"? А ноль просто для начального старта или как? 
Кратко: Можно их убрать, чтобы были просто буквы и только бинарный код, или?

Добавлено через 1 минуту и 4 секунды
Так, мне ещё 3 поста и я могу репутацию ставить.  smile 

Автор: mes 28.1.2009, 21:48
Цитата(DragoonFighter @  28.1.2009,  20:40 Найти цитируемый пост)
Теоретически я могу убрать "b"? 

да, "b" поставлен для "красоты".


Цитата(DragoonFighter @  28.1.2009,  20:40 Найти цитируемый пост)
А ноль просто для начального старта или как? 

во первых

Цитата(DragoonFighter @  27.1.2009,  22:19 Найти цитируемый пост)
чтобы вывод был:
0101

во вторых :вначале идет поиск значимого бита и с него начинается вывод, и если значащий бит не найден (при n==0) то выводить нечего и следовательно этот ноль является "опорным"


Цитата(DragoonFighter @  28.1.2009,  20:40 Найти цитируемый пост)
Кратко: Можно их убрать, чтобы были просто буквы и только бинарный код, или?

не понял о чем речь.

Автор: DragoonFighter 28.1.2009, 21:59
 smile  Ну я и имел в виду "опорный ноль". Рас это так, то всё понятно, спасибо! 

Ну а насчёт краткого: Имел в виду чтобы были только цифры
Благодарю mes! Выручили! 

Автор: mes 28.1.2009, 22:12
Цитата(DragoonFighter @  28.1.2009,  20:59 Найти цитируемый пост)
 smile  Ну я и имел в виду "опорный ноль". Рас это так, то всё понятно, спасибо! 

из за второй причины, необязатльно чтоб ноль выводился впереди всегда  .

можно например дополнить код условием, тогда :
Код

 if (!n) std::cout<<0;
 for ...



Цитата(DragoonFighter @  28.1.2009,  20:40 Найти цитируемый пост)
Кратко: Можно их убрать, чтобы были просто буквы и только бинарный код, или?

Цитата(DragoonFighter @  28.1.2009,  20:59 Найти цитируемый пост)
Ну а насчёт краткого: Имел в виду чтобы были только цифры. 

a я чуть  голову не поломал :  smile  smile 

Автор: DragoonFighter 28.1.2009, 22:50
 smile   smile  
Да я так и сделаем с условием. Благодарю ещё раз! 

Вопрос полностью решён! 

Автор: mes 28.1.2009, 23:28
приведенный выше код содержит ошибку  smile 
вот исправленный  вариант :
Код

 if  (!n) std::cout<<0;
 for (int i=sizeof(n)*8-1; i>=0; --i)
 if  (n>>i) for (;i>=0; --i) std::cout<< (n>>i & 1);


Автор: DragoonFighter 28.1.2009, 23:49
Цитата(mes @ 28.1.2009,  23:28)
приведенный выше код содержит ошибку  smile 
вот исправленный  вариант :
Код

 if  (!n) std::cout<<0;
 for (int i=sizeof(n)*8-1; i>=0; --i)
 if  (n>>i) for (;i>=0; --i) std::cout<< (n>>i & 1);


 smile  ну нечё, всё круто!

Код

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int n;
    int b;
    cout << "Your number here: ";
    cin >> n;
    // to binary
    //cout << 0;
    for (int i=sizeof(n)*8; i--;)
    if (n >> (i-1))
    {
                  if  (!n) std::cout<<0;
                  for (int i=sizeof(n)*8-1; i>=0; --i)
                  if  (n>>i) for (;i>=0; --i) std::cout<< (n>>i & 1);
                 break;
                 }
    cout << endl << endl;
    
    system("PAUSE");
    return EXIT_SUCCESS;
}



Вот так выглядит вся прога.
Теоретически, не токая уж и важная ошибка.... 
А интересно, сколько цифр можно запихать в int? 
Я раньше в книге читал что оно не большое, то есть ограничено. 
Но забыл на сколько, мне нужно где то около 1 миллиарда цифр.

Автор: pan2004 28.1.2009, 23:54
Цитата(DragoonFighter @  28.1.2009,  23:49 Найти цитируемый пост)
сколько цифр можно запихать в int? 

32 двоичных разряда, обычно. Это примерно 10^9


Цитата(DragoonFighter @  28.1.2009,  23:49 Найти цитируемый пост)
мне нужно где то около 1 миллиарда цифр.

1 миллиард десятичных цифр? Это уже если не на гигабайты, то на сотни мегабайт ОЗУ точно.

Автор: mes 28.1.2009, 23:55
Цитата(DragoonFighter @  28.1.2009,  22:49 Найти цитируемый пост)

Вот так выглядит вся прога.

у меня в глазах двоится или в коде действительно цикл вложен сам в себя ??  smile 

а также зачем int b; ?

Добавлено через 2 минуты и 53 секунды
Код

#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    int n;
    cout << "Your number here: ";
    cin >> n;
 
// cout n as binary
    if  (!n) cout<<0;
    for (int i=sizeof(n)*8-1; i>=0; --i)
    if  (n>>i) for (;i>=0; --i) cout<< (n>>i & 1);

    cout << endl << endl;
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Автор: mes 29.1.2009, 00:15
Цитата(pan2004 @  28.1.2009,  22:54 Найти цитируемый пост)
1 миллиард десятичных цифр? 

я думаю имелось ввиду, что нужна  возможность вместить значение миллиард. 

http://www.cplusplus.com/reference/clibrary/climits/

Автор: DragoonFighter 29.1.2009, 00:15
Цитата(pan2004 @ 28.1.2009,  23:54)
Цитата(DragoonFighter @  28.1.2009,  23:49 Найти цитируемый пост)
сколько цифр можно запихать в int? 

32 двоичных разряда, обычно. Это примерно 10^9


Цитата(DragoonFighter @  28.1.2009,  23:49 Найти цитируемый пост)
мне нужно где то около 1 миллиарда цифр.

1 миллиард десятичных цифр? Это уже если не на гигабайты, то на сотни мегабайт ОЗУ точно.

Я пишу программку, которая весь текст, то есть всё что вводят превращает в цифры, в бинарный код, потом сокращает в буквы, в hex и снова в бинарный. Так можно например кодировать файлы, e-mail, текст чата, итд. 
При этом засуну эту функцию в программу которая создаёт пароль. Мне нужен пароль на 200gb его на жесткий диск и этим паролем я закрою мои приватные данные. Эта идея была взята с радио активной станции в России. Там закодировали один важный файл несколькими терабайтам длинным паролем. 

Это причина почему я хотел знать сколько вмещается в int. 
А так конвертирование в бинарный код мне нужно для кодирование текста для типа приватного чата, чтобы если на пример мусара перехватят канал, чтобы им хрен что от моего текста понятно было. Ну, что то типа того.

Добавлено через 2 минуты и 52 секунды
Цитата(mes @ 28.1.2009,  23:55)
Цитата(DragoonFighter @  28.1.2009,  22:49 Найти цитируемый пост)

Вот так выглядит вся прога.

у меня в глазах двоится или в коде действительно цикл вложен сам в себя ??  smile 

а также зачем int b; ?

Добавлено @ 23:58
Код

#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    int n;
    cout << "Your number here: ";
    cin >> n;
 
// cout n as binary
    if  (!n) cout<<0;
    for (int i=sizeof(n)*8-1; i>=0; --i)
    if  (n>>i) for (;i>=0; --i) cout<< (n>>i & 1);

    cout << endl << endl;
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Ай тфу блин, всё вместе ляпнул... не, извините, сплю уже,   smile не то копировал... 
b не нужно, и да ваш правильный код тот что и у меня.  smile

Добавлено через 6 минут и 45 секунд
Цитата(mes @ 29.1.2009,  00:15)
Цитата(pan2004 @  28.1.2009,  22:54 Найти цитируемый пост)
1 миллиард десятичных цифр? 

я думаю имелось ввиду, что нужна  возможность вместить значение миллиард. 

http://www.cplusplus.com/reference/clibrary/climits/

Ну предётся сделать while() чтобы ULONG_MAX    Maximum value for an object of type unsigned long int    4294967295  был умножен столько раз, чтобы вышло минимум 1 миллион. Ну это так, просто для любопытства и интереса испробовать  smile 
Нечего серьёзного. 

Автор: mes 29.1.2009, 00:23
Цитата(DragoonFighter @  28.1.2009,  23:15 Найти цитируемый пост)
Я пишу программку, которая весь текст, то есть всё что вводят превращает в цифры, в бинарный код, потом сокращает в буквы, в hex и снова в бинарный. Так можно например кодировать файлы, e-mail, текст чата, итд. 

нда.. может лучше почитать вначале книжки, тогда возможно эти наполеновские планы превратятся в реальные цели. smile

любое число или буква уже и так хранится в двоичном виде, а то что std::cout выводит число в десятичном виде или как букву, 
так это проявление работы функции, которая выводит переменную в удобном для пользователя виде.

остальное комментировать не вижу смысла на текущем этапе.

Автор: DragoonFighter 29.1.2009, 00:39
Цитата(mes @ 29.1.2009,  00:23)
Цитата(DragoonFighter @  28.1.2009,  23:15 Найти цитируемый пост)
Я пишу программку, которая весь текст, то есть всё что вводят превращает в цифры, в бинарный код, потом сокращает в буквы, в hex и снова в бинарный. Так можно например кодировать файлы, e-mail, текст чата, итд. 

нда.. может лучше почитать вначале книжки, тогда возможно эти наполеновские планы превратятся в реальные цели. smile

любое число или буква уже и так хранится в двоичном виде, а то что std::cout выводит число в десятичном виде или как букву, 
так это проявление работы функции, которая выводит переменную в удобном для пользователя виде.

остальное комментировать не вижу смысла на текущем этапе.

Да, это понятно, но я перевожу буквы в свои цифры. У меня в принципе всё для кодирования готово! Просто осталось создать чат, но этим займёмся позже, потому что вы правы, для начала надо читать книги! Ну, пока у меня только одна проблема была, переделать числа в бинарный. Теперь всё пока идёт дальше по тихонько. 
Да и вообще это всё я пробую новые функции которые я изучаю. Скажем во попалась sizeof() сразу делаю с ней пример. Ну вот такой пример и в голову попал пере конвертировать цифры в бинарный. 
Короче всё для знания и изучения нового.

Огромное спасибо вам!

Автор: bsa 29.1.2009, 16:31
DragoonFighter, для шифрования данных можно использовать openssl (это библиотека такая), с ее помощью организуются шифрованные каналы связи (HTTPS, SSH, TLS) в большинстве открытых приложений. А для кодирования/декодирования ключа, можно воспользоваться банальной побитовой ксоркой (XOR - исключающие "ИЛИ") ключа с хэшем (MD5, SHA1 и т.п.) пароля, так как: A xor B = C; C xor A = B; C xor B = A
А вот зачем тебе переводить в двичную, чтобы перевести в 16-тиричную, чтобы перевести в двоичную, совсем непонятно. Может тебе нужно какое-нибудь кодирование base64?

Автор: DragoonFighter 31.1.2009, 00:16
Цитата(bsa @ 29.1.2009,  16:31)
DragoonFighter, для шифрования данных можно использовать openssl (это библиотека такая), с ее помощью организуются шифрованные каналы связи (HTTPS, SSH, TLS) в большинстве открытых приложений. А для кодирования/декодирования ключа, можно воспользоваться банальной побитовой ксоркой (XOR - исключающие "ИЛИ") ключа с хэшем (MD5, SHA1 и т.п.) пароля, так как: A xor B = C; C xor A = B; C xor B = A
А вот зачем тебе переводить в двичную, чтобы перевести в 16-тиричную, чтобы перевести в двоичную, совсем непонятно. Может тебе нужно какое-нибудь кодирование base64?

Хорошая информация! Благодарю! 
Насчёт перевода, это просто своё кодирование, просто для изучения и пробы. Просто чем больше разных переводов, на пример с букв в инт с инта в бинах с бинар в хекс и сного в бинар и т.д. 
К стате base64 я уже тоже использовал но поскольку тут только 64 (0-63) символов, я создал свой, 90 символов. 
Просто буквы в цифры, потом эти цифры с помощью например бинарного и хекса закодировать. 

Автор: mes 31.1.2009, 00:35
Цитата(DragoonFighter @  30.1.2009,  23:16 Найти цитируемый пост)
е base64 я уже тоже использовал но поскольку тут только 64 (0-63) символов, я создал свой, 90 символов. 


Цитата(DragoonFighter @  30.1.2009,  23:16 Найти цитируемый пост)
Просто буквы в цифры, потом эти цифры с помощью например бинарного и хекса закодировать. 

и все таки мне кажется, что Вы неправильно "воспринимаете происходящее".

Автор: cutwater 31.1.2009, 01:38
DragoonFighter, я согласен с mes, Вы что-то явно путаете.

Автор: DragoonFighter 31.1.2009, 13:29
Ну, как я понял base64 кодирует символы. 
То есть на пример 123 = MTIz
Правильно? 

Автор: xvr 31.1.2009, 19:14
Цитата(DragoonFighter @ 31.1.2009,  13:29)
Ну, как я понял base64 кодирует символы. 
То есть на пример 123 = MTIz
Правильно?

Оно символы не КОДИРУЕТ, а всего лишь переводит в другой вид. Для целей защиты информации (что бы враги не догадались) оно СОВЕРШЕННО непригодно. Равно как и другие способы представления, типа перевода в бин/хекс/хз куда.
Тогда уж проще упаковать исходный текст - такое кодирование, просто закачаешся  smile
У всех систем шифрования есть одно неприменное требование - возможность расшифровать сообщение должно базироваться ТОЛЬКО на знании ключа.
Т.е. злоумышленник может иметь все, вплоть до исходных текстов программ шифрования и дешифрования, но без ключа он расшифровать все равно не сможет

Автор: mes 31.1.2009, 19:32
Цитата(xvr @  31.1.2009,  18:14 Найти цитируемый пост)
Оно символы не КОДИРУЕТ

Поправка : Кодирует, но не шифрует.   smile 
DragoonFighter, а простое кодирование и шифрование прменяются совсем для разных целей. 
В  контексте Ваших постов речь шла о шифровании, и предлагаемые методы кодирования для этого не предназначены.

Автор: DragoonFighter 2.2.2009, 23:10
Цитата(mes @ 31.1.2009,  19:32)
Цитата(xvr @  31.1.2009,  18:14 Найти цитируемый пост)
Оно символы не КОДИРУЕТ

Поправка : Кодирует, но не шифрует.   smile 
DragoonFighter, а простое кодирование и шифрование прменяются совсем для разных целей. 
В  контексте Ваших постов речь шла о шифровании, и предлагаемые методы кодирования для этого не предназначены.

Да, вы правы, ну короче я даже не так уж и далеко зашёл чтобы применять base64. Вот моя программа, для тех кто интересуется. 
(Она не полная, это ещё только половина программы. )

Я закинул на ссылку код, а то тут он слишком большой. 
http://hack-crew.ath.cx/download/programming/Cpp/main.cpp

Можете скопировать и компилировать, уведите что я имею в виду. 

Автор: cutwater 2.2.2009, 23:15
стрелять колотить.... челюсть до сих пор на полу....
жаль цензура не позволяет сказать все что можно по поводу кода.... я в шоке.

Добавлено через 1 минуту и 36 секунд
При чем это только еще половина.

Автор: xvr 2.2.2009, 23:19
Цитата(DragoonFighter @ 2.2.2009,  23:10)
Да, вы правы, ну короче я даже не так уж и далеко зашёл чтобы применять base64. Вот моя программа, для тех кто интересуется. 

Я закинул на ссылку код, а то тут он слишком большой. 
http://hack-crew.ath.cx/download/programming/Cpp/main.cpp

Да уж  smile 
Во первых, рекомендую слово 'crypt' оттуда убрать - ибо это не 'crypt' ни в каком смысле. 
Во вторых, у вас китайцев в роду не было? Уж очень стиль похож, хуже только 'индийский'.
В третьих, что получилось - понятно (кошмар на улице вязов), а вот что нужно было получить - совершенно не ясно  smile 
Цитата

(Она не полная, это ещё только половина программы. )
Половины вполне достаточно  smile 

Автор: pan2004 2.2.2009, 23:24
ужас... два ифа на полсотни вариантов чего стоят... Причем, это последовательность if оф, а даже не if...else!!! Да, да, программа будет проверять все полсотни условий в цикле, даже когда один уже сработал и больше не нужно. Уже не говоря о том, что ВСЕ ифы можно просто выкинуть и написать без них.
Аффтар, ознакомься хотя бы с тем, как строки и символы представляются в памяти компьютера? Правильно, числами.

Автор: mes 2.2.2009, 23:51
DragoonFighter, вот переписал часть Вашего кода на скорую руку - кодирование символов на основе таблице
заполнять таблицу до конца конечно же я не стал и оставил Вам для разминки.
Код


const std::string mtbl[][2] = { "a","00"
                               ,"b","01"
                               ,"c","02"
                               ,"d","03"
                               ,"e","04"
                              };


std::string code (std::string src)
{
    std::string res;
    res.reserve(src.size()*2);
    for (unsigned j = 0; j<src.size(); ++j )
    for (unsigned i=0; i<sizeof(mtbl)/sizeof(char*)/2; ++i)
    if (src.compare(j,1, mtbl[i][0])==0) { res +=mtbl[i][1]; break; }
    return res;
}
std::string encode (std::string src)
{
    std::string res;
    res.reserve(src.size()/2);
    for (unsigned j = 0; j<src.size(); j+=2 )
    for (unsigned i=0; i<sizeof(mtbl)/sizeof(char*)/2; ++i)
    if (src.compare(j,2, mtbl[i][1])==0) { res +=mtbl[i][0]; break; }
    return res;
}

int main()
{
    std::string str = code ("abcde");
    std::cout <<str<< std::endl;
    std::cout << encode(str)<< std::endl;

    return 0;
}

заполняйте таблицу тестируйте и улучшайте  smile 

Автор: DragoonFighter 2.2.2009, 23:52
Цитата(pan2004 @ 2.2.2009,  23:24)
ужас... два ифа на полсотни вариантов чего стоят... Причем, это последовательность if оф, а даже не if...else!!! Да, да, программа будет проверять все полсотни условий в цикле, даже когда один уже сработал и больше не нужно. Уже не говоря о том, что ВСЕ ифы можно просто выкинуть и написать без них.
Аффтар, ознакомься хотя бы с тем, как строки и символы представляются в памяти компьютера? Правильно, числами.

Цитата

... что ВСЕ ифы можно просто выкинуть и написать без них.


А по подробнее можно? 

Извините меня, но я ещё новичок и это первый вариант который пришёл мне в голову.

Да код очень длинный, но честно говоря я пока и не думал как, и вообще что его можно написать по другому. 
Может кто объяснить в чём моя ошибка и из за чего всё так плохо выглядит? 
За раннее спасибо.

Добавлено через 4 минуты и 58 секунд
Цитата(mes @ 2.2.2009,  23:51)
DragoonFighter, вот переписал часть Вашего кода на скорую руку - кодирование символов на основе таблице
заполнять таблицу до конца конечно же я не стал и оставил Вам для разминки.
Код


const std::string mtbl[][2] = { "a","00"
                               ,"b","01"
                               ,"c","02"
                               ,"d","03"
                               ,"e","04"
                              };


std::string code (std::string src)
{
    std::string res;
    res.reserve(src.size()*2);
    for (unsigned j = 0; j<src.size(); ++j )
    for (unsigned i=0; i<sizeof(mtbl)/sizeof(char*)/2; ++i)
    if (src.compare(j,1, mtbl[i][0])==0) { res +=mtbl[i][1]; break; }
    return res;
}
std::string encode (std::string src)
{
    std::string res;
    res.reserve(src.size()/2);
    for (unsigned j = 0; j<src.size(); j+=2 )
    for (unsigned i=0; i<sizeof(mtbl)/sizeof(char*)/2; ++i)
    if (src.compare(j,2, mtbl[i][1])==0) { res +=mtbl[i][0]; break; }
    return res;
}

int main()
{
    std::string str = code ("abcde");
    std::cout <<str<< std::endl;
    std::cout << encode(str)<< std::endl;

    return 0;
}

заполняйте таблицу тестируйте и улучшайте  smile

А, вот теперь я понял в чём была проблема. 
Я вам очень благодарен! Спасибо! На первый вид я ещё не совсем понял как всё работает, но посижу пару часиков и про анализирую. Большое спасибо!

Автор: mes 3.2.2009, 00:02
Цитата(pan2004 @  2.2.2009,  22:24 Найти цитируемый пост)
Аффтар, ознакомься хотя бы с тем, как строки и символы представляются в памяти компьютера

Цитата(DragoonFighter @  2.2.2009,  22:52 Найти цитируемый пост)
Может кто объяснить в чём моя ошибка и из за чего всё так плохо выглядит

ну вот Вам еще один кодик из двух строчек на рамышление :

Код

    for (char i=' '; i<'z'; ++i)
    std::cout << (char)i << " " << (int) i << std::endl;
 
ответьте себе на вопрос как работает цикл л с буквами,
откуда берутся цифры в консоли, 
как они соответствуют буквам напротив их.

желаю приятных эксперементов  smile

Добавлено через 2 минуты и 48 секунд
Цитата(DragoonFighter @  2.2.2009,  22:52 Найти цитируемый пост)
А, вот теперь я понял в чём была проблема. 

на строчки   res.reserve(...); не отвлекайся, можешь их вобще закоментировать , на результат не скажется..
а описание compare здесь : http://www.cplusplus.com/reference/string/string/compare.html

Автор: DragoonFighter 3.2.2009, 00:08
Благодарю mes!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)