Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

циклы функций isdigit, insert

35K
18 ноября 2010 года
life4fun
64 / / 15.11.2010
никак не могу разобраться как дописать следующие функции:

int isdigit(char c)
{




insert(char *s, char c, int i)
{
33K
18 ноября 2010 года
hivewarrior
205 / / 16.11.2010
лол, а что они должны делать?
Алсо, вторая функция не возвращает параметра, что есть плохо. Очень плохо.
29K
18 ноября 2010 года
Енот_в_Засаде
224 / / 09.11.2010
Цитата: life4fun
никак не могу разобраться как дописать следующие функции:

int isdigit(char c)
{
}


http://msdn.microsoft.com/ru-ru/library/7f0ddtxh%28VS.90%29.aspx - есть пример

33K
18 ноября 2010 года
hivewarrior
205 / / 16.11.2010
 
Код:
bool IsDigit

на мсдне и
 
Код:
int isdigit

Сомневаюсь, что это то, что этому юному дарованию нужно.
35K
18 ноября 2010 года
life4fun
64 / / 15.11.2010
не мсдн это не то.

нужно написать что будет происходить в цикле этих функций.
87
18 ноября 2010 года
Kogrom
2.7K / / 02.02.2008
Начнём с isdigit.

Возьми массив символов с цифрами (это в общем случае) и в цикле for сравнивай с ними параметр функции. Если совпадёт - возвращай правду, если весь массив пройдёт без совпадений - то неправду.

Если в кодировке символы цифр идут подряд, то можно упростить, но это другая история.

Реализовывай.
10
18 ноября 2010 года
Freeman
3.2K / / 06.03.2004
Цитата: Kogrom
Если в кодировке символы цифр идут подряд


Да, у ТС, скорее всего, строка UTF-8 с цифрами старомонгольским письмом, ты правильно подметил. :D

33K
18 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Судя по возвращаемому типу, я бы все возвращал не нолик и единичку, а это число, а в случаи ошибки FFFFFFFFh
И делал бы это свичем, нахрен сюда циклы?
87
18 ноября 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: Freeman
Да, у ТС, скорее всего, строка UTF-8 с цифрами старомонгольским письмом, ты правильно подметил. :D


Бывает. Но если они идут подряд, то цикл не особо нужен. Поэтому усложнил, чтобы цикл имел смысл.

Цитата: hivewarrior
Судя по возвращаемому типу, я бы все возвращал не нолик и единичку, а это число, а в случаи ошибки FFFFFFFFh


а заодно бы ещё и пуск ракеты осуществлял.

Цитата: hivewarrior
И делал бы это свичем, нахрен сюда циклы?


Чем лучше свитч?

33K
18 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Цитата:

Чем лучше свитч?


нет инкрементирования/декрементирования в конце, например. Таким образом, свич будет быстрее, чем фор.

Цитата:

а заодно бы ещё и пуск ракеты осуществлял.


Если не стремиться делать свой код оптимальным, то зачем вообще программировать?

87
18 ноября 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: hivewarrior
нет инкрементирования/декрементирования в конце, например. Таким образом, свич будет быстрее, чем фор.


Этот аргумент так же весом, как аргумент, что с циклом бинарик будет меньше. С другой стороны, ничто не мешает компилятору разложить цикл, чтобы не инкрементировать.

Более важное достоинство цикла - то, что он делает код короче, удаляет дублирование. Если понадобится изменить функцию, чтобы она возвращала результат как вы предлагаете, то в случае с циклом надо будет внести 2 правки, а в случае со свитчем - 11. Меньше правок - меньше ошибок.

Цитата: hivewarrior
Если не стремиться делать свой код оптимальным, то зачем вообще программировать?


Вот я хочу узнать в соответствии с названием функции, является ли символ цифрой, а мне выдаётся, что он цифра в любом случае кроме нуля. А ноль - не цифра. Это правильно?

И разве является оптимизацией то, что в функции будет осуществлено преобразование символа в int, когда об этом не просят?

Кстати, int там, а не bool, так как в си не было типа bool.

33K
18 ноября 2010 года
hivewarrior
205 / / 16.11.2010
[QUOTE=Kogrom]
Этот аргумент так же весом, как аргумент, что с циклом бинарик будет меньше. С другой стороны, ничто не мешает компилятору разложить цикл, чтобы не инкрементировать.

Более важное достоинство цикла - то, что он делает код короче, удаляет дублирование. Если понадобится изменить функцию, чтобы она возвращала результат как вы предлагаете, то в случае с циклом надо будет внести 2 правки, а в случае со свитчем - 11. Меньше правок - меньше ошибок.
[/QUOTE]
В цикле все равно есть сравнение, так что даже без инкрементирования он будет жрать ресурсов больше.

Достоинство свича перед циклом в том, что код более наглядный.
Кстати, я бы не решал за меня, сколько мне понадобиться изменять код, можно управиться и в одно изменение.
[QUOTE=Kogrom]
Вот я хочу узнать в соответствии с названием функции, является ли символ цифрой, а мне выдаётся, что он цифра в любом случае кроме нуля. А ноль - не цифра. Это правильно?

И разве является оптимизацией то, что в функции будет осуществлено преобразование символа в int, когда об этом не просят?

Кстати, int там, а не bool, так как в си не было типа bool.
[/QUOTE]
В моей реализации тоже узнаешь, цифра это или нет. Если цифра, то возвратиться неотрицательное число, иначе -1. Проверка на отрицательность проходит также быстро, как и на равенство нулю. У вас в скорости выигрыша нет, зато в архитектуре проигрываете.

Да и то, что bool реализовано через одно место, еще не значит, что его нет. Особенно, если смотреть на плюсы и, упоси Боже, на решетку. Где вы видели в постановке задачи отсылки к чистому Си?
7
18 ноября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Странно,что за всё обсуждение я не видел не одного кода,в то время как о каких-то мифических кодах с циклами и switch'ами идёт речь.Непонятно…
87
18 ноября 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: hivewarrior
В цикле все равно есть сравнение, так что даже без инкрементирования он будет жрать ресурсов больше.


А в свитче нету? Чудеса.

Цитата: hivewarrior
Достоинство свича перед циклом в том, что код более наглядный.


Для начинающих?
Цикл для меня аналогичен такому выражению: 7*8, свитч такому: 7+7+7+7+7+7+7+7. Что нагляднее?

Цитата: hivewarrior
Кстати, я бы не решал за меня, сколько мне понадобиться изменять код, можно управиться и в одно изменение.


Ок. Приведите код со свитчем, возвращающем 1 - если цифра и 0, если не цифра, а потом код, который возвращает значения цифр. Сравним.

Цитата: hivewarrior
В моей реализации тоже узнаешь, цифра это или нет.


Вот именно только в вашей и не узнаю. А в классической реализации я смогу использовать выражение if(isdigit(c)){...} И поведение функции будет такое же, как в других аналогичных функциях: isalpha, isupper и т.д.

Цитата: hivewarrior
Да и то, что bool реализовано через одно место, еще не значит, что его нет. Особенно, если смотреть на плюсы и, упоси Боже, на решетку. Где вы видели в постановке задачи отсылки к чистому Си?


Я привёл исторический факт. Типа bool в си не было.

Кстати, не советую ругаться и злоупотреблять жаргоном. Обычно так делают школьники.

87
18 ноября 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: @pixo $oft
Странно,что за всё обсуждение я не видел не одного кода,в то время как о каких-то мифических кодах с циклами и switch'ами идёт речь.Непонятно…


Код с циклами должен был написать автор темы. Пока ему не мешаем. С другой стороны, реализации вроде бы простейшие.

7
18 ноября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Простейшая,ясен перец.А что,без циклов никак нельзя?Вроде char можно сравнивать с символами,так почему бы не
 
Код:
if(c>='0'&&c<='9')return true;
и в этом духе.Поправьте меня,ежели я неправ
87
18 ноября 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: @pixo $oft
А что,без циклов никак нельзя?


Задание же - сделать с циклом.

Цитата: @pixo $oft
Вроде char можно сравнивать с символами,так почему бы не
 
Код:
if(c>='0'&&c<='9')return true;
и в этом духе.Поправьте меня,ежели я неправ



Так я и говорил об этом варианте, для случая когда в кодировке цифры идут подряд. И говорил, что это не соответствует заданию. Но у тебя ошибка. По хорошему должно быть ещё else.

35K
18 ноября 2010 года
life4fun
64 / / 15.11.2010
например так?

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);
}
87
18 ноября 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: life4fun
int isdigit (char c)
{
return c>='0'&&c<='9';
}


