35117

Программирование в Turbo Pascal

Конспект

Информатика, кибернетика и программирование

Вводите внимательно’ if Summa=stoim then writeln‘Спасибо за покупку’ else if Summa stoim then writeln‘Возьмите сдачу’ summastoim else Writeln‘Доплатите’ stoim summa End. Program имя программы ; Раздел описания: Раздел подключения модулей ; Раздел описания типов ; Раздел описания меток ; Раздел описания постоянных ; Раздел описания переменных ; Раздел описания процедур и функций ; begin Раздел операторов ; end. End.; Var; Const ; Begin раздел операторов ; End; Function имя функции список формальных параметров: тип...

Русский

2013-09-09

794 KB

28 чел.

[0.1] Раздел 1. Основы алгоритмизации.

[0.2] §1. Понятие алгоритма. Свойства.

[1]
Лекция 2.

[1.1] §2. Способы записи алгоритма.

[2]
Лекция 3.

[2.1] §3. Типы алгоритмов.

[3]
Лекция 4.

[3.1] §4. Метод пошаговой детализации.

[4]
Лекция 5.

[4.1] Раздел 2.

[4.2] §1. Критерий качества программы.

[5]
Лекция 6.

[5.1] § 2. Основные этапы подготовки задачи к решению на компьютере.

[6]
Лекция 7.

[6.1] Раздел 3. Язык программирования Turbo Pascal.

[6.2] §1. Элементы языка. Структура программы.

[7]
Лекция 8.

[7.1] Структура программы.

[8]
Лекция 9.

[8.1] Выражения, операции, операнды

[9]
Лекция 10.

[9.1] Типы данных в Turbo Pascal .

[10] Лекция 11.

[10.1] Задачи:

[10.2] Стандартные функции Turbo Pascal.

[11]
Лекция 12.

[11.1] Тождественность и совместимость типов.

[12]
Лекция 13.

[12.1] Ввод-вывод данных в Turbo Pascal

[12.2] Управление символьным выводом на экране.

[13]
Лекция 14.

[13.1] Операторы Turbo Pascal. Простые операторы. Составной.

[14]
Лекция 15.

[14.1] Условный оператор IF.

[15]
Лекция 16.

[15.1] Оператор выбора Case.

[16]
Лекция 17.

[16.1] Циклические операторы Turbo Pascal.

[17]
Лекция 18.

[17.1] Применение циклических операторов для решения задач.

[18]
Лекция 20.

[18.1] Массивы.

[18.2] Инициализация массива.

[18.3] Заполнения массива по формуле.

[18.4] Задание массивов случайным образом.

[19]
Лекция 21.

[19.1] Ввод массива с клавиатуры.

[19.2] Вывод массива.

[20]
Лекция 22.

[20.1] Основные задачи по теме.

[21]
Лекция 23.

[21.1] Сортировка массива.

[22]
Лекция 24.

[22.1] Итоговое занятие по массивам.

[23]
Лекция 25.

[23.1] Строки в Turbo Pascal

[24]
Лекция 26.

[24.1] Основные задачи по теме строки:

[25] Лекция 27.

[25.1] Процедуры и функции пользователя.

[26]
Лекция 28.

[26.1] Основные задачи по теме подпрограммы:

[27]
Лекция 29.

[28]
Лекция 31.

[28.1] Множества в Turbo Pascal.

[29]
Лекция 32.

[29.1] Основные задачи по теме множества:

[30]
Лекция 33.

[30.1] Записи в Turbo Pascal

[31]
Лекция 34.

[31.1] Задача по теме записи. Оператор With.

[32]
Лекция 35.

[32.1] Файлы

[33]
Лекция 36.

[33.1] Средства обработки файлов.

[34]
Лекция 37.

[34.1] Текстовые файлы

[35]
Лекция 38.

[35.1] Типизированные файлы

[35.2]
Лекция 40.

[35.3] Графика в турбо паскале.

[36]
Лекция 41.

[36.1] Модуль graph

[37]
Лекция 43.

[37.1] Основные процедуры модуля graph.

[38]
Лекция 44.

[38.1] Основные процедуры модуля graph для построения графических фигур.


Лекция 1.

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

§1. Понятие алгоритма. Свойства.

Слово алгоритм появилось еще в 9в. Когда на латинский язык переводились труды великого восточного ученого Мухаммеда Аль Хорезми. Он занимался математикой и первым написал четкие, краткие указания, следуя которым можно было решить уравнения первой и второй степени. На латынь имя Аль Хорезми перевели как Алгоритм. И учителя, обучая решению уравнений первой и второй степени, говорили: «Следуйте указаниям алгоритма», а потом просто : «Следуйте алгоритму».

Теперь, алгоритм- четкое предписание выполнить какие- либо действия.

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

С алгоритмом обязательно связаны понятия исполнителя, и СКИ.

Исполнитель алгоритма, тот, кто выполняет данный алгоритм. Исполнителем может быть человек, компьютер, ЯП.

СКИ (система команд исполнителя)- та совокупность действий, которые может делать исполнитель.

Возникает вопрос: любая ли последовательность действий (или инструкция) является алгоритмом?

Конечно, нет. Не всякая инструкция алгоритм, а только та, которая обладает определенными свойствами.

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

  1.  Понятность- все шаги алгоритма должны содержатся в СКИ.
  2.  Дискретность- алгоритм разбивается на последовательность отдельных шагов, четко отделенных друг от друга. Только выполнив шаг можно перейти к следующему.
  3.  Определенность - не должно содержаться шагов с неоднозначным смыслом.
  4.  Результативность-  алгоритм должен заканчиваться через конечное число шагов определенным результатом.
  5.   Массовость- алгоритм создается не для одной конкретной задачи, а для целого блока однотипных задач.

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

  •  Исполнитель: робот;

СКИ: вперед, вправо, влево, назад;

Алгоритм «перехода к заданному месту»:

Вправо;

Вперед;

Влево;

Вперед;

Вверх;

Влево.

Данный алгоритм не удовлетворяет свойству понятности, так как в СКИ нет команды Вверх.

  •  Алгоритм «взятия ручки с синей пастой с парты»

Зайти в класс;

Подойти к парте;

Взять ручку с синей пастой.

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

  •  Алгоритм нахождения суммы двух чисел.

Прибавить 2+3;

Результат вывести на экран.

Данный алгоритм не удовлетворяет свойству массовости.

  •  Алгоритм вывода на печать квадратов натуральных чисел от 1 до 15.

Задать х значение 1;

Пока х меньше 15 выводить на экран х2;

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

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

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

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

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


Лекция 2.

Вопросы: (отвечаем по цепочки, начиная с первой парты первого ряда)

  •  Что такое алгоритм?
  •  Перечислить все свойства алгоритма.
  1.  Охарактеризовать каждое свойство, привести примеры алгоритмов, не удовлетворяющие этим свойствам.

§2. Способы записи алгоритма.

Существует четыре способа записи алгоритма.

  1.  Словесный
  2.  Псевдокод
  3.  Блок-схема (графический способ или символьная схема)
  4.  Язык программирования

Рассмотрим подробнее каждый способ.

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

Пример: Кулинарный рецепт, инструкция.

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

Пример:

Нач

Ввод(а, с);

У:=а+с;

Вывод(‘у=’,у);

Кон.

Блок- схема- графически способ записи алгоритма. Наиболее наглядна. Команды алгоритма помещаются внутрь графических блоков, которые соединяются линиями, указывающими порядок выполнения действий.

Рассмотрим основные графические блоки.

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

Символ, отображающий ввод- вывод данных

Терминатор, Отображает начало или коней блок-схемы

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

Соединитель

Символ подпрограммы, внутри указывается имя подпрограммы (процедуры, функции) к которой необходимо обратится.

Символ ввода с клавиатуры.

Символ дисплея.

Символ магнитного диска.

Символ вывода на печать

Пример:

Написать на блок-схеме алгоритм нахождения суммы двух чисел.

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

Пример: Turbo Pascal, Си и т.д.


Лекция 3.

§3. Типы алгоритмов.

Все алгоритмы можно разделить на три типа.

  1.  Линейные
  2.  Разветвляющиеся
  3.  Циклические

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

Пример:

Написать алгоритм нахождения суммы (произведения, разности и т.д) двух чисел.

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

Пример:

Написать алгоритм вычисления частного двух целых чисел.

Зам! На ноль делить нельзя!

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

Эту повторяющуюся часть в алгоритме называют циклом, а операторы, которые повторяются, называют телом цикла. Циклы бывают простые и сложные.

Цикл называется сложным, если он содержит в себе еще один или несколько циклов. Цикл находящийся внутри называется вложенным (внутренним), а цикл, содержащий в себе др. циклы называется охватывающим (внешним). Чтобы сложные циклы работали нормально, необходимо чтобы внутренний цикл заканчивался раньше внешнего.

Все циклы можно разделить еще на циклы с заранее известным количеством шагов (повторений) и циклы с неизвестным количеством шагов (итерационные)

К первому типу относится цикл:

ДЛЯ им.пер.:=нач.зн. ДО кон.зн. ПОВТОРЯТЬ

НАЧЦИКЛА

Действия

КОНЦИКЛА

Пример: выводить на экран значение функции y=x2 для х из (0,15), где х целое число.

Дано: целые числа от 0 до 15.

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

0 1 4 9 16 25 36 49… 225.

Алгоритм:

Присвоить х 0;

Вычислить y=x2

Вывести у

Присвоить х 1

Вычислить y=x2

Вывести у

Присвоить х 15

Вычислить y=x2

Вывести у

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

Начало

ДЛЯ Х:=0 ДО 15 ПОВТОРЯТЬ

НАЧЦИКЛА

У:=Х*Х;

ВЫВОД(У);

КОНЦИКЛА;

Конец

Итерационные циклы реализуются при помощи циклов ПОКА, ПОВТОРЯТЬ ДО.

Рассмотрим цикл ПОКА.

ПОКА усл ПОВТОРЯТЬ

НАЧЦИКЛА

 Действие

КОНЦИКЛА

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

Пример: дана функция у=1/х, где х натуральное число. Выводить у, пока он больше 0,066.

Алгоритм:

Присвоить х 1

Вычислить у

Вывести у, если он больше0,066

Присвоить х 2

Вычислить у

Вывести у, если он больше0,066

Присвоить х 3

Вычислить у

Вывести у, если он больше0,066

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

Начало

Х:=1;

У:=х*х;

ПОКА у>0.066 Повторять

НАЧЦИКЛА

 Вывод(у);

 х:=х+1;

 у:=х*х;

КОНЦИКЛА;

Конец

Дома Записать на псевдокоде и блок- схеме:

  1.  Вычислить у=3х2+2а=7, где а=-8.
  2.  Найти площадь прямоугольника со сторонами х, у. обратить внимание, что стороны не могут быть отрицательными.
  3.  Протабуллировать функцию у=х3, для целого х из интервала (-4;4).
  4.  Протабуллировать функцию у=1/х, для х из интервала (0,10) с шагом 0,1.


Лекция 4.

Вопросы: (отвечаем по цепочки, начиная с первой парты первого ряда)

  1.  Какие типы алгоритмов вы знаете(перечислить)
  2.  Охарактеризовать каждый тип

В это же время 4 человека у доски показывают домашнее задание.

§4. Метод пошаговой детализации.

Развитие индустрии создания ПО приводит к более высоким требованиям к программному продукту. Значительное увеличение сложности решаемых задач приводит к увеличению размеров и сложности программ, что порождает дополнительные трудности при их разработки и отладке.

Для разрешения возникших проблем в практике программирования выработан ряд приемов и методов, которые принято называть методами структурного программирования.

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

Следование- Последовательность групп операторов, выполн

Ветвление-

Повторения (циклы)-

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

При создании алгоритмов программ при структурном программировании используют метод пошаговой детализации. Основа метода- сначала формулируются самая крупная (грубая) модель, потом она уточняется, разбиваясь на более мелкие отдельные задачи. Решение основной задачи сводится к соединению всех решений маленьких задач.

Пример,

Сравнить два числа.

1.Ввести а, в

2. Сравнить.

1.Ввести а, в

2.1 а=в

2.2 а=в

1.Ввести а, в

2.1 а=в

2.11 а>в

2.12 в<а

 


Лекция 5.

Раздел 2. 

§1. Критерий качества программы.

Компьютер- универсальное средство обработки информации любого вида.

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

Аппаратная часть (hard were)- монитор, системный блок со всеми своими составляющими, принтер и т.д.

Программное обеспечение (soft were)- совокупность программ, необходимых для работы компьютера. Это и системное ПО, и прикладное. Системное По управляет аппаратной частью, распределяет ресурсы, обеспечивает взаимосвязь программ и т.д. Примером системного ПО являются ОС, утилиты, системы тестирования. Прикладное ПО- совокупность программ, которые выполняют основную работу по преобразованию информации. Это всевозможные редакторы (текстовые, графические), экспертные системы, игры и т.д.

Мы будем заниматься разработкой прикладных программ.

Программа- это

Разработанная нами программа будет называется качественным, если он удовлетворяет всем требованиям заказчика и следующим характеристикам:

  1.  Функциональность- способность программы выполнять набор функций, удовлетворяющих заданным или подразумеваемым потребностям пользователя.
  2.  Надежность- способность программы безотказно выполнять определенные функции при заданных условиях в течение заданного периода времени.
  3.  Удобство- включает в себя характеристики программы, которые позволяют минимизировать усилия пользователя по применению программного продукта, оценки результата.
  4.  Эффективность- отношение уровня услуг, предоставляемых пользователю к объему используемых ресурсов (времени, памяти)
  5.  Сопровождаемость- это характеристики, позволяющие минимизировать усилия по внесению изменений в программу, устранению ошибок.
  6.  Переносимость- способность программного продукта быть перенесенным из одной среды в другую (в частности, с одной аппаратной архитектуры на другую)
  7.  Добротность- программа должна быть добротно и рационально организована, не слишком переусложнена.

Следует заметить, что создание программы, которая удовлетворяет всем критериям, дело достаточно сложное, не всегда выполнимое. Однако, при написании программ, необходимо максимально приблизить программу к идеальному варианту.


Лекция 6.

§ 2. Основные этапы подготовки задачи к решению на компьютере.

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

  1.  Какую работу должна выполнять программа.
  2.  Какими должны быть входные и выходные данные.
  3.  На каком языке должна быть написана программа.

Для написания программы, необходимо ее сконструировать- собрать воедино все требования к программе, решить, какие процессы необходимы для преобразования входных данных в выходные, в каком порядке должны выполнятся эти процессы.

Основные этапы конструирования программы:

  1.  Внешняя спецификация (постановка задачи).

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

Определить назначение программы(что будет делать, как)

Определить входные данные.

Определить выходные данные.

После выполнения всех подпунктов составляем таблицу, в которой описаны все возможн6ые ситуации и действия ЭВМ в каждом случае.

Ситуация

Эффект

  1.  Разработка алгоритма.

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

  1.  Описание внутренней спецификации.

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

  1.  Кодирование программы.

Перевод готового алгоритма на язык программирования, учитывая особенности языка и структуры программы.

  1.  Тестирование и отладка программы.

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

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

Пример. Написать программу, которая реализует применения компьютера в книжном магазине. Компьютер запрашивает стоимость книг, сумму денег, внесенную покупателем, если сдачи не требуется, печатает «СПАСИБО!», Если денег внесено больше, то печатает «ВОЗЬМИТЕ СДАЧУ» и указывает сумму, если денег не достаточно, то пишет об этом, указывая сколько доплатить.

  1.  Внешняя спецификация (постановка задачи).

