| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Написание аналога atoi. |
| Автор: maksr 9.8.2006, 14:46 | ||||
| В книги Страуструпа было задание: написать аналог функции atoi. У меня вот что получилось:
Пока только для десятичных чисел. И главное что работает Ещё нашёл описание atoi в исходниках amos.
Здесь короче, только ничего не понятно. |
| Автор: sergejzr 9.8.2006, 15:02 | ||||
Добавлено @ 15:09
|
| Автор: maksr 9.8.2006, 15:21 | ||
Например? Добавлено @ 15:24 sergej.z, Спасибо разобрался не много. |
| Автор: sergejzr 9.8.2006, 15:36 | ||||
Например вот так:
Попробую "понятнее" расписать цикл:
Таким образом для трёхзначного числа , цикл будет считать по фромуле resultat=((((cifra1*10)+cifra2)*10)+cifra3)*10= //Ну, просчитаем ручками.. (((cifra1*10)+cifra2)*10)*10+cifra3*10= //открываем скобки ((cifra1*10)+cifra2)*10*10+cifra3*10= //открываем скобки ((cifra1*10)+cifra2)*100+cifra3*10= //упрощаем (cifra1*10)*100+cifra2*100+cifra3*10= //открываем скобки cifra1*1000+cifra2*100+cifra3*10 //упрощаем |
| Автор: ptr 9.8.2006, 15:38 | ||
Если хочешь улучшить код, то добавь проверку аргумента. Чтобы такое например
возвращало скажем 0. |
| Автор: MAKCim 9.8.2006, 15:45 | ||||
Добавлено @ 15:45
имхо, плохо если в стиле C++ - лучше exception |
| Автор: maksr 9.8.2006, 15:49 |
| То All, Спасибо, буду разбираться. |
| Автор: ptr 9.8.2006, 16:00 |
Знаю что плохо. Просто я не заментил, что код был на C++ да и так делает atoi (хотя и не всегда). Надо было написать "корректно обрабатывались" чтобы не придирались |
| Автор: maksr 9.8.2006, 23:07 | ||
Переделал.
Добавлено @ 23:11 |
| Автор: ptr 10.8.2006, 05:57 | ||
|
| Автор: sergejzr 10.8.2006, 12:36 | ||
PS: Как всё-таки atoi красиво написана... |
| Автор: Dragon 10.8.2006, 17:33 | ||||||
| Посвящяется не переписыванию кода atoi(), а улучшению кода по конверции типов в С++, потому что как не периписывай atoi() суть от этого не сильно изменяется В Boost'е есть такая маленькая функция - lexical_cast - кроссплатформенный аналог всем convert функциям. Используется таким образом:
Я написал также маленький вспомогательный класс для этих целей:
Не уверен, что у меня есть полное право вносить его в namespace std, но там он смотрится органично. Стоило бы его наследовать от std::basic_string и сделать соотвествующим шаблоном, конечно, но пока так. Используется очень просто:
В последнем примере MySQL client возвращает все значения в виде С строк и очень удобным оказывается возвращать значения в виде convert_string - это позволяет присваивать их непосредственно переменным с базовыми типами, без явной конвертации. По поводу возврата в inline функции объекта по значению и надежды на оптимизацию компилятора: 1. Нужно убедиться, что компилятор сделает эту функцию inline. В gcc есть соотвествующая опция "-Winline" 2. В крайнем случае можно проверить путем прямого сравнения производительности на тестовых приложениях. |
| Автор: maxzone 15.8.2006, 13:17 | ||
Наверное Страуструп имел ввиду что-то вроде этого
Отработает [+/-]Число, Число, Число с дробной частью (отбрасывая дробную). Фунциональность больше этой редко требуется |