Это хорошо. Но без циклов.

Цитата: life4fun
const int before_func_name = 0;
insert (char *s, char c, int i)
{
insert ("void", '\t', before_func_name);
}


А что требуется то? Бесконечная рекурсия или запись в константу?

35K
18 ноября 2010 года
life4fun
64 / / 15.11.2010
Цитата:
А что требуется то? Бесконечная рекурсия или запись в константу?



скорее первое, с чем у меня плохо получается(

7
19 ноября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Kogrom
Но у тебя ошибка. По хорошему должно быть ещё else.

Это не ошибка,а я решил не писать;)

Каюсь,забыл задание,а перечитать не сделал

33K
19 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Цитата: Kogrom

А в свитче нету? Чудеса.


Я про сравнение регистра CX и веселой команде LOOP, а не о сравнении внутри цикла. Мой свитч и ваш if внутри фора. А вот inc и loop, это уже лишнее время

Цитата: Kogrom

Для начинающих?
Цикл для меня аналогичен такому выражению: 7*8, свич такому: 7+7+7+7+7+7+7+7. Что нагляднее?


Не надо путать теплое с мягким и проводить такие аналогии. Не хуже меня знаете, что циклы не всегда очевидны, как 7*8. Свич же очевиден всегда.

Цитата: Kogrom