Программа предназначена для использования в книжном магазине, она запрашивает стоимость книг, сумму денег, внесенную покупателем, если сдачи не требуется, печатает «СПАСИБО!», если денег внесено больше, то печатает «ВОЗЬМИТЕ СДАЧУ» и указывает сумму, если денег не достаточно, то пишет «Доплатите», указывая сколько.

Входными данными являются- стоимость покупки(stoim) и сумма денег(summa), внесенная покупателем.

Выходные данные- это сообщение на экране монитора («Спасибо», «Возьмите сдачу___ руб.», «Доплатите_____ руб.»).

Ситуация

Эффект

Stoim=summa

«Спасибо»

Summa> stoim

«Возьмите сдачу  summa-stoim руб

Summa<stoim

Доплатите stoim -summa руб

(Summa<=0) or(stoim<=0)

«Не корректный ввод. Вводите внимательно!»

  1.  Разработка алгоритма.

Нач

Ввод(summa, stoim);

Пока (Summa<=0) or(stoim<=0) повторять

Начцикла

Вывод(Не корректный ввод. Вводите внимательно!);

Концикла;

Если summa= stoim  

   то вывод(спасибо)

  Иначе если summa> stoim

 то вывод(Возьмите сдачу  summa-stoim руб.)

    иначе вывод(Доплатите stoim -summa руб);

Кон.

  1.  Описание внутренней спецификации.

Связь входной и выходной информации, выявляется в формулах

summa-stoim

stoimsumma

Алгорит простой, понятный, уточнения не требует.

  1.  Кодирование программы.

Program KASSA;

Var stoim, summa: real;

Begin

Write(‘Введите стоимость покупки’);

Readln(stoim);

Write(‘Введите вносимую сумму’);

Readln(summa);

while (Summa<=0) or(stoim<=0) do

 writeln(‘Не корректный ввод. Вводите внимательно!’)

 if Summa=stoim

 then writeln(‘Спасибо за покупку!’)

 else if Summa>stoim

   then writeln(‘Возьмите сдачу’, summa-stoim)

else Writeln(‘Доплатите’, stoim -summa)

End.

  1.  Тестирование и отладка программы.

Контрольные примеры:

(stoim summa ):(-12,12); (12,-12); (23,23); (12,50); (50, 10)


Лекция 7.

Раздел 3. Язык программирования Turbo Pascal.

§1. Элементы языка. Структура программы.

Одой из форм записи алгоритма является ЯП.

Любой компьютер работает по программе, записанной на ЯП- искусственно созданном языке, алфавит, словарный запас, структура которого удобны для человека и понятны компьютеру.

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

     ЯП

Низкого      высокого

(машинноориентированные языки)  (приближенные к естественным, но полностью формализованы)

при записи алгоритма на ЯП необходимо четко знать правила написания и использования элементарных языковых единиц.

Основа любого языка- алфавит, синтаксические и семантические правила.

ЯП Turbo Pascal разработал в 1968-71гг.Николас Вирт.

Алфавит Turbo Pascal состоит из букв, цифр, специальных символов

Буква-26 латинских строчных и 26 латинских прописных букв (НЕ различает!),_ подчеркивание

Цифра- арабские цифры:  0 1 2 3 4 5 6 7 8 9

Специальные символы:

    знаки операций:

     +   -   *   /   =   <>   <   >   <=   >=   :=  @

    ограничители:

     .   ,   '   (   )   [   ]   (.  .)   {  }  (*  *)   ..   :   ;

    спецификаторы:

     ^  #  $

Буквы алфавита образуют слова. Существуют зарезервированные (служебные) слова, имеющие определенный  смысл и назначение Их нельзя менять, любая неточность в их написании приводит к ошибке, их нельзя использовать в качестве имен своих переменных, постоянных. Существует около 80 служебных слов.

AND FILE OF

ARRAY FOR OR

BEGIN FUNCTION PACKED

CASE GOTO PROCEDURE

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

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

Идентификатор- это имя переменной, постоянной, функции, процедуры, типа, самой программы и т.д.

Существуют стандартные идентификаторы(sin, cos, byte, integer и т.д.) и идентификаторы пользователя.

Зам! Идентификатор в программе должен быть уникальным! (Иначе ошибка- duplicate identifier)

При написании идентификаторов, необходимо придерживаться следующих правил:

Идентификатор начинается только с буквы или знака _.(исключение -метки!)

Идентификатор может состоять из латинских букв, цифр, знака _

Наибольшая длина идентификатора- 127 символов, но значащими являются только 63.

Назначать идентификатор лучше по смыслу

Пример,

Является ли идентификатором?

Metka  12

2graph

Blok_56

Nomer.doma

сумма

Главными элементами любой программы являются операторы, переменные и постоянные.

Оператор- предложение ЯП, задающее полное описание некоторого действия, которое необходимо выполнить.

Переменная- это ячейка (или несколько) оперативной памяти, которой присвоено определенное имя, и значение которой может меняться в течение программы.

Постоянная- это ячейка (или несколько) оперативной памяти, которой присвоено определенное имя, и значение которой не меняться в течение программы.


Лекция 8.

Структура программы.

Каждая программа, написанная на ЯП Turbo Pascal, имеет определенную структуру.

Program <имя программы>;

Раздел описания:

<Раздел подключения модулей>;

<Раздел описания типов>;

<Раздел описания меток>;

<Раздел описания постоянных>;

<Раздел описания переменных>;

<Раздел описания процедур и функций>;

begin

<Раздел операторов>;

end.

Любая программа начинается служебным словом Program, после которого следует идентификатор пользователя- имя программы.

Сама программа состоит из двух разделов: раздела описания и раздела операторов.

Первый раздел может присутствовать в программе не всегда. Он включает в себя описание всего того, чем мы будем пользоваться в программе. Это разделы описания типов, меток, постоянных, переменных, процедур и функций и раздел подключения модулей. Все эти разделы могут присутствовать не всегда и располагаться в произвольном порядке, кроме раздела подключения модулей. Если этот раздел есть, то он обязательно первый!

Рассмотрим подробнее каждый раздел.

<Раздел подключения модулей>;

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

Модуль расширяет возможности программ.

В Turbo Pascal существуют следующие стандартные модули:

System- стандартный модуль

Crt- модуль управления звуком и отображением информации на экране

Graph- графический модуль

Кроме того, пользователь может создать и свой собственный модуль.

При запуске среды программировании Turbo Pascal автоматически подключается только модуль System . Для того чтобы использовать возможности других модулей, необходимо эти модули подключить:

Uses < через запятую список подключаемых модулей>;

Пример,

Uses crt;

Uses crt, graph;

<Раздел описания типов>;

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

ЯП Turbo Pascal имеет разветвленную систему типов, но, кроме того он позволяет описывать пользователю и свои типы в разделе описания типов:

Type  <имя типа >=<определение>;

Пример,

Type day=1..31;

Vector= array[1..12] of real;

<Раздел описания меток>;

В программе любой оператор можно пометить меткой для перехода на него в определённый момент. Метка это имя и следующее за ним :. Все метки используемые в программе должны быть описаны в разделе описания меток:

Label<имена используемых меток через запятую>;

Пример,

….

Label M1,M2;

…..

begin

M1:<оператор1>;

….

M2<оператор2>;

….

End.

<Раздел описания постоянных>;

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

Const <имя постоянной>=<значение>;

Пример,

Const n=100;

 M=-7;

<Раздел описания переменных>;

Переменные, используемые в программе, должны быть описаны по следующим правилам:

Var <имя переменной>:<тип>;

Пример,

Var x, y: real;

Z: byte;

D,g,h: array [1..5] of string;

<Раздел описания процедур и функций>;

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

Procedure <имя процедуры>(список формальных параметров);

Type ..;

Var…;

Const …;

Begin

<раздел операторов>;

End;

Function <имя функции>( список формальных параметров):<тип результата>;

Type …;

Var …;

Const … ;

Begin

< раздел операторов >;

End;

Раздел операторов- это основной блок программы, в нем описано все, что будет делать программа. Этот раздел обязательно присутствует в каждой программе. Раздел начинается служебным словом begin, далее следует список операторов. Каждый оператор (кроме последнего) заканчивается ; и для удобства записывается с новой строки. Раздел операторов заканчивается служебным словом end. В конце программы обязательно ставится точка.

Для лучшего понимания программы в ней допустима запись комментариев- пояснений. Комментарии можно записывать в любом месте программы, где допустим пробел, они пишутся на любом языке и обязательно заключаются в {} или (* *).

Зам! Внутри комментарии не могут содержать знаки- ограничители

{{так нельзя!}}

{и {так} нельзя!}


Лекция 9.

Выражения, операции, операнды

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

Выражение состоит из операндов и операций.

Операнды- величины и выражения, над которыми производятся действия (переменные, постоянные, обращение к функциям).

Операции- определяют действие, которое надо выполнить (+,-,*,/ и д.т.)

Пример, х+у-10  х, у, 10- операнды

   +, -  - операции

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

Пример,  (a+b)*c  

a+b *c

Операции могут быть унарными (имеют один операнд, например, (-у)) и бинарными (имеют два операнда, например, х+у)

Все операции в Turbo Pascal делятся на :  арифметические (+  -  *  /  div  mod)

отношения(<  >  <=  >=  =  <>)

логические(or, xor, and, not )

строковые

Все выражения в Turbo Pascal тоже делятся на арифметические, отношения, логические, строковые.

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

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

Логическим называется выражение, составленное при помощи логических операций. Тип значения выражения всегда Boolean.

Рассмотрим подробнее логические операции.

And- соединяет два или больше операнда, имеет значение истина, если все операнды истины.

Пример,

Const  x=3;

Y=4;

Z=6;

(x>10) and (y+z<9)- ложь

(x=3) and (y<=4) and (z>0)- истина

Or- соединяет два или больше операнда, имеет значение истина, если хотя бы один из операндов истинен, и значение ложь, если все ложны.

Пример,

Const  x=3;

Y=4;

Z=6;

(x>10) or (y+z<19)- истина

(x=3) or (y<=4) or (z>0)- истина

(y=9) or (z<0)- ложь

Xor- соединяет два или больше операнда, имеет значение ложь, если все операнды ложны или истины.

Пример,

Const  x=3;

Y=4;

Z=6;

(x>10) xor (y+z<9)- ложь

(x=3) and (y<=4)- ложь

(y=9) or (z>=0)- истина

Not- унарная операция. имеет значение истина, если операнд ложен, и наоборот.

Пример,

Z=100;

Not(z>100)- истина

Not(z>=10)-ложь

Записать условия.

Хє(а,б);

х,у- переменные разного знака

х,у- переменные одного знака

хє(-∞, 5][10, +∞);

Огромную роль в выражениях играет приоритет операций.

Приоритет операций- очередность выполнения.

В Turbo Pascal операции имеют следующий приоритет операций.

Not

*, /, div, mod, and

+,-, or, xor

=, <>, <, >, <=, >=


Лекция 10.

Типы данных в Turbo Pascal .

Тип данных- это множество величин, объединенных совокупностью допустимых операций.

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

В языке Turbo Pascal существует развитая система стандартных (описанных в модуле System) типов. Кроме того, пользователь может сам создать свой собственный тип, используя служебное слово Type. Формат записи нового типа, определенного пользователем следующий:

Type <имя типа>=<описание типа>;

Рассмотрим стандартные типы.

Типы данных Turbo Pascal.

Простые(скалярные)     Структурированные:

Порядковые:  Вещественные   строковый- string

Целые        регулярный- array

логический        записи- record

символьный       множества- set

перечисляемые       файлы-file, text

интервальный

К скалярным типам данных относятся типы, которые не содержат составных частей.

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

Целые типы- представляют собой совокупность данных, которые могут быть использованы в арифметических выражениях и занимают в памяти от 1 до 4 байт.

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

типа

Диапазон

Требуемая

память

Byte

[0..255]

1

Word

[0..65535]

2

Shotint

[-128..127]

1

Integer

[-32768..31767]

2

longint

[-2’147’483’648.. 2’147’483’647]

4

Над данными целого типа определены следующие арифметические операции:

+, -, *, div, mod. Результатом всегда является целое число.

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

<, >, <=, >=, <>, =.

Char - символьный тип, представляет собой набор символов кодовой таблицы ASCII. Во внутреннем представлении он занимает 1 байт, множество значений этого типа фиксировано и упорядочено. Все символы считаются перенумерованными, от 0 до 255.

Константой символьного типа является один из допустимых символов, взятый в апострофы. Если апостроф сам является символом, то  апостроф, являющийся значением константы, записывается дважды, например   ‘7’ ,  ‘+’ , ‘F’ , ‘’’’ , ‘j’ , ‘?’ . 

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

Зам! В таблицы ASCII прописаны сначала управляющие символы, затем специальные, потом идут цифры, латинские заглавные, потом маленькие буквы, русские заглавные, русские маленькие буквы.

Пример.  ‘A’<’a

 ‘5’<’b

  5 <’b’-НЕДОПУСТИМО!

 ‘A’<’A

часто, при работе с символьным типом, применяются следующие стандартные функции:

chr(x)- преобразует выражение типа byte в символ, соответствующий выражению по коду.

Chr(65)-‘A

Chr(7)- писк

ord(ch)- возражает ASCII- код символа

ord(‘A’)=65

ord(‘A’)=128

pred(ch)- возвращает предыдущий ch символ

pred(‘5’)=’4’

pred(‘a’)=’Z’

pred(‘о’)=’н

pred(‘9’)=8 НЕДОПУСТИМО!

succ(ch)- возвращает следующий за ch символ.

Boolean - логический тип, определяет диапазон логических значений, который содержит два элемента False (ложь) и True (истина). Во внутреннем представлении он занимает 1 байт. Применяется в операциях отношения и логический операциях. Над данными типа можно производить операции сравнения.

False<True

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

При явном описании типу дается имя, в разделе описании типов. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками, например:

Type gaz=(ge,h,o,n);

Metal=(fe, zn, li);

Var  a,b,c: gaz;

D,I,g:metal;

Переменные a,b,c могут принимать только значения ge,h,o,n. Попутка присвоить любое другое значение вызовет ошибки.

Анонимно(без имени) описанный тип :

Var season:(winter, summer);

Идентификатор season- это имя переменной. Значения, которые может принимать данная переменная это winter, summer

Для переменных одного и того же перечисляемого типа определены операции отношения. Сравнение происходит по порядковым номерам в списке описания типов или переменных.

Например, winter< summer

 Или

 A:= ge;

 B:=o;

 A<B-true

Тип-диапазон(интервальный) - подмножество своего базового типа, в качестве которого может быть любой порядковый тип, кроме типа-диапазон. Тип- диапазон задается границами своих значений внутри базового типа
<минимальное значение> . .<максимальное значение>

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

Пример:    Type month = 1 ..12;

                                lat = ’a’ .. ’z’;

 var mo: month;

  a,b:lat;

Переменные  mo может принимать любые значения из диапазона 1..12, a,b из ’a’ .. ’z’. Выход из диапазона приведет к программному прерыванию.

Вещественный тип, строго говоря, имеет конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественного числа настолько велико, что сопоставить с каждым из них целое число  не представляется возможным . Во внутреннем представлении он занимает от 4 до 10 байт, диапазон возможных значений - от 1.5E-45 до1.1E4932, точность представления данных - 7..20 значащих цифр.

 Вещественные числа

Тип

Диапазон

