Основы алгоритмизации и программирования (лекции)

Содержание

1. Основы алгоритмизации

1.1 Этапы решения задач на ЭВМ
1.2 Алгоритм. Свойства алгоритмов
1.3 Алгоритмическая конструкция ветвления
1.4 Алгоритмическая конструкция цикла
1.5 Использование циклов с параметром для обработки массивов

2. Основные конструкции языка Паскаль

2.1 История создания языка
2.2 Интегрированная инструментальная оболочка (ИИО) Turbo Pascal (TP)
2.3 Алфавит и программа на TP 7.0
2.4 Простые типы данных

3. Управляющие конструкции языка ТП

3.1 Безусловные конструкции
3.2 Условные конструкции
3.3 Конструкция выбор
3.4 Циклические конструкции

4. Структурированные типы данных

4.1 Массивы
4.2 Сортировка массивов
4.3 Строковый тип данных
4.4 Множества
4.5 Записи

5. Процедуры и функции

5.1 Процедуры и функции
5.2 Функции пользователя
5.3 Процедуры пользователя
5.4 Использование функций в приближенных вычислениях
5.5 Использование процедур в приближенных вычислениях
5.6 Использование библиотек стандартных процедур в программах. Модуль Crt. Текстовые режимы использования экрана

6. Файлы

6.1 Файлы
6.2 Сортировка файлов

7. Объектно - ориентированное программирование

7.1 Тип объект
7.2 Инкапсуляция
7.3 Наследование
7.4 Полиморфизм

8. Язык программирования Си

8.1 История создания языка
8.2 Структура простой программы на языке Си
8.3 Представление данных в языке Си
8.4 Форматированный ввод/вывод
8.5 Операции, выражения и операторы
8.6 Директивы препроцессора
8.7 Реализация циклов в языке Си
8.8 Условные и безусловные переходы в языке Си
8.9 Использование массивов при реализации циклов

Модуль 1. Основы алгоритмизации

1.1 Этапы решения задач на ЭВМ.

Решение задачи разбивается на этапы:

Постановка задачи
Формализация (математическая постановка)
Выбор (или разработка) метода решения
Разработка алгоритма
Составление программы
Отладка программы
Вычисление и обработка результатов

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

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

Алгоритм - это определенным образом организованная последовательность действий, за конечное число шагов приводящая к решению задачи.
Свойства алгоритмов:

Определенность
Дискретность
Целенаправленность
Конечность
Массовость

Порядок выполнения алгоритма:

Действия в алгоритме выполняются в порядке их записи
Нельзя менять местами никакие два действия алгоритма
Нельзя не закончив одного действия переходить к следующему

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

Естественный язык (словесная запись)
Формулы
Псевдокод
Структурограммы
Синтаксические диаграммы
Графический (язык блок-схем)

Естественный язык:
если условие то действие1 иначе действие2
Структурограмма:

Синтаксическая диаграмма:

Графический язык:

Составление алгоритмов графическим способом подчиняется двум ГОСТам:

ГОСТ 19.002-80, соответствует международному стандарту ИСО 2636-73. Регламентирует правила составления блок-схем.
ГОСТ 19.003-80, соответствует международному стандарту ИСО 1028-73. Регламентирует использование графических примитивов.

Название | Символ (рисунок) | Выполняемая функция (пояснение)

1. Блок вычислений

Выполняет вычислительное действие или группу действий

2. Логический блок

Выбор направления выполнения алгоритма в зависимости от условия

3. Блоки ввода/вывода

Ввод или вывод данных вне зависимости от физического носителя

Вывод данных на печатающее устройство

4. Начало/конец (вход/выход)

Начало или конец программы, вход или выход в подпрограмму

5. Предопределенный процесс

Вычисления по стандартной или пользовательской подпрограмме

6. Блок модификации

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

7. Соединитель

Указание связи между прерванными линиями в пределах одной страницы

8. Межстраничный соединитель

Указание связи между частями схемы, расположенной на разных страницах

Правила построения блок-схем:

Блок-схема выстраивается в одном направлении либо сверху вниз, либо слева направо
Все повороты соединительных линий выполняются под углом 90 градусов

1.3. Алгоритмическая конструкция ветвления.

Ветвление - управляющая структура, организующая выполнение лишь одного из двух указанных действий в зависимости от справедливости некоторого условия.
Условие - вопрос, имеющий два варианта ответа: да или нет.
Запись ветвления выполняется в двух формах: полной и неполной.
Полная форма:

Неполная форма:

Пример: найти наименьшее из трех чисел.
1 вариант решения:

2 вариант решения:

1.4. Алгоритмическая конструкция цикла.

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

Цикл "пока":

Выполнение цикла "пока" начинается с проверки условия, поэтому такую разновидность циклов называют циклы с предусловием. Переход к выполнению действия осуществляется только в том случае, если условие выполняется, в противном случае происходит выход из цикла. Можно сказать что условие цикла "пока" - это условие входа в цикл. В частном случае может оказаться что действие не выполнялось ни разу. Условие цикла необходимо подобрать так, чтобы действия выполняемые в цикле привели к нарушению его истинности, иначе произойдет зацикливание.
Зацикливание - бесконечное повторение выполняемых действий.
Цикл "до":

Исполнение цикла начинается с выполнения действия. Таким образом тело цикла будет реализовано хотя бы один раз. После этого происходит проверка условия. Поэтому цикл "до" называют циклом с постусловием. Если условие не выполняется, то происходит возврат к выполнению действий. Если условие истинно, то осуществляется выход из цикла. Таким образом условие цикла "до" - это условие выхода. Для предотвращения зацикливания необходимо предусмотреть действия, приводящие к истинности условия.
Цикл с параметром, или цикл со счетчиком, или арифметический цикл - это цикл с заранее известным числом повторов.

В блоке модификации указывается закон изменения переменной параметра.
Xo - начальное значение параметра
h - шаг
Xn - последнее значение параметра
Для создания циклов с параметром необходимо использовать правила:

Параметр цикла, его начальное и конечное значения и шаг должны быть одного типа
Запрещено изменять в теле цикла значения начальное, текущее и конечное для параметра
Запрещено входить в цикл минуя блок модификации
Если начальное значение больше конечного, то шаг - число отрицательное
После выхода из цикла значение переменной параметра неопределенно и не может использоваться в дальнейших вычислениях
Из цикла можно выйти не закончив его, тогда переменная параметр сохраняет свое последнее значение

1.5. Использование циклов с параметром для обработки массивов.

Массив - упорядоченная структура, предназначенная для хранения однотипных данных.
Упорядочение элементов в массиве происходит по их индексам.
Индекс - порядковый номер элемента.
Массив задается именем (заглавные латинские буквы), типом данных и размерностью.
Размерность - максимально возможное количество элементов в массиве. В один момент времени можно обратиться только к одному элементу массива. Для этого указывается имя массива и в скобках индекс элемента.
Массивы делятся на одномерные (линейные) и двумерные.
Прообразом в математике для одномерного массива является вектор. Для двумерного - матрица.
Пример: вычислить n!

Пример: вычислить an

Пример: ввести элементы массива:
а)одномерного, размерности 10

б)двумерного, 5x5

Модуль 2. Основные конструкции языка Паскаль

2.1. История создания языка.

Первая версия языка Паскаль была разработана в 1968 году. Ее разработчиком является швейцарский ученый Никлаус Вирт. Свое название язык получил в честь создателя первой механической вычислительной машины француза Блеза Паскаля. На основе языка Паскаль в 1985 г. фирма Borland выпустила версию Turbo Pascal версии 3.0. С этого времени язык Паскаль используется во всем мире в учебных заведениях в качестве первого изучаемого языка программирования.
В пакете Turbo Pascal 4.0 были устранены ошибки и ограничения компилятора предыдущей версии. Наиболее важным нововведением была unit-концепция, позаимствованная из языка МОДУЛА-2. Это позволило разрабатывать крупные программные продукты. В версии 5.0 появился интегрированный отладчик. Был реализован аппарат перекрытий overlays. В этой версии были исправлены и улучшены библиотеки графических процедур, которым была обеспечена совместимость с графическими адаптерами класса VGA. Появились новые возможности справочной системы Help.
В версии 6.0 была реализована концепция объектно-ориентированного программирования с полным набором прикладных задач для пользователя. В оболочку был встроен интегрированный текстовый редактор. В этой версии впервые использовалась мышь для управления работой.
В 1992 г. появилась последняя на сегодняшний день версия языка Turbo Pascal - 7.0. В ней сохранились все достоинства предыдущих версий:

многооконный режим работы
возможность использования мыши
возможность использования Ассемблера
возможность создавать объектно-ориентированные программы

К улучшениям этой версии относятся:

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

2.2. Интегрированная инструментальная оболочка (ИИО) Turbo Pascal (TP).

При инсталляции программа устанавливается в директорию C:\TP. Нормальный режим работы программы обеспечивается при размещении файлов программы в директории C:\TP\BIN. В этом случае инструментальная оболочка доступна из любой директории пользователя. Запуск программы на выполнение осуществляется файлом turbo.exe. В ОС Windows этот файл расположен в основной директории C:\TP\BIN. В ОС DOS файл активизируется командой turbo. После запуска программы на экране появляется фирменная заставка с указанием фирмы изготовителя, индекса и года издания данной версии. После заставки открывается основной экран программы. Он состоит из трех различающихся по функциональному назначению частей:

Строка меню
Рабочая зона
Строка состояния

Строка меню содержит команды File, Edit (основные команды редактирования текста), Search (осуществляет поиск фрагментов текста; при необходимости производит замену на новые), Run (команды, запускающие программу или ее часть на выполнение), Compile (осуществляет компиляцию программы, которая находится в рабочей зоне), Debug (содержит команды поиска ошибок), Tools (позволяет запустить некоторые программы не выходя из оболочки Turbo), Options (позволяет установить параметры компилятора и инструментальной оболочки), Windows (содержит команды по работе с окнами), Help (Справка).
Для обращения к строке меню, т.е. ее активизации используются:

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

Другой способ обращения к команде - это одновременное нажатие клавиш Alt+'литера'. При открытии диалогового окна, перемещение по нему осуществляется кнопкой Tab. Закрыть диалоговое окно можно нажатием клавиши Esc.
В рабочую зону ТП 7.0 помещаются окна файлов. В один момент времени доступным или активным может быть только одно окно файла. Оно расположено поверх остальных. Окна файлов могут располагаться несколькими способами. Работа с ними производится из меню Window. Каждое окно снабжено рамкой. Левый верхний угол содержит кнопку закрыть окно. Верхний правый угол содержит кнопку развернуть окно. Верхняя часть рамки содержит имя и директорию файла.
Строка состояния содержит краткий список горячих клавиш, необходимых для использования в текущем режиме.
Перед первым использованием интегрированной инструментальной оболочки (ИИО) необходимо проверить ее настройку и, в случае необходимости, изменить настройки. Выполняется это из соответствующего меню (Options). Здесь необходимо проверить установку команды Desktop. Ее установка гарантирует сохранение ваших установок конфигурации ИИО. Сохранение установок происходит в файл turbo.tp. За размещение этого файла в основной директории отвечает специальная команда. Для того, чтобы выполненные настройки сохранились, в меню Options выполняется команда Save turbo.tp

2.3. Алфавит и программа на TP 7.0.

Алфавит языка состоит из нескольких разделов:

Латинские буквы: A a B b…
Цифры: 0 1 2..9
Знаки математических операций: + - * /
Знаки математических отношений: < > =
Знаки препинания: . , : ;
Специальные знаки: { } [ ] ( ) $ ^

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

Заголовок
Раздел меток
Раздел констант
Раздел типов
Раздел переменных
Раздел процедур и функций
Раздел операторов

Все программы обязательно имеют раздел заголовок и раздел операторов. Остальные составляющие могут отсутствовать. При отсутствии некоторых частей программы общий порядок их следования сохраняется.
Разделы между собой разделяются знаком ";"
Раздел операторов заключается в операторные скобки. Это зарезервированные слова begin, end. Раздел операторов заканчивается точкой. Запись внутри операторных скобок ведется с отступом в три знака.
Раздел "заголовок" начинается с зарезервированного слова, за которым указывается имя программы. В качестве имени может использоваться любой набор символов алфавита с несколькими исключениями:

Нельзя использовать зарезервированные слова
Нельзя начинать имя с цифры
При использовании имени не используется пробел

2.4. Простые типы данных.

Любые данные ТП характеризуются своими типами. Тип определяет:

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

Тип переменной определяется при ее декларации. Одна из базовых концепций Паскаля заключается в жесткой проверке соответствия типов в операциях присваивания.
Типы данных в языке ТП делятся на 5 основных классов:

Простые типы
Структурированные типы
Ссылочные типы
Процедурные типы
Объектные типы

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

Все возможные значения данного порядкового типа представляют собой упорядоченное множество и каждое возможное значение связано с порядковым номером, который является целым числом
Значения любого порядкового типа, за исключением целочисленного начинается с порядкового номера ноль (следующий порядковый номер 1, 2, 3…)
Порядковым номером значения целочисленного типа является само значение
В любом порядковом типе каждому значению кроме первого есть предыдущее и каждому значению кроме последнего есть последующее

К данным любого порядкового типа можно применить любую из пяти операций:

Стандартная операция Ord возвращает порядковый номер указанного значения. Значение указывается в скобках
Стандартная операция Pred возвращает значение, предшествующее указанному, если эта функция применяется к первому значению данного типа, то выдается сообщение об ошибке
Стандартная операция Succ возвращает следующее значение за указанным, если операция применяется к последнему элементу типа, то выдается сообщение об ошибке
Стандартная операция Low возвращает наименьшее значение в диапазоне порядкового типа, указанного данного
Стандартная операция High возвращает наибольшее значение в диапазоне порядкового типа, указанного данного

В TP имеется 5 предопределенных, целочисленных типов. Каждый тип обозначает определенное подмножество целых чисел:

Тип | Диапазон | Формат
Короткое целое shortint | -128..127 | 8 бит со знаком
Целое integer | -32768..32767 | 16 бит со знаком
Длинное целое longint | -2147483648..2147483647 | 32 бита со знаком
Длиной в байт byte | 0..255 | 8 бит без знака
Длиной в слово word | 0..65535 | 16 бит без знака

Верхнее граничное значение и нижнее граничное значение целочисленных типов задаются как константы и имеют соответствующее имя.
В тексте программы данные целочисленных типов записываются в десятичном или шестнадцатеричном формате и не должны содержать десятичные точки.
Пример:
1 - целый тип
1.0 - не целый тип
100 - десятичный формат (100)
#100 - шестнадцатеричный формат (256)
Над целочисленными данными возможно выполнение операций сложения, вычитания и умножения, а также операций сравнения. Арифметические действия над операндами целочисленного типа предполагают восьмибитовую, 16-битовую или 32-битовую точность вычислений, в соответствии со следующими правилами:

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

К логическим типам относятся данные типов Boolean, ByteBool, WordBool, LongBool.
Значением каждого данного логического типа могут являться 2 значения: TRUE (1) и FALSE (0).
Для данных логического типа применимы только две операции сравнения: равно и не равно.
Переменные типа Boolean и ByteBool занимают один байт; переменная WordBool - 2 байта; LongBool - 4 байта.
Boolean - это предпочтительный тип, использующий меньше памяти. Остальные типы обеспечивают совместимость с другими языками и средой Windows.
Предполагается, что тип Boolean имеет порядковые значения 0 и 1, а другие типы могут иметь другие порядковые значения. Когда выражение типа ByteBool, WordBool или LongBool равно 1, то его значение истинно, когда 0 - ложь; любое другое значение преобразуется к единице и считается истинным.
Символьный тип (char) представляет собой тип данных, предназначенный для хранения одного символа (буквы, знака или кода). В переменную этого типа может быть помещен любой из 256 символов расширенного кода ASCII.
Переменная типа char занимает один байт памяти. Значения типа char задаются в апострофах. Кроме того можно задавать значения используя код из таблицы ASCII. Над данными символьного типа можно выполнять операции сравнения.
Перечисляемый тип определяется как упорядоченный набор идентификаторов, заданный путем их перечисления. При этом список идентификаторов разделенных запятой указывается в круглых скобках. Задается перечисляемый тип в разделе type.
Пример:
type A=(2, 4, 1, 7);
B=('c', 'L', '3', '|');
Значения переменных перечисляемого типа не могут вводиться с клавиатуры и выводиться на экран.
Интервальный тип данных определяется посредством задания подмножества значений одного из ранее определенных типов. Можно использовать все простые типы, за исключением вещественного. При задании диапазона указывается наименьшее и наибольшее значения, разделенные двумя точками. При этом оба значения обязательно одного типа.
К вещественному типу относится подмножество вещественных чисел, представленных в формате с плавающей точкой и фиксированным числом цифр.
В ТП имеется 5 видов вещественных типов:

Тип | Диапазон | Точность | Формат
Real (вещественное) | 2.9*10-39..1.7*1038 | 11-12 знаков | 6 байт
Single (с одинарной точностью) | 1.5*10-45..3.4*1038 | 7-8 знаков | 4 байта
Double (с двойной точностью) | 5.0*10-324..1.7*10308 | 15-16 знаков | 8 байт
Extended (с повышенной точностью) | 3.4*10-4932..1.1*104932 | 19-20 знаков | 10 байт
Comp (сложное) | -9.2*1018..9.2*1018 | 19-20 знаков | 8 байт

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

2.5. Константы, переменные и оператор присваивания.

Константа - это идентификатор отмечающий значение, которое не может изменяться. Идентификатор константы не может быть включен в свое собственное описание. Константы должны объявляться в декларационной части программы до момента их использования в вычислениях. Эта декларационная часть начинается с зарезервированного слова const. При декларации указывается имя константы, символ равенства и значение этой константы. В ТП применяется 5 видов констант простых типов:

Целочисленные константы. В качестве значений может использоваться любое целочисленное данное в десятичном или шестнадцатеричном формате (year=2003)
Вещественные константы определяются числами, записанными в десятичном формате данных (time=0.2e+4, yyy=304.0)
Символьные константы могут быть определены только посредством символов таблицы ASCII. При этом сам символ заключается в апострофы (var1='A')
Строковые константы определяются произвольной последовательностью символов, заключенных в апострофы (stroke='IBM')
Типизированные константы (переменные с начальным значением) . Каждой типизированной константе ставится в соответствие имя, тип, начальное значение (year1:integer =1995)

Переменной называется элемент программы, который предназначен для хранения, коррекции и передачи данных внутри программы.
Раздел описания переменных начинается с зарезервированного слова var.
Для объявления переменной необходимо указать имя переменной и ее тип. Однотипные переменные могут перечисляться через запятую перед указанием их типа.
Пример:
a: integer;
b: boolean;
c, b: real;
e: integer;
Все переменные делятся на глобальные и локальные. Глобальными являются переменные, объявленные вне процедур и функций, а локальными - объявленные внутри процедур и функций.
ТП накладывает ряд ограничений на использование переменных:

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

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

