НОВОУРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ

 УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ЯДЕРНЫЙ УНИВЕРСИТЕТ

«МИФИ»

 

НОВОУРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ

 

Кафедра информатики и программирования

 

 

ПРОГРАММИРОВАНИЕ В СРЕДЕ TURBO PASCAL 7.0

Методическое пособие

по курсам «Информатика», «Программирование и основы алгоритмизации»,

«Программирование на языках высокого уровня»

 для студентов всех специальностей

 

Новоуральск 2011

 


 

УДК 681.3.06

МиМ – 2.3.-       -  11

 

 

Автор                                                              Николаев Николай Александрович

 

Рецензент                                                            к.т.н. доцент    Дюгай Павел Алексеевич

 

Программирование в среде T urbo P ascal 7.0. Методическое пособие по курсам «Информатика», «Программирование и основы алгоритмизации», «Программирование на языках высокого уровня» для студентов всех специальностей. Новоуральск, НГТИ, 2011. - 79 с.

 

 

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

Содержит 49 рисунков, 11 таблиц, 25 программ, 24 библиографических названия.

 

 

Методическое пособие рассмотрено на заседании кафедры.

Протокол №   123 от 18 апреля  2011 г.

 

 

Зав. кафедрой                                                                                 Н.А.Николаев

 

СОГЛАСОВАНО:

Председатель методической комиссии                                       А.Е.Беляев


 

 

СОДЕРЖАНИЕ

 

 

Введение 5
1 Типы данных Турбо Паскаля 6
1.1 Целочисленные типы данных 6
1.2 Вещественные типы данных 7
1.3 Литерный (символьный) тип 7
1.4 Булевский тип 7
   
2 Элементы языка Турбо Паскаля 8
2.1 Алфавит языка 8
2.2 Идентификаторы 8
2.3 Константы и переменные 8
2.4 Выражения 10
2.5 Операции 10
2.6 Математические функции 12
   
3 Структура программы 14
   
4 Ввод-вывод данных 16
4.1 Ввод данных с клавиатуры 16
4.2 Вывод данных на монитор 16
4.3 Форматы вывода 17
   
5 Операторы 20
5.1 Оператор присваивания 20
5.2 Условный оператор 21
5.3 Составной оператор 24
5.4 Операторы цикла 25
5.4.1 Оператор цикла с предусловием (While …) 25
5.4.2 Оператор цикла с постусловием (Repeat …) 27
5.4.3 Оператор цикла с параметром (For …) 29
5.4.4 Использование процедуры Break 32
   
6 Массивы 34
6.1 Описания массивов 34
6.2 Действия над элементами массивов 35
   
7 Подпрограммы 38
7.1 Процедуры 38
7.2 Функции 42
   
8 Строки 46
8.1 Строковый тип данных 46
8.2 Процедуры и функции для работы со строками 47
9 Работа с файлами данных 55
9.1 Чтение данных из файла 55
9.2 Запись данных в файл 57
   
10 Управление экраном в текстовом режиме 59
10.1 Назначение модуля CRT 59
10.2 Процедуры и функции модуля CRT 60
10.3 Примеры использования модуля CRT 61
   
11 Графика 63
11.1 Назначение модуля GRAPH 63
11.2 Процедуры и функции модуля GRAPH 64
11.3 Примеры использования модуля GRAPH 66
   
12 Модули 69
   
13 Система программирования PASCAL ABC 72
   
Литература 76
   
Приложение: Таблица ASCII 78
   

 


 




ВВЕДЕНИЕ

 

Система программирования ТУРБО ПАСКАЛЬ появилась в середине 80-х годов и сразу же завоевала огромную популярность в классе систем программирования. Объясняется это следующими причинами:

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

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

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

Непрерывное совершенствование системы ТУРБО ПАСКАЛЬ породило в конце концов очень мощную по своим возможностям систему программирования, отвечающую самым взыскательным требованиям. С помощью ТУРБО ПАСКАЛЯ можно создавать любые программы – от программ, предназначенных для решения простейших вычислительных задач, до сложных современных систем управления базами данных и операционных систем. По мнению некоторых авторов [20] «… всё, что можно создать на профессиональном языке программирования Cu, можно (и при том в ряде случаев значительно проще) создать и на языке системы Турбо Паскаль».

Выпущенная в 1995 г. как продолжение среды Turbo Pascal система программирования Delphi стала одной из лучших сред для быстрого создания приложений. Delphi ввела в язык Паскаль ряд удачных объектно-ориентированных расширений; обновленный язык получил название Object Pascal и полностью включает в себя Паскаль системы программирования ТУРБО ПАСКАЛЬ.

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

Теперь о том, что содержится в этом пособии. Сейчас существует достаточное число хороших книг, посвященных программированию на Паскале [1-5, 7, 16-24], но их единственный недостаток (если это можно назвать недостатком) состоит в том, что они часто бывают слишком большими по объему, так как охватывают очень широкий круг вопросов.

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

Данное пособие содержит минимальный объем сведений по программированию, который должен усвоить студент НТИ НИЯУ МИФИ для успешной сдачи экзамена по соответствующему разделу курсов «Информатика», «Программирование на языке высокого уровня», «Программирование и основы алгоритмизации» и соответствует учебным планам практически всех специальностей дневного обучения (26-36 часов лекций). Материал представлен в достаточно конспективном изложении и является дополнением к курсу лекций, а не заменой его.

В пособии излагается версия Паскаля Turbo Pascal 7.0, хотя с очень небольшими коррективами всё изложенное справедливо и для более ранних версий.

Язык Паскаль признан многими российскими преподавателями как один из лучших именно для начального обучения. Однако, среда Borland Pascal, ориентированная на MS DOS, устарела, а среда Borland Delphi с ее богатыми возможностями сложна для начинающего программиста. Кроме этого, установка Turbo Pascal 7.0 на компьютер с операционной системой Windows 7 достаточно нетривиальна. В связи с этим, многие студенты для самостоятельной работы используют систему программирования Pascal ABC, разработанную в Ростовском государственном университете. В главе 13 рассмотрены особенности этой системы.

За основу сборника была взята работа [8], которая претерпела достаточно серьёзные изменения: добавлены новые примеры программ; изменено содержание нескольких разделов; скорректированы некоторые задачи; добавлена новая глава 13, полностью обновлен список литературы.

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

Почти каждая глава содержит примеры программ, все они были проверены в среде программирования Turbo Pascal 7.0.

 



ТИПЫ ДАННЫХ ТУРБО ПАСКАЛЯ

 

 

Любые данные в ТУРБО ПАСКАЛЕ характеризуются своими типами. Тип определяет множество допустимых значений, которые может иметь тот или иной объект, а также множество допустимых операций, которые применимы к нему.

Ниже приведён список типов, которые будут рассмотрены в данном пособии.

²Числовые типы

Целочисленные:                Byte

Shortint

Word

Integer

Longint

 

Вещественные:                  Real

Single

Double

Extended

Comp

 

²Символьный тип                Char

²Логический тип                  Boolean

²Массивы                              array    (раздел 6)

²Строки                                 string   (раздел 8)

 

 

Целочисленные типы данных

 

Целочисленные типы данных представляют собой значения, приведенные в таблице 1.1.

Таблица 1.1 – Целочисленные типы данных.

Тип Диапазон Длина, байт
byte 0..255 1
shortint -128..127 1
word 0..65535 2
integer -32768..32767 2
longint -2147483648..2147483647 4

 

Целые числа записываются в форме без десятичной точки, например:

217 -45 8954 +483

Положительный знак числа может быть опущен.

При использовании процедур и функций с целочисленными параметрами следует руководствоваться «вложенностью» типов, т.е. везде, где может использоваться WORD, допускается использование BYTE (но не наоборот), а в LONGINT «входит» INTEGER, который, в свою очередь, включает в себя SHORTINT.



Вещественные типы данных

 

Вещественные типы принимают значения из диапазона, представленного в таблице 1.2.

Таблица 1.2 – Вещественные типы данных.

Тип Диапазон Мантисса, значащие цифры Длина, байт
real 2.9×10-39 .. 1.7×1038 11-12 6
single 1.5×10-45 .. 3.4×1038 7-8 4
double 5.0×10-324 .. 1.7×10308 15-16 8
extended 3.4×10-4932 .. 1.1×104932 19-20 10
comp -9.2×1018 .. 9.2×1018 19-20 8

 

Тип COMP, несмотря на то, что является вещественным, принимает значения только целых чисел.

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