Знач. цифры

Размер в байтах 

Real

Single 
Double 
Extended

2.9Е-39 ..1.7Е+38

1.5E-45 .. 34E38 
5E-324 .. 1.7E308 
1.6E-4951..1.1E4932

11-12

7-8 
15-16 
19-20

6



10

Вещественные цифры могут изображаться в привычном для нас виде 2,30  3,65  0,25 и виде с плавающей запятой- число вида <мантисса> Е<порядок>. Мантисса- число по модулю, меньше 1, порядок любое целое число.

7,32= 0,732 Е 1  0,023=0,23 Е-1

Над вещественными числами определены операции отношения и  следующие арифметические операции: *,+,-,/.  

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

Лекция 11.

Задачи: 

Справедливы ли следующие утверждения?

Если с є char и ‘0’<c<’9’, то с- цифра

‘0’=0

‘f’=’F’

succ(‘0’)=pred(‘2’);

Вычислить значения:

Pred(‘7’)=’6’

Ord(‘A’)-ord(‘0’)=65-48=17

Succ(0)=1

Chr(ord(‘5’)+1)=’6’

Имеется литерная переменная с и логическая переменная t, присвоить переменной t true, если выполнится заданное условие и false, если условие не выполняется.

С- литера*

С- литера ‘a’ или’q

C- заглавная латинская буква

С- цифра

Определить значение литерной переменной d после выполнения операторов:

C:=’1’; d:=c;

C:=’1’; d:=’c’;

Имеются описание типов и переменных:

Type season=(win, spr, sum, out);

Var x,y: season;

t:(heat, cold)

Можно ли присвоить?

X:=leto;

X:=win; y:=sum;

T:=out;

X:=y;

T:=x;

Верно ли, что

Sum>spr

Sum=out

win<=out

succ(sum)= out

Верно ли описаны типы:

Bukva=(‘a’, ‘b’, ‘c’, ‘d’)

Glasnya=(a, i, o, e, y,)

Soglesnaya=(b..d, f, g)

Logiski=Boolean;

digitC=’0’..’9’

digitN=0..9

const n=180;  type ugol=-n..n;

Стандартные функции Turbo Pascal. 

В зависимости от типа данных для переменных могут быть определены следующие стандартные функции:

Вызов функции

Тип аргумента

Тип результата

Назначение

 Abs(x) 

целый вещественный 

целый вещественный 

Возвращает абсолютное значение x 

Pi 

вещественный 

Возвращает значение числа ПИ 

Sin(x) 

целый вещественный 

вещественный 

Возвращает синус x радиан 

Cos(x) 

целый вещественный 

вещественный 

Возвращает косинус x радиан 

ArcTan(x) 

целый вещественный 

вещественный 

Возвращает арктангенс x радиан 

Sqrt(x) 

целый вещественный 

вещественный 

 Возвращает квадратный корень из x>=0 

Sqr(x) 

целый вещественный 

целый вещественный 

Возвращает значение квадрата x 

Exp(x) 

целый вещественный 

вещественный 

Возвращает значение e в степени x 

Ln(x) 

целый вещественный 

вещественный 

Возвращает натуральный логарифм x, x>0 

Trunc(x) 

вещественный целый 

целый 

Возвращает целую часть значения x 

Frac(x) 

вещественный целый 

вещественный 

Возвращает дробную часть значения x  

Int(x) 

вещественный целый 

вещественный 

Возвращает целую часть значения x 

Round(x) 

вещественный целый 

целый 

Округляет x до ближайшего целого 

Odd(x) 

целый 

логический 

Проверяет нечетность значения x , истина если х- нечетный

Ord(x) 

порядковый 

целый 

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

Chr(x) 

символьный 

целый 

Возвращает символ с заданным порядковым номером x 

Pred(x) 

порядковый 

порядковый 

Возвращает предшествующее значение x 

Succ(x) 

порядковый 

порядковый 

Возвращает последующее значение x 


Лекция 12.

Тождественность и совместимость типов.

Для того, чтобы в программе не получилось путаницы с величинами разных типов нужно правильно применять понятия тождественности и совместимости типов.

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

Type

M1, M2= array [1..9] of real

S=array[1..9] of integer;

M1,M2 - тождественные типы

M1,S- не - тождественные типы.

Тождественность требуется при замене формальных параметров на фактические в процедурах и функциях. Например, abs(x), где х- целое или вещественное число, мы не можем поставить abs(x), если х- символьная или булевская переменная.

Огромную роль в выражениях и операциях сравнения, операторе присваивания играет совместимость типов.

В операциях сравнения два типа являются совместимыми, если соблюдается хотя бы одно из условий:

Оба типа одинаковые

Оба типа вещественные

Оба типа целые

Один тип является поддиапазоном другого

Оба типа поддиапазоны одного и того же типа

Один тип строковый, другой символьный

Например, ‘a’>’3’-допустимо   ‘a’>3- недопустимо!!!

В операции присваивания два типа совместимы, если выполняется хотя бы одно из условий:

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

Первый строковый, второй литерный

Первый вещественный, второй целый

Например,

Var  a: integer;

B: real;

C: char;

S: string;

A:=b;- НЕЛЬЗЯ!

B:=a;

C:=s; - НЕЛЬЗЯ!

S:=c;

A:=s; - НЕЛЬЗЯ!


Лекция 13.

Ввод-вывод данных в Turbo Pascal 

Ввод данных- передача информации от внешних устройств в ОП.

Вывод данных- обратный процесс, передача информации из ОП на внешние устройства.

Для ввода- вывода данных в Turbo Pascal существуют 4 процедуры:

Read, Readln

Write, Writeln

Процедура Read обеспечивает ввод данных с клавиатуры в ОП. Формат записи процедуры:

Read(х1, х2, х3…хn)-позволяет ввести в ОП значения переменных х1, х2, х3…хn.

При выполнении процедуры Read компьютер приостанавливает свою работу и ждет ввода значений указанных переменных. Значения набираются с клавиатуры через пробел. Ввод всех значений списка, заканчивается нажатием клавиши Enter.

Зам! Ввод данных производится в строгом соответствии с описанием.

Пример,

Var  C: char;

       T: integer;

        D:real;

….

Read(d,t,c);   И ВВОДИМ ДАННЫЕ: ю 64000 34

Возникнет ошибка выполнения программы, так как d- переменная типа  real и мы не имеем права вводить символ «ю», кроме того, значение переменной Т выходит за диапазон значений типа.

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

Read(x,y);

Read(z,d,f);

Если введем данные 1 2 3

        4 5 6

то получим x=1, y=2, z=3, d=4, f=5.

Оператор readln отличается от оператора read только тем, что после считывания последнего в списке значения для одного оператора readln, данные для следующего оператора считываются с новой строки.

Readln(x,y);

Readln(z,v);

 Если введем  2 4 6 7

     3 9

то получим в памяти x=2, y=4, z=3, v=9.

Примечание, по возможности, показать все на компьютере при помощи Debug Watch.

Оператор вывода имеет следующий формат записи

Write(<список вывода>) ;

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

Фрагмент программы

На экране.

Write(7);

7

Write(‘привет’);

привет

Const n=10;

Write(n);

10

Var x: byte;

….

X:=5;

Write(x);

5

Const n=15;

Var x: word;

….

X:=10;

Write(x+n);

15

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

X:=4;

Y:=5;

Z:=7;

Write(x,y,z);

На экране 457.

Чтобы «отделить» числа друг от друга можно выводить пробелы- Write(x,’ ‘,y,’ ‘,z,’ ‘); или использовать форматы вывода.

Формат вывода определяет представление информации на экране и записывается в списке вызова через двоеточие.

Write(x:r)- значение х выводится в крайние правые позиции поля шириной R.

X:=14;

Write(x:5);

НА экране _ _ _ 14

Наш пример можно записать Write(x:2,y:3,z:4).

НА ЭКРАНЕ: _ 4_ _5_ _ _ 7

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

Пример,

Const n=0.2;

write(n);

НА ЭКРАНЕ: 2.0000000Е-01

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

Write(x:r:w)- значение х выводится  крайние правые позиции  поля шириной R, причем W знаков отводится под дробную часть.

write(n:6:2);

НА ЭКРАНЕ: _ _ _ _0.2 0

Оператор Writeln  работает так же как и оператор Write, только после вывода всего списка он передает курсор на следующую строку.

Пример,

X:=3;

Y:=x/2;

Z:=x*2;

Write(‘x=’,x);

Write(z:2, y:4:2)

НА ЭКРАНЕ: х=3_ 6_ 1 ,50

X:=3;

Y:=x/2;

Z:=x*2;

Writeln(‘x=’,x);

Writeln(z:2, y:4:2)

НА ЭКРАНЕ:  х=3

_ 6_ 1 ,50

Управление символьным выводом на экране.

Использование программистом только процедур Write, Writeln дает очень слабые возможности для управления расположением данных на экране. Дополнительные возможности управления дают процедуры и функции модуля CRT.Чтобы воспользоваться ими, необходимо подключить модуль- USES CRT.

Рассмотрим основные процедуры и функции модуля:

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

Для установки курсора в нужную позицию существует процедура: Gotoxy(x,y) , где х,у- переменные типа Byte.

Clrscr- очистка экрана

TextBackGround(color)- устанавливает цвет фона, который задается переменной color типа Word или постоянной.

TextColor(color)- устанавливает цвет текста, который задается переменной color типа Word или постоянной.

Цвет

Константа

Код

Черный

Black

0

Синий

Blue

1

Зеленый

Green

2

Бирюзовый

Gyan

3

Красный

Red

4

Розовый

Magenta

5

Коричневый

Broun

6

Светло-серый

LightGray

7

Темно-серый

DarkGray

8

Светло-синий

Light Blue

9

Светло-зеленый

Light Green

10

Светло-бирюзовый

Light Gyan

11

Светло-красный

Light Red

12

Светло-розовый

Light Magenta

13

Желтый

Yellow

14

Белый

White

15

KeyPressed- функция, которая принимает значение True, если нажата любая клавиша и False в противном случае.

Delay(х)-процедура которая задерживает выполнение программы на х мсек.


Лекция 14.

Что выведет данная программа?

Program _;

Const n=0.5

Var x,y:real;

      Z:byte;

Begin

Write(‘введите x,y ’);

Read(x,y);

Z:=10;

Writeln(‘результат=’);

Write(x+y-z:10:2)

end.

Если с клавиатуры вводим 5 6 7

Program _;

Const n=8,8;

M=10;

begin

Writeln(‘пример’);

Write(‘n’);

Writeln(n);

Write(‘m’);

Writeln(m:5);

end.

Операторы Turbo Pascal. Простые операторы. Составной.

Оператор-предложение ЯП, задающее полное описание некоторого действия, которое необходимо выполнить.

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

К простым операторам относятся:

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

Go to

Пустой

Оператор вызова процедуры

Оператор присваивания обозначается := . Имеет следующий формат записи

<имя переменной>:=<выражение>;

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

Зам! На месте выражения может стоять переменная, постоянная.

Пустой оператор служит для синтаксических целей и не выполняет никаких действий.

Оператор вызова процедуры служит для активации процедуры, предварительно описанной пользователем или стандартной.

Пример,

Clrscr - вызов стандартной процедуры модуля CRT

Input(a,b) – вызов процедуры пользователя

Оператор безусловного перехода (go to) применяется в случаях, когда после выполнения какого- либо оператора нужно выполнить не следующий по порядку, а какой- то помеченный меткой оператор.

Зам! Метка должна быть описана!

Пример,

Ptogram _;

label m1,m2;

begin

goto m1;

m1: <операторы>;

end.

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

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

Дома: построить диаграмму, отображающую связь операторов.

   Операторы

Простые      Структурные

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

Go to

Пустой

Оператор вызова процедуры

Условные(if, case)

Циклические(for, while, repeat)

Составные(begin…end)


Лекция 15.

Условный оператор IF.

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

Оператор If осуществляет выбор из двух альтернатив (одна из которых может быть пустым оператором) и имеет в общем случае следующий формат записи:

If < условие> then <оператор 1>

           else <оператор 2>;

Записанный таким образом оператор If называется полным.

На месте условия может стоять:

Любая переменная булевского типа

Любое выражение отношения

Любое логическое выражение

Зам! Результат условия всегда принадлежит булевскому типу.

На месте операторов может стоять любой оператор Turbo Pascal.

Оператор If  выполняется следующим образом:

Вычисляется выражение, стоящее на месте условия.

Если полученное значение истина(True) выполняется оператор1, идущий за словом then, если значение ложно (False) то выполняется оператор2, следующий за служебным словом else.

Пример,

Найти ошибку в записи оператора:

If x-5 tnen write(‘*’) else write(‘!’);

If x>y then x else write(‘!!!’);

If x=y then write(‘!’);

Оператор If может быть записан в неполной форме:

If <условие> then <оператор>;

Оператор выполняется в том случае, если условие истинно (True).

Задачи:

Определить, является ли введенное число четным.

Program _;

Uses CRT;

Var x:integer;

Begin

ClrScr;

Writeln(‘введите число’);

Readln(x);

If x mod 2=0  then writeln(x,‘-четное число’)

  Else writeln(x,‘-не четное число’);

Readkey;

End.

Найти наибольшее из двух чисел.

Program _;

Uses CRT;

Var x, y:integer;

Begin

ClrScr;

Writeln(‘введите два числа’);

Readln(x, y);

If x =y  then writeln(‘числа равны’)

  Else if x>y  then writeln(x,‘больше’)

Else writeln(y,‘больше’);

Readkey;

End.

Найти наибольшее из трех чисел.

Program _;

Uses CRT;

Var x, y, z, max:integer;

Begin

ClrScr;

Writeln(‘введите три числа’);

Readln(x, y, z);

If (x=y) and (y=z) then writeln(‘все числа равны’)

    Else

begin

Max:=x;

If y>max  then max:=y;

If z>max  then max:=z;

writeln(‘наибольшее=’, max);

end;

Readkey;

End.

Вычислить:

Program _;

Uses CRT;

Var x, y:real;

Begin

ClrScr;

Writeln(‘введите аргумент’);

Readln(x);

If x>10  then y:=23

  Else y:=sqr(x);

writeln(‘значение функции=’, y:10:2);

Readkey;

End.

  

Program _;

Uses CRT;

Var x, y:real;

Begin

ClrScr;

Writeln(‘введите аргумент’);

Readln(x);

If x<0  then y:=x-12

  Else if x>5  then y:=1/x

Else y:=1+3*x;

writeln(‘значение функции=’, y:10:2);

Readkey;

End.

Зам! На месте любого оператора может стоять еще один условный оператор, в том числе и не полный. Например,

If <усл1> then <оп.1> if <усл2> then <оп2> else <оп3>

Возникает синтаксическая неоднозначность: к какому оператору относится служебное слово else.  

Правило: служебное слово else всегда относится к ближайшему по тексту служебному слову If, не связанному со служебным словом else.


Лекция 16.

Оператор выбора Case.

Оператор  Case может обеспечить выбор не только из двух альтернатив, а из произвольного количества.

Оператор имеет следующий формат записи:

Case <выражение> of

<значение выражения>:<оператор1>;

< значение выражения >:< оператор2>;

< значение выражения >:< оператор n>

else < оператор n+1>;

end;

На месте <выражения> может стоять любое выражение порядкого типа.

На месте < значение выражения> может стоять любая постоянная этого типа.

На месте операторов может стоять любой оператор Turbo Pascal.

Зам! Оператор Case всегда заканчивается служебным словом End.

Оператор Case выполняется следующим образом:

Вычисляется выражение, стоящее после слова Case.

Просматривается список значений выражения, если вычисленное значение найдено в списке, то выполняется оператор, помеченный этим значением.

Если в списке нет вычисленного значения, то выполняется оператор, стоящий после слова Else, если же нет служебного слова Else, то действие передается следующему за Case оператору.

На блоксхеме оператор изображается следующим образом:

Задачи:

По введенному числу написать день недели, соответствующий ему.

Program _;

Uses CRT;

Var x:1..7;

Begin

ClrScr;

Writeln(‘введите номер дня недели);

Readln(x);

Case x of

1: writeln(‘понедельник’);

2: writeln(‘вторник’);

3: writeln(‘среда’);

4: writeln(‘четверг’);

5: writeln(‘пятница’);

6: writeln(‘суббота’);

7: writeln(‘воскресенье’);

end;

Readkey;

End.

Написать программу, которая по введенному числу К от 1 до 99 пишет фразу: «Мне К лет». Причем, при необходимости слово лет заменять на  года, год. Например, «мне 1 год», «мне 2 года», «мне 5 лет».

Program _;

Uses CRT;

Var k:byte;

Begin

ClrScr;

Writeln(‘введите свой возраст);

Readln(k);

Write(‘мне ’, k);

If (k>=10) and (k<=15) then writeln(‘ лет’)

     Else

Case k mod 10 of

1: writeln(‘год);

2, 3, 4: writeln(‘года);

else 3: writeln(‘лет’);

end;

Readkey;

End.


Лекция 17.

Циклические операторы Turbo Pascal. 

Если в программе возникает необходимость неоднократно выполнить некоторые операторы, то используются операторы повтора (цикла). В языке Паскаль существует три вида операторов цикла: while, repeat, for. Они используются для организации циклов различных типов.

Если число повторений оператора (составного оператора) заранее неизвестно, а задано лишь условие его повторения (или окончания), используются операторы while, repeat. Оператор for используется, если число повторений заранее известно.

Оператор повтора for.

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

Оператор повтора for имеет следующий формат записи:

for <параметр цикла>:= <S1> to          <S2> do <тело цикла >;

for <параметр цикла>:= <S1> downto <S2> do <тело цикла>;

Параметр цикла- переменная любого порядкового типа.

SI и S2 — выражения, определяющие начальное и конечное значения параметра цикла, значение которых принадлежит тому же (или совместимому) порядковому типу, что и параметр;

Тело цикла может быть простым или составным оператором.

Оператор for-to-do (for-downto-do)выполняется следующим образом:

Вычисляются выражения Sl,S2

Осуществляется присваивание <параметр цикла>:=S1

Проверяется условие <параметр цикла><=S2.

Если условие истино, то выполняется тело цикла

Значение управляющей переменной изменяется на +1 (to) или (—1) (downto) и снова проверяется условие <параметр цикла><=S2.

Как только условие нарушено происходит выход из цикла.

На использование управляющей переменной (параметра цикла) в цикле for налагаются следующие ограничения.

В качестве  параметра должна использоваться  простая  переменная, она должна быть описана в текущем блоке.

Управляющая переменная должна иметь порядковый тип.

Начальные и конечные значения диапазона должны иметь тип, совместимый тип с типом управляющей переменной. (Но НЕ вещественный).

В теле цикла запрещается явное изменение значения управляющей переменной (например, оператором присваивания).

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

Оператор while.

Оператор while (пока) часто называют оператором цикла с предусловием за то, что проверка условия выполнения тела цикла производится в начале самого оператора.

Формат записи:

while <условие продолжения повторений> do <тело цикла>;

Условие- булевское выражение, это может быть:

Переменная булевского типа

Выражение отношения

Логическое выражение

Тело цикла — простой или составной оператор.

Оператор While работает следующим образом:

Вычисляется значение выражения-условия.

Если результат равен True, тело цикла выполняется и снова вычисляется выражение условия. Если результат равен False, происходят выход из цикла и переход к первому после while оператору.

Зам! Если в цикле необходимо повторить несколько операторов, то необходимо использовать составной оператор.

Repeat.

Оператор повтора repeat аналогичен оператору while

Формат записи:

repeat

<оператор1>;

….

<операторN>;

until <условие окончания цикла>; 

На месте условие стоит любое выражение булевского типа (переменная, выражение отношения, логическое выражение).

На месте операторов- любой оператор Turbo Pascal. Операторы, заключенные между словами repeat и until, являются телом цикла.

Оператор работает следующим образом:

Вначале выполняется тело цикла

Проверяется условие выхода из цикла.

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

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

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

В следующем фрагменте показано, как оператор repeat используется для ожидания нажатия клавиш Y и N. Нажатие других клавиш будет игнорироваться:

uses Crt;

var YN: char;

begin

repeat

YN:= ReadKey

until Upcase(YN) in ['Y','N'];

end.

Вложенные операторы цикла

Если телом цикла является циклическая структура, то такие циклы называются вложенными. Цикл, содержащий в себе другой цикл, называют внешним, а содержащийся в теле другого цикла, называют внутренним

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

Пример: вывести на экран таблицы умножения(использовать for) program program_Tab_Umnl;

Var I,J : byte;

begin

for i:=1 to 10 do       {Внешний цикл)

  for J:=l to 10 do   {Внутренний цикл}

       Writeln(I,' * ',J,’ = ‘,I*J); {Тело внутреннего цикла}

end.


Лекция 18.

Применение циклических операторов для решения задач.

Задачи:

Вывести на экран все числа от 1 до 50.

Вопросы:

Каким оператором нужно пользоваться при решении задачи?

Можно ли использовать другой?  Решить задачу используя While, Repeat.

Program _;

Uses CRT;

Var i:byte;

Begin

ClrScr;

For i:=1 to 50 do write(i:3);

Readkey;

End.

Program _;

Uses CRT;

Var i:byte;

Begin

ClrScr;

i:=1;

while i<=50 do

begin

 write(i:3);

i:=i+1;

end;

Readkey;

End.

Program _;

Uses CRT;

Var i:byte;

Begin

ClrScr;

i:=1;

repeat  

write(i:3);

i:=i+1;

until i>50;

Readkey;

End.

Вывести на экран таблицу значений функции  

Выполнить для х- целого и для вещественного.

Если х- целое число:

Program _;

Uses CRT;

Var x:byte;

Begin

ClrScr;

For x:=-5 to 5 do writeln(‘для х=’, x:3, ‘y=’ , x*x:5);

Readkey;

End.

Если х- вещественное число (с шагом 0.3):

Program _;

Uses CRT;

Var x:real;

Begin

ClrScr;

x:=-5;

while i<=5 do

begin

 write(‘для х=’, x:3, ‘y=’ , x*x:5);

x:=х+0.03;

end;

Readkey;

End.

Вычислить сумму N натуральных чисел.

Program _;

Uses CRT;

Var i, N:byte;

Sum: word;

Begin

ClrScr;

Sum:=0;

Writeln(‘введите N’);

Readln(N);

For i:=1 to n do sum:=sum+i;

Writeln(‘сумма=’, sum)

Readkey;

End.

Вычислить произведение N натуральных чисел.

Program _;

Uses CRT;

Var i, N:byte;

p: real;

Begin

ClrScr;

p:=1;

Writeln(‘введите N’);

Readln(N);

For i:=1 to n do p:=p+i;

Writeln(‘произведение=’, p:10:2)

Readkey;

End.

Подсчитать количество чисел, кратных трем в интервале (а,б)

Program _;

Uses CRT;

Var i, a, b, kol: word;

Begin

ClrScr;

kol:=0;

Writeln(‘введите интервал (a<b)’);

Readln(a, b);

For i:=a to b do

If I mod 3=0 then kol:=kol+1;

Writeln(‘количество =’, kol)

Readkey;

End.

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

       

Program _;

Uses CRT;

Var a, i:integer;

N:word;

stepen: real;

Begin

ClrScr;

stepen:=1;

Write(‘введите число а=’);

Readln(a);

Write(‘введите степень n=’);

Readln(n);

For i:=1 to n do stepen:= stepen *a;

Writeln(‘a^n=’, stepen:10:2);

Readkey;

End.

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

Program _;

Uses CRT;

Var N, Sum:byte;

Begin

ClrScr;

Sum:=0;

repeat

Writeln(‘введите число’);

Readln(N);

sum:=sum+N;

until sum>100;

Writeln(‘сумма=’, sum)

Readkey;

End.

Дома:

Дано целое число, определить является ли оно простым?


Лекция 20.

Массивы.

С понятием массива  приходится  сталкиваться при решении научно-технических и экономических задач.

Массив- это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.

Массив- совокупность данных одного типа.

Элементами массива могут быть данные любого типа: стандартного или пользовательского. Этот тип называется базовым типом массива.

Для описания массива предназначено словосочетание Array of (массив из).

Массив можно описать в разделе типов задав новый тип :

  1.  Type

<Идентификатор типа>=array[тип индекса]of<тип элемента>;
Var <идентификатор переменной>:<идентификатор типа>

Или в разделе переменных, используя стандартный тип Array

  1.  Var 

<идентификатор переменной>:array[тип индекса]of <тип элемента>;

Пример:

Const n=7;

Type

Vector=array [1..10] of byte;

Matrix=array [1..4,1..5] of real;

Var

A,B: vector;

C: matrix;

D: array [1..n] of char;

Элементы массива располагаются в памяти последовательно, причем элементы с меньшими индексами хранятся в более низких адресах памяти.

Действия над массивами.

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

Пример:

Var A,B: array [1..5] of real;

………

a:=b- все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В не изменяется.

Действия над элементами массива.

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

А[i], где А-имя массива, i-индекс массива- общее обращение к элементам одномерного массива.

A [i,j]- где А-имя массива, i,j-индексы массива- общее обращение к элементам двумерного массива.

А[i], A [i,j]- это индексированные элементы массива или индексированные переменные. Которые могут быть использованы как обычные переменные в выражениях, операторах.

Чтобы работать с массивом, необходимо каким-то образом задать значения для элементов массива. Это можно сделать несколькими способами: при помощи инициализации, заполнить массив по формуле, ввести с клавиатуры, задать случайным образом.

Инициализация массива.

Инициализация массива (задание первоначальных значений)- присваивание каждому элементу массива одного и того же значения.

Рассмотрим на примере:

. . . . . . .

var a: array [1..5] of real;

   b: array [1..3,1..5] of integer;

   i,j:byte;

. . . .

    {инициализация одномерного массива}

    for i:=1 to 5 do a[i]:=5;

    {инициализация двумерного массива}

    for i:=1 to   3 do

        for j:=1 to 5 do

            b[i,j]:=1;

. . . . . . . . .

Заполнения массива по формуле.

Задача. Заполнить одномерный массив так, чтобы каждый его элемент равнялся утроенному квадрату индекса.

. . . . .

var a: array [1..5] of integer;

   b: array [1..3,1..5] of integer;

   i,j:byte;

. . . . .

    {заполнение по формуле одномерного массива}

    for i:=1 to 5 do a[i]:=3*sqr(i);

Дома: заполнить двумерный массив 3х6 по следующей формуле: каждый элемент равен разности квадратов индексов строки и столбца.

for i:=1 to   3 do

        for j:=1 to 5 do

            b[i,j]:=sqr(i)-sqr(j);

Задание массивов случайным образом.

Вспомним некоторые процедуры и функции модуля CRT:

Random- функция, результатом которой является случайное действительное число в интервале от 0 до 1.

Random(i), где i положительное число (word)- функция, результатом которой является случайное целое число в интервале от 1 до i.

Randomize- процедура, которая изменяет базу генератора случайных чисел.

Задание одномерного массива случайными действительными числами от 0 до 1 рассмотрим на примере.

Uses crt;

. . .

var b: array [1..3,1..5] of real;

   i,j:byte;

. . . . . .

    Randomize;

    {заполнение двумерного массива случайным образом}

    for i:=1 to   3 do

        for j:=1 to 5 do

            b[i,j]:=random;

. . . . .

Дома: заполнить одномерный массив, размер которого равен 10, случайными числами от 5 до 35.

Uses crt;

. . . . .

var a: array [1..5] of integer;

   i,j:byte;

. . . . . .

    Randomize;

    {заполнение одномерного массива случайными числами от 5 до 35 }

    for i:=1 to 5 do a[i]:=5+random(30);


Лекция 21.

Ввод массива с клавиатуры.

Ввести массив с клавиатуры- это значит ввести каждый его элемент. Рассмотрим ввод одномерного массива А, размер которого равен n. В общем виде массив можно записать следующим образом:

А(a[1],a[2],a[3],…a[n])     

Алгоритм ввода одномерного массива можно записать так:

  1.  Запросить ввод первого элемента. Ввести первый элемент.
  2.  Запросить ввод второго элемента. Ввести второй элемент.

. . . . . .

n. Запросить ввод n-го элемента. Ввести его.

  Данный алгоритм не удобен и рациональнее преобразовать его в следующий:

 Для i:=1 до n повторять

 Нач

  Вывод(‘введите a[’,i,’]’);   

Ввод(a[i]);

 Кон;

На Turbo Pascal он будет выглядеть следующим образом

Var a: array [1..n] of integer;

   I: integer;

. . . . . .

{алгоритм ввода одномерного массива}

For i:=1 to n do

Begin

 Writeln(‘введите а[’,I,’]’);

 Readln(a[i]);

 End;

Аналогичным образом запишется алгоритм ввода двумерного массива:

Var a: array [1..n,1..m] of real;

   I,j: integer;

. . . . . .

{алгоритм ввода двумерного массива}

For i:=1 to n do

 For j:=1 to n do

Begin

 Writeln(‘введите а[’,i,’,’,j,’]’);

 Readln(a[i,j]);

End;

Вывод массива.

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

По аналогии с алгоритмом ввода, алгоритм вывода одномерного массива будет иметь вид:

Var a: array[1..n] of integer;

      I: integer;

….

{алгоритм вывода одномерного массива }

for i:=1 to n do

write(a[i],’ ‘);

Оператор Write позволяет выводить элементы массива в строку через пробел. При выводе элементов массива следует обратить внимание на тип элементов массива, для элементов действительного типа следует указать формат вывода. Например, write(a[i]:10:2).

Алгоритм вывода двумерного массива аналогичен, но следует обратить внимание на то, что выводить массив необходимо по строкам. Т.е. для каждой строки нужно:

  •  Вывести элементы как в одномерном массиве.
  •  Перевести курсор на новую строку.

Тогда алгоритм будет выглядеть следующим образом:

Var a: array [1..n,1..m] of real;

   I,j: integer;

. . . . . .

{алгоритм вывода двумерного массива}

For i:=1 to n do

 begin

   For j:=1 to n do Write (a[i,j]:10:2);

Writeln;

 End;

Дома:

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


Лекция 22.

Основные задачи по теме.

На пошлых занятиях мы разобрали алгоритмы ввода, задания и вывода массивов. Сегодня рассмотрим основные задачи обработки массивов.

Задачи:

Найти наибольший элемент одномерного массива А8 введенного с клавиатуры.

Найти сумму, произведение всех элементов двумерного массива An x m, заданного случайным образом. Элементы массива находятся в (0;1)

Найти количество четных элементов массива A5, заданного по формуле a[i]=5i2

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

Замечание! Первоначально обязательно нужно положить в max элемент массива.

program _;

const n=8;

type vector=array [1..n]of integer;

var a:vector;

   I,max:integer;

begin

{алгоритм ввода одномерного массива}

For i:=1 to n do

Begin

Writeln(‘введите а[’,I,’]’);

 Readln(a[i]);

End;

{нахождение наибольшего}

max:=a[1]  ;

for i:=2 to n do

   if a[i]>max then max:=a[i];

writeln('max=',max);

readln;

end.

Для решения второй задачи, необходимо завести две переменные: для суммы-S и для произведения-Р.

program _;

uses crt;

const n=6;

     m=3;

var a:array [1..m;1..n] of real ;

   I,j:integer;

S,p:real;

Begin

Randomize;

{ задание массива}

For i:=1 to m do

 For j:=1 to n do

          A[I,j]:=random;  

{нахождение суммы}

s:=0;

for i:=1 to m do

 for j:=1 to n do

 s:=s+a[I,j];

{нахождение произведения}

p:=1;

for i:=1 to m do

 for j:=1 to n do

 p:=p*a[I,j];

writeln(‘сумма всех элементов =’,s:10:5);

writeln(‘произведение всех элементов =’,p:10:5);

readln;

end.

Для решения задачи необходимо завести переменную, в которой будет лежать количество черных элементов- Kol

program _;

const n=5;

var a:array [1..n] of integer ;

   I, kol:integer;

begin

{ задание массива}

For i:=1 to m do

          A[I,j]:=5*sqr(i);  

{нахождение количества четных}

Kol:=0;

for i:=1 to m do

 if a[i] mod 2=0 then kol:= kol+1;

writeln(‘количество четных элементов =’,kol);

readln;

end.

Дома:

Найти минимальный элемент двумерного массива В2х5.

Дан массив А 30. Найти сумму всех четных элементов массива и произведение всех отрицательных.

Найти в массиве А3 х9 количество элементов из (10;20).


Лекция 23.

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

Сортировка массива- это упорядочение элементов массива по возрастанию или убыванию. Существуют несколько способов сортировки. Мы рассмотрим только два.

Линейная сортировка массива по возрастанию.

Пусть дан массив А(3  8  2  1  7 )

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

Т.О. получим массив: А(1  8  2  3  7 )

Далее будем просматривать массив, начиная со второго элемента. Если найдется элемент меньше второго, то  меняем их местами.

Т.О. получим массив: А(1  2  8  3  7 )

Далее будем просматривать массив, начиная с третьего элемента. Если найдется элемент меньше третьего, то  меняем их местами.

Т.О. получим массив: А(1  2  3  8  7 )

Продолжаем процедуру, пока не дойдем до элемента под номером N-1, где N-размер массива.

В итоге получим массив А(1  2  3  7  8 ).

Итак, чтобы написать программу на Turbo Pascal нам понадобятся два циклических оператора FOR с параметрами

I-определяет «рабочую часть»

J- для работы в «рабочей части», обращения к каждому элементу

Для того чтобы поменять элементы местами, используем следующий алгоритм:

    begin

         r:=a[i];

         a[i]:=a[j];

         a[j]:=r;

    end;

Где r- переменная для временного хранения значения a[i];

Для краткости не будем вводить массив с клавиатуры, а объявим его как постоянную.

Текст программы:

Program _;

Uses crt;

Сonst n=5

Type vector=array [1..n] ofinteger;

Const a:vector=(12,8,7,9,0)

Var i,j,r:integer;

Begin

clrscr;

{вывод массива}

   for i:= 1 to 5 do write(a[i],' ');

{сортировка методом отбора}

writeln;

for i:=1 to N-1 do

For j:=i+1 to n do

   if a[j]<a[i] then

    {меняем местами}

    begin

         r:=a[i];

         a[i]:=a[j];

         a[j]:=r;

    end;

печатаем новый массив}

textcolor(5);

for i:= 1 to 5 do write(a[i],' ');

readln;

End.

Сортировка методом пузырька.

Это один из самых популярных методов сортировки, основан на том, что в процессе сортировки более «легкие» элементы массива постепенно «всплывают». Особенностью этого метода является сравнения элемента не со всеми, а только с соседними.

Пуст имеем массив А(3  6  5  4  7)

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

Т.О. получаем массив А(3  4  6  5  7)

Далее просматриваем массив, начиная с третьего. И меняем соседние элементы, если правый меньше левого.

Т.О. получаем массив А(3  4  5 6 7)

Продолжаем просматривать массив до последнего элемента.

Чтобы запрограммировать данный алгоритм на Turbo Pascal, используем два цикла FOR, первый с параметром I-отделяет «рабочую часть», второй for j:=…downto… чтобы работать внутри рабочей части, сравнивать соседние элементы. Сам массив опишем как типизированную констану.

Program _;

Uses crt;

Type vector=array [1..5] of byte;

const a:vector=(34,7,1,7,2)

Var i,j,r:integer;

Begin

clrscr;

{вывод массива}

textcolor(15);

for i:= 1 to 5 do write(a[i],' ');

{сортировка методом пузырька}

writeln;

for j:=2 to 5 do

For i:=5 downto j do

   if a[i]<a[i-1] then

    {меняем местами}

    begin

         r:=a[i];

         a[i]:=a[i-1];

         a[i-1]:=r;

    end;

{печатаем новый массив}

 textcolor(5);

for i:= 1 to 5 do write(a[i],' ');

 readln;

End.

Дома:

  •  Просмотреть другие методы сортировки. Подготовить доклады. (Каждый!)
  •  Повторить задачи лекции 3 по теме «массивы»


Лекция 24.

Итоговое занятие по массивам.

1 урок пары- доклады на темы «Сортировка массивов»

2 урок пары- зачет по вариантам


Лекция 25.

Строки в Turbo Pascal 

Строка- это последовательность символов кодовой таблицы ASCII.

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

Writeln(‘сумма=’,s);

 стр.постоянная

Строковые переменные должны быть описаны. Определить переменную строкового типа можно, используя стандартный тип (string) или пользовательский.

1. Var <имя перем.>: string[длина стр.];

2. type <имя типа>=string[длина стр.];

    var <имя перем.>:<имя типа>;

Зам! Длина строки указывает сколько символов может содержать строка, это обязательно целое число, [длина стр.] является необязательным параметром и может отсутствовать, тогда длина строки по умолчанию 255 символов.

Пример,

Const

Adres=’’;

N=20;

Type

Stroka=string[n];

Var

A,b:stroka;

Z:string[5];

S:string;

Строка- это цепочка символов. Для хранения в памяти для строки длиной N необходимо N+1 байт. N байт хранят символы строки, а 1 байт текущую длину строки.

Пример,

Var s: string[10];

s:=’мама’;

...

4

м

а

м

а

Строковые выражения.

Выражения, в котором операндами являются строки, называется строковым.

Над строковыми операндами допустимы следующие операции:

Сцепления (+).

Применяется для соединения строк в одну.

‘Turbo ’+’ Pascal’  результат ‘Turbo Pascal’

Отношения(<, >, <> )

Две строки равны, если их длины равны и одинаковые символы стоят на одинаковых местах.

Пример,

‘Program’=‘program’- false

‘FAT’=‘FAT’ –true

Если строки имеют равную длину, то они сравниваются слева на право до первого несовпавшего символа, и та строка больше, чей символ имеет больший номер в ASCII.

Пример,

intel’>’Intel

MSDOS’<’MSDos

Строковые процедуры и функции.

Процедура

Действие

Пример

Insert(s1,s2,poz)

Процедура вставки строки s1 в строку s2, начиная с позиции poz

S1:=’Turbo ’

S2:=’язык Pascal’

Insert(s1,s2,6)

Результат-‘язык Turbo Pascal ’

Delete(s,poz,n)

Процедура удаления из строки s n символов, начиная с позиции poz

S:=’клавиатура’

Delete(s,5,5)

Результат: ‘клава’

Str(n,st)

Процедура преобразования числа в строку

Val(st,n)

Процедура преобразования строки в число

Copy(st,poz,n)

Процедура выделения из строки st подстроки длиной n, начиная с позиции poz

St:=’машина’

Copy(st,3,4)

Результат: ‘шина’

Length(s)

Функция определяет длину строки

S:=’мама

N:=length(s)

Результат n=4

Pos(s,st)

Функция определяющая первое вхождение строки s в строку st

St:=’машина

s:= ‘шина

n:=Роs (st, s)

Результат: n=3

UpCase(ch)

Функция заменяющая маленькую латинскую буквы большой.


Лекция 26.

Вопросы:

Что такое строка, как описать.

Какие выражения называются строковыми. Охарактеризовать строковые операции.

Охарактеризовать основные процедуры и функции работы со строками

Основные задачи по теме строки:

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

Program _;

Uses CRT;

Var s: string;

Begin

ClrScr;

Writeln(‘введите строку’);

Readln(s);

Writeln(‘длина строки=’, length(s));

Readkey;

End.

Удалить из строки 4 символа, начиная со 2.

Program _;

Uses CRT;

Var s: string;

Begin

ClrScr;

Writeln(‘введите строку’);

Readln(s);

Delete(s,2,4);

Writeln(‘новая строка=’,s);

Readkey;

End.

Удалить половину введенной с клавиатуры строки.

Program _;

Uses CRT;

Var s: string;

Begin

ClrScr;

Writeln(‘введите строку’);

Readln(s);

Delete(s,length(s) div 2 +1, length(s) div 2);

Writeln(‘новая строка=’,s);

Readkey;

End.

С клавиатуры вводятся две строки, определить является ли первая строка частью второй, если да, то ее обнаружить первое вхождение.

Program _;

Uses CRT;

Var s, st: string;

Begin

ClrScr;

Writeln(‘введите первую строку’);

Readln(s);

Writeln(‘введите вторую строку’);

Readln(st);

If pos(s, st)=0

then writeln(‘строка ’, s, ‘не входит в строку ’, st)

 else writeln(‘строка ’, s, ‘входит в строку ’, st);

Readkey;

End.

В предложении произвольной длины все буквы «а» русского алфавита заменить на «*».

Program _;

Uses CRT;

Var s: string;

Begin

ClrScr;

Writeln(‘введите строку’);

Readln(s);

For i:=1 to length(s) do

If s[i]=’a’ then s[i]:=’*’;

Writeln(‘новая строка=’,s);

Readkey;

End.

В предложении произвольной длины все цифры заменить на «!»

Program _;

Uses CRT;

Var s: string;

Begin

ClrScr;

Writeln(‘введите строку’);

Readln(s);

For i:=1 to length(s) do

If (s[i]>=’0’) and (s[i]<=’9’) then s[i]:=’!’;

Writeln(‘новая строка=’,s);

Readkey;

End.

В предложении произвольной длины посчитать количество латинских букв «а»

Program _;

Uses CRT;

Var s: string;

Kol:byte;

Begin

ClrScr;

Kol:=0;

Writeln(‘введите строку’);

Readln(s);

For i:=1 to length(s) do

If s[i]=’a’ then kol:=kol+1;

Writeln(‘количество букв а=’,kol);

Readkey;

End.

Лекция 27. 

Процедуры и функции пользователя.

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

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

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

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

Параметром называется переменная, которой присваивается некоторое значение в рамках указанного применения.

Различают формальные параметры- параметры, определенные в заголовке подпрограммы, и фактические параметры — параметры, задающие конкретные значения при обращении к подпрограмме. При обращении к подпрограмме ее формальные параметры замещаются фактическими, переданными из главной программы.

Вопросы по написанному:

Что такое подпрограмма. Разновидности подпрограмм.

Что такое вызов подпрограммы.

Как осуществляется работа подпрограммы.

Что такое параметр. Разновидности параметров.

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

Функция- именованная часть программы, которую можно вызвать по имени, возвращающая в точку вызова скалярное значение.

Зам! Функция может входить в выражение как операнд, а процедура НЕТ!

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

Описание процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и, необязательного, заключенного в круглые скобки, списка формальных параметров с указанием типа каждого параметра. Тело процедуры представляет собой отдельный блок, по структуре аналогичный программе:

procedure <имя> (список формальных параметров);

const…;

type …;

var …;

begin                                                             

<операторы>

end;

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

function <имя>   (Формальные параметры)    :   <тип результата>;

const   ...;

type

var       ...;

begin

<операторы>

end;

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

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

Механизм передачи параметров

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

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

параметры-значения;

параметры-переменные

параметры-процедуры

параметры-функции

нетипизированные параметры

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

Между формальными и фактическими параметрами должно быть полное ее соответствие:

• формальных и фактических параметров должно быть одинаковое количество.

•  порядок следования фактических и формальных параметров должен быть один и тот же;

•  тип каждого фактического параметра должен совпадать с типом соответствующего формального параметра.

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

procedure Abort(M: byte);

function Step(N : integer; X : real): real;

Если формальный параметр объявлен как параметр-значение, то:

фактическим параметром может быть произвольное выражение.

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

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

Параметры-переменные(возвращающие). Параметры-переменные используются для возвращения результатов выполнения процедуры и в списке формальных параметров записываются после зарезервированного слова var с обязательным указанием типа.

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

его фактическим параметром может быть только переменная тождественного типа

при вызове процедуры ей передается сама переменная, а не ее копия, и изменение переменой  приводит к изменению фактического параметра в вызывающей программе.

Зам! Параметры-переменные могут использоваться только в процедурах!


Лекция 28.

Вопросы:

Что такое подпрограмма, какие типы подпрограмм вы знаете?

Как вызвать подпрограмму, как осуществляется ее работа?

Что такое параметры, их виды?

Охарактеризовать параметры- значения.

Охарактеризовать параметры- переменные.

Основные задачи по теме подпрограммы:

Написать программу ввода одномерного массива целых чисел размера N, нахождения суммы двух массивов и вывода результата на экран, кроме этого написать процедуру- заставку, очищающую экран, выводящую в центре экрана надпись «Это программа нахождения суммы массивов».

Program _;

Uses CRT;

Const n=10;

Type mas= array[1..n] of byte;

Var a, b, c: mas;

Procedure zast;

Begin

Clrscr;

Randomize;

textcolor(red);

Gotoxy(10,10);

Writeln(‘это задача находит сумму двух массивов’)

Delay(5000);

Clrscr;

End;

Procedure vvod(var x: mas);

Var i: byte;

Begin

For i:=1 to n do x[i]:=random(50);

End;

Procedure vivod(x: mas);

Var i: byte;

Begin

For i:=1 to n do write(x[i]:4);

Writeln;

End;

Procedure sum(x, y: mas; var z: mas);

Var i: byte;

Begin

For i:=1 to n do z[i]:=x[i]+y[i];

End;

{ОСНОВНАЯ ПРОГРАММА}

BEGIN

ZAST;

VVOD(A);

VVOD(B);

SUM(A,B,C);

VIVOD(A);

VIVOD(B);

VIVOD( C );

READKEY;

END.

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

Program _;

Uses CRT;

Var a, b, c: real;

Function sr(x,y:real):real;

Begin

Sr:=(x+y)/2;

End;

{ОСНОВНАЯ ПРОГРАММА}

Begin

Clrscr;

Writeln(‘введите два числа’);

Readln(a,b);

C:=sr(a,b);

Writeln(‘среднее арифметическое =’,c:10:5);

Readkey;

End.

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

Program _;

Uses CRT;

Var a, b, c: real;

Function max(x,y, z:real):real;

Var m:real;

Begin

M:=x;

If y>m then m:=y;

If z>m then m:=z;

Max:=m

End;

{ОСНОВНАЯ ПРОГРАММА}

Begin

Clrscr;

Writeln(‘введите три  числа’);

Readln(a,b, c);

Writeln(‘наибольшее =’,max(a, b, c):10:5);

Readkey;

End.


Лекция 29.

Вопросы:

Что такое параметр. Виды параметров.

Разновидности формальных параметров. Их характеристика.

Задачи:

Определить значение переменных a, b.

Program _;

Var a,b:real;

Procedure vvod(x,y: real);

Begin

X:=5;

Y:=10;

End;

Begin

Vvod(a,b);

End.

Program _;

Var a,b:real;

Procedure vvod(var x,y: real);

Begin

X:=5;

Y:=sqr(5);

End;

Begin

Vvod(a,b);

End.

Определить результат работы данной процедуры:

Procedure unknown (var x,y: real);

Const eps= 0,9;

Begin

X:=0; Y:=0;

Repeat

 Writeln(x:7:5,y:7:5);

 X:=x+0,01;

 Y:=y+0,01;

Until   x+y>=eps;

End;

Определить результат работы данной функции:

Program _;

Const r=2;

Var d: real;

Function f(a,b,c:real):real;

Begin

F:=sqrt(abs(a))+sqr(c-b);

End;

Begin

D:=5+r;

Writeln(f(-36,r*2,d-3):10:5);

 

End.

Program _;

Const m=25;

Var d: real;

Function f(a,b:real):real;

Begin

F:= abs(5*a)+c;

End;

Begin

D:=4;

D:=sqrt(m)-d;

Writeln(f(d*2,10):10:5);

 

End.

Локальные и глобальные переменные.

Область действия идентификаторов.

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

Переменные, расположенные в основной программе, называются глобальными.

Глобальные и локальные переменные могут иметь одинаковые имена, так как им соответствуют разные объекты, но это не рекомендуется из-за возможной путаницы.

Program _;

Var i:byte;

Procedure vivod;

Var i: byte;

Begin

Write(i);

End;

Begin

I:=4;

Vivod;

End.

Найти ошибку: Написать программу, ввода и вывода одномерных массивов, нахождения их суммы.

Program _;

Type m=: array[1..n] of byte

Var a: m;

Procedure vvod (b:m);

Var i: byte;

Begin

For i:=1 to n do

Write (‘введите элемент массива’);

Readln(b[i]);

End;

Procedure vivod;

Begin

For i:=1 to n do

Write(b[i]);

End;

Function sum(b,d:m):m;

Begin

For i:=I to n do

Sum[i]:=b[i]+d[i];

End;

Begin

Vvod(x);

Vvod(y);

Z:=sum(x,y);

Vivod(z);

End.


Лекция 31.

Множества в Turbo Pascal.

Множество- это структурированный тип данных, представляющий собой набор данных, взаимосвязанных по какому-либо признаку или группе признаков объектов.

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

Базовый тип задается диапазоном или перечислением.

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

         ['A', 'C']    [0, 2, 7]    [3, 7, 11..14]. : [1,2,3,4],[‘a’,’b’,’c’,’d’],[‘a’..’я’].

Если множество не имеет элементов, то оно называется пустым и обозначается []

Для описания множественного типа используется словосочетание SET OF (множество из). Множество можно описать как новый тип в разделе type

Type

<Имя типа>=set of<элемент1, элемент 2, элемент3…элемент n>;

var

<идентификатор>:<имя типа>

или описать переменные используя тип set в разделе переменных.

var

<идентификатор>:set of < элемент1, элемент 2, элемент3…элемент n >;

Пример:

Type

Simvol=set of ‘a’..’h’;

Number=set of 1..31;

Var

S: Simvol;

N: Number;

D: set of char;

В данном примере переменная s может принимать любые значения символов от ‘a’  до ‘h’, N  от 1 до 31.попытка присвоить любые другие значения переменным вызовет программное прерывание. Количество элементов множества не должно превышать 226. Объем памяти, занимаемый одним элементом множества, составляет 1 бит.

Операции над множествами.

При работе с множествами допускается использование операций отношения, объединения, пересечения, разности, операции IN. Результатом всех этих операций может быть истина(true) или ложь (false).

Операция равно(=).

Два множества считаются равными, если они состоят из одних и тех же элементов. Порядок следования элементов значения не имеет.

Значение А

Значение В

Выражение

Результат

[1,2,3,4]

[1,2,3,4]

A=B

True

[‘a’,’b’,’c’]

[‘a’,’c’]

A=B

False

[‘a’..’z’]

[‘z’..’a’]

A=B

True

Операция не равно(<>).

Два множества называются не равными, если они отличаются по базовому типу или значению хотя бы одного элемента.

Операция больше или равно (меньше или равно).

Пусть даны два множества А и В. Множество А>=B, если все элементы множества В содержатся в множестве А.

Операция IN

Операция IN используется для проверки принадлежности какого-либо значения данному множеству.

Значение А

Значение В

Выражение

Результат

2

[1,2,3]

A in B

true

‘v’

[‘a’..’h’]

A in B

False

2

[‘1’,’2’,’3’]

A in B

False

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

If (a=1)or(a=2)or(a=3)or(a=4)or(a=5)or(a=6) then

можно заменить более коротким

if a in [1..6] then

Объединение множеств.(+)

Объединением двух множеств называется новое множество, которое состоит из элементов обоих множеств.

 

Значение А

Значение В

Выражение

Результат

[1,2,3]

[1,2,69,9]

A+B

[1,2,3,9,69]

[‘a’]

[‘s’..’z’]

A+B

[‘a’,s’..’z’]

[]

[]

A+B

[]

Пересечение множеств.(*)

Пересечением двух множеств называется третье множество, которое содержит элементы, входящие в оба множества.

Значение А

Значение В

Выражение

Результат

[1,2,3]

[1,2,69,9]

A*B

[1,2]

[‘a’]

[‘s’..’z’]

A*B

[]

[]

[]

A*B

[]

Разность множеств.(-)

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

Значение А

Значение В

Выражение

Результат

[1,2,3]

[1,2,69,9]

A-B

[3]

[‘a’]

[‘s’..’z’]

A-B

[‘a’]

[3]

[3,4,5]

A-B

[]

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


Лекция 32.

Вопросы:

Что такое тип множество. Как описать переменные этого типа.

Перечислить операции над множествами. Охарактеризовать.

Основные задачи по теме множества:

Заполнить множество М, состоящее из чисел 1..50 с клавиатуры 10 числами.

Program _;

Var M: set of 1..50;

      X,I: integer;

Begin

M:=[];

For i:= 1 to 10   do

   Begin

 Writeln(‘Введите ’,I,’элемент множества’);

 Readln(x);

 M:=m+[x];

   End;

End.

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

Выполнение программы по шагам: RunTrace Info(F7).

Просмотр текущих значений переменных, выражений DebugWatch. При выполнении данной команды на экране появляется окно, в которое необходимо ввести имена переменных ( при помощи клавиши insert) значения которых мы хотим просматривать.

Определить сколько в данной строке согласных и гласных букв.

program _;

uses crt;

type  lette=set of 'А'..'я';

var let,gl_l,sog_l: lette;

i,g,sg: integer;

s:string;

begin

clrscr;

let:=['А'..'я'];

gl_l:=['А','а','Е','е','И','и','О','о',У','у','Ы','ы','Э'..'Я','э'..'я'];

Sog_l:=let-gl_l;

Writeln('введите строку');

readln(s);

for i:=1 to length(s) do

 begin

 if (s[i] in gl_l) then g:=g+1;

 if (s[i] in sog_l) then sg:=sg+1 ;

 end;

writeln('гласных букв в предложении ',g);

writeln('coгласных букв в предложении ',sg);

Writeln;

end.

Составить программу, которая вырабатывает и выводит на экран дисплея наборы случайных чисел для игры в "Спортлото 5 из 36".

   Для заполнения каждой карточки спортлото необходимо получить набор из пяти псевдослучайных чисел. К этим числам предъявляются два требования:

    -числа должны находиться в диапазоне 1..36;

    -числа не должны повторяться.

Program Lotto;

uses crt;

var kol,x:integer;

   m:set of 1..36;

begin

    clrscr;

    randomize;

    textcolor(5);

    writeln('Вас приветствует игра 5 из 36');
    writeln('сегодня мы назовем выигрышные номера');

    kol:=1;

    m:=[];

    while kol<=5 do

        begin

             x:=random(36);

             if not(x in M) then

                begin

                     m:=m+[x];

                     kol:=kol+1;

                     write(x,' ');

                 end;

         end;

    readln;

end.


Лекция 33.

Записи в Turbo Pascal

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

Для записи в Turbo Pascal комбинации разных типов используют тип Запись.

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

Компоненты записи называются полями, каждое из которых определяется именем и типом. Поля записи могут относиться к любому типу, допустимому в языке Паскаль, за исключением файлового типа. Описание записи   в   языке   ПАСКАЛЬ   осуществляется  с  помощью служебного слова RECORD,  за которым описываются компоненты записи: имена полей и через двоеточие указывается их тип. Завершается описание записи служебным словом END.

Record

<идентификатор поля>:<тип поля>;

<идентификатор поля>:<тип поля>;

…………………………………..

<идентификатор поля>:<тип поля>

end;

   Например, записная книжка содержит фамилии,  инициалы и номера телефона, поэтому отдельную строку в записной книжке удобно представить в виде следующей записи:

         type   Row=Record

                                 FIO: String[20];

                                 TEL: String[7]

                             end;

         var    str,d: Row;

В данном случае описывая запись мы задали новый тип Row, но можно описать переменную типа запись непосредственно в разделе описания переменных:

Var car: record

 Nomer:integer;

 Marka: string[15];

 Fio:string[25];

 Address:string[40]

End;

Идентификатор поля должен быть уникальным в пределах записи. Но чтобы избежать путаницы в программе лучше делать его уникальным во всей программе. Объем памяти, необходимый под запись складывается из длин полей. Так, тип Row занимает 29 байт, а переменная саr   75 байт (2+16+26+41).

   Обращение к записи в целом допускается только в операторах присваивания, где  слева и справа от знака присваивания используются  имена записей одинакового типа(str:=d). Во всех остальных случаях оперируют отдельными полями записей.  Чтобы обратиться к отдельной компоненте записи, необходимо задать  имя записи и через точку указать имя нужного поля, например:         str.FIO,   str.TEL , car.nomer, car.fio;

   Такое имя называется составным. Компонентой записи может быть также запись,    в таком случае составное имя будет содержать не два,  а большее количество имен.


Лекция 34.

Задача по теме записи. Оператор With.

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

Для решения задачи опишем новый тип Priz, который будет содержать поля fio и raion. И тип spisok-который будет массивом из записей типа Priz.(каждый элемент массива- отдельная запись о призывнике, содержащая ФИО и район проживания). Размер массива определим постоянной.

Постановка задачи:

Программа запускается файлом Priz.exe. На экране появляется главное меню программы, содержащие пункты:

Что будем делать?

ввод данные;

вывод всех;

вывод по заданному району;

выход:

ваш выбор __

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

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

Назначение

Procedure Vvod_priz(var a:priz)

Процедура ввода данных по одному призывнику

Procedure Vvod_spisok(var a:spisok)

Процедура ввода данных по всем призывникам

Procedure Vivod_priz(a:priz)

Процедура вывода данных по одному призывнику

Procedure Vivod_spisok(a:spisok)

Процедура вывода данных по всем призывникам

Procedure Vivod_raion(a:spisok)

Процедура вывода данных по введенному району


program _;

uses crt;

const n=3;

type

   priz=record

     fio:string[20];

     raion:string[15];

   end;

   spisok=array[1..n] of spisok;

var x: spisok;

v:byte;

procedure Vvod_priz(var a:priz);

begin

Writeln('введите фамилию студента и район через enter');

readln(a.fio);

readln(a.raion);

end;

Procedure Vvod_spisok(var a:spisok)

Var i: byte;

Begin

Clrscr;

For i:=1 t n do vvod_priz(a[i]);

End;

procedure Vivod_priz(a:priz);

begin

Writeln(a.fio:25, a.raion:20);

end;

Procedure Vivod_spisok(a:spisok)

Var i: byte;

Begin

Clrscr;

Writeln(‘фио’:25,’район’:20)

For i:=1 t n do vivod_priz(a[i]);

End;

Procedure Vivod_raion(a:spisok)

Var i: byte;

R:string[15];

Begin

Clrscr;

Writeln(‘введите район’);

Readln(r );

For i:=1 to n do

If a[i].raion= r then vivod_priz(a[i]);

End;

{ОСНОВНАЯ ПРОГРАММА}

begin

repeat

clrscr;

writeln(‘Что будем делать?’);

writeln(‘1-ввод данные;’);

writeln(‘2-вывод всех;’);

writeln(‘3-вывод по заданному району;’);

writeln(‘4-выход:’);

writeln(‘ваш выбор ‘);

readln(v);

case v of

1:vvod_spisok(x);

2:vivod_spisok(x);

3:vivod_raion(x);

end;

until v=4;

end.


Лекция 35.

Файлы

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

Файлом называется совокупность данных, записанная во внешней памяти под определенным именем.

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

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

Сведения о файловой системе ms dos

Каждый файл на диске имеет обозначение, которое состоит из двух частей: имени и расширения. В имени файла может быть от 1 до 8 символов. Расширение начинается с точки, за которой следуют от 1 до 3 символов, например: command.com, turbo.exe, autoexec.bat, turbo.tph, proba.pas.

Имя файла — это любое выражение строкового типа, которое строится по правилам определения имени в MS DOS:

• имя содержит до восьми разрешенных символов (прописные и строчные латинские буквы, цифры и символы: !, @, #, %, ^, &, (,),', ~, —, _;

• за именем может быть расширение — последовательность до трех разрешенных символов; расширение, если оно есть, отделяется от имени точкой.

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

com, exe — готовые к исполнению программы;

bat — командные (Batch) файлы;

txt, doc — текстовые файлы;

hip — файл справочной службы;

pas — файл программы на языке Паскаль;

asm — файл программы на языке Ассемблер;

dat — файл данных;

arj — файл архива, созданный архиватором arj.

Устройства в Турбо Паскале.

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

А:, В: — накопители на гибких магнитных дисках;

С:, D:, Е: и т.д. — винчестер;

CON — пульт управления (консоль), при выводе этим устройством является экран видеомонитора, а при вводе — клавиатура;

— устройства, подключенные к параллельным портам 1, (портом называют многоразрядный вход или выход в устройстве. Чаще все порту LPT1 подключен принтер);

PRN-принтер

СОМ1, СОМ2, СОМ3- устройства, подключенные к последовательным портам

NUL- пустое устройство

Примечание. Устройство Nul работает следующим образом: при чтении с него про--амме сообщается о конце файла, а при выводе на него информация на самом деле никуда не выводится, но программе, которая делала вывод, сообщается, что вывод произошел успешно.

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

Любой файл содержит компоненты одного типа. Компонентами может быть любой тип Turbo Pascal, кроме файлового.

Все компоненты файла пронумерованы от 0 до последнего компонента.

компонент№0 

компонент№1 

компонент№2 

компонент№3 

….

Текущий указатель

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

Как правило, все действия с файлом (чтение из файла, запись в файл) производится поэлементно, причем в этих действиях участвует текущий элемент файла. В результате совершения операций текущий указатель может перемещаться, настраиваясь на тот или иной элемент файла.

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

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

Файлом прямого доступа называется файл, доступ к элементам которого осуществляется по адресу элемента.

По типу компонентов файла в Turbo Pascal существуют следующие разновидности файлов: текстовые, типизированные и нетипизированные.

Текстовый файл можно рассматривать как последовательность символов, разбитую на строки длиной от 0 до 255 символов.

К типизированным файлам относятся файлы строго определенного типа. Чаще всего это файлы, состоящие из записей. Они применяются для создания различных баз данных.

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


Лекция 36.

Вопросы:

Что такое файл.

Предпосылки использования файлов в программе.

Типы файлов по способу доступа к компонентам.

Типы файлов по типу компонентов.

Средства обработки файлов. 

Чтобы создавать и обрабатывать файлы в программе, необходимо:
1.описать переменную, соответствующую файлу;

2.задать соответствие между файлом и переменной.

Описание файловой переменной зависит от типа файла:

-текстовые:
 Var <файловая переменная>:text;

-типизированные:
 Var
<файл. пер-я>:
file of <тип элементов файла>

-нетипизированные
Var <файловая переменная>:file;

Для установления соответствия между переменной и реально существующим файлом на диске в языке используется процедура

assign (<файловая переменная >,<имя файла>);

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

указать полный путь до него.

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

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

Reset (<файловая переменная >); — открывает существующий файл;

Rewrite (<файловая переменная >); — создает и открывает новый файл.

Открытие внешнего файла с помощью процедуры Reset в случае отсутствия на диске может привести к ошибке при выполнении программы.

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

Операция закрытия файла является логическим окончанием работы с любым открытым файлом. Для этого служит процедура Close (var F);

Использование процедуры Close позволяет устранить связь файловой переменной с внешним файлом, установленную с помощью процедуры Assign.

Пример: Полная цепочка команд для создания простого текстового файла с именем WORK.TXT:

Program _;

Var F: text;

begin

Assign(F, 'WORK.TXT');

Rewrite(F);

Write(F,'Простой текстовый файл'); Close(F);

end.

К языковым средствам обслуживания файлов необходимо отнести процедуры переименования и удаления неоткрытых файлов. Использование этих процедур не зависит от типа файла.

Rename(<файловая переменная>,<нов.имя>);-процедура переименовывает неоткрытый файл любого типа

Erase(<файловая переменная >);- процедура удаляет неоткрытый внешний файл любого типа

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

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

Пример: Удаление или переименование файла.

Program _;

Var F: file ;

Ch: char;  

St: string;

begin

Write('Введите имя файла: ');

Readln(St);

Assign(F, St);

Write('Удалить файл(У), Переименовать(П),');

Readln(Ch);

case Ch of

 'у': Erase(F);

 'п': begin

Write(‘Введите новое имя файла: ');

Readln(St);

Rename(F, St);

      end;

end.

Для чтения и записи данных используют следующие процедуры:

READ(<файл.пер >,<переменная>)-процедура чтения из файла в переменную.

WRITE (<файл.пер >,<переменная>)- процедура записи из переменной в файл.

Часто при работе с файлами используется функция:

EOF (<файловая переменная> ) - возвращает булевское значение True, если указатель чтения- записи в конце файла, и False — в противном случае.

Для того чтобы файловые операции выполнялись четко и без ошибок, необходимо использовать специальную функцию IOresult. Функция работает без параметров и возвращает значение типа integer, представляющее статус последней выполненной операции ввода-вывода: после корректного выполнения операции ввода-вывода функция IOresult возвращает значение, равное нулю, в остальных случаях функция возвращает соответствующий код ошибки.

Использование этой функции в программах возможно лишь в том случае, если на время выполнения файловых операций отключена стандартная проверка операций ввода-вывода. Для этих целей используется директива компилятору {$I}, которая может задаваться внутри текста программы.

Пример: Вариант программы для проверки существования файла на диске

Program _;

Var F:   file   ;

   St: string;

begin

  Write('Введите имя файла : ');

  Readln(St);

  Assign(F, St) ;

  {$I—} {Отключить стандартную обработку ошибок}

  Reset(F);     {Открыть файл}

  {$I+}  {Включить стандартную обработку ошибок}

  if IOresult = 0 then 

begin

Writeln('Файл существует и нормально открыт’);
Close(F); {Закрыть файл}
end;

else

Writeln('Файла с именем’,St,' на диске нет');

end.

Дома: Разобрать и выучить все функции обработки файлов.


Лекция 37.

Текстовые файлы

Текстовый файл можно рассматривать как последовательность символов, разбитую на строки длиной от 0 до 255 символов. Для описания используется стандартный тип Text:

 Var < файловая переменная>: text;

Каждая строка завершается маркером конца строки. На практике такой маркер представляет собой последовательность из двух символов: перевод строки chr(13) и возврат каретки chr(10). Эти два символа задают стандартные действия по управлению текстовыми файлами. Стандартно открываемые предопределенные файлы Input и Output в модуле System имеют тип Text

У текстовых файлов своя специфика. Специальные расширения стандартных процедур чтения Read и записи Write разрешают работать со значениями несимвольного типа. Другими словами, последовательность символов автоматически преобразуется к значению того типа переменной, которая используется в файловых операциях.

Вызов Read(F, W), где W — переменная типа word, осуществляет чтение из файла F последовательности цифр, которая затем интерпретируется в число, значение которого и будет присвоено переменной W. В случае если вместо последовательности цифр идет любая другая последовательность символов, использование такого оператора приводит к ошибке выполнения программы.

Открытие текстового файла можно произвести двумя стандартными способами:

  1.  поставить в соответствие файловой переменной имя файла (процедура Assign), открыть новый текстовый файл (процедура  Rewrite);
  2.  поставить в соответствие файловой переменной имя файла (процедура Assign), открыть уже существующий файл (процедура Reset).

Текстовый файл в силу своей специфики во время работы допускает какой-либо один вид операции: чтение или запись. В связи с этим для работы с текстовыми файлами появляется еще одна процедура открытия файла:

Append(<файловая переменная>);

Эта процедура открывает уже существующий файл и позиционирует указатель обработки на конец файла. После такого открытия текстовый файл можно только дополнять информацией, начиная с конца строки. Ограничения, накладываемые на процедуру Append, такие же, как у процедур Reset и Rewrite.

Для обработки текстовых файлов используются процедуры Read и Write, обеспечивающие соответственно чтение и запись одной строки и более в текстовый файл. Использование специальных разделителей строк файла позволило ввести в состав языковых средств процедуры Readln. Процедура Read обеспечивает ввод данных общим потоком из одной строки, a Readln приводит к обязательному переходу к следующей строке текстового файла, т.е. ввод данных осуществляется из различных строк. Writeln, обеспечивающую запись всех величин с обязательной установкой маркера конца строки в файл. Общий вид представления процедур следующий:

Readln(var F  :   text; VI [,V2,.. .Vn]) ;

Writeln(var F   :   text;  VI   [,V2,. . .Vn]) ;

где VI...Vn переменные разных типов.

При организации операций ввода-вывода используются специальные языковые средства в виде функций Eoln, Eof

Функция Eof(var F: text) возвращает булевское значение True, если указатель конца файла находится сразу за последним компонентом, и False — в противном случае.

Функция Eoln(var F: text) возвращает булевское значение True, если текущая файловая позиция находится на маркере конца строки или вызов Eof(F) возвратил значение True. Во всех других случаях значение функции будет False.

Задачи:

  1.  Дан файл «Primer.txt» вывести на экран его содержимое.

program _;

uses crt;

var f: text;

   a:string;

   i,k: byte;

begin

    clrscr;

    assign(f,'primer.txt');

    reset(f);

    while not eof(f) do

                begin

       Readln(f,a);

  writeln(a) ;

                end;

    close(f);

end.

  1.  Дан файл «Work.txt» при выводе файла на экран заменить все цифры на «*».

program _;

uses crt;

var f: text;

   a:string;

   i,k: byte;

begin

    clrscr;

    assign(f,'work.txt');

    reset(f);

    while eof(f) do

                begin

       Readln(f,a);

  For i:= 1 to length(a) do

 If (a[i]>=’0’) and (a[i]<=’9’) then a[i]:=’*’;

                 writeln(a) ;

                end;

    close(f);

end.

  1.  Создать свой текстовый файл, поместить в него заглавные русские буквы.

program _;

uses crt;

var f: text;

   a, nane:string;

   i,k: byte;

begin

    Writeln(‘введите имя создаваемого файла’);

    Readln(name);

    assign(f,name);

    rewrite(f);

    for i:=128 to 159 do

                begin

                write(f,chr(i):3) ;

                k:=k+1;

                if k=16 then

                   begin

                        writeln(f);

                        k:=0;

                   end;

                end;

    close(f);

end.

  1.  Дан файл, заполненный заглавными русскими буквами, дописать в него маленькие русские буквы.

program _;

uses crt;

var f: text;

   a,name:string;

   i,k: byte;

begin

    clrscr;

Writeln(‘введите имя файла, в который будем дописывать ’);

Readln(name);

    assign(f,name);

    append(f);

    for i:=160 to 175 do

                begin

write(f,chr(i):3) ;

k:=k+1;

if k=16 then

begin

 writeln(f);

 k:=0;

end;

end;

   for i:=224 to 239 do

begin

  write(f,chr(i):3) ;

  k:=k+1;

  if k=16 then

          begin

            writeln(f);

            k:=0;

          end;

end;

    close(f);

end.

  1.  Написать программу, обеспечивающую создание на диске текстового файла и запись в него.

Program _;

uses crt;

var f:text;

   new, name: string;

   s: char;

   i:integer;

begin

clrscr;

Writeln(‘введите имя создаваемого файла’);

Readln(name);

assign(f,name);

rewrite(f);

writeln('введи текст, для завершения нажми enter');

repeat

    readln(new);

    write(f,new);

until new=’’;

close(f);

end.

  1.  Скопировать содержимое одного файла в другой.

program _;

uses crt;

var f1,f2: text;

   a:string;

   i,k: byte;

begin

    clrscr;

    assign(f1,'work.txt');

    assign(f2,'we.txt');

    reset(f1);

    rewrite(f2);

    while not eof(f1) do

                begin

                readln(f1,a) ;

                writeln(f2,a) ;

                end;

    close(f1);

    close(f2);

end.

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

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

Специально введенная процедура Flush(<файловая переменная>) дает возможность связать запись с помощью процедур Write и Writeln непосредственно с физической записью на диск. Вызов процедуры гарантирует, что все символы, переданные для записи, действительно в это же время будут записаны во внешний файл. Использовать процедуру можно для текстовых файлов, открытых только для записи процедурами Rewrite и Append. В прикладных программах процедуру используют редко, как правило, в тех случаях, когда необходимо подтверждение о физической записи во внешний файл

Процедура SetTextBuf (<файл. переменной>;Buf[; size])- дает возможность назначить свой буфер ввода-вывода (Buf) необходимого объема (Size) текстовому файлу. Параметр Size при вызове может быть опущен. В этом случае размер буфера соответсвует SizeOf(Buf). Назначение SetTextBuf файловой переменной распространяется до следующего использования переменной новым внешним файлом.

Пример: Назначение буфера ввода-вывода.

var F:   text;

Ch: char;

Buf: array[1..2048] of char; {Буфер 2 Кбайта}

begin

Assign(F,’primer.txt’);

SetTextBuf(F, Buf);{Установить файлу буфер 2 Кбайта}

Reset(f);

while not Eof(F) do

begin  {Вывести файл на экран}

Read(F, Ch); ц

Write(Ch);

end;

end.

Потери информации при обмене будут исключены, если переназначение буфера ввода-вывода будет осуществлено после вызова процедуры Assign либо сразу после процедур открытия файлов до любой операции обмена.


Лекция 38.

Типизированные файлы

К типизированным файлам относятся файлы строго определенного типа. Чаще всего это файлы, состоящие из записей. Они применяются для создания различных баз данных. Стандартное задание в программе такой файловой переменной осуществляется следующим образом:

type

«имя типа»=record

   ….

end;

var

F : file of «имя типа»;

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

Seek(«имя файловой переменной»; «номер»)- Процедура устанавливает текущую файловую переменную  на запись с указанным номером;  файловая переменная для типизированных и нетипизированных наборов данных. При открытии типизированного файла текущая позиция для работы с ним установлена на начало первой записи, которая по принятым соглашениям имет номер 0, т. е. номер физической записи на единицу меньше номера логической записи. Это небольшое несоответствие в номерах может служить причиной возникновения ошибок чтения-записи, что в результате может привести к нарушению целостности важной информации. Положение усугубляется тем, что неверное позиционирование на запись с помощью процедуры Seek, как правило, не приводит к каким-либо видимым ошибкам ввода-вывода, на которые всегда можно отреагировать. Исключение составляют ситуации, когда нет доступа к файлу, файл не открыт или назначено позиционирование на несуществующую запись. Такие ситуации обрабатываются с помощью функции lOresult.

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

Для работы с файлами прямого доступа дополнительно можно использовать радующие средства:

Truncate(«файл. переменная»)-Процедура уничтожает все компоненты файла, начиная с места текущего положения файлового указателя.

FilePos(«файл. переменная»)-Функция возвращает для файла  текущую файловую позицию (номер записи, на которую она установлена) в виде значения типа Longlnt

FilеSize («файл. переменная»)-функция, возвращает файлу его размер (количество записей) в виде значения типа Longint.

Для пустого файла вызов FifeSize возвращает значение 0.

Локализация ошибок при обращении, к внешним носителям для обоих функций производится через функцию lOresult.

Для того чтобы очередная запись могла быть записана в конец типизировавго файла, необходимо перевести текущую файловую позицию в конец файла, где создается новый файл, это происходит автоматически после формирования каждой очередной записи. Если файл уже создан и файловая позиция, установлена по Seek, находится где-нибудь в начале файла (FilePos(F) < FileSize(F)), то в конец файла ее позволяет перевести вызов Seek (F, FileSize (F))

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

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

Program _;

Uses crt;

type  tel=record

     FIO:string[30];

     nomer: longint;

     end;

     file_tel= file of tel;

var f:file_tel;

   name,st:string;

Procedure vvod_zapisi(var z: tel);

begin

    writeln('введите ФИО и номер телефона');

    with z do

    begin

    readln(fio);

    readln(nomer);

    end;

end;

procedure VVod_file(var r:file_tel);

var n,i:byte;

   z:tel;

begin

    rewrite(r);

    writeln('сколько записей будем вводить');

    readln(n);

    for i :=1 to n do

    begin

         vvod_zapisi(z);

         write(r,z);

    end;

    close(r);

    readln;

end;

Procedure vivod_zapisi(z: tel);

begin

    write(z.fio:20);

    writeln(z.nomer:15);

end;

procedure shapka;

begin

    textcolor(5);

    write('  ФИО ':20);

    writeln('   телефон ':15);

    textcolor(15);

end;

procedure ViVod_file(var r:file_tel);

var n,i:byte;

   z:tel;

begin

    clrscr;

    shapka;

    reset(r);

    i :=0;

    while not(eof(r)) do

    begin

         seek(r,i);

         read(r,z);

         vivod_zapisi(z);

         i:=i+1;

    end;

    close(r);

    readln;

end;

procedure poisk(var r:file_tel;s:string);

var z:tel;

   i:byte;

begin

    writeln('введите фио');

    readln(s);

    reset(r);

    i:=0;

    clrscr;

    shapka;

    while not eof(r) do

    begin

    seek(r,i);

    read(r,z);

    if z.fio=s then vivod_zapisi(z) ;

    i:=i+1;

    end;

    readln;

end;

procedure menu(var r:file_tel);

var k:byte;

begin

    repeat

    clrscr;

    writeln('что будем делать?');

    writeln('1:создание телефонного справочника');

    writeln('2:дозапись в справочник');

    writeln('3:вывод справочника');

    writeln('4:поиск по ФИО');

    writeln('5: выход ');

    write('ваш выбор  ');

    readln(k);

    case k of

    1:vvod_file(r);

    {2:redak_file(r);}

    3:vivod_file(r);

    4:poisk(r,st)

    end;

    until k=5;

end;

{основная программа}

begin

    clrscr;

    writeln('введите имя файла');

    readln(name);

    assign(f,name);

    menu(f);

end.


Лекция 40.

Графика в турбо паскале.

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

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

В графическом режиме минимальным объектом, выводом которого может управлять программист, является так называемый пиксель. Пиксель имеет меньшие размеры по сравнению с символом. Его геометрические размеры определяются разрешением монитора. Разрешение монитора обычно задается в виде rх х rу , где rхколичество пикселов на экране по горизонтали, а rуколичество пикселов по вертикали. На практике используются не произвольные, а некоторые определенные значения разрешения. Такими разрешениями являются, например, 640x480, 800x600, 1024x768, 1280x1024 и т. д.

Даже в случае самого грубого разрешения изображение в графическом режиме формируется с помощью 64 000 графических элементов, что намного превышает возможности текстового режима.

Аппаратная поддержка графики персонального компьютера обеспечивается  двумя основными модулями: видеоадаптером и видеомонитором.

Видеомонитор (дисплей) — это устройство, на котором появляется выводимый текст или графические изображения.

Он работает так же, как и обычный телевизор. Экран 25 раз в секунду формируется заново. Так как человеческий глаз не способен уловить такое быстрое мелькание кадров, создается иллюзия неподвижного изображения на экране монитора.

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

Драйверы

Какой бы адаптер ни был установлен на компьютере, мы можем использовать один и тот же набор графических процедур и функций Турбо Паскаля благодаря тому, что их конечная настройка на конкретный адаптер осуществляется автоматически. Эту настройку выполняют специальные программы,  называемые графическими драйверами. Графические драйверы разработаны практически для всех существующих видеоадаптеров. Они находятся в файлах, имеющих расширение BGI (Borland Graphics Interface) и активизируются при инициации графического режима.


Лекция 41.

Модуль graph

Для формирования графических изображений в языке Турбо Паскаль предназначен стандартный библиотечный модуль GRAPH.

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

1. Подключить модуль GRAPH — библиотеку графических процедур:

 uses  graph;

2. Инициализировать видеорежим при  помощи процедуры

InitGraph(<им1>, <им2>, <им3>);

Целочисленные переменные им1, им2 задают драйвер и режим.

Для новичков, которые могут не знать типа дисплея своего компьютера, имеется стандартная   константа   Detect.   Если   это   значение   присвоено   параметру им1. то InitGraph автоматически инициирует нужный драйвер и установит наиболее подходящий для дисплея режим.

Третий параметр  им3  типа String задает маршрут к модулю GRAPH; если он расположен в активном директории, то вместо маршрута ставятся два апострофа.

ТО, стандартная цепочка команд для инициализации графического режима:

uses Graph;

var Dr, Mode: integer;

begin

Dr := Detect;

InitGraph(Dr, Mode, '');

End;

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

Иногда требуется периодически переходить из текстового режима в графический и наоборот.

Используем следующие стандартные процедуры:

SetGraphMode(Mode: integer)-Процедура переводит систему в графический режим и очищает экран.

RestoreCRTMode -Процедура восстанавливает видеорежим, который был до инициализации графики.

Графические координаты

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

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

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

1.   Графические координаты принимают только целочисленные значения.

2.  Графические координаты принимают значения, ограниченные как снизу (нулевым значением), так и сверху (значением разрешения).

3.   Графическая координата у отсчитывается сверху вниз.

Таким образом, геометрические декартовы координаты точки (х, у) для отображения ее на экране следует пересчитать в графические (xg, yg) по формулам

, где  и

Функции GetMaxX GetMaxY- используются без параметров и определяют максимальное количество точек на экране по вертикали и горизонтали. Длина отрезка для Х и У это длина интервала в котором изменяется абсцисса(х) и ордината (у) данной функции.


Лекция 43.

Основные процедуры модуля graph.

PutPixel(x,y,color)- установка точки с координатами (х,у) и заданным цветом

SetColor(color)- установка заданного цвета

SetBkColor(color)- установка цвета фона

Line(x1,y1,x2,y2)- рисование линии с координатами вершин (х1,у1), (х2, у2)

Cercle(x,y,r)- рисование окружности с центром (х, у) и радиусом r

OutTextXY(x,y,s)- вывод строки s , начиная с позиции (х,у)

Рассмотрим примеры:

Написать программу, рисующую паутину.

program _;

uses crt, graph;

var i:byte;

procedure ini;

var Dr, mo:integer;

begin

dr:=detect;

initgraph(dr,mo,'c:\bp\bgi');

end;

begin

    ini;

    setbkcolor(blue);

    setcolor(7);

    line(0, getMaxY, GetMaxX,0);

    Delay(1000);

    setcolor(14);

    line(0,0,GetMaxX, getMaxY);

    Delay(1000);

    setcolor(10);

    line(0, getMaxY div 2, GetMaxX,GetMaxY div 2);

    Delay(1000);

    setcolor(4);

    line(getMaxX div 2, 0,GetMaxX div 2, GetMaxY);

    Delay(1000);

    For i:=2 to 20 do

        begin

             setColor(i+1);

             circle(GetMaxX div 2, GetMaxY div 2,getMaxY div i);

        end;

    OutTextXY ((GetMaxX div 2) -24,5,'ПАУТИНА');

    readln;

    closegraph;

end.

Написать программу, которая выводит графики функций у=2х2 на отрезке (-5;5).

program _;

uses graph,crt;

var u,v,x1,y1,x2,y2,xc,yc: integer;

   x,y:real;

procedure ini;

var  driver, mode: integer ;

begin

     driver:=detect;

    initgraph(driver,mode,'c:\bp\bgi');

end;

procedure osi;

begin

    setcolor(10);

    line(0, getMaxY div 2, GetMaxX,GetMaxY div 2);

    line(getMaxX div 2, 0,GetMaxX div 2, GetMaxY);

end;     

procedure par;

var x,y:real;

   u,v,k:integer;

begin

    x:=-5;

    while x<=5 do

    begin

    y:=2*x*x;

    u:=round(x*(getmaxx/10)+getmaxx div 2);

    v:=round(-y*(getmaxy/25)+getmaxy div 2 );

    putpixel(u,v,red);

    x:=x+0.01;

end;

begin

    ini;

    setbkcolor(green) ;

    cleardevice;

    osi;

    par;

    readln;

    closeGraph;

end.

Дома: построить график функции y= sin(x)


Лекция 44.

Откройте тетради и проверим домашнее задание. Напомню задачу: «Построить график функции y=sin(x) на интервале (-2п;2п)». Посмотрите на экран монитора. Верно? У вас так? (в задаче намерено допущено несколько ошибок, необходимо вместе найти их, исправить)

Program _;

var dr, mo, gx,gy: integer;

   x,y: real;

begin

initGraph(dr, mo, 'd:\bp\bgi');

Line(GetMaxX div 2,0,GetMaxX div 2, getMaxY);

Line(0,GetMaxY div 2,getMaxX, GetMaxY div 2);

x:=-2*pi;

while x<=2*pi do

 begin

 y:=sin(x);

  PutPixel(x,y,6);

  x:=x+0.001;

 end;

readln;

end.

Program _;

uses graph;

var dr, mo, gx,gy: integer;

   x,y: real;

begin

dr:=detect;  initGraph(dr, mo, 'd:\bp\bgi');

Line(GetMaxX div 2,0,GetMaxX div 2, getMaxY);

Line(0,GetMaxY div 2,getMaxX, GetMaxY div 2);

x:=-2*pi;

while x<=2*pi do

 begin

 y:=sin(x);

gx:=round(x*(getMaxX/(4*pi))+GetMaxX div 2);

gy:=round(-y*(getMaxy/8)+GetMaxY div 2);

  PutPixel(gx,gy,6);

  x:=x+0.001;

 end;

readln;

closeGraph;

end.

Есть вопросы по задаче?

Записали новую тему:

Основные процедуры модуля graph для построения графических фигур.

Сегодняшнее занятие будет проходить не совсем обычно. Новую тему вам будут доносить ваши же одногруппники.

Итак, первый выступающий.

Без построения различных графических фигур не обходится ни одна серьезная графическая система. Библиотека GRAPH содержит ряд процедур, которые формируют самые различные фигуры на основе задаваемых параметров. Цвет, стиль и толщина линии для вычерчивания берутся по умолчанию или устанавливаются соответственно процедурами SetColor , SetFillStyle, SetLineStyle.

Цвета, стили заполнения, толщина линий, а также стиль линий хранятся всё в том же модуле graph как постоянные величины, имеющие код и имя. Чтобы обратится к ним можно указать либо то, либо другое.

На каждой парте представлены все эти постоянные.

А сейчас рассмотрим основные процедуры;

SetColor(color)-устанавливает цвет контуров рисунка.

SetLineStyle(style, pattern, thickness)- процедура устанавливает параметры рисования линий: стиль и толщину.

SetFillStyle(style,Color)- устанавливает стиль заполнения  (Style) и  цвет заполнения (Color).

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

Rectangle(Xl,Y1,Х2,Y2:integer), где XI, Y1 — координаты левого верхнего угла, Х2, Y2 — координаты правого нижнего угла прямоугольника. Область внутри прямоугольника не закрашена и совпадает по цвету с фоном.

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

Более эффектные для восприятия прямоугольники можно строить с помощью другой процедуры:

Bar(xl,yl,x2,y2: integer),-  которая рисует закрашенный столбец. Цвет закраски устанавливается с помощью SetFillStyle.

Еще одна весьма эффектная процедура:

Bar3D(xl,yl,х2,у2:integer;<пер1>:word;<пер2>:Boolean)-вычерчивает трехмерный закрашенный прямоугольник. При этом используются тип и цвет закраски, установленные с помощью процедуры SetpillStyle. Параметр <пер1> представляет собой число пикселей, задающих глубину трехмерного контура. Чаще всего его значение равно четверти ширины прямоугольника ((X2-X1)DIV4). Параметр <пер2> определяет, строить над прямоугольником вершину (пер2= True) или нет (пер2= False).

{демонстрация на мониторе}

Задача:

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

Второй выступающий.

Рассмотрим построение дуг и окружностей в Turbo Pascal.

Circle (X,Y,R)-X и Y — Процедура вычерчивания окружности текущим цветом, координаты центра окружности, a R — ее радиус

Зам! фон внутри круга, эллипса совпадает с фоном экрана.

В ряде случаев, в частности для создания  псевдообъемных фигур, используются дуги.

Arc (X,Y,S,E,R)- процедура рисует дугу. X, Y — центр окружности, S и E — начальный и конечный угол, R — радиус.

Ellipse(X,Y,S,E, xR,yR)- процедура строит эллиптическую дугу, где X, Y — центр эллипса, xR и yR — длина радиусов, S и E — начальный и конечный угол.

Чтобы создать закрашенный эллипс, используется специальная процедура

FillEllpse(x,Y,xR,yR).

Заполнитель устанавливается процедурами SetFillStyle или SetColor

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

PieSlice(X,Y,S,E,R) которая рисует и заполняет маской сектор круга. Точка X, Y — центр окружности, а сектор рисуется от начального угла S до конечного угла E. Контур сектора вычерчивается текущим цветом, а при закрашивании используются тип цвет закраски, заданные процедурами SetFillStyle и SetFillPattern.

Задача:

Разделить круг на заданное количество частей. Закрасить каждую часть разными цветами и масками.

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

Дома:

Повторить весь материал, касающийся темы «Графика в Turbo Pascal».

Составить тесты по теме. Оформить их на листе формата А4. Принести на зачетное занятие.


 

А также другие работы, которые могут Вас заинтересовать

73308. ОСНОВНЫЕ ЭТАПЫ СТАНОВЛЕНИЯ НАЛОГОВОЙ СИСТЕМЫ РОССИИ 190.5 KB
  Эволюция налоговой системы в РФ. Исследования становления и развития налоговой системы РФ. Сравнение налоговой системы плановой экономики СССР с переходной налоговой системой РФ.
73309. Отдельные основания и способы прекращения права собственности 342 KB
  Общие положения прекращения права собственности. Понятие прекращения права собственности. Понятие и сущность основания и способа прекращения права собственности. Значение разграничения оснований и способов прекращения права собственности.
73310. Мошенничество как преступление 134.5 KB
  Характерной чертой мошенничества выделяющей его среди других видов преступлений против собственности является факт того, что собственник (либо другой владелец имущества), будучи введенным в заблуждение, по собственной воле передаёт мошеннику имущество (право на имущество)
73311. Организация финансовых результатов в ООО СФ «Жилпромстрой» 152.5 KB
  Учет, прогнозирование и планирование финансово-хозяйственной деятельности необходимы на любой стадии производствa. Любые ресурсы имеют свои ограничения и задача руководителя добиться максимального эффектa от их использования. Хозяйственные операции сопровождаются образованием и расходованием денежных средств, соотношение доходов и расходов организации определяют его финансовый результат.
73312. ВИДИ ПРАВ, СВОБОД І ОБОВЯЗКІВ ЛЮДИНИ І ГРОМАДЯНИНА. ЇХ СИСТЕМА В КОНСТИТУЦІЇ УКРАЇНИ 189 KB
  Дослідити ґенезу прав і свобод людини і громадянина на різних історичних етапах становлення держави; визначення поняття та змісту гарантій прав і свобод людини та громадянина; конкретизація ролі та місця держави, та органів державної влади щодо гарантування прав і свобод людини та громадянина; визначення сутності теоретичних засад гарантій прав і свобод людини та громадянина; проаналізувати концептуальні проблеми механізму реалізації права людини і громадянина в Україні...
73313. Основные задачи развития в период первой зрелости (молодости) 269 KB
  Основные задачи развития в период первой зрелости молодости. Обзор теорий развития психики отечественных и зарубежных психологов. Главной целью работы является выделить основные задачи развития как психологического так и социального.
73314. Чувство взрослости как центральное новообразование в структуре личности подростка 287.5 KB
  Исследование личности подростка в возрастной психологии Возрастная психология как область психологического знания. Новообразования и особенности развития личности подростка. Чувство взрослости как центральное новообразование в структуре личности подростка...
73315. Особенности агрессивных проявлений в раннем возрасте 410.5 KB
  Основные теоретические подходы к понятию агрессивности и агрессии. Типология агрессивного поведения у детей. Организация и методы исследования агрессивных проявлений у детей в раннем возрасте. Результаты собственного исследования агрессивных проявлений у детей в раннем возрасте.
73316. ВОСПРИЯТИЕ РЕКЛАМНОЙ ПРОДУКЦИИ (ТВ - РОЛИКОВ) ДЕТЬМИ ДОШКОЛЬНОГО ВОЗРАСТА 247 KB
  Реклама в мире бизнеса обрушивает на потребителей огромное количество информации. Психологическое воздействие рекламной информации проявляется в процессах переработки рекламных сообщений - эмоциях, мыслях, возможных решениях, обусловливающих конкретные поведенческие акты покупателя. Так или иначе, рекламный процесс оказываются вовлеченными феномены переработки информации - ощущения, восприятия, внимание, память.