ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Помогите найти ошибку в коде...
  #1  
Старый 26.09.2007, 02:03
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию Помогите найти ошибку в коде...

Пишу переводчик из разных систем счисления в другие(пока только в 10ю и для целых чисел) и при добавлени 11-16ричных систем вышла ошибочка, которую никак не могу найти не смотря на простоту кода...

Вот код:
Код:
#include<iostream>
#include<string>
#include<cmath>
#include<cstdlib>
using namespace std;

int main()
{
    string chislo, ex;
    int length, i, k, chisl[100];
    double p, sum(0);
    do
    {
        cout<<"Input data to convert into DEC system!"<<endl<<"Input p: ";
        do
        {
            cin>>p;
             p=static_cast<int>(p);
              if ((p>16) || (p<2))
                  {
                      cerr<<"Error 'p' is bigger than 16, or less than 2!!!"<<endl;
                      cout<<"Input p: ";
                  }
        } while(p>16 || p<2);
        cin.ignore(100, '\n');
        cout<<"Input number: ";
        getline(cin, chislo);
        length=chislo.length();

for (i=0; i<=(length-1); i++)
{
          chisl[i]=static_cast<int>(chislo[i])-static_cast<int>('0');
          if (chisl[i]==49)
           {
               chisl[i]=10;
           }
           else if (chisl[i]==50)
           {
               chisl[i]=11;
           }
           else if (chisl[i]==51)
           {
               chisl[i]=12;
           }
           else if (chisl[i]==52)
           {
               chisl[i]=13;
          }
           else if (chisl[i]==53)
           {
               chisl[i]=14;
           }
           else if (chisl[i]==54)
           {
               chisl[i]=15;
           }
           if (!((chisl[i]>=0)&&(chisl[i]<=15)))
           {
               cerr<<"Error, incorrect data!";
               exit(1);
           }
             chisl[i]++;
             cout<<chisl[i]<<endl;
             chislo[i]++;
}

        for (i=0, k=(length-1);k>=0, i<=(length-1);k--, i++)
        {

           sum+=chisl[i]*pow(p,k);

        }

        cout<<"result: "<<sum<<endl<<endl<<"Input 'exit' to quit, or any key to continue: ";
        sum=0;
        cin>>ex;
        cout<<endl;
     cout<<static_cast<int>('a')-static_cast<int>('0')<<endl; //проверка, выдает 49
     cout<<static_cast<int>('1')-static_cast<int>('0'); //выдает 1
     }while(ex!="exit");

return 0;
}
В части кода(который отвечает за перевод строковых данных в целочисленные и заполнение массива целочисленного):
Код:
for (i=0; i<=(length-1); i++)
{
          chisl[i]=static_cast<int>(chislo[i])-static_cast<int>('0');
          if (chisl[i]==49)
           {
               chisl[i]=10;
           }
           else if (chisl[i]==50)
           {
               chisl[i]=11;
           }
           else if (chisl[i]==51)
           {
               chisl[i]=12;
           }
           else if (chisl[i]==52)
           {
               chisl[i]=13;
          }
           else if (chisl[i]==53)
           {
               chisl[i]=14;
           }
           else if (chisl[i]==54)
           {
               chisl[i]=15;
           }
           if (!((chisl[i]>=0)&&(chisl[i]<=15)))
           {
               cerr<<"Error, incorrect data!";
               exit(1);
           }
             chisl[i]++;
             cout<<chisl[i]<<endl;
             chislo[i]++;
}
очевидно есть ошибка, так как при выборе p=16 и числа ааа, в целочисленный массив записывается вместо 10, 10, 10 --> 11, 11, 11. Ну и сответсвенно, к примеру, вместо 6 записывается 7...
Если код по переводу убрать, т.е. исключить 11-16 системы и написать:
Код:
 for (i=0, k=(length-1);k>=0, i<=(length-1);k--, i++)
        {

           sum+=(static_cast<int>chisl[i]-static_cast<int>('0'))*pow(p,k);

        }
то всё нормально работает...

