|
|
(не показаны 194 промежуточные версии 8 участников) |
Строка 1: |
Строка 1: |
− | ==Лекция 1 (2.09.08)==
| + | [[Категория:Основы программирования]] |
− | <H3>Алгоритм</H3>
| + | [[Страница курса Основы программирования|К основной странице курса]] |
| | | |
− | '''Свойства А.:''' | + | == Алгоритм == |
| + | [http://ru.wikipedia.org/wiki/%C0%EB%E3%EE%F0%E8%F2%EC '''Алгоритм'''] — набор команд, определяющих порядок действий для решения поставленной задачи. |
| | | |
− | <ul>
| + | С алгоритмом всегда связан '''исполнитель алгоритма''' - устройство, имеющее систему команд. |
− | <li>''дискретность''</li>
| |
− | <li>''элементарность команд''</li>
| |
− | <li>''определенность команд''</li> каждая команда имеет четкое однозначное значение
| |
− | <li>''конечность''</li> каждый А. должен когда-то завершаться при любом наборе исходных данных
| |
− | <li>''результативность''</li> после выполнения А. известно, что считать результатом
| |
− | <li>''массовость''</li> применимость ко множеству исходных данных
| |
− | </ul>
| |
| | | |
− | '''Исполнитель А.''' — устройство, имеющее некоторую систему команд, и способное их исполнять.
| + | В частности, процессор компьютера выступает исполнителем машинных команд. |
− | <br>''Процессор'' как исполнитель машинных кодов.
| + | === Свойства алгоритма === |
| + | * Дискретность — алгоритм представляет собой последовательность элементарных шагов (команд исполнителя). |
| + | * Детерминированность (определённость) — при одних и тех же входных данных получается один и тот же результат. |
| + | * Завершаемость (конечность) — каждый алгоритм завершается за конечное число шагов при любом наборе исходных данных. |
| + | * Результативность — после выполнения алгоритма известно, что считать результатом. |
| + | * Массовость — применимость алгоритма ко множеству исходных данных. |
| | | |
− | '''Спецификация задачи''' — точное, однозначное описание задачи. Включает входные и выходные данные. | + | ''<u>Пример алгоритма</u>.'' |
| + | :Дано: <tt>x, y, z</tt>. |
| + | :Найти <tt>max</tt> |
| | | |
| + | Алгоритм 1. (''словесное описание'') |
| | | |
− | ----
| + | Если x>y и x>z, то максимум — это x |
− | ''Пр.''
| + | Если y>x и y>z, то максимум — это y |
− | Дано: x,y,z. Найти max
| + | Если z>x и z>y, то максимум — это z |
| | | |
− | | + | Алгоритм 2. (''псевдокод'') |
− | '''А.1.''' (''словесное описание'').
| |
− | | |
− | Если x>y и x>z, то максимум - это x
| |
− | Если y>x и y>z, то максимум - это y
| |
− | Если z>x и z>y, то максимум - это z
| |
− | | |
− | '''А.2.''' (''псевдокод'').
| |
| | | |
| max := x | | max := x |
Строка 36: |
Строка 31: |
| Если z<max то max := z | | Если z<max то max := z |
| | | |
− | ----
| + | '''Эквивалентными''' называются алгоритмы, имеющие одинаковые наборы исходных данных и выдающие одинаковый результат при одинаковых исходных данных. |
| + | Алгоритмы 1 и 2 являются эквивалентными. Однако, они отличаются по скорости выполнения и по читаемости. |
| | | |
− | ''Опр.'' '''Эквивалентными''' называются А., имеющие одинаковые наборы исходных данных и выдающие одинаковый результат при одинаковых исходных данных.
| |
| | | |
− | '''Способы описания А.:''' | + | '''Спецификация задачи''' — точное, однозначное описание задачи. Включает формулировку входных и выходных данных. |
− | <ul>
| |
− | <li>''словесный''</li>
| |
− | <li>''псевдокод''</li>
| |
− | <li>''блок-схемы''</li>
| |
− | <li>''диаграммы деятельности (activity diagram) UML''</li>
| |
− | <li>''язык программирования (ЯП)''</li>
| |
− | </ul>
| |
| | | |
− | '''Команды А. =''' | + | === Способы описания алгоритмов === |
− | * операторы Я.
| + | 1. ''Словесный'' |
− | * инструкции Я.
| |
| | | |
− | (по [http://it.mmcs.sfedu.ru/files?func=fileinfo&id=24 Шпаргалке])
| + | 2. ''Псевдокод'' |
− | <br>Пример программы, вычисляющей длину и площадь круга.
| |
− | <br>Общие правила записи программ на Паскале. Оформление, комментарии
| |
| | | |
− | PascalABC.NET. Как скачать, инсталлировать
| + | 3. ''Блок-схемы'' |
− | <br>— [[Участник:Juliet|Juliet]] 21:24, 24 декабря 2008 (MSK)
| |
| | | |
− | ==Лекция 2 (3.09.08)==
| + | ''<u>Пример</u>.'' А.2., представленный блок-схемой. |
− | Синтаксис и семантика ЯП
| + | [[Изображение:max_flowchart.png|none]] |
− | Способы описания синтаксиса:
| |
| | | |
− | * БНФ (1960, Алгол-60).
| + | 4. ''Язык программирования (ЯП)'' |
| | | |
− | Пример.
| + | Для языка программирования команды алгоритма называются '''''операторами''''' или '''''инструкциями'''''. |
| | | |
− | <идентификатор> ::= <буква> | <идентификатор><буква> | <идентификатор><цифра>
| + | === Основные характеристики алгоритма=== |
| | | |
− | Понятие терминалов (лексем), нетерминалов
| + | * правильность работы |
| + | * скорость выполнения |
| + | * объем занимаемой памяти |
| + | * сложность написания |
| + | * возможность распараллеливания |
| | | |
− | * РБНФ.
| + | === Основные характеристики программы === |
| + | Те же, что и у алгоритма, а также: |
| | | |
− | [] - 0 или 1 повторение. {} - 0 и более повторений
| + | * понятность при чтении |
| + | * модифицируемость (легкость изменения кода) |
| + | * масштабируемость (возможность изменения кода для решения родственной или более общей задачи) |
| + | * безопасность |
| | | |
− | <идентификатор> ::= <буква> {<буква> | <цифра>}
| + | Если два алгоритма эквивалентны, то какой из них лучше? Тот же вопрос можно задать о программах, реализующих эти алгоритмы. |
| + | Как правило, не существует однозначного ответа на этот вопрос. Лучшие по скорости алгоритмы как правило более сложны, труднее для понимания и могут требовать больше памяти. Часто для решения задачи не нужна самая быстрая программа - достаточно простой и понятной программы. |
| | | |
− | * Синтаксические диаграммы (Вирт, Паскаль)
| + | === [http://it.mmcs.sfedu.ru/forum?func=view&id=22184&catid=1 Обзор современных языков программирования] === |
| + | (самостоятельно на форуме) |
| | | |
− | Способы 1-3 эквивалентны
| + | == Язык программирования PascalABC.NET == |
| + | ===Правила записи программ на PascalABC.NET=== |
| + | '''[http://it.mmcs.sfedu.ru/files?func=fileinfo&id=24 Шпаргалка]''' |
| | | |
− | Синтаксис определяет лексемы языка
| + | ===Пример программы, вычисляющей длину и площадь круга=== |
− | | + | <source lang="Pascal"> |
− | <H3>Лексемы Паскаля</H3> | + | program First; // заголовок программы – необязательная строка |
− | | + | { Программа вычисления длины окружности и площади круга |
− | # спецсимволы: := += = , ;
| + | Автор: Михалкович С.С. Дата написания: 2.09.08 } |
− | # ключевые слова
| + | const Pi = 3.14; |
− | # идентификаторы
| + | var |
− | # константы
| + | r: real; // входные данные - радиус круга |
− | # комментарии (3 вида)
| + | S,C: real; (* выходные данные - площадь круга и длина окружности *) |
− | | + | begin |
− | Обзор современных ЯП (самостоятельно на форуме)
| + | write('Введите радиус окружности: '); |
− | | + | readln(r); |
− | <H3>Переменные и их описание</H3>
| + | S := Pi*r*r; |
− | | + | C := 2*Pi*r; |
− | (синтаксис в виде БНФ: <программа>, <раздел описаний>) | + | writeln('Длина окружности равна ',С); |
− | | + | writeln('Площадь круга равна ',S); |
− | Внутриблочные описания (синтаксис на дом)
| + | end. |
− | | + | </source> |
− | Типы: integer, real, char, string, boolean
| |
− | | |
− | <H3>Оператор присваивания :=</H3>
| |
− | | |
− | Синтаксис: <переменная> := <выражение>
| |
− | | |
− | Пример.
| |
− | d := d + 1;
| |
− | d := d * 2;
| |
− | | |
− | Семанитика: тип выражения д.б. совместим по := с переменной (если типы одинаковые, то совместим)
| |
− | | |
− | Операторы присваивания += и *=
| |
− | | |
− | Пример.
| |
− | d += 1;
| |
− | d *= 2;
| |
− | | |
− | ==Лекция 3 (10.09.08)==
| |
− | | |
− | Примеры использования := :
| |
− | | |
− | * перемена местами двух значений
| |
− | * использование промежуточных переменных в вычислениях (x<sup>16</sup>, x<sup>15</sup>)
| |
− | | |
− | <H3>Оператор ввода</H3>
| |
− | | |
− | Обработка ошибок ввода
| |
− | | |
− | Оператор вывода
| |
− | | |
− | Вывод по формату :a и :a:b
| |
| | | |
− | Вывод с помощью writelnFormat
| + | ===Структура программы на языке Паскаль=== |
| | | |
− | <H3>Условный оператор</H3> | + | <source lang="Pascal"> |
− | | + | Заголовок программы |
− | Синтаксис, семантика
| + | Раздел описаний (описываются все используемые в программе переменные и определяются их типы) |
− | | |
− | '''Примеры'''
| |
− | | |
− | # Поиск min(a,b)
| |
− | # Упорядочение a,b по возрастанию. Необходимость составного оператора. Синтаксис, семантика
| |
− | # Вычисление функции по нескольким взаимоисключающим веткам и цепочечные if
| |
− | # Найти среднее среди a,b,c (a,b,c попарно не равны)
| |
− | | |
− | Самостоятельно
| |
− | | |
− | # Даны координаты вершин треугольника и точка M. Принадлежит ли M треугольнику
| |
− | # Является ли 4-угольник ABCD корректно заданным
| |
− | | |
− | ==Лекция 4 (16.09.08)== | |
− | <h3>Арифметические выражения</h3>
| |
− | | |
− | Операции div и mod. x div y = x/y, округленное до ближайшего целого, x mod y = x - (x div y)*y. Примеры использования.
| |
− | | |
− | Порядок действий в арифметических выражениях
| |
− | | |
− | Тип арифметического выражения
| |
− | | |
− | Стандартные функции. Вычисление степени x^y.
| |
− | Логические выражения
| |
− | | |
− | Операции and, or, not, xor. Таблицы истинности.
| |
− | | |
− | Сокращенное использование логических выражений
| |
− | | |
− | Таблица приоритетов операций
| |
− | | |
− | # унарные
| |
− | # * / div mod and shl shr
| |
− | # + - or xor
| |
− | # in отношения
| |
− | | |
− | Логические переменные. Пример с определением того, лежит ли точка на границе прямоугольника
| |
− | | |
− | Побитовые and, or, xor.
| |
− | | |
− | Операции shl, shr
| |
− | | |
− | <h3>Оператор case выбора варианта</h3>
| |
− | | |
− | Синтакстис, семантика
| |
− | | |
− | Примеры
| |
− | | |
− | # День недели
| |
− | # цифра или буква
| |
− | | |
− | ==Лекция 5 (17.09.08)==
| |
− | <h3>Циклы с предусловием (while) и постусловием (repeat)</h3>
| |
− | | |
− | Заголовок, тело, итерации
| |
− | | |
− | Синтаксис и семантика
| |
− | | |
− | Отличия
| |
− | | |
− | Примеры
| |
− | | |
− | # Факториал
| |
− | # Сумма четных двузначных
| |
− | | |
− | Моделирование repeat с помощью while
| |
− | | |
− | Моделирование while с помощью repeat
| |
− | | |
− | Зацикливание
| |
− | | |
− | <h3>Оператор цикла с параметром (for)</h3>
| |
− | | |
− | Синтаксис, семантика: моделирование for с помощью while, ограничения
| |
− | | |
− | Примеры
| |
− | | |
− | # Факториал
| |
− | # Сумма четных двузначных
| |
− | | |
− | <h3>Примеры использования циклов</h3>
| |
− | | |
− | #Табулирование функции. использование for и while
| |
− | | |
− | Погрешность округления вещественных чисел и вычислительная погрешность.
| |
− | | |
− | ==Лекция 6 (24.09.08)==
| |
− | | |
− | Поиск минимального среди введенных.
| |
− | | |
− | Рекуррентные последовательности.
| |
− | | |
− | Числа Фибоначчи.
| |
− | | |
− | Суммирование рядов (конечных и бесконечных).
| |
− | | |
− | Алгоритм Евклида нахождения НОД.
| |
− | | |
− | Разложение целого числа на простые множители.
| |
− | | |
− | ==Лекция 7 (30.09.08)==
| |
− | | |
− | Поиск заданного значения среди введенных.
| |
− | | |
− | Операторы break и continue. Как обойтись без них.
| |
− | | |
− | Схема Горнера.
| |
− | | |
− | Поиск нуля функции на отрезке.
| |
− | | |
− | ==Лекция 8 (01.10.08)==
| |
− | | |
− | Вложенные циклы. Метод окаймления и метод последовательной детализации.
| |
− | | |
− | Переборные задачи. Необходимость оптимизации самого внутреннего цикла.
| |
− | | |
− | Вспомогательные алгоритмы и их параметры. Подпрограммы. Мотивировка введения подпрограмм.
| |
− | | |
− | Процедуры. Пример вычисления среднего арифметического и среднего геометрического.
| |
− | | |
− | ==Лекция 9 (8.10.08)==
| |
− | | |
− | Синтаксис описания процедуры. Синтаксис вызова процедуры.
| |
− | | |
− | Входно-выходные параметры. Процедура Swap.
| |
− | | |
− | Формальные и фактические параметры. Семантические правила при вызове.
| |
− | | |
− | <H3>Функции</H3>
| |
− | | |
− | Синтаксис. Вызов функции. Переменная Result.
| |
− | | |
− | Примеры: Sign, ReadInteger и т.п., SumN.
| |
− | | |
− | Сравнение с процедурами на примере Sign.
| |
− | | |
− | Нежелательность var-параметров в функциях.
| |
− | | |
− | Стандартные подпрограммы с передачей по ссылке: readln, Inc, Dec.
| |
− | | |
− | <H3>Локальные и глобальные переменные</H3>
| |
− | | |
− | Инициализация глобальных и локальных переменных значениями по умолчанию.
| |
− | | |
− | Понятие пространства имен.
| |
− | | |
− | Глобальные переменные и побочный эффект.
| |
− | | |
− | ==Лекция 10 (14.10.08)==
| |
− | | |
− | Понятие области видимости и времени жизни объекта.
| |
− | | |
− | Изменение глобальной переменной как побочный эффект. Нежелательность такого изменения. При необходимости изменения глобальной переменной - передать ее как параметр.
| |
− | | |
− | Принцип локальности: чем локальнее объявлена переменная, тем лучше. Распространение принципа локальности на внутриблочные переменнные: вспомогательные переменные, используемые в блоке алгоритма, следует делать внутриблочными.
| |
− | | |
− | Понятие ссылки как другого имени объекта. Внутренний механизм передачи параметра по ссылке.
| |
− | | |
− | Перегрузка имен подпрограмм (на примере swap).
| |
− | | |
− | ==Лекция 11 (15.10.08)==
| |
− | | |
− | Параметры по умолчанию - на примере DoOp(a,b: integer; var res: integer; op: char := '+').
| |
− | | |
− | Предварительное объявление подпрограмм.
| |
− | | |
− | <H3>Процедурные переменные</H3>
| |
− | | |
− | Процедурные переменные как параметры подпрограмм. Функции обратного вызова (callback).
| |
− | | |
− | Пример.
| |
− | <source lang="delphi">
| |
− | procedure DoActions(Act1, Act2, Act3: procedure);
| |
| begin | | begin |
− | Act1; | + | операторы (разделяются ;) |
− | Act2;
| + | end. |
− | Act3;
| |
− | end; | |
| </source> | | </source> |
| | | |
− | Пример. Вычисление определённого интеграла методом прямоугольников - Integral(a,b,N,f)
| + | Как правило, программа начинается с ввода исходных данных, после чего следуют вычисления и вывод результатов. Ввод сопровождается приглашением к вводу. |
| | | |
− | Вызов нескольких действий. Операции += и -= для процедурных переменных.
| + | ===Система программирования PascalABC.NET=== |
| + | Как скачать, инсталлировать. ([http://pascalabc.net сайт системы программирования PascalABC.NET]) |
| | | |
− | ==Лекция 12 (22.10.08)==
| + | Общая характеристика PascalABC.NET. |
| | | |
− | Оператор exit досрочного завершения подпрограммы
| + | Отличия языка PascalABC.NET от обычного языка Паскаль. |
| | | |
− | <H3>Методы разработки подпрограмм</H3>
| + | === Компиляторы и интерпретаторы === |
| + | Схема компиляции в машинный код |
| | | |
− | Метод "сверху вниз" и метод "снизу вверх" (на примере таблицы простых чисел).
| + | Схема компиляции в промежуточный код. JIT-компиляция |
| | | |
− | Когда эффективен каждый метод:
| + | Ошибки времени компиляции (синтаксические и семантические) и ошибки времени выполнения |
| | | |
− | * сверху-вниз - когда задача четко поставлена и имеется четкий алгоритм ее решения;
| + | '''Синтаксис''' - правила записи конструкций, '''семантика''' - смысл конструкций. |
− | * сниз-вверх - когда задача нечетко поставлена. когда решается группа взаимосвязанных задач из дной области, когда в задаче нет четко выделенного главного алгоритма, когда необходимо приступать к решению задачи, попутно уточняя алгоритм.
| |
| | | |
− | <H3>Вызов подпрограммы на этапе выполнения</H3>
| + | == Синтаксис и семантика ЯП == |
| + | // В программе 2013-14 гг. этот пункт будет сокращен и размыт по следующим темам когда будут вводиться основные операторы языка. |
| | | |
− | Понятие программного стека.
| + | === Определения === |
| + | '''Синтаксис''' — формальные правила описания конструкций ЯП. |
| | | |
− | Запись активации, ее структура.
| + | '''Семантика''' — описывает смысл конструкций ЯП, а также задает ряд ограничений. |
| | | |
− | Алгоритм вызова подпрограммы на этапе выполнения.
| + | === Способы описания синтаксиса === |
| | | |
− | ==Лекция 13 (28.10.08)==
| + | * ''БНФ'' (Бэкуса-Наура формы, 1960, Алгол-60). |
| | | |
− | Пример, иллюстрирующий алгоритм вызова процедуры.
| + | ''<u>Примеры</u>.'' |
| + | <цифра> ::= 0|1|2|3|4|5|6|7|8|9 |
| + | <идентификатор> ::= <буква> | <идентификатор><буква> | <идентификатор><цифра> |
| + | <список идентификаторов> ::= <идентификатор> | <идентификатор> , <список идентификаторов> |
| | | |
− | Замечания:
| + | <tt>'''0, 1, ... 9'''</tt> |
| + | :называют '''терминалами''' ('''лексемами''') — это "конечные символы", т.е. по умолчанию известные в ЯП. |
| + | <tt>'''<цифра>'''</tt> |
| + | :так называемый '''нетерминал''' ('''нетерминальный символ'''). |
| + | :Он определяется через терминалы, другие нетерминалы и самого себя. Причем в последнем случае правило задания нетерминала называется '''''рекурсивным''''' (как определение нетерминала <идентификатор>) |
| | | |
− | * о накладных расходах, связанных с вызовом маленьких и больших подпрограмм | + | * ''РБНФ'' (Расширенные БНФ) |
− | * о проблеме переполнения программного стека при наличии больших локальных переменных и при передаче больших локальных переменных п значению
| |
− | * о проблеме доступа к глобальным переменным
| |
| | | |
− | <H3>Модули</H3>
| + | :'''[]''' — 0 или 1 повторение. |
| + | :'''{}''' — 0 и более повторений |
| | | |
− | Определение
| + | ''<u>Пример</u>.'' |
− | | + | <идентификатор> ::= <буква> {<буква> | <цифра>} |
− | Структура модуля с разделами интерфейса и реализации.
| |
− | | |
− | Принцип сокрытия информации.
| |
− | | |
− | Преимущества разделения модуля на интерфейс и реализацию.
| |
− | | |
− | ==Лекция 14 (29.10.08)==
| |
− | | |
− | Упрощенная структура модуля.
| |
− | | |
− | Разделы инициализации и финализации.
| |
| | | |
− | Схема компиляции программы с модулями.
| + | * ''Синтаксические диаграммы'' (Вирт, Паскаль) |
| | | |
− | Алгоритм поиска имен в модулях. Модуль как пространство имен.
| + | '''Грамматика языка''' — совокупность всех синтаксических правил данного ЯП, обычно заданных в форме БНФ. |
| + | :Грамматика не учитывает все виды ошибок, в ЯП формулируются дополнительные ''семантические'' правила. |
| | | |
− | Системный модуль PABCSystem
| + | '''Замечание 1.''' Способы 1-3 эквивалентны. |
| | | |
− | ==Лекция 15 (5.11.08)==
| + | '''Замечание 2.''' Синтаксис определяет лексемы языка. |
| | | |
− | Документирующие комментарии ///
| + | === Лексемы Паскаля === |
| | | |
− | Библиотеки. Отличие библиотек от модулей. Подключение библиотек в PascalABC.NET.
| + | # ''спецсимволы: '' <tt>''':= += *'''</tt> |
| + | # ''ключевые слова ''(<tt>'''begin, end, if, for'''</tt>) |
| + | # ''идентификаторы ''(<tt>'''a, b1'''</tt>) |
| + | # ''константы ''(<tt>'''2, 'ABC', #5'''</tt>) |
| + | # ''комментарии (3 вида)'' |
| + | ::<span style="color: green">{...}</span> |
| + | ::<span style="color: green">(*...*)</span> |
| + | ::<span style="color: green">//...</span> |
| | | |
− | Перечислимый и диапазонный типы. Стандартные функции Ord Pred Succ. Стандартные процедуры Inc Dec.
| + | == Переменные и их описание == |
| | | |
− | Использование перечислимого типа в for и case.
| + | === Основные сведения === |
| | | |
− | <H3>Массивы</H3>
| + | '''Переменная''' — это ячейка памяти компьютера, имеющая ''имя'' и ''тип''. |
| + | :'''''Тип''''' определяет размер переменной и множество принимаемых ею значений. |
| | | |
− | Понятие структурированного типа данных.
| + | В языке ''Pascal'' любая переменная перед использованием должна быть описана. <br /> |
| + | Обычно переменные описываются в '''''разделе описаний'''''. |
| | | |
− | Определение массива.
| + | <xh4> Синтаксис в виде РБНФ </xh4> |
− | | + | <программа> ::= ['''program''' <имя>;] |
− | Описание массивов. Тип массива. Тип индексов массива. Понятие порядкового типа.
| + | <раздел описаний> |
− | | + | '''begin''' |
− | ==Лекция 16 (11.11.08)==
| + | <операторы> |
− | | + | '''end.''' |
− | Обращение к элементам массивов.
| + | <операторы> ::= <оператор>{; <оператор>} |
− | | + | <раздел описаний> ::= {<секция раздела описаний>} |
− | Выход за границы диапазона. Контроль выхода в Delphi и PascalABC.NET.
| + | <секция раздела описаний> ::= <секция описания переменных> | <с.о. констант> | <с.о. типов> | <с.о. подпрограмм>... |
− | | |
− | Динамические массивы. Хранение в памяти.
| |
− | | |
− | Инициализация массивов.
| |
− | | |
− | Присваивание массивов. Сравнение массивов.
| |
− | | |
− | Присваивание a := nil для динамических массивов.
| |
− | | |
− | Цикл foreach.
| |
− | | |
− | Именная и структурная эквивалентность типов.
| |
− | | |
− | ==Лекция 17 (12.11.08)==
| |
− | <H3>Массивы как параметры подпрограмм</H3> | |
− | | |
− | При передаче статического массива должна соблюдаться именная эквивалентность
| |
− | <source lang="delphi"> | |
− | procedure xxx(a: array [1..100] of integer); // неверно
| |
| | | |
− | type IArr = array [1..100] of integer; | + | ''<u>Пример</u> секции описания переменных.'' |
− | procedure yyy(a: IArr); | + | <source lang="Pascal"> |
| + | var |
| + | a,b: real; |
| + | i: integer; |
| </source> | | </source> |
− | Передавать массив по значению крайне неэффективно (т.к.происходит копирование всех элементов на стек). Его следует передавать по ссылке: для этого есть специальное ключевое слово <tt>const</tt>, которое также запрещает изменять данные внутри п/п.
| |
− | <source lang="delphi">
| |
| | | |
− | procedure zzz(const a: IArr);
| + | <секция описания переменных> ::= '''var'''<подсекция>{< подсекция>} |
− | procedure sss(var a: IArr);
| + | <подсекция> ::= <список имен>: <тип>; |
| + | <список имен> ::= <имя>{,<имя>} |
| + | <тип> ::= <имя> |
| | | |
− | </source>
| + | === Внутриблочные переменные === |
− | Динамический массив
| |
− | можно передавать в виде <tt>array of integer</tt>, т.к. для него определена структурная эквивалентность типов.
| |
− | <source lang="delphi">
| |
− | procedure ttt(a: array of integer);
| |
− | </source>
| |
− | Передавать массив по ссылке необходимо только если внутри п/п нужно изменить длину массива.
| |
− | Иначе можно передавать по значению, т.к. при вызове п/п на программный стек кладется только адрес участка памяти, хранящего значения элементов массива, а значит все изменения формального массива-параметра внутри п/п меняют соответствующий ему фактический параметр.
| |
− | Массивы как возвращаемые значения функции
| |
− | | |
− | Часто требуется использовать массив как возвращаемое значение функции, для этого удобно использовать динамический массив, который хранит свою длину.
| |
− | | |
− | <h3>Переменное число параметров подпрограмм</h3>
| |
| | | |
− | П/п можно создавать с переменным количеством параметров.
| + | В PascalABC.NET возможно ''внутриблочное'' описание переменных: |
− | Для этого исп. ключевое слово params.
| |
− | При этом такие параметры, перечисленные через запятую, на этапе выполнения упаковываются в динамический массив, и п/п внутри работает именно с ним.
| |
− | Пар-р params может быть только один и должен находиться последним в списке пар-ов.
| |
| | | |
− | ==Лекция 18 (19.11.08)==
| + | <source lang="Pascal"> |
− | <H3>Шаблоны подпрограмм</H3>
| |
− | | |
− | Часто требуется выполнять одно и то же действие для разных типов данных.
| |
− | В этом случае неудобно использовать перегрузку, т.к. п/п отличаются только заголовками.
| |
− | | |
− | Выход - шаблоны.
| |
− | | |
− | Пример:
| |
− | | |
− | procedure Print<T> (array of T);
| |
− | | |
− | В момент вызова п/п происходит:
| |
− | | |
− | * выведение типов шаблона по фактическим параметрам
| |
− | * инстанцирование - подстановка конкретных типов шаблонов и генерация кода подпрограммы с этими конкретными типами.
| |
− | | |
− | Если для такого типа код уже инстанцировался, то повторно действие не выполняется.
| |
− | | |
− | <H3>Задачи на одномерные массивы</H3>
| |
− | | |
− | * инвертирование массива (шаблон)
| |
− | * поиск элемента в массиве - найти и вернуть индекс (шаблон)
| |
− | | |
− | можно с for и break,
| |
− | | |
− | можно и другим способом - с while
| |
− | | |
− | * поиск с барьером (шаблон). Его преимущества
| |
− | * минимальный элемент массива и его индекс
| |
− | * слияние двух упорядоченных массивов в один упорядоченный (барьер)
| |
− | * сдвиг элементов массива влево (шаблон)
| |
− | | |
− | знакомство со значением default(T), Т - тип
| |
− | | |
− | ==Лекция 19 (25.11.08)==
| |
− | | |
− | <h3>Задачи на одномерные массивы</h3>
| |
− | | |
− | pas-файл с задачами
| |
− | | |
− | doc-файл
| |
− | | |
− | используется тип IArr = array [1..size] of integer
| |
− | | |
− | * сдвиг элементов массива вправо (ShiftRight)
| |
− | | |
− | [ два варианта определения граничных значений цикла (от n-1 до 1; от n до 2) ]
| |
− | | |
− | * циклический сдвиг элементов массива вправо (CycleShiftRight)
| |
− | * удаление элемента по заданному индексу (Delete)
| |
− | * вставка элемента по заданному индексу (Insert)
| |
− | | |
− | <H3>Задачи с процедурными переменными в качестве параметров</H3>
| |
− | | |
− | Определяется тип IUnPred = function (x: integer): boolean
| |
− | | |
− | * поиск элемента по заданному условию (Find)
| |
− | * количество элементов, удовлетворяющих условию (Count)
| |
− | * условный минимум (MinElem)
| |
− | * удаление всех элементов, удовлетворяющих условию (DeleteAll)
| |
− | | |
− | '''Примечание.''' Для проверки выхода индекса за границы диапазона (внутри цикла) следует проверять граничные значения счетчика, подставляя их во все индексы
| |
− | | |
− | ==Лекция 20 (26.11.08)==
| |
− | | |
− | <H3>Сортировки</H3>
| |
− | | |
− | * '''Выбором''' (нахождение минимального элемента в неупорядоченной части массива и перемещение его на первую после уже отсортированного участка позицию)
| |
− | | |
− | * '''Пузырьковая'''
| |
− | | |
− | Это самый компактный алгоритм сортировки. Его можно оптимизировать, проверяя случай "холостого" прохода по элементам массива. Т.е. если за проход ни один элемент не изменил позицию, значит массив уже отсортирован и проверять дальше нет смысла.
| |
− | | |
− | * '''Вставками''' (вставка элемента из еще не упорядоченного участка массива в "нужную" позицию отсортированного, для чего сдвиг части элементов вправо и вставка нового в освободившуюся позицию)
| |
− | | |
− | '''Замечание.''' Рассмотренные виды сортировки не являются самыми эффективными.
| |
− | Асимптотическая сложность алгоритмов
| |
− | | |
− | '''Определение.''' Число шагов алгоритма асимптотически равно Θ(f(n)) если, существуют такие N, с1, с2>0 (c1<c2), что для любых n ≥ N выполняется:
| |
− | | |
− | c1*f(n) ≤ число шагов ≤ c2*f(n)
| |
− | | |
− | '''Замечание 1.''' Для рассмотренных алгоритмов сортировки асимптотическая сложность = Θ(n2).
| |
− | | |
− | '''Замечание 2.''' Существуют алгоритмы сортировки с асимптотической сложностью = Θ(n*logn) (они будут рассмотрены в следующем семестре).
| |
− | | |
− | ==Лекция 21 (3.12.08)==
| |
− | | |
− | <H3>Алгоритм бинарного поиска в отсортированном массиве</H3>
| |
− | | |
− | Его асимптотическая сложность - Θ(logn).
| |
− | Двумерные массивы
| |
− | | |
− | Двумерный массив как матрица (соответствие индексов строкам и столбцам)
| |
− | | |
− | Элементы строки. Элементы столбца (рисунки)
| |
− | | |
− | Понятие замороженного индекса
| |
− | | |
− | <H3>Задачи на двумерные массивы</H3>
| |
− | | |
− | * Вывод матрицы
| |
− | ** внешний цикл по строкам
| |
− | ** если внешним сделать цикл по столбцам будет выведена транспонированная матрица
| |
− | | |
− | * Сумма элементов в j-том столбце
| |
− | | |
− | * Сумма элементов в каждом столбце
| |
− | ** использование функции для нахождения суммы в j-ом столбце
| |
− | * Минимальный элемент в каждой строке
| |
− | ** в отличие от предыдущей задачи, для реализации не создается дополнительная п/п.
| |
− | | |
− | '''Замечание.''' Решать такие задачи можно и реализуя алгоритм полностью, и создавая для этого дополнительные п/п. Если задача несложная, то вполне можно пользоваться первым способом, однако если решение не очевидно, лучше выносить часть алгоритма в п/п, иначе код будет очень трудно читать.
| |
− | | |
− | * Квадратные матрицы и элементы выше-ниже главной (побочной) диагонали.
| |
− | | |
− | ==Лекция 22 (9.12.08)==
| |
− | | |
− | * Поиск элемента в матрице
| |
− | | |
− | если для поиска используется функция, то при нахождении элемента выходить из циклов с помощью exit,
| |
− | | |
− | иначе удобно использовать goto КОНЕЦ_ВНЕШНЕГО_ЦИКЛА
| |
− | | |
− | <H3>Записи</H3>
| |
− | | |
− | <source lang="delphi">
| |
− | type <имя записи>= record
| |
− | <поля записи>
| |
− | end;
| |
− | </source>
| |
− | | |
− | Поля записей
| |
− | | |
− | Инициализация записей при описании (на примере Student)
| |
− | | |
− | Доступ к полям записей. Точечная нотация.
| |
− | | |
− | '''Замечание.''' Для записей имеет место именная эквивалентность типов.
| |
− | | |
− | Передача записей в п/п (Print(s)). Запись как возвращаемое значение функции (s := ReadStudent;).
| |
− | | |
− | Передавать записи по значению неэффективно, т.к. копируются все поля. Поэтому следуют передавать их по ссылке (с ключевым словом const - если значения полей не изменяются, и var - если внутри п/п их требуется изменить.
| |
− | | |
− | Оператор with.
| |
− | | |
− | <source lang="delphi">
| |
− | with <переменная типа запись> do
| |
− | begin
| |
− | <поле>:=<значение>
| |
− | end;
| |
− | </source>
| |
− | | |
− | Оператор удобен, когда нужно выполнить достаточное количество операций с одной и той же переменной (имя этой переменной и точка добавляются неявно перед всеми полями)
| |
− | | |
− | <H3>Методы в записях</H3>
| |
− | | |
− | На примере Student.Print.
| |
− | | |
− | Запись как пространство имен
| |
− | | |
− | Запись выступает для своих полей и методов в качестве модуля (поскольку является набором данных и связанных с ними процедур и функций, оформленных как единое целое).
| |
− | | |
− | Методы работают в некотором окружении, в роли которого выступают поля записи и другие методы.
| |
− | | |
− | Создается окружение при описании переменной типа запись.
| |
− | | |
− | * Сравнение s.Print и Print(s)
| |
− | | |
− | '''s.Print''' - объектно-ориентированный подход, доминирует объект, который сам выполняет над собой действие.
| |
− | | |
− | '''Print(s)''' - процедурно-ориентированный подход, главным является действие, выполняющееся над переменной.
| |
− | | |
− | * Метод Init - инициализатор полей записи.
| |
− | | |
− | ==Лекция 23 (10.12.08)==
| |
− | | |
− | <H3>Создание простейших графических объектов</H3>
| |
− | | |
− | <source lang="delphi">
| |
− | RPoint = record x, y: integer end;
| |
− | RRectangle = record p1,p2: RPoint end;
| |
− | </source>
| |
− | | |
− | Для каждого типа определяются методы Print, Draw, MoveOn
| |
− | | |
− | <H3>Записи как средство упаковки параметров</H3>
| |
− | | |
− | '''Пример.'''
| |
− | Используем определенные типы записей для создания перегруженных версий процедур Rectangle и Line:
| |
− | | |
− | <source lang="delphi">
| |
− | Rectangle(x1,y1, x2,y2: integer)
| |
− | Rectangle(p1,p2: RPoint)
| |
− | Rectangle(r: RRectangle)
| |
− | | |
− | Line(x1,y1, x2,y2: integer)
| |
− | Line(p1,p2: RPoint)
| |
− | Line(r: RRectangle)
| |
− | </source>
| |
− | | |
− | <H3>Переменная типа запись как объект</H3>
| |
− | | |
− | В модуле можно выносить реализацию методов записи в раздел реализации. При этом в разделе интерфейса внутри определения типа запись описываются только заголовки методов, а в разделе реализации перед именем метода необходимо писать <Имя записи>.
| |
− | | |
− | Поля записи как состояние объекта.
| |
− | | |
− | Методы записи как действия, воздействующие на состояние объекта.
| |
− | | |
− | Методы делятся на две категории
| |
− | * меняющие состояние объекта (MoveOn для RPoint)
| |
− | * осуществляющие доступ к состоянию объекта на чтение (Draw для RPoint)
| |
− | | |
− | Сортировка массива записей.
| |
− | | |
− | ==Лекция 24 (17.12.08)==
| |
− | | |
− | <H3>Индексная сортировка</H3>
| |
− | | |
− | Часто физически переставлять элементы массива или вообще невозможно, или долго (в силу достаточно большого размера, например).
| |
− | В этом случае удобно использовать ''перестановку индексов'' вместо перестановки самих элементов.
| |
− | | |
− | Идея заключается в том, чтобы описать '''индексный массив''' index, который взаимооднозначно сопоставляет ''реальным'' индексам элемента ''виртуальные'' таким образом, чтобы относительно ''виртуальных'' массив оказался упорядоченным.
| |
− | | |
− | ----
| |
− | | |
− | '''Пример.'''
| |
− | | |
− | Дан массив целых (с реальными индексами):
| |
− | '''5'''[1] '''15'''[2] '''3'''[3] '''1'''[4] '''9'''[5] '''8'''[6] '''20'''[7] '''12'''[8]
| |
− | | |
− | А так выглядит отсортированный массив по виртуальным индексам:
| |
− | '''1'''[1] '''3'''[2] '''5'''[3] '''8'''[4] '''9'''[5] '''12'''[6] '''15'''[7] '''20'''[8]
| |
− | | |
− | Т.е.
| |
− | index[1] = 4
| |
− | index[2] = 3
| |
− | index[3] = 1
| |
− | index[4] = 6
| |
− | index[5] = 5
| |
− | index[6] = 8
| |
− | index[7] = 2
| |
− | index[8] = 7
| |
− | | |
− | ----
| |
− | Соответственно, алгоритм сортировки меняется таким образом, что вместо перемены местами самих элементов упорядочиваемого массива меняется '''содержимое элементов index'''.
| |
− | | |
− | Вначале удобно положить элементы index соответствующими '''тождественной''' подстановке (т.е. a[i] = i).
| |
− | <source lang="delphi">
| |
− | type CmpFunc = function (const s1,s2: Student): boolean;
| |
− | | |
− | procedure BubbleIndexStudentSort(const a: StArr; var Index: IArr; n: integer; Cmp: CmpFunc);
| |
− | begin
| |
− | for var i:=1 to n do
| |
− | Index[i] := i;
| |
− | for var i:=n downto 2 do
| |
− | for var j:=1 to i-1 do
| |
− | if Cmp(a[Index[j+1]],a[Index[j]]) then
| |
− | Swap(Index[j+1],Index[j]);
| |
− | end;
| |
− | | |
− | procedure WriteArrByIndex(const a: StArr; const Index: IArr; n: integer);
| |
− | begin
| |
− | for var i:=1 to n do
| |
− | writeln(a[Index[i]].name,' ',a[Index[i]].course,' ',a[Index[i]].group);
| |
− | end;
| |
− | </source>
| |
− | | |
− | <H3>Множества</H3>
| |
− | | |
− | Описание множеств. Множества-константы. Пустое множество.
| |
− | | |
− | Операции над множествами:
| |
− | s1+s2 - объединение
| |
− | s1*s2 - пересечение
| |
− | s1-s2 - разность
| |
− | s += s1
| |
− | s -= s1
| |
− | s *= s1
| |
− | s1<s2 - строгое вложение
| |
− | s1<=s2 - нестрогое вложене
| |
− | s1>s2 - строгое вложение
| |
− | s1<=s2 - нестрогое вложене
| |
− | i in s - принадлежность
| |
− |
| |
− | Include(s,i);
| |
− | Exclude(s,i);
| |
− | Вывод множеств.
| |
− | | |
− | Цикл foreach по множеству.
| |
− | | |
− | Пример использования множеств: решето Эратосфена.
| |
− | Алгоритм.
| |
− | | |
− | ==Лекция 25 (23.12.08)==
| |
− | Код алгоритма Эратосфена
| |
− | <source lang="delphi"> | |
− | const n = 10000;
| |
− | var primes: set of byte;
| |
| begin | | begin |
− | primes := [2..n];
| + | var i,j: integer; |
− | for var i:=2 to round(sqrt(n)) do
| + | var r: real := 5.2; |
− | begin
| + | var Pi := 3.14; |
− | if not (i in primes) then
| |
− | continue;
| |
− | var x := 2*i;
| |
− | while x<=n do
| |
− | begin
| |
− | Exclude(primes,x);
| |
− | x += i;
| |
− | end;
| |
− | end;
| |
− | for var i:=0 to n do
| |
− | if i in primes then
| |
− | write(i,' ');
| |
− | end.
| |
| </source> | | </source> |
| | | |
− | <H3>Статические методы записей</H3>
| + | В последнем случае происходит '''''автоопределение''''' типов. |
− | <source lang="delphi">
| |
− | type RRectangle = record
| |
− | class function EqualSquare(const r1,r2: RRectangle): boolean;
| |
− | class function CreateRandom: RRectangle;
| |
− | end;
| |
− | </source>
| |
− | | |
− | <H3>Символы</H3>
| |
− | | |
− | Коды символов. Однобайтовые и двухбайтовые кодировки.
| |
− | ASCII - стандарт на символы с кодами 0..127.
| |
− | Unicode.
| |
− | Однобайтовые кодировки: Windows, DOS (CP866), Koi8
| |
− | | |
− | Литеральные константы-символы:
| |
− | #13 - символ возврата "каретки"
| |
− | #10 - символ перехода на следующую строку
| |
− | #9 - символ табуляции
| |
− | | |
− | <H4>Стандартные подпрограммы работы с символами</H4>
| |
− | OrdUnicode(c)
| |
− | ChrUnicode(i)
| |
− | Succ(c)
| |
− | Pred(c)
| |
− | Inc(c,5)
| |
− | Dec(c,5)
| |
− | Ord(c)
| |
− | Chr(i)
| |
− | UpperCase(c)
| |
− | LowerCase(c)
| |
− | | |
− | Для символов с кодами 0..127
| |
− | OrdUnicode(c)=Ord(c)
| |
− | ChrUnicode(i)=Chr(i)
| |
− | | |
− | char - тип, содержащий ряд статических методов:
| |
− | | |
− | char.IsDigit(c)
| |
− | char.IsLetter(c)
| |
− | char.IsLetterOrDigit(c)
| |
− | char.IsLower(c)
| |
− | char.IsUpper(c)
| |
− | char.ToLower(c)
| |
− | char.ToUpper(c)
| |
− | | |
− | ==Лекция 26 (24.12.08)==
| |
− | | |
− | <H3>Строки</H3>
| |
− | | |
− | Тип string
| |
− | | |
− | Отводится память (до 2 Гб), равная длине строки, плюс некоторая дополнительная информация
| |
− | | |
− | Строки - массивы символов, индексируемые с 1: s[i] - i - тый символ строки.
| |
− | var s := 'IT'; // s[1]='I', s[2]='T'
| |
− | | |
− | Операции со строками:
| |
− | | |
− | s1+s2
| |
− | s1 += s2
| |
− | s1<s2
| |
− | ...
| |
− | | |
− | <H3>Основные подпрограммы работы со строками</H3>
| |
− | | |
− | '''Length(s)''' - функция, возвращающая длину строки s | |
− | | |
− | '''SetLength(s,n)''' - процедура, устанавливающая длину строки s равной n | |
− | | |
− | '''Copy(s,from,len)''' - функция, возвращающая подстроку s с позиции from длины len
| |
− | | |
− | '''Insert(subs,s,form)''' - процедура, вставляющая подстроку subs в строку s с позиции from
| |
− | | |
− | '''Delete(s,from,len)''' - процедура, удаляющая из строки s len символов с позиции from
| |
− | | |
− | '''Pos(subs,s)''' - функция, возвращающая позицию первого вхождения подстроки subs в строку s или 0, если подстрока не найдена
| |
− | | |
− | '''PosEx(subs,s,from=1)''' - функция, возвращающая позицию первого вхождения подстроки subs в строку s, начиная с позиции from, или 0, если подстрока не найдена
| |
− | | |
− | '''TrimLeft(s)''' - функция, возвращающая строку s, в которой удалены все начальные пробелы
| |
− | | |
− | '''TrimRight(s)''' - функция, возвращающая строку s, в которой удалены все заключительные пробелы
| |
− | | |
− | '''Trim(s)''' - функция, возвращающая строку s, в которой удалены все удаляет все начальные и заключительные пробелы
| |
− | | |
− | <h4>Преобразование строка <-> число</h4>
| |
− | | |
− | '''Str(x,s)''' - процедура, преобразующая целое или вещественное выражение x к строковому представлению и записывающая результат в строку s
| |
− | | |
− | '''Val(s,x,errcode)''' - процедура, преобразующая строку s к целому или вещественному значению и записывающая результат в целую или вещественную переменную x. Переменная errcode - целая; если преобразование невозможно, то в errcode содержится номер первого символа, вызвавшего ошибку
| |
− | | |
− | '''IntToStr(i)''' - функция, преобразующая целое x в строку
| |
− | | |
− | '''StrToInt(s)''' - функция, преобразующая строку s к целому; может генерировать исключение
| |
− | | |
− | '''FloatToStr(i)''' - функция, преобразующая вещественное x в строку
| |
− | | |
− | '''StrToFloat(s)''' - функция, преобразующая строку s к вещественному; может генерировать исключение
| |
− | | |
− | <H3>Некоторые задачи на строки</H3>
| |
| | | |
− | Посимвольная обработка
| + | == Основные типы == |
| + | * ''Целые'' |
| + | :<tt>'''integer'''</tt> (4 байта) |
| + | :'''<tt>int64</tt>''' (8) |
| + | :'''<tt>byte</tt>''' (1) |
| | | |
− | * Строка 'ABCD...XYZ' | + | * ''Вещественные'' |
− | * Сумма всех цифр в строке s
| + | :'''<tt>real</tt>''' (8) |
| | | |
− | Использование стандартных подпрограмм
| + | * ''Символьные'' |
| + | :'''<tt>char</tt>''' (2 байта — Unicode) |
| | | |
− | * Вывести индексы всех вхождений подстроки s1 в s (на Delete, PosEx) | + | *''Строковые'' |
| + | :'''<tt>string</tt>''' |
| + | :'''<tt>string</tt>'''[200] |
| + | :'''<tt>shortstring</tt>''' = <tt>string</tt>[255] |
| | | |
− | ==Ссылки==
| + | * ''Логический'' |
− | *[[Конспекты|Другие конспекты]]
| + | :'''<tt>boolean</tt>''' (1) ['''<tt>''True''</tt>''' '''<tt>''False''</tt>'''] |
В частности, процессор компьютера выступает исполнителем машинных команд.
Алгоритм 1. (словесное описание)
Алгоритм 2. (псевдокод)
1. Словесный
2. Псевдокод
3. Блок-схемы
4. Язык программирования (ЯП)
Если два алгоритма эквивалентны, то какой из них лучше? Тот же вопрос можно задать о программах, реализующих эти алгоритмы.
Как правило, не существует однозначного ответа на этот вопрос. Лучшие по скорости алгоритмы как правило более сложны, труднее для понимания и могут требовать больше памяти. Часто для решения задачи не нужна самая быстрая программа - достаточно простой и понятной программы.
Как правило, программа начинается с ввода исходных данных, после чего следуют вычисления и вывод результатов. Ввод сопровождается приглашением к вводу.
Общая характеристика PascalABC.NET.
Отличия языка PascalABC.NET от обычного языка Паскаль.
Схема компиляции в промежуточный код. JIT-компиляция
Ошибки времени компиляции (синтаксические и семантические) и ошибки времени выполнения
// В программе 2013-14 гг. этот пункт будет сокращен и размыт по следующим темам когда будут вводиться основные операторы языка.