LINUX.ORG.RU

Двунаправленный список на Си.

 


0

1

Здравствуйте. Являюсь начинающим в разработке на языке Си, и столкнулся с проблемой в решении следующей задачи: Для решения задачи сформируйте двунаправленный список. Дана последовательность латинских букв, оканчивающаяся точкой. Среди букв есть специальный символ Ch, появление которого означает отмену предыдущего символа. Учитывая вхождение этого символа, преобразуйте последовательность.

На бумаге всё проще простого, но с реализацией на Си есть проблемы. Можете предложить свой пример решения? Всё в статике, никаких динам. массивов и тд. maxsize взять за 100



Последнее исправление: LokiGG (всего исправлений: 1)
Ответ на: комментарий от ugoday

Представьте себе. Компиляторов лиспа не существует и существовать не может. Некоторые из них умеют создавать бинарный исполняемый файл, только вот незадача, в них вшивается интерпретатор или бинарник требует библиотеку-интерпретатор.

Почему это кому-то не очевидно, если в языке есть eval?

zx_gamer ★★★
()
Ответ на: комментарий от zx_gamer

Нафиг писать программу на Си, если не оптимизировать её?

Программа должна:

  1. Работать правильно.

  2. Работать безопасно.

  3. Работать быстро.

Так что до третьего этапа ещё дожить надо, а это не у всех получается. Да и даже если вышло, то оптимизировать нужно не всё подряд, а только критический участок кода. Так что неоптимальный код на С вполне имеет для себя нишу.

ugoday ★★★★★
()
Ответ на: комментарий от zx_gamer

Компиляторов лиспа не существует и существовать не может

Ну, раз вы запрещаете, то ничего не поделаешь.

ugoday ★★★★★
()
Ответ на: комментарий от AntonI

А кто нибудь обратил внимание что ТС уже давненько молчит? Лично я начинаю метаться между гипотезами (а) сдал таки контрольную, или (б) - потирает ручки и смеётся :)

bugfixer ★★★★★
()
Ответ на: комментарий от zx_gamer

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

Кстати один из лоровцов, очень уважаемый лиспер, прошивал на лиспе плис (fpga) для минимизации латентности при электронных торгах. Ну у них там денег в США много, могут и плисок накупить полный машзал.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 2)
Ответ на: комментарий от bugfixer

г) Сдаёт другие зачеты. д) Завалил сессию и получил повестку. е) Почитал тред и решил таки уйти в барберы.

AntonI ★★★★★
()
Ответ на: комментарий от ugoday

Так что неоптимальный код на С вполне имеет для себя нишу.

Накину таки на вентилятор - вы действительно считаете что то что вы предлагали несколько страниц назад хотя бы приближается к оптимальному алгоритмическому решению безотносительно выбранного языка?

bugfixer ★★★★★
()
Ответ на: комментарий от AntonI

е) Почитал тред и решил таки уйти в барберы.

Лучшее решение!

Aceler ★★★★★
()
Ответ на: комментарий от anonymous

Спорно. Условие допускает довольно вольную трактовку, вплоть до «пикау»

И кстати «пикаччу» некорректный вход, должно быть «pikachchu.»

AntonI ★★★★★
()
Ответ на: комментарий от bugfixer

На олимпиаде или экзамене — нет, определённо не является оптимальным ни по какому критерию. А вот в реальной жизни именно так и надо писать. Понятность и безопасность важнее скорости. Насчёт понятности вы можете спорить, тут тема субъективная, но в функциональщине идиома map/filter/reduce занимает то же место, что и паттерны проектирования в ООП. Видит человек абстрактную фабрику синглетонов fold-right и сразу понятно, чего автор сказать хотел. А вот безопасность вещь объективная, в данном коде выход за границы или обращение к несуществующему элементу последовательности невозможны в принципе. По построению. А вот если вы будете в цикле по индексам массива ходить, то единственный способ удостовериться, что хакеры не украдут все наши секреты, это внимательно прочитать тело цикла глазами строчка за строчкой.

ugoday ★★★★★
()
Ответ на: комментарий от AntonI

Ну, как хочешь. Тогда только 3 🙂️

anonymous
()
Ответ на: комментарий от ugoday

в данном коде выход за границы или обращение к несуществующему элементу последовательности невозможны в принципе.

С Вашим то талантом и не такое возможно…

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

Шо, в лиспе нету проверки попадания индекса в заданный диапазон?!

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от ugoday

А вот в реальной жизни именно так и надо писать.

Эвона как.

Понятность и безопасность важнее скорости.

Вы хоть раз слышали выражение «волка ноги кормят»? Не, я на самом деле только за - чем больше у вас последователей тем больше «икорки» нам достанется… Так что - дерзайте! :-)

bugfixer ★★★★★
()
Ответ на: комментарий от AntonI

А я сделал!

def pikapika(seq, sym='Ch'):
    res = []
    for c in seq:
        if c == sym:
            res and res.pop()
        else:
            res.append(c)
    return res

inp = 'Ch p i k a Ch u Ch u Ch Ch'
ans = pikapika(inp.split())
print(inp, '→', *ans)
Ch p i k a Ch u Ch u Ch Ch → p i
anonymous
()
Ответ на: комментарий от ugoday

Программа должна:

  1. Работать

Починил.

Nervous ★★★★★
()
Ответ на: комментарий от AntonI

Да я тоже хотел, но потом посмотрел и мне показалось, что так лучше.

Кстати, в питоне можно ставить точки с запятой: import sys; print(....

anonymous
()
Ответ на: комментарий от AntonI

reduce

Отличная идея!

import sys; print(*__import__('functools').reduce(lambda x,y: x+[y] if y != sys.argv[2] else x[:-1], sys.argv[1].split(), []))
$ p test.py 'Ch p i k a Ch u Ch u Ch Ch .' Ch
p i .
anonymous
()
Ответ на: комментарий от anonymous

Ну, нет, не любой. Всё же проще корректную программу сделать быстрой, нежели быструю — корректной.

ugoday ★★★★★
()
Ответ на: комментарий от anonymous
$ cat ch.c
main(p,v,b,h)short**v,*b,*p;{for(p=b,h=**v;*++v;p+=**v<h?1:-(p>b),*p=0)*p=**v+8192;puts(b);}
$ wc -c ch.c
92
$ gcc ch.c -o ch 2>/dev/null
$ ./ch Ch   Ch p i k a Ch u Ch u Ch Ch .
p i . 
anonymous
()
Ответ на: комментарий от bugfixer

Если контрольную, то вряд ли сдал. Там очевидно, что задание не про то, чтобы код написать, а задать минимум четыре вопроса:
1. Отменят ли ch точку?
2. Как обрабатывать несколько ch подряд?
3. Что делать если ch первым символом идет?
4. Во что преобразовать последовательность?

ya-betmen ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.