Основы программирования — Осенний семестр; Михалкович С.С.; 2008; I — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Лекция 1 (2.09.08))
м (Откат правок Dsoftlzhlzh (обсуждение) к версии Admin)
 
(не показана 201 промежуточная версия 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. ''Блок-схемы''
— [[Участник: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>
 
 
 
Синтаксис, семантика
 
 
 
'''Примеры'''
 
 
 
# Поиск 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.
 
 
 
Формальные и фактические параметры. Семантические правила при вызове.
 
 
 
Функции. Синтаксис. Вызов функции. Переменная Result.
 
 
 
Примеры: Sign, ReadInteger и т.п., SumN.
 
 
 
Сравнение с процедурами на примере Sign.
 
 
 
Нежелательность var-параметров в функциях.
 
 
 
Стандартные подпрограммы с передачей по ссылке: readln, Inc, Dec.
 
 
 
Локальные и глобальные переменные.
 
 
 
Инициализация глобальных и локальных переменных значениями по умолчанию.
 
 
 
Понятие пространства имен.
 
 
 
Глобальные переменные и побочный эффект.
 
 
 
==Лекция 10 (14.10.08)==
 
 
 
Понятие области видимости и времени жизни объекта.
 
 
 
Изменение глобальной переменной как побочный эффект. Нежелательность такого изменения. При необходимости изменения глобальной переменной - передать ее как параметр.
 
 
 
Принцип локальности: чем локальнее объявлена переменная, тем лучше. Распространение принципа локальности на внутриблочные переменнные: вспомогательные переменные, используемые в блоке алгоритма, следует делать внутриблочными.
 
 
 
Понятие ссылки как другого имени объекта. Внутренний механизм передачи параметра по ссылке.
 
 
 
Перегрузка имен подпрограмм (на примере swap).
 
 
 
==Лекция 11 (15.10.08)==
 
 
 
Параметры по умолчанию - на примере DoOp(a,b: integer; var res: integer; op: char := '+').
 
 
 
Предварительное объявление подпрограмм.
 
  
Процедурные переменные.
+
===Структура программы на языке Паскаль===
  
Процедурные переменные как параметры подпрограмм. Функции обратного вызова (callback).
+
<source lang="Pascal">
 
+
Заголовок программы
Пример.
+
Раздел описаний (описываются все используемые в программе переменные и определяются их типы)
<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">
</source>
+
var
Передавать массив по значению крайне неэффективно (т.к.происходит копирование всех элементов на стек). Его следует передавать по ссылке: для этого есть специальное ключевое слово <tt>const</tt>, которое также запрещает изменять данные внутри п/п.
+
   a,b: real;
<source lang="delphi">
+
  i: integer;
 
 
  procedure zzz(const a: IArr);
 
  procedure sss(var a: IArr);
 
 
 
</source>
 
Динамический массив
 
можно передавать в виде <tt>array of integer</tt>, т.к. для него определена структурная эквивалентность типов.
 
<source lang="delphi">
 
  procedure ttt(a: array of integer);
 
</source>
 
Передавать массив по ссылке необходимо только если внутри п/п нужно изменить длину массива.
 
Иначе можно передавать по значению, т.к. при вызове п/п на программный стек кладется только адрес участка памяти, хранящего значения элементов массива, а значит все изменения формального массива-параметра внутри п/п меняют соответствующий ему фактический параметр.
 
Массивы как возвращаемые значения функции
 
 
 
Часто требуется использовать массив как возвращаемое значение функции, для этого удобно использовать динамический массив, который хранит свою длину.
 
 
 
<h3>Переменное число параметров подпрограмм</h3>
 
 
 
П/п можно создавать с переменным количеством параметров.
 
Для этого исп. ключевое слово params.
 
При этом такие параметры, перечисленные через запятую, на этапе выполнения упаковываются в динамический массив, и п/п внутри работает именно с ним.
 
Пар-р params может быть только один и должен находиться последним в списке пар-ов.
 
 
 
==Лекция 18 (19.11.08)==
 
<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>
 
</source>
  
<H3>Переменная типа запись как объект</H3>
+
<секция описания переменных> ::= '''var'''<подсекция>{< подсекция>}
 
+
<подсекция> ::= <список имен>: <тип>;
В модуле можно выносить реализацию методов записи в раздел реализации. При этом в разделе интерфейса внутри определения типа запись описываются только заголовки методов, а в разделе реализации перед именем метода необходимо писать <Имя записи>.
+
<список имен> ::= <имя>{,<имя>}
 
+
<тип> ::= <имя>
Поля записи как состояние объекта.
 
 
 
Методы записи как действия, воздействующие на состояние объекта.
 
 
 
Методы делятся на две категории
 
* меняющие состояние объекта (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(var 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 по множеству.
+
=== Внутриблочные переменные ===
  
Пример использования множеств: решето Эратосфена.
+
В PascalABC.NET возможно ''внутриблочное'' описание переменных:
Алгоритм.
 
  
==Лекция 25 (23.12.08)==
+
<source lang="Pascal">
Код алгоритма Эратосфена
 
<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>''']

Текущая версия на 09:40, 24 января 2014

К основной странице курса

Алгоритм

Алгоритм — набор команд, определяющих порядок действий для решения поставленной задачи.

С алгоритмом всегда связан исполнитель алгоритма - устройство, имеющее систему команд.

В частности, процессор компьютера выступает исполнителем машинных команд.

Свойства алгоритма

  • Дискретность — алгоритм представляет собой последовательность элементарных шагов (команд исполнителя).
  • Детерминированность (определённость) — при одних и тех же входных данных получается один и тот же результат.
  • Завершаемость (конечность) — каждый алгоритм завершается за конечное число шагов при любом наборе исходных данных.
  • Результативность — после выполнения алгоритма известно, что считать результатом.
  • Массовость — применимость алгоритма ко множеству исходных данных.

Пример алгоритма.

Дано: x, y, z.
Найти max

Алгоритм 1. (словесное описание)

Если x>y и x>z, то максимум — это x
Если y>x и y>z, то максимум — это y
Если z>x и z>y, то максимум — это z

Алгоритм 2. (псевдокод)

max := x
Если y<max то max := y
Если z<max то max := z

Эквивалентными называются алгоритмы, имеющие одинаковые наборы исходных данных и выдающие одинаковый результат при одинаковых исходных данных. Алгоритмы 1 и 2 являются эквивалентными. Однако, они отличаются по скорости выполнения и по читаемости.


Спецификация задачи — точное, однозначное описание задачи. Включает формулировку входных и выходных данных.

Способы описания алгоритмов

1. Словесный

2. Псевдокод

3. Блок-схемы

Пример. А.2., представленный блок-схемой.

Max flowchart.png

4. Язык программирования (ЯП)

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

Основные характеристики алгоритма

  • правильность работы
  • скорость выполнения
  • объем занимаемой памяти
  • сложность написания
  • возможность распараллеливания

Основные характеристики программы

Те же, что и у алгоритма, а также:

  • понятность при чтении
  • модифицируемость (легкость изменения кода)
  • масштабируемость (возможность изменения кода для решения родственной или более общей задачи)
  • безопасность

Если два алгоритма эквивалентны, то какой из них лучше? Тот же вопрос можно задать о программах, реализующих эти алгоритмы. Как правило, не существует однозначного ответа на этот вопрос. Лучшие по скорости алгоритмы как правило более сложны, труднее для понимания и могут требовать больше памяти. Часто для решения задачи не нужна самая быстрая программа - достаточно простой и понятной программы.

Обзор современных языков программирования

(самостоятельно на форуме)

Язык программирования PascalABC.NET

Правила записи программ на PascalABC.NET

Шпаргалка

Пример программы, вычисляющей длину и площадь круга

program First; // заголовок программы – необязательная строка
{ Программа вычисления длины окружности и площади круга 
  Автор: Михалкович С.С. Дата написания: 2.09.08 }
const Pi = 3.14;
var
  r: real;   // входные данные - радиус круга
  S,C: real; (* выходные данные - площадь круга и длина окружности *)
begin
  write('Введите радиус окружности: ');
  readln(r);
  S := Pi*r*r;
  C := 2*Pi*r;
  writeln('Длина окружности равна ',С);
  writeln('Площадь круга равна ',S);
end.

Структура программы на языке Паскаль

Заголовок программы
Раздел описаний (описываются все используемые в программе переменные и определяются их типы)
begin
  операторы (разделяются ;)
end.

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

Система программирования PascalABC.NET

Как скачать, инсталлировать. (сайт системы программирования PascalABC.NET)

Общая характеристика PascalABC.NET.

Отличия языка PascalABC.NET от обычного языка Паскаль.

Компиляторы и интерпретаторы

Схема компиляции в машинный код

Схема компиляции в промежуточный код. JIT-компиляция

Ошибки времени компиляции (синтаксические и семантические) и ошибки времени выполнения

Синтаксис - правила записи конструкций, семантика - смысл конструкций.

Синтаксис и семантика ЯП

// В программе 2013-14 гг. этот пункт будет сокращен и размыт по следующим темам когда будут вводиться основные операторы языка.

Определения

Синтаксис — формальные правила описания конструкций ЯП.

Семантика — описывает смысл конструкций ЯП, а также задает ряд ограничений.

Способы описания синтаксиса

  • БНФ (Бэкуса-Наура формы, 1960, Алгол-60).

Примеры.

<цифра> ::= 0|1|2|3|4|5|6|7|8|9
<идентификатор> ::= <буква> | <идентификатор><буква> | <идентификатор><цифра>
<список идентификаторов> ::= <идентификатор> | <идентификатор> , <список идентификаторов>

0, 1, ... 9

называют терминалами (лексемами) — это "конечные символы", т.е. по умолчанию известные в ЯП.

<цифра>

так называемый нетерминал (нетерминальный символ).
Он определяется через терминалы, другие нетерминалы и самого себя. Причем в последнем случае правило задания нетерминала называется рекурсивным (как определение нетерминала <идентификатор>)
  • РБНФ (Расширенные БНФ)
[] — 0 или 1 повторение.
{} — 0 и более повторений

Пример.

<идентификатор> ::= <буква> {<буква> | <цифра>}
  • Синтаксические диаграммы (Вирт, Паскаль)

Грамматика языка — совокупность всех синтаксических правил данного ЯП, обычно заданных в форме БНФ.

Грамматика не учитывает все виды ошибок, в ЯП формулируются дополнительные семантические правила.

Замечание 1. Способы 1-3 эквивалентны.

Замечание 2. Синтаксис определяет лексемы языка.

Лексемы Паскаля

  1. спецсимволы: := += *
  2. ключевые слова (begin, end, if, for)
  3. идентификаторы (a, b1)
  4. константы (2, 'ABC', #5)
  5. комментарии (3 вида)
{...}
(*...*)
//...

Переменные и их описание

Основные сведения

Переменная — это ячейка памяти компьютера, имеющая имя и тип.

Тип определяет размер переменной и множество принимаемых ею значений.

В языке Pascal любая переменная перед использованием должна быть описана.
Обычно переменные описываются в разделе описаний.

<xh4> Синтаксис в виде РБНФ </xh4>

<программа> ::= [program <имя>;] 
               <раздел описаний> 
               begin
                 <операторы>
               end.
<операторы> ::= <оператор>{; <оператор>}
<раздел описаний> ::= {<секция раздела описаний>}
<секция раздела описаний> ::= <секция описания переменных> | <с.о. констант> | <с.о. типов> | <с.о. подпрограмм>...

Пример секции описания переменных.

var
  a,b: real;
  i: integer;
<секция описания переменных> ::= var<подсекция>{< подсекция>}
<подсекция> ::= <список имен>: <тип>;
<список имен> ::= <имя>{,<имя>}
<тип> ::= <имя>

Внутриблочные переменные

В PascalABC.NET возможно внутриблочное описание переменных:

begin
  var i,j: integer;
  var r: real := 5.2;
  var Pi := 3.14;

В последнем случае происходит автоопределение типов.

Основные типы

  • Целые
integer (4 байта)
int64 (8)
byte (1)
  • Вещественные
real (8)
  • Символьные
char (2 байта — Unicode)
  • Строковые
string
string[200]
shortstring = string[255]
  • Логический
boolean (1) [True False]