VERte][
26.09.2007, 02:03
Пишу переводчик из разных систем счисления в другие(пока только в 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);
}
то всё нормально работает...
Помогите плиз найти в чём ошибка =\
Вот код:
#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);
}
то всё нормально работает...
Помогите плиз найти в чём ошибка =\