Помогите найти ошибку в коде...

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by VERte][, 26 Sep 2007.

  1. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Пишу переводчик из разных систем счисления в другие(пока только в 10ю и для целых чисел) и при добавлени 11-16ричных систем вышла ошибочка, которую никак не могу найти не смотря на простоту кода...

    Вот код:
    Code:
    #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;
    }
    В части кода(который отвечает за перевод строковых данных в целочисленные и заполнение массива целочисленного):
    Code:
    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 системы и написать:
    Code:
     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. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    Ой а теперь можно и вещественные числа переводить? Чтотоя упустил тот момент, когда, например, стало можно переводить 3.14 в 12-ричную систему счисления
     
    1 person likes this.
  3. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    395
    Reputations:
    297
    Нет. Ты сам на единицу содержимое увеличиваешь.
    Code:
     
          //  chisl[i]++;
                 cout<<chisl[i]<<endl;
               //  chislo[i]++;
    
    Закомменть увеличение на 1 (выше см.). Я проверила с 0a - получается 10
    0aa - 170
    0aaa -2730
    0aaaa-43690
    это верные ответы, я пересчитала

    далее

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

    =>теперь все верно
    В общем дальше не смотрела.... вроде норм считает
     
    #3 0x0c0de, 26 Sep 2007
    Last edited: 26 Sep 2007
    1 person likes this.
  4. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Ооо! Спасибо) как же я ступил-то =\

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

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

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    И где ты такое видел. Я тебе еще 10 правил приудмать могу
     
  6. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    МГУ ВМиК
    да ктому же это вполне лоогично, что ты хочешь сказать, что у других систем счисления не может быть дробной части??? тогда бред будет!
    а если она есть то почему она не может участвовать в переводе??? что мешает, а правило вполне нормальное, стпень уменьшается, и на единицах становится 0, на десятичных -1, всё логично...
     
    #6 VERte][, 26 Sep 2007
    Last edited: 26 Sep 2007
  7. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    ЗЫ. Ну я не говорю про мантиссу дробных представлений. Там такое действиетльно есть. Но больше нигде я не видел применения.

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

    ЗЫЫЫ. Ладно проехали мне просто щас поп*деть охота :DD
     
    #7 _Great_, 26 Sep 2007
    Last edited: 26 Sep 2007
    1 person likes this.
  8. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    [offtop]МГУ 4евер) у меня пол класса на физфак пошло, а я один на ВМиК, хотя долго выбирал между физфаком и вмк=)[/offtop]
     
    1 person likes this.