18.735   -0.5

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

<мантисса> E <порядок>

Такое обозначение понимается как «мантисса, умноженная на 10 в степени, равной порядку». Например, 7Е-2 означает 7·10-2; 12.25Е+6 или 12.25Е6 означают 12.25·10+6. Мантисса может быть записана в виде целого числа или в виде вещественного с фиксированной точкой; порядок обозначается целым числом, допускаются как положительные, так и отрицательные значения порядка.

 

 

Литерный (символьный) тип

 

Значением символьного типа Char является множество значений символов, содержащихся в кодовой таблице ПЭВМ. Каждому символу приписывается целое число в диапазоне от 0 до 255. Для кодировки используется код ASCII. Таблица кодов ASCII приведена в Приложении.

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

В программе значения переменных и констант типа char заключаются в апострофы.

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

 

 

Булевский тип

 

Булевским типом называют тип данных, представляемых двумя значениями: True (истина) и False (ложь).

При описании величин этого типа используется слово Boolean.

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



Алфавит языка

 

В алфавит языка ТУРБО ПАСКАЛЬ входят следующие символы:

² прописные и строчные буквы латинского алфавита, а также символ подчеркивания, который используется наравне с буквами;

² арабские десятичные цифры;

² специальные знаки:

+ - * / > < = ; # ‘ , . : [ ] { } ( ) $ ^ @

 

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

          <> <= >= :=  (* *) (. .) ..

В программе эти пары символов нельзя разделять пробелами.

Русские буквы можно употреблять только:

² в символьных и строковых константах;

² внутри комментариев.

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

 

 

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

 

Идентификаторы в ТУРБО ПАСКАЛЕ – это имена констант, переменных, типов, процедур, функций, модулей и программ. Идентификаторы могут иметь переменную длину, но значащими являются только первые 63 символа.

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

 

 

Константы и переменные

 

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

В качестве констант в ТУРБО ПАСКАЛЕ чаще всего используются целые или вещественные числа, логические константы, символы, строки символов.

Целые числа записываются со знаком или без него по обычным правилам и могут иметь значения от –2147483648 до +2147483647.

Вещественные числа записываются со знаком или без него с использованием десятичной точки и/или экспоненциальной части. Экспоненциальная часть начинается символом е или Е, за которым могут следовать знаки << + >> или << - >> и десятичный порядок. Символ е (Е) означает начало десятичного порядка и имеет смысл << умножить на 10 в степени …>>.

Например, число 5.25·104 запишется в Е-форме как 5.25Е4, а число 8·10-5 – как 8Е-5.

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

Логическая константа – это либо слово FALSE (ложь), либо TRUE (истина).

Символьная константа – любой символ, заключенный в апострофы.

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

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

Формат описания констант:

<идентификатор>=<значение константы>;

Пример раздела описаний констант:

const

N=20;

Alpha=3.2e-5;

Ch=’z’;

Name=’Вова Сидоров’;

Тип констант определяется формой их записи в разделе описаний.

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

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

Формат описания переменных:

<идентификатор>:<тип>;

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

var

I,J :integer;

Beta :real;

c,d :char;

slovo:string;

Кроме констант и переменных в ТУРБО ПАСКАЛЕ используются так называемые типизированные константы, которые по сути являются не константами, а переменными. Единственное отличие типизированных констант от переменных заключается в том, что при инициализации в неё помещается указанное значение. Правильнее было бы назвать их «инициализируемая переменная» (именно так называются эти величины в Help ТУРБО ПАСКАЛЯ). Типизированные константы описываются в разделе констант.

Формат описания типизированных констант:

<идентификатор>:<тип>=<значение>;


 

Пример описания типизированных констант (обратите внимание на расста-новку скобок):

const

n: Integer=20;

e: Real =2.71;

t: array[1..5] of integer = (1, 3, -5, 0, 12);

mas: array[1..3, 1..2] of integer = ((3, 18),

                                (7, -4),

                                ( 5, 0));

 

 


Выражения

 

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

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

Примеры наиболее распространенных типов выражений:

Арифметические выражения (имеющие значением число):

33

8-3

sqrt(b+7)+t[i]

(A+B)/C/D

((x+y)/19)*(2/(x+1)+5)

Строковые выражения (имеющие значением строку символов):

’Вован’

Copy(’интеграл’,3,3)

Delete(’барабан’,5,2)

Логические выражения (имеющие значением true или false):

x < 0

c > ’z’

Copy(S1,n,e) <> S2

 

 

Операции

 

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

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


 

Основные арифметические операции языка представлены в таблице 2.1

Таблица 2.1 – Арифметические операции

Операции Действие Типы операндов Тип результата
* умножение целый вещественный целый вещественный
/ деление целый вещественный вещественный вещественный
div целочисленное деление целый целый
mod остаток от деления целый целый
+ сложение целый вещественный целый вещественный
- вычитание целый вещественный целый вещественный

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

Целочисленное деление вычисляет целую часть частного, дробная часть отбрасывается, например, значение выражения 13 div 5 равно 2.

Деление по модулю (mod) вычисляет остаток, полученный при выполнении целочисленного деления, например, значение выражения 13 mod 5 равно 3.

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

Результат операций *, div, mod, +, - над целыми типами есть целое число, во всех остальных случаях результат – вещественное число.

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

Операции отношения сравнивают два операнда и определяют, истинно значение или ложно.

В таблице 2.2 приведены основные операции отношения, допустимые в ТУРБО ПАСКАЛЕ.

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

 

Таблица 2.2 – Операции отношения

Операция Название Условие Результат
= равно A=B true, если А равно В
<> не равно A<>B true, если А не равно В
> больше A>B true, если А больше В
< меньше A<B true, если А меньше В
>= больше или равно A>=B true, если А больше или равно В
<= меньше или равно A<=B true, если А меньше или равно В

 


Результатом выполнения логического (булевского) выражения является значение True или False. Операндами служат данные только булевского типа. Компонентами логических выражений являются:

²логическая константа;

²логическая переменная;

²логическая функция;

²условие.

Список основных логических операций приведен в таблице 2.3.

Таблица 2.3 – логические операции

Операция

Действие

Выражение

Операнды

Результат

A B
not логическое НЕ not A true false   false true
and логическое И A and B true true false false true false true false true false false false
or логическое ИЛИ A or B true true false false true false true false true true true false

 

Примеры логических выражений:

² (x > 5) and (x < 10) значение выражения равно true, если 5 < x < 10 и false в противном случае;

² (L mod 2 = 0) or (L mod 3 = 0) значение выражения равно true, если число L делится без остатка на 2 или на 3 и false в противном случае.

При вычислении выражений любого типа приоритет вычислений определяется расставленными круглыми скобками, а при их отсутствии – по таблице 2.4 (в порядке убывания приоритета).

Таблица 2.4 – Приоритет операций

Приоритет Операция
1 not
2 *, / , div , mod , and
3 +, - , or , xor
4 =, <> , < , > , <= , >= , in

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

Еще одна достаточно часто встречающаяся ошибка при записи арифметических выражений – нарушение порядка вычисления соответствующего выражения. Так, например, математическое выражение  можно записать как A*B/(C*D) или A*B/C/D, но не A*B/C*D.

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

 

 



Математические функции

 

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

 

Таблица 2.5 – Математические функции

Функция Назначение Тип результата
Abs(x) абсолютное значение аргумента совпадает с типом х
ArcTan(x) арктангенс аргумента вещественный
Chr(x) cимвол с заданным порядковым номером x Char
Cos(x) косинус аргумента вещественный
Dec(x) уменьшение значения x на 1 целый
Exp(x) е х вещественный
Frac(x) дробная часть числа вещественный
Inc(x) увеличение значения x на 1 целый

 

      Продолжение Таблицы 2.5

 

Функция Назначение Тип результата
Int(x) целая часть числа вещественный
Ln(x) натуральный логарифм вещественный
Odd(x) проверка аргумента на нечетность логический
Ord(x) Порядковый номер, соответствующий значению x целый
Pi Pi = 3.14159265…  
Randomize Инициализирует случайным значением встроенный генератор псевдослучайных чисел  
Random   Random(M) Псевдослучайное число в диапазоне от 0 до 1 Псевдослучайное число в диапазоне от 0 до M-1 Вещественный   целый
Round(x) округление аргумента целый
Sin(x) синус аргумента вещественный
Sqr(x) квадрат аргумента совпадает с типом х
Sqrt(x) квадратный корень из аргумента вещественный
Trunc(x) получение целой части аргумента целый

Аргумент математических функций должен быть записан в круглых скобках после имени функции.

У тригонометрических функций аргумент задается в радианах.


 


СТРУКТУРА ПРОГРАММЫ

 

 

 

Неформально структуру программы можно изобразить следующим образом.

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

Заголовок состоит, в наиболее часто используемом случае, из служебного слова P rogram и имени программы, представляющем собой обычный идентификатор Паскаля. Не следует использовать в качестве заголовка идентификаторы переменных, используемых в программе.

Пример заголовка: Program Simple;

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

Данный раздел также является необязательным и используется только в случаях, если в программе используются константы, типы, переменные, процедуры и функции, определенные в стандартных модулях ТУРБО ПАСКАЛЯ (кроме модуля System), или в модулях, созданных пользователем.

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

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

Пример: Uses CRT, GRAPH, MyLib;

Раздел описания констант начинается служебным словом C onst и служит для описания в нем постоянных и типизированных констант, используемых в программе. Формат описаний и пример раздела приведены в пункте 2.3.

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

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

Подробнее этот раздел будет рассмотрен в разделе 6.1.

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

Формат описаний и пример раздела приведен в пункте 2.3.

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

Раздел операторов (тело программы) является единственным обязательным в структуре программы, он начинается служебным словом Begin и заканчивается словом End. (Точка после End, завершающего программу, - обязательна).

Данный раздел состоит из последовательности операторов, разделенных между собой точкой с запятой. Перед словом End точка с запятой обычно не ставится (хотя ее наличие синтаксической ошибкой не является).

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

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

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

 

Program Example_1;      { заголовок программы }

Uses CRT;               { подключение модуля CRT }

Var x,y,sum : Integer;  { описание переменных }

Begin                   { начало тела программы }

Clrscr;                 { очистка экрана }

Writeln('=======Программа нахождения суммы двух чисел=======');

Writeln;

Write('Будьте добры, введите, пожалуйста, первое слагаемое -> '); Read(x);

Write('А теперь, если это Вас не очень затруднит, второе -> '); Read(y);

sum:=x+y;

Writeln('Сумма чисел ',x,' и ',y,' равна ',sum);

Writeln(' ******* Программа выполнена ******* ')

end.

 

Рисунок 3.1 – Программа Example_1 сложения двух чисел

 

=======Программа нахождения суммы двух чисел=======

 

Будьте добры, введите, пожалуйста, первое слагаемое -> 44

А теперь, если это Вас не очень затруднит, второе -> 33

 Сумма чисел 44 и 33 равна 77

 

******* Программа выполнена *******

 

Рисунок 3.2 – Результаты работы программы Example_1




ВВОД-ВЫВОД ДАННЫХ

 

 

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

В данном разделе будет рассмотрен только ввод данных с клавиатуры и вывод их на монитор. Ввод данных из файла и вывод в файл будут рассмотрены в главе 9.

 

 

Ввод данных с клавиатуры

 

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

 Формат процедуры:

Read(X1,X2,…XN);

где X1, X2, …, XN – переменные допустимых типов данных.

При выполнении процедуры Read программа приостанавливает своё выполнение и ждет ввода данных с клавиатуры.

Значения X1, X2, …, XN набираются как минимум через один пробел (или Enter) и при вводе высвечиваются на экране. После набора данных нажимается клавиша Enter.

Переменные должны вводиться в строгом соответствии с синтаксисом языка Паскаль. Если соответствие нарушено (например, переменная Х1 объявлена как целая, а на клавиатуре набран символ или число с десятичной точкой), то возникают ошибки ввода-вывода с сообщением I/O Error XX, где ХХ – код ошибки.

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

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

 

 

Вывод данных на монитор

 

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

Формат процедуры:

Write(Y1,Y2,…,YN);

или

Writeln(Y1,Y2,…,YN);

где  Y1,Y2,…,YN – выражения целого, действительного, строкового или булевского типа.

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

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

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

Writeln(’Площадь круга равна ’,Skr);

Writeln(’По лесу бродило ’,NZ,’ зверей’);

 

 

Форматы вывода

 

В ТУРБО ПАСКАЛЕ при выводе информации на экран или в текстовый файл по умолчанию отводится количество позиций, равное размеру этой информации. Так при выводе символа отводится одна позиция; при выводе строки – число позиций, равное длине строки; при выводе целого числа – число позиций, равное числу значащих цифр плюс одна позиция под знак, если число отрицательное. Это необходимо учитывать при выводе последовательности элементов информации (например, нескольких целых чисел) и предусмотреть меры, чтобы отдельные элементы информации не сливались друг с другом: вывод разделяющих пробелов, разнесение информации по разным строкам и т.д. Исключение составляют вещественные числа – под них выделяется 23 позиции.

Изменить стандартную форму вывода можно с помощью форматов вывода языка Паскаль.

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

Первый из них записывается в виде:

Write(Y:M);

где Y – выражение, значение которого выводится на экран;

М – целое число.

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

Второй формат вида:

Write(Y:M:N);

где M и N – целые числа, используется только с вещественными числами. Величина М имеет тот же смысл, что и в предыдущем случае, но число представляется в форме с фиксированной точкой (естественная математическая форма) и выводится с N знаками после десятичной точки. Если величина М задана такой, что её величина не позволяет вывести число N знаков после десятичной точки, то значение М игнорируется.

 

На рисунке 4.1 приведен пример программы форматного вывода целых чисел, на рисунке 4.2 – результаты работы, на рисунке 4.3 – пример программы вывода вещественных чисел, на рисунке 4.4 – результаты работы.

 

Program Example_2;

Var k : integer;

Begin

k:=12345;

Writeln;

Writeln('====================================');

Writeln('Формат вывода Вид вывода');

Writeln(' (k)         k=',k);

Writeln(' (k:2)        k=',k:2);

Writeln(' (k:5)        k=',k:5);

Writeln(' (k:7)        k=',k:7);

Writeln(' (k:10)       k=',k:10);

Writeln(' (k:13)       k=',k:13);

Writeln('====================================')

end.

 

Рисунок 4.1 – Пример программы форматного вывода целых чисел

 

 

====================================

Формат вывода Вид вывода

(k)         k=12345

(k:2)        k=12345

(k:5)        k=12345

(k:7)        k= 12345

(k:10)       k= 12345

(k:13)       k=   12345

====================================

 

Рисунок  4.2 – Результаты работы программы EXAMPLE_2


 

Program Example_3;

Var R : real;

Begin

R:=12.34567;

Writeln;

Writeln('==========================================');

Writeln('Формат вывода       Вид вывода');

Writeln(' (R)         R=',R);

Writeln(' (R:2)        R=',R:2);

Writeln(' (R:10)       R=',R:10);

Writeln(' (R:11)       R=',R:11);

Writeln(' (R:15)       R=',R:15);

Writeln;

Writeln(' (R:9:5)      R=',R:9:5);

Writeln(' (R:10:5)     R=',R:10:5);

Writeln(' (R:5:5)      R=',R:5:5);

Writeln;

Writeln(' (R:5:1)      R=',R:5:1);

Writeln(' (R:5:2)      R=',R:5:2);

Writeln(' (R:5:6)      R=',R:5:6);

Writeln;

Writeln(' (R:15:6)     R=',R:15:6);

Writeln(' (R:15:7)     R=',R:15:7);

Writeln(' (k:15:2)     R=',R:15:2);

Writeln('=========================================')

end.

 

Рисунок  4.3 – Пример программы форматного вывода вещественных чисел

 

 

=========================================

Формат вывода       Вид вывода

(R)         R= 1.23456699999952E+0001

(R:2)        R= 1.2E+0001

(R:10)       R= 1.2E+0001

(R:11)       R= 1.23E+0001

(R:15)       R= 1.234567E+0001

 

(R:9:5)      R= 12.34567

(R:10:5)     R= 12.34567

(R:5:5)      R=12.34567

 

(R:5:1)      R= 12.3

(R:5:2)      R=12.35

(R:5:6)      R=12.345670

 

(R:15:6)     R= 12.345670

(R:15:7)     R= 12.3456700

(k:15:2)     R=     12.35

=========================================

 

Рисунок 4.4 – Результаты работы программы EXAMPLE_3


ОПЕРАТОРЫ

 

 

Оператором называется предложение языка программирования, задающее действие, которое необходимо выполнить. Тело программы на языке ТУРБО ПАСКАЛЯ представляет из себя последовательность операторов. Разделителем операторов служит точка с запятой, после последнего оператора программы обычно никаких знаков не ставится.

 

 

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

 

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

Общий вид оператора присваивания:

<идентификатор>:=<выражение>;

Примеры операторов присваивания:

A:=10;

B:=A+18.3;

C:=sin(al)*cos(bet);

d:=d+1;

F:=(-b+sqrt(b*b-4*a*c))/(2*a);

Flag:=true;

G:=’N’

Как правило, тип выражения должен совпадать с типом переменной, в противном случае на мониторе появляется сообщение об ошибке ERROR 26 Type mismatch (несовместимость типов). Единственным исключением является случай, когда слева находится переменная действительного типа, а справа – выражение целого типа, такой оператор присваивания допустим.

Значения всех переменных, входящих в выражение, должны быть известны к моменту выполнения оператора присваивания и ответственность за это полностью лежит на программисте. Если значение какой-то переменной будет не определено, то разные языки программирования и даже разные версии одного языка поступают по разному. Некоторые при этом дают сообщение об ошибке, некоторые (например, Турбо Паскаль 6.0) – используют вместо неинициализированной переменной случайное значение, Турбо Паскаль 7.0 считает значения таких переменных равными нулю. Считается дурным тоном программирования надеяться на нулевые значения, присваиваемые переменным по умолчанию; следует придерживаться правила: прежде чем использовать значение переменной, его необходимо определить.

 


 


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

 

Существуют две формы условного оператора: сокращенная и полная.

Общий вид условного оператора:

if <логическое выражение> then <оператор>;               {сокращенная форма}

if <логическое выражение> then <оператор_1> else <оператор_2>;

{полная форма}

 

Блок-схемы условного оператора представлены на рисунке 5.1.

 

Сокращенная форма                                             Полная форма

Рисунок  5.1 – Блок-схемы условного оператора

 

Так как условный оператор является единым оператором ни перед then, ни перед else точку с запятой ставить нельзя.

Пример. Дракон в первые 100 лет своей жизни отращивает по 3 головы в год, вторые 100 лет – по 2 головы, всю остальную жизнь – по одной голове в год. Сколько голов и глаз у дракона, которому N лет ?

Математическая формулировка задачи:

Обозначим: K – число голов у дракона, L – число глаз.

если N £ 100
если 100 < N £ 200
если 200 < N

  L = 2 × K (если предположить, что у дракона по 2 глаза на каждой голове).

 

На рисунках 5.2, 5.3 представлены два различных алгоритма A1 и A2 решения этой задачи, на рисунках 5.4, 5.5 – соответствующие им программы.

 

 

Рисунок  5.2 – Алгоритм А1 решения задачи

 

 


 

 

Рисунок  5.3 – Алгоритм А2 решения задачи


 

Program Example_4; { Программа по алгоритму А1 }

Var n,k,l : integer;

begin

Writeln;

Write('Сколько лет дракону? '); Read(n);

If n<=100 then k:=n*3

        else if n<=200 then k:=300+(n-100)*2

                       else k:=500+n-200;

l:=2*k;

Writeln('У вашего дракона ',k,' голов и ',l,' глаз')

end.

Рисунок  5.4 – Программа решения задачи по алгоритму А1

 

 

Program Example_5; { Программа по алгоритму А2 }

Var n,k,l : integer;

begin

Writeln;

Write('Сколько лет дракону? '); Read(n);

If n<=100 then k:=n*3;

If (100 < n) and (n<=200) then k:=300+(n-100)*2;

If 200 < n then k:=500+n-200;

l:=2*k;

Writeln('Число голов дракона =',k);

Writeln('Число глаз дракона =',l)

end.

 

Рисунок  5.5 – Программа решения задачи по алгоритму А2

 






Составной оператор

 

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

Общий вид составного оператора:

begin <оператор_1>; <оператор_2>; … ;<оператор_n> end;

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



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

 

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

 

 

5.4.1. Оператор цикла с предусловием (while …)

 

Общий вид оператора:

while <логическое выражение> do <оператор>;

Блок-схема оператора цикла while показана на рисунке 5.6.

 

Рисунок  5.6 – Алгоритм работы оператора while

 

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

В качестве иллюстрации применения оператора while рассмотрим решение следующей задачи.

Для заданного Х найти сумму N членов ряда:

 

Обозначим  i – номер слагаемого;

t – числитель i – го слагаемого;

z - знаменатель i – го слагаемого;

S – искомая сумма.

 

Алгоритм решения задачи представлен на рисунке 5.7, программа – на рисунке 5.8.


Рисунок 5.7 – Алгоритм решения задачи

 

 

Program Example_6;

Var i,n : integer;

x,t,z,s : Real;

begin

Writeln;

Write('X='); Read(x);

Write('N='); Read(n);

s:=0;

i:=1;

t:=x;

z:=1+x;

While i<=n do begin

s:=s+t/z;

t:=t*x;

z:=z+1;

i:=i+1

end;

Write('S=',s)

end.

Рисунок  5.8 – Программа Example_6

5.4.2 Оператор цикла с постусловием (repeat …)

Общий вид оператора:

Repeat

тело цикла

Until <логическое выражение>;

 

Блок-схема оператора цикла repeat представлена на рисунке 5.9.

Рисунок  5.9 – Алгоритм работы оператора Repeat


Задача: Для заданного Х найти сумму членов ряда

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

 

Обозначения:  i – номер члена суммы; z – знаменатель i – го слагаемого; R – величина i – го слагаемого; S – искомая сумма.  
Алгоритм решения задачи показан на рисунке 5.10, программа – на рисунке  5.11.

 

Рисунок 5.10 – Алгоритм решения задачи

 

 

Program Example_7;

Var i : integer;

x,e,z,s,r : Real;

begin

Writeln;

Write('X='); Read(x);

Write('E='); Read(e);

s:=0;

i:=1;

z:=x*x;

Repeat

r:=i*i/z;

s:=s+r;

z:=z*x*x;

i:=i+1

until abs(r) < e;

Write('S=',s)

end.

 

Рисунок 5.11 – Программа Example_7

 

 

5.4.3 Оператор цикла с параметром (for …)

 

Общий вид оператора цикла с параметром:

For <S>:=<SN> to <SK> do <оператор>;

где S - целая переменная, называемая параметром цикла;

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

Оператор, стоящий после слова do, называют телом цикла, чаще всего это составной оператор.

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

На рисунке 5.12 показаны две блок-схемы оператора цикла; первая из них в точности отражает порядок выполнения оператора, а вторая – условная, более наглядна и проста.


 

 

а) Схема выполнения.                                        б) Условное обозначение

Рисунок  5.12 – Блок-схемы оператора цикла

 

В теле цикла запрещается явное изменение значения параметра цикла S и конечного значения SK (например, оператором присваивания).

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

Существует другая, реже используемая, форма оператора for:

For <S>: = <SN> downto <SK> do <оператор>;

Замена служебного слова TO на DOWNTO означает, что шаг наращивания параметра цикла равен (-1), а управляющее условие приобретает вид S ³ SK.


 

Задача: Вычислить сумму и количество тех двузначных чисел, которые нацело делятся на 3 и не делятся на 4.

 

Алгоритм решения задачи представлен на рисунке 5.13, программа решения – на рисунке 5.14.

Рисунок 5.13 – Алгоритм решения задачи

 


 

Program Example_8;

Var i,n,s : integer;

begin

Writeln;

s:=0;

n:=0;

for i:=10 to 99 do

if (i mod 3 = 0) and (i mod 4 <> 0) then begin

    s:=s+i;

    n:=n+1

end;

Writeln('S=',s,' n=',n)

end.

Рисунок 5.14 – Программа Example_8

 

 











МАССИВЫ

 

 

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

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

 

 

Описания массивов

 

Для описания массивов используются два способа.

Способ

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

 

Примеры:

Var A : array [1..4] of real;

 B : array [0..2] of integer;

 C : array [1..2, 1..3] of real;

A представляет из себя одномерный массив, состоящий из 4-х вещественных чисел, индексы которых могут принимать значения от 1 до 4. Аналогом массива в математике будут индексированные переменные a1, a2, a3, a4.

B – одномерный массив из 3-х целых чисел, индексы которых могут принимать значения 0, 1, 2. Математическим аналогом будет последовательность b0, b1, b2.

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

С11     С12     С13

С21     С22     С23

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

const n = 5;

var x: array[1..n] of real;



Способ

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

<имя типа>=array[ ] of <тип константы>;

Пример:

Type MAS1=Array[1..10] of real;

 MAS2=Array[1..5,1..10] of integer;

VAR   x,y:MAS1;

 z:MAS2;

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

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

 

 

Ввод массива

Чаще всего массив вводится с клавиатуры с помощью оператора for:

read(n);                                                 {чтение числа элементов массива}

for i:=1 to n do read(x[i]); {ввод элементов массива}

Аналогично двумерный массив вводится с помощью вложенного for:

read (k,m);                                    {чтение числа строк и столбцов массива}

for i:=1 to k do

for j:=1 to m do read (z[i,j]);

В этом примере элементы массива вводятся построчно, т.к. быстрее меняется индекс j, соответствующий номеру столбца.



Вывод массива

Вывод значений массива осуществляется аналогичным образом:

for i:=1 to n do write(x[i]);

for i:=1 to k do

for j:=1 to m do writeln(z[i,j]);

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

for i:=1 to k do begin

for j:=1 to m do write (z[i,j]);

writeln

end;

 

Инициализация

Присваивание начальных значений массива проще всего выполняется с помощью оператора цикла for. В следующем примере всем элементам массива х присваивается нуль, а массива  z – единица.

for i:=1 to n do x[i]:=0;

for i:=1 to k do

for j:=1 to m do z[i,j]:=1;

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

for i:=1 to n do y[i]:=x[i];

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

k:=0;                               {счетчик числа отрицательных элементов}

for i:=1 to N do

if x[i]<0 then k:=k+1;

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

DP:=x[2];

x[2]:=x[7];

x[7]:=DP;

 

Задача: Найти минимальный элемент массива х и его номер.

Алгоритм решения задачи представлен на рисунке 6.1, программа – на
 рисунке 6.2.

Обозначения: n      – число элементов массива;

Min  - минимальный элемент;

Nomer - номер минимального элемента.

 

Рисунок 6.1 – Блок-схема алгоритма

 

Program Example_10;

Var i,n,nomer : integer;

x : array[1..20] of real;

min : real;

Begin

Writeln;

Write('Введите число членов массива '); Read(n);

For i:=1 to n do begin

     Write('x[',i,']=');

     Read(x[i])

end;

min:=x[1];

nomer:=1;

for i:=2 to n do

if x[i] < min then begin

                      min:=x[i];

                      nomer:=i

end;

Writeln('Минимальный член массива ',min);

Writeln('Его номер ',nomer)

End.

Рисунок 6.2 – Программа Example_10


 




ПОДПРОГРАММЫ

 

 

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

Во-первых, в связи со значительным увеличением сложности и объема задач, решаемых с помощью ЭВМ, разработка и отладка программных комплексов стала вызывать дополнительные трудности. Для решения возникших при этом проблем в практике программирования выработан ряд технологий и методов, которые принято называть методами структурного программирования. В результате применения этих методов алгоритм представляется в виде последовательности независимых друг от друга фрагментов – подпрограмм.

Подпрограммы, в свою очередь, могут разбиваться на менее крупные подпрограммы, такие, что их можно легко программировать и отлаживать. Именно за наличие подпрограмм, как средства конструирования программ, язык ТУРБО ПАСКАЛЬ называется процедурно-ориентированным.

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

В языке ТУРБО ПАСКАЛЯ имеются две разновидности подпрограмм – процедуры и функции.

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

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

 

 

Процедуры

 

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

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

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

Пример программы сложения двух чисел с использованием процедуры приведен на рисунке 7.1.

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

 

Рисунок 7.1 – Программа Example_11

 

При вызове процедуры значения фактических параметров x, y, z будут переданы формальным параметрам процедуры a, b, c, после чего начнется выполнение самой процедуры. После завершения работы процедуры значения тех формальных параметров, перед которыми стоит слово var (в приведенном примере это параметр с), передаются в основную программу соответствующим фактическим параметрам (переменной z ).

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

Список формальных параметров может включать в себя:

²параметры-значения:

²параметры-переменные;

²параметры-константы;

²параметры-функции.

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

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

Фактические и формальные параметры должны быть строго согласованы между собой по:

²количеству;

²порядку следования;

²типу.

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

Для типа формального параметра нельзя указывать тип вида Array[1..20] of Real. Если параметром процедуры должен быть массив, то в основной программе следует описать тип-массив, а затем использовать его в заголовке, например:

type Arr=array[1..20] of real;

. . .

Procedure Max(X:arr; n:integer; var xmax:real);

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

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

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

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

Каждому параметру-переменной должен соответствовать фактический параметр только в виде переменной.

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

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

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

Использование параметров-функций будет рассмотрено в разделе 12.


Задача. Поменять местами минимальные элементы массивов X и Y, содержащих n и m элементов, соответственно.

Алгоритм решения задачи представлен на рисунке 7.2, а программа – на рисунке 7.3.

 

 

Основная программа                                  Подпрограмма MinMas.

Рисунок  7.2 – Блок-схема алгоритма задачи

Program Example_12;

Type mas = array[1..20] of real;

Var n,m,i : integer;

  x,y : mas;

  n_min,m_min:integer; {Номера min элементов в массивах X и Y}

x_min,y_min : real; {Минимальные элементы в массивах X и Y}

Procedure MinMas(k:integer;z:mas;var numer:integer;var min:real);

var i : integer;

begin

  min:=z[1];

  numer:=1;

  for i:=2 to k do

     if z[i]<min then begin min:=z[i]; numer:=i end

end;

begin

writeln; write('Введите n,m '); Read(n,m);

writeln('Введите массив Х');

for i:=1 to n do begin

write('x[',i,']='); read(x[i])

end;

writeln('Введите массив Y');

for i:=1 to m do begin

write('y[',i,']='); read(y[i])

end;

MinMas(n,x,n_min,x_min); {Поиск min элементов и их номеров }

MinMas(m,y,m_min,y_min); {в массивах X и Y, соответственно }

x[n_min]:=y_min;   {Обмен}

y[m_min]:=x_min;   {Обмен}

write('Массив Х ');

for i:=1 to n do write(x[i]:4:1);

writeln;

write('Массив Y ');

for i:=1 to m do write(y[i]:4:1)

end.

Рисунок  7.3 – Программа Example_12





Функции

 

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

Первое отличие состоит в том, что функция возвращает всегда одно единственное значение.

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

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

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

Задача: Вычислить число сочетаний из n элементов по m по формуле:

Алгоритм решения задачи представлен на рисунке 7.4, программа решения – на рисунке 7.5.

 

Рисунок  7.4 – Блок-схема алгоритма задачи

 

Program Example_13;

Var n,m : integer;

c : real;

Function Fact(k:integer):integer;

var f,i : integer;

begin

  f:=1;

  for i:=1 to k do f:=f*i;

  Fact:=f

end;

Begin

writeln; write('Введите n,m '); Read(n,m);

c:=Fact(n)/Fact(m)/Fact(n-m);

writeln('C=',c:3:0)

End.

Рисунок  7.5 – Программа Example_13




СТРОКИ

 

 

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

 

Для обработки последовательности символов в ТУРБО ПАСКАЛЕ введено понятие строки символов и, соответственно, строкового типа данных.

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

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

var

fio : string [20];

group : string;

zver : string [255];

Если длина в описании явно не указана, то она по умолчанию принимается равной 255, т.е. последние две строковые переменные эквивалентны.

Значением строковой переменной может быть произвольная последовательность символов, взятая в апострофы, например:

’пример строки’

’’

’TURBO PASCAL’

Длина этих строк 13, 0, 12 символов, соответственно.

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

Вывести строку можно при помощи операторов Write и Writeln.

В операторе присваивания могут использоваться выражения строкового типа, например:

hours := ’12 часов’;

min :=’13 минут’;

time  :=’ сейчас’+’ ’+hours+’ ’+min;

Знак “+” в последнем выражении для строковых переменных определяет операцию сцепления. При выполнении данной операции к первой строке добавляется вторая. Ограничение общей длины – 255 или заданное число символов остается, поэтому если при присваивании превышается максимальная длина строки, то лишние символы справа отсекаются.

Кроме операции “+” к строковым переменным могут применяться операции отношения ( =, <>, >, >=, <, <=). Строки сравниваются посимвольно слева направо, при сравнении используются коды соответствующих символов из таблицы ASCII (Приложение). Строки считаются равными только при одинаковых символах и одинаковой длине. Результат выполнения сравнения строк имеет булевский тип и принимает значения True и False. Например:

