Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357

Пишу программу составления школьных расписаний на Лисп, уже на первом этапе возникли трудности

11.08.2021, 00:15. Показов 4741. Ответов 36

Студворк — интернет-сервис помощи студентам
Здравствуйте, пишу в качестве выпускного проекта программу составления расписаний на Лиспе, при этом испытываю большие сложности с самого начала, в голове практически пусто.
Начать решил с функции проверки расписания на корректность, при этом само расписание представил так:
Lisp
1
2
3
4
5
'((1 "A" (("математика"  "Мария Ивановна" 210) ("русский"     "Мария Ивановна" 210))
         (("физкультура" "Иван Иванович"  102) ("литература"  "Румиль"         210)))
 
  (2 "А" (("литература"  "Румиль"         211) ("физкультура" "Иван Иванович"  102))
         (("математика"  "Мария Ивановна" 211) ("русский"     "Мария Ивановна" 211))))
В корневом списке содержатся классы. Каждый класс - это тоже список. Первым в нем идет номер класса, за ним буква. дальше подряд идут дни.
Каждый день - тоже список. И содержит он ряд описаний уроков. Описание урока (какая неожиданность) - и на этот раз список. Первым в нем идет строка с названием предмета, дальше имя учителя и в конце номер аудитории.
В каждом классе дни начинаются с одного и того-же, и уроки каждый день с одного и того-же. Вся эта мишура списков - суть есть таблица, и для проверки нужно проверить, не ведут ли учителя уроки у разных классов или не занят ли один кабинет сразу несколькими классами.
С чего мне начать? Если бы у всех классов каждый день было одно и тоже количество уроков, было бы проще (тут напрашивается мысль про выравнивание).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.08.2021, 00:15
Ответы с готовыми решениями:

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

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

Возникли трудности(

36
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,697
Записей в блоге: 14
11.08.2021, 08:06
Цитата Сообщение от Regrin1 Посмотреть сообщение
С чего мне начать?
- рекомендую чуть упростить исходный список:

1) код класса изображать атомом 1A, 2Б (это же Лисп!)
2) непонятно, почему списки уроков каждого класса искусственно разбиты на пары...

После очевидной переработки получим что-то вроде:

Lisp
1
2
3
4
(setq *main* '((1A (("математика"  "Мария Ивановна" 210) ("русский"     "Мария Ивановна" 210)
                    ("физкультура" "Иван Иванович"  102) ("литература"  "Румиль"         210)))
               (2А (("литература"  "Румиль"         211) ("физкультура" "Иван Иванович"  102)
                    ("математика"  "Мария Ивановна" 211) ("русский"     "Мария Ивановна" 211)))))
А теперь составим список пар вида (Учитель номер-урока):

Lisp
1
2
3
4
5
6
7
8
9
10
(defun zip (list1 list2)
  (cond ((or (null list1) (null list2)) nil)
        (t (cons (list (car list1) (car list2)) (zip (cdr list1) (cdr list2))))))
    
(defun check (main-list)
  (apply 'append
     (mapcar (lambda (cls) 
             (mapcar (lambda (pair) (list (cadr (car pair)) (cadr pair)))
                     (zip cls (range 1 (length cls)))))
             (mapcar 'cadr main-list))))
Запустим и получим:

Lisp
1
2
3
(check *main*)
 
==> (("Мария Ивановна" 1) ("Мария Ивановна" 2) ("Иван Иванович" 3) ("Румиль" 4) ("Румиль" 1) ("Иван Иванович" 2) ("Мария Ивановна" 3) ("Мария Ивановна" 4))
Дальше - проще. Нужно проверить, нет ли у какого-либо учителя повторения номера урока...
2
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
11.08.2021, 08:19  [ТС]
Catstail, Спасибо! Отвечу на вопросы:
1) Я понимаю, но проблема в том, что потом нужно будет проверять, какой номер параллели (я ведь правильно применяю термин?) и соответствует ли полученная нагрузка СанПиНам. Или потом отделять числовую часть от буквенной?
2)Разбиты на пары они потому, что я привел такие примеры, где класс учится два дня по два урока. У вас получилось, что классы учатся один день четыре урока.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,697
Записей в блоге: 14
11.08.2021, 08:25
Цитата Сообщение от Regrin1 Посмотреть сообщение
класс учится два дня по два урока
- ну и сделайте список таким:

Lisp
1
2
3
(setq *main* '((1A пон (("математика"  "Мария Ивановна" 210) ("русский"     "Мария Ивановна" 210))
                      (1A вто (("физкультура" "Иван Иванович"  102) ("литература"  "Румиль"         210))))
                      ... )
Естественно, код придется переработать.

Не по теме:


класс учится два дня по два урока - школа вспомогательная? :(

0
 Аватар для chessman2
161 / 141 / 10
Регистрация: 21.10.2012
Сообщений: 480
11.08.2021, 11:19
Цитата Сообщение от Regrin1 Посмотреть сообщение
испытываю большие сложности
Я бы каждый учебный класс сделал отдельным определением/функцией.

Lisp
1
2
3
4
5
6
7
8
#lang racket
 
(define 1A
  (list
        '("математика"  "Мария Ивановна" 210)
        '("русский"     "Мария Ивановна" 210)
        '("физкультура" "Иван Иванович"  102)
        '("литература"  "Румиль"         210)))
1A

==>
'(("математика" "Мария Ивановна" 210)
("русский" "Мария Ивановна" 210)
("физкультура" "Иван Иванович" 102)
("литература" "Румиль" 210))

****
2A - по аналогии

Lisp
1
2
3
4
5
; Выборка
 
(define ( урок-2 lst) (second lst))
  
(урок-2 1A)
==>
'("русский"
"Мария Ивановна"
210)

***
Для lisp просто сделайте через defun
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
11.08.2021, 13:49
Цитата Сообщение от Regrin1 Посмотреть сообщение
С чего мне начать?
Продумайте, какие сущности у вас в программе, и что с ними можно делать. Думайте как расписание. Будьте расписанием. Например, "урок" может характеризоваться такими параметрами как "кабинет", "класс", "номер в сетке уроков", "час", "учитель". Соответственно, вам нужны какие-то функции навроде lesson-room, lesson-form и т. п. Нужна и функция, создающая урок. Может быть, после этого расписание может оказаться просто списком уроков.

Не зацикливайтесь на списках. Хотя вы можете использовать списки для представления расписания, расписание не есть списки. Вы встаёте на традиционный путь процедурного программирования, о котором много предупреждений: зафиксировать представление данных и плясать от этого представления. Проблема в том, что если представление меняется, то обслуживающий его код становится мусором, и приходится начинать сначала. Не говоря о том, что код становится хуже читаемым, потому что сначала приходится в голове перевести язык предметной области на язык представления и понять, что делается с представлением. (Хороший пример - код функции check в https://www.cyberforum.ru/post15658886.html. В нём нет ни единого слова, специфического для расписаний, это код для списков. Поэтому нужно хорошо держать в голове соответствие между списками и расписаниями, чтобы понять, что он делает. Что характерно, при изменении представления код требует переработки, при этом нужно держать в голове два двухсторонних соответствия: старое списочное представление ↔ расписание ↔ новое списочное представление.) Поэтому в наше время люди стараются не работать непосредственно с представлением. (В частности, эта идея является одной из базовых идей ООП.) Нет нужды держать эти соответствия в голове, если они могут быть выражены в коде. Не надо запоминать, что "car - это на самом деле название предмета". Просто пишете lesson-subject, и всё. Уже сам стандарт лиспа учит нас, что использовать представление - это нормально, но не отменяет пользы специфического словаря. Как известно, в лиспе нет списков, а есть конс-ячейки, и списки реализуются цепочками конс-ячеек. Функции first и rest ничем не отличаются от, соответственно, car и cdr, но они существуют, потому что для списка осмыслено брать "первый элемент" и "остальные элементы", и эта осмысленность не опирается на странные низкоуровневые по происхождению сокращения.

По поводу реализации.

Не старайтесь засунуть все данные в одну таблицу. Например, учитель - это человек. С ним могут быть ассоциированы разные данные - имя-отчество, возможно, телефон, почта, емейл. Причём эта ассоциация может меняться со временем. Совершенно нет нужды совать это всё в расписание. Достаточно поместить туда ID учителя. В качестве ID имеет смысл использовать что-то попроще - по крайней мере, не массив символов, коим является строка. При разработке удобно пользоваться символами, в более разработанной программе могут оказаться удобнее номера, потому что их удобно хранить вне программы (например, в электронной таблице) и (что, по-моему, существенней) автоматически присваивать новые номера новым учителям. Переход на идентификаторы-числа не отразится на программе, если вы не будете сравнивать идентификаторы с помощью eq. А имя-отчество будут в другой таблице, которая будет связывать ID и фамилию, имя, отчество - уже записанные строками. Это будет и чище, и, предвижу, позволит сэкономить на #'string=.

В принципе, можно подумать о том, насколько вы хотите сделать программу объектно-ориентированной, в самом широком смысле. Объект - это сущность, обладающая идентичностью. Есть ли идентичность в вашей предметной области? Осмыслено ли выражение "тот же самый урок"? Не "абсолютно такой же", а "тот же самый"? Пока у вас в программе это никак не ловится, ср.
Lisp
1
2
> (eq '("математика"  "Мария Ивановна" 210) '("математика"  "Мария Ивановна" 210))
NIL
Списки выглядят одинаково, но это не один и тот же список, а два похожих. В принципе, лисп имеет давнюю объектно-ориентированную традицию: я говорю не о CLOS и его предшественниках, а об использовании для моделирования сущностей с идентичностью (для которых будет естественным термин "тот же самый").
3
 Аватар для chessman2
161 / 141 / 10
Регистрация: 21.10.2012
Сообщений: 480
11.08.2021, 14:15
Цитата Сообщение от chessman2 Посмотреть сообщение
Для lisp просто сделайте через defun
; А можно так, вариант для CLISP

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(print  "welcome to CLISP online ide from JDoodle.com")
 
(setq 1A
  (list
        '("математика"  "Мария Ивановна" 210)
        '("русский"     "Мария Ивановна" 210)
        '("физкультура" "Иван Иванович"  102)
        '("литература"  "Румиль"         210)))
        
(print 1A)
 
(defun урок-2 (lst) (second lst))
 
(print "") 
(print "Второй урок в 1А классе") 
(print (урок-2 1A))
=>
"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
Автор канал по Лиспу
 Аватар для Regrin1
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

Реализации человека могут быть самыми разными. Например, в виде списка, структурой, хеш-таблицей, классом. Возможные списковые реализации:
Lisp
1
2
3
4
5
(1 "Иван" "Иванов" "ivan@ivanov.com")
(1 "Иванов" "Иван" "ivan@ivanov.com")
(person 1 "Иван" "Иванов" "ivan@ivanov.com")
(:id 1 :name "Иван" :surname "Иван" :email "ivan@ivanov.com")
...
Каждой из этих реализаций соответствуют разные реализации пяти перечисленных выше функций. Если мы, например, выбираем первую списковую реализацию, то person-name - это синоним second (который, в свою времени, является синонимом функции cadr для цепочек конс-ячеек общего вида). Эти реализации "по долгу службы" используют списковые функции, потому что в этом их назначение: установить соответствие между списковым представлением и абстрактными свойствами. Однако вне этих реализаций списковые функции к людям применять не надо, потому что человек не список.

Задача: посчитать, сколько в заданном списке Иванов. Решение:
Lisp
1
(count "Иван" list-of-persons :key #'person-name :test #'string=)
Это решение отражает логику "человека", а логика не должна ничего знать о реализации. Реализация для логики неважна. Поэтому решение, естественно, не зависит от реализации. Идея независимости в программировании повсюду. "Прибивание гвоздями" уменьшает ценность кода.

Абстракцию данных можно развивать и дальше, и там до настоящего ООП уже недалеко.

Абстракция данных не непреложное правило или закон, а просто приём разработки. Индустрия в целом уже наступала на грабли злоупотребления "сырыми данными". Но иногда можно и зафиксировать реализацию. Например, в CL список - это цепочка конс-ячеек определённого вида, и это вряд ли когда-то изменится. Первый элемент списка всегда можно будет получить функцией car. Это "исключение" базируется на десятилетиях использования и высеченном в камне стандарте.
3
Автор канал по Лиспу
 Аватар для Regrin1
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а. Хотя, честно говоря, я не очень понимаю, что эта программа должна будет в конечном счёте делать. Неужели расписание составлять?

Цитата Сообщение от Regrin1 Посмотреть сообщение
Не могли бы вы посмотреть его код?
Обязательно посмотрю!

Не по теме:

Цитата Сообщение от Regrin1 Посмотреть сообщение
Проект все таки учебный и нужен для допуска к ЕГЭ
Не моё дело, но неужели школьников заставляют писать неслабые программы на лиспе для допуска к экзамену? :o

0
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
13.08.2021, 13:05  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
Цитата Сообщение от Regrin1 Посмотреть сообщение
Проект все таки учебный и нужен для допуска к ЕГЭ
Не моё дело, но неужели школьников заставляют писать неслабые программы на лиспе для допуска к экзамену? :o
Да нет, это я не оценил сложность, и не выяснил, что чуть ли не на каждом курсе находится один такой умный.
И программа должна именно составлять расписания!
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.08.2021, 13:58
Цитата Сообщение от Regrin1 Посмотреть сообщение
И программа должна именно составлять расписания!
Тогда вопрос номер один - как? Какие бывают алгоритмы составления расписаний? Я, честно говоря, затрудняюсь оценить комбинаторную сложность этой задачи и не представляю других способов её решения, кроме перебора. (Например, поиск в глубину: если часть сетки уже заполнена и нельзя заполнить следующую ячейку, то откатываем последнюю ячейку и заполняем её другим уроком и т. п.) Взлетит или нет - вопрос. Может, взлетит?

Добавлено через 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
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
15.08.2021, 14:54  [ТС]
Цитата Сообщение от sodda Посмотреть сообщение
Составление расписаний - это очень сложная задача. А если это крупное учебное заведение, то практически невыполнимое
Уже решали эту задачу, так что теоретически она выполнима:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.08.2021, 15:28
Помогаю со студенческими работами здесь

Возникли трудности с задачей
Имеется задача : Родители Пети Торопыжкина затеяли ремонт. Однажды его послали в строительный магазин, чтобы купить c кг цементной смеси....

Возникли трудности с функцией!
Нужно написать программу с помощью рекурсивной функции! У не могу написать рекурсивную функцию к задаче кто может помогите: ...

Возникли трудности с задачками
Доброго времени суток! Помогите пожалуйста решить следующие задачки.

JDK возникли трудности
Добрый день! Создаю сервер онлайн игры напиcанный на Java. Вот собственно сам гайд:...

Возникли трудности с подключением к БД - 2
Здравствуйте. Необходимо подключиться к БД через MATLAB 2017 программно. Делаю так: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Философия технологии
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 - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru