Итак, в качестве затравки одна довольно тривиальная задачка (крутым гуру просьба не беспокоиться , а вот те, кому интересно — дерзайте).
Задача:
Написать функцию, которая конвертирует строку (char*) в число (int), то есть реализацию atoi. Прототип функции:
int new_atoi(const char* string);
Условия:
0. Язык программирования — С/С++.
1. Запрещается пользоваться любыми библиотечными функциями (типа strlen и пр.), а также сторонними классами и иже с ними. В двух словах, задача должна решаться встроенными средствами языка С/С++.
2. Пробельные символы в начале строки (пробел и символ табуляции — \t) опускаются.
3. Знак числа должен сохраняться.
4. Возвращаемое значение — либо 0 в случае ошибки, либо часть числа до момента встречи ошибки (например, если строка содержит значение "1024u78", то возвращаемым значением будет число 1024
5. Передаваемая строка содержит числа в десятичном формате.
Здравствуйте Flamer, Вы писали:
F>Итак, в качестве затравки одна довольно тривиальная задачка (крутым гуру просьба не беспокоиться , а вот те, кому интересно — дерзайте).
F>Задача:
F>Написать функцию, которая конвертирует строку (char*) в число (int), то есть реализацию atoi. Прототип функции:
F>
F>int new_atoi(const char* string);
F>
F>Условия:
F>0. Язык программирования — С/С++.
F>1. Запрещается пользоваться любыми библиотечными функциями (типа strlen и пр.), а также сторонними классами и иже с ними. В двух словах, задача должна решаться встроенными средствами языка С/С++.
F>2. Пробельные символы в начале строки (пробел и символ табуляции — \t) опускаются.
F>3. Знак числа должен сохраняться.
F>4. Возвращаемое значение — либо 0 в случае ошибки, либо часть числа до момента встречи ошибки (например, если строка содержит значение "1024u78", то возвращаемым значением будет число 1024
F>5. Передаваемая строка содержит числа в десятичном формате.
F>Набор тестов:
Здравствуйте Flamer, Вы писали:
F>Здравствуйте Yampolski_Nikita, Вы писали:
F>[покоцано]
YN>>ВСЕ БАЛЫ ТВОИ ! что тут ? учеба ? или кто самый крутой ? YN>>вот баталии будут )
F>Да нет, просто задачки для тех, кому интересно. Кстати, а где ваша реализация?
F>З.Ы. И не забывайте про оверквотинг
а я тут как-раз пишу другую программку, а в почту сыпятсы топики форума ) только мне денежку платят )))
Здравствуйте Flamer, Вы писали:
F>Итак, в качестве затравки одна довольно тривиальная задачка (крутым гуру просьба не беспокоиться , а вот те, кому интересно — дерзайте).
вот вы хихи-хаха, а мне пришлось портировать все wcs***() ручками!
Здравствуйте Кодт, Вы писали:
К>Здравствуйте Flamer, Вы писали:
F>>Итак, в качестве затравки одна довольно тривиальная задачка (крутым гуру просьба не беспокоиться , а вот те, кому интересно — дерзайте).
К>вот вы хихи-хаха, а мне пришлось портировать все wcs***() ручками!
Я совсем не хихи-хаха Я собственно, именно для этого и завел разговор о задачках, чтобы при случае проблем с портированием wcs***() не возникало
А если серьезно, то тренировка/проверка знаний/умений/навыков еще никому не вредила...
Здравствуйте tks, Вы писали:
tks>Держите, вроде как все тесты проходит:
[код покоцан]
Если вкратце — ваш вариант не совсем удачен Можно упростить, например, непонятно, зачем использовать две временных переменных (f и s) И навскидку — много лишних проверок...
Здравствуйте Proph, Вы писали:
P>Здравствуйте Flamer, Вы писали:
P>Еще вариант
[код покоцан]
Значится так: знак числа можно (и нужно) устанавливать один раз перед возвратом из функции. Далее — можно (и прозрачней) обойтись без цикла for (а вот чего использовать — думайте ). И еще — в определении макросов ошибка (если внимательно посмотрите — поймете, почему).
Здравствуйте Flamer, Вы писали:
F>Здравствуйте Proph, Вы писали:
P>>Здравствуйте Flamer, Вы писали:
P>>Еще вариант
F>[код покоцан]
F>Значится так: знак числа можно (и нужно) устанавливать один раз перед возвратом из функции.
переменная f служит и как знак и как флаг что уже было число.
а знак результата устанавливается в returne.
F>Далее — можно (и прозрачней) обойтись без цикла for (а вот чего использовать — думайте ).
Чем ?
F>И еще — в определении макросов ошибка (если внимательно посмотрите — поймете, почему).
Где?
Здравствуйте Proph, Вы писали:
P>Здравствуйте Flamer, Вы писали:
F>>Здравствуйте Proph, Вы писали:
P>>>Здравствуйте Flamer, Вы писали:
P>>>Еще вариант
F>>[код покоцан]
F>>Значится так: знак числа можно (и нужно) устанавливать один раз перед возвратом из функции. P>переменная f служит и как знак и как флаг что уже было число. P>а знак результата устанавливается в returne.
F>>Далее — можно (и прозрачней) обойтись без цикла for (а вот чего использовать — думайте ). P>Чем ?
while
F>>И еще — в определении макросов ошибка (если внимательно посмотрите — поймете, почему). P>Где?
Здравствуйте Flamer, Вы писали:
F>>>[код покоцан]
F>>>Далее — можно (и прозрачней) обойтись без цикла for (а вот чего использовать — думайте ). P>>Чем ?
F>while
в моем коде while не выгоден (где ставить str++ )
F>>>И еще — в определении макросов ошибка (если внимательно посмотрите — поймете, почему). P>>Где?
F>Ну, допустим, вместо
F>
Здравствуйте Flamer, Вы писали:
F>Здравствуйте Vampire, Вы писали:
V>>Правда чтот дофига у меня проверок получилось
F>[код покоцан]
F>А немножко упростить код? Хотя бы вместо 48+9 написать 57? Ведь не каждый оптимизирующий компилятор это вам соптимизирует...
Ну есть такой вариант. Правда ввожу флаг
int new_atoi(char *string)
{
int i = 0;
int res = 0;
bool z = true;
int znak = 1;
if (string == NULL) return 0;
do
{
if ((string[i] == '-') && (z))
{
znak = -1;
z = false;
continue;
}
if ((string[i] == '+') && (z))
{
z = false;
continue;
}
if ((string[i] == ' ') || (string[i] == '\t'))
continue;
if ((string[i] < 48) || (string[i] > 57))
break;
res = res * 10 + string[i] - 48;
} while (string[i++]);
return res * znak;
}
Здравствуйте Flamer, Вы писали:
F>Здравствуйте Proph, Вы писали:
F>[покоцано раз]
P>>в моем коде while не выгоден (где ставить str++ )
F>А вот посмотрите здесь
int new_atoi(char *string)
{
int res = 0;
bool z = true;
int znak = 1;
if (string == NULL) return 0;
do
{
if ((*string == '-') && (z))
{
znak = -1;
z = false;
continue;
}
if ((*string == '+') && (z))
{
z = false;
continue;
}
if ((*string == ' ') || (*string == '\t'))
continue;
if ((*string < 48) || (*string > 57))
break;
res = res * 10 + *string - 48;
} while (string++);
return res * znak;
}
Здравствуйте Flamer, Вы писали:
F>Итак, в качестве затравки одна довольно тривиальная задачка (крутым гуру просьба не беспокоиться , а вот те, кому интересно — дерзайте).
F>Задача:
F>Написать функцию, которая конвертирует строку (char*) в число (int), то есть реализацию atoi. Прототип функции:
F>
F>int new_atoi(const char* string);
F>
F>Условия:
F>0. Язык программирования — С/С++.
F>1. Запрещается пользоваться любыми библиотечными функциями (типа strlen и пр.), а также сторонними классами и иже с ними. В двух словах, задача должна решаться встроенными средствами языка С/С++.
F>2. Пробельные символы в начале строки (пробел и символ табуляции — \t) опускаются.
F>3. Знак числа должен сохраняться.
F>4. Возвращаемое значение — либо 0 в случае ошибки, либо часть числа до момента встречи ошибки (например, если строка содержит значение "1024u78", то возвращаемым значением будет число 1024
F>5. Передаваемая строка содержит числа в десятичном формате.
F>Набор тестов: