Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Алгоритмы и теория программирования


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

CradleA
Статус: Профессор
Рейтинг: 112
∙ повысить рейтинг »
solowey
Статус: 10-й класс
Рейтинг: 80
∙ повысить рейтинг »
Роман Селиверстов
Статус: Советник
Рейтинг: 0
∙ повысить рейтинг »

∙ Алгоритмы и теория программирования

Номер выпуска:214
Дата выхода:25.05.2018, 20:15
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:23 / 9
Вопросов / ответов:3 / 5

Консультация # 60163: Добрый день. Вот сегодня прочитал что SQL - это непроцедурный язык программирования. Насколько я знаю, си, паскаль и т.п. - это алгоритмические языки программирования. АЛГОЛ - ещё какой-то тип языка программирования. (А HTML вообще не язык программирования а язык разметки) Расскажите пожалуйста что такое процедурный / непроцедурный язык, чт...
Консультация # 159311: Здравствуйте, уважаемые эксперты. Интересует такой вопрос: Какие задачи можно решить, применяя структуры данных: список (1-, 2- направленный), стек, очередь. Например: Стек: анализ правильности скобочной последовательности; вычисление арифметического выражения; Пока знаю только стек....
Консультация # 124562: Здравствуйте, уважаемые эксперты! Помогите составить алгоритм или подскажите направление или идею реализации следующего: На листе бумаги формата А4, портретной ориентации нужно расположить печатные формы нескольких накладных так, чтобы пустое поле внизу листа было минимальным, а сами накладные не разрывались краем листа на две час...

Консультация # 60163:

Добрый день.
Вот сегодня прочитал что SQL - это непроцедурный язык программирования. Насколько я знаю, си, паскаль и т.п. - это алгоритмические языки программирования. АЛГОЛ - ещё какой-то тип языка программирования. (А HTML вообще не язык программирования а язык разметки)
Расскажите пожалуйста что такое процедурный / непроцедурный язык, что такое алгоритмический / неалгоритмический язык, и ещё расскажите какие типы языков программирования бывают и определения этих типов.

Дата отправки: 25.10.2006, 19:42
Вопрос задал: Вiктор
Всего ответов: 3
Страница онлайн-консультации »


Консультирует Muad Dib:

Здравствуйте, Вiктор!
Не знаю как SQL определяют теоретики, из того с чем приходилось сравнивать SQL более всего походит на PROLOG - соответственно логическое программирование. И по этой же классификации:
струтурное программирование(я бы сюда и ООП включил не выделяя его отдельно) - C, C++, Pascal/логическое программирование(PROLOG)/функциональное программирование(ML, Haskell)
http://www.cad.dp.ua/kurs/LECTURE1/lecture1.html
http://www.intuit.ru/department/se/tppfunc/1/
и Вообще:
http://www.google.com/search?client=safari&rls=en-us&q=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F+%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F&ie=UTF-8&oe=UTF-8

Консультировал: Muad Dib
Дата отправки: 25.10.2006, 21:00
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Sling:

Здравствуйте, Вiктор!
Во-первых, то что вы назвали алгоритмическими языками программирования, то-есть СИ, Паскаль - это и есть процедурные языки. Они изначально рассчитаны на то что программа разбивается на процедуры/функции. Таким образом в идеале основной текст программы выклядит, например, так: (на Си)
void main()
{
InputData();
Solution();
OutputData();
}
а остальной код расположен в отдельных функция, каждая из которых решает элементарную задачу.
В непроцедурных языках программирования (ну тот же ассемблер например) код идёт сплошным потоком. Прога хоть и может быть разбита на модули, но это немного не то. Такие языки очень неудобны для создания больших программ, хотя программы, написаные на них работают быстрее.
Современные языки программирования (Си++, Java) - это следующий уровень языков (не помню точно их названия). Суть написания кода в них заключается в том, что программа разбивается не на функции, а на классы, тоесть код ещё лучше разделен на части, в нём лучше ориентироваться, поддерживается защита данных, наследование, а значит, легко писать большие программы.

Консультировал: Sling
Дата отправки: 26.10.2006, 03:20
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Maska:

Здравствуйте, Вiктор!

О видах языках программирования можно говорить долго и много. Существует несколько классификаций, в зависимости от этого язык относится к той или иной группе. Вот ссылка, которая может быть Вам поможет:
http://thor.kubsu.ru/index.php/corporate/informatika/klassifikator_predmetnyh_znanij/tehnologii_razrabotki_algoritmov_i_programm/yazyki_programmirovaniya/klassifikaciya_yazykov_programmirovaniya.
Относительно, SQL, правильнее сказать, язык манинипулирования данными.

С уважением, maska!!!

Консультировал: Maska
Дата отправки: 26.10.2006, 03:47
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 159311:

Здравствуйте, уважаемые эксперты. Интересует такой вопрос:
Какие задачи можно решить, применяя структуры данных: список (1-, 2- направленный), стек, очередь.

Например:
Стек:
анализ правильности скобочной последовательности;
вычисление арифметического выражения;

Пока знаю только стек.

Дата отправки: 01.02.2009, 11:10
Вопрос задал: Тарасов Анатолий Викторович
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Тарасов Анатолий Викторович!
очередь:
Струкура "Первый вошел - первым вышел" может пригодиться для временного хранения неких событий,
которых надо обработать в порядке поступления. Классический пример - буфер клавиатуры.
Или некое устройство посылает команды, которые одна подпрограмма записывает в очередь,
Другая подпрограмма забирает команды из "головы" очереди для отработки.

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

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 02.02.2009, 01:48
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 124562:

Здравствуйте, уважаемые эксперты!

Помогите составить алгоритм или подскажите направление или идею реализации следующего:

На листе бумаги формата А4, портретной ориентации нужно расположить печатные формы нескольких накладных так, чтобы пустое поле внизу листа было минимальным, а сами накладные не разрывались краем листа на две части (есть аналогичная настройка в текстовых редакторах - "Не разрывать абзац" и "Запрет висячих строк"). Минимальное количество строк накладной фиксировано и состоит из заголовка (номер накладной, дата, клиент, строка заголовка таблицы = 3 строки), подвала таблицы (строка Итого плюс разделитель накладной = 2 строки) и одна строка табличной части.

Что для меня не сложно и практически готово: получить общее количество накладных из журнала за указанный период (например, день), прочитать их в память, составить линейный массив из количества строк:
Элемент[i] = Заголовок+Подвал+СтрокНакладной
(т.е. 3+2+КоличествоСтрокНакладной).

Что меня затрудняет: получившийся массив перекомпоновать так, чтобы результирующие накладные заполняли лист наиболее рационально. Т.е. из получившегося множества элементов второго массива составить суммы, которые были бы меньше (количества строк в листе), но не больше (количество строк в листе минус пять строк на заголовки накладной).

Наглядный пример:

В листе вмещается 60 строк с учетом технологических отступов принтера сверху и снизу.
Минимальная длина накладной - 6 строк (Заголовок 3 строки + 1 строка таблицы + Подвал 1 строка + строка-разделитель накладных). Допускается, чтобы разделитель печатался на последней строке листа.
10 накладных за день с количество строк: 3, 7, 4, 5, 6, 6, 3, 1, 1, 1.
После обработки накладных, получился массив длин печатных форм этих накладных: 3+5=8, 7+5=12, 4+5=9, 5+5=10, 6+5=11, 6+5=11, 3+5=8, 1+5=6, 1+5=6, 1+5=6.
Теперь из элементов массива 8, 12, 9, 10, 11, 11, 8, 6, 6, 6 нужно составить суммы, не более 60 (строк в листе) и не менее 55 (60-длина зголовка и подвала накладной). Послежнюю страницу в не берём в счет.
Должно получиться:
1-й лист: 12+10+11+11+8+8 = 60 строк (лиист заполнен рационально)
2-й лист: 8+9+8+6+6+6 = 43 строки (примерно 75% использования).

Аналогичный алгоритм я видел в системе Базис-мебельщик для раскроя листов фанеры (ДСП) на детали для сборки, но там используется двумерный массив.

Спасибо за внимание.
С уважением, Владимир.

Дата отправки: 24.02.2008, 00:47
Вопрос задал: Владимир Лазурко [Vladal]
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Megaloman (Академик):

Здравствуйте, Владимир Лазурко [Vladal]!
Ваш пример я или недопонял (разъясните, пожалуйста в форуме), или не совсем корректен- Вы привели массив из 10 элементов 8, 12, 9, 10, 11, 11, 8, 6, 6, 6, а суммы составляете из 12 элементов, 12+10+11+11+8+8; 8+9+8+6+6+6. Да и задача, наверное, в таких жестких условиях (не более 60 (строк в листе) и не менее 55) в принципе не решаема для любых данных. В частности, может и повезти. Вообще, задача оптимизации - это вопрос к математикам, если сами этим аппаратом не владеем.
Могу предложить примитивный алгоритм (я тоже мат аппаратом минимаксных задач оптимизации не владею):

1. Пересортируем массив по убыванию. Для Ваших данных это
12 11 11 10 9 8 8 6 6 6
Я назову его исходным.

2. Сопоставим исходному массиву такой-же по длине логический массив, все элементы которого =true
Назову этот массив индикаторным.

3. Перепишем исходный массив в массив для печати (Назову его выходным) следующим образом:

Цикл (1) до тех пор пока все элементы индикаторного массива не станут false

В переменной, для определенности, L, контролируем длину сформированной для печати страницы (L<=60).
*Начальное значение L=0

Цикл (2)- вложенный в (1)- по всем элементам исходного массива.
Просматриваем исходный массив от первого (максимального) до последнего (минимального) элемента. В переменной, для определенности, L, контролируем длину сформированной для печати страницы (L<=60).

Если элемент индикаторного массива =false (т. е. эта накладная еще не записана для печати), то:

Если L+элемент исходного массива <= 60 переписываем элемент исходного на первое незаполненное место выходного массива. Делаем L=L+элемент исходного массива. Элемент индикаторного массива делаем равным true.

В результате этого процесса для Вашего примера получим выходной массив:
12 11 11 10 9 6 8 8 6 6
Т е на 1 листе 59 строк, на последнем - 28

Итак, я предложил простой алгоритм, идея которого состоит в том, что я стараюсь последовательно вбивать в лист максимально длинные накладные из числа необработанных.
Для написания конкретного кода мне маловато конкретики, а что-то писать в предположениях не хочется.

Очевидный недостаток: на последних листах скорее всего собирутся все самые короткие накладные.

Консультировал: Megaloman (Академик)
Дата отправки: 24.02.2008, 13:04
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное