Программирование. Что это?

Содержание

Слайд 2

Программирование?

Программирование?

Слайд 3

Программирование?

Программирование?

Слайд 4

Программирование?

Программирование?

Слайд 5

Программирование?

Программирование?

Слайд 6

Программирование?

Программирование?

Слайд 7

Программирование?

Программирование?

Слайд 8

Программирование?

Программирование?

Слайд 9

Культурная страничка

Художественная литература:
С. Лукьяненко «Лабиринт отражений»
Художественные фильмы:
«Хакеры» : Анджелина Джоли, The Prodigy

Культурная страничка Художественная литература: С. Лукьяненко «Лабиринт отражений» Художественные фильмы: «Хакеры» :

«Пираты Силиконовой Долины» : о Microsoft и Apple
сериал «Кремниевая долина» : реальные методы разработки ПО
Документальный фильм «Революционная ОС» про возникновение Linux

Слайд 10

К чему приводят ошибки программистов

Неудача при запуске первого американского спутника к Венере

К чему приводят ошибки программистов Неудача при запуске первого американского спутника к
случилась, вероятнее всего, из-за ошибки в программе – вместо требуемой в операторе запятой программист поставил точку. Вот как был записан этот оператор:
DO 50 I = 12.525
На самом же деле он должен был выглядеть следующим образом:
DO 50 I = 12,525

Слайд 11

Одна из первых компьютерных систем противовоздушной обороны США (60-е годы) в первое

Одна из первых компьютерных систем противовоздушной обороны США (60-е годы) в первое
же дежурство подняла тревогу, приняв восходящую из-за горизонта Луну за вражескую ракету, поскольку этот «объект» приближался к территории США и не подавал сигналов, что он «свой».

К чему приводят ошибки программистов

Слайд 12

В 1985–87 гг. 6 человек в США и Канаде получили смертельную дозу облучения во

В 1985–87 гг. 6 человек в США и Канаде получили смертельную дозу
время сеансов радиационной терапии с применением медицинского ускорителя Therac-25. Эти дозы, как было оценено позже, более чем в 100 раз превышали те, что обычно применяются при лечении.
Расследование показало, что непосредственной причиной инцидентов была программная ошибка, однако основные ошибки были сделаны на стадии проектирования оборудования и системы автоматизации.

К чему приводят ошибки программистов

Слайд 13

1988 год, причиной осложнений, возникших при возвращении на Землю из космической экспедиции

1988 год, причиной осложнений, возникших при возвращении на Землю из космической экспедиции
советско-афганского (29 августа – 21 декабря 1988) и советско-французского (26 ноября – 27 апреля 1988) экипажей, явились ошибки, допущенные в программном обеспечении бортовых компьютеров.

К чему приводят ошибки программистов

Слайд 14

В 1991 г. ракетная установка MIM-104 Patriot не заметила вражескую ракету Scud, которая уничтожила

В 1991 г. ракетная установка MIM-104 Patriot не заметила вражескую ракету Scud,
в казарме г. Дахрен (Судовская Аравия) 28 американских солдат.
Бортовая система Patriot работает с накапливаемой ошибкой в системных часах, и в процессе длительного нахождения на боевом дежурстве погрешность достигла 0,3 с, что привело к пропуску быстро двигавшейся ракеты.

К чему приводят ошибки программистов

Слайд 15

В 1994 г. погибло 29 человек в результате аварии английского военного вертолета Chinook, который

В 1994 г. погибло 29 человек в результате аварии английского военного вертолета
разбился из-за сбоя в бортовой навигационной системе, неверно определившей высоту полета.

К чему приводят ошибки программистов

Слайд 16

4 июня 1996 года был произведен первый запуск ракеты-носителя Ariane 5 –

4 июня 1996 года был произведен первый запуск ракеты-носителя Ariane 5 –
детища и гордости Европейского Сообщества. Уже через неполные 40 сек. все закончилось взрывом. Автоподрыв 50-метровой ракеты произошел в районе ее запуска с космодрома во Французской Гвиане.
Только находившееся на борту научное оборудование потянуло на полмиллиарда долларов, не говоря о прочих разнообразных издержках; а астрономические цифры "упущенной выгоды" от несостоявшихся коммерческих запусков и потеря репутации надежного перевозчика в очень конкурентном секторе мировой экономики.
Причина – неправильное использование наследования при создании ПО.

К чему приводят ошибки программистов

Слайд 17

1999 год, Аппарат для исследования Марса Mars Climate Orbiter был запущен 11

1999 год, Аппарат для исследования Марса Mars Climate Orbiter был запущен 11
декабря 1998 года. Следом за ним был также запущен Mars Polar Lander – 3 января 1999. Оба аппарата были потеряны вскоре после того, как они достигли красной планеты.
Эти два космических корабля стоили NASA около 327,6 миллиона долларов, потраченных на их создание и функционирование.
Причина аварии Mars Polar Lander осталась невыясненной. Причина потери Mars Climate Orbiter заключается в программно-человеческой ошибке, которая привела к тому, что одно подразделение участвовавшее в проекте считало "в дюймах", а другое – "в метрах" , причем выяснилось это уже после потери аппарата.

К чему приводят ошибки программистов

Слайд 18

Запуск ракеты-носителя "Зенит" 12 марта 2000 года по программе "Морской старт" закончился аварией. Через

Запуск ракеты-носителя "Зенит" 12 марта 2000 года по программе "Морской старт" закончился
несколько минут после старта ракета "Зенит" отклонилась от курса и не смогла вывести на заданную орбиту первый спутник для системы сотовой телефонной связи.
После аварии были образованы несколько комиссий для расследования ее причины. В опубликованных выводах экспертов компании Боинг причиной сбоя называется программная ошибка. Из-за этой ошибки не был закрыт клапан в пневматической системе второй ступени ракеты.

К чему приводят ошибки программистов

Слайд 19

На заводе по переработке урана в Западной Австралии в конце декабря 2001 года произошел

На заводе по переработке урана в Западной Австралии в конце декабря 2001
выброс радиоактивного вещества.
Расследование инцидента показало, что произошел он из-за "логической ошибки" в программном обеспечении компьютеров, установленных на заводе.

К чему приводят ошибки программистов

Слайд 20

В августе 2003 года северо-восток США остался без электричества в том числе

В августе 2003 года северо-восток США остался без электричества в том числе
и из-за программной ошибки в системе управления аварийной сигнализацией. Переполнение памяти возникло из-за так называемых «гонок» (race condition) – ошибки программирования многозадачной системы, вызывающей неопределенность порядка выполнения различных частей кода.
Система попала в бесконечный цикл, тем самым оставив операторов без актуальной информации о состоянии энергосистемы. Если бы все было запрограммировано грамотно, то оператор смог бы предотвратить каскадные сбои и минимизировать убытки. По некоторым оценкам, ущерб составил от 7 млрд до 10 млрд долл.

К чему приводят ошибки программистов

Слайд 21

Американский аппарат Mars Global Surveyor прибыл к Красной планете в 1997 г.

Американский аппарат Mars Global Surveyor прибыл к Красной планете в 1997 г.
Аппарат прекратил функционирование в ноябре 2006 г.: из-за ошибка адресации бортового ПО произошел перегрев батареи с последующим отказом других устройств.
11 февраля 2007 г. 12 истребителей-"невидимок" F-22 перелетали с военной базы США на Гавайях в Японию. В момент пересечения международной временной границы на всех машинах из-за программной ошибки отказали бортовые компьютеры.
Известны также случаи, когда вследствие программной ошибки истребители F-16 в режиме автопилотирования переворачивались "вверх ногами" при преодолении экватора.

К чему приводят ошибки программистов

Слайд 22

5 декабря 2010 года: Три спутника, критически важные для завершения составления группировки

5 декабря 2010 года: Три спутника, критически важные для завершения составления группировки
российской навигационной системы ГЛОНАСС упали в Тихий океан недалеко от Гавайских островов вскоре после их запуска ракетой «Протон-М».
Финансовые потери оцениваются в 4 миллиарда рублей (138 миллионов долларов). В результате расследования виной аварии была признана ошибка в программировании, которая привела к тому, что в ракету залили неправильное количество топлива.

К чему приводят ошибки программистов

Слайд 23

Главная задача программирования –
это снижение сложности.
Цель программирования –
описание процессов обработки

Главная задача программирования – это снижение сложности. Цель программирования – описание процессов
данных.
Данные (data) –
это представление фактов и идей в формализованном виде, пригодном для передачи и переработке в некоем процессе.
Информация (information) –
это смысл, который придается данным при их представлении.
Обработка данных (data processing) –
это выполнение систематической последова-тельности действий с данными.

Слайд 24

Интеллектуальные возможности человека

Выделяют 3 интеллектуальные возможности человека, используемые при программировании:
• способность к

Интеллектуальные возможности человека Выделяют 3 интеллектуальные возможности человека, используемые при программировании: •
перебору,
• способность к абстракции,
• способность к математической индукции.

Слайд 25

Способность человека к перебору связана с возможностью последовательного переключения внимания с одного

Способность человека к перебору связана с возможностью последовательного переключения внимания с одного
предмета на другой, позволяя узнавать искомый предмет. В среднем человек может уверенно (не сбиваясь) перебирать в пределах 1000 предметов (элементов).
Средством преодоления этой ограниченности является его способность к абстракции, благодаря которой человек может объединять разные предметы или экземпляры в одно понятие, заменять множество элементов одним элементом (другого рода).
Способность человека к математической индукции позволяет ему справляться с бесконечными последовательностями.

Слайд 26

Грубая схема разработки и применения ПО

Грубая схема разработки и применения ПО

Слайд 27

Программирование и алгоритм

Программирование –
это составление программ для вычислительной машины, описывающих алгоритм

Программирование и алгоритм Программирование – это составление программ для вычислительной машины, описывающих
решения определенных задач.
Другими словами – это создание алгоритма решения задачи и его представление в виде программы.
Задача определяется входными и выходными данными и связями между ними.
Алгоритм —
это строгая и четкая конечная система правил, которая определяет последовательность действий над некоторыми объектами и после конечного числа шагов приводит к решению задачи.

Слайд 28

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

Под действием понимается нечто, что имеет конечную продолжительность и приводит к желаемому
и совершенно определенному результату.
Каждое действие предполагает наличие некоторого объекта, над которым это действие совершается и по изменению состояния которого можно судить о результате действия.
Действие должно быть таким, чтобы его можно было описать с помощью некоторого языка. Это описание называется инструкцией.

Слайд 29

Программа – это инструкции, записанные таким образом, чтобы они были «понятны» вычислительной

Программа – это инструкции, записанные таким образом, чтобы они были «понятны» вычислительной
машине.
ЭТАПЫ ПРОГРАММИРОВАНИЯ
Математическая формулировка задачи.
Выбор метода решения задачи.
Разработка алгоритма.
Описание алгоритма на алгоритмическом языке (получение программы).
Тестирование программы.
Проведение расчетов, анализ результатов.

Слайд 30

Алгоритм

Это описание процесса решения некоторой задачи.
Свойства алгоритма:
– дискретность, т.е. процесс решения протекает

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

Слайд 31

Критерии качества алгоритма

правильность (алгоритм решает поставленную задачу);
прозрачность (простота, удобочитаемость алгоритма);
эффективность (быстродействие и

Критерии качества алгоритма правильность (алгоритм решает поставленную задачу); прозрачность (простота, удобочитаемость алгоритма); эффективность (быстродействие и краткость).
краткость).

Слайд 32

Блок-схема как одна из форм записи алгоритма

Блок-схема как одна из форм записи алгоритма

Слайд 33

Блок-схема как одна из форм записи алгоритма

Блок-схема как одна из форм записи алгоритма

Слайд 34

Блок-схема как одна из форм записи алгоритма

Блок-схема как одна из форм записи алгоритма

Слайд 35

Пример блок-схемы

Рассмотрим задачу: найти максимум из двух чисел.

Пример блок-схемы Рассмотрим задачу: найти максимум из двух чисел.

Слайд 36

Язык программирования Pascal

Разработан в 1971 г. швейцарским профессором Николасом Виртом для обучения

Язык программирования Pascal Разработан в 1971 г. швейцарским профессором Николасом Виртом для обучения структурному программированию.
структурному программированию.

Слайд 37

Общий вид структуры программы на языке Pascal

Общий вид структуры программы на языке Pascal

Слайд 38

Всякий язык программирования имеет три основные составляющие: алфавит, синтаксис и семантику.
Алфавит языка

Всякий язык программирования имеет три основные составляющие: алфавит, синтаксис и семантику. Алфавит
– это множество символов, которые можно использовать для записи правильных программ.
Синтаксис языка – это совокупность правил построения допустимых конструкций языка, форма их сочетаний при записи алгоритма, т.е. то что определяет правильность программ.
Семантика – это смысл конструкций языка, в том числе и программ, написанных на этом языке.

Слайд 39

Основные символы языка Pascal

Это латинские буквы, цифры от 0 до 9 и

Основные символы языка Pascal Это латинские буквы, цифры от 0 до 9
специальные символы
Также есть служебные слова, которые не могут использоваться в качестве идентификаторов (т.е. имен переменных, подпрограмм, модулей). Например, слова var, type, if.
Задание: найти в литературе и выписать все служебные слова языка Pascal.

Слайд 40

Идентификаторы

Это имена переменных, констант, подпрограмм, модулей. В программе не может быть двух

Идентификаторы Это имена переменных, констант, подпрограмм, модулей. В программе не может быть
идентификаторов с одним именем!
Правильный идентификатор должен начинаться с латинской буквы. В нем могут присутствовать цифры и знак подчеркивания.
Примеры:
x
X
summa
s1
m_

Слайд 41

Объекты (константы, переменные, функции, выражения), которыми оперирует программа, относятся к определенному типу.

Объекты (константы, переменные, функции, выражения), которыми оперирует программа, относятся к определенному типу.

Тип — это множество значений, которые могут принимать объекты программы, и совокупность операций, допустимых над этими значениями.

Типы данных

Слайд 42

Типы данных

Типы данных

Слайд 43

Переменная

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

Переменная Данные хранятся в памяти компьютера, но для указания на конкретную информацию
неудобно все время записывать физические адреса ячеек.
Эта проблема в языке Pascal решена введением понятия переменной. Переменная – именованный участок памяти для хранения данных определенного типа. Значение переменной (информация в соответствующих ячейках памяти) в ходе выполнения программы может быть изменено. Имя переменной должно быть правильным идентификатором!
Объявляются переменные в специальном разделе var (см. структуру программы на языке Pascal). Например:
var
x: integer;
b, summa: integer;
a: real;

Слайд 44

Константа

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

Константа Величина, значение которой в ходе выполнения программы не может быть изменено.
обычные (просто значения, например, 5, 6.7, ‘f’) и именованные.
Имя константы должно быть правильным идентификатором.
Именованные константы объявляются в разделе const.
Пример:
const
pi=3.14;
n=20;

Слайд 45

Оператор присваивания

:=
<Переменная> := <Выражение> ; 
В левой части может быть только 1 переменная,

Оператор присваивания := := ; В левой части может быть только 1
которой будет присвоено значение выражения из правой части. Тип переменной слева должен соответствовать типу выражения справа.
Выражение состоит из операндов, знаков операций и круглых скобок.
Операндами являются константы, переменные, обращения к функциям.
Примеры:
a:=6;
s:=a+5;
y:=sin(x);
z:=y+cos(x);

Слайд 46

Ввод данных

readln(<переменные>);
Пример 1:
readln(x);
Программа приостановит свое выполнение и будет ожидать ввод данных

Ввод данных readln( ); Пример 1: readln(x); Программа приостановит свое выполнение и
(в зависимости от типа переменной х). Завершается ввод нажатием клавиши Enter.
Пример 2:
readln(a,b,c);
Ввод нескольких переменных в одном выражении. При вводе с клавиатуры данные должны разделяться пробелом.

Слайд 47

Вывод данных на экран

write(<выводимые данные>);
writeln(<выводимые данные>);
Во втором случае после вывода на экран

Вывод данных на экран write( ); writeln( ); Во втором случае после
будет произведен переход на следующую строку.
Примеры:
1. write(‘Hello,’);
write(‘ world!’);
На экране появится:
Hello, world!
2. writeln(‘Hello,’);
writeln(‘ world!’);
На экране появится:
Hello,
world!

Слайд 48

Особенности вывода

По умолчанию вывод происходит в поле вывода шириной в количество знаков

Особенности вывода По умолчанию вывод происходит в поле вывода шириной в количество
выводимого числа. При этом вещественные числа выводятся с максимально возможным количеством знаков после вещественной точки.
Например:
x:=5/3;
writeln(x);
На экране появится
1.66666666666667
Но есть возможность управлять как количеством знаков в дробной части, так и шириной поля вывода числа.

Слайд 49

Формат использования:
var x: integer;

write(x:n);
n – количество знакомест, отводимых для вывода числа (неиспользуемые

Формат использования: var x: integer; … write(x:n); n – количество знакомест, отводимых
знакоместа заменяются пробелами перед выводимым числом).
или
var x: real;

write(x:n:m);
n – количество знакомест, отводимых для вывода числа; m – количество знаков в дробной части.

Особенности вывода

Слайд 50

Встроенные функции языка Pascal

Встроенные функции языка Pascal

Слайд 51

Пример использования

Найти сумму квадратов двух чисел.

Пример использования Найти сумму квадратов двух чисел.

Слайд 52

Условный оператор в языке Pascal

Условные операторы позволяют выбирать для выполнения те или

Условный оператор в языке Pascal Условные операторы позволяют выбирать для выполнения те
иные части программы в зависимости от некоторых условий.
Синтаксис условного оператора:
if <условие> then
begin

end
else
begin

end;
Т.е. если условие верное, то выполняется блок операторов после then, иначе выполняется блок операторов после else.

Слайд 53

Операторы сравнения

Используются в условиях.

Например: if a<=b then … else …

Запишем ранее созданную

Операторы сравнения Используются в условиях. Например: if a Запишем ранее созданную блок-схему
блок-схему нахождения максимума на языке Pascal.

Слайд 54

Логические операции

Логические операции

Слайд 55

Таблицы истинности логических операций

0 and 0 = 0
0 and 1 =

Таблицы истинности логических операций 0 and 0 = 0 0 and 1
0
1 and 0 = 0
1 and 1 = 1

0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1

1 – true, 0 – false

Слайд 56

Пример

Найти максимум из двух чисел, введенных пользователем.

Пример Найти максимум из двух чисел, введенных пользователем.

Слайд 57

Оператор выбора CASE

Позволяет выбрать одно из нескольких возможных продолжений программы в зависимости

Оператор выбора CASE Позволяет выбрать одно из нескольких возможных продолжений программы в
от значения выражения:
case выражение of значение1 : оператор (группа операторов); значение2 : оператор (группа операторов); . . . . . . . . . . . . . . . . . . . . . значениеN : оператор (группа операторов) else оператор (группа операторов); end;

Слайд 58

Оператор выбора CASE

Пример 1:
Write('Введите число: ');
Readln( i );
Case i

Оператор выбора CASE Пример 1: Write('Введите число: '); Readln( i ); Case
of
2, 4, 6, 8: Writeln('Четная цифра');
1, 3, 5, 7, 9: Writeln('Нечетная цифра');
10..100: Writeln('Число от 10 до 100');
else
Writeln ('Отрицательное число или больше 100')
end;
Пример 2:
Write('Введите номер месяца: ');
Readln( MONTH );
case MONTH of
1, 2, 3 : writeln ('Первый квартал');
4, 5, 6 : writeln ('Второй квартал');
7, 8, 9 : writeln ('Третий квартал');
10, 11, 12 : writeln ('Четвёртый квартал');
end;

Слайд 59

Операторы цикла

Цикл – это последовательность операторов, которая может выполняться более одного раза.
Циклы с

Операторы цикла Цикл – это последовательность операторов, которая может выполняться более одного
предусловием используются тогда, когда выполнение цикла связано с некоторым логическим условием. Оператор цикла с предусловием имеет две части: условие выполнения цикла и тело цикла.
При выполнении оператора while определенная группа операторов выполняется до тех пор, пока определенное в операторе while условие истинно. Если условие сразу ложно, то оператор не выполнится ни разу.
while <условие> do   begin     группа операторов   end;

Цикл с предусловием while

Слайд 60

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

При использовании цикла с предусловием надо помнить следующее: значение условия выполнения цикла
быть определено до начала цикла;
если значение условия истинно, то выполняется тело цикла, после чего повторяется проверка условия. Если условие ложно, то происходит выход из цикла;
хотя бы один из операторов, входящих в тело цикла, должен влиять на значение условия выполнения цикла, иначе цикл будет повторяться бесконечное число раз.

Цикл с предусловием while

Слайд 61

Цикл с предусловием while

Задача: найти сумму чисел, введенных пользователем.
Program Summa;
Var 

Цикл с предусловием while Задача: найти сумму чисел, введенных пользователем. Program Summa;
i, N : integer;
x, S : real;
Begin
write('Сколько чисел для сложения? ');
readln (N);
S:=0; 
i:=1; 
while i<=N do
begin
write('Введите ',i,'-е число ');     
readln (x);     
S:=S+x;     
i:=i+1;   
end; 
write('Сумма введенных чисел равна ',s:5:2); 
End.

Слайд 62

