|
Автор канал по Лиспу
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
|
||||||
Пишу программу составления школьных расписаний на Лисп, уже на первом этапе возникли трудности11.08.2021, 00:15. Показов 4741. Ответов 36
Здравствуйте, пишу в качестве выпускного проекта программу составления расписаний на Лиспе, при этом испытываю большие сложности с самого начала, в голове практически пусто.
Начать решил с функции проверки расписания на корректность, при этом само расписание представил так:
Каждый день - тоже список. И содержит он ряд описаний уроков. Описание урока (какая неожиданность) - и на этот раз список. Первым в нем идет строка с названием предмета, дальше имя учителя и в конце номер аудитории. В каждом классе дни начинаются с одного и того-же, и уроки каждый день с одного и того-же. Вся эта мишура списков - суть есть таблица, и для проверки нужно проверить, не ведут ли учителя уроки у разных классов или не занят ли один кабинет сразу несколькими классами. С чего мне начать? Если бы у всех классов каждый день было одно и тоже количество уроков, было бы проще (тут напрашивается мысль про выравнивание).
0
|
||||||
| 11.08.2021, 00:15 | |
|
Ответы с готовыми решениями:
36
программа составления расписания школьных занятий Возникли трудности |
|
Супер-модератор
|
|||||||||||||||||
| 11.08.2021, 08:06 | |||||||||||||||||
|
1) код класса изображать атомом 1A, 2Б (это же Лисп!) 2) непонятно, почему списки уроков каждого класса искусственно разбиты на пары... После очевидной переработки получим что-то вроде:
2
|
|||||||||||||||||
|
Автор канал по Лиспу
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
|
|
| 11.08.2021, 08:19 [ТС] | |
|
Catstail, Спасибо! Отвечу на вопросы:
1) Я понимаю, но проблема в том, что потом нужно будет проверять, какой номер параллели (я ведь правильно применяю термин?) и соответствует ли полученная нагрузка СанПиНам. Или потом отделять числовую часть от буквенной? 2)Разбиты на пары они потому, что я привел такие примеры, где класс учится два дня по два урока. У вас получилось, что классы учатся один день четыре урока.
0
|
|
|
Супер-модератор
|
|||||||
| 11.08.2021, 08:25 | |||||||
Не по теме:
0
|
|||||||
|
161 / 141 / 10
Регистрация: 21.10.2012
Сообщений: 480
|
||||||||||||
| 11.08.2021, 11:19 | ||||||||||||
==> '(("математика" "Мария Ивановна" 210) ("русский" "Мария Ивановна" 210) ("физкультура" "Иван Иванович" 102) ("литература" "Румиль" 210)) **** 2A - по аналогии
'("русский" "Мария Ивановна" 210) *** Для lisp просто сделайте через defun
1
|
||||||||||||
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|||||||
| 11.08.2021, 13:49 | |||||||
|
Не зацикливайтесь на списках. Хотя вы можете использовать списки для представления расписания, расписание не есть списки. Вы встаёте на традиционный путь процедурного программирования, о котором много предупреждений: зафиксировать представление данных и плясать от этого представления. Проблема в том, что если представление меняется, то обслуживающий его код становится мусором, и приходится начинать сначала. Не говоря о том, что код становится хуже читаемым, потому что сначала приходится в голове перевести язык предметной области на язык представления и понять, что делается с представлением. (Хороший пример - код функции check в https://www.cyberforum.ru/post15658886.html. В нём нет ни единого слова, специфического для расписаний, это код для списков. Поэтому нужно хорошо держать в голове соответствие между списками и расписаниями, чтобы понять, что он делает. Что характерно, при изменении представления код требует переработки, при этом нужно держать в голове два двухсторонних соответствия: старое списочное представление ↔ расписание ↔ новое списочное представление.) Поэтому в наше время люди стараются не работать непосредственно с представлением. (В частности, эта идея является одной из базовых идей ООП.) Нет нужды держать эти соответствия в голове, если они могут быть выражены в коде. Не надо запоминать, что "car - это на самом деле название предмета". Просто пишете lesson-subject, и всё. Уже сам стандарт лиспа учит нас, что использовать представление - это нормально, но не отменяет пользы специфического словаря. Как известно, в лиспе нет списков, а есть конс-ячейки, и списки реализуются цепочками конс-ячеек. Функции first и rest ничем не отличаются от, соответственно, car и cdr, но они существуют, потому что для списка осмыслено брать "первый элемент" и "остальные элементы", и эта осмысленность не опирается на странные низкоуровневые по происхождению сокращения. По поводу реализации. Не старайтесь засунуть все данные в одну таблицу. Например, учитель - это человек. С ним могут быть ассоциированы разные данные - имя-отчество, возможно, телефон, почта, емейл. Причём эта ассоциация может меняться со временем. Совершенно нет нужды совать это всё в расписание. Достаточно поместить туда ID учителя. В качестве ID имеет смысл использовать что-то попроще - по крайней мере, не массив символов, коим является строка. При разработке удобно пользоваться символами, в более разработанной программе могут оказаться удобнее номера, потому что их удобно хранить вне программы (например, в электронной таблице) и (что, по-моему, существенней) автоматически присваивать новые номера новым учителям. Переход на идентификаторы-числа не отразится на программе, если вы не будете сравнивать идентификаторы с помощью eq. А имя-отчество будут в другой таблице, которая будет связывать ID и фамилию, имя, отчество - уже записанные строками. Это будет и чище, и, предвижу, позволит сэкономить на #'string=. В принципе, можно подумать о том, насколько вы хотите сделать программу объектно-ориентированной, в самом широком смысле. Объект - это сущность, обладающая идентичностью. Есть ли идентичность в вашей предметной области? Осмыслено ли выражение "тот же самый урок"? Не "абсолютно такой же", а "тот же самый"? Пока у вас в программе это никак не ловится, ср.
3
|
|||||||
|
161 / 141 / 10
Регистрация: 21.10.2012
Сообщений: 480
|
|||||||
| 11.08.2021, 14:15 | |||||||
"welcome to CLISP online ide from JDoodle.com" (("математика" "Мария Ивановна" 210) ("русский" "Мария Ивановна" 210) ("физкультура" "Иван Иванович" 102) ("литература" "Румиль" 210)) "" "Второй урок в 1А классе" ("русский" "Мария Ивановна" 210)
1
|
|||||||
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|
| 11.08.2021, 14:46 | |
|
Во, вот это уже в некотором роде ООП. Расписание для 1A - конкретный объект.
С точки зрения стиля там нужно defparameter вместо setq и ушки желательно: *1A*.
1
|
|
|
Заблокирован
|
|
| 11.08.2021, 14:53 | |
|
Я бы сделал как хеш-таблицу где ключ - это номер аудитории, значение - список. Потом добавлял бы по ключу значения в список - ФИО препода и предмет, который он ведёт. Например, если Иван Петрович ведёт историю в 210 аудитории, то добавляем его по этому ключу в хеш-таблицу.
Всё что потом остаётся - это пробежаться по таблице.
1
|
|
|
Автор канал по Лиспу
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
|
|
| 11.08.2021, 22:13 [ТС] | |
|
helter, Очень интересный комментарий. Пожалуйста, разъясните ещё на простых примерах, у вас получилось написать довольно полезный текст, спасибо! Прошу поподробнее рассказать про то, как я могу углубиться в процедурное программирование и как этого избежать.
0
|
|
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|||||||||||
| 12.08.2021, 13:00 | |||||||||||
|
Плохо не процедурное программирование само по себе, а отсутствие того, что в сикпе называют абстракция данных.
Например, человек. Предположим, у человека есть ID, имя, фамилия, емейл. То есть "человек" заключает в себе несколько свойств. Смысл абстракции данных состоит в том, что вы не говорите себе, что "человек есть список, у которого на первом месте записан ID, на втором - имя, на третьем - фамилия, на четвёртом - емейл", а говорите "человек есть штука, к которой я могу применить функцию person-id и получить ID, функцией person-name получить имя, функцией person-surname получить фамилию, функцией person-email получить емейл". Если "человек" объединяет четыре свойства, то с ним совершенно естественно ассоциируются четыре функции-акцессора, которые вынимают эти куски информации. Тот факт, что человека можно реализовать по-разному, никак не влияет на принципиальное существование этих функций-акцессоров. Человек - это чёрная коробка, из которой функциями можно доставать интересующую информацию. Наряду с функциями-акцессорами нужна функция-конструктор, чтобы эти чёрные коробки откуда-то могли появиться в программе. В данном случае это может быть make-person, которая по ID, имени и т. п. будет возвращать человека. Таким образом, у вас есть набор из пяти функций, которых достаточно для работы с человеком: конструктор: make-person акцессоры: person-id person-name person-surname person-email Реализации человека могут быть самыми разными. Например, в виде списка, структурой, хеш-таблицей, классом. Возможные списковые реализации:
Задача: посчитать, сколько в заданном списке Иванов. Решение:
Абстракцию данных можно развивать и дальше, и там до настоящего ООП уже недалеко. Абстракция данных не непреложное правило или закон, а просто приём разработки. Индустрия в целом уже наступала на грабли злоупотребления "сырыми данными". Но иногда можно и зафиксировать реализацию. Например, в CL список - это цепочка конс-ячеек определённого вида, и это вряд ли когда-то изменится. Первый элемент списка всегда можно будет получить функцией car. Это "исключение" базируется на десятилетиях использования и высеченном в камне стандарте.
3
|
|||||||||||
|
Автор канал по Лиспу
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
|
|
| 12.08.2021, 19:21 [ТС] | |
|
helter, Очень хорошо! Ваши разъяснения крайне интересны. Как вы думаете, имеет ли смысл применять тут CLOS? Проект все таки учебный и нужен для допуска к ЕГЭ (Рубикон пройден, и поменять проект мне врядли дозволят). Что будет полезнее, применять абстракции просто объявляя функции, или через CLOS?
Не по теме: У меня имеется ещё один учебный проект, в котором я написал первую версию. Не могли бы вы посмотреть его код? Какие ошибки были совершены, и как не допустить их в будущем? Вот проект: https://gitlab.com/Regrin/regrin-zettel
0
|
|
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
||
| 13.08.2021, 00:49 | ||
|
Думаю, можно и без CLOSа.
Хотя, честно говоря, я не очень понимаю, что эта программа должна будет в конечном счёте делать. Неужели расписание составлять?
0
|
||
|
Автор канал по Лиспу
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
|
||
| 13.08.2021, 13:05 [ТС] | ||
|
И программа должна именно составлять расписания!
0
|
||
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
||
| 13.08.2021, 13:58 | ||
|
Добавлено через 30 минут По поводу моделирования я подумал - наверно, я бы плясал от урока без привязки к сетке расписания. Например, в 11А нагрузка 10 часов математики в неделю, 2 часа литературы и т. п. - тогда создать 10 объектов - уроков математики, 2 объекта - литература и т. п. А составление расписание - это распределение объектов по сетке. Таким образом, каждый урок "знает" свой класс, предмет, учителя и, скорее всего, знает кабинет.
2
|
||
|
Заблокирован
|
|
| 15.08.2021, 10:01 | |
|
Хе-хе. Ещё в прошлый раз хотел написать, что helter попал. А как его автор топика умасливал)
Составление расписаний - это очень сложная задача. А если это крупное учебное заведение, то практически невыполнимое) Впору начинать писать нейросеть под это дело)
4
|
|
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|
| 15.08.2021, 13:16 | |
|
Ну, если поиск в глубину ничего не найдёт, например, за миллион итераций, я умываю руки.
Одно дело - программирование, другое - алгоритмы.
0
|
|
|
Заблокирован
|
|
| 15.08.2021, 13:26 | |
|
helter, ну тут не только в итерациях дело. Допустим у нас есть 30 аудиторий и 100 учителей и надо составить расписание так, чтобы уроки одних учителей в конкретных аудиториях не накладывались на другие. Количество возможных комбинаций уже велико. Плюс нужно учитывать разные аспекты, вроде окон между занятиями, методических дней тд. То есть нужно учитывать много факторов и хранить огромное число состояний.
0
|
|
|
Автор канал по Лиспу
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
|
||
| 15.08.2021, 14:54 [ТС] | ||
|
http://www.mnogosmenka.ru/pilikov/timetable.htm http://www.mnogosmenka.ru/pilikov/school.htm От меня ведь никто не требует коммерческого продукта.
0
|
||
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|
| 15.08.2021, 15:28 | |
|
К счастью, я не знаю, что такое методические дни.
В моём представлении состояние, грубо говоря, одно - заполненная часть расписания. Проверок расписания на валидность может быть сколько угодно, но каждая из них сводится к предикату "сломалось ли расписание после заполнения следующей ячейки?". Эти предикаты могут смотреть, какой учитель ведёт урок, в каком кабинете и т. п., потому что такие данные ассоциированы с уроками. Две проверки или двадцать две - дело техники.А меня пугает комбинаторная сложность. Там же факториалы лезут ото всюду. Грубо говоря, пусть у класса 30 часов в неделю - это 30! перестановок. Пусть, например, 20 классов - это 30!^20 комбинаций. Очень много. Любая программа обработает микроскопическую часть этого пространства. Конечно, поиск по графу за раз отбраковывает целый подграф, но всё равно стандартные алгоритмы, такие, как поиск в глубину, никак не заточены конкретно под расписания, то есть в определённом смысле "тупые". И, по-моему, единственная надежда на то, что валидные расписания плотно натыканы в пространстве комбинаций.
0
|
|
| 15.08.2021, 15:28 | |
|
Помогаю со студенческими работами здесь
20
Возникли трудности с задачей Возникли трудности с функцией! Возникли трудности с задачками JDK возникли трудности
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|