циклы функций isdigit, insert
int isdigit(char c)
{
insert(char *s, char c, int i)
{
Алсо, вторая функция не возвращает параметра, что есть плохо. Очень плохо.
int isdigit(char c)
{
}
http://msdn.microsoft.com/ru-ru/library/7f0ddtxh%28VS.90%29.aspx - есть пример
на мсдне и
Сомневаюсь, что это то, что этому юному дарованию нужно.
нужно написать что будет происходить в цикле этих функций.
Возьми массив символов с цифрами (это в общем случае) и в цикле for сравнивай с ними параметр функции. Если совпадёт - возвращай правду, если весь массив пройдёт без совпадений - то неправду.
Если в кодировке символы цифр идут подряд, то можно упростить, но это другая история.
Реализовывай.
Да, у ТС, скорее всего, строка UTF-8 с цифрами старомонгольским письмом, ты правильно подметил. :D
И делал бы это свичем, нахрен сюда циклы?
Бывает. Но если они идут подряд, то цикл не особо нужен. Поэтому усложнил, чтобы цикл имел смысл.
а заодно бы ещё и пуск ракеты осуществлял.
Чем лучше свитч?
Чем лучше свитч?
нет инкрементирования/декрементирования в конце, например. Таким образом, свич будет быстрее, чем фор.
а заодно бы ещё и пуск ракеты осуществлял.
Если не стремиться делать свой код оптимальным, то зачем вообще программировать?
Этот аргумент так же весом, как аргумент, что с циклом бинарик будет меньше. С другой стороны, ничто не мешает компилятору разложить цикл, чтобы не инкрементировать.
Более важное достоинство цикла - то, что он делает код короче, удаляет дублирование. Если понадобится изменить функцию, чтобы она возвращала результат как вы предлагаете, то в случае с циклом надо будет внести 2 правки, а в случае со свитчем - 11. Меньше правок - меньше ошибок.
Вот я хочу узнать в соответствии с названием функции, является ли символ цифрой, а мне выдаётся, что он цифра в любом случае кроме нуля. А ноль - не цифра. Это правильно?
И разве является оптимизацией то, что в функции будет осуществлено преобразование символа в int, когда об этом не просят?
Кстати, int там, а не bool, так как в си не было типа bool.
Этот аргумент так же весом, как аргумент, что с циклом бинарик будет меньше. С другой стороны, ничто не мешает компилятору разложить цикл, чтобы не инкрементировать.
Более важное достоинство цикла - то, что он делает код короче, удаляет дублирование. Если понадобится изменить функцию, чтобы она возвращала результат как вы предлагаете, то в случае с циклом надо будет внести 2 правки, а в случае со свитчем - 11. Меньше правок - меньше ошибок.
[/QUOTE]
В цикле все равно есть сравнение, так что даже без инкрементирования он будет жрать ресурсов больше.
Достоинство свича перед циклом в том, что код более наглядный.
Кстати, я бы не решал за меня, сколько мне понадобиться изменять код, можно управиться и в одно изменение.
[QUOTE=Kogrom]
Вот я хочу узнать в соответствии с названием функции, является ли символ цифрой, а мне выдаётся, что он цифра в любом случае кроме нуля. А ноль - не цифра. Это правильно?
И разве является оптимизацией то, что в функции будет осуществлено преобразование символа в int, когда об этом не просят?
Кстати, int там, а не bool, так как в си не было типа bool.
[/QUOTE]
В моей реализации тоже узнаешь, цифра это или нет. Если цифра, то возвратиться неотрицательное число, иначе -1. Проверка на отрицательность проходит также быстро, как и на равенство нулю. У вас в скорости выигрыша нет, зато в архитектуре проигрываете.
Да и то, что bool реализовано через одно место, еще не значит, что его нет. Особенно, если смотреть на плюсы и, упоси Боже, на решетку. Где вы видели в постановке задачи отсылки к чистому Си?
А в свитче нету? Чудеса.
Для начинающих?
Цикл для меня аналогичен такому выражению: 7*8, свитч такому: 7+7+7+7+7+7+7+7. Что нагляднее?
Ок. Приведите код со свитчем, возвращающем 1 - если цифра и 0, если не цифра, а потом код, который возвращает значения цифр. Сравним.
Вот именно только в вашей и не узнаю. А в классической реализации я смогу использовать выражение if(isdigit(c)){...} И поведение функции будет такое же, как в других аналогичных функциях: isalpha, isupper и т.д.
Я привёл исторический факт. Типа bool в си не было.
Кстати, не советую ругаться и злоупотреблять жаргоном. Обычно так делают школьники.
Код с циклами должен был написать автор темы. Пока ему не мешаем. С другой стороны, реализации вроде бы простейшие.
Задание же - сделать с циклом.
Так я и говорил об этом варианте, для случая когда в кодировке цифры идут подряд. И говорил, что это не соответствует заданию. Но у тебя ошибка. По хорошему должно быть ещё else.
int isdigit (char c)
{
return c>='0'&&c<='9';
}
const int before_func_name = 0;
insert (char *s, char c, int i)
{
insert ("void", '\t', before_func_name);
}
скорее первое, с чем у меня плохо получается(
Это не ошибка,а я решил не писать;)
Каюсь,забыл задание,а перечитать не сделал
А в свитче нету? Чудеса.
Я про сравнение регистра CX и веселой команде LOOP, а не о сравнении внутри цикла. Мой свитч и ваш if внутри фора. А вот inc и loop, это уже лишнее время
Для начинающих?
Цикл для меня аналогичен такому выражению: 7*8, свич такому: 7+7+7+7+7+7+7+7. Что нагляднее?
Не надо путать теплое с мягким и проводить такие аналогии. Не хуже меня знаете, что циклы не всегда очевидны, как 7*8. Свич же очевиден всегда.
Ок. Приведите код со свитчем, возвращающем 1 - если цифра и 0, если не цифра, а потом код, который возвращает значения цифр. Сравним.
int lresult
switch(c)
{case '0': lresult=0; break;
...
case '9': lresult=9; break;
default: lresult=-1; break;
}
return lresult //с цифрами
// return (lresult<0 ? 0 : 1) - одно исправление
}
:p
Я привёл исторический факт. Типа bool в си не было.
Я тоже сослался на исторический факт
Кстати, не советую ругаться и злоупотреблять жаргоном. Обычно так делают школьники.
Уличают в собеседнике школьника тоже далеко не самые взрослые оппоненты.:p
По хорошему должно быть ещё else.
Не нужно там никакого else. Просто под if пишешь return false.
То что неразвернутый компилятором цикл будет медленнее - это понятно. Я же говорил про то, что современный компилятор может развернуть цикл в тот же код, что и в свитч. Зачем делать эту работу вместо компилятора?
Чем плоха аналогия?
Свитч надо читать весь, а цикл сразу виден. Более того, в свитче частенько хитрят с break, что делает код ещё более неочевидным.
Но тут дело вкуса, конечно.
int lresult
switch(c)
{case '0': lresult=0; break;
...
case '9': lresult=9; break;
default: lresult=-1; break;
}
return lresult //с цифрами
// return (lresult<0 ? 0 : 1) - одно исправление
}
Ну вот, я доволен. Для того, чтобы обойтись меньшим количеством изменений вы внесли в код дополнительную переменную и дополнительную операцию. Куда же делась любовь к оптимизации?
Хорошо. Теперь представьте, что заказчик попросил возвращать не само число, а код символа, если он цифра и 0, если не цифра. А такие пожелания заказчиков (менять поведение программы) - не редкость. То, что ваша программа стала работать на 3 миллисекунды быстрее он может и не заметит никогда, а ошибки, вызванные многочисленными переделками всплывут рано или поздно.
На какой?
Естественно я не взрослый. Я бы возмутился, если бы меня назвали взрослым.
На счет else - это опять таки дело вкуса. Некоторые считают, что с else код более очевиден. Я тут нейтрален.
Может сделать, а может и не сделать... Не доверяю я этой машинке.
Чем плоха аналогия?
Свитч надо читать весь, а цикл сразу виден. Более того, в свитче частенько хитрят с break, что делает код ещё более неочевидным.
Но тут дело вкуса, конечно.
Виден то он сразу, но больше похож не на 7*8, а на
7*(ln(e)+)*8+(0!)-pow(7*8,0)
Да и не сильно то и хитрят с бряками, по крайней мере не так хитро как в циклах. Либо бряк есть, либо бряка нет.
Ну вот, я доволен. Для того, чтобы обойтись меньшим количеством изменений вы внесли в код дополнительную переменную и дополнительную операцию. Куда же делась любовь к оптимизации?
Хорошо. Теперь представьте, что заказчик попросил возвращать не само число, а код символа, если он цифра и 0, если не цифра. А такие пожелания заказчиков (менять поведение программы) - не редкость. То, что ваша программа стала работать на 3 миллисекунды быстрее он может и не заметит никогда, а ошибки, вызванные многочисленными переделками всплывут рано или поздно.
Оптимизация не в скорости, а в архитектуре. Мне нужно всего одно изменение (даже с лишней переменной код будет работать быстрее), а если вас попросят изменить что-то, например вывод не 0 и 1, а, собственно, числа или -1.
Кстати, в сообщениях Windows частенько именно отрицательные значения - ошибки, а положительные - результат действия. Так что вопрос о том, что принято возвращать 1 и 0 достаточно спорный.
Тут надо смотреть как работает конкретный компилятор с определёнными ключами. Если интересно, могу провести эксперименты с компилятором gcc. Возможно, он и в самом деле не осилит.
Самому мне лень и не интересно :)
7*(ln(e)+)*8+(0!)-pow(7*8,0)
Не понял, к чему это. 7*8 - это и есть цикл, хоть и не привязанный к языку программирования.
Тут лукавство. Ибо ваш пример был заточен под конкретные изменения. По хорошему надо учитывать и все случаи, где использована переменная lresult.
А с циклами без всяких добавок останется 2 правки:
{
const char *digits = "0123456789";
for(int i = 0; i < 10; ++i)
if(digits == c)
//return 1;
return i;
//return 0;
return -1;
}
Подозреваю, что можно сделать ещё более изящный цикл. В отличие от свитча, циклу не надо хранить в теле программы константы от 0 до 9.
Естественно, свитч будет лучше, если надо будет возвращать результат никак не вычисляемый из параметра функции. Но это не тот случай.
Да нет тут спорного. На вопрос "Да или нет?" надо отвечать либо "да", либо "нет". А главное, надо ещё постараться выдумать смысл для возврата значения конкретной цифры. Обычно требуется значение всего числа.
Исходная функция (программа на си - потому внесены небольшие корректировки):
{
const char *digits = "0123456789";
int i = 0;
for(; i < 10; ++i)
if(digits == c)
return 1;
return 0;
}
Код без оптимизации:
.string "0123456789"
.text
.globl isdigit_
.type isdigit_, @function
isdigit_:
pushl %ebp
movl %esp, %ebp
subl $20, %esp
movl 8(%ebp), %eax
movb %al, -20(%ebp)
movl $.LC0, -4(%ebp)
movl $0, -8(%ebp)
jmp .L2
.L5:
movl -8(%ebp), %eax
addl -4(%ebp), %eax
movzbl (%eax), %eax
cmpb -20(%ebp), %al
jne .L3
movl $1, %eax
jmp .L4
.L3:
addl $1, -8(%ebp)
.L2:
cmpl $9, -8(%ebp)
jle .L5
movl $0, %eax
.L4:
leave
ret
.size isdigit_, .-isdigit_
.section .rodata
Код с флагом оптимизации -O3:
.globl isdigit_
.type isdigit_, @function
isdigit_:
pushl %ebp
movl %esp, %ebp
movzbl 8(%ebp), %eax
cmpb $48, %al
je .L2
cmpb $49, %al
je .L2
cmpb $50, %al
je .L2
cmpb $51, %al
.p2align 4,,5
je .L2
cmpb $52, %al
.p2align 4,,5
je .L2
cmpb $53, %al
.p2align 4,,5
je .L2
cmpb $54, %al
.p2align 4,,5
je .L2
cmpb $55, %al
.p2align 4,,5
je .L2
cmpb $56, %al
.p2align 4,,5
je .L2
cmpb $57, %al
sete %al
movzbl %al, %eax
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L2:
movl $1, %eax
popl %ebp
ret
.size isdigit_, .-isdigit_
.section .rodata.str1.1,"aMS",@progbits,1
То есть, если я правильно понимаю код, при сравнительно высокой оптимизации данный цикл превратился в что-то типа свитча (учитывая, что '0' соответствует коду 48). Но при этом код стал менее компактным. Вроде бы практика подтвердила теорию.