Задача: Найти сумму цифр в записи данного натурального числа;
Program SUM;
Var a,b,s,k:Integer;
Begin
write('Введите

Задача: Найти сумму цифр в записи данного натурального числа; Program SUM; Var
число: ');
Readln(a);
s:=0;
While a<>0 do
begin
b:=a mod 10;
s:=s+b;
a := a div 10;
end;
Writeln(s);
End.

Цикл с предусловием while

Слайд 63

Цикл с постусловием repeat

Отличительной особенностью данного цикла является то, что тело цикла

Цикл с постусловием repeat Отличительной особенностью данного цикла является то, что тело
выполняется в любом случае как минимум 1 раз, т.к. условие выхода из цикла проверяется после тела цикла.
repeat
  группа операторов
until <условие>; {до тех пор, пока условие не будет верным}
Для выполнения в цикле repeat нескольких операторов не следует помещать эти операторы в операторные скобки begin ... end. Зарезервированные слова repeat и until действуют как операторные скобки.

Слайд 64

Задача. Определить, является ли введенное число простым.
Program Prostoe;
Var
i, {возможный делитель}
Number

Задача. Определить, является ли введенное число простым. Program Prostoe; Var i, {возможный
: integer; {исследуемое число}
Begin
writeln (‘Какое число должно быть проверено? ‘);
read (Number);
i := 1;
repeat
i := i+1;
until Number mod i = 0;
if Number=i
then
writeln (Number,’ является простым‘)
else
writeln (Number,’ делится на ‘,i);
readln;
End.

Цикл с постусловием repeat

Слайд 65

Цикл со счетчиком for

Цикл со счетчиком представляет такую конструкцию, в которой выполнение

Цикл со счетчиком for Цикл со счетчиком представляет такую конструкцию, в которой
тела цикла должно повторяться заранее определенное число раз. 
for i := A to B do
begin
операторы
end;
Или
for i := A downto B do
begin
операторы
end;
Переменная i – управляющая переменная или переменная цикла (целый тип),
А – начальное значение переменной цикла,
В – конечное значение переменной цикла.
Управляющую переменную цикла нельзя менять в теле цикла!!!

Слайд 66

При переходе к обработке оператора цикла for управляющей переменной присваивается заданное начальное

При переходе к обработке оператора цикла for управляющей переменной присваивается заданное начальное
значение.
Затем в цикле выполняется исполнительный оператор (или составной оператор).
Каждый раз при выполнении исполнительного оператора управляющая переменная увеличивается на 1 (для for...to) или уменьшается на 1 (для for...downto).
Цикл завершается при достижении управляющей переменной своего конечного значения.

Цикл со счетчиком for

Слайд 67

Цикл со счетчиком for

Цикл со счетчиком for

Слайд 68

Часто исполнительная часть одного из циклов For является новым оператором цикла For.

Часто исполнительная часть одного из циклов For является новым оператором цикла For.

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

Вложенный цикл со счетчиком for

Слайд 69

Пример цикла for

Вычислить N! (факториал):
Program Faktorial;
Var n, i, f: integer;
Begin
f:=1;
Write('Введите

Пример цикла for Вычислить N! (факториал): Program Faktorial; Var n, i, f:
n: ');
Readln(n);
For i:=2 to n do
f:=f*i;
Writeln(n,'!=',f);
End.

Слайд 70

Подпрограммы

Подпрограмма – это часть программы, оформленная в виде отдельной синтаксической конструкции и

Подпрограммы Подпрограмма – это часть программы, оформленная в виде отдельной синтаксической конструкции
снабженная именем.
Вызов подпрограммы (т.е. выполнение действий, заданных в подпрограмме) может быть произведен в некоторой точке программы посредством указания имени этой подпрограммы. Обмен информацией между программой и подпрограммой может быть реализован с помощью формальных и фактических параметров.
Формальный параметр – это идентификатор, который используется в подпрограмме для обозначения объектов, к которым применяется заданная в ней последовательность действий. Фактический параметр – это объект, который подставляется в подпрограмму вместо соответствующего формального параметра.
Фактическими параметрами могут быть константы, имена переменных, выражения любого, заранее описанного типа. Формальные параметры указываются в описании подпрограммы, а фактические – в обращении к подпрограмме. Правила подстановки параметров определяются в языке программирования.

Слайд 71

В языке Pascal подпрограммы представлены двумя видами: процедуры и функции.
Процедура предназначена для

В языке Pascal подпрограммы представлены двумя видами: процедуры и функции. Процедура предназначена
выполнения какой-то законченной последовательности действий.
Любая процедура начинается с заголовка. В отличии от основной программы заголовок в процедуре обязателен. Он состоит из зарезервированного слова Procedure, за которым следует идентификатор имени процедуры, а далее в круглых скобках список формальных параметров:
Procedure <имя процедуры> (список формальных параметров);
За заголовком могут идти такие же разделы, что и в основной программе. В отличии от основной программы процедура завершается не точкой, а точкой с запятой.

Подпрограммы

Слайд 72

Пример программы с процедурой:

Нахождение факториала числа. Вариант 1:
program f;
var
x: integer;
procedure

Пример программы с процедурой: Нахождение факториала числа. Вариант 1: program f; var
factorial(n: integer);
var
fact,i: integer;
begin
fact:=1;
for i:=1 to n do
begin
fact:=fact*i;
end;
writeln(n,'!=',fact);
end;
begin
write('Введите число: ');
readln(x);
factorial(x);
end.

Слайд 73

Нахождение факториала числа. Вариант 2:
program f;
var
x,fa: integer;
procedure factorial(n: integer; var

Нахождение факториала числа. Вариант 2: program f; var x,fa: integer; procedure factorial(n:
fact: integer);
var
i: integer;
begin
fact:=1;
for i:=1 to n do
begin
fact:=fact*i;
end;
end;
begin
write('Введите число: ');
readln(x);
factorial(x,fa);
writeln(x,'!=',fa);
end.

Слайд 74

Функция – это часть программы, которая вычисляет и возвращает значение.
Формат описания функции:
function

Функция – это часть программы, которая вычисляет и возвращает значение. Формат описания
имя функции (формальные параметры):тип результата;
раздел описаний функции
begin
исполняемая часть функции
имя функции := результат;
end;
Обязательно!!! В теле функции должно быть присвоение имени функции какого-либо значения!

Подпрограммы-функции

Слайд 75

Вычисление факториала:
program f1;
var a:integer;
Function Factorial(N:Byte):Longint; // определение функции
Var Fact:longint;

Вычисление факториала: program f1; var a:integer; Function Factorial(N:Byte):Longint; // определение функции Var
I:byte;
Begin
Fact:=n;
For i:=n-1 downto 2 do
Fact:=fact*i;
Factorial:=fact; //имени функции обязательно присваиваем //значение, которое она будет возвращать
End;
begin
write('Введите число:');
readln(a);
writeln('факториал вашего числа равен ',Factorial(a));
end.

Пример программы с функцией:

Слайд 76

Принцип локализации

Если объект (константа, переменная, процедура, функция или тип) описан в некоторой

Принцип локализации Если объект (константа, переменная, процедура, функция или тип) описан в
подпрограмме, то он называется локальным объектом подпрограммы.
Описание локальных объектов позволяет ограничивать область использования объекта той подпрограммой, в которой он имеет смысл.
Подпрограмма, т.е. фрагмент текста программы, для которого действительно описание объекта, называется его областью видимости.
В теле подпрограммы, наряду с локальными объектами, используются так называемые нелокальные объекты.
Любой объект, упоминаемый в подпрограмме, но не описанный в ней, является нелокальным. Если его описание принадлежит главной программе, то нелокальный объект называют глобальным.
Существование объектов, локальных в некоторой области видимости, позволяет, например, использовать один и тот же идентификатор для обозначения разных объектов, определенных в разных подпрограммах.

Слайд 77

Правила для определения области видимости:
1. Областью видимости идентификатора является блок, в котором

Правила для определения области видимости: 1. Областью видимости идентификатора является блок, в
он описан, и все вложенные блоки.
2. Если идентификатор, описанный в блоке, повторно описан во вложенных в него блоках, то вложенные блоки исключаются из области видимости идентификатора.
3. В ряде случаев (в частности, при работе с модулями), если имеются одноименные локальный и нелокальный объекты, можно получить доступ к нелокальному объекту, расширив его область видимости. Это достигается указанием имени модуля, в котором он описан, перед именем объекта.

Область видимости

Слайд 78

Временем жизни объекта называется время, в течение которого он существует в памяти

Временем жизни объекта называется время, в течение которого он существует в памяти
вычислительной машины.
Так как областью существования локального объекта является тело подпрограммы, размещение его в памяти происходит при входе в подпрограмму.
Значения локальных объектов не определены при входе в подпрограмму (первом и повторном). После завершения подпрограммы он уничтожается и значение его теряется.
Время жизни для локальных объектов — это время с момента вызова подпрограммы до ее завершения.
Для глобальных объектов время жизни — это время выполнения программы. Следовательно, для сохранения значений переменных между вызовами подпрограммы следует продлить ее время жизни, т.е. пользоваться нелокальными переменными, в частности глобальными.

Принцип локализации

Слайд 79

Структуры данных

Массив, строка, запись и множество называют фундаментальными структурами.
Переменные таких типов могут

Структуры данных Массив, строка, запись и множество называют фундаментальными структурами. Переменные таких
менять только своё значение, сохраняя местоположение в памяти и размер памяти, занимаемой ими.
Различают логические и физические уровни структурирования данных.
Логическая структура данного — идеальная схема представления или модель данного с точки зрения пользователя.
Физическая структура данного — это схема размещения или хранения данного в вычислительной машине. Говорят, что структура данного отображается в структуру хранения.

Слайд 80

Общая классификация структур данных

В зависимости от отсутствия или наличия явно заданных связей

Общая классификация структур данных В зависимости от отсутствия или наличия явно заданных
между элементами данных следует различать несвязные структуры (векторы, массивы, строки) и связные структуры (связные списки).
Весьма важный признак структур данных – их изменчивость (изменение числа элементов и/или связей между элементами структур). По признаку изменчивости различают структуры статические (векторы, массивы, записи, таблицы), полустатические (очереди, деки), динамические (списки) и файлы.
Статические структуры характеризуются следующими свойствами:
– постоянство структуры в течение всего времени существования;
– смежность элементов и непрерывность области памяти, отведённой сразу для всех элементов структуры;
– простота и постоянство отношений между элементами структуры.

Слайд 81

Общая классификация структур данных

Важный признак структуры данных – характер упорядоченности её элементов.

Общая классификация структур данных Важный признак структуры данных – характер упорядоченности её
По этому признаку структуры можно делить на линейно – упорядоченные, или линейные структуры (массивы) и нелинейные структуры (многосвязные списки, древовидные структуры, графовые структуры).
В зависимости от характера взаимного расположения элементов в памяти структуры данных можно разделить на структуры с последовательным размещением в памяти их элементов (векторы, строки, массивы, стеки) и структуры с произвольным связанным распределением в памяти (односвязные, двусвязные, циклически связные ассоциативные списки).

Слайд 82

Массив как структура данных

Массив – это упорядоченная совокупность конечного числа данных одного

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

Слайд 83

Одномерный массив

Массив с одним индексом называют одномерным.
Можно сказать, что одномерный массив соответствует

Одномерный массив Массив с одним индексом называют одномерным. Можно сказать, что одномерный
понятию вектора. Индекс определяет положение элемента массива относительно его начала.
Общая форма описания переменной типа массив:
Var <имя>: Array [<тип-индексов>] of <тип-элементов>;
Выбор отдельной компоненты одномерного массива осуществляется указанием идентификатора массива, за которым в квадратных скобках следует индексное выражение.
Индексное выражение должно давать значения, лежащие в диапазоне, определяемом типом индекса.
Например: M[1], M[2],…,M[N].
Работу с массивом удобно организовать в цикле.

Слайд 84

Пример создания и использования одномерного массива

Организовать ввод данных в массив и вывод

Пример создания и использования одномерного массива Организовать ввод данных в массив и
элементов на экран:
program f1;
const n=5;
var i:integer;
mas: array [1..n] of integer;
begin
for i:=1 to n do
begin
write('Введите ',i,'-й элемент массива :');
readln(mas[i]);
end;
writeln('Вот ваш массив: ');
for i:=1 to n do
write(mas[i],' ');
writeln;
end.

Слайд 85

Нестандартные способы индексации массива

Например, в программе могут присутствовать следующие описания:
Var Cod: Array[Char]

Нестандартные способы индексации массива Например, в программе могут присутствовать следующие описания: Var
Of 1..100;
L: Array[Boolean] Of Char;
В такой программе допустимы следующие обозначения элемен­тов массивов:
cod['x']; L[true]; cod[chr(65)]; L[a>0]
В некоторых случаях бывает удобно в качестве индекса использовать перечисляемый тип.
Например, данные о количестве учеников в четырех десятых классах одной школы могут храниться в следующем массиве:
Type Index=(А,В,С,D);
Var Class_10: Array[Index] Of Byte;
И если, например, элемент Class_10[A] равен 35, то это означает, что в 10 «А» классе 35 чел. Такое индексирование улучшает наглядность программы.

Слайд 86

Одномерный массив в разделе Type

Можно описать массив как специальный тип данных, а

Одномерный массив в разделе Type Можно описать массив как специальный тип данных,
потом использовать созданный тип для объявления переменных данного типа.
Синтаксис такого описания:
type <имя типа>=array[<тип-индексов>] оf <тип компонент>;
var <идентификатор массива> : <имя типа>;
Например:
Type Mas1=Array [1..100] Of Integer;
Mas2=Array [-10..10] Of Char;
Var Num: Mas1;
Sim: Mas2;
Именно такой вариант нужно использовать, если массив выступает в роли возвращаемого параметра процедуры.

Слайд 87

Одномерный массив в качестве параметра процедур и функций

Задача: Найти максимальный элемент массива.

Одномерный массив в качестве параметра процедур и функций Задача: Найти максимальный элемент
Заполнение массива, вывод массива и поиск максимального элемента оформить как 2 процедуры и функцию соответственно.
Program Mass_Max;
Const n=100;
Type vector = array [1..n] of Integer;
Var v : vector;
i : integer;
num: integer;
Procedure Enter (Var vect: vector; n: integer);
Var i: Integer;
Begin
For i:=1 to n do
vect[i]:=Random(10);
End;
Procedure printArray (Var vect: vector; n: integer);
var i: integer;
begin
for i:=1 to n do
write(v[i]:3);
writeln;
end;

Слайд 88

function arr_max(vect: vector; n: integer): integer;
Var i: Integer;
max: integer;
begin
max:=vect[1];
for

function arr_max(vect: vector; n: integer): integer; Var i: Integer; max: integer; begin
i:=2 to n do
if vect[i]>max then max:=vect[i];
arr_max:=max;
end;
Begin
Randomize;
write('Введите размерность массива: ');
readln(num);
Enter (v,num);
printArray(v,num);
writeln('Максимальный элемент массива: ',arr_max(v,num));
End.

Слайд 89

Строковый тип данных

Строка – это последовательность символов. Другими словами, строка – это

Строковый тип данных Строка – это последовательность символов. Другими словами, строка –
массив символов.
Каждый символ строки занимает 1 байт памяти (код ASCII). Количество символов в строке называется ее длиной. Длина строки может находиться в диапазоне от 0 до 255.
Строковые величины могут быть константами и переменными.
Строковая константа есть последовательность символов, заключенная в апострофы. Например:
'Язык программирования Pascal'
'Android-смартфон'
'Google – это самый известный поисковик'

Слайд 90

Строковая переменная описывается в разделе описания пере­менных следующим образом:
Var <идентификатор>: String[<максимальная длина

Строковая переменная описывается в разделе описания пере­менных следующим образом: Var : String[
строки>];
Например:
Var Name: String[20];
Параметр длины можно не указывать в описании. В таком случае подразумевается, что он равен максимальной величине – 255.
Например:
Var slovo: String;

Строковый тип данных

Слайд 91

Строковая переменная занимает в памяти на 1 байт больше, чем указанная в

Строковая переменная занимает в памяти на 1 байт больше, чем указанная в
описании длина. Нулевой байт содержит значение текущей длины строки.
Если строковой переменной не присвоено никакого значения, то ее текущая длина равна нулю.
По мере заполнения строки символами ее текущая длина возрастает, но она не должна превышать значения, заданного при объявлении строковой переменной.

Строковый тип данных

Слайд 92

К каждому символу строки можно обратиться как к элементу массива, т.е. используя

К каждому символу строки можно обратиться как к элементу массива, т.е. используя
имя переменной строкового типа и номер, который искомый символ занимает в строке.
Например:
Var Name: String[20];

Name:='Василий';
Writeln(name[3]);
На экран будет выведена буква
с

Строковый тип данных

Слайд 93

Сложение строк
Оператор + позволяет соединить 2 строки в одну:
Var Name: String[20];
fam:

Сложение строк Оператор + позволяет соединить 2 строки в одну: Var Name:
String[30];
all: String[50];
begin
Name:='Василий';
fam:='Иванов';
all:=Name+' '+fam;
Writeln(all);
end.
На экране появится:
Василий Иванов

Работа с данными строкового типа

Что будет выведено на экран?

Слайд 94

Функция определения длины строкового выражения
Length(S: String): Integer;
Функция получает в качестве параметра

Функция определения длины строкового выражения Length(S: String): Integer; Функция получает в качестве
выражение строкового типа (например, строковую переменную) и выдает длину строки.
Пример:
Var
S: String;
Begin
writeln('Введите строку: ');
Readln(S);
Writeln(' " ', S, ' " ');
Writeln(‘Длина строки = ', Length(S));
end.
Введите строку:
Привет
" Привет "
Длина строки = 6

Работа с данными строкового типа

Что будет выведено на экран?

Слайд 95

Функция выделения подстроки из строки
Copy(S: String; Index: Integer; Count: Integer): String;
Из строки

Функция выделения подстроки из строки Copy(S: String; Index: Integer; Count: Integer): String;
S начиная с элемента с номером Index копируется кол-во элементов, равное Count. В результате функция возвращает новую строку по заданным параметрам.
Var S: String;
begin
S := 'ABCDEF';
S := Copy(S, 2, 3);
writeln(s);
end.
BCD

Работа с данными строкового типа

Что будет выведено на экран?

Слайд 96

Процедура удаления подстроки из строки
Delete(Var S: String; Index: Integer; Count: Integer);
Из

Процедура удаления подстроки из строки Delete(Var S: String; Index: Integer; Count: Integer);
строки S удаляется Count элементов, начиная с элемента с номером Index. В результате сама исходная строка меняется, поэтому данную процедуру следует применять осторожно.
Var s: string;
begin
s := 'Honest Abe Lincoln';
Delete(s,8,4);
Writeln(s);
end.
Honest Lincoln

Работа с данными строкового типа

Что будет выведено на экран?

Слайд 97

Процедура вставки в строку подстроки
Insert(S1: String; Var S2: String; Index: Integer);
Вставляет строку

Процедура вставки в строку подстроки Insert(S1: String; Var S2: String; Index: Integer);
S1 в строку S2 начиная с позиции Index. В результате строка S2 изменяется.
Var S: String;
begin
S := 'Honest Lincoln';
Insert('Abe ', S, 8);
writeln(s);
end.
Honest Abe Lincoln

Работа с данными строкового типа

Что будет выведено на экран?

Слайд 98

Функция определения позиции подстроки в строке
Pos(Substr: String; S: String): Byte;
Возвращает номер

Функция определения позиции подстроки в строке Pos(Substr: String; S: String): Byte; Возвращает
элемента в строке S, с которого начинается подстрока Substr.
Var S: String;
begin
S := ' 123.5';
while Pos(' ', S) > 0 do
S[Pos(' ', S)] := '0';
writeln(s);
end.
000123.5

Работа с данными строкового типа

Что будет выведено на экран?

Слайд 99

Пример разбиения строки на слова

var s,s1: string;
i,l: integer;
begin
write('Введите строку: ');

Пример разбиения строки на слова var s,s1: string; i,l: integer; begin write('Введите
readln(s);
l:=Length(s);
for i:=1 to l do
begin
if s[i]<>' ' then s1:=s1+s[i]
else
begin
if s1<>'' then writeln(s1);
s1:='';
end;
end;
writeln(s1);
end.

Слайд 100

Двумерные массивы

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

Двумерные массивы Двумерные массивы являются аналогами матриц. Положение элемента в двумерном массиве
двумя индексами.
Первый индекс элемента двумерного массива определяет номер строки, а второй – номер столбца, на пересечении которых расположен элемент.
Описание двумерного массива можно производить следующим образом:
Способ 1. Для квадратных матриц:
Const
N = ранг_матрицы;
Type
matr=array [1..N,1..N] of тип_элементов_матрицы;
Var
Имя_матрицы : matr;

Слайд 101

Например:
Const
N = 10;
Type
matr=array [1..N,1..N] of integer;
Var
mass : matr;
Для неквадратных

Например: Const N = 10; Type matr=array [1..N,1..N] of integer; Var mass
матриц
Const
N = кол-во строк;
M = кол-во столбцов;
Type
matr=array [1..N,1..M] of тип_элементов_матрицы;
Var
Имя_матрицы : matr;

Двумерные массивы

Слайд 102

Способ 2. Универсальный.
Var <имя массива>: array [1.. кол-во_строк, 1..кол-во_столбцов] of тип_элементов_массива;
Например:
Var mas1:

Способ 2. Универсальный. Var : array [1.. кол-во_строк, 1..кол-во_столбцов] of тип_элементов_массива; Например:
array [1..5, 1..10] of real;
Пример организации ввода-вывода данных в двумерный массив:
Program Array_Full;
Const n=10;
Type mas = array [1..n, 1..n] of Integer;
Var m : mas;
a,b: integer;
Procedure Enter (Var tabl: mas; x: integer; y: integer);
Var i, j: Integer;
Begin
For i:= 1 to x do
For j:= 1 to y do
tabl[i,j]:=Random(10);
End;

Двумерные массивы

Слайд 103

Продолжение примера ввода-вывода данных в двумерный массив

Procedure MasPrint(tabl: mas; x: integer; y:

Продолжение примера ввода-вывода данных в двумерный массив Procedure MasPrint(tabl: mas; x: integer;
integer);
Var i, j: Integer;
Begin
writeln;
For i:= 1 to x do
begin
For j:= 1 to y do
write(tabl[i,j]:3);
writeln;
end;
writeln;
end;
Begin
Randomize;
write('Введите 2 числа для размерности массива: ');
readln(a,b);
Enter(m,a,b);
MasPrint(m,a,b);
End.

Слайд 104

Матричная алгебра

Задача: найти произведение двух матриц.
Например,
и
Решение: Вычислим произведение А*В.

Матричная алгебра Задача: найти произведение двух матриц. Например, и Решение: Вычислим произведение
Согласно правилу умножения матриц, элемент матрицы АВ, стоящий в i-ой строке и j-м столбце (сij) равен сумме произведений элементов i-й строки матрицы А на соответствующие элементы j-го столбца матрицы В.
Так, например,
С23=(-1)*3+(-2)*6+(-4)*9=-51
Подсчитав таким образом все элементы матрицы АВ, находим:

Слайд 105

Элементы результирующей матрицы С определяются по формуле:
где n – число строк

Элементы результирующей матрицы С определяются по формуле: где n – число строк
матрицы А; m – число столбцов матрицы А и число строк матрицы В; p – число столбцов В. В общем случае результирующая матрица С имеет n строк и p столбцов.
Program UM;
uses crt;
Const n=10;
Type mas = array [1..n, 1..n] of Integer;
Var A,b,C : mas;
K: integer;
Procedure Enter (Var tabl: mas; x,y: integer);
Var i, j: Integer;
Begin
For i:= 1 to x do
For j:= 1 to y do
tabl[i,j]:=Random(2);
End;

Матричная алгебра

Слайд 106

Procedure List(var tabl:mas; x,y: integer);
Var i, j: integer;
Begin
For i:=1

Procedure List(var tabl:mas; x,y: integer); Var i, j: integer; Begin For i:=1
to x do
begin
For j:=1 to y do
write (tabl[i,j]:4);
writeln;
end;
writeln;
End;
procedure proizved(var a,b,c:mas; x,y,z: integer);
var i,j,k: integer;
begin
For I:=1 to x do
For J:=1 to y do
Begin
C[I,J]:=0;
For K:=1 to z do
C[I,J]:=C[I,J]+A[I,K]*B[K,J];
End;
end;
Begin
enter(a,2,3);
enter(b,3,3);
writeln('Матрица А');
list(a,2,3);
writeln('Матрица B');
list(b,3,3);
proizved(a,b,c,2,3,3);
writeln('Матрица C');
list(c,2,3);
End.

Продолжение программы перемножения матриц

Слайд 107

Тип данных множество

Множество – набор однотипных элементов базового типа, каким-то образом связанных

Тип данных множество Множество – набор однотипных элементов базового типа, каким-то образом
друг с другом.
Базовый тип – это порядковый тип, кроме word, integer, longint.
Число элементов исходного множества не может быть больше 256, а порядковые номера элементов должны находится в пределах от 0 до 255.
Type
<имя множества> = set of <тип компонент>;
Var
<переменная>:<имя множества>;
или
Var
<переменная>: set of <тип компонент>;

Слайд 108

Пример объявления множеств и вывода на экран

type TDigit = set of 0..9

Пример объявления множеств и вывода на экран type TDigit = set of
;
TSimv = set of 'a'..'z';
var digit : TDigit;
simv : TSimv;
rus_bukvi: set of 'а'..'я';
begin
rus_bukvi:=['а'..'г'];
digit:=[1,2,5..7];
simv:=['i'..'x','a'];
writeln(rus_bukvi);
writeln(digit);
writeln(simv);
end.

Слайд 109

Допустимые операции с множествами

Допустимые операции с множествами

Слайд 110

Примеры решения задач с использованием множеств

Задача: Ввести строку символов, состоящую из латинских

Примеры решения задач с использованием множеств Задача: Ввести строку символов, состоящую из
букв, цифр и пробелов. Осуществить проверку правильности введенных символов (т.е. чтобы там были только цифры, латинские буквы и пробелы).
Var Str: string;
L: byte;
Test: boolean;
Begin
Writeln('Введите строку');
Readln (str);
L:=Length (Str);
Test:= L>0;
While Test and (L>0) do //выход из цикла будет осуществлен, если переменная test
Begin // станет равна false или L станет равна 0
Test:=Str[L] in ['0'..'9','A'..'Z','a'..'z',' '];
{test = true, если str[L] является одним из перечисленных символов}
{иначе test = false}
Dec (L) {аналог L:=L – 1}
End;
If Test then WriteLn ('Правильная строка')
Else WriteLn ('Неправильная строка');
End.

Слайд 111

Другое решение данной задачи:
Var Str: string;
L,i: byte;
Test: boolean;
Begin
Writeln ('Введите строку');
Readln(str);
L:=Length

Другое решение данной задачи: Var Str: string; L,i: byte; Test: boolean; Begin
(Str);
for i:=1 to L do
Begin
test:=Str[i] in ['0'..'9','A'..'Z','a'..'z',' '];
if test=false then break;
End;
If Test then WriteLn ('Правильная строка')
Else WriteLn ('Неправильная строка');
End.

Примеры решения задач с использованием множеств

Слайд 112

Еще одно решение этой задачи:
Var Str: string;
L,i,k: byte;
Begin
Writeln ('Введите строку');
Readln(str);

Еще одно решение этой задачи: Var Str: string; L,i,k: byte; Begin Writeln
L:=Length (Str);
for i:=1 to L do
Begin
if Str[i] in ['0'..'9','A'..'Z','a'..'z',' '] then k:=k+1;
End;
If k=L then WriteLn ('Правильная строка')
Else WriteLn ('Неправильная строка');
End.

Примеры решения задач с использованием множеств

Слайд 113

Задача: Заполнить множество A путем ввода n значений: var A: set of 0..200;

Задача: Заполнить множество A путем ввода n значений: var A: set of
j,x,n: byte;
begin
write('Введите кол-во эл-ов в мн-ве: ');
readln(n);
A:=[]; // задаем пустое мн-во
for j := 1 to n do
begin
repeat //цикл
x:=random(10); //генерируем число
until not (x in A); //проверяем его в мн-ве
A:=A+[x] // добавляем в мн-во введенный элемент
end;
write('Вот ваше мн-во: ');
for x := 0 to 200 do
if x in A then write(x:3); //если х в мн-ве, то напечатать его
writeln;
writeln(A); //можно просто вывести на экран мн-во
end.

Примеры решения задач с использованием множеств

Слайд 114

Тип данных запись

Запись представляет собой наиболее общий и гибкий структурированный тип данных, так

Тип данных запись Запись представляет собой наиболее общий и гибкий структурированный тип
как она может быть образована из неоднотипных компонентов и в ней явным образом выражена связь между элементами данных, характеризующими реальный объект.
Запись – это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов.
Определение типа записи начинается идентификатором record и заканчивается зарезервированным словом end.
Между ними располагается список компонентов, называемых полями, с указанием идентификаторов полей и типа каждого поля.

Слайд 115

Формат:
type
<имя типа> = record
<идентификатор поля>:<тип компонента>;
<идентификатор поля>:<тип компонента>;
. . .
<идентификатор поля>:<тип

Формат: type = record : ; : ; . . . :
компонента>;
end;
var
<идентификатор, ...> : <имя типа>;

Тип данных запись

Слайд 116

Пример:
type Car = record
gosNumber : string; {гос.номер}
Marka : string[20]; {Марка

Пример: type Car = record gosNumber : string; {гос.номер} Marka : string[20];
автомобиля}
FIO : string[40]; {Фамилия, инициалы владельца}
Address : string[60] {Адрес владельца}
end;
var
m, V : Car;
После объявления в программе переменной типа «запись» к каждому ее полю можно обратиться, указав сначала идентификатор переменной-записи, а затем через точку – имя поля.

Тип данных запись

Слайд 117

Пример использования записи

Создать список автомобилей и в нем найти все с маркой

Пример использования записи Создать список автомобилей и в нем найти все с
машины, введенной пользователем.
type Car = record
gosNumber : string; {гос.номер}
Marka : string[20]; {Марка автомобиля}
FIO : string[40]; {Фамилия, инициалы владельца}
end;
cars=array [1..10] of car;
var
autos : cars;
i,n : integer;
name : string;
flag : boolean;
procedure enterCars (var m: cars; n: integer);
var i: integer;
begin
for i:=1 to n do
begin
writeln('Введите ',i,'-ю запись: ');
write('Марка машины:':20);
readln(m[i].marka);
write('Номер машины:':20);
readln(m[i].gosNumber);
write('ФИО владельца:':20);
readln(m[i].fio);
end;
end;

Слайд 118

procedure printHead;
begin
writeln('Вот ваши записи:');
writeln('№ ':4,'|','Марка ':10,'|','Владелец ':20,'|','Гос.номер ':15);
end;
begin
write('Введите кол-во

procedure printHead; begin writeln('Вот ваши записи:'); writeln('№ ':4,'|','Марка ':10,'|','Владелец ':20,'|','Гос.номер ':15); end;
записей: ');
readln(n);
enterCars(autos, n);
printHead;
for i:=1 to n do
begin
writeln(i:4,'|',autos[i].Marka:10,'|',autos[i].FIO:20,'|',
autos[i].gosNumber:15);
end;
write('Введите марку машины: ');
readln(name);
printHead;
for i:=1 to n do
begin
if (name=autos[i].Marka) then
begin
writeln(i:4,'|',autos[i].Marka:10,'|',autos[i].FIO:20,'|',
autos[i].gosNumber:15);
flag:=true;
end;
end;
if flag=false then writeln('Не найдено.');
end.

Слайд 119

Тип данных файл

С одной стороны, файл – это область памяти на внешнем

Тип данных файл С одной стороны, файл – это область памяти на
носителе, в котором хранится некоторая информация.
Файл в таком понимании называют физическим файлом, т.е. существующим физически на некотором материальном носителе информации.

С другой стороны, файл – это одна из структур данных, используемых в программировании.
Файл в таком понимании называют логическим файлом, т.е. существующим в нашем логическом представлении при написании программы.

Слайд 120

Структура физического файла представляет собой простую последовательность байт памяти носителя информации.
Структура

Структура физического файла представляет собой простую последовательность байт памяти носителя информации. Структура
логического файла – это способ восприятия файла в программе.
Любой файл имеет следующие характеристики-требования:
у него есть имя (набор из восьми, допустимых для имени файла, символов плюс расширение, указываемое после точки в имени файла, состоящее из трех символов);
он должен содержать данные одного типа (любой тип языка Pascal, кроме типа Файл, то есть не существует типа «Файл файлов»);
Размер создаваемого файла никак не регламентируется при создании файла и ограничивается только емкостью носителя информации.

Тип данных файл

Слайд 121

Работа с файлами в Паскале осуществляется следующим образом:
сначала объявляется переменная файлового

Работа с файлами в Паскале осуществляется следующим образом: сначала объявляется переменная файлового
типа, с указанием свойств переменной (то есть типом содержимого);
затем данная файловая переменная связывается («ассигнуется») с именованным дисковым пространством (то есть непосредственно с конкретным файлом, содержащим или который будет содержать данные того же типа, что и связываемая переменная-файл).

Тип данных файл

Слайд 122

Переменная файлового типа может быть объявлена одной из следующих строк:
<имя> = file

Переменная файлового типа может быть объявлена одной из следующих строк: = file
of <тип>;
<имя> = text; {текстовый файл}
<имя> = file; {файл без типа}
где <имя> – имя переменной-файла;
file of – зарезервированные слова (файл из);
text – имя стандартного типа текстовых файлов;
<тип> – имя любого стандартного типа языка Pascal, кроме типа файл.

Тип данных файл

Слайд 123

Например файл, содержащий список учеников и их возраст:
type
pupil = record
surname

Например файл, содержащий список учеников и их возраст: type pupil = record
: string[30];
name : string[30];
age : word
end;
Var
journal : file of pupil;

Тип данных файл

Слайд 124

Текстовые файлы – это файлы, содержащие символы, разделенные на строки, а в

Текстовые файлы – это файлы, содержащие символы, разделенные на строки, а в
конце каждой строки стоит признак конца строки.
Текстовые файлы не имеют прямого доступа.
При чтении и записи числа преобразуются автоматически.
К ним применима процедура Append(<имя переменной текстового файла>). Она открывает текущий файл, с которым связана данная переменная, текущий указатель помещает в конец для добавления новой информации.
Нетипизированные файлы предназначены для низкоуровневой работы с файлами.
С их помощью можно обратиться к файлу любого типа и логической структуры.
За одно обращение считывается/записывается число байт, приблизительно равное величине буфера ввода/вывода. В качестве буфера может выступать любая переменная. Для записи и чтения используются процедуры BlockRead, BlockWrite.

Тип данных файл

Слайд 125

Процедуры и функции обработки файловых переменных

Assign (<имя файловой переменной>, ’<путь и имя

Процедуры и функции обработки файловых переменных Assign ( , ’ ’) –
файла на диске>’) – связь переменной файлового типа с конкретным внешним файлом.
Reset (f) – процедура открытия существующего файла и подготовка к чтению файла, связанного с файловой переменной f. Указатель текущей позиции файла устанавливается в его начало.
Rewrite (f) – процедура создания нового физического файла и подготовка к записи файла, связанного с файловой переменной f. Если такой файл существует, то он удаляется, и на этом месте создается новый пустой файл. Указатель текущей позиции файла устанавливается в его начало.

Слайд 126

Readln (f) – пропуск строки файла до начала следующей.
Writeln (f) – запись

Readln (f) – пропуск строки файла до начала следующей. Writeln (f) –
признака конца строки и переход на следующую.
Read (f, x) – процедура чтения компоненты файла. Данные выводятся из файла.
Write (f, x) – процедура записи значения переменной в файл, который хранится на диске. Указатель перемещается на следующий элемент. Если указатель текущей позиции файла находится за последним элементом, т.е. в конце файла, то файл расширяется.
Eof (f) – признак конца файла – логическая функция для определения, достигнут ли конец файла.
Close (f) – процедура закрытия файла (!!! именно в этот момент происходит реальная запись в файл).

Процедуры и функции обработки файловых переменных

Слайд 127

Примеры решений задач c использованием файлов

Прочитать из текстового файла А все записанные

Примеры решений задач c использованием файлов Прочитать из текстового файла А все
в него целые числа (их можно ввести в него через Блокнот и сохранить файл), преобразовать их в вещественные и вывести в текстовый файл В по 4 числа в строку.
Var F1,F2: text; // объявляем 2 переменные типа текстовых файлов
X: real;
s: string;
I:integer;
Begin
Assign (F1,'A.txt'); //связываем переменную F1 с файлом A.txt
//(находится там же, где и программа)
Reset(F1); // открываем его для чтения
//(т.е. он уже должен быть создан ранее)
Assign (F2,'B.txt'); //связываем F2 с файлом В.txt
//(будет находиться там же, где и программа)
Rewrite (F2); // открываем его для записи
writeln('содержимое файла А.txt:');

Слайд 128

Repeat // цикл
For I:=1 to 4 do // цикл от 1 до

Repeat // цикл For I:=1 to 4 do // цикл от 1
4,
//т.к. нужно в файле В формировать по 4 числа в строке
If not seekeof(F1) then // если еще не конец файла,
Begin //связанного с F1, то делаем
Read (F1,x); //считываем из файла, связанного с F1,
//1 компонент и помещаем его в переменную х
write(x:-5:0); //выводим на экран, что считали из
//файла в текущий момент, -5 означает, что в поле из 5
//позиций с выравниванием по левому краю
Write (F2,x:-5:1) // выводим текущее считанное
//значение в файл, связанный с F2
End;
Writeln(F2); // делаем в файле переход на новую строку
//(чтобы следующее значение выводилось с новой строки)
Until seekeof (F1);//будет повторяться,
//пока файл не закончится
writeln;

Слайд 129

Close (F1); // закрываем файл, связанный с F1
Close (F2); // закрываем файл, связанный

Close (F1); // закрываем файл, связанный с F1 Close (F2); // закрываем
с F2
Reset(F2); //открываем файл, связанный с F2,
//для чтения
writeln('содержимое файла B.txt:');
Repeat //цикл
Readln(F2,s); // считываем по целой строке из B
writeln(s); //и записываем в строковую переменную s
Until seekeof (F2);//пока не конец файла, связанного //с F2
Close (F2);
End.
Пример работы программы:
содержимое файла А.txt:
1 2 3 4 5
содержимое файла B.txt:
1.00 2.00 3.00 4.00
5.00

Слайд 130

2. Работа с числовыми файлами. Записать в файл числа (кол-во вводит пользователь,

2. Работа с числовыми файлами. Записать в файл числа (кол-во вводит пользователь,
сами числа задаются генератором случайных чисел). Записать в другой файл числа, кратные 5 или 4.
var f1,f2: file of integer; //файловые переменные типа integer (в файле будут только целые числа)
i,n,x: integer;
begin
assign(f1,'a.dat'); //связываем файловую переменную f1 с файлом a.dat
rewrite(f1); //открываем его на запись или перезапись
//(если он уже существует)
assign(f2,'b.dat'); // связываем файловую переменную f2 с файлом b.dat
rewrite(f2); // открываем его на запись или перезапись
//(если он уже существует)
write('Введите кол-во чисел: ');
readln(n);
for i:=1 to n do // будем в цикле записывать данные в файл
begin
x:=random(30);
write(f1,x); // текущее значение х записывается в файл
end;
close(f1); //закрываем файл, связанный с f1
//(это нужно, чтобы все записанные в него данные сохранились)

Слайд 131

reset(f1); // открываем файл для чтения
writeln('Вот числа из первого файла:');

reset(f1); // открываем файл для чтения writeln('Вот числа из первого файла:'); for
for i:=1 to n do
begin
read(f1,x); // считываем 1 значение из файла,
//связанного с f1, и записываем его в х
write(x:5); // выводим х на экран
if (x mod 5 =0) or (x mod 4 = 0) then write(f2,x);
end;
close(f1); // закрываем файл, связанный с f1
close(f2); // закрываем файл, связанный с f2
reset(f2); // открываем файл, связанный с f2, для чтения
writeln; writeln('Вот числа из второго файла:');
while (not eof(f2)) do // т.к. мы не знаем, сколько было //записано элементов в файл, связанный с f2, то используем //цикл с условием, который будет работать, пока не будет //считан признак конца файла (while (not eof(f2)) do)
begin
read(f2,x); // считываем 1 элемент из файла, связанного с //f2, и записываем его в х
write(x:5); // выводим х на экран
end;
close(f2); // закрываем файл, связанный с f2
end.

Слайд 132

Работа с графикой в PascalABC.NET

Для работы с графикой в среде программирования PascalABC.NET

Работа с графикой в PascalABC.NET Для работы с графикой в среде программирования
нужно подключить модуль GraphABC.
Процедуры модуля GraphABC:
procedure SetPixel(x,y,color: integer);
Закрашивает один пиксел с координатами (x,y) цветом color.
procedure MoveTo(x,y: integer);
Передвигает невидимое перо к точке с координатами (x,y); эта функция работает в паре с функцией LineTo(x,y).
procedure LineTo(x,y: integer);
Рисует отрезок от текущего положения пера до точки (x,y); координаты пера при этом также становятся равными (x,y).
procedure Line(x1,y1,x2,y2: integer);
Рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2).

Слайд 133

procedure Circle(x,y,r: integer);
Рисует окружность с центром в точке (x,y) и радиусом r.
procedure

procedure Circle(x,y,r: integer); Рисует окружность с центром в точке (x,y) и радиусом
Ellipse(x1,y1,x2,y2: integer);
Рисует эллипс, заданный своим описанным прямоугольником с координатами противоположных вершин (x1,y1) и (x2,y2).
procedure Rectangle(x1,y1,x2,y2: integer);
Рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2).
procedure RoundRect(x1,y1,x2,y2,w,h: integer);
Рисует прямоугольник со скругленными краями; (x1,y1) и (x2,y2) задают пару противоположных вершин, а w и h – ширину и высоту эллипса, используемого для скругления краев.

Слайд 134

procedure Arc(x,y,r,a1,a2: integer);
Рисует дугу окружности с центром в точке (x,y) и радиусом

procedure Arc(x,y,r,a1,a2: integer); Рисует дугу окружности с центром в точке (x,y) и
r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки).
procedure Pie(x,y,r,a1,a2: integer);
Рисует сектор окружности, ограниченный дугой (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

Слайд 135

procedure TextOut(x,y: integer; s: string);
Выводит строку s в позицию (x,y) (точка (x,y)

procedure TextOut(x,y: integer; s: string); Выводит строку s в позицию (x,y) (точка
задает верхний левый угол прямоугольника, который будет содержать текст из строки s).
procedure FloodFill(x,y,color: integer);
Заливает область одного цвета цветом color, начиная с точки (x,y).
procedure FillRect(x1,y1,x2,y2: integer);
Заливает прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2), цветом текущей кисти.

Слайд 136

procedure Polygon(points: array of Point);
Рисует заполненный многоугольник, координаты вершин которого заданы в

procedure Polygon(points: array of Point); Рисует заполненный многоугольник, координаты вершин которого заданы
массиве points.
procedure Polyline(points: array of Point);
Рисует ломаную по точкам, координаты которых заданы в массиве points. uses
graphABC;
uses
graphABC;
var
P: array of Point; //Массив точек
begin
SetWindowSize(600, 450); //Устанавливаем размер окна
SetPenColor(clGreen); //Цвет линий
SetPenWidth(3); //Толщина линий
SetLength(P, 3); //Устанавливаем размер массива points
p[0].x := 300; p[0].y := 100; //Координаты первой вершины
p[1].x := 500; p[1].y := 200; //Координаты второй вершины
p[2].x := 300; p[2].y := 400; //Координаты третьей вершины
Polygon(P) //Рисуем ломаную по точкам из массива P
end.

Слайд 137

function PenX: integer;
function PenY: integer;
Возвращают текущие координаты пера.
procedure SetPenColor(color: integer);
Устанавливает цвет

function PenX: integer; function PenY: integer; Возвращают текущие координаты пера. procedure SetPenColor(color:
пера, задаваемый параметром color.
function PenColor: integer;
Возвращает текущий цвет пера.

Слайд 138

procedure SetPenWidth(w: integer);
Устанавливает ширину пера, равную w пикселам.
function PenWidth: integer;
Возвращает текущую ширину

procedure SetPenWidth(w: integer); Устанавливает ширину пера, равную w пикселам. function PenWidth: integer;
пера.
procedure SetPenStyle(ps: integer);
Устанавливает стиль пера, задаваемый параметром ps.
function PenStyle: integer;
Возвращает текущий стиль пера.
Стили пера задаются следующими именованными константами:
psSolid psClear psDash
psDot psDashDot psDashDotDot

Слайд 139

procedure SetBrushColor(color: integer);
Устанавливает цвет кисти, задаваемый параметром color.
function BrushColor: integer;
Возвращает текущий

procedure SetBrushColor(color: integer); Устанавливает цвет кисти, задаваемый параметром color. function BrushColor: integer;
цвет кисти.
procedure SetBrushStyle(bs: integer);
Устанавливает стиль кисти, задаваемый параметром bs.
function BrushStyle: integer;
Возвращает текущий стиль кисти.

Слайд 140

SetBrushHatch(bhLargeConfetti);
Стили кисти задаются следующими именованными константами:
bhSolid bhCross bhClear bhDiagCross bhHorizontal

SetBrushHatch(bhLargeConfetti); Стили кисти задаются следующими именованными константами: bhSolid bhCross bhClear bhDiagCross bhHorizontal
bhBDiagonal
bhVertical bhFDiagonal
procedure ClearWindow;
Очищает графическое окно белым цветом.
procedure ClearWindow(c: ColorType);
Очищает графическое окно цветом c.

Слайд 141

Пример. Составим программу, рисующую голову робота. Рисунок содержит два прямоугольника, 4 окружности,

Пример. Составим программу, рисующую голову робота. Рисунок содержит два прямоугольника, 4 окружности,
две дуги, эллипс, три прямые линии. Заранее определяются все координаты и размеры элементов рисунка.

Слайд 142

uses graphABC;
begin
Rectangle(100,100,300,300); {голова}
floodfill(105,120,clBlue); // закрашиваем голову синим
Circle(150,170,30); {левый глаз}

uses graphABC; begin Rectangle(100,100,300,300); {голова} floodfill(105,120,clBlue); // закрашиваем голову синим Circle(150,170,30); {левый
Circle (250,170,30); {правый глаз}
Arc (150,170,45,135,40); {левая бровь}
Arc (250,170,45,135,40); {правая бровь}
Ellipse(190,200,210,250); {нос}
floodfill(195,220,clRed); // закрашиваем нос красным
Rectangle (130,280,270,290); {рот}
MoveTo (100,300); {переход вниз влево}
LineTo(50,350); {три}
LineTo(350,350); {линии}
LineTo(300,300); {шеи}
SetPenWidth(5); // устанавливаем толщину линии в 5 пикселей
Circle(150,170,10); {левый зрачок}
Circle(250,170,10); {правый зрачок}
end.

Слайд 143

Графика и движение

uses graphabc;
var i: integer;
begin
for i:=0 to 300 do

Графика и движение uses graphabc; var i: integer; begin for i:=0 to

begin
SetPenColor(clBlack);
circle(60,60+i,50);
Sleep(50);
ClearWindow();
end;
end.

Слайд 144

Создание модулей в языке Pascal

Структура модуля
Структура модуля аналогична структуре программы, однако есть

Создание модулей в языке Pascal Структура модуля Структура модуля аналогична структуре программы,
несколько существенных различий.
unit <идентификатор>; //должен совпадать с именем файла
interface
uses <список модулей>; { Необязательный }
{ глобальные описания }
implementation
uses <список_модулей>; { Необязательный }
{ локальные описания }
{ реализация процедур и функций }
begin
{ код инициализации }
end.

Слайд 145

Интерфейсная секция
Интерфейсная часть – «общедоступная» часть в модуле – начинается зарезервированным словом

Интерфейсная секция Интерфейсная часть – «общедоступная» часть в модуле – начинается зарезервированным
interface, следует сразу после заголовка модуля и заканчивается перед зарезервированным словом implementation.
Интерфейс определяет, что является «видимым» (доступным) для любой программы (или модуля), использующей данный модуль.
В интерфейсной части (секции) модуля можно определять константы, типы данных, переменные, процедуры и функции.
Процедуры и функции, видимые для любой программы, использующей данный модуль, описываются в секции интерфейса, однако их действительные тела – реализации – находятся в секции реализации.
В интерфейсной части перечисляются все заголовки процедур и функций.

Создание модулей в языке Pascal

Слайд 146

Секция реализации
Содержит программную логику процедур и функций.
Секция реализации – «приватная» часть –

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

Слайд 147

Пример. Напишем модуль с двумя функциями: первая меняет значения двух переменных; вторая

Пример. Напишем модуль с двумя функциями: первая меняет значения двух переменных; вторая
находит максимум из двух переменных.
unit IntLib;
interface {объявляем процедуры и функции, которые будут реализованы позже}
procedure ISwap(var I,J : integer);
{меняет значения переменных: I на значение J, J на значение I}
function IMax(I,J : integer) : integer; {находит максимум из двух переменных}

Создание модулей в языке Pascal

Слайд 148

implementation {расписываем процедуры и функции, объявленные ранее}
procedure ISwap;
var Temp : integer;
begin

implementation {расписываем процедуры и функции, объявленные ранее} procedure ISwap; var Temp :
Temp := I; I := J; J := Temp
end; { конец процедуры ISwap }
function IMax: integer;
begin
if I > J then IMax := I else IMax := J
end; { конец функции IMax }
end. { конец модуля IntLib }
// ctrl+F9 (создание бинарного файла модуля)

Слайд 149

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

program IntTest;
uses IntLib;
var
A,B : integer;
begin
Write('Введите два целочисленных

Программа, использующая созданный модуль program IntTest; uses IntLib; var A,B : integer;
значения:');
Readln(A,B);
ISwap(A,B);
Writeln('A = ',A,' B = ',B);
Writeln('Максимальное значение равно ', IMax(A,B));
end.

Слайд 150

Динамические структуры данных

Для работы с динамическими структурами данных используются указатели.
Указатели представляют

Динамические структуры данных Для работы с динамическими структурами данных используются указатели. Указатели
собой специальный тип данных.
Они принимают значения, равные адресам размещения в оперативной памяти соответствующих динамических переменных.

Слайд 151

Пример

type
pint=^integer;
var x,y:integer;
px: pint;
begin
x:=1;
new(px);
px:=@x;
px^:=5;
writeln(x);
end.

Пример type pint=^integer; var x,y:integer; px: pint; begin x:=1; new(px); px:=@x; px^:=5; writeln(x); end.

Слайд 152

Списком называется структура данных, каждый элемент которой посредством указателя связывается со следующим

Списком называется структура данных, каждый элемент которой посредством указателя связывается со следующим
элементом.
На самый первый элемент (голову списка) имеется отдельный указатель.
Из определения следует, что каждый элемент списка содержит поле данных (оно может иметь сложную структуру) и поле ссылки на следующий элемент.
Поле ссылки последнего элемента должно содержать пустой указатель (nil).
Число элементов связанного списка может расти или уменьшаться в зависимости от того, сколько данных мы хотим хранить в нем.

Динамические структуры данных

Слайд 153

Список

Чтобы добавить новый элемент в список, необходимо:
1. Получить память для него.
2.

Список Чтобы добавить новый элемент в список, необходимо: 1. Получить память для
Поместить туда информацию.
3. Добавить элемент в конец списка (или начало).
Элемент списка состоит из разнотипных частей (хранимая информация и указатель), и его естественно представить записью.
Перед описанием самой записи описывают указатель на нее:
Type { описание списка из целых чисел }
PList = ^TList;
TList = record
Data: Integer;
Next : PList;
end;

Слайд 154

Создание списка

Type { описание списка из целых чисел }
PList = ^TList;

Создание списка Type { описание списка из целых чисел } PList =
TList = record
Data : Integer;
Next : PList;
end;
var
x,list,head : PList;
begin
new(head);
head^.data:=3;
head^.next:=nil;
x:=head;
New(x^.Next);
x := x^.Next;
x^.Data := 5; { значение этого элемента }
x^.Next := nil; {следующего значения нет }
New(x^.Next); { выделим области памяти для следующего элемента }
x := x^.Next ; { переход к следующему (3-му) элементу списка }
x^.Data := 1; { значение этого элемента }
x^.Next := nil; {следующего значения нет }

Слайд 155

Просмотр списка

List := Head;
While List <> nil do
begin
WriteLn(List^.Data);

Просмотр списка List := Head; While List nil do begin WriteLn(List^.Data); List
List := List^.Next;
{ переход к следующему элементу;
аналог для массива i:=i+1 }
end;
end.

Слайд 156

Удаление элемента из списка

При удалении элемента из списка необходимо различать три случая:
1.

Удаление элемента из списка При удалении элемента из списка необходимо различать три
Удаление элемента из начала списка.
2. Удаление элемента из середины списка.
3. Удаление из конца списка.

Слайд 157

Удаление элемента из начала списка

{ запомним адрес первого элемента списка }
List

Удаление элемента из начала списка { запомним адрес первого элемента списка }
:= Head;
{теперь Head указывает на второй элемент списка }
Head := Head^.Next;
{ освободим память, занятую переменной List }
Dispose(List);

Слайд 158

Удаление элемента из середины списка

Для этого нужно знать адреса удаляемого элемента и

Удаление элемента из середины списка Для этого нужно знать адреса удаляемого элемента
элемента, находящегося в списке перед ним.
List := Head;
While (List<>nil) and (List^.Data<>Digit) do
begin
x := List;
List := List^.Next;
end;
x^.Next := List^.Next;
Dispose(List);

Слайд 159

Удаление из конца списка

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

Удаление из конца списка Оно производится, когда указатель х показывает на предпоследний
списка, а List – на последний.
List := Head;
x:= Head;
While List^.Next<>nil do
begin
x := List;
List := List^.Next;
end;
x^.Next := nil;
Dispose(List);

Слайд 160

Рекурсия

Рекурсией называется способ задания функции, при котором значение определяемой функции для произвольных

Рекурсия Рекурсией называется способ задания функции, при котором значение определяемой функции для
значений аргументов выражается известным образом через значения этой функции для других значений аргументов.
Различают два вида рекурсии подпрограмм:
прямая или явная рекурсия – характеризуется существованием в теле подпрограммы оператора обращения к самой себе;
косвенная или неявная рекурсия – образуется при наличии цепочки вызовов других подпрограмм, которые в конечном итоге приведут к вызову исходной.

Слайд 161

Косвенная или неявная рекурсия

function iMax(x,y: integer):integer;
begin
if x>y then iMax:=x else iMax:=y;
end;
var

Косвенная или неявная рекурсия function iMax(x,y: integer):integer; begin if x>y then iMax:=x
a,b,c,d: integer;
begin
write('Введите 4 числа: ');
readln(a,b,c,d);
writeln('Максимальное: ', iMax( iMax(a,b), iMax(c,d) ) );
end.

Слайд 162

Явная рекурсия

function fakt(n:integer):integer;
begin
if n=0 then fakt:=1 else fakt:=n*fakt(n-1);
end;
var i: integer;
begin
write('Введите

Явная рекурсия function fakt(n:integer):integer; begin if n=0 then fakt:=1 else fakt:=n*fakt(n-1); end;
число ->');
readln(i);
writeln(fakt(i));
end.

Слайд 163

Многие математические функции можно выразить рекурсивно.
Например, для неотрицательных значений n имеем:

Данное

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

Слайд 164

Рекурсивное возведение числа в степень

function step(a,n:integer):integer;
begin
if n=0 then step:=1
else step:=a*step(a,n-1);
end;
var x,y:

Рекурсивное возведение числа в степень function step(a,n:integer):integer; begin if n=0 then step:=1
integer;
begin
write('Введите число и степень-> ');
readln(x,y);
writeln(step(x,y));
end.

Слайд 165

Рекурсивное вычисление суммы элементов одномерного массива

Type LinMas = Array[1..100] Of Integer;
Var A

Рекурсивное вычисление суммы элементов одномерного массива Type LinMas = Array[1..100] Of Integer;
: LinMas;
I, N : Byte;
Function Summa(N : Byte; A: LinMas) : Integer;
Begin
If N = 0 Then Summa := 0 Else Summa := A[N] + Summa(N - 1, A)
End;
Begin
Write('Количество элементов массива? ');
ReadLn(N);
Randomize;
For I := 1 To N Do
Begin
A[I] := Random(5)+1;
Write(A[I] : 4)
End;
WriteLn; WriteLn('Сумма: ', Summa(N, A))
End.

Слайд 166

Рекурсивное определение строки-палиндрома

Function Pal(S: String) : Boolean;
Begin
If Length(S)<=1 Then Pal:=True
Else

Рекурсивное определение строки-палиндрома Function Pal(S: String) : Boolean; Begin If Length(S) Else
Pal:= (S[1]=S[Length(S)])
and Pal(Copy(S, 2, Length(S) - 2));
End;
Var S : String;
Begin
Write('Введите строку: '); ReadLn(S);
If Pal(S) Then
WriteLn('Строка является палиндромом')
Else WriteLn('Строка не является палиндромом')
End.

Слайд 167

Рекурсия и графика

uses graphabc;
var x,y,r,d,m:integer;
procedure ris(x,y,r:integer);
var i:integer;
begin

Рекурсия и графика uses graphabc; var x,y,r,d,m:integer; procedure ris(x,y,r:integer); var i:integer; begin
if r<10 then exit;
circle(x,y,r);
sleep(300);
ris(x+r,y,r div 2);
ris(x-r,y,r div 2);
end;
begin
x:=320;
y:=240;
r:=120;
ris(x,y,r);
end.

Слайд 168

Рекурсия и фракталы

uses graphabc;
var
x,y,r:integer;
procedure ris(x,y,r:integer);
var
x1,y1,t:integer;

Рекурсия и фракталы uses graphabc; var x,y,r:integer; procedure ris(x,y,r:integer); var x1,y1,t:integer; begin

begin
if r<=1 then begin putpixel(x,y,clRed);exit end;
for t:=0 to 6 do
begin
x1:=x+trunc(r*cos(t*pi/3));
y1:=y+trunc(r*sin(t*pi/3));
line(x,y,x1,y1);
ris(x1,y1,r*2 div 5);
sleep(5);
end;
end;
begin
x:=320;
y:=240;
r:=80;
ris(x,y,r);
end.

Слайд 169

Кривая дракона

uses graphabc;
var k:integer;
procedure ris(x1,y1,x2,y2,k:integer);
var xn,yn:integer;
begin
if k>0

Кривая дракона uses graphabc; var k:integer; procedure ris(x1,y1,x2,y2,k:integer); var xn,yn:integer; begin if
then
begin
xn:=(x1+x2) div 2 +(y2-y1) div 2;
yn:=(y1+y2) div 2 -(x2-x1) div 2;
ris(x1,y1,xn,yn,k-1);
ris(x2,y2,xn,yn,k-1);
end
else begin line(x1,y1,x2,y2); end;
end;
begin
readln ( k );{задаем порядок кривой}
ris(200,300,500,300,k);
end.

Слайд 170

Сортировка массива

Под сортировкой массивов понимают процесс перестановки элементов массива в определённом порядке.

Сортировка массива Под сортировкой массивов понимают процесс перестановки элементов массива в определённом

Цель сортировки – облегчить последующий поиск элементов в отсортированном массиве.
Методы сортировки важны при обработке данных, с ними связаны многие фундаментальные приёмы построения алгоритмов.
Сортировки могут быть выполнены с использованием различных алгоритмов: как простых, так и усложнённых (но более эффективных).

Слайд 171

Основное требование к методам сортировки: экономное использование памяти и быстродействие.
Хорошие алгоритмы

Основное требование к методам сортировки: экономное использование памяти и быстродействие. Хорошие алгоритмы
сортировки требуют порядка n•log2n сравнений.
Простые методы сортировки можно разбить на три основных класса в зависимости от лежащего в их основе приёма:
сортировка выбором;
сортировка обменом;
сортировка включением.
Простые методы сортировки требуют порядка n*n сравнений элементов (ключей).

Сортировка массива

Слайд 172

Сортировка обменом (метод пузырька)

Сортировка обменом предусматривает систематический обмен значениями (местами) тех пар,

Сортировка обменом (метод пузырька) Сортировка обменом предусматривает систематический обмен значениями (местами) тех
в которых нарушается упорядоченность, до тех пор, пока таких пар не останется.
Проходы по массиву повторяются N-1 раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает – массив отсортирован.
При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим «наибольшим элементом», а наименьший элемент перемещается на одну позицию к началу массива («всплывает» до нужной позиции как пузырёк в воде, отсюда и название алгоритма).

Слайд 173

Реализация сортировки методом пузырька

procedure bubbleSort(var data: vector; n: integer);
var i,j, tmp:

Реализация сортировки методом пузырька procedure bubbleSort(var data: vector; n: integer); var i,j,
integer;
begin
for i:=1 to n-1 do
begin
for j:=1 to n-i do
begin
if (data[j] > data[j+1]) then
begin
tmp:=data[j];
data[j]:= data[j+1];
data[j+1]:=tmp;
end;
end;
end;
end;

Слайд 174

Реализация сортировки методом пузырька

procedure bubbleSort(var data: vector; n: integer);
var i,j, tmp:

Реализация сортировки методом пузырька procedure bubbleSort(var data: vector; n: integer); var i,j,
integer;
begin
for i:=1 to n-1 do
begin
for j:=1 to n-i do
begin
if (data[j] > data[j+1]) then
begin
tmp:=data[j];
data[j]:= data[j+1];
data[j+1]:=tmp;
end;
end;
end;
end;

Слайд 175

Сортировка посредством простого выбора

Сортировка основана на идее многократного выбора (находится сначала наибольший

Сортировка посредством простого выбора Сортировка основана на идее многократного выбора (находится сначала
элемент, затем второй по величине и т. д.) и сводится к следующему:
1) найти элемент с наибольшим значением;
2) поменять значениями найденный элемент и последний;
3) уменьшить на единицу количество просматриваемых элементов;
4) если <количество элементов для следующего просмотра больше единицы> то <повторить пункты, начиная с 1-го>.

Слайд 176

Реализация сортировки выбором

type vector=array[1..100] of integer;
procedure sort_choice (var a: vector; n: integer)

Реализация сортировки выбором type vector=array[1..100] of integer; procedure sort_choice (var a: vector;
;
var X : integer;
i , j , k : integer;
begin
for i:=n downto 2 do
begin
k:=1;
for j:=2 to i do
if a[j] > a[k] then k:=j ;
X:=a[k];
a[k]:=a[i];
a[i]:=x
end
end;

Слайд 177

Второй вариант сортировки выбором:
находим номер минимального значения в текущем списке;
производим обмен этого

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

Сортировка посредством простого выбора

Слайд 178

type vector=array[1..100] of integer;
procedure sort_choice2(var a: vector;n : integer) ;
var i,j,x,min:integer;
begin
for i:=1

type vector=array[1..100] of integer; procedure sort_choice2(var a: vector;n : integer) ; var
to n-1 do
begin
min:=i;
for j:=i+1 to n do
begin
if (a[j] < a[min]) then min:=j;
end;
x:=a[i];
a[i]:=a[min];
a[min]:=x;
end;
end;

Реализация второго варианта сортировки выбором

Слайд 179

Сравнение разных видов сортировки

Сравнение разных видов сортировки

Слайд 180

Применяются для поиска нужного элемента в массиве или выяснения факта его отсутствия.
Линейный

Применяются для поиска нужного элемента в массиве или выяснения факта его отсутствия.
поиск
Бинарный поиск

Методы поиска данных в массиве

Слайд 181

Линейный (последовательный) поиск
Самый простой из известных.
Множество элементов просматривается последовательно в некотором

Линейный (последовательный) поиск Самый простой из известных. Множество элементов просматривается последовательно в
порядке, гарантирующем, что будут просмотрены все элементы массива (например, слева направо).
Если в ходе просмотра множества будет найден искомый элемент, просмотр прекращается с положительным результатом; если же будет просмотрено все множество, а элемент не будет найден, алгоритм должен выдать отрицательный результат.
Именно так поступает человек, когда ищет что-то в неупорядоченном множестве. Например, при поиске нужной визитки в некотором неупорядоченном множестве визиток человек просто перебирает все визитки в поисках нужной.
i := 1;
while (i<=n) and (A[i]<>Key) do Inc(i);
if A[i]=Key then <элемент найден> else <элемент не найден>;

Методы поиска данных в массиве

Слайд 182

Линейный (последовательный) поиск
Удалению элемента всегда предшествует успешный поиск.
При удалении нам придется

Линейный (последовательный) поиск Удалению элемента всегда предшествует успешный поиск. При удалении нам
сначала найти положение удаляемого элемента, затем все элементы, следующие за ним, сдвинуть на одну позицию к началу массива и уменьшить n. То есть в любом случае надо пробежать весь массив от начала до конца:
i := 1;
while (i<=n)and(A[i]<>Key) do Inc(i); {поиск}
if A[i]=Key then
begin
while i begin
A[i] := A[i+1]; {сдвигаем}
Inc(i);
end;
Dec(n);
end;

Методы поиска данных в массиве

Слайд 183

Бинарный поиск
Этот метод поиска предполагает, что массив отсортирован.
Суть метода: Областью поиска (l,

Бинарный поиск Этот метод поиска предполагает, что массив отсортирован. Суть метода: Областью
r) назовем часть массива с индексами от l до r, в которой предположительно находится искомый элемент.
Сначала областью поиска будет часть массива (l, r), где l=1, а r=n, то есть вся заполненная элементами множества часть массива.
Теперь найдем индекс среднего элемента m=(l+r) div 2. Если Key>A[m], то можно утверждать (поскольку массив отсортирован), что если Key есть в массиве, то он находится в одном из элементов с индексами от m+l до r, следовательно, можно присвоить l=m+1, сократив область поиска. В противном случае можно положить r=m. На этом заканчивается первый шаг метода. Остальные шаги аналогичны.
На каждом шаге метода область поиска будет сокращаться вдвое. Как только l станет равно r, то есть область поиска сократится до одного элемента, можно будет проверить этот элемент на равенство искомому и сделать вывод о результате поиска.

Методы поиска данных в массиве

Слайд 184

Бинарный поиск

Методы поиска данных в массиве

Бинарный поиск Методы поиска данных в массиве

Слайд 185

Бинарный поиск
L := 1; R := N;
while L < R

Бинарный поиск L := 1; R := N; while L begin M
do
begin
M := (L + R) div 2;
if a[M] < x then L := M + 1 else R := M
end;
if a[R] = x then
write(' Номер i=', R, ' для элемента a[i]=x')
else
write('x не найден');

Методы поиска данных в массиве

Слайд 186

Бинарный поиск
Сравнение с линейным

Методы поиска данных в массиве

Бинарный поиск Сравнение с линейным Методы поиска данных в массиве

Слайд 187

Бинарный поиск
Сравнение с линейным. Лучший случай

Методы поиска данных в массиве

Бинарный поиск Сравнение с линейным. Лучший случай Методы поиска данных в массиве

Слайд 188

Бинарный поиск
Сравнение с линейным. Худший случай

Методы поиска данных в массиве

Бинарный поиск Сравнение с линейным. Худший случай Методы поиска данных в массиве

Слайд 189

Обработка событий мыши и клавиатуры на графическом окне

Обработка событий мыши и клавиатуры на графическом окне

Слайд 190

Обработка событий мыши и клавиатуры на графическом окне

Пример: Свободное рисование
uses GraphABC;
//процедура обработки

Обработка событий мыши и клавиатуры на графическом окне Пример: Свободное рисование uses
нажатия мыши
procedure MouseDown(x,y,mb: integer);
begin
MoveTo(x,y);
end;
//процедура обработки перемещения мыши
procedure MouseMove(x,y,mb: integer);
begin
if mb=1 then LineTo(x,y); //если нажата левая кнопка мыши
end;
begin
// Привязка обработчиков к событиям
OnMouseDown := MouseDown;
OnMouseMove := MouseMove
end.

Слайд 191

Обработка событий мыши и клавиатуры на графическом окне

Обработка событий мыши и клавиатуры на графическом окне