Помогите плиз найти в чём ошибка =\
 
Ответить с цитированием

  #2  
Старый 26.09.2007, 07:59
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Цитата:
Пишу переводчик из разных систем счисления в другие(пока только в 10ю и для целых чисел)
Ой а теперь можно и вещественные числа переводить? Чтотоя упустил тот момент, когда, например, стало можно переводить 3.14 в 12-ричную систему счисления
 
Ответить с цитированием

  #3  
Старый 26.09.2007, 08:37
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме:
4226446

Репутация: 1564
Отправить сообщение для 0x0c0de с помощью ICQ
По умолчанию

Цитата:
очевидно есть ошибка, так как при выборе p=16 и числа ааа, в целочисленный массив записывается вместо 10, 10, 10 --> 11, 11, 11.
Нет. Ты сам на единицу содержимое увеличиваешь.
Код:
 
      //  chisl[i]++;
             cout<<chisl[i]<<endl;
           //  chislo[i]++;
Закомменть увеличение на 1 (выше см.). Я проверила с 0a - получается 10
0aa - 170
0aaa -2730
0aaaa-43690
это верные ответы, я пересчитала

далее

b - 11
bbb - 3003
сссс - 52428
ab -171

=>теперь все верно
В общем дальше не смотрела.... вроде норм считает

Последний раз редактировалось 0x0c0de; 26.09.2007 в 08:44..
 
Ответить с цитированием

  #4  
Старый 26.09.2007, 08:59
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

Ооо! Спасибо) как же я ступил-то =\

to_Great_
да упустил, можно переводить...
например 123.5 в 6тирчиной, в 10ричной будет: 1*6^2+2*6^1+3*6^0+(5*^6^(-1)) вот тебе дробная часть =\

тоже самое для перевода из 10ричной в другие с.ч., только алгоритм немного другой:
для целой части мы делим число на порядок с.ч., пока частное не будет меньше порядка и берём остатки от деления, начиная с последнего частного;
для дробной же части, мы умножаем дробную часть со значащим нулём в начале на порядок, и берём целые части получившихся результатов до нужной точности...
 
Ответить с цитированием

  #5  
Старый 26.09.2007, 09:26
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Цитата:
to_Great_
да упустил, можно переводить...
например 123.5 в 6тирчиной, в 10ричной будет: 1*6^2+2*6^1+3*6^0+(5*^6^(-1)) вот тебе дробная часть =\
И где ты такое видел. Я тебе еще 10 правил приудмать могу
 
Ответить с цитированием

  #6  
Старый 26.09.2007, 09:27
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

МГУ ВМиК
да ктому же это вполне лоогично, что ты хочешь сказать, что у других систем счисления не может быть дробной части??? тогда бред будет!
а если она есть то почему она не может участвовать в переводе??? что мешает, а правило вполне нормальное, стпень уменьшается, и на единицах становится 0, на десятичных -1, всё логично...

Последний раз редактировалось Vertexe; 26.09.2007 в 09:29..
 
Ответить с цитированием

  #7  
Старый 26.09.2007, 09:29
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

ЗЫ. Ну я не говорю про мантиссу дробных представлений. Там такое действиетльно есть. Но больше нигде я не видел применения.

ЗЫЫ. Тоже МГУшник?) Я с физфака через дорогу от меня

ЗЫЫЫ. Ладно проехали мне просто щас поп*деть охота D

Последний раз редактировалось _Great_; 26.09.2007 в 09:31..
 
Ответить с цитированием

  #8  
Старый 26.09.2007, 09:32
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

[offtop]МГУ 4евер) у меня пол класса на физфак пошло, а я один на ВМиК, хотя долго выбирал между физфаком и вмк=)[/offtop]
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПомогитЕ !!! подалуста найти кряк гейлордфакерЪ Болталка 2 30.08.2007 14:48
Исправление для IPB 2.1.x _GaLs_ Форумы 6 20.06.2007 09:31
ПоМоГиТе! ПЛЗ!!! farik.aka E-Mail 1 17.09.2006 13:00



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