Императивное программирование (2024)

Монтаж лекции / прямой эфир

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

  1. Соответствие операциональному определению алгоритма

  2. Аллегируемые объекты

  3. Выполнение действий, обусловленное свойствами объекта

Проблемы реализации:

В Википедии:

С нашей кочки зрения:

NB: неизвестно, являются ли необходимыми даже такие нестрогие требования

Архитектура фон Неймана

«Машинный код»:

NB: всё остальное — регистры, типы адресации и стек, сопроцессоры, управление В/В и т. п. — «удобства»

Язык ассемблера:

NB: всё остальное — псевдоинструкции, макросы, директивы и т. п. — «удобства»

Пример текста на языке ассемблера RISC-V

Процедурные языки

Процедурный язык как результат борьбы с неудобствами языка Ассемблера:

Типичные черты (не обязательно для всех):

Дисциплины аллегирования не влияют на парадигму:

Исключение указателей из синтаксиса также не выводит из парадигмы, при этом:

Исторические представители:

Современные:

Высокоуровневые ЯП

( <!> На Википедии понятие описано несколько невразумительно) Объективный признак высокоуровнвого ЯП:

⇒ Признаки низкоуровневого ЯП:

Субъективные признаки высокоуровнвого ЯП:

Высокий уровень ЯП не обязательно меняет его парадигму, но

Си и Паскаль

Онтологическое отличие: цель создания:

Общее

Различия

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

Характерные недостатки

Общий вывод

Сильное отличие в уровне абстракции

Современные тенденции

Бонус

Д/З

Задачи

  1. Написать процедуру, которая сортирует передаваемый ей массив строк (за $$~n log n$$ действий) по возрастанию количества английских гласных в них

  2. Написать процедуру, которая преобразует время в строковом формате «чч:мм:сс» в три натуральных числа; (!) предусмотреть возможность уведомить вызывающую программу о том, что такое преобразование невозможно

  3. Написать функцию, которая преобразует строку, содержащую натуральное число в восемнадцатеричном представлении, в число; (!) предусмотреть возможность уведомить вызывающую программу о том, что такое преобразование невозможно

    • Восемнацатеричные цифры: 0123456789ABCDEFGH

  4. Написать процедуру, которая преобразует строку вида «Имя Отчество Фамилия» в «Фамилия, Имя Отчество.» (обратите внимание на то, что длина преобразованной строки больше длины исходной); (!) предусмотреть возможность уведомить вызывающую программу о том, что такое преобразование невозможно

  5. Написать функцию, которая подсчитывает количество вхождений каждой из десятичных цифр в передаваемом ей тексте. Функция должна возвращать соответствующую структуру данных.

  6. Написать функцию, которая возвращает название товара, на который в сумме затрачено больше всего денег, обрабатывая массив карточек вида «название / цена за килограмм / вес». Количество названий фиксировано. Карточки реализованы в виде структур / записей.

  7. Написать функцию, которой на вход подаются два целых числа: размер массива N и начальное значение M. Функция создаёт целочисленный массив, заполняет его по порядку числами от M до M+N, и возвращает его. Основная программа должна ввести N, M1 и M2, завести помощью функции два таких массива и вывести их поэлементную сумму — последовательность длины N.

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

  8. Написать функцию, которая получает три параметра a, b, и c (любой коэффициент может быть нулевым) и решает квадратное уравнение $$ax^2+bx=c$$ . Возвращаемое значение функции должно содержать как сами корни, так и информацию об их количестве.

    • Программа должна обрабатывать все возможные варианты ответов (в частности, любые из коэффициентов могут быть нулевыми)
  9. Реализовать тип данных «таблица» — массив указателей на строки. Написать процедуру, которая меняет местами строки с номерами i и k в таблице T.

  10. Для типа данных «упорядоченный связный список натуральных чисел» (последовательность данных вида «значение / указатель на следующий элемент») реализовать ввод (конец ввода — 0) и вывод списка, а также процедуру добавления одного элемента в список, соблюдающую условие упорядоченности значений.

    • Динамические/открытые массивы Pascal использовать нельзя.
  11. Реализовать динамически расширяемый тип данных TStack, хранящий целые числа. Написать процедуру push(стек, число), которая заносит число на вершину стека, и функцию pop(стек), которая снимает одно число с вершины стека. Опустошение стека можно не проверять. Переполнение стека и сокращение количества элементов в нём ниже 1/4 общего объёма должно обрабатываться геометрическим масштабированием. Основная программа и ввод должны вызывать push() и pop() в таком количестве, чтобы масштабирование сработало более одного раза (например, положить а затем сняь 2*max элементов). Подсказка: в Си с задачей масштабирования справляется функция realloc(), а в Паскале разрешается использовать динамические массивы и setLength().

  12. Написать функцию, которая определяет наличие подстроки в строке в соответствии с алгоритмом Кнута-Морриса-Пратта.

(для сдающих курс ПП на кафедре) переслать свои решения в виде приложенных файлов по электронной почте uneexlecturesFrBrGeorge/MyDict/at.svgcs.msu.ru):

LecturesCMC/AL/2024_09_09 (последним исправлял пользователь FrBrGeorge 2024-09-09 11:21:40)