Ок. Приведите код со свитчем, возвращающем 1 - если цифра и 0, если не цифра, а потом код, который возвращает значения цифр. Сравним.


Код:
int isdigit(char c){
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
Цитата: Kogrom

Я привёл исторический факт. Типа bool в си не было.


Я тоже сослался на исторический факт

Цитата: Kogrom

Кстати, не советую ругаться и злоупотреблять жаргоном. Обычно так делают школьники.


Уличают в собеседнике школьника тоже далеко не самые взрослые оппоненты.:p

33K
19 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Цитата: Kogrom

По хорошему должно быть ещё else.


Не нужно там никакого else. Просто под if пишешь return false.

87
19 ноября 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: hivewarrior
Я про сравнение регистра CX и веселой команде LOOP, а не о сравнении внутри цикла. Мой свитч и ваш if внутри фора. А вот inc и loop, это уже лишнее время


То что неразвернутый компилятором цикл будет медленнее - это понятно. Я же говорил про то, что современный компилятор может развернуть цикл в тот же код, что и в свитч. Зачем делать эту работу вместо компилятора?

Цитата: hivewarrior
Не надо путать теплое с мягким и проводить такие аналогии. Не хуже меня знаете, что циклы не всегда очевидны, как 7*8. Свич же очевиден всегда.


Чем плоха аналогия?
Свитч надо читать весь, а цикл сразу виден. Более того, в свитче частенько хитрят с break, что делает код ещё более неочевидным.

Но тут дело вкуса, конечно.

Цитата: hivewarrior
Код:
int isdigit(char c){
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 миллисекунды быстрее он может и не заметит никогда, а ошибки, вызванные многочисленными переделками всплывут рано или поздно.

Цитата: hivewarrior
Я тоже сослался на исторический факт


На какой?

Цитата: hivewarrior
Уличают в собеседнике школьника тоже далеко не самые взрослые оппоненты.:p


Естественно я не взрослый. Я бы возмутился, если бы меня назвали взрослым.

На счет else - это опять таки дело вкуса. Некоторые считают, что с else код более очевиден. Я тут нейтрален.

33K
19 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Цитата: Kogrom
То что неразвернутый компилятором цикл будет медленнее - это понятно. Я же говорил про то, что современный компилятор может развернуть цикл в тот же код, что и в свитч. Зачем делать эту работу вместо компилятора?


Может сделать, а может и не сделать... Не доверяю я этой машинке.

Цитата: Kogrom

Чем плоха аналогия?
Свитч надо читать весь, а цикл сразу виден. Более того, в свитче частенько хитрят с break, что делает код ещё более неочевидным.
Но тут дело вкуса, конечно.


Виден то он сразу, но больше похож не на 7*8, а на
7*(ln(e)+)*8+(0!)-pow(7*8,0)
Да и не сильно то и хитрят с бряками, по крайней мере не так хитро как в циклах. Либо бряк есть, либо бряка нет.

Цитата: Kogrom

Ну вот, я доволен. Для того, чтобы обойтись меньшим количеством изменений вы внесли в код дополнительную переменную и дополнительную операцию. Куда же делась любовь к оптимизации?
Хорошо. Теперь представьте, что заказчик попросил возвращать не само число, а код символа, если он цифра и 0, если не цифра. А такие пожелания заказчиков (менять поведение программы) - не редкость. То, что ваша программа стала работать на 3 миллисекунды быстрее он может и не заметит никогда, а ошибки, вызванные многочисленными переделками всплывут рано или поздно.


Оптимизация не в скорости, а в архитектуре. Мне нужно всего одно изменение (даже с лишней переменной код будет работать быстрее), а если вас попросят изменить что-то, например вывод не 0 и 1, а, собственно, числа или -1.
Кстати, в сообщениях Windows частенько именно отрицательные значения - ошибки, а положительные - результат действия. Так что вопрос о том, что принято возвращать 1 и 0 достаточно спорный.

87
20 ноября 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: hivewarrior
Может сделать, а может и не сделать... Не доверяю я этой машинке.


Тут надо смотреть как работает конкретный компилятор с определёнными ключами. Если интересно, могу провести эксперименты с компилятором gcc. Возможно, он и в самом деле не осилит.

Самому мне лень и не интересно :)

Цитата: hivewarrior
Виден то он сразу, но больше похож не на 7*8, а на
7*(ln(e)+)*8+(0!)-pow(7*8,0)


Не понял, к чему это. 7*8 - это и есть цикл, хоть и не привязанный к языку программирования.

Цитата: hivewarrior
Мне нужно всего одно изменение (даже с лишней переменной код будет работать быстрее), а если вас попросят изменить что-то, например вывод не 0 и 1, а, собственно, числа или -1.


Тут лукавство. Ибо ваш пример был заточен под конкретные изменения. По хорошему надо учитывать и все случаи, где использована переменная lresult.

А с циклами без всяких добавок останется 2 правки:

Код:
int isdigit(char c)
{
    const char *digits = "0123456789";

    for(int i = 0; i < 10; ++i)
        if(digits == c)
            //return 1;
            return i;
    //return 0;
    return -1;
}

Подозреваю, что можно сделать ещё более изящный цикл. В отличие от свитча, циклу не надо хранить в теле программы константы от 0 до 9.

Естественно, свитч будет лучше, если надо будет возвращать результат никак не вычисляемый из параметра функции. Но это не тот случай.
Цитата: hivewarrior
Кстати, в сообщениях Windows частенько именно отрицательные значения - ошибки, а положительные - результат действия. Так что вопрос о том, что принято возвращать 1 и 0 достаточно спорный.


Да нет тут спорного. На вопрос "Да или нет?" надо отвечать либо "да", либо "нет". А главное, надо ещё постараться выдумать смысл для возврата значения конкретной цифры. Обычно требуется значение всего числа.

87
22 ноября 2010 года
Kogrom
2.7K / / 02.02.2008
Решил всё-таки проверить своё предположение на счёт оптимизаторов. Для этого компилировал с помощью gcc, применяя ключ -S и разные ключи оптимизации.

Исходная функция (программа на си - потому внесены небольшие корректировки):

 
Код:
int isdigit_(char c)
{
    const char *digits = "0123456789";

    int i = 0;
    for(; i < 10; ++i)
        if(digits == c)
            return 1;
    return 0;
}


Код без оптимизации:
Код:
.LC0:
    .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:
Код:
.p2align 4,,15
.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). Но при этом код стал менее компактным. Вроде бы практика подтвердила теорию.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог