Open alexey-malov opened 8 years ago
long long ToDecimalNotation(const std::string & value, int sourceNotation)
{
ValidationOfValue(value, sourceNotation);
if (sourceNotation == 10)
{
return stoi(value);
}
std::vector<char> digits(value.begin(), value.end());
long long result = 0;
bool isNegative = false;
for (size_t i = 0; i < digits.size(); i++)
{
if (digits[i] == '-')
{
isNegative = true;
}
else if (digits[i] >= 'A')
{
result += (digits[i] - AsciiNumDifference) * (long long)pow(sourceNotation, digits.size() - 1 - i);
}
else
{
result += (digits[i] - '0') * (long long)pow(sourceNotation, digits.size() - 1 - i);
}
}
if (isNegative)
{
result *= -1;
}
return result;
}
от использования pow ты так и не избавился.
в тестах не проверяется работа функций на недопустимых данных (выход основания системы счисления за пределы 2...36, переполнение из-за невозможности вместить в тип int переданное число используй BOOST_CHECK_THROW
std::string Transfer(int sourceNotation, int destNotaion, const std::string & value)
{
if (value == "0")
{
return "0";
}
try
{
auto decimalVal = ToDecimalNotation(value, sourceNotation);
string result = FromDecimalToDestination(decimalVal, destNotaion);
return result;
}
catch(invalid_argument err)
{
return "Invalid value. Value must be a number";
}
}
исключения следует ловить по константной ссылке, а не по значению функция Transfer не имеет возможности сообщить об ошибке при преобразовании
std::reverse(result.begin(), result.end());
return result;
}
можно просто написать: return {result.rbegin(), result.rend()};
k=0,6
Исправил
Сборка должна проходить без предупреждений
1>d:\teaching\2016\kuzin\oop\lab1\radix\radix\main.cpp(22): warning C4101: 'err' : unreferenced local variable
например, исправить можно так:
catch (invalid_argument const& /*err*/)
{
cout << "Notation must be in range [2, 36)" << endl;
}
или так:
catch (invalid_argument const& err)
{
std::ignore = err;
cout << "Notation must be in range [2, 36)" << endl;
}
или просто использовать err (например, его метод what())
нет поддержки 36-чной системы счисления, использующей символы 0..9,A...Z включительно
if (i == 6)
{
cout << "kek";
}
wtf?
if (isNegative)
{
MultiplicationWithOverflowCheck(sourceNotation, result * -1);
AddWithOverflowCheck(CharToNumber(value[i]), result * sourceNotation * -1);
}
else
{
MultiplicationWithOverflowCheck(sourceNotation, result);
AddWithOverflowCheck(CharToNumber(value[i]), result * sourceNotation);
}
result = result * sourceNotation + CharToNumber(value[i]);
Для устранения дублирования кода и соответствия своему имени функциям MultiplicationWithOverflowCheck и AddWithOverflowCheck следует выполнять вычисления, а не просто проверять
Попытка преобразовать число INT_MIN, равное -2147483648, в шестнадцатиричную систему счисления, программа выводит странное:
-8463847412-
k=0,75
Исправил