Имя функции | Математическое значение | Тип результата
a mod b | Остаток деления a на b | Целое
a div b | Целая часть деления a на b | Целое
abs (a) | |a| | Совпадает с типом аргумента
sqr (a) | a2 | Совпадает с типом аргумента
sqrt (a) | | Вещественное
sin (a) | sin a | Вещественное
cos (a) | cos a | Вещественное
arctan (a) | arctg a | Вещественное
ln (a) | ln a | Вещественное
exp (a) | ea | Вещественное

При составлении сложных выражений осуществляется приоритет выполнения операций:

not, @
*, /, div, mod, and, shl, shr
+, -, or, xor
=, <>, <=, >=, >, <, in

2.6. Операторы ввода/вывода.

ТП содержит четыре оператора ввода/вывода: read, readln, write, writeln.
Оператор read осуществляет ввод данных с клавиатуры и размещение их в стандартном файле ввода input. Вводимые данные размещаются в качестве значений переменных, имена которых перечислены в круглых скобках за оператором read.
read (a, b, c);
Вводятся данные тоже списком, в котором они разделяются пробелом. Ввод заканчивается нажатием Enter. Курсор, отмечающий позицию следующего ввода/вывода остается за последним введенным данным.
Оператор readln выполняет аналогичные действия и переводит курсор на следующую строку.
Оператор write осуществляет вывод на экран или печатающее устройство с одновременным размещением в стандартном файле вывода output. Оператор может выводить сообщение или значение переменной. Сообщения записываются в апострофах. Для вывода значения переменной указывается имя переменной. Сообщения и переменные можно чередовать в одном списке, разделяя их запятыми. Курсор остается за последним выведенным данным.
Оператор writeln выполняет аналогичные действия и переводит курсор на следующую строку.
Операторы write и writeln допускают т.н. форматированный вывод данных.
write (a:5:2);
Первое из чисел указывает сколько экранных знаков отводится под вывод. Второе число указывает количество знаков после запятой в числе и может отсутствовать.

Модуль 3. Управляющие конструкции языка ТП

3.1. Безусловные конструкции.

Оператор языка представляет собой неделимый элемент программы, который позволяет выполнять определенные алгоритмические действия. Все операторы можно условно разделить на две группы: простых операторов и структурированных операторов. К простым относятся те операторы, которые не содержат других операторов. К структурированным - те, которые состоят из других операторов.
В ТП 7.0 существует всего один оператор безусловного перехода Goto и четыре безусловных функции: Break, Continue, Exit, Halt.
Оператор безусловного перехода Goto представляет собой простой оператор, используя который можно изменять порядок выполнения операторов в программе. Общий вид оператора безусловного перехода:
goto <метка> , где <метка> - это идентификатор или целое число от 0 до 9999, объявленное в разделе меток label.
Применение оператора безусловного перехода в ТП - программе является нежелательным, т.к. его присутствие нарушает структурную целостность и наглядность. Такую программу трудно читать, отлаживать и модифицировать.
Функция Break позволяет досрочно закончить цикл.
Функция Continue - позволяет начать новую итерацию цикла, даже если предыдущая не была завершена.
Функция Exit - позволяет завершить работу текущего программного блока.
Функция Halt (n), где n - некоторое целое число - позволяет завершить работу программы с кодом завершения n.

3.2. Условные конструкции.

1) неполная форма с одним оператором

2) полная форма с одним оператором

3) неполная форма с несколькими операторами

4) полная форма с несколькими операторами

1) IF условие THEN оператор;
2) IF условие THEN оператор1 ELSE оператор2;
3) IF условие THEN BEGIN
оператор1;
оператор2;
…
операторN;
END;
4) IF условие THEN BEGIN
оператор1;
оператор2;
…
операторN;
END ELSE
BEGIN
оператор1;
оператор2;
…
операторN;
END;

Пример: ввести оценку студента в баллах и сообщить ее название.

Begin
Read(b)
If b=5 then Write('отлично') else
If b=4 then Write('хорошо') else
If b=3 then Write('удовл.') else
If b=2 then Write('неудовл.') else
Write('это не оценка');
End.

3.3. Конструкция выбор.

Ситуации, реализующие систему вложенных ветвлений могут быть разрешены с использованием конструкции выбор.
Оператор выбора является структурированным и использует в своей записи операторы case, of, else, end и операторные скобки по необходимости.
В самом общем виде оператор выбора можно записать так:
Case порядковая переменная of
значение1: begin оператор1; оператор2; …; операторN; end;
значение2: begin оператор1; оператор2; …; операторN; end;
…
значениеM: begin оператор1; оператор2; …; операторN; end;
else begin оператор1; оператор2; …; операторN; end;
end;

Пример: ввести оценку студента в баллах и сообщить ее название.
Begin
Read(b)
Case b of
5: Write('отлично');
4: Write('хорошо');
3: Write('удовл.');
2: Write('неудовл.');
else Write('это не оценка');
end;
End.

Порядковая переменная, значение которой при выполнении программы определяет ветвь в операторе выбора, подлежащую выполнению, может принадлежать любому целочисленному типу. В случае, когда для нескольких значений выполняемые действия одинаковы, их можно указать один раз, а сами значения перечислить через запятую.
Пример: напечатать количество дней во введенном месяце:
Begin
Read(m);
Case m of
янв, мар, май, июл, авг, окт, дек: Write('31');
апр, июн, сен, ноя: Write('30');
фев: Write('28');
else Write ('это не месяц');
end;
End.

3.4. Циклические конструкции.

1. Цикл с предусловием.
Для реализации циклов с предусловием используется составной оператор, включающий оператор while, do, операторные скобки.
В общем виде цикл реализуется записью:
while <условие> do <действие>;
Если тело цикла содержит более одного действия, то необходимо использовать операторные скобки:
while <условие> do
begin
<оператор 1>;
<оператор 2>;
...
<оператор n>;
end;

2. Цикл с постусловием.
Для реализации цикла используется составной оператор, состоящий из операторов repeat и until.
В общем виде цикл записывается так:
repeat
<действие>;
until <условие>;

Пример: задано целое число. Вывести на печать все цифры введенного числа.
1 способ:

var a,b:longint;
Begin
read(a);
repeat
b:=a mod 10;
writeln(b);
a:=a div 10;
until a=0;
End.

2 способ:

var a,b:longint;
Begin
read(a);
while a<>0 do
begin
b:=a mod 10;
write(b:3);
a:=a div 10;
end;
End.

3. Цикл с параметром.

Для реализации в языке Pascal используется составной оператор, состоящий из операторов for, to, downto, do и при необходимости из операторных скобок. Переменная параметр обязательно объявляется в декларационной части программы и может принадлежать одному из порядковых типов.
Если при изменении переменной параметра необходимо использовать переход к следующему значению, то используется оператор to; если переход необходимо осуществить к предыдущему значению, то используется оператор downto. Тогда в общем виде цикл записывается так:
for I:=I0 to In do
begin
<оператор 1>;
<оператор 2>;
...
<оператор n>;
end;

Модуль 4. Структурированные типы данных

Традиционно к структурированным типам данных в языке Pascal относят массивы, множества и записи. Иногда структурированным считают строковый тип. На самом деле строки занимают промежуточное положение между простыми и структурированными типами, но т.к. большинство их свойств реализуются как свойства сложных данных, то строки рассматриваются как структурированный тип.

4.1. Массивы.

Объявление переменной массива происходит в разделе var. При этом используется зарезервированное слово array, указывается тип массива и его размерность перечислением индексов, а также объявляется тип данных в массиве.
Пример 1:

Пример 2:
var masiv: array ['a'..'z'] of integer;
Для обращения к элементу массива в Pascal-программе указывается имя массива и в квадратных скобках индексы элемента.
Пример 1:
a [2,4]
а) ввести значение:
read (A[2,4]);
б) изменить значение:
A[2,4]:=5;
в) сообщить значение:
write (A[2,4]);

Пример 2:
masiv ['b'];
masiv['b']:=47*24;

Задача ввода элементов массива.
а) линейного:

program vvod;
var A: array [1..10] of integer;
i:integer;
begin
for i:=1 to 10 do
read (A[i]);
end.

б) двумерного:

program vvod;
const n=5; m=7;
var A: array [1..n,1..m] of real;
i,j: integer;
begin
for i:=1 to n do
for j:=1 to m do
read (A[i,j]);
end.

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

program min;
const n=10;
var i: byte;
a: array [1..n] of real;
min: real;
begin
for i:=1 to n do read (A[i]);
min:=A[1];
for i:=1 to n do
if min>A[i] then min:=A[i];
write (min);
end.

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

Сортировкой называется процесс расположения элементов массива в порядке убывания (возрастания) из значений.
Пример :

Алгоритм выполнения сортировки называется методом сортировки. К наиболее распространенным методам относятся:

Простым выбором
Простой перестановкой
Пузырьковый метод

На каждом шаге находится минимальный (максимальный) неотсортированной части. Он меняется с первым элементом в неотсортированной части, после чего отсортированная часть увеличивается на один элемент. На первом шаге весь массив считается неотсортированным. Сортировка заканчивается за (n-1) шаг.
Пример: 241795

1 шаг: 1 | 42795
2 шаг: 12 | 4795
3 шаг: 124 | 795
4 шаг: 1245 | 97
5 шаг: 124579

На каждом шаге массив делится на отсортированную и неотсортированную части. Первый элемент из неотсортированной части сравнивается с каждым элементом отсортированной части, начиная с последнего. Если найден элемент, больший сравниваемого, то они меняются местами. Шаг закончен когда просмотрены все отсортированные элементы. Сортировка закончена когда просмотрены все неосортированные элементы. На первом шаге отсортироованным считается первый элемент.
Пример: 2 | 41795

1 шаг: 24 | 1795
2 шаг: 21 | 4795
124 | 795
3 шаг: 1247 | 95
4 шаг: 12479 | 5
124759
124579

На каждом шаге сравниваются все соседние элементы. В случае необходимости они меняются местами. Сортировка считается законченной за nn действий или на шаге, когда не выполнено ни одной перестановки.
Пример: 241795

1 шаг: 214795   true
2 шаг: 124579   true
3 шаг: 124579   false

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

Переменная типа строка предназначена для обработки цепочек символов. Каждый символ является элементом типа char. Строки могут вводиться с помощью стандартных операторов read/readln и выводиться стандартными операторами write/writeln.
Объявляются переменные типа строка в разделе var. При объявлении указываются идентификатор переменной, зарезервированное слово string и, в квадратных скобках, целое число - максимально возможная длина строки. Наибольшая длина строки составляет 256 символов. Если переменная имеет значение с максимальной длиной строки, то при объявлении переменной ограничиваются зарезервированным словом.
Пример:
var
identificator_1: string;
identificator_2: string[20];
identificator_3: string[255];
Значение строкового типа также как и значение типа char при записи внутри программы заключаются в апострофы.
Пример:
identificator_1:='это - компьютер';
identificator_1[1]:='э';
Простейшая операция которую Pascal позволяет выполнить со строками - это операция конкатенации, или сцепления, или объединения строк в операторе присваивания. Операция записывается с помощью знака "+".
Пример:
identificator_1:='это' + '-' + 'компьютер';

Для обработки строковых данных используется ряд встроенных функций:
1) Length (L) - определяет длину строки, являющуюся значением переменной L. Значение, возвращаемое этой функцией является целочисленным и отображает реальную длину строки, т.е. может не совпадать со значением длины строки, объявленным при декларации.
Пример 1:
var
L: string[15];
A: byte;
Begin
L:='Урок';
A:=length(L);
Write(A);
End.

Пример 2:
Begin
write(length('Урок'));
End.
2) Upcase (C) - преобразует любой символ в прописной. Переменная C может иметь значение типа char, либо являться одним элементом из строки. Русские символы обрабатываться этой функцией не могут.
3) Copy (L, A, B) - позволяет копировать фрагмент строки являющейся значением переменной L, начиная с позиции A в количестве B, где A и B - целые числа, причем значение A не превышает длины строки L, а значение B не превышает (длина строки L - A). Если эти правила нарушены, то ошибки компиляции не произойдет, но возможно совершение логической ошибки в программе.
4) Pos (L, M) - возвращает результат целочисленного типа, являющийся номером позиции, с которой строка L входит в строку M. Если строки L нет в строке M, то результат - 0.
5) Insert (L, M, A) - вставляет строку L в строку M, начиная с позиции с номером A. Фактически, вставка производится перед указанной позицией.
6) Delete (L, A, B) - удаляет из строки L B символов, начиная с позиции A.
Если номера позиций в функциях Insert и Delete не соответствуют длине рассматриваемых строк, то произойдет ошибка компиляции.
Пример 1: переставить буквы введенного слова в противоположном порядке. Например, ввели "урок", получили - "кору":

Пример 2: изменить введенное значение строковой переменной на слово, записанное теми же символами, но в обратном порядке. Новую переменную не использовать:

Пример 3: сравнение слов в Pascal.

Program slovo;
Var
word1, word2: string[60];
Begin
readln(word1);
readln(word2);
if word1 > word2 then writeln ('>')
else begin
if word1 = word2 then writeln ('=')
else writeln ('<');
End.

4.4. Множества.

Множеством называется упорядоченная совокупность данных одного типа, записанных без повторений и отсортированных по возрастанию. Максимальное множество состоит из 256 элементов. Для объявления множеств используется зарезервированное слово set, за которым указывается тип элемента множества или сами элементы.
Пример:
type A: 5..9;
var
B: set of A;
C: set of char;
D: set of '1'..'5';
Внутри программы элементы множества записываются в квадратных скобках. Для перечисления используется интервальный, перечисляемый типы или их комбинации.
Пример: e:['A'..'Q', 'T', 'x'..'z']
Элементы множеств нельзя вводить с клавиатуры и выводить стандартными операторами, т.к. элементы множества относятся к перечисляемому типу.
Над множествами можно выполнять следующие операции:

Объединение (+). Результатом будет множество, состоящее из всех элементов первого и второго множеств без повтора:
Пример:
[1..3, 6, 9..11] + [2..4, 7, 10..12] = [1, 2, 3, 4, 6, 7, 9, 10, 11, 12] = [1..4, 6, 7, 9..12]
Пересечение (*). Результатом будет множество, состоящее из тех элементов, которые присутствуют как в первом, так и во втором множествах.
Пример:
[1..3, 6, 9..11] * [2..4, 7, 10..12] = [2, 3, 10, 11]
Разность двух множеств (-). Результатом будет множество, состоящее из тех элементов первого множества, которых нет во втором.
Пример:
[1..3, 6, 9..11] - [2..4, 7, 10..12] = [1, 6, 9]
Операция in - проверяет принадлежность элемента множеству. Результатом операции будет логическое значение (true или false).
Пример:
[2] in [1..4] (true)
[7] in [1..7] (false)
Сравнение. Равными называются множества, состоящие из одинаковых элементов. Большим будет множество, у которого больше элементов. Из двух множеств с равным количеством элементов большим будет то, первое несовпадающее значение которого больше.

Пример: из введенной последовательности символов, признаком конца которой является '0', сформировать множество заглавных и строчных латинских букв.
var
c: char;
a, pl: set of 'A'..'Z';
b, sl: set of 'a'..'z';
i: char;
Begin
pl:= [0];
sl:= [0];
repeat
read(c);
if [c] in a then pl:=pl+[c];
if [c] in b then sl:=sl+[c];
until [c]='0';
for i:='A' to 'Z' do
if [i] in pl then write(i:3);
for i:='a' to 'z' do
if [i] in sl then write(i:3);
End.

4.5. Записи.

Пример:

Для реализации объединения данных разного типа в языке Pascal существует специальная структура - запись. Объявление записи начинается с зарезервированного слова record, за которым перечисляются имена и типы всех составляющих записей ее полей. Заканчивается объявление скобкой end.
Пример:
type
karta = record
family: string[20];
name: string[15];
age: integer;
end;
При обращении к записи в программе указывается имя записи и через точку имя поля.
Пример:
karta.family:='Иванов';
karta.name:='Иван';
karta.age:=20;
Для упрощения обращения к записи может быть использован оператор работы со структурой with.
Пример:
with karta do
begin
family:='Иванов';
name:='Иван';
age:=20;
end;
Полями записи наряду с простыми типами могут быть и данные структурированных типов, например, массивы или записи.
Пример 1:
var z: record
pole1: string;
pole2: array [1..10] of byte;
end;
Begin
for i:=1 to 10 do
read (z.pole2[i]);
End.

Пример 2: объявите запись, содержащую сведения о фамилии, дате рождения и адресе студента.
var student: record
fam: string[15];
data: record
day: 1..31;
mes: 1..12;
year: integer;
end;
adres: record
street: string[15];
dom: byte;
kvart: byte;
end;
end;
Begin
with student do
begin
fam:= 'Иванов';
with data do
begin
day:= 30;
mes:= 4;
year:= 1987;
end;
with adres do
begin
street:= 'Туполева';
dom:= 22;
kvart:= 154;
end;
end;
End.
Для использования в программе набора с одинаковыми полями используются массивы записей.
Пример: объявить массив из десяти записей.
1 вариант решения:
var A: array [1..10] of record
fam: string;
name: string;
end;
2 вариант решения:
type student = record
fam: string;
name: string;
end;
var A: array [1..10] of student;

Модуль 5. Процедуры и функции

5.1. Процедуры и функции.

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

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

5.2. Функции пользователя.

Работа с функцией в Паскаль-программе состоит из двух частей: объявление функции и обращение к функции. Объявление функции производится в специальном разделе декларационной части Паскаль-программы непосредственно перед разделом операторов. Начинается объявление с заголовка функции. В общем виде заголовок имеет следующие разделы:
function <имя функции> (<список параметров>): <тип возвращаемого результата>, где function - зарезервированное слово.
В качестве имени функции может использоваться любой допустимый идентификатор.
Список параметров содержит перечисление всех формальных аргументов с указанием их типа. Однотипные аргумент можно перечислить списком.
Тип возвращаемого результата - один из стандартных типов языка Паскаль.
Пример:
function factorial (n:integer):real;
function mm (a, b:real; c:byte; d:char):integer;
При обращении к функции из раздела операторов Паскаль-программы указывается имя функции и список фактических параметров.
Обращение к функциям возможно из оператора вывода.
В качестве фактических параметров могут использоваться как значения, так и ссылки на другие переменные. В любом случае количество фактических и формальных параметров одинаково и передача значений происходит в порядке записи.
Пример:
F:=factorial(5);
T:=factorial(2)-7;
M:=factorial(n);
P:=mm(d,c,b,a);

Задача 1: вычислить факториалы первых 10 натуральных чисел:
var i: byte;
f: real;
function factorial (n: byte): real;
var i: byte;
f: real;
begin
f:=1;
for i:=1 to n do
f:=f * i;
factorial:=f;
end;
begin
for i:=1 to 10 do
begin
f:=factorial(i);
writeln(f);
end;
end.

Задача 2: вычислить 10 натуральных степеней для каждого из первых 10 натуральных чисел:
var i, j : byte;
p: real;
function stepen (b: integer; n: byte): real;
var i: byte;
a: real;
begin
a:=1;
for i:=1 to n do
a:=a * b;
stepen:=a;
end;
begin
for i:=1 to 10 do
for j:=1 to 10 do
begin
p:=stepen (i, j);
write (p);
end;
end.

5.3. Процедуры пользователя.

Функции являются частным случаем, т.е. подвидом процедур. Следовательно, все свойства функций справедливы для процедур.
Объявляются процедуры в описательной части программы, в одном разделе с функциями. Порядок объявления независимых друг от друга процедур и функций не важен, если процедура использует в себе обращение к функции или другой процедуре, то последнии обязательно объявляются раньше.
Объявление процедур начинается с заголовка:
procedure <имя процедуры> (<список параметров>);, где procedure - зарезервированное слово.
Список параметров процедур содержит формальные параметры двух видов. Те, значения которых не возвращаются в программу, и параметры с возвращаемыми значениями.
Последние в списке отмечаются зарезервированным словом var.
Пример:
procedure xxx(a: byte; var b: byte; c,d: real; var j: char);
Для обращения к процедуре в тексте программы указывается имя процедуры и, в скобках, список фактических параметров. В этом списке параметрам с возвращаемыми значениями обязательно соответствуют переменные.
Пример:
xxx (5, b, c, 8, i);

Задача 1: вычислить факториалы первых 10 натуральных чисел:
var i: byte;
f: real;
procedure factorial (n: byte; var f: real);
var i: byte;
begin
f:=1;
for i:=1 to n do
f:=f * i;
end;
begin
for i:=1 to 10 do
begin
factorial(i, f);
writeln(f);
end;
end.

Задача 2: вычислить 10 натуральных степеней для каждого из первых 10 натуральных чисел:
var i, j : byte;
p: real;
procedure stepen (b: integer; n: byte; var f: real);
var i: byte;
begin
f:=1;
for i:=1 to n do
f:=f * b;
stepen:=a;
end;
begin
for i:=1 to 10 do
for j:=1 to 10 do
begin
stepen (i, j, p);
write (p);
end;
end.

5.4. Использование функций в приближенных вычислениях.

Числовым рядом называется выражение вида U1+U2+…+Un+…, где U1, U2,…, Un - элементы ряда. Этот ряд можно записать в виде
Сумма Sn=U1+U2+…+Un называется n-ой частной суммой ряда.
Сумма U1(x)+U2(x)+…+Un(x)+…, в которой каждый элемент Un(x) является функцией аргумента x, называется функциональной.
Степенным называется функциональный ряд вида a0+a1x+a2x2+…+anxn+…, где a0, a1, a2,…,an,… - постоянные числа, называемые коэффициентами ряда.
Степенной ряд называется рядом Тейлора.

5.5. Использование процедур в приближенных вычислениях.

Пусть требуется вычислить

Значение равно площади криволинейной трапеции ACDB, сторона CD которой является частью графика функции f (x).

1 способ: преобразуем криволинейную трапецию в обычную, заменив сторону CD отрезком.

|

2 способ: заменим сторону CD криволинейной трапеции на отрезок, параллельный стороне AB и проходящий через одну из вершин C или D.

3 способ: восстановим в середине отрезка AB перпендикуляр до пересечения с графиком функции f(x). Проведем через найденную точку отрезок, параллельный AB.

Для нахождения приближенного значения определенного интеграла разобъем отрезок AB на две равные части (величину 2 обозначим через n). В середине каждого отрезка восстановим перпендикуляры и построим соответствующие прямоугольники. Вычислим площадь S1.

Т.к. выполнив вычисления один раз не возможно оценить их точность, то продолжим разбиение отрезка AB (n=4).

После проведенных вычислений можно оценить полученную точность, которая равна |S1-S2|. Если точность оказывается достаточной, то последнее вычисленное значение S2 будет считаться значением определенного интеграла. Если точность не достаточна, то последнее разбиение считается начальным, т.е. S1=S2 и количество разбиений увеличивается вдвое, т.е. n=2*n.

5.6. Использование библиотек стандартных процедур в программах. Модуль Crt. Текстовые режимы использования экрана.

Язык программирования Паскаль содержит ряд предопределенных процедур, разделенных по темам на несколько библиотек (модулей). Файлы с библиотеками процедур имеют расширение tpu и хранятся в папке units основной директории tp.
Подключение библиотек к программе производится сразу за заголовком программы. Для этого используется служебное слово uses. За ним перечисляются через запятую имена файлов библиотек.
Модуль Crt содержит процедуры и функции, испльзующиеся для работы на текстовом экране. Примером процедуры этого модуля может служить очистка экрана clrscr. Процедуры этого модуля всегда работают в активном окне. Окном считается прямоугольная область, определяемая координатами верхнего левого и нижнего правого угла. По умолчанию активным окном является экран. Размеры экрана, по умолчанию, - 80x25 знакомест.
Заданный по умолчанию режим экрана можно изменить, используюя процедуру textmode (<константа режима>). Константа 0 задает черно/белый режим с размером экрана 40x25.
1 - цветной режим 40x25
2 - черно/белый режим 80x25
3 - цветной режим 80x25
7 - черно/белый режим и монохромный дисплей
256 - загружаемый шрифт - 43 строки в EGA и 50 строк в VGA.

Процедуры этого модуля могут обеспечивать работу со звуком. Частоту звука определяет процедура sound (<число герц>). Длительность звука регулируется процедурой delay (<длительность звука в мс.>) и процедурой nosound - отключение звука.
Короткий звуковой сигнал можно обеспечить, используя символ #7 в списке вывода оператора write. В списке вывода также можно использовать еще 4 специальных символа:
#8 - смещение курсора влево на одну позицию
#10 - сдвиг курсора на одну строку вниз
#13 - перемещение курсора на левую границу окна
Комбинация #13#10 соответствует нажатию клавиши Enter.

Для активирования нового окна следует определить его границы. Для этого используется процедура window (x1, y1, x2, y2). Координаты x1, y1, x2, y2 - абсолютные, все остальные координаты в окне - относительные, а точкой отсчета считается верхний левый угол окна. В пределах окна курсор можно переместить на овую позицию, используя процедуру gotoxy (x, y). Если x, y выходят за пределы окна, то процедура игнорируется. Для изменения цветовой гаммы окна используются следующие процедуры:
textbackground (<…>) - изменяет цвет фона; в качестве аргументов выступают числа 0..7
textcolor (<…>) - изменяет цвет текста; в качестве аргументов выступают числа 0..15.
Для организации мерцающих цветов текста к константе цвета необходимо прибавить 128.

Модуль 6. Файлы

6.1. Файлы.

Файл - это последовательность однотипных компонентов.
Компонентом файла может быть значение простого типа или структура, но не файл. Файл может быть компонентом другой структуры, но ни прямо, ни косвенно не может входить в состав другого файла.
Файл отличается от одномерного массива:
1) размещением на внешнем носителе;
2) произвольным в пределах носителя числом компонентов;
3) доступом к одному текущему компоненту в каждый момент времени.
В Паскале различают текстовые, типизированные и нетипизированные файлы.
При работе с файлами ключевым понятием является понятие файловой переменной.
Файловая переменная не является представлением одного конкретного файла. В зависимости от класса файла ее можно объявить одним из трех способов.
var
<ФП>: text;
<ФП>: file of <тип компонентов>;
<ФП>: file;
Для сопоставления файловой переменной с именем конкретного файла используется процедура assign (<ФП>, 'путь_к_файлу\имя_файла');
Процедура assign должна быть первой среди действий работы с файлом. Если файл находится в текущей директории, то путь к нему можно не указывать.
Файл, содержимое которого полностью заменяется, открывается процедурой rewrite (<ФП>). Файл, содержимое которого продолжает использоваться путем чтения, открывается процедурой reset (<ФП>).
Текстовые файлы могут быть открыты на дозапись процедурой append (<ФП>).
Для чтения компонентов файла используются процедуры read, readln и blockread. Первым аргументом в их списке стоит файловая перемнная, а затем обычный список вывода. Для записи компонентов в файл используются процедуры write, writeln и blockwrite.
После завершения работы с файлом его необходимо закрыть процедурой close (<ФП>).
Закрытый файл можно удалить erase (<ФП>) и переименовать rename (<ФП>, 'новое_имя').
Функция eof является логической и возвращает значение истина если достигнут конец файла. При работе с текстовыми файлами в конец каждой строки добавляется соответствующий знак, который можно найти, используя логическую функцию eoln. Этот символ в конец строки может быть поставлен принудительно. Для этого используется клавиша Enter.
Для набора текстовых файлов вне языка Паскаль можно использовать текстовый редактор edit.com.
Наряду с функциями eof и eoln могут использоваться seekeof (<ФП>) и seekeoln (<ФП>), "предчувствующие" окончание файла или строки, т.е. они распознают признак конца, если перед ним находятся пробелы или маркеры табуляции.

6.2. Сортировка файлов.

Для сортировок файлов можно воспользоваться несколькими приемами:

Записать файл в массив. Отсортировать массив. Записать массив в файл;
Используя динамические структуры создать в памяти структуру, подобную файлу. Отсортировать в этой структуре файл и переписать его заново;
Сортировка файлов без записи в память, т.е. на внешних устройствах.

Третий прием может быть реализован следующими способами:
1) просматривается весь файл. Находится максимальный элемент. Записывается в новый файл. Старый файл переписывается без найденного элемента и т.д.
2) пузырьковая сортировка. Из файла читаются два элемента. Больший записывается в новый файл, а меньший в конец старого. Просматривается весь файл до конца. Созданный вновь файл сортируется тем же способом. Сортировка останавливается когда в сортируемый файл не производится записи.
3) сортировка слиянием. Сортировка проводится в два этапа. На первом этапе сортируемый файл разделяется на два по определенному признаку. Элементы в новых файлах будут отсортированы. На втором этапе созданные файлы сливаются, создавая общий порядок сортировки.
function order (x, y: integer): boolean;
begin
if x<y then order:=true else order:=false;
end;
procedure separator (s, d1, d2: file; var sort:boolean);
var a, b:integer;
last: boolean;
dirout: 1..2;
begin
reset (s);
rewrite (d1);
rewrite (d2);
sort:=true;
dirout:=1;
if not eof (s) then
begin
read (s, a);
while not eof (s) do
begin
read (s, b);
last:= not order (a, b);
case dirout of
1: write (d1, a, last);
2: write (d2, a, last);
end;
if last then begin
case dirout of
1: dirout:=2;
2: dirout:=1;
end;
sort:=false;
end;
a:=b;
end;
case dirout of
1: write (d1, a, true);
2: write (d2, a, true);
end;
end;
close (s);
close (d1);
close (d2);
end;

Модуль 7. Объектно - ориентированное программирование

7.1. Тип объект.

Объект можно рассматривать как усовершенствование типа запись, в которой описание свойств и параметры моделируемой сущности дополняются методами - описаниями действий с объектом. В отличие от записи объект объявляется словом object.
Пример: создадим простейший объект: позицию на экране в графическом режиме:
program oop;
uses graph;
type pozicia = object
x, y: integer;
procedure init (xn, yn: integer);
procedure locate (var xl, yl: integer);
end;
procedure pozicia.init;
begin
x:=xn;
y:=yn;
end;
procedure pozicia.locate;
begin
xl:=x;
yl:=y;
end;
var d, r, xx, yy: integer;
p: pozicia;
begin
d:=detect;
randomize;
initgraph (d, r, 'c:\tp\bgi');
p.init (random(GetMaxX), random(GetMaxY));
closegraph;
p.locate (xx, yy);
write (xx, yy);
end.

7.2. Инкапсуляция.

Одним из главных свойств ООП является инкапсуляция - замыкание в общей оболочке (Object…end) всех составляющих описания. При этом поля оказываются глобальными для методов данного объекта, т.к. у полей и методов общая область действия, то совпадение имен полей и формальных параметров методов не допустимо. Блоки-методы вынесены за описание типа объект. Имена блоков-методов, принадлежащих разным типам могут совпадать. Даже при совпадении имен заголовки методов будут различны, т.к. состоят из префикса (имени типа) и имени метода.
Доступ к полям объектов из вне можно принудительно ограничивать. Для этого группа полей в описании объекта заключается в скобки Private Public. После этого поля окажутся доступными лишь методам данного модуля.

7.3. Наследование.

Примитивные объекты не используются как програмные модули, а используются в качестве носителей общих свойств и методов. Такие объекты называют родительскими. Объекты основанные на родительских называют дочерними. Родительский тип не используемый для описания переменных называется абстрактным. Тип потомок наследует все поля типа отца. В их числе все поля унаследованные отцом, если у него есть предки. Увеличение числа полей у потомка необязательно. Наследоваться также могут и методы, но выборочно. Описание типа потомка имеют отличительную деталь - имя типа отца:
<имя типа потомка>=object(<имя типа отца>)
С увеличением сложности объектов увеличивается число действий, которое можно заменить построением нового метода, причем имена методов создаются так, как если бы объекты не имели между собой родственной связи. Одинаковое обозначение функционально-подобных методов упрощает не только восприятие системы объектов, но и программирование.
Важной деталью использования наследования в программах является применение присваивания объектам значений объектов. Присваивание A:=B допустимо, если A и B - однотипны, A - предок B или для каждого поля A есть соответствующее поле в B.

7.4. Полиморфизм.

Полиморфизм предполагает определение класса или нескольких классов для родственных объектных типов так, что каждому классу отводится своя функциональная роль. Методы одного класса обычно наделяются общим именем. В ситуации когда необходимо сложный метод использовать в нескольких объектах и различия в поведении объектов минимальны, возможно создание смежного сложного метода с вынесением различий в сменные подчиненные методы. Такой метод называется конструктивным полиморфизмом. Осуществляется эта идея созданием виртуальных сменных методов. В заголовке такого метода присутствует слово virtual, а для их подключения к общему методу - обращение к конструктору - блоку со специальным заголовком.
constructor <имя блока> (<список формальных параметров>)
К конструктору надо обращаться для каждого объекта использующего виртуальные методы.
Задача: тип kom - сын типа pozicia представляет закрашенные квадраты с длиной стороны raz (в пикселах). Наследуемые поля x, y являются координатами центра квадрата. Процедура kom.zoom увеличивает (уменьшает) объект если аргумент znak>0 (znak<=0). Длина raz изменяется на 2*delt, где delt - еще один аргумент.

uses graph, crt;
type pozicia = object
x, y: integer;
procedure init (xn, yn: integer);
procedure locat (var xl, yl: integer);
end;
kom=object (pozicia)
cvet, raz: word;
procedure init (xn, yn: integer; color: word);
procedure zoom (delt, znak: integer);
end;
procedure pozicia.init;
begin
x:=xn;
y:=yn;
end;
procedure pozicia.locat;
begin
xl:=x;
yl:=y;
end;
procedure kom.init;
begin
pozicia.init (xn, yn);
cvet:=color;
raz:=1;
end;
procedure kom.zoom;
var j, d: integer;
begin
if znak>0 then setcolor (cvet)
else setcolor (getBkcolor);
for j:=1 to delt do
begin
if znak>0 then raz:=raz+2;
d:=raz div 2;
moveto (x-d, y-d);
linerel (d+d, 0);
linerel (0, d+d);
linerel (-d-d, 0);
linerel (0, -d-d);
if (znak<=0) and (raz>1) then raz:=raz-2;
end;
end;
const n=50;
var j, d, r, xx, yy: integer;
kvad: array [1..n] of kom;
begin
d:=detect;
randomize;
initgraph (d, r, 'c:\tp\bgi');
for j:=1 to n do
kvad[j].init (random(GetMaxX), random(GetMaxY), random(GetMaxColor);
repeat
delay (100);
j:=random (n)+1;
kvad[j].zoom(random(8)+1, random(3)-1);
until kepressed;
closegraph;
kvad[1].locat (xx, yy);
write (xx, ' ', yy);
readln;
end.

Модуль 8. Язык программирования Си

8.1. История создания языка.

Первая версия языка Си была разработана в 1972 году сотрудником фирмы Bell Laboratories Денисом Ритчи. В это время он и Кен Томбсон занимались разработкой ОС UNIX. В основу языка был положен язык B. Целью создания было: создание инструмента для программистов-практиков. На основе языка Си в дальнейшем были разработаны Си+, Си++ и Java. В 2000 году международной организацией по стандартизации (ISO) и американским институтом национальных стандартов (ANSI) был принят стандарт под именем Си99.
Языку Си присуща высокая степень переносимости. Это означает, что программы, написанные на Си для одной ОС, могут быть легко адаптированы для другой ОС. В настоящее время Си компилируется примерно для 40 ОС.
Чтобы подчеркнуть достоинства языка Си можно сказать, что многие компиляторы и интерпретаторы других языков программирования (Фортран, APL, Pascal, LISP, Basic) написаны на языке Си.
Программы, написанные на языке Си применяются для решения физических и инженерных задач, а также для создания анимационных спецэффектов в кинофильмах. Например, с этой целью Си применялся в фильмах "Гладиатор" и "Звездные войны".
Если сравнивать язык Си с языком Pascal, то можно сделать вывод, что Си дает большую свободу действиям программиста. С другой стороны Си позволяет совершить ошибки, которые в Pascal совершить невозможно.

8.2. Структура простой программы на языке Си.

Программа, записанная на языке Си состоит из совокупности функций, одна из которых - функция main(). () означают, что main - это функция, но не означает, что у нее нет аргументов. Описание функции состоит из заголовка и тела функции. Заголовок содержит операторы препроцессора, например, директиву #include , которая является стандартной частью всех программных компиляторов языка Си. Этот файл содержит информацию об операторах ввода/вывода.
Тело функции заключается в фигурные скобки и состоит из ряда операторов, каждый из которых заканчивается ";".
Пример:
#include
int main (void)   /* простая программа */
{
int num;   /* определить переменную с именем num*/
num=1;   /* присвоить переменной num значение*/
printf ("Я - простой");
printf (" компьютер ");
printf ("Моим любимым числом будет %d, поскольку оно…", num);
return 0;
}
Результатом исполнения программы будет сообщение на экране:
Я - простой компьютер Моим любимым числом будет 1, поскольку оно…

8.3. Представление данных в языке Си.

В языке Си существует несколько разновидностей целочисленных данных. Они различаются диапазоном возможных значений и тем, что могут ли использоваться отрицательные числа. Основным типом целочисленных данных является тип int. К этому типу относятся целые числа со знаком. Диапазон возможных значений зависит от компьютерной системы для хранения данного типа int. Обычно используется одно машинное слово. При объявлении целочисленной переменной указывается ключевое слово, определяющее тип, затем выбранное имя переменной и ставится ";". Несколько переменных можно объявлять в одном операторе, разделяя их имена запятыми. Значение переменной может быть присвоено способом инициализации, т.е. присвоением первоначального значения при объявлении.
Пример:
int a=21;
int a=21, b= -2;
Обычно в языке Си предполагается, что целочисленное значение записано в десятичной системе счисления, однако в программировании широко используются восьмеричные и шестнадцатеричные числа. Для того, чтобы отметить в какой системе счисления записано данное, перед ним ставится префикс. Для восьмеричного числа префикс 0, для шестнадцатеричного - 0x. При использовании 8-ой и 16-ой систем следует помнить, что в них представляются числа без знака. В языке Си используются три модификации основного целочисленного типа. Для их объявления используются слова short, long и unsigned.
Данные типа short занимают меньший объем памяти и являются данными со знаком. Данные типа long занимают больший объем памяти и являются данными со знаком. Данные типа unsigned используются для представления только положительных чисел. Их диапазон смещен относительно типа int.
В языке Си при достижении максимального значения происходит сброс на минимальное значение и отсчет от него. Разновидностью целочисленных типов в языке Си являются данные символьного типа - char. Объявляется символьный тип также, как и целочисленный. Записи символьных значений заключаются в кавычки. При присвоении символьного значения можно воспользоваться кодом числа. При этом код записывается без вспомогательных знаков.
Пример:
char c="a";
char b=65;
Описанный способ применяется для обозначения непечатаемых символов. В языке Си существуют еще одни "неудобные" символы - управляющие последовательности.

Последовательности | Действия
\a | предупреждение (звукокой сигнал)
\b | возврат на одну позицию
\f | перевод страницы
\n | перевод строки
\r | возврат каретки
\t | горизонтальная табуляция
\v | вертикальная табуляция
\\ | вывести на экран \
\' | вывести на экран '
\" | вывести на экран "
\0 | для вывода 8-го значения
\0x | для вывода 16-го значения

Когда символьным переменным присваиваются управляющие последовательности, они должны быть заключены в кавычки.
Ключевые слова, начинающиеся с символа _ включены в компиляторы Си, начиная со стандарта Си99. Так, ключевым словом _bool обозначаются данные логического типа. В языке Си логические данные true принято обозначать 1, а данные false - 0. Таким образом, логические данные являются целочисленными. Т.к. в различных компьютерах используются различные форматы представления слов, то как следствие появляется различие в диапазонах целочисленных значений. Для уточнения диапазонов можно воспользоваться обозначениями 16_t или 32_t, указывающими на 16-битовое или 32-битовое представление слова. Перед словом int можно поставить букву u, указывающую на отсутствие знака в формате представления данных. Для распознания программой введенных обозначений, к ней нужно присоединить файл inttypes.h. При работе с обозначенными типами может возникнуть ситуация, когда конкретная система не поддерживает введенный тип. В связи с этим, в языке Си стандарта Си97 определяется второй набор имен, который гарантирует, что рассматриваемый тип данных будет как минимум достаточно велик, чтобы удовлетворять требованиям спецификации и, по сравнению с другими аналогичными типами, имеет наименьшие размеры. Подобные типы данных именуют данными минимальной ширины. Например, int_least8_t означает наименьший доступный тип данных, хранящий 8-битовое целочисленное значение со знаком. При этом тип может быть реализован как 16-битовое значение.
В некоторых программах необходимо обеспечить максимально-возможную скорость исполнения. Для этой цели в стандарте Си99 имеются типы, называемые быстрейшими типами данных минимальной ширины. Для таких типов используется префикс fast. Например, int_fast8_t. В случае, когда необходимо использовать максимально-возможное по величине целочисленное значение, используются int_max_t или uint_max_t.
В языке Си числа с плавающей точкой относятся к типам float, double и longdouble.
В стандарте Си установлено, что данные типа float должны иметь как минимум 6 значащих цифр и диапазон значений от 10-37 до 1037. Для типа double установлен тот же диапазон значений, а минимальное число значащих цифр увеличено до 10.
Для сообщения о переполнении в стандарте Си99 при выводе значения переменной отображается inf или infinity.
В ситуации связанной с потерей точности образуется т.н. субнормальное значение. Чаще всего это значение отображается как ноль.
В стандарте Си99 появилась поддержка комплексных чисел. Для них существует 3 типа данных: float_complex, double_complex и long double_complex. Все эти типы состоят из двух частей, одна из которых является вещественной, а другая - мнимой частью. При работе с этими типами можно использовать константу I для обозначения квадратного корня из -1.

8.4. Форматированный ввод/вывод.

Задачи ввода/вывода в языке Си решают функции printf() и scanf().
Операторы вывода используются для вывода значений переменных и текста.
Тексты в Си записываются в кавычках. В языке Си отсутствует специальный тип для работы со строками. Вместо этого строки представляются как массив типа char. Элементы строки, хранясь в массиве, записываются в смежные ячейки памяти. В конце строки ставится отметка \0. Наличие этой отметки говорит о том, что строка должна иметь размер на единицу больший, чем количество символов. Объявляется строка указанием типа char и записью размера в [].
Пример:
char name[40];
Для работы со строками к программе необходимо подключить файл string.h.
Каждая из функций ввода/вывода использует управляющую строку и список аргументов. Управляющая строка записывается первой и заключается в кавычки. Управляющие строки и аргументы не перемешиваются. Управляющие строки прежде всего содержат указание на вывод значения того или иного типа. Их называют спецификаторами преобразования.

Спецификаторы | Действия
%a, %A | возвращают число с плавающей точкой и 16-е цифры
%c | возвращает одиночный символ
%d, %i | возвращают целое число в десятичной форме
%e, %E | возвращают число с плавающей точкой в экспоненциальной форме
%f | возвращает число с плавающей точкой в десятичной форме
%g | использует спецификатор %f или %e в зависимости от значения (выбирается автоматически)
%o | возвращает восьмеричное целое число без знака
%p | вывод указателя в шестнадцатеричном формате
%s | возвращает строку символов
%u | возвращает десятичное целое число без знака
%x, %X | возвращают шестнадцатеричное целое число без знака
%% | вывод на печать символа %

Основную спецификацию можно модифицировать вставляя между % и символом преобразования модификаторы.

Модификаторы | Действия
цифра/цифры | минимальная ширина поля вывода (количество экранных символов)
.цифра | точность
h | используется при целочисленных преобразованиях для кодирования значений short int и unsigned short int
hh | используется при целочисленных преобразованиях для кодирования значений signed char и unsigned char
j | используется при целочисленных преобразованиях для получения типов int_max_t и uint_max_t
l | используется при целочисленных преобразованиях для получения типа long int и unsigned long int
ll | используется при целочисленных преобразованиях для получения типа long long int и unsigned long long int
t | используется с целью кодирования значений типа ptroliff_t, который является разностью двух указателей
z | используется с целью кодирования значений size_t
L | используется при преобразовании чисел с плавающей точкой типа long double
флаг | + | значения со знаком печатаются со знаком "+" или "-"
флаг | - | элемент выравнивается по левому краю
флаг | пробел | значение со знаком "+" печатается с пробелом, но без знака
флаг | # | для спецификаторов %o, %x, %X выводит не значащие нули. Для форм с плавающей точкой гарантировано печатается точка, даже если десятичных знаков нет
флаг | 0 | для числовых форм вместо пробелов на свободные экранные места выводятся нули

Ввод данных осуществляется с помощью функции scanf(). В языке Си существует несколько функций ввода. scanf() употребляется чаще других, т.к. ей присущ различный формат ввода. Также как и функция printf(), ввод использует управляющую строку, сопровождаемую списком аргументов. Управляющая строка указывает в какие форматы должен быть преобразован вводимый текст. В качестве параметров функция scanf() использует не сами переменные, а указатели на них. Для использования scanf() необходимо выполнять два правила:
1) если функция используется для считывания значений в переменную основного типа, то перед именем переменной ставится знак &.
2) если значение считывается в символьный массив, то символ & не ставится.
Преобразование одного вводимого данного осуществляется указанием спецификатора преобразования. Если данных вводится несколько, то они разделяются знаком пробела.

Спецификаторы | Действия
%c | интерпретирует результат ввода в качестве символа
%d | интерпретирует результат ввода как десятичное целое число со знаком
%e, %f, %g, %a | интерпретирует результат ввода как число с плавающей точкой
%E, %F, %G, %A | интерпретирует результат ввода как число с плавающей точкой. Все вводимые символы преобразуются в заглавные
%o | интерпретирует результат ввода как восьмеричное целое число со знаком
%з | интерпретирует результат ввода как указатель
%s | интерпретирует результат ввода как строку. Ввод начинается с первого символа, не являющегося служебным и включает все символы до следующего служебного
%u | интерпретирует результат ввода как целое число без знака
%x, %X | интерпретирует результат ввода как шестнадцатеричное целое число со знаком

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

Модификаторы | Действия
* | подавить присваивание
цифра/цифры | максимальная ширина поля ввода. Ввод прекращается когда указанная ширина достигнута или при обнаружении служебного символа
hh | определяет считывание целого числа в виде signed char или unsigned char
ll | определяет считывание целого числа в виде long long или unsigned long long
L, l, h | определяет считывание числа в виде short int, unsigned short int, unsigned long, long, double или long double

8.5. Операции, выражения и операторы.

Основными операциями языка Си считаются +, *, -, /, а также оператор присваивания =. Как и в языке Паскаль, в Си нет возведения в степень. Основные операции выполняются в Си также как и в Паскаль, но имеют несколько дополнений. Так, знак "-" может использоваться как унарная операция, изменяющая знак переменной на противоположный. Особое использование отличает операцию деления. Она может применяться как к целым, так и к вещественным числам. Если результат операции деления должен быть присвоен целочисленной переменной, то дробная часть просто отбрасывается. Это действие называется усечением. Если деление применяется к операндам разного типа, то целочисленное значение преобразуется к виду с плавающей точкой.
Среди наиболее распространенных операций Си можно выделить:
1) sizeof - она возвращает размер операнда, выраженный в байтах. Операндом может быть конкретная данная или тип данных. При использовании последнего, оно записывается в скобках.
2) деление по модулю (%). Используется в целочисленной арифметике. Ее аналогом в Паскаль является функция mod.
3) инкремент (++). Выполняет простое действие: увеличивает значение операнд на 1. Эта операция может быть записана в префиксной форме, когда символ "++" предшествует переменной, и в постфиксной форме, когда "++" следует за переменной. Эти формы различаются последовательностью приращения значения операнда.
Пример:
a++;
++a;
b=a++;
b=++a;
Первые два оператора не имеют различий. В третьем примере сначала значение переменной a будет присвоено переменной b, а затем увеличено на 1. В четвертом примере сначала значение переменной a увеличится, а затем присвоится.
4) декремент (--). Существует в префиксной и постфиксной формах. Результат его действия - уменьшение значения оператора на 1.
Операции "++" и "--" имеют очень высокий приоритет исполнения. Выше только исполнение действий в скобках.
В языке Си существует несколько форм оператора присваивания:

Записи | Действия
+= | к переменной левой части прибавляется величина правой части
-= | вычитается величина правой части из значения переменной левой части
*= | умножается значение переменной левой части на величину правой части
/= | делится значение переменной левой части на величину правой части
%= | присваивается переменной левой части остаток от деления левой части на правую

Под выражением в языке Си понимают некоторую комбинацию операций и операндов. Важным свойством выражений является обязательное наличие у него значения. Из операторов языка Си можно составлять блоки. Операторы в блоке объединяются посредством фигурных скобок. Обычно в операторах и выражениях должны использоваться переменные и константы только одного типа. В Си употребление разных типов не прекратит исполнение программы. В этом случае будет активизирован набор правил для автоматического преобразования типов:
1) когда в выражении встречаются типы char и short, они автоматически преобразуются в int. Тип float преобразуется в double. Поскольку такие действия преобразуют к типу, обеспечивающему больший размер данных, то они называются повышением типа.
2) если операция выполняется над данными разных типов, то обе величины преобразуются к высшему из этих типов.
3) последовательность типов, упорядоченных по принципу от высшего к низшему выглядит так: long double, double, float, unsigned long, long, unsigned int, int.
4) в операторе присваивания окончательный результат вычислений преобразуется к типу переменной, которой присваивается вычисленный результат.
По мере возможности требуется избегать автоматического преобразования типов. При составлении выражения вы можете потребовать выполнение того вида преобразования, которое необходимо вам. Этот способ называется привидением типов и определяется следующим образом. Перед заданной величиной в круглых скобках записывается имя требуемого типа данных.
Пример:
b=(int)3.3+4;

8.6. Директивы препроцессора.

Одной из самых распространенных директив является директива #define. Эта директива используется для определения назначения указанных в ней идентификаторов. Использование этой директивы внешне похоже на работу с константами. Каждая строка #define состоит из трех частей:
1) сама директива;
2) выбранная вами аббревиатура или идентификатор, который принято называть макрос;
3) подставляемые значения или список замены или тело.
Процесс начинающийся макросом и завершающийся процессом замены, называется макрорасширением.
Пример:
#include
#define TWO 2
#define FOUR TWO*TWO
#define PX printf ("x - это %d, \n", x)
int main (void)
{
int x = TWO;
PX;
x = FOUR;
PX;
}
При исполнении приведенной программы на этапе работы препроцессора происходят следующие замены: строка int x = TWO заменяется на int x = 2; строка PX на printf (…); x = FOUR на x = TWO*TWO, а затем на x = 2*2. На этом процесс макрорасширения заканчивается, т.е. на этапе препроцесса умножение не исполняется, а исполняются только предложенные подстановки.
Результатом работы программы будет вывод двух строк:
x - это 2
x - это 4
При объявлении директивой #define значений превышающих длину строки возможно разбиение значения на несколько строк с использованием символа "\".
Пример:
#include
#define PX printf ("Сегодня первой па\
рой - алгоритмизация.\n")
int main (void)
{
PX
}
Если в приведенном примере перед слогом "рой" поставить несколько пробелов, то они будут выведены в результирующей строке. Используя аргументы директивы #define, можно создавать макросы функции, которые выглядят и действуют подобно функциям.
Пример:
#define SQUARE (x) x*x
Эта директива может быть использована в следующих операторах:
int x = 4;
int z;
1) z = SQUARE (2);
2) z = SQUARE (x);
3) z = SQUARE (x+2);
4) z = 100/SQUARE (2);
На этапе препроцесса первая запись будет заменена на z = 2*2; вторая на z = x*x; третья на z = x+2*x+2; четвертая на 100/2*2. Соответственно результатами будут значения: 4, 16, 14, 100.
Если в третьем случае необходимо исполнения действия (x+2)*(x+2), то подставляемое значение в директиве #define должно быть заменено на (x)*(x). При этом в четвертой записи получим z = 100/(2)*(2). Для исполнения этого действия как 100/(2*2) необходимо в директиве #define записать ((x)*(x)).
Иногда даже предусмотренные предосторожности не позволят обеспечить необходимый результат. Например, если в качестве аргумента используется инкремент или декремент.

8.7. Реализация циклов в языке Си.

Для реализации цикла с предусловием в языке Си используется ключевое слово while. Операторная часть может состоять как из одного оператора, так и из нескольких, объединенных фигурными скобками. В общем виде оператор можно записать так:
while (условие)
{
оператор 1;
оператор 2;
}
Операторная часть цикла повторяется до тех пор, пока условие не станет ложным или равным нулю. При составлении условий могут быть использованы следующие относительные операции: <, <=, ==, >=, >, !=. В условиях также можно использовать логические конструкции, которые в Си имеют следующий вид:
&& - логическое "И"
|| - логическое "ИЛИ"
! - логическое отрицание
Для реализации цикла с параметром используется ключевое слово for. В записи оператора используются 3 выражения, управляющие работой цикла. В общем виде цикл имеет следующую форму:
for (присвоение начального значения; проверяемое выражение; выражение изменяющее значение переменной) оператор;
Выражение присваивающее начальное значение выполняется только один раз перед первым действием в цикле. Затем оценивается проверяемое выражение. Затем вычисляется выражение изменяющее переменную цикла. Цикл for в Си - это цикл с предусловием.
Цикл с постусловием в Си реализуется ключевыми словами do и while. В общем случае оператор можно записать:
do
оператор;
while (условие);

Задача: написать программу выводящую на экран следующую последовательность:
ABCDEF
BCDEF
CDEF
DEF
EF
F

#include
int main (void)
{
const int a = 6;
int i;
char k;
for (i=0; i<6; i++)
{
for (k='A'+i; k<'A'+a; k++)
printf ("%c", k);
printf ("\n");
}
}

8.8. Условные и безусловные переходы в языке Си.

В языке Си оператор ветвления в общем виде имеет запись:
if (выражение)
оператор;
Язык Си допускает использование конструкции if else, которая в общем виде имеет следующую запись:
if (выражение)
оператор 1;
else
оператор 2;
Язык Си также разрешает использование конструкции else if. В этом случае может возникнуть неправильное прочтение программы пользователем.
Пример:
if (выражение 1)
if (выражение 2)
оператор 1;
else
оператор 2;
В языке Си используется стенографическая запись одной из форм ветвления. Эта форма называется условным выражением и записывается условным оператором ?:
В общем виде условный оператор имеет две части и три операнда. Записать его можно следующим способом:
(выражение1)? выражение2: выражение3;

Пример: требуется определить наибольшую из двух величин:
1 способ:
if (a<b)
max = b;
else
max = a;

2 способ:
max = (a<b)?b:a;
Для разрешения ситуации с заранее известным числом исходов в языке Си используется конструкция выбор. В общем виде выбор записывается в следующем виде:
switch (выражение)
{
case значение1:
оператор1;
case значение2:
оператор2;
default: оператор3;
}
Выбор в языке Си допускает краткую запись тех значений выражения, для которых исполняется одно и то же действие.
Пример:
switch (выражение)
{
case значение1:
case значение2:
оператор1;
case значение3:
оператор2;
}
Язык Си может использовать следующие безусловные переходы или прерывания: break, continue и goto. Их использование в основном совпадает с использованием в Паскаль, а именно: break прерывает исполнение любого вида циклов, continue - завершает текущую итерацию цикла, goto - осуществляет переход по метке. В отличие от языка Паскаль, break может использоваться в Си для завершения выбора. Использование оператора goto в языке Си считается нежелательным. Метки специально не объявляются.

8.9. Использование массивов при реализации циклов.

Само понятие массива в языке Си не изменяется. При объявлении массива указывается общее имя элементов массива, размерность и его тип.
Пример:
int a[20];
В данном случае последний элемент в массиве будет иметь индекс 19, т.к. обязательно нумерация начинается с нуля. Обращение к одному элементу организуется по имени массива и индексу элемента.
Каждая строка в языке Си является символьным массивом, но не всякий символьный массив является строкой. Строкой считается массив, последним значением которого будет нулевой элемент.

содержание     на главную

последнее обновление: 24.01.2004

Если у вас есть программы, предложения или замечания - пишите: [email-masked]

http://rc-5.narod.ru/