’Z’ < ’z’

’3’ > ’23’

’then’ > ’tHen’

’pause’ <> ’pauSe’

’alpha’ = ’alpha’

Строки обладают очень важным свойством – к ним можно обращаться как к простой переменной и как к массиву, элементами которого являются отдельные символы, нумерующиеся с 1. Например, если Stroka – переменная строкового типа и в ней 40 символов, то узнать, сколько в ней содержится знаков *, можно с помощью следующего фрагмента программы:

S:=0;              {инициализация счетчика}

For i:=1 to 40 do

if Stroka[i]=’*’ then S:=S+1;

 

 

Процедура Insert (вставить)

Insert(StIn:string; var StRez:string; Pos:integer);

Процедура вставляет строку StIn в строку StRez, начиная с позиции Pos. Если значение Pos превышает исходную длину строки, то строка StIn присоединяется справа к строке StRez. Если общая длина результирующей строки StRez превышает максимально определенную для неё, то символы, выходящие за пределы StRez, отсекаются. Например:

var st1:string[20];

begin

St1:=’пример’;

Insert(’Мой ’,St1,1); {Результат St1=’Мой пример’}

Insert(’любимый ’,St1,5);{Результат St1=’Мой любимый пример’}

Insert(’самый ’,St1,5);  {Результат

                       St1=’Мой самый любимый пример’}

 

Процедура Str (преобразование числа в строку)

Str(val:real{или integer}; var St:string);

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

a:=-6; b:=8.1E-3;

Str(a :3, St1);     {Результат St1=’ –6’}

Str(a :9:5, St2);   {Результат St2=’ 0.00810’}


Процедура Val (преобразование строки в число)

Val(St:string; var Res:real{или integer}; var Ier:integer);

Процедура преобразует строковое значение St в числовое значение и присваивает это значение переменной Res.

Если преобразование завершено без ошибок, то значение выходного параметра Ier (индикатор ошибки) равно нулю, иначе Ier содержит номер первого ошибочного символа в St, например:

Var R1:integer; R2:real; St1:string; Var Ier:integer;

begin

St1:=’12345’

Val(St1,R1,Ier); {Результат R1=12345, Ier=0}

St1:=’2.5Е3’

Val(St1,R2,Ier); {Результат R2=2500, Ier=0}

St1:=’1+1’

Val(St1,R1,Ier); {Результат R1 не определен, Ier=2}

 


РАБОТА С ФАЙЛАМИ ДАННЫХ

 

 

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

В Паскале существуют три типа файлов: текстовые, типизированные, не типизированные; в данном пособии будет рассмотрена работа только с текстовыми файлами, которые можно рассматривать как последовательность символов, разбитую на строки длиной от 0 до 255 символов.

 

Чтение данных из файла

 

Для того, чтобы прочитать данные из файла необходимо:

² в разделе описания переменных описать файловую переменную типа text;

Формат описания

<идентификатор переменной> : text;

Например:

var F :text;

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

Assign(<файловая переменная>, <имя файла>)

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

Assign(F,’E:\2AT-19D\VOVAN.TXT’)

К моменту выполнения данной процедуры указанный в процедуре Assign файл должен существовать.

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

Reset(<файловая переменная>);

² Считать данные из файла операторами Read или Readln, имеющими для чтения из файла вид:

Read(<файловая переменная>,<список ввода>);

Readln(<файловая переменная>,<список ввода>);

Например:

Read(F,x,y,z);

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

² Закрыть файл процедурой Close:

Close(<файловая переменная>);

 

Например:

Close(F);

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

Задача. В файле D:\WORK\GRUPPA.DAT хранится информация об успеваемости студентов в виде, представленном на рисунке 9.1. Необходимо вычислить среднюю оценку группы по информатике.

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

 

        Группа 2АТ-19D

 

Студентов в группе: 7

Фамилия физика информатика пение

Иванов 5   5    5

Петров 3   4    5

Сидоров 5   4    3

Кошкин 2   3    4

Сошкин 4   3    2

Лукошкин 3   4    4

Картошкин 5   5    2

 

Рисунок 9.1 – Содержимое файла GRUPPA.DAT

 

Program Example_16;

var i,n    : integer;  { n- число студентов в группе }

stud   : string[20]; { строка символов перед числом студентов }

fio    : string[10]; { фамилия студента }

inf,fiz,sum : integer;  { оценки по информатике, физике, сумма }

f      : text;  { файловая переменная }

begin

assign(f,'d:\work\gruppa.dat'); {Связывание файловой}

                              {переменной с файлом}

reset(f);                  { Открытие файла для чтения }

Readln(f); Readln(f);      { Пропуск первых двух строк файла }

Read(f,stud);         { Считывание текста в начале 3-ей строки }

                         { чтобы "добраться" до числа студентов }

readln(f,n);          { Чтение числа студентов в группе }

readln(f);            { Пропуск строки с текстом }

sum:=0;               { Инициализация переменной }

for i:=1 to n do begin { Чтение оценок студентов }

    readln(f,fio,fiz,inf);

    sum:=sum+inf    { Нахождение суммы оценок по информатике }

end;

writeln('Средняя оценка по информатике: ',sum/n:4:2);

close(f)              { Закрытие файла }

end.

 

Рисунок 9.2 – Программа Example_16

 

Если необходимо прочитать информацию из файла, но число строк в нем заранее неизвестно, то можно использовать функцию EOF (<файловая переменная>) для определения достижения конца файла (EOF – сокращение от end of file).

Программа решения той же задачи для произвольного числа строк в файле GRUPPA.DAT показана на рисунке 9.3.

 

Program Example_17;

var i,n    : integer;  { n- число студентов в группе}

fio    : string[10]; { фамилия студента }

inf,fiz,sum : integer;  { оценки по информатике, физике, сумма}

f      : text;  { файловая переменная }

begin

assign(f,'d:\work\gruppa.dat'); {Связывание файловой переменной с файлом}

reset(f);                  { Открытие файла для чтения }

Readln(f);Readln(f);Readln(f);Readln(f);{ Пропуск первых 4-х строк файла}

sum:=0; i:=0;              { Инициализация переменных }

while not eof(f) do begin     { Пока не конец файла f выполнять ...}

    readln(f,fio,fiz,inf); { Чтение оценок студентов }

    sum:=sum+inf;        { Нахождение суммы оценок по информатике}

    n:=n+1               { Определение числа студентов в списке }

end;

writeln('Средняя оценка по информатике: ',sum/n:4:2);

close(f)                         { Закрытие файла }

end.

 

Рисунок 9.3 – Программа Example_17

 

 

Запись данных в файл

 

Для того, чтобы записать данные в файл необходимо:

² описать файловую переменную так же, как это было показано в предыдущем разделе;

² связать файловую переменную с файлом с помощью процедуры Assign ( см. раздел 9.1);

² открыть файл для записи с помощью процедуры

Rewrite(<файловая переменная>);

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

Append(<файловая переменная>);

Если к моменту выполнения процедуры Rewrite указанного файла не сущест-вует, то будет создан пустой файл с заданным именем; если файл существовал, то процедура стирает его содержимое.

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


 

² Записать данные в файл с помощью процедур Write или Writeln, имеющих для вывода в файл формат:

Write(<файловая переменная>,<список ввода>);

Writeln(<файловая переменная>,<список ввода>);

² Закрыть файл процедурой Close

Close(<файловая переменная>);

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

 

Задача. Составить программу, которая считывает текст из файла, заменяет в нем все буквы «Ф» на «Ж», записывает в новый файл на диск и показывает результаты работы на экране.

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

 

Program Example_18;

var i : integer;

name_in, name_out, stroka : string;

f_in,f_out : text;      { Файловые переменные для чтения и записи }

begin

Write('Введите полное имя исходного файла ');

Readln(Name_in);         { Чтение имени входного файла}

assign(f_in,name_in);    { Связывание f_in с входным файлом}

Write('Введите полное имя нового файла ');

Readln(Name_out);        { Чтение имени выходного файла}

assign(f_out,name_out);  { Связывание f_out с выходным файлом}

reset(f_in);             { Открытие файла для чтения }

rewrite(f_out);          { Открытие файла для записи }

while not eof(f_in) do begin

    readln(f_in,stroka); { Чтение одной строки из входного файла }

    for i:=1 to length(stroka) do { Замена символов }

            if stroka[i]='Ф' then stroka[i]:='Ж';

      writeln(f_out,stroka); { Запись строки в выходной файл }

    writeln(stroka);   { Вывод строки на экран }

end;

close(f_in);             { Закрытие файла f_in }

close(f_out)             { Закрытие файла f_out }

end.

 

Рисунок  9.4 – Программа Example_18




Назначение модуля CRT

 

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

При работе с экраном через модуль CRT, он разбивается на отдельные элементы (позиции), показанные на рис. 10.1, в каждую точку которых можно поместить один символ (в том числе и пробел). Для каждого элемента можно задать цвет фона и цвет символа.

 

Размеры экрана в текстовом режиме – 80 позиций по горизонтали и 25 – по вертикали. Координата Х меняется по горизонтали слева направо, Y – по вертикали сверху вниз. Началом отсчета является левый верхний угол с координатами (1, 1) – рисунке 10.1.

 

Рисунок 10.1 – Координаты позиций экрана в текстовом режиме

 

Цвета экрана кодируются либо значениями констант, либо их кодами, представленными в таблице 10.1.

Таблица 10.1 – Кодировка возможных цветов экрана

Константа Код цвета Значение
Black 0 черный
Blue 1 синий
Green 2 зеленый
Cyan 3 бирюзовый
Red 4 красный
Magenta 5 малиновый
Brown 6 коричневый
LightGray 7 светло-серый
DarkGray 8 темно-серый
LightBlue 9 светло-синий
LightGreen 10 светло-зеленый

Продолжение таблицы 10.1.

LightCyan 11 светло-бирюзовый
LightRed 12 ярко-красный
LightMagenta 13 светло-малиновый
Yellow 14 желтый
White 15 белый
Blink 128 мерцание

 

Для символов можно использовать любые цвета из таблицы, а для фона – только цвета с кодами от 0 до 7.

 

 


Процедура ClrScr;

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

 

Процедура Delay(Msec:Word);

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

 

Процедура DelLine;

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

 

Процедура GoToXY(X,Y:Byte);

Устанавливает курсор в точку с заданными координатами. Если задаются недопустимые координаты (Х > 80 или Y > 25), то обращение к процедуре игнорируется.

Функция KeyPressed:Boolean ;

Возвращает значение True, если на клавиатуре нажата клавиша и False в противном случае. Символ (символы) остаются в буфере клавиатуры. Нажатие клавиш Shift, Alt, Ctrl не распознается. Код клавиши можно считать с помощью функции ReadKey.

 

Процедура NoSound;

Выключает внутренний динамик.

Функция ReadKey:Char;

Считывает символ, нажатый на клавиатуре. Считанный символ на экране не отображается.

Процедура Sound(Herz:Word);

Включает внутренний динамик, параметр Herz задает частоту генерируемого сигнала в герцах.

Процедура TextBackGround(Color:Byte);

Устанавливает фоновый цвет. Параметр Color должен быть целого типа и иметь значение от 0 до 7.

 

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

 

 

Пример 10.1. Иногда возникает необходимость приостановить выполнение программы до нажатия какой-либо клавиши. Это можно сделать с помощью процедуры Wait, приведенной на рисунке 10.2.

 

Рисунок 10.2 – Процедура приостановки программы

 

Пример 10.2. Программа Example_19, показанная на рисунке 10.3, иллюстрирует технику управления цветами выводимых символов.

Program Example_19;

Uses CRT;

Begin

Writeln('По умолчанию выводятся белые символы');

Writeln('      на черном фоне      ');

      { Задание цветов цвета текстовыми константами}

TextColor(Yellow);

TextBackGround(Blue);

Writeln('Желтые символы на синем фоне');

     { Задание цветов числовыми константами }

TextColor(4);

TextBackGround(7);

Writeln('Красные символы на сером фоне');

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

TextColor(15+128);

TextBackGround(4);

Writeln('Белый мерцающий текст на красном фоне');

End.

Рисунок 10.3 – Программа Example_19

Пример 3. Написать программу, имитирующую движение шарика по экрану, который изменяет свое направление, «отражаясь» от краев экрана. Для изображения шарика использовать символ « 0 ». Каждое отражение сопроводить звуковым сигналом. Программа решения задачи показана на рисунке 10.4.

 

Program Example_20; {Скачущий шарик}

Uses CRT;

Const Ball='O';     { имитация шарика }

  Blank=' ';    { стирание шарика }

Var x,y : byte;   { текущие координаты шарика }

  Right, Down : boolean; { признаки направления движения }

Procedure Beep;      { звуковой сигнал при достижении края }

Begin

Sound(100); Delay(100); NoSound

End;

Begin

Clrscr;           {чистим экран}

Write('Для завершения нажмите любую клавишу');

GotoXY(10,5);

x:=9; Y:=5;

repeat

  GotoXY(x,y);

  Write(blank);    { стираем старое положение шарика }

  if Right Then x:=x+1 else x:=x-1; { определяем новое }

  if Down Then y:=y+1 else y:=y-1; { положение шарика }

  GotoXY(x,y);

  Write(Ball);                  {рисуем шарик}

  Delay(100);                   {задержка для наглядности}

  If x=80 then begin Right:=False; Beep End; {достигли правой границы}

  If x=1 then begin Right:=True; Beep End; {достигли левой границы}

  If y=25 then begin Down:=False; Beep End; {достигли низа экрана}

  If y=1 then begin Down:=True; Beep End; {достигли верха экрана}

until KeyPressed;

Clrscr      {чистим за собой экран}

End.

 

Рисунок 10.4 – Программа Example_20

 




ГРАФИКА

 

 

Назначение модуля GRAPH

 

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

X
В графическом режиме экран представляет собой матрицу из точек (пикселов), причём имеется возможность управлять цветом каждой отдельной точки. Координаты любой точки определяются парой целых чисел – порядковым номером в строке Х и порядковым номером строки экрана Y.  Таким образом, координаты левого верхнего угла экрана (0, 0). Число точек в строке и число строк определяются режимом работы и для наиболее часто используемого (VGAH) составляют величины 640 и 480. На рисунке 11.1 показано расположение осей и координаты угловых точек экрана.

 

Рисунок 11.1 – Координаты экрана в графическом режиме

 

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

Кодировка цветов графического экрана совпадает с описанной в разделе 10.1.

При работе с библиотекой графических модулей её необходимо подключить конструкцией Uses GRAPH.

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

InitGraph(var gd,gm:integer; pt:string);

где   gd - тип графического адаптера;

gm – режим работы графического адаптера;

pt - путь к драйверам адаптера.

Для автоматического выбора адаптера переменной gd необходимо присвоить значение gd: = detect, при этом переменная gm не используется, а вместо pt нужно использовать пробел.


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

CloseGraph;

которая завершает работу в графическом режиме, освобождает буфер, сбрасывает все графические режимы.

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

RestoreCrtMode;

Обратный переход можно выполнить с помощью процедуры

SetGraphMode;

 

 



Процедуры работы с текстом

 

ПроцедураOutText ( TextString : string );

Вывод на экран строки, начиная с текущей позиции светового пера.

 

ПроцедураOutTextXY(x,y:integer;TextString:string);

Выдача на экран строки текста, начиная с точки, имеющей координаты x , y.

 

ПроцедураSetTextJustify(horiz,vert:word);

Горизонтальная и вертикальная привязка выводимого текста относительно текущего положения светового пера. Параметр horiz может принимать значения: 0 – левое выравнивание; 1 – центрирование; 2 – правое выравнивание. Параметр vert может принимать значения: 0 – нижнее выравнивание; 1 – центрирование; 2 – верхнее выравнивание.

 

 

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

 

Задача 11.1. Нарисовать дом (рисунок 11.2).

В программе приняты следующие обозначения:

x n, y n - координаты левого нижнего угла дома;

l       - ширина дома;

ras   - расстояние от дома до дерева;

l 0, h 0 - ширина и высота окон;

2a    - расстояние между окнами;

ld     - ширина ствола дерева;

h 1, h 2 - высота первого этажа дома и крыши;

P      - расстояние от пола до окна;

hd    - высота ствола дерева;

h k    - расстояние от земли до центра кроны;

 

rdx, rdy – полуоси эллипса, изображающего крону.

Рисунок 11.2 – Схема дома


Программа решения задачи показана на рисунке 11.3.

 

Program Example_21;

uses GRAPH;

Const xn=150; yn=300; l=120; ras=100; lo=40; a=10; ld=10;

ho=60; h1=100; h2=50; p=25; hd=67; hk=120; rdx=25; rdy=55;

var gd,gm,x,y,x1,y1,x2,y2 : integer;

begin

gd:=detect;             { автовыбор адаптера }

initgraph(gd,gm,' ');   { инициализация графического режима }

SetColor(6);            { установка коричневого цвета }

Rectangle(xn,yn,xn+l,yn-h1); { рисование первого этажа }

x:=xn+l div 2 -a; y:=yn-p;

x1:=x-lo; y1:=y-ho;

Rectangle(x,y,x1,y1);   { левое окно }

x2:=x-lo div 2; y2:=y-ho div 2;

line(x,y2,x2,y);        { ромбик в левом окне }

line(x2,y,x1,y2);

line(x1,y2,x2,y1);

line(x2,y1,x,y2);

x:=x+2*a; x1:=x+lo;

Rectangle(x,y,x1,y1);   { правое окно }

x2:=x+lo div 2;

line(x,y2,x2,y);        { ромбик в правом окне }

line(x2,y,x1,y2);

line(x1,y2,x2,y1);

line(x2,y1,x,y2);

x:=xn+ l div 2; y:=yn-h1;

Ellipse(x,y,0,180,l div 2,h2); { крыша }

y:=y-h2 div 2;

Ellipse(x,y,0,360,15,20);    { окно на чердаке }

Line(x-15,y,x+15,y);       { рама в окне на чердаке }

Line(x,y-20,x,y+20);

x:=xn+l+ras; y:=yn;

Rectangle(x,y,x+ld,y-hd);  { ствол дерева }

x1:=x+ld div 2; y1:=y-hk;

Ellipse(x1,y1,0,255,rdx,rdy); { крона дерева }

Ellipse(x1,y1,285,360,rdx,rdy);

SetFillStyle(10,2);        { закраска кроны }

FloodFill(x1,y1,6);

SetFillStyle(1,6);         { закраска ствола}

FloodFill(x1,y1+rdy,6);

Line(xn-20,yn,xn+l+ras+ld+20,yn); { основание - земля }

readln;                    { фиксация изображения }

CloseGraph                 { закрытие графического режима}

end.

 

Рисунок 11.3 – Программа Example_21

 

Задача 11.2. Построить спираль вокруг точки с координатами (x c, y c), число витков – 20, начальное направление спирали образует с осью абсцисс угол a.

Параметрическое уравнение спирали:

x = R × cos t

y = R × sin t

R = t

a £ t £ 2 p n

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

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

Первоначально луч на экране устанавливаем в точку с координатами (x c, yc).

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

x c, yc – координаты центра экрана;

n    - количество витков спирали;

t     - параметр уравнения, описывающего спираль;

R   - радиус спирали;

x, y - координаты текущей точки.

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

 

Program Example_22;

uses GRAPH;

Const xc=320; yc=200; n=20; { координаты центра и количество витков }

var gradus,t,r :real;

k,gd,gm,i,x,y : integer;

begin gradus:=pi/180;         { 1 градус в радианах }

t:=pi/4;                { начальный угол - 45 градусов }

gd:=detect;             { автовыбор адаптера }

initgraph(gd,gm,' ');   { инициализация графического режима }

MoveTo(xc,yc);          { установка луча в центр экрана }

for i:=1 to n do begin  { цикл по виткам спирали }

    for k:=1 to 360 do begin { построение 1-го оборота спирали }

       t:=t+gradus;

       r:=t*1;

       x:=round(r*cos(t))+xc;

       y:=round(r*sin(t))+yc;

       LineTo(x,y)

    end

end;

readln;                 { фиксация изображения }

CloseGraph                { закрытие графического режима}

end.

 

Рисунок 11.4 – Программа Example_22

 



МОДУЛИ

Модуль – это автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, функции и процедуры) и, возможно, некоторые исполняемые операторы. Наличие модулей в ТУРБО ПАСКАЛЕ позволяет программировать и отлаживать программу по частям, создавать библиотеки подпрограмм и данных, воспользоваться возможностями стандартных модулей, практически неограниченно увеличивать кодовую (содержащую коды команд) часть программы.

Структура модуля показана на рисунке 12.1.

 

UNIT   <имя_модуля>;

INTERFACE

<интерфейсная часть>;

IMPLEMENTATION

<исполняемая часть>;

BEGIN

<секция инициализации>

END.

 

Рисунок 12.1 – Структура модуля

 

Заголовок модуля состоит из служебного слова UNIT и следующего за ним имени модуля. Это имя должно совпадать с именем дискового файла, в который помещается исходный текст модуля, т.е. содержать не более восьми латинских букв и цифр и начинаться обязательно с буквы. Если, например, имеем заголовок модуля MyModule, то исходный текст должен размещаться в файле MyModule.pas.

Интерфейсная часть содержит объявления всех глобальных объектов (типов, констант, переменных и подпрограмм), которые должны стать доступными в основной программе, в данном модулеи/или в других модулях. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок, например:

Unit MyModule;

Interface

type Mas=array[1..20] of real;

var Ier:integer;

Procedure Sum(x:Mas; n:integer; Var S:real);

При такой интерфейсной части в основной программе, использующей модуль MyModule, и в самом модуле станут доступны тип Mas, переменная Ier и процедура Sum.

Исполняемая часть содержит описания подпрограмм, объявленных в интерфейсной части. В ней могут также объявляться локальные для модуля объекты – вспомогательные типы, константы, переменные.


Описанию подпрограммы, объявленной в интерфейсной части модуля, в исполняемой части должен предшествовать заголовок, как, например, это показано на рисунке 12.2.

 

 

Unit MyModule;

Interface

type Mas=array[1..20] of real;

var Ier : integer;

Procedure Sum(x :Mas; N :integer; Var S :real);

Implementation

Procedure Sum(x :Mas; N :integer; Var S :real);

     Var i :integer;

     Begin

           S :=0;

           For i :=1 to N do S :=S+X[i]

     end;

end.

 

 

Рисунок 12.2 – Пример модуля

 

Секция инициализации завершает модуль. Она может отсутствовать вместе с начинающим её словом BEGIN или быть пустой – тогда за BEGIN сразу следует END.

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

 

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

Для вычисления интеграла методом левых прямоугольников отрезок интегрирования делится на n равных частей длиной h и используется формула:

.

 

На рисунке 12.3 представлена программа Example_22, а на рисунке 12.4 текст модуля, к которому обращается программа.


 

Program Example_23;

uses Studious;

var n : integer;

s,a,b : real;

Function f1(x:real):real;

begin

f1:=sin(x)

end;

Function f2(x:real):real;

begin

f2:=x*x+1

end;

Begin

write('Введите N '); Read(n);

write('Введите A,B '); Read(a,b);

S:=Integral(a,b,n,f1)+Integral(a,b,n,f2); 

write('S=',s:6:3)

end.

 

Рисунок 12.3 – Программа Example_23

 

Unit Studious;

Interface

uses CRT;

Type fun=function(x:real):real;

Function Integral(a,b:real;n:integer;f:fun):real;

Implementation

Function Integral(a,b:real;n:integer;f:fun):real;

var s,h:real;

i:integer;

begin

h:=(b-a)/n;

s:=0;

for i:=1 to n-1 do s:=s+f(a+i*h)*h;

integral:=s

end;

begin

clrscr;

Writeln('Работает модуль студента Сидорова')

end.

Рисунок 12.4 – Текст модуля Studious

 

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





Электронная документация

(каталог Z :\ EDUCATION \Программирование\ TPascal сервера кафедры ИиП)

e 1 Паскаль. Избранные уроки, набор статей - Каталог «Паскаль - Избранные уроки»

e 2 Pascal. Лекции - файл «Pascal - лекции по программирования.txt»

e 3 TurboPascal. Электронный учебник - файл «TurboPascal - самоучитель.chm»

е 5 Абрамян М.Э. Programming Taskbook. Электронный задачник по программированию. Версия 4.5 – файл «Programming Taskbook»

е6 Видеокурс Pascal с нуля в видеоформате. Каталог «Pascal с нуля в видеоформате»

е7 Интернет-учебник «PascalABC.net»  Сайт http://pascalabc.net/.

 


Приложение

 

Таблица кодов символов ASCII

 

 


 

УДК

 

Автор                                                                    Николаев Николай Александрович

 


ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ

 УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ЯДЕРНЫЙ УНИВЕРСИТЕТ

«МИФИ»

 

НОВОУРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ

 

Кафедра информатики и программирования

 

 

Дата: 2019-03-05, просмотров: 236.