Система программирования Турбо паскаль 7.0

         

Конфигурация персонального компьютера


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

                                            Рис. 1.1

И хотя внешний вид ПК может различаться в каких-то деталях, у него обязательно есть клавиатура, монитор и системный блок. Также обычно имеется манипулятор “мышь”, назначение которого заключается в удобном выборе команд и рисовании на экране компьютера, и принтер для распечатки текстов и рисунков.



Файловая система MS DOS


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

MS DOS (MicroSoft Disk Operation System) является самой старой операционной системой для ПК. Бывают такие ситуации, когда ваш компьютер предлагает общаться с ним только на языке MS DOS.  Поэтому существует некоторый объем сведений о структуре DOS, который является необходимым для уверенной  (не посягая на слово “профессиональной”) работе на ПК.

Вся информация, обработкой и передачей которой занимается персональный компьютер, хранится в файлах. Файл – это поименованная область на диске или другом носителе информации. В файлах могут храниться ваши документы, тексты программ, рисунки, мелодии и любые другие данные. Имя файла – это конструкция вида   xxxxxxxx.zzz  , где  xxxxxxxx  -  любая последовательность  букв (желательно латинских), цифр и символов    $ , # , @ , ! , % , ( , ) , { , } , ~ , - , _ , ^ , ` , &   длиной не более 8 знаков. Расположенная после точки цепочка  zzz  называется типом файла (или расширением имени).  Она является необязательной и должна включать не более 3  букв, цифр и выше перечисленных символов.

                                       Примеры

Правильные имена

Неправильные имена

Ivanov.pas



New12.23

Command.doc

CTO(1)

123.$$$

@nn.##

Command,com

Bad.1.2.

New12*23

Fax?doc

Doc*.txt

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

 .com, .exe - программа, готовая к выполнению;

 .bat – командный  файл с набором текстовых команд ;

 .sys – системный файл;

 .c – текст программы на языке СИ;

 .bas – текст программы на языке Бейсик;

 .for – текст программы на языке Фортран;

 .pas – текст программы на языке Паскаль.

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

 В отличие от DOS в современных операционных системах Windows 98, Windows NT и др. файлам и каталогам можно присваивать длинные имена, вплоть до 255 символов !

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

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

<полное имя > = диск : \ подкат1 \ подкат2 \ … \ имя . тип  .

Такое выражение еще называется спецификацией файла. Например, чтобы обратиться из корневого каталога к файлу   anketa.doc на рис.1.2,  необходимо записать спецификацию  C:\OTD1\RITA\anketa.doc. В то же время, если мы работаем в каталоге RITA  (тогда он называется текущим), достаточно записать просто   anketa.doc. Этот каталог является дочерним для OTD1,  который, в свою очередь, будет родительским для RITA.



Команды MS-DOS


Пусть и нечасто, но все-таки могут возникать аварийные ситуации, когда “отказались” грузиться и работать Norton Commander и Windows. В этом случае пользователь должен уметь общаться с компьютером на “низком уровне”, “в DOSе”, используя команды операционной системы.

Команды DOS набираются в командной строке, которую отличает наличие приглашения  (обычно С:\>)  и  мерцающий текстовый курсор. После набора команды необходимо нажать клавишу ввода  [Enter].

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

Bad command or file name – неверно указана команда или имя файла;

Invalid parameter – неверный параметр;

File not found – файл не найден;

Syntax error – синтаксическая oшибка;

Press any key to continue – для продолжения нажмите любую клавишу.

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

                                     Системные

Date – получение или изменение (установка) текущей даты;

Time – получение или изменение (установка) текущего времени;

Cls – очистка экрана дисплея.

                                  Работа с дисками

Format <имя диска>: - форматирование диска;

<имя диска>: - смена текущего диска

                                Работа с каталогами

CD <имя каталога> - объявление текущего каталога(change directory);

Dir – просмотр текущего каталога;

Dir <имя каталога> - выдает содержимое указанного каталога;

Dir/P – производит выдачу с остановкой после каждой страницы-экрана. Для продолжения достаточно нажать любую клавишу;

MD <имя каталога> – создание нового подкатaлога в текущем каталоге (make directory);

RD <имя каталога> - стереть пустой каталог (remove directory).

                       Команды работы с файлами

Copy <имя исходного файла>  <имя конечного файла> - копирование файла;

Del <имя файла> - стирание файла (delete);

Type <имя файла> - выдать на экран содержимое текстового файла ;

Print <имя файла> - выдать на принтер содержимое текстового файла;

Ren <старое имя файла> <новое имя файла> - переименование файла.



Инструментальная система NC


Рассмотренные нами выше команды MS DOS не позволяют управлять работой компьютера в комфортном режиме. Чтобы обеспечивать такую работу имеются программы, которые называются инструментальными оболочками. Примером наиболее часто используемой оболочки служит Norton Commander (сокращенно NC).

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

Запускается Norton Commander с помощью команды NC. Характерным признаком работы с оболочкой являются  два  окна (панели): левое и правое.

В верхней части панелей имеется строка с главным меню, которое становится доступным при нажатии клавиши [F9], либо после щелчка мыши на пунктах меню. Ниже размещен заголовок окна (подсвеченный, если окно в данный момент активно), показывающий имя диска (А:\ - гибкий, С:\ - жесткий диск, и т.д.),  с которым мы в данный момент работаем, а также маршрут перехода в текущий каталог.

Таблицы на панелях содержат имена каталогов (заглавными буквами) и имена файлов  (прописными буквами). Большинство из имен файлов снабжено расширениями, которые выравниваются по правой границе поля таблицы. По панелям перемещается курсорная рамка (клавишами управления курсором или мышью). Для перехода на другую панель служит табулятор [Tab].

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

Еще ниже расположена строка ввода команд DOS. Её можно отличить благодаря тому, что после “приглашения” (С:\…> ) в ней имеется мерцающий курсор. Таким образом, не выходя из NC, мы имеем возможность набирать в этой командной строке любые команды DOS и, нажимая  [Enter], запускать их на выполнение.

Самой нижней является строка “подсказок”, расшифровывающая назначение функциональных клавиш (F1 - “помощь”, F3 - просмотр, F4 - правка, F5 - копирование и т.д.).



Контрольные вопросы


Тема 1.  Конфигурация ПК. Клавиатура

1.   Перечислить устройства ПК.

2.   Назвать стандартные имена дисководов.

3.   Назвать клавиши индикации на клавиатуре.

4.   Назвать клавиши удаления символов.

5.   Назвать клавишу режимов вставки-замещения.

6.   Назвать клавиши перемещения курсора на начало и конец строки.

7.   Назвать клавиши перемещения курсора на страницу вверх и вниз.

8.   Как распечатать содержимое экрана ?

9.   Как ввести символы псевдографики ?

Тема 2.  Файловая система MS-DOS

1.   Что такое ОС ?

2.   Что такое файл ?

3.   Как задается спецификация файла ?

4.   Как задается полное имя файла ?

5.   Что характеризует тип в имени файла ?

6.   Как обозначается корневой каталог ?

7.   Что такое путь ?  Привести пример.

8.   Что такое активный диск и активный каталог ?

9.   Пояснить приглашение вида D:\ST\EC\LENA>.

Тема 3.  Команды MS-DOS

1.   Чем отличаются внутренние команды от внешних ?

2.   Написать команду очистки экрана.

3.   Написать команду смены активного диска.

4.   Написать команды вывода на экран содержимого активного каталога: а) в полном формате; б) в сжатом формате.

5.   Написать команду вывода на экран содержимого неактивного каталога. Привести пример.

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

7.   Написать команду копирования файла из активного каталога на дискету.

8.   Как читается команда: D:\ST\EC>COPY Z *.* A:\<ENTER> ?

9.   Написать команду установки режима сжатой печати.

10. Написать команду форматирования дискеты.

Тема 4.  Работа в среде NC

1.   Что означает текущая панель ?

2.   Как выделить на панели каталог или файл ?

3.   Как активизировать панель ?

4.   Назвать клавиши управления панелями:

а) поменять панели местами;

б) убрать левую панель;

в) убрать правую панель;

г) убрать обе панели.

5.   Как восстановить панели ?

6.   Как прочитать на экране содержимое файла в NC ?

7.   Назвать клавиши:

а) создания нового каталога;

б) переименования каталога или файла;

в) удаление каталога или файла;

г) копирования файла.

8.   Как перейти в родительский каталог из текущего каталога ?

9.   Указать два способа перехода из текущего каталога в другой каталог.

10. Как перейти на другой диск ?

11. Как быстро найти файл ?

12. Как скопировать файл на печать из текущего каталога ?

13. Указать два способа выделения группы файлов.

14. Указать два способа отмены выделенной группы.

Задание на ПК

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

2.   Удалить файлы из собственного каталога. Скопировать в свой каталог файлы с расширением .PAS.

Глава 2. Работа в интегрированной среде

                      Турбо Паскаль 7.0



Организация вычислений в среде Турбо Паскаль


Чтобы осуществить запуск системы Турбо Паскаль, необходимо (если вы находитесь в Norton Commander) войти в каталог TP и набрать в командной строке команду

                       turbo <имя файла>.pas [Enter].

        Выход из системы происходит при нажатии клавиш          [Alt + Х].

       Если набрана команда  TURBO  без имени файла, то работа будет вестись с непоименованным файлом   NONAME00.PAS  , который в процессе работы необходимо будет переименовать  в <имя файла>.pas  .  При работе в Windows запуск системы Турбо Паскаль производится с помощью двойного щелчка левой кнопки мыши по иконке программы Турбо Паскаль. После запуска системы пользователь входит в окно редактора , общий вид которого показан на  рис.  2.1.

File  Edit  Search  Run  Compile  Debug  Tools  Options  Window  Help         

  [ ]                          ZZZZZ.PAS                     1 [_] 

 Program parabola;                                              ? var a,b,p,fi,fi1,fm,Fb,bet,ro,rob,c:real;                        

 n,i: integer;                                                   

 rf1:text;                                                       

 begin                                                          

 assign(rf1,'rfi.dat');rewrite(rf1);                             

 n:=24; p:=pi/3; a:=1.5;  b:=1.0;                               

 fm:=2;                                                         

 writeln('i=',i:2,' fi=',fi:7:3,                                 

 '  RO=',ro:8:4,' figrad=',fi*180/pi:8:3);                        

 writeln(rf1,fi1,ro);end;close(rf1);                             

 end.                                                                          

 

                                                                               

                                                                                

                                                                               

                                                                               


                                                                                
         1:1                                                
  F1 Help  F2 Save  F3 Open  Alt+F9 Compile  F9 Make  Alt+F10 Local menu
                                            Рис. 2.1
Верхняя строка экрана содержит все команды главного меню. В последней строке приведены основные доступные в каждый момент функциональные клавиши с указанием их назначения. Вход в главное меню осуществляется нажатием клавиши  [F10], а выход – клавишей [Esc].
Процесс подготовки, отладки, редактирования и выполнения паскалевской программы начинается с того, что пользователь набирает текст программы в окне редактора, пользуясь клавишами перемещения курсора, клавишами алфавита, цифровыми и др.
Чтобы не потерять набранный вами текст программы ( это может, например, произойти при случайном отключении питания компьютера), необходимо сохранять текст программы на винчестере, нажимая клавишу [F2]. Текст будет сохранен в файле <имя файла>.pas.
Проанализировав визуально текст набранной программы и убедившись, что нет очевидных ошибок, производим компиляцию и выполнение программы. Для этого служит команда главного меню Run или эквивалентное ей,  более  часто   используемое сочетание клавиш  [Ctrl+F9]. Эта команда работает следующим образом:
-    транслирует (компилирует) программу, находящуюся на экране редактора, то есть переводит текст программы на машинный язык и, если в ней не обнаружено синтаксических ошибок, запускает программу на выполнение;
-    если программа уже ранее была откомпилирована (например, командой Compile главного меню), то команда Run ([Ctrl+F9]) сразу посылает программу на выполнение, не проходя этап компиляции.
Как правило, сразу набрать сложную программу без ошибок не удается. При  этом все ошибки делятся на три типа:
-    синтаксические ошибки, выявляемые при компиляции;
-    ошибки на этапе выполнения программы;
-    алгоритмические ошибки;
Синтаксические ошибки, связанные с нарушением правил языка Паскаль, обнаруживаются компилятором. Место этой ошибки будет указывать курсор, помещаемый компилятором  на ошибочный оператор. При этом появляется выделенное цветом повышенной яркости сообщение об ошибке  (диагностика). В нем приводятся номер ошибки и поясняющий текст на английском языке.
Второй тип ошибок – это ошибки, приводящие к аварийному останову программы на этапе выполнения. Часто это может происходить при попытке выполнить некорректную арифметическую операцию, например, извлечь корень квадратный из отрицательного числа или разделить на ноль.
Наконец,  алгоритмические ошибки программист должен самостоятельно “отлавливать” и устранять, решая серию вспомогательных тестовых задач.
Принудительно прервать выполнение программы можно, нажав клавиши [Ctrl+С] или [Ctrl+Break]. На этапе выполнения результаты расчета выводятся в окно Output. Чтобы их просмотреть,  из активного окна редактора следует нажать клавиши [Alt + F5]. Для последующего возврата в окно редактирования достаточно нажать любую клавишу.
В случае затруднения пользователь системы Турбо Паскаль может нажатием клавиш [Ctrl+F1] вызвать контекстно-зависимую помощь (очень эффективную и полезную для программиста). Выход из подсказки производится клавишей [Esc].

Главное меню


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

Поле главного меню содержит следующие команды: File(файл), Edit(редактирование), Search(поиск), Run(выполнение), Compile(компилирование), Debug(отладка), Tools(инструментарий), Options(опции), Window(работа с окнами), Help(помощь).

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



Текстовый редактор


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

Редактирование текста может осуществляться в режиме вставки и замены. В режиме вставки вводимый символ раздвигает текст, смещая остаток строки вправо.  В режиме замены новый символ заменяет тот символ, на который указывает курсор, при этом остаток строки не смещается. Смена режимов осуществляется клавишей [Ins]. При включенном режиме замены курсор представляет собой крупный мигающий прямоугольник, заслоняющий символ целиком.

Для удаления строки, в которой находится курсор, используется  команда [Ctrl + Y].  Восстановление удаленной строки  осуществляется командой [Alt + Back Space].

Эффективным приемом редактирования текста является работа  с  блоками.  Блок – это часть (фрагмент) текста.  Командой  [Ctrl + K , В]  помечается начало блока с позиции, в которой  стоит курсор. Следует отметить, что все буквы в командах набираются в латинском алфавите. Конец блока помечается командой [Ctrl +K , K]  в позиции нового местоположения курсора. После этого блок выделяется другим цветом, отличным от цвета остальной части. После выделения блока с ним можно провести следующие манипуляции, используя приведенные ниже сочетания клавиш:

[Ctrl+ K , Y] – удалить блок;

[Ctrl+ K , C] – скопировать блок;

[Ctrl+ K , V] – переместить блок;    

[Ctrl+ K , W] – записать блок в файл. При этом в диалоговом окне необходимо задать имя файла; 

[Ctrl+ K , R] – прочитать блок из файла. В диалоговом окне необходимо задать имя файла;

[Ctrl+ K , P] – печать блока на принтере;

[Ctrl+ K , H] – снять выделение блока.

Обычно редактор работает в режиме автоотступа, когда каждая новая строка начинается на экране с той же позиции, что и предыдущая. Отказаться от режима можно командой                [Ctrl + O , I]. Повторное нажатие восстановит режим автоотступа.



Интегрированный отладчик


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

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

Допустим, что нам необходимо отладить некоторую программу, содержащую блок операторов:

                     ……

                     a := 1;

                     b := 2;

                     c := 1;

                     d := b * b – 4 * a * c;

                     e := (a + b + c) / d;

                     writeln(‘e = ’, e:8:3);

                     ……

 Отладку начинаем, нажимая клавишу [F7], или выбираем команду Trace into пункта Run главного меню ( сложные команды будем записывать в виде: Run/Trace into). Если  блок удален от начала программы, то нужно установить на него курсор                 (оператор  a:=1;) и нажать [F4]  (команда Run/ Go to cursor). При первоначальном обращении к отладке указанные действия вызывают компиляцию и прогон программы до интересующего нас блока, после чего компьютер переходит в режим ожидания. Последующие нажатия [F7] или [F8] (команда Run/Step over), если нас не интересует трассировка процедур, приведут к построчному выполнению программы. Выполняемая в данный момент строка подсвечивается голубым цветом. Для облегчения выполнения отладки рекомендуется на этом этапе работы в каждой строке размещать только один оператор. В рассматриваемом нами случае мы увидим, что при обработке пятой строки блока возникнет аварийный останов программы в связи с делением на ноль.

Сброс процесса отладки производится клавишами [Ctrl+ F2] (команда Run/Program reset).

Эффективность отладки многократно повышается благодаря возможности видеть, как меняются значения переменных после выполнения каждого оператора. Для этого включаем окно наблюдения командой Debug/Watch. Перед этим с помощью нажатия клавиш [Ctrl +F7] (команда Debug/Add watch) вызывается диалоговое окно для указания значений переменных или арифметических и логических выражений, которые нам необходимо наблюдать.


  При отладке очень удобно работать с многооконным экраном.  Для этого необходимо поочередно окнo редактора, окно наблюдения  и окно программы трансформировать и переместить в соответствующее место (см. параграф 2.3).
Возвращаясь к отладке нашего блока операторов, отметим, что введя в окно наблюдения переменные  d и e, уже после выполнения первых четырех строк блока (4 нажатия клавиши [F7]) мы получим d = 0. Таким образом, хотя программа еще не совершила “авост”, мы уже получим сигнал о том, что предстоит “деление на ноль” на следующем шаге трассировки.
Однако возможности отладки на этом еще не исчерпаны. Вызвав клавишами [Ctrl+ F4] (командa Debug/Evaluate/Modify), мы можем “заказать” новое модифицированное значение для переменной, из-за которой по нашему мнению происходит авост. В строке Expression следует ввести имя переменной (в нашем примере - это d). При этом в поле Rezult появится ее текущее значение. Затем в строке New value вводим новое значение этой переменной (например, d = 1). После нажатия [Enter] отладка благополучно продолжается дальше, перейдя теперь в область программы, расположенной ниже нашего блока. Отметим, что “горячие клавиши” [Ctrl+F4] можно использовать как встроенный в Турбо Паскаль микрокалькулятор.
Отладка больших и сложных программ вызывает необходимость контролировать значения  переменных сразу в нескольких различных фрагментах программы. Остальные участки при этом желательно прогонять быстро, без трассировки. Для этого с помощью клавиш [Ctrl+F8] (команда Debug/Add breakpoint) можно установить несколько так называемых контрольных точек (соответствующая строка будет выделена красным цветом). Чтобы снять контрольные точки, используются клавиши [Ctrl+F2]  (команда Run/Program reset).
Глава 3. Простейшие конструкции языка
                           Турбо Паскаль

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


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

Алфавит языка Турбо Паскаль включает в себя следующие символы.

Строчные и прописные буквы латинского алфавита:

      | a | b | c | …| x | y | z | A | B | C |…| X | Y | Z |.

Арабские цифры:

      | 0 | 1 | 2 |….| 9 |.

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

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

Кроме того, в алфавит Турбо Паскаля включается набор зарезервированных слов, имеющих строго определенное назначение. Например, зарезервированное слово VAR служит для описания переменных, слова IF, THEN, ELSE используются в условных операторах, слово DIV обозначает операцию целочисленного деления . Назначение отдельных зарезервированных слов будет поясняться в процессе изучения языка.



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


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

Целые числа

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

Например:  15   +1000   -47   02.

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

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

В записи десятичного числа целая часть отделяется от дробной десятичной точкой.

Например:  2.5    -14.0   +0.33    0.0.

Числа с указанием порядка

имеют вид:

,   где  a   -   является мантиссой;  p – десятичным порядком.

В Турбо Паскале  числа с порядком записываются с использованием буквы Е, за которой следует порядок. Буква Е читается как “умножить на 10 в степени”.

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

                    Примеры записи чисел с порядком

Математическая

запись

Запись в Турбо Паскале

3.14×105

-17×10-2

25.625

10-6

0.00048

3.14Е5

-17Е-2

2.5625Е1

1Е-6

4.8Е-4

Логические константы

могут принимать одно из двух логических значений, записанных либо словом TRUE (истина), либо словом FALSE (ложь).

Символьная константа

– это любой символ ПК, заключенный в апострофы, например:

                                ‘Y’         ‘Д’           ‘!’           ‘_’.

Строковая константа

– любая последовательность символов из набора символов ПК, заключенная в апострофы, например:

              ‘X =’  ;

      ‘Максимальное значение =’.

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

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

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


Математическая запись
x

    y1
a
S
d-27
Запись в Турбо Паскале
x
ap
y1
alpha
S
d_27

Переменные, подобно константам, могут быть разных типов. Типы задаются стандартными именами.
              INTEGER - целый тип;
              REAL - вещественный тип;
              BOOLEAN - логический тип;
              CHAR - символьный тип;
              STRING - строковый тип.
В программе перед использованием переменной в специальном разделе описаний VAR необходимо объявить тип переменной. Однотипные переменные в разделе перечисляются через запятую и отделяются от объявленного типа двоеточием. После определения типа ставится точка с запятой.
         Пример раздела описания переменных
                            Var
                                k, l: integer;
                                x,y,z: real;
                                t: boolean;
                                w: char;
                                stv: string;
По описанию переменной в памяти компьютера резервируется ячейка для хранения ее значения. В зависимости от объявленного типа ячейка может иметь разную внутреннюю структуру, то есть содержать различное число байт.
Целый тип. Длина ячейки составляет 2 байта, что соответствует диапазону от –32768 до +32767 целых чисел.
Вещественный тип. Длина ячейки – 6 байт. Вещественные числа хранятся в памяти с указанием порядка. Диапазон значений порядка составляет  от 1Е-39 до 1Е+38. Мантисса занимает приблизительно 11 значащих десятичных цифр.

Арифметические выражения


Арифметические выражения

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

В качестве операндов могут быть константы, переменные и функции.

В бесскобочных арифметических выражениях операции выполняются слева направо в соответствии с их приоритетом.

1. * (умножение);

      /  (деление);

      DIV (деление нацело);

      MOD (выделение остатка от деления  целых чисел).

 2. + (сложение);

      -  (вычитание).

Изменить порядок выполнения  операций можно с помощью круглых скобок. Выражение, заключенное в круглые скобки, выполняется в первую очередь. Например, выражению   a/b*c соответствует математическая запись

, а выражению а/(b*с) соответствует запись
.

Тип арифметического выражения определяется типом входящих в него операндов.

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

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

Операции целочисленного деления DIV и MOD применимы только к целым числам. Результат их выполнения – целый.

Исключение составляет операция деления с использованием символа  ‘/’. Результат выполнения этой операции всегда вещественный, независимо от типа операндов.

Например, значением выражения  2/5 будет вещественное число 0.4.

     Примеры вычислений арифметических выражений

Арифметические выражения

Результат

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

6 + 4 * (5 - 3)

6 + 4 * (5 - 3.0)

7 DIV 2

7 MOD 2

7/2

14

14.0

3

1

3.5

Целый

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

Целый

Целый

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

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

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

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


      Ниже представлен набор стандартных функций с указанием типов функции и аргумента. В таблице приняты обозначения:     I-целый тип, R- вещественный тип.

Математическая запись
Запись в Турбо Паскале
Тип
аргумента
Тип функции
| x |
Abs(x)
I
R
I
R
x2
Sqr(x)
I
R
I
R
sin x
cos x
arctg x
Sin(x)
Cos(x)
Arctan(x)
I или R
R
ex
ln x
Exp(x)
Ln(x)
I или R
R

Sqrt(x)
I или R
R
p
Pi
R
R
Выделение целой части аргумента
Trunc(x)
R
I
Выделение дробной части аргумента
Frac(x)
R
R

                             Возведение в степень
В Турбо Паскале отсутствует операция возведения в степень. Реализация этой операции зависит от типа показателя.
Если показатель целого типа, то операция возведения в степень реализуется многократным умножением.
Например:
            x4 =>x * x * x * x;
            sin2x => sqr(sin(x)).
Если показатель вещественного типа, то пользуются соотношением:
, где x>0; a – вещественное число или выражение. Запись в Турбо Паскале имеет вид: xa=>exp(a*ln(x)). Например:      
.
      Примеры  программирования арифметических выражений

Математическая
запись
Запись в Турбо Паскале

(a + 12 * b)/(c1 - 1.8E3)

exp((2*sin(4*x)+sqr(cos(x*x)))/(3*x))
ln |tg a-sin(a3)|
ln(abs(sin(al)/cos(al)-sin(al*al*al)))

Контрольные задания


1.  Составить раздел описания для заданных переменных

вар.

Математическая запись

Тип

вар.

Матема-тическая

запись

Тип

1

С2, Lt, j

Z1, T, rs

логический

символьный

9

Sum, max, w

T, Z1, R

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

логический

2

M, n1, ap

B, g0, h

целый

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

10

D, C3, kb

bt, x1, S

строковый

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

3

D, h , E

st, w, y1

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

символьный

11

I, do, l1, Kн

Ch, Q, rez

целый

символьный

4

T3, j, x

Q, w, Z1

целый

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

12

N,  Kc, a2

Z, fd, h

целый

символьный

5

N, x1, b

A, h, min

строковый

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

13

I, kd, l1

Q, n, lt

строковый

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

6

J, I, K

F, S, R2

целый

логический

14

M1, j, r

A, d, bo

логический

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

7

b, y4, W

n, a0,

k

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

логический

15

M0, j, rcm

E, S, f1

целый

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

8

l, s, d

l, k1, m

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

символьный

16

a, m, с

str, w, P1

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

строковый

2.  Записать в Турбо Паскале константы

а) целые;

б) вещественные (в форме десятичных чисел и чисел с порядком).

варианта

Математическая запись

1

а) +15;   72,93×103 ;   -500

б)

;   -16,7;    0,054×102;   62,7×10-5

2

а) 0,2;    32×103;     -8×102

б) –0, 25;    2,89×102;     3,164; 23,7×10-4

3

а) 600;      -041;       52,625×10-4

б)

;      0,03×10-2;    -715,4;    2,1×103          

4

а) 735;   -24×103 ;   13,14×102

б) 0,0265×103;  -3,7;  54,6;   0,275×10-2

5

а) 014;      25×100;      27,3×103

б) 0,518;     2,546×102

;     -0,07×10-3;   3,04     

6

а) 014;    25×100;     27,3×102

б) 15,37;    4,52×10-3;    23;    0,0083

7

а) 07;    94×102;    16,27×103

б)8,4;    -35,07×10-1;    6,3×102;    0,004

8

а) 41;    286×100;     23,7×102

б) 0,817;     0,645×102;   -0,7181×10-3;   0,3556×100

9

а) 377;    -15×103;    25,4×103

б) – 0,572×106;    6,28;     5886; 0,0695×102

10

а) 012;   7,5×103;    -0,05×102

б) -0,084×10-2;    -0,084×10-2;   -52;    

     

11

а) 0015;  -9,4×103;   99,0

б) –5,14;    27,06×10-6;   

;    0,008×102

12

а) 276;     9,275×103;     -0,2

б) –0,56×106;      -0,07425;     6;    -0,873

13

а) 03;    52×100;   -1,0×103

б)

;    631,5×102;     -8,25;   92,1×104

14

а) –016;     95,72×102;      -576

б) –2,75;   81,2×10-6;    -15,0×103;    -0,033×10-3 

15

а) 05;    -91,0×103;    14,5×102

б) 3,48;     1б5×102,    -9,12×10-5;     0,0385

16

а) 008;    7,2×104;     -12×102

б) 54;    -17,8;    2,041×10-3;    513×103

<
3.  Записать в Турбо Паскале арифметические выражения

№ варианта
Математическая запись
1

2

3

4

5

6

7

8

9

10

11

12
  

13

14

15

16


 
4.  Записать в виде алгебраической формулы


варианта
Запись в Турбо Паскале
1
ln(abs(sqr(x)*x))+arctan(x)+exp(omega)
2
x*sin(pi/4)/(1-2*x*cos(pi/4)+exp(1/3*ln(x)))
3
sqrt(abs(ln(sin(x)+2)))
4
3*sin(x)+1/3*ln(1+x*x)+sqrt(exp(x))
5
sqrt(abs(x-y))/(sqr(sin(z))+1)
6
exp(abs(x+y))*exp(x*ln(1+sin(y)))
7
2*((x+y+z)*sqr(x+y+z)/(2*x)-sin(x*x*x))
8
(sin(al)+arctan(al))/(omega+sqr(cos(al)))
9
exp(cos(x))*sqr(cos(sin(x)))+5.7E-1
10
exp(x)/(4E-1+x*x)-sin(ln(x))
11
4*a*a+x*(b*b*b+x*(sqr(c)*sqr(c)+x*(a-exp(x))))
12
18*a*sqr(x)+exp(2/3*ln(x))+sin(al/2)
13
2*b*b*b+ln(a)-exp(2.5*ln(x))
14
(x+y+z)/(sqr(sin(a*x))+b*b)
15
exp(y/x*ln(abs(x)))+exp(1/3*ln(y/x))
16
arctan(x*x*x)/(ln(x)+sin(x)/cos(x))+1

 
5.  Вычислить арифметическое выражение

№ вар.
Запись в Турбо Паскале
Исходные данные
1
18.75 - 16.4Е0 + 1/4
-
2
frac(sqrt(a + b))
a =0.84; b=0.16
3
3 DIV x + sqr(x)
x=2
4
(x*x*t + 2.1)*trunc(1/4) + 5
x=36; t=5.287
5
I + 3 – i * sqr(i)
i= -3
6
4 + exp(trunc(3/2) * ln(6.25E-1))
-
7
1 MOD 3 + 1 DIV 3
-
8
2 * 10 DIV 4
-
9
x/(y * x - y) + x/y + 1.2E1
x=3; y= 1.5
10
19 DIV 4 + 1 MOD 4
-
11
100 * (99 DIV 100)
-
12
m + k * ((m + k) DIV n) - n
m =2; k=7; n=10
13
2 * trunc(4/10) + 2E0
-
14
2.0 * (1E1 / 5)
-
15
19 DIV 4 + 5 MOD 4
-
16
exp(1/3 * ln(27)) + 2
-

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

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


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

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

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

Знак : = читается как “присвоить”. Конец любого оператора в Турбо Паскале фиксируется точкой с запятой.

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

k : = k+1;

текущее значение переменной  k увеличится на 1.

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

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

m : = 20 + 15 DIV 4;

вещественной переменной  m будет присвоено значение 23.0;

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

                                 Var

                                     a, b, c: real;

                                      n: integer;

Тогда записать оператор присваивания в виде n := a*b/c нельзя.   В этом случае надо воспользоваться функцией TRUNC.

                                n := trunc(a*b/c);

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

1. Записать оператор присваивания, который позволяет вычислить расстояние между двумя точками с координатами       (x1, y1) и (x2, y2).

Ответ:  d := sqrt(sqr(x1 - x2) + sqr(y1 - y2)); 

2. Записать последовательность операторов присваивания, обеспечивающих обмен значениями переменных x и y в памяти компьютера.

Ответ:  c := x;

             x := y;

             y := c;



Операторы ввода – вывода


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

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

   Операторы ввода исходных данных с клавиатуры

Общий вид

записи операторов:

READ(<список переменных>);

READLN(<список переменных>);

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

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

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

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

Пример. Пусть в задаче определены следующие исходные данные:  a = 4;   x = 3,8;   y = 1,2×104 ;    k = 5;   m = 74.

Операторы ввода

            read(a, x,y);

            read(k,m); 

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

           4    3.8    1.2E4 <Enter>

           5    74 <Enter>.

              Операторы вывода данных на экран

Общий вид

записи операторов:

WRITE(<список выражений>);

WRITELN(<список выражений>);

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

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


Оператор WRITELN отличается от оператора WRITE лишь тем, что после вывода значения последнего выражения  из списка  осуществляется автоматический переход курсора к началу следующей строки.
Например, операторы
         writeln(‘Выходные данные’);
         writeln(‘К =’, 8+5, ‘   y =’, 7/10);
выводят на экран результаты в следующем виде:
Выходные данные
K =13     y =7.0000000000E –01
                     Управление выводом данных
При стандартной форме вывода вещественные числа отображаются на экране  с порядком. Мантисса выводится в нормализованном виде -  с одной значащей цифрой в целой части и с десятью цифрами в дробной части. На порядок отводится четыре позиции: первая позиция -  под букву Е, вторая позиция  - под знак  порядка, третья и четвертая позиции – под цифры порядка.
Если программиста не устраивает стандартная форма вывода, то он может использовать форматированный вывод, предусмотренный в Турбо Паскале. При форматированном выводе чисел используются два формата:
а) ширина поля, определяющая число позиций отводимых для вывода всего числа, включая целую, дробную части, знак и десятичную точку;
б) точность
представления вещественного числа, определяющая число позиций в дробной части.
Вещественные числа с указанием формата всегда выводятся в десятичной форме.
Для целых чисел используется только формат ширины поля.
В операторах вывода форматы записываются после выражения и отделяются друг от друга  двоеточием.
Например, при записи оператора
                       writeln(‘K =’, 8+5:3, ‘ y =’, 7/10:5:1);
результаты отображаются на экране в следующем виде:
                         K =  13  y =      0.7
В приведенном примере форматы 3 и 5  задают ширину поля, формат  1 – точность выводимого числа.
                          Вывод данных на печать
Для организации вывода данных на печать в Турбо Паскале необходимо вызвать стандартный модуль PRINTER, в котором описан внешний файл печати с именем LST. Для вызова модуля в программе после ее заголовка записывается предложение использования модулей:
                 USES   PRINTER;
Файл LST является нестандартным, поэтому его имя должно быть непосредственно указано в операторе вывода.
Например, оператор
           writeln(LST, ‘K =’, 8+5:3, ‘   y =’, 7/10:5:1);
выведет результаты на печать в том же виде, что и на экран монитора.

Структура основной программы


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

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

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

                Общий вид основной программы

Program <имя>;                                         Заголовок программы

Uses Printer;                                               Вызов модуля

Var

   <переменная>,…,<переменная>: <тип>;     Раздел описания

   ……………………………………………      переменных

   <переменная>,…,<переменная>: <тип>;

Begin       

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

   ……………                                                     операторов

   <оператор>;                                               

End.                                          

Предложение Uses Printer может отсутствовать, если не требуется вывод данных на печать.

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

                  Пример линейной программы

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

           

  , где

  -  полупериметр;

 –  стороны треугольника.

Исходные данные:

.

Program LVP;

Uses Printrer;

Var

    a, b, c, p, S: real;

Begin

    writeln(‘Введите исходные данные’);

    read(a, b, c);

    p := (a + b + c) / 2;

    S := sqrt(p * (p - a) * (p - b) * (p - c));

    {Вывод на экран}

   writeln(‘Площадь треугольника S =’,  S:5:2);

    {Вывод на печать}

   writeln(LST,  ‘Площадь треугольника S =’,  S:5:2);

     End.

При выполнении  оператора READ программа останавливается и переходит в режим ожидания набора исходных данных с клавиатуры. В этот момент надо набрать на клавиатуре:

1    2    0.5    <Enter>

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

                     Площадь треугольника S = 3.87



Контрольные задания


1. Записать в Турбо Паскале операторы присваивания

№ варианта

Математическая запись

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 

 

 

3.   Выполнить оператор присваивания

№ вар

Запись оператора в Турбо

Паскале

Исх. данные

Тип переменных

1

Y:= 3 * 7 DIV 2 MOD 7 / 3;

-

y-веществ.

2

a:= exp(trunc(m + 1/2)*ln(x+2.5E-2));

x=8.9

m=1

a,x-веществ.

m-целая

3

k:= n + trunc (m + b);

n=-6

b=0.8

m=2

k,n,m-целые

b- веществ.

4

m:= a * a * c + trunc(b);

a=45

b=0.8

c=2

a,c-целые

b,m- веществ.

5

k:= exp(trunc(x * b) * ln(y));

x=1.2

b=2

y= -4

k,x- веществ.

b,y-целые

6

d:= -a MOD b +a DIV d * c;

a=5

b=2

c=3

a,b,c-целые

d- веществ.

7

i:= trunc(k / n * n + a);

k=99

n=100

a=5.871

i,k,n-целые

a- веществ.

8

f:= a +  trunc(b/c) - 64/sqr(a) + 1;

a=4

b=0.8

c=2

f,b- веществ.

a,c-целые

9

b:= 4*d*1E-2/cos(4*d-c) + frac(57.12);

c=12

d=3

c,d-целые

b- веществ.

10

k:= a * b / c + frac(12.7E-1);

a=6

b=2

c=4

a,b,c-целые

k1-веществ.

11

b:= exp(trunc(n/m) * ln(a+sqrt(a/m)));

a=4

m=3

n=2

a,n,m-целые

b-веществ.

12

m:= trunc(a*(b DIV c) + 0.57E1);

a=6

b=1

c=4

m,a,b,c-целые

13

a:= exp(5 DIV 2 * ln(4)) - 2;

-

a-веществ.

14

z:=(a+sqrt(b+1)+24E-1*c)* trunc(b/4);

a=4

b=1

c=10

a,b,c-целые

z-веществ.

15

p:= trunc(abs(b-a)) DIV c – d MOD10;

a=4.8

b=0.8

c=2

d=34

p,a,b-веществ.

c,d-целые

16

a:=19 DIV 4 * 4 +  trunc(5.4) MOD 4;

-

a-целая

 

Глава 5.  Разветвляющиеся вычислительные

                                    процессы

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



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


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

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

Результатом вычисления логического выражения является одно из двух логических значений: TRUE или FALSE.

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

                                   Отношения

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

Операция отношения

– это операция сравнения двух операндов:    | < | <= | > | >= | = | <> |.

      Примеры записи отношений в Турбо Паскале

Отношение

Результат

5 > 3

TRUE

cos(x) > 1

FALSE

x*x + y*y < 1

TRUE для всех точек, лежащих внутри круга с единичным радиусом и центром в начале координат

а <> ’Y’

TRUE, если значение символьной переменной a не равно символу ’Y’

Следует помнить, что к операндам вещественного типа неприменима операция ‘=’ из-за неточного представления чисел в памяти компьютера. Поэтому для вещественных переменных       a и b отношение вида a=b надо заменить отношением              abs(a - b) < E, где Е - малая величина, определяющая допустимую погрешность.

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

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

Математическая запись

Запись в Турбо Паскале

Название операции

NOT

Отрицание

AND

Операция “И” (логическое умножение)

OR

Операция “ИЛИ”  (логическое сложение)

Результаты выполнения логических операций приведены в таблицах истинности, в которых обозначено: a, b - логические операнды;  T – TRUE,  F – FALSE.

a

NOT a

 

a

b

a AND b

 

a

b

a  OR  b

T

F

T

T

T

T

T

T

F

T

T

F

F

T

F

T

F

T

F

F

T

T

F

F

F

F

F

F

<
Порядок выполнения операций в логических выражениях
В бесскобочных логических выражениях операции выполняют слева направо в соответствии с их приоритетом:
1.      NOT;
2.      AND;
3.      OR;
4.      Отношения.
Поскольку отношения имеют самый низкий приоритет, то их необходимо заключать в круглые скобки.
Пример. Вычислить логическое выражение:
                 -3 ³ 5  Ú  Ø 7 < 9 Ù 0 £ 3.
Запись в Турбо Паскале имеет вид:
               1         6       4          2         5           3                         
        (-3 >= 5)  OR  NOT  (7 < 9)  AND  (0 <= 3)
Сверху над операциями проставлен порядок выполнения действий.

1) –3 >= 5 Þ F;
2) 7 < 9 Þ T;
3) 0 <= 3 Þ T;
4) NOT(T) Þ F;
5) F AND T Þ F;
6) F OR F Þ F.

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

б) переменная
не принадлежит интервалу
.
Ответ. Данное условие можно записать в одном из двух вариантов:
а)
  or  
;
б) или воспользоваться операцией  NOT.
     not
and 


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


В Турбо Паскале различают два вида условных операторов: короткий и полный.

                  Короткий условный оператор

Общий вид

записи:

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

 где P – любой оператор.

Работа оператора

Сначала вычисляется логическое выражение (ЛВ), и если оно имеет значение TRUE, то выполняется оператор P, стоящий за служебным словом THEN. В противном случае оператор P игнорируется.

Графическая интерпретация оператора

В блок-схемах короткому условному оператору соответствует структура ЕСЛИ – ТО.

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

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

 begin

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

       ………………

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

end;

Пример

Переменной y присвоить минимальное значение из трех различных чисел, т.е. y = min (a, b, c).

Блок-схема

                                   

                                   Программа

                  Program P;

                  Var

                        a, b, c, y: real;

                 Begin

                writeln (‘Введите числа a, b, c’);

                read (a, b, c);

                y := a;

                if b<y then y := b;

                if c<y then y := c;

                writeln (‘y =’, y:6:2);

                 End.

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

Общий вид

записи:

IF <логическое выражение> THEN  P1  ELSE  P2;


 где P1, P2 – любые операторы.
Работа оператора
Вычисляется логическое выражение, и если оно имеет значение TRUE, то выполняется оператор P1, стоящий после служебного слова THEN. В противном случае выполняется оператор P2, стоящий после служебного слова ELSE .
Графическая интерпретация оператора
В блок-схемах полному условному оператору соответствует структура ЕСЛИ – ТО – ИНАЧЕ.
Замечание. Операторы P1 и P2 входят в конструкцию полного условного оператора как единственные. Если возникает необходимость выполнить в ветвях несколько операторов, то их заключают в операторные скобки BEGIN…..END. Вид записи условного оператора в этом случае следующий.
         IF <логическое выражение> THEN
              begin
                  <оператор 1>;
                   ……………...                        P1
                  <оператор n>;
               end
         ELSE
             begin
                   <оператор 1>;
                   ……………...                        P2
                   <оператор m>;
               end;
Пример1. Вычислить значение переменной у по одной из двух ветвей:
             y =

Блок-схема
                                  Программа
                              Program P_1;
                              Var
                                  x, y: real;
                              Begin
                                  writeln (‘Введите число x’);
                                  read (x);
                                  if x>0 then y := ln(x) else y := exp(x);
                                  writeln (‘y =’ , y:6:2);
                              End.
Пример 2. Вычислить корни полного квадратного уравнения    ax2+bx+c=0. В программе предусмотреть проверку дискриминанта на знак. Если дискриминант окажется отрицательным, то вывести сообщение “Корни мнимые”.


                                  Программа
                        Program P_2;
                        Var
                            a, b, c, d, x1, x2: real;
                        Begin
                            writeln(‘Введите коэффициенты уравнения’);
                                    read (a, b, c);
                            d := b*b – 4*a*c;
                            if d<0 then
                                writeln (‘Корни мнимые’)
                            else
                                begin
                                   x1 := (-b + sqrt(d)) / (2*a);
                                   x2 := (-b -  sqrt(d)) / (2*a);
                                   writeln(‘x1=’, x1:5:2, ‘ x2=’, x2:5:2);
                                end;
                        End.
       Вложенные структуры условных операторов
Структура называется вложенной, если после служебных слов THEN и ELSE используются вновь условные операторы. Число вложений может быть произвольным. При этом справедливо следующее правило: служебное слово ELSE всегда относится к ближайшему выше слову THEN. Для удобства чтения вложенных структур рекомендуется при программировании избегать по-возможности запись вложенного условного оператора после слова THEN.
Пример. Вычислить значение y по одной из трех ветвей:
 
При решении данной задачи возможны варианты программирования без использования вложенной структуры и с вложенной структурой.
Вариант 1.
(Без использования вложенной структуры).
                                      Блок-схема
                                                     Программа
                        Program P_V1;


                        Var
                             x, y: real;
                        Begin
                            writeln(‘ Введите число x’);
                           read(x);
                            if x>=1 then y := sqrt(x)/2;
                           if (x>0) and (x<1) then y := exp(1/3*ln(x))/3;
                            if x<= 0 then y := exp(1/4*ln(abs(x)))/4;
                            writeln(‘y =’, y:6:2);
                        End.
Вариант 2. ( Использование вложенной структуры).
                                Блок-схема
                              
                                   Программа
                        Program P_V2;
                        Var
                             x, y: real;
                        Begin
                             writeln(‘Введите число x’);
                              read(x);
                                 if x>=1 then
                           y := sqrt(x)/2
                             else
                                      if x>0 then
                                    y := exp(1/3*ln(x))/3
                                   else
                                    y := exp(1/4*ln(abs(x)))/4;
                             writeln(‘y =’, y:6:2);
                        End.

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


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

Общий вид

записи:

     CASE <селектор> OF

           <список констант выбора 1>: <оператор 1>;

           ………………………………………………

          <список констант выбора n>: <оператор n>;

END;

Селектор – это выражение целого  или символьного типа.

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

                       Работа оператора CASE

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

Пример 1. Написать оператор выбора для вычисления y.

                    

                       case   n    of

                             1: y := x;

                         2, 3: y := 2 * sqrt(abs(x));

                             4: y := exp(x);

                       end;

Графическая интерпретация оператора

В блок-схемах оператору CASE соответствует структура ВЫБОР.

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

Замечание.  Если в строке выбора необходимо записать несколько операторов, то их заключают в операторные скобки BEGIN....END.

Пример 2.     Вычислить значение y.

Если значение x не принадлежит рассматриваемым промежуткам, то вывести на экран соответствующее сообщение.

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

n := trunc(x);

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


                   Program P_2;
                   Var
                       x, y: real;
                       n: integer;
                  Begin
                      writeln(‘Введите число x’);
                      read (x);
                      if (x<1) or (x>=5) then
                          writeln(‘ x не принадлежит ‘,
                                      ‘рассматриваемой области’)
                      else
                          begin
                             n := trunc(x);
                             case n of
                                1: y := sin(x);
                                2: y := exp(-x);
                                3: y := ln(x);
                                4: y := sin (x)/cos(x);
                            end;
                            writeln(‘y=’, y:6:2);
                         end;
                  End.

Контрольные задания


I.        Записать в Турбо Паскале логические выражения.

а) Ø а Ú b;

б) –1 £ x £1 или 2 £ x £ 4;

в) переменная x находится вне интервала [a, b];

г) все точки на плоскости находятся выше оси абсцисс;

д) все точки на плоскости находятся либо в первом, либо в третьем квадрантах;

е) все точки на плоскости лежат выше прямой:  y = 1 + x.

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

а)                                             б)

                                                                        

                                                                                                       

в)                                              г)           

                

д)                                              e)    

III.   Начертить на плоскости область, в которой логическое выражение имеет значение TRUE.

а) (x >= 0) and (y >= 0) and (y <= x) or (y <= -1);

б) (x*x +y*y <= 1) and (y >= 0) and not(y < x);

в) (y >= x) and (y >= -x);

г) (y <= 2) and (x <= 2) or (x*y < 0);

д) (x*y >= 0) and (y <= x) and (x < 1) and (y >-1);

е) (x*x + y*y <= 4) and (y >= x*x).

IV.    Записать в Турбо Паскале логические выражения и вычислить их при: i =5; j =2; k =2; a =TRUE;  b =FALSE.

а)    i ¹1Ú a Ù Ø (b Ù j > k);

б)    (i £1Úa) Ù (b Ú j= k);

в)    Ø(i = j2 + 1) Ú a Ù b;

г)    i> j + k  Ù  a Ù Ø b;

д)   a Ú b Ù (i*j > k2);

е)   (a Ú Ø b Ù j2 = k2) Ù Ø b.

Глава 6. Циклические вычислительные

                            процессы

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

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



Операторы цикла с условием


Различают два вида операторов с условием:

1) оператор цикла WHILE (пока);

2)      оператор цикла REPEAT (повторять до тех пор пока).

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

Общий вид

записи:

WHILE < логическое выражение > DO < тело цикла>;

Тело цикла – единичный оператор, выполняемый в цикле.

Работа оператора

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

Графическая интерпретация оператора

В блок-схемах оператору цикла WHILE соответствует структура ЦИКЛ-ПОКА.

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

Вычислить таблицу значений функции:

                          

 

при

, изменяющемся в интервале [-0.5, 2.5] с шагом 0.1.

заданные вещественные числа.

В данной задаче переменная

 является управляющей переменной цикла.

Блок-схема

Программа

                        Program TAB_1;

                        Var

                             a, b, x, y: real;

                          Begin

                       writeln(‘Введите исходные данные’);

                       read(a, b);

                    writeln (‘         x                    y(x)’);

                         x := -0.5;

                       while  x <= 2.5  do

                                           begin

                    y := ln(abs(x))/(a*a - b*b);

                    writeln(x:8:1, y:8:1)

                    x := x + 0.1;


                   end;
                            End.
                          Оператор цикла REPEAT
Общий вид
записи:
                  REPEAT
                <тело цикла>;
                       UNTIL <логическое выражение>;
Работа оператора
Выполняется тело цикла, после чего вычисляется логическое выражение, определяющее условие выхода из цикла. Если логическое выражение имеет значение FALSE, то повторяется выполнение тела цикла. В противном случае оператор цикла REPEAT завершает свою работу.
Управляющая переменная, как и в случае оператора цикла WHILE, должна включаться в состав логического выражения и изменяться в теле цикла.
        Графическая интерпретация оператора
В блок-схемах оператору цикла REPEAT соответствует структура ЦИКЛ-ДО.

Выход из цикла

Пример 2.  Решить предыдущую задачу табулирования функции с использованием оператора цикла REPEAT.
Программа
                                  Program TAB_2;
                                  Var
                                       a, b, x, y: real;
                                  Begin
                                 writeln(‘Введите исходные данные’);
                                  read(a, b);
                             writeln(‘       x                y(x)’);
                                  x := -0.5;
                                  repeat
                                y := ln(abs(x))/(a*a - b*b);
                                writeln(x:8:1, y:8:1)
                                x := x + 0.1;
                                  until  x > 2.5;
                                End.

Блок-схема

Основные отличия оператора цикла WHILE
от оператора  цикла REPEAT.
1.      В теле  цикла оператора WHILE может стоять только один оператор. Для выполнения в цикле нескольких операторов тело цикла должно заключаться в операторные скобки BEGIN … END.
В операторе REPEAT операторные скобки не ставятся, так как их целиком заменяют служебные слова REPEAT … UNTIL.
2.      В операторе WHILE тело цикла может не выполняться ни разу, если логическое выражение сразу окажется ложным.
В операторе REPEAT логическое выражение записывается после тела  цикла. Поэтому тело цикла  обязательно выполнится хотя бы один раз.

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


Различают два вида записи оператора:

                 FOR i := m1 TO m2  DO <тело цикла>;

                 FOR i := m1 DOWNTO m2  DO <тело цикла>;

i – параметр цикла целого типа, управляющий работой цикла;

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

      Тело цикла состоит из одного оператора. В случае выполнения в цикле нескольких операторов надо воспользоваться операторными скобками BEGIN … END.

Работа оператора цикла FOR … TO

Тело цикла выполняется для каждого значения параметра i, начиная от m1 до конечного значения m2. После каждого шага выполнения цикла значение параметра i автоматически увеличивается на 1.

Графическая интерпретация оператора цикла FOR … TO

В блок-схемах оператору цикла FOR  соответствует структура ЦИКЛ-ПОКА.

 

 

 

 

 

 

 

 

 

 

 

 

Замечание 1. Оператор цикла FOR … DOWNTO отличается от оператора FOR … TО лишь тем, что

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

     Правила использования оператора цикла FOR

1.      Параметр цикла

, а также  значения
 и
, должны быть целого типа.

2.      Значение параметра

 увеличивается (или уменьшается) на 1 автоматически. Поэтому шаг изменения параметра
 не указывается в заголовке цикла.

3.      Параметр

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

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

 для цикла FOR … TO, или
 для цикла FOR … DOWNTO.

Замечание 2.

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



Базовые алгоритмы


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

табулирование функций;

организация счетчика;

накопление суммы или произведения;

поиск минимального или максимального члена последовательности.

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

Задача 1. Алгоритм организации счетчика.

Дана последовательность:

               

.

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

                                      Решение

Представим последовательность в общем виде:

             

, где
.

Для организации счетчика в памяти компьютера выделяется ячейка, содержимое которой увеличивается на 1 каждый раз, когда встречается положительный член последовательности. В программе ячейке (счетчику) соответствует переменная целого типа, например, переменная L. Работа счетчика реализуется с помощью оператора присваивания L:= L + 1;. В начальный момент содержимое ячейки должно быть равно нулю. С этой целью предварительно осуществляется очистка ячейки оператором L:= 0;.

                                 Программа

                       Program Z_1;

                       Var

                           a: real;

                           n, L: integer;

                      Begin

                           L := 0;

                           for n := 1 to 50 do

                              begin

                                 a := cos(2 * n - 1);

                                 if a>0 then L := L + 1;

                              end;

                           writeln(‘L=’, L);

                      End.

Задача 2. Алгоритм накопления суммы.

Дана последовательность:

           

,

где 

 - заданное вещественное число.

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

Решение

Общий член последовательности имеет вид:

                    

, где
.

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

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


                                 Программа
                           Program Z_2;
                           Var
                                a, x, S: real;
                                    n: integer;
                           Begin
                                writeln(‘Введите число x’);
                                 read (x);
                                 S:=0;
                                 for n := 1 to 8 do
                                  begin
                                      a := sin(2 * n * x);
                                      if abs(a) > 0.3 then S := S + a;
                                  end;
                                 writeln(‘S=’,  S:6:2);
                            End.
Задача 3. Алгоритм накопления произведения.
Дана последовательность:
      
.
Вычислить значение:
, где
- произведение  отрицательных членов последовательности.
                                    Решение
Общий     член последовательности имеет вид:
    
  где
.
Для реализации алгоритма накопления произведения выделяется ячейка памяти
, в которой осуществляется последовательное перемножение отрицательных членов последовательности с помощью оператора присваивания
. В начальный момент в ячейку должна быть занесена единица оператором
.
                              Программа
                          Program Z_3;
                          Var
                               x, y, P, PO: real;
                          Begin
                               PO := 1;
                               x := 0.1;
                               while x<=10 do
                                   begin
                                       y := cos(x);
                                       if  y<0 then PO := PO * y;
                                       x := x + 0.1;
                                   end;
                               P := abs(PO);
                               writeln(‘P=’, P:6:2);
                          End.


Задача 4. Алгоритм поиска минимального члена последовательности.
Дана последовательность:
             
;       
.
Найти минимальный член последовательности.
                                      Решение
Для реализации алгоритма выделяется ячейка памяти MIN, в которую сначала заносится первый член последовательности. Затем, начиная со второго, производится сравнение вычисленных членов последовательности с содержимым ячейки MIN. Если текущий член последовательности меньше содержимого ячейки MIN, то он переписывается в эту ячейку. В противном случае содержимое ячейки MIN сохраняется. При завершении сравнения всех членов последовательности в ячейке MIN запоминается минимальное значение.
Замечание 1.
Алгоритм поиска максимального члена последовательности отличается лишь тем, что в ячейке (ей можно дать имя MAX) запоминается больший из сравниваемых членов последовательности.
Замечание 2.
В начальный момент в ячейку MIN можно занести число, которое было бы достаточно большим и превышало область определения сравниваемых чисел, например:
                                 MIN := +1E6;
Тогда при сравнении с содержимым ячейки MIN первое число обязательно окажется меньше и переписывается в ячейку MIN.
При поиске максимального члена последовательности в ячейку MAX в начальный момент заносится, наоборот, достаточно малое число, которое должно быть меньше всех сравниваемых чисел, например:
                                  MAX := -1E6;
В этом случае первое из сравниваемых чисел окажется больше содержимого ячейки MAX и переписывается в эту ячейку.
                                        Программа
                          Program Z_4;
                          Var
                               a, min: real;
                               k: integer;
                          Begin
                               min := +1E6;
                               for k := 1 to 10 do
                                 begin
                                     a := exp(k) * sin(2*k+1)/cos(2*k+1);
                                     if  a<min then min := a;
                                 end;
                                writeln(‘min=’, min:6:2);
                          End.

Кратные циклы


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

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

Внешний и внутренний циклы могут использовать любой  вид операторов цикла Турбо Паскаля (WHILE, REPEAT, FOR).

  Пример. Алгоритм табулирования функции с двумя переменными.

Вычислить значение функции:

                   

при x, изменяющемся на интервале [-1, 1] с шагом

 и   
, изменяющемся на интервале [0, 1] с шагом
.

При организации двойного цикла примем:

x - внешняя переменная цикла;

y - внутренняя переменная цикла.

Тогда вид таблицы на экране будет следующим:

x

y

z(x,y)

-1.0

0.0

z(-1.0,0.0)

-1.0

0.1

z(-1.0,0.1)

-1.0

1.0

z(-1.0,1.0)

-0.8

0.0

z(-0.8,0.0)

-0.8

1.0

z(-0.8,1.0)

 

 

 

 

                           Программа

                  Program TAB_2;

                  Var

                       x, y, z: real;

                  Begin

            writeln(‘    x           y         z(x,y)’);

                

;

                  while x<=1 do

    begin

            y := 0;

            while y<=1 do

       begin

                               

;

                                 writeln(x:6:1, y:6:1, z:6:1);

                               

;

                    end;

                 x := x + 0.2;

               end;

                    End.

ГЛАВА 7.  Массивы



Понятие массива


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

 способ объединения элементов в структуру;

 число элементов;

 тип элементов.

     Общий вид описания массива:

<имя массива>: ARRAY [тип–диапазон индексов] OF <тип элементов массива>;

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



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


В математике одномерному массиву соответствует

мерный вектор, например:

                            

 , где

компонента (координата) вектора;

номер компоненты;

число компонент.

                 Описание одномерного массива

В Турбо Паскале описание одномерного массива задается следующим образом:

<имя массива>: ARRAY [m1 ¼m2] OF < тип элементов>;

Индекс одномерного массива определяет порядковый номер элемента в массиве.

m1 ¼m2 – диапазон значений индекса.

Тип элементов в массиве может быть любым: простым (REAL, INTEGER, CHAR), структурным (ARRAY), строковым (STRING).

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

               Var

                   X: array [1¼5] of real;

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

                           Индексные переменные

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

индексная переменная (элемент массива);

имя массива;

индекс (номер элемента массива).

В качестве индекса используются:

целые константы, например,

;

целые переменные, например,

;

индексные выражения, например,

.

Замечание. Индексными выражениями являются арифметические выражения целого типа.

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

;

                 Ввод-вывод одномерных массивов

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

Пример 1.

Организовать ввод с клавиатуры массива:

.

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

                Var

                    A: array [1¼4] of real;

                     i: integer;

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


               Begin {начало программы}
                    writeln(‘Введите массив А’);
                    for i := 1 to 4 read(a[i]);
              ……………
На клавиатуре набирается:
                    1.2  5  6.8  14 < Enter >.
Пример 2.
Организовать вывод массива А на экран таким образом, чтобы все элементы располагались на одной строке экрана.
   В программе надо записать следующие операторы:
                    for i := 1 to 4 do write(a[i]:5:1);
                    writeln;
Вид выводимого массива на экране:
                    1.2    5.0   -6.8  14.0
Оператор WRITELN без списка служит для перевода курсора к началу следующей строки.
                 Обработка одномерных массивов
При решении задач обработки массивов используют базовые алгоритмы реализации циклических вычислительных процессов: организация счетчика, накопление сумм и произведений, поиск минимального и максимального элементов массива.
Задача 1. Организация счетчика.
Определить количество элементов заданного целочисленного массива
, которые делятся на 3 без остатка.
                     Program OM_1;
                     Var   
                         B: array [1… 20] of integer;
                          i, L: integer;
                     Begin
                    writeln(‘Введите массив В’);
                    for i :=1 to 20 do read(b[i]);
                    L := 0;
                    for i :=1 to 20 do
                        if  (b[i] MOD 3) = 0 then L := L+1;
                    writeln(‘L =’, L);
                     End.
   Задача 2. Накопление суммы и произведения.
          Дано целое число
 и массив вещественных чисел
. Вычислить среднее арифметическое и среднее геометрическое чисел массива, используя формулы:
                 
;  
.
              Program ОМ_2;
              Var
                  Х: array [1… 100] of real;
                  n, i: integer;
                  S, P: real;
              Begin
             writeln(‘Введите размер массива n’);


             read(n);
             writeln(‘Введите массив Х’);
             for i := 1 to n do read(x[i]);
             S := 0;
             P := 1;
             for i := 1 to n do
                         begin
                            S := S + x[i];
                            P := P * x[i];
           end;
       S := S/n;
       P := exp(1/n * ln(P));
               writeln(‘S =’, S:6:2);
                   writeln(‘P =’, P:10:2);
               End.
      Задача 3. Поиск минимального и максимального элементов массива.
Дан вещественный массив
.
Поменять местами минимальный и максимальный элементы массива и вывести массив после обмена.
В этой задаче дополнительно надо знать местоположение минимального и максимального элементов, поэтому одновременно с поиском надо запоминать  индексы.
Введем обозначения:
min – минимальный элемент;
imin – индекс минимального элемента;
max – максимальный элемент;
imax – индекс максимального элемента.
                      Program ОМ_3;
                      Var
                          T: array [1… 10] of real;
                           i, imin, imax: integer;
                           min, max: real;
                      Begin
                     writeln(‘Введите массив T’);
                     for i := 1 to 10 do read(t[i]);
                     min := +1E6;
                     max := -1E6;
                     for i := 1 to 10 do
                          begin
                         if t[i]<min then
                            begin
                   min := t[i];
                   imin := i;
                    end;
                         if t[i]>max then
                    begin
                        max := t[i];
                        imax := i;
                    end;
                          end;
                      t[imin]:= max;
                      t[imax]:= min;
                      for i := 1 to 10 do write(t[i]:6:2);
                      writeln;
                      End.

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


Двумерные массивы в математике представляются матрицей:

или сокращенно можно записать:

,  где

число строк;

число столбцов;

индексы (номера) текущих строки и столбца, на пересечении которых находится элемент
.

Описание двумерного массива

Описание матрицы в разделе VAR задается структурным типом вида:

<имя массива>: ARRAY [m1..m2, n1..n2] OF <тип элементов>;

m1..m2 – диапазон значений индекса i, определяющий число строк;

 n1..n2 – диапазон значений индекса j, определяющий число столбцов.

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

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

                   Var

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

в памяти компьютера выделяется область, состоящая из

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

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

                 

;

                 

;

                 

.

Ввод-вывод двумерного массива

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

 как параметр внешнего цикла, а индекс
 как параметр внутреннего цикла, то ввод-вывод матрицы осуществляется по строкам.

Пример 1.

Организовать ввод целочисленной матрицы

по строкам.

.

Описание матрицы вместе с текущими индексами имеет вид:

                               Var

                                    M: array [1..2, 1..3] of integer;

                                    i, j: integer;

Ввод  в программе реализуется в форме диалога, т.е. сопровождается соответствующим сообщением:

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

                          writeln(‘Введите матрицу М’);

                          for i := 1 to 2 do

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

           …………


На клавиатуре  нагляднее всего набирать элементы матрицы по строкам.
                          1   2   3 <Enter>
                          4   5   6 <Enter>
Пример 2.
Организовать вывод матрицы M на экран.
Вывод матрицы надо реализовать в удобном для чтения виде, т.е. чтобы на одной строке экрана располагалась одна строка матрицы. С этой целью в тело внешнего цикла, помимо внутреннего, включается еще оператор WRITELN, который переводит курсор к началу следующей строки экрана после вывода текущей строки матрицы.
                         for i := 1 to 2 do
                             begin
                       for j := 1 to 3 do write(m[i, j]:3);
                       writeln
                             end;
Вид матрицы на экране будет следующим:
                           1    2    3
                           4    5    6
                           Обработка матриц
Базовыми алгоритмами обработки матриц являются те же алгоритмы, которые используются при обработке одномерных массивов. Однако реализацию этих алгоритмов можно условно рассматривать для двух типов задач.
1.      Алгоритмы реализуются при обработке всех элементов матрицы.
2.      Алгоритмы реализуются внутри каждой строки или каждого столбца матрицы.
Реализация алгоритмов  для задач первого типа
Задача 1. Дана матрица вещественных чисел
. Вычислить значение
, где P1 и P2 – произведения положительных и отрицательных элементов матрицы соответственно.
                    Program DМ_1;
                    Var
                        A: array [1..4, 1..6] of  real;
                        i, j: integer;
                        P1, P2, Z: real;
                    Begin
                   writeln(‘Введите матрицу А’);
                   for i := 1 to 4 do
                      for j := 1 to 6 do read(a[i,j]);
                   P1 := 1;
                   P2 := 1;
                   for i := 1 to 4 do
                 for j :=1 to 6 do


                begin
               if  a[i,j]>0 then P1 := P1 * a[i,j];
               if  a[i,j]<0 then P2 := P2 * a[i,j];
           end;
    Z := P1/abs(P2);                                                                                                                                 
   writeln(‘Z=’,  Z:10:2);
                    End.
       Задача 2. В квадратной целочисленной матрице
  вычислить модуль разности между числом нулевых элементов, стоящих ниже главной диагонали, и числом нулевых элементов, стоящих выше главной диагонали.
Введем обозначения:
L1 – число нулевых элементов ниже главной диагонали;
L2 – число нулевых элементов выше главной диагонали;
L= |L1-L2|.
            Program DМ1_2;
            Var
                 B: array [1..5, 1..5] of  integer;
                  i, j, L1, L2, L: integer;
            Begin
            writeln(‘Введите матрицу B’);
            for i := 1 to 5 do
            for j := 1 to 5 do read(b[i,j]);
            L1 := 0;
            L2 := 0;
            for i := 1 to 5 do
          for j := 1 to 5 do
         if b[i,j]=0 then
          begin
            if  i>j then L1 := L1+1;
            if  i<j then L2 := L2 +1;
           end;
                  L := abs(L1 – L2);
  writeln(‘L=’, L);
            End.
Реализация алгоритмов для задач второго типа
          Задача 1. В матрице
 вещественных чисел первый элемент каждой строки поменять местами с минимальным элементом этой строки. Вывести матрицу Х после обмена.
                      Program DМ2_1;
                      Var
                           X: array [1..3,1..6] of  real;
                           i, j, jmin: integer;
                           min: real;
                      Begin
                     writeln(‘Введите матрицу X’);
                     for  i:= 1 to 3 do
                        for j := 1 to 6 do read(x[i,j]);
                    for i:=1 to 3 do
              begin
             min:=+1E6;


             for j:=1 to 6 do
                 if x[i,j]<min then
                    begin
                  min:=x[i,j];
                  jmin:=j;
                    end;
              x[i,jmin]:=x[i,1];
              x[i,1]:=min;
              end;
          for i:=1 to 3 do
               begin
              for j:=1 to 6 do write (x[i,j]:6:1);
              writeln;
               end;
                       End.
       Задача 2. Дана матрица вещественных чисел
. Вычислить среднее арифметическое  каждого столбца. Результат оформить в виде одномерного массива
.
                              Program DМ2_2;
                              Var
                                  C: array [1..8, 1..4] of  real;
                                  S: array [1..4] of  real;
                                   i, j: integer;
                              Begin
                             writeln(‘Введите матрицу C’);
                             for i := 1 to 8 do
                             for j := 1 to 4 do read(c[i,j]);
                             for j := 1 to 4 do
                            begin
                              s[ j ] := 0;
                              for i := 1 to 8 do s[ j ]:= s[ j ] + c[i,j];
                                                   s[ j ] := s[ j ]/8;
                            end;
                          for j := 1 to 4 do write(s[ j ]:8:2)
                          writeln;
                             End.
В данной программе следует обратить внимание на то, что при вычислении каждого элемента s[j] организован двойной цикл, в котором индекс
 является внешним параметром цикла, а индекс
внутренним. Это обеспечивает обработку элементов матрицы по столбцам.
ГЛАВА 8.  Подпрограммы

Структура сложной программы


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

1. Экономия памяти.

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

2. Структурирование программы.

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

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

Структура сложной программы

Раздел типов TYPE в основной программе может отсутствовать. Его назначение рассмотрим позднее.

Описания подпрограмм располагаются вслед за разделом описания переменных основной программы VAR. Число подпрограмм может быть произвольным.

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



Процедуры


Любая процедура состоит из заголовка и тела процедуры. Тело процедуры оформляется по тем же правилам, что и основная программа, т.е. состоит из раздела описания переменных и раздела операторов. Однако заканчивается тело процедуры символом ‘;’.

               Общий вид описания процедуры

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

В Турбо Паскале допускается запись заголовка процедуры без списка параметров:

                         PROCEDURE <имя>;

Обращение к процедуре

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

          Общий вид оператора вызова процедуры

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

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

Глобальные и локальные переменные

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

Локальные переменные определяются в разделе описания VAR внутри процедуры. Они имеют смысл только в процедуре и недоступны основной программе.

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

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

,

где

заданное вещественное число.

Введем обозначения:

;    
  
.

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

                  

,  где

 номер шага вычисления (умножения);

число шагов вычислений.

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

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


                              Программа
             Program Primer_1;
             Var
                  a, r1, r2, r3, z: real;
              Procedure ST (x: real; n: integer; var P: real);
                  var
            i: integer;
          begin
            P := 1;
            for i := 1 to n do P := P * x;
          end;
              Begin {начало основной программы}
             writeln(‘Введите число а’);
                   read (a);
        ST(a, 5, r1);
        ST(1/a, 5, r2);
        ST(a, 7, r3);
        Z := (r1 + r2) / (2 * r3);
        writeln(‘Z=’,  Z:6:2);
              End.
В заголовке процедуры с именем ST указаны два входных формальных параметра (x, n) и один выходной (P).
Выполнение программы всегда начинается с операторов основной программы. В данном случае после ввода заданного числа  (
) последовательно вызывается три раза процедура ST. При каждом вызове  происходит соответствующая  замена формальных параметров (x, n) на фактические, и вычисленный  результат через формальный параметр Р присваивается  фактическим переменным r1, r2, r3 соответственно. Далее вычисляется значение Z,   и результат выводится на экран.
Согласование параметров
Формальные и фактические параметры должны быть согласованы друг с другом по количеству, типу и порядку следования. Это означает, что количество формальных параметров должно быть равно количеству фактических параметров, и каждый формальный параметр должен иметь тот же тип и занимать в списке то же место, что и соответствующий ему фактический параметр.
Механизм замены параметров
В списке формальных параметров выделяется два вида параметров: параметры-значения и параметры-переменные. Механизм замены для каждого вида параметров различен.
Параметры-значения играют роль входных
параметров. Фактическим параметром, соответствующим параметру-значению, может быть константа, переменная или выражение. Параметры-значения являются локальными переменными для процедуры. Для них в памяти компьютера временно выделяются ячейки, в которые передаются копии вычисленных значений фактических параметров. При выполнении процедуры параметры-значения могут изменяться, однако соответствующие им фактические параметры остаются без изменения.


Параметры–переменные  являются выходными параметрами процедуры. Перед параметрами-переменными в списке ставится служебное слово VAR. В качестве соответствующих им фактических параметров могут быть только переменные. При вызове процедуры происходит замена имени параметра-переменной на имя фактической переменной, т.е. в процедуру передается адрес фактической переменной.  Все действия в процедуре выполняются непосредственно над фактическим параметром, а не его копией. Поэтому любое изменение формального параметра-переменной приводит к изменению соответствующего ему фактического параметра.
Рассмотрим два примера, иллюстрирующих понятие параметра-значения и параметра-переменной.
        Пример 1.
                         Program P1;
                         Var
                              x: integer;
                          Procedure Z (y: integer);
                         begin
                         y := 1;
                         end;
                          Begin
                          x := 0;
                          Z(x);  {вызов процедуры}
                          writeln(‘x=’,  x);
                          End.
В описанной процедуре Z формальный параметр y является параметром-значением, поэтому его изменение  в процедуре       (y := 1;) не влияет на значение фактического параметра x. После выполнения программы на экран будет выведено:   x = 0.
Пример 2.
                         Program P2;
                         Var
                              x: integer;
                          Procedure Z (var y: integer);
                         begin
                        y := 1;
                         end;
                          Begin
                          x := 0;
                          Z(x); 
                          writeln (‘x=’, x);
                          End.
В данной процедуре Z формальный параметр y является параметром-переменной, поэтому его значение после выполнения процедуры присваивается фактическому параметру x. На экран будет выведено:  x = 1.
 

Функции


 

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

Общий вид описания функции

Обращение к функции

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

.

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

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

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

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

Решить предыдущую задачу (см. параграф 8.2) с использованием функции.

 

                  Program Primer_2;

                  Var

                       a, Z: real;

                  Function ST (x: real; n: integer): real;

                   var

              i: integer;

              P: real;

           begin

               P := 1;

               for i := 1 to n do P := P * x;

               ST := P;

           end;

                   Begin {начало основной программы}

                      writeln(‘Введите число а’);

                            read(a);

                  Z := (ST(a, 5) + ST(1/a, 5)) / (2 * ST(a, 7));

                  writeln(‘Z=’,  Z:6:2);

                   End.

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



Параметры-массивы


Раздел типов

Если мы хотим передать в подпрограмму отдельный элемент

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

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

 и матрицы
.

                               Type

                                    Vect = array[1..10] of real;

                                    Matr = array[1..5,1..8] of real;

В дальнейшем имена типов Vect и Matr можно использовать в разделе описания переменных, например:

                               Var

                               X: Vect;

                               A: Matr;

Объявленные типы указываются также в списке формальных параметров, например:

                               Function (X: Vect; A: Matr): real;

Если по условию задачи в подпрограмме требуется при разных обращениях обрабатывать массивы с разными размерами, то в разделе TYPE объявляется тип массива с наибольшим размером. Например, при передаче в подпрограмму массивов

 и
 в разделе TYPE надо записать:

                               Type

                                    Vect = array[1..15] of real;

Тогда по описанию

                               Var

                                     X, Y: Vect;

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

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

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

Задача 1

Даны два вектора:

 и
.


Вычислить значение:
, где
;  
;
максимальные компоненты векторов
 и
 соответственно;
средние значения компонент векторов
 и
 соответственно.
Вариант 1.
Использование процедуры.
           Program P1_P;
           Type
                 Vect = array[1..20) of real;
           Var
                  X, Y: Vect;
             i: integer;
             Dx, Dy, D: real;
           Procedure Mod_Otkl (A: Vect; n: integer; var Da: real);
          var
        ma, sa: real;
        i: integer;
 begin
   ma := -1E6;
   sa := 0;
   for i := 1 to n do
        begin
       if a[i]>ma then ma := a[i];
       sa := sa + a[i];
       end;
  sa := sa/n;
  Da := abs(ma - sa);
  end;
            Begin {начало основной программы}
           writeln(‘Введите массив X’);
           for i :=1 to 8 do read(x[i]);
           writeln(‘Введите массив Y’);
                for i := 1 to 20 do read(y[i]);
           Mod_Otkl(X, 8, Dx);
           Mod_Otkl(Y, 20, Dy);
           D := Dx / Dy;
           writeln(‘D=’,  D:6:2);
            End.
Вариант 2.
Использование функции.
           Program P1_F;
           Type
                 Vect = array[1..20) of real;
           Var
                 X, Y: Vect;
            i: integer;
           Dx, Dy, D:real;
           Function Mod_Otkl (A: Vect; n: integer): real;
          var
       ma, sa, Da: real;
       i: integer;
 begin
  ma := -1E6;
  sa:=0;
  for i :=1 to n do
      begin
     if a[i]>ma then ma := a[i];
     sa := sa +a i];
                      end;
   sa := sa / n;
   Da := abs(ma - sa);
   Mod_Otkl := Da;
 end;
           Begin {начало основной программы}
           writeln(‘Введите массив X’);
           for i := 1 to 8 do read(x[i]);
           writeln(‘Введите массив Y’);
                for i := 1 to 20 do read(y[i]);
           Dx := Mod_Otkl(X, 8);
           Dy := Mod_Otkl(Y, 20);
           D := Dx / Dy;
           writeln(‘D=’,  D:6:2);
           End.


                                           Задача 2
Даны две матрицы:
 и
.
Вычислить разность
,
 где
 и
 - количество положительных элементов в матрице  A и B соответственно.
Вариант 1.
Использование процедуры.
           Program P2_P;
           Type
                 Matr = array[1..5, 1..7) of real;
           Var
                 A, B: Matr;
            i, j, KA, KB, C: integer;
            Procedure CP(D: Matr; m, n: integer; Var KD: integer);
           var
       i, j: integer;
  begin
  KD := 0;
   for i := 1 to m do
      for j := 1 to n do
          if d[i,j]>0 then KD := KD + 1;
  end;
            Begin {начало основной программы}
            writeln(‘Введите матрицу A’);
            for i := 1 to 5 do
               for j := 1 to 6 do read(a[i,j]);
             writeln(‘Введите матрицу В’);
             for i := 1 to 4 do
                for j := 1 to 7 do read(b[i,j]);
             CP(A, 5, 6, KA);
             CP(B, 4, 7, KB);
             C := KA - KB;
             writeln(‘C=’,  C:6:2);
            End.  
Вариант 2.
Использование функции.
           Program P2_F;
           Type
                 Matr = array[1..5, 1..7) of real;
           Var
                 A, B: Matr;
            i, j, C: integer;
            Function CP(D: Matr; m, n: integer): integer;
           var
       i, j, KD: integer;
  begin
  KD := 0;
  for i := 1 to m do
     for j := 1 to n do
         if d[i,j]>0 then KD := KD + 1;
  CP := KD;
  end;
            Begin {начало основной программы}
             writeln(‘Введите матрицу A’);
             for i := 1 to 5 do
                for j := 1 to 6 do read(a[i,j]);
             writeln(‘Введите матрицу В’);
             for i := 1 to 4 do
                for j := 1 to 7 do read(b[i,j]);
             C := CP(A, 5, 6) - CP(B, 4, 7);
             writeln(‘C=’,  C);
            End.
ГЛАВА 9.  Текстовые данные
В Турбо Паскале текстовая информация может быть представлена двумя типами данных: символьный (CHAR) и строковый (STRING).

Символьный тип данных


Значением данных символьного типа является любой символ из множества набора всех символов компьютера. Каждому символу соответствует порядковый номер (код) в диапазоне 0..255. Для кодировки символов первой половины диапазона (0..127) используется код ASCII(американский стандартный код для обмена информацией). Вторая половина символов с кодами 128..255 может быть различной. Для компьютеров фирмы IBM наиболее распространен альтернативный вариант кодировки символов.

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

Символьная константа

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

Символьная переменная

объявляется в разделе описания переменных:

                                     Var

                                     cr: char;

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

                 Ввод-вывод символьных данных

Для ввода символьных данных используется оператор READLN. Необходимо помнить, что нажатие любой  небуквенной клавиши (<пробел>, <Enter> и др.) будет значимым и восприниматься как символ.

Пример 1.

Организовать ввод переменных:

a = ‘i’;  b = ‘_’;  c = ‘j’.

                          Var

                          a, b, c: char;

                          Begin

                          writeln(‘Введите исходные данные’);

                          readln(a,b,c);

                          ………….

На клавиатуре символы набираются без апострофов:

i _ j <Enter>

Символ клавиши <Enter> выходит за пределы списка оператора READLN, поэтому он игнорируется.

Для вывода символьных данных используются операторы WRITE и WRITELN.

Пример 2.

Организовать вывод указанных выше переменных на экран.

                         write(a,b,c);

                         writeln;

На экране будет отображено:

                                       i _ j

Оператор WRITELN без списка используется  для первода курсора к началу следующей строки.

                     Обработка символьных данных


Поскольку символы в Турбо Паскале упорядочены, к ним можно применять операции отношения (>, >=, <, <=, =, <>). Это дает возможность записывать логические выражения с символьными данными в условных операторах, например:
                              if ch =’!’ then ch :=  ‘.’;
Символьные данные  могут использоваться и в операторе цикла FOR. Например, при выполнении операторов:
                 for ch := ‘a’ to ‘d’  write(ch);
                 writeln;
на экран выводится последовательность:
                         abcd
Курсор переводится к началу следующей строки.
Библиотека Турбо Паскаля содержит стандартные функции обработки символьных данных. Рассмотрим наиболее распространенные стандартные функции.
ORD(ch) – функция, возвращающая код символа ch.
                 Пример.
Ord(‘a’) = 97.
CHR(N) – функция, преобразующая код N  в соответствующий ему символ.
                 Пример. Chr(97) = ‘a’.
UPCASE(ch) – функция, преобразующая строчную латинскую букву в прописную.
                 Пример.
UpCase(‘a’) = ‘A’.

Понятие записи


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

Андреева С.В.   4   5   5

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

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

                          Type

                             Zap = record

                                            fam: string;

                                            m, inf, h: integer;

                                         end;

                          Var

                             str: Zap;

Здесь zap – имя типа записи;  fam, m, inf, h – поля записи;

str – переменная типа запись.

Служебные слова RECORD…END  играют роль операторных скобок, внутри которых записываются поля с указанием их типов.

Для обращения к отдельным полям записи используется селектор записи.

Общий вид

селектора записи:

                        < имя записи >.< имя поля >

Например, селекторы записи str записываются следующим образом: str.fam, str.m, str.inf, str.h.



Файлы входных данных


При большом объеме входных данных ввод с клавиатуры становится неэффективным, так как любые ошибки связаны с повторным вводом всех данных. Целесообразно для входных данных создать отдельный файл и хранить его на диске. В программе в этом случае с помощью специальных процедур организуется чтение входных данных из файла. Имя файла задается по тем же правилам, которые определены в MS DOS, только указывается стандартное расширение .DAT. Для создания файла данных можно воспользоваться любым текстовым редактором. Если файл небольшого объема, то удобно использовать редактор NC. Для вызова редактора NC надо нажать клавиши [<Shift>+ <F4>].

Файловая переменная

В программе файлу соответствует переменная файлового типа. В зависимости от способа объявления файловой переменной можно выделить три вида файлов.

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

    <файловая переменная>: FILE OF <тип компонент файла>;

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

                               Var

                                    f: file of  Zap;

f – файловая переменная.

- Нетипизированные файлы задаются типом FILE, например:

                               Var

                                    f: file;

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

- Текстовые файлы задаются  типом TEXT, например:

                               Var

                                    f: text;

Текстовый файл представляет собой совокупность строк переменной длины. В конце каждой строки после нажатия клавиши <Enter> формируется специальный признак EOLN (End Of Line).  Число строк в текстовом файле может быть произвольным. В конце файла автоматически формируется признак EOF (End Of File).

Для проверки окончания чтения файла используется стандартная логическая функция EOF(f).

В дальнейшем ограничимся рассмотрением только текстовых файлов.

Доступ к файлам данных


Файл данных становится доступным программе после выполнения стандартной процедуры открытия файла:
           ASSIGN (<файловая переменная>, <имя файла>);
При вызове данной процедуры файловая переменная, объявленная в программе, связывается с именем файла, хранящимся на диске.
<имя файла> -  либо строка, либо переменная строкового типа.
        Например, если файл входных данных экзаменационной ведомости хранится на диске с именем Wed.dat, то процедуру открытия файла можно записать в виде:
                               ASSIGN(f, ‘Wed.dat’);
Инициация файла
Инициировать файл
означает указать направление передачи данных. В Турбо Паскале можно открыть файл для чтения данных  из файла  или для записи информации в файл. Если файл является входным, то он инициируется для чтения стандартной процедурой:
                      RESET(<файловая переменная>);
При выполнении данной процедуры специальный указатель  строк устанавливается на начало файла, то есть подготавливается к чтению первой строки.
Чтение данных из файла
Чтение файла осуществляется построчно с помощью оператора READLN, в котором указываются файловая переменная и список переменных ввода.
Пример. Пусть файл данных экзаменационной ведомости  состоит из строк вида:
4        5        5        Андреева С.В.
        Оператор:    Readln(f, str.m, str.inf, str.h, str.fam);
читает из файла строку и присваивает данные полям str.
Заметим, что поле fam записывается в конце строки. Это связано с тем, что при описании типа поля fam (string) не указан его максимальный размер, и, следовательно, конец поля должен быть зафиксирован клавишей <Enter>.

Пример решения задачи создания документа


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

РЕЗУЛЬТАТЫ ОСЕННЕЙ СЕССИИ ГР.151

 п/п

Ф.И.О.

Математика

Информатика

Химия

Средний балл

1

Андреева С.В.

4

5

5

x

20

Яковлев А.Н.

5

5

4

x

Ср.оценка по дисциплине

x

x

x

-

x - расчетные данные.                         

                                         Решение 

Решение задачи можно разбить на два этапа.

I. Создание файла

входных данных вида:

4        5        5        Андреева С.В.

…………………………………..

5         5       4        Яковлев А.Н.

II. Составление программы обеспечивающей:

    а) чтение и обработку файла;

    б) вывод документа с расчетными данными по заданной форме.

Замечание. В программе необходимо предусмотреть задание входных данных типом запись.

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


ЛИТЕРАТУРА

 

1.Фигурнов В.Э. IBM PC для пользователя. Изд. 7-е, перераб.и доп. – М.: ИНФРА-М, 1997.-640с.

2.Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. – М.: “Нолидж”, 1997. – 616 с.

3.Соппа М.С., Черный Ю.Г. Интегрированная среда Turbo Pascal. Учебное пособие. – Новосибирск: НГАС, 1996. –84с.

4.Воробьева А.П., Перевалова Т.К. Программирование в системе ТУРБО ПАСКАЛЬ. Лабораторный практикум.—Новосибирск: НГАС, 1997.-60с.

5.Джонс Ж., Харроу К. Решение задач в системе Турбо Паскал./ Пер. с аангл. – М.:Финансы и статистика, 1991. –720с.

6.Фаронов В.В. Турбо Паскаль 7.0. Практика программирования. Учебное пособие. – М.: “Нолидж”, 1997.-432с.


 
Приложение 1. Сообщения компилятора
                                                      об ошибках
1 - выход за границы памяти
2 - не указан идентификатор
3 - неизвестный идентификатор
4 - повторный идентификатор
5 - синтаксическая ошибка
6 - ошибка в действительной константе
7 - ошибка в целой константе
8 - строковая константа превышает размеры строки
10 - неправильный конец файла
11 - строка слишком длинная
12 - нужен идентификатор типа
14 - неверное имя файла
15 - файл не найден
16 - диск заполнен
20 - нужен идентификатор переменной
21 - ошибка в определении типа
25 - неверная длина строки
26 - несоответствие типов
27 - неправильный базовый тип отрезка типа
28 - нижняя граница больше верхней
29 - нужен порядковый тип
30 - нужна целая константа
31 - нужна константа
32 - нужна целая или действительная константа
33 - нужен идентификатор типа
34 - неправильный тип результата функции
36 - нужен BEGIN
37 - нужен END
38 - нужно выражение типа Integer
40 - нужно выражение типа Boolean
41 - типы операндов не соответствуют оператору
42 - ошибка в выражении
43 - неверное присваивание
44 - нужен идентификатор поля
50 - нужен оператор DO
54 - требуется OF
57 - требуется THEN
58 - требуется DO или DOWNTO
59 - неопределенное опережающее описание
61 - неверное преобразование типа
62 - деление на нуль
63 - неверный файловый тип
64 - нет возможности считать или записать переменные данного типа
66 - нужна строковая переменная
67 - нужно выражение строкового типа
74 - типы констант и тип выражения оператора CASE не соответствуют друг другу
75 - нужна переменная типа запись
76 - константа нарушает границы
77 - нужна файловая переменная
79 - нужно выражение типа real или integer
84 - нужно UNIT
85 - нужно указать ";"
86 - нужно указать ":"
87 - нужно указать ","
88 - нужно указать "("
89 - нужно указать ")"


90 - нужно указать "="
91 - нужно указать ":-"
92 - нужно "[" или "(."
93 - нужно "]" или ".)"
94 - нужно "."
95 - нужно ".."
96 - слишком много переменных
97 - неправильная переменная цикла оператора FOR
98 - нужна переменная целого типа
100 - несоответствие длины строковой переменной или конс­танты
101 - неверный порядок полей
102 - нужна константа строкового типа
103 - нужна переменная типа integer или real
106 - предшествующее выражение должно иметь символьный тип
108 - недостаточно памяти для выполнения программы
109 - нет возможности найти файл .ЕХЕ
110 - модуль выполнять нельзя
112 - константа оператора CASE находится вне границ
114 - нет возможности вызвать процедуру прерывания
123 - слишком много символов (больше 64 Кбайт)
124 - слишком большой раздел операторов (больше 24 Кбайт)
126 - файлы должны иметь параметры VAR
127 - слишком много условных символов
130 - ошибка в начальных условных определениях
131 - заголовок не соответствует предыдущему определению
132 - крити1 1ская ошибка диска
133 - нельзя вычислить данное выражение
134 - некорректное завершение выражения
135 - неверный спецификатор формата
136 - недопустимая косвенная ссылка
137 - здесь не допускается использование структурной переменной
138 - нельзя вычислить без блока System
139 - доступ к данному символу отсутствует
140 - недопустимая операция с плавающей запятой
142 - должна использоваться переменная-процедура или функция
143 - недопустимая ссылка на процедуру или функцию
НЕКОТОРЫЕ СООБЩЕНИЯ ОБ ОШИБКАХ
ВЫПОЛНЕНИЯ ПРОГРАММ
1 - не найден файл
3 - не найден маршрут
4 - слишком много открытых файлов
5 - отказано в доступе к файлу
15 - недопустимый номер дисковода
16 - нельзя удалить текущий каталог
17 - нельзя при переименовании указывать разные диско­воды
100 - ошибка чтения диска
101 - ошибка записи на диск
102 - файлу не присвоено имя
103 - файл не открыт


104 - файл не открыт для ввода
105 - файл не открыт для вывода
106 - неверный числовой формат
150 - диск защищен от записи
151 - неизвестный модуль
152 - дисковод находится а состоянии "не готов"
153 - неопознанная команда
154 - ошибка в исходных данных
155 - при запросе к диску неверная длина структуры
156 - ошибка при операции установки головок на диске
157 - неизвестный тип носителя
153 - сектор не найден
159 - кончилась бумага на устройстве печати
160 - ошибка при записи на устройство
161 - ошибка при чтении с устройства
162 - сбой аппаратуры
200 - деление на нуль
201 - ошибка при проверке границ
202 - переполнение стека
203 - переполнение динамически распределяемой области памяти
204    -    недействительная операция ссылки
205    -    переполнение операции с плавающей запятой
206    -    исчезновение порядка при операции с плавающей запятой
207    -    недопустимая операция с плавающей запятой
Приложение 2. Таблица кодировки


Клавиатура


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

Укажем назначение некоторых клавиш.  [Esc] – с ее помощью отменяется любая команда.  [Shift] – при одновременном нажатии с клавишами алфавита мы включаем верхний регистр  (буквы становятся заглавными). [Caps Lock] – фиксация регистра (с ее нажатием заглавные буквы вводятся постоянно, уже не прибегая к одновременному нажатию клавиши [Shift]). Для ввода пустых промежутков в текст  служит “пробел” - длинная клавиша без обозначения, расположенная внизу клавиатуры. Функциональные клавиши  [F1]…[F12] находятся вверху клавиатуры и предназначены для быстрого ввода команд одной клавишей. Вспомогательные клавиши [Ctrl] и [Alt] действуют только при одновременном нажатии с другими, меняя их функции (например  [Alt+F4]), или могут применяться для переключения алфавита с русского на латинский и обратно ([Alt+Shift]).  Одна из наиболее употребительных клавиш - [Enter]. Это клавиша “ввода”.  Почти любая команда или выбор какого-либо пункта меню (в отсутствии мыши)  должны завершаться нажатием клавиши [Enter].

Клавиши управления курсором находятся справа. На них изображены стрелки   ¬ ,  ­ ,  ® ,  ¯ . Также справа на клавиатуре имеется цифровой блок. Но активен он лишь тогда, когда нажата клавиша [Num Lock].  При этом в верхней правой части клавиатуры включается лампочка индикации. При выключенной лампочке  клавиши цифрового блока управляют движением  курсора.



Команда Compile


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

Compile([Alt + F9]) –  компилирует конкретно ту программу, которая находится в окне редактора (или содержащуюся в файле, имя которого указано в подкоманде Primary file команды Compile).

Make([F9]) – компилирует программу вместе со всеми вызываемыми модулями пользователя, в которые были внесены изменения.

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

                                



Команда Debug


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



Команда Edit


Undo -  отмена предыдущего выполненного действия в редакторе, так называемый  “откат”. Синоним –  [Alt + Back Space].

Redo -   отменяет действие команды Undo.

Cut(“вырезать”) - удаляет выделенный блок текста из окна редактора и переносит его в буфер обмена  Clipboard . Синоним – [Shift + Del].

Copy -   копирует выделенный блок из окна редактора в буфер обмена  Clipboard . Синоним –  [Ctrl + Ins].

Paste(“вставить”) - обратное копирование содержимого буфера обмена Clipboard в окно редактора, в то место, где в данный момент находится курсор. Синоним  –  [Shift + Ins].

Clear -    удаляет из окна редактора выделенный блок без помещения его в буфер обмена. Синоним  [Ctrl + Del].

Show clipboard  -   отображает содержимое буфера обмена.



Команда File


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

New -   удаление текущей программы из оперативной памяти, очистка экрана и создание нового файла с именем nonameXX.pas.

Open -  загрузка файла с диска в новое окно редактора. При этом в диалоговом окне на выбор предлагаются имена файлов с маской   *.pas . Если ввести имя, которого нет в текущем каталоге, то будет создан новый файл. Синоним команды Open - нажатие клавиши  [F3].

Save -  сохранение на диске текущего редактируемого файла. Если имя файла было nonameXX.pas, то среда запросит новое имя. Синоним команды Save - нажатие  [F2].

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

Save all

-  сохраняет содержимое всех окон редактора в виде файлов на диске.

Change dir -  изменяет текущий каталог пользователя.

Print -   печатает содержимое текущего окна на принтере.

Printer setup

-   позволяет осуществить настройки принтера и параметров печати.

Dos shell

-  временный выход в DOS. Для возврата в Турбо-среду необходимо набрать команду  Exit  и нажать  [Enter].

Exit -  завершает работу с Турбо Паскалем.  Синоним команды – сочетание клавиш   [Alt+X].



Команда Help


Команда Help – выдача справочной информации. Особенно эффективна и полезна ее подкоманда Topic Search ([Ctrl + F1]), дающая полные пояснения к оператору или служебному слову, под которым в данный момент находится курсор. При этом предлагается  Example  – текст программы, в котором правильным образом использован рассматриваемый оператор.

2.3.



Команда Options


Команда  Options   обеспечивает управление параметрами  интегрированной среды  Турбо Паскаль, например, такими как настройки рабочих каталогов (директорий), конфигурация отдельных элементов среды  и т. д.



Команда Run


Run([Ctrl + F9]) -  запускает компиляцию (трансляцию), компоновку (сборку, линковку) и выполнение программы без промежуточного участия программиста.

Go to cursor([F4])  - на  режиме отладки осуществляет  прогон от выделенной голубым цветом строки до строки, в которой находится курсор.

Trace Into([F7]) -   запускает режим пошагового (построчного) выполнения программы (трассировка). Многократно нажимая  клавишу [F7], строка за строкой, мы  можем выполнить всю программу.  Очередная строка при этом подсвечивается голубым цветом.

Step over

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

Program reset([Ctrl + F2]) -   прерывание режима отладки (трассировки). При этом гаснет подсветка текущей строки.



Команда Search


Find -   поддерживает поиск нужного фрагмента текста. В диалоговом окне при этом необходимо ввести ключевую строку для поиска.

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

Search again  -   повторение поиска.

Go to line number  -  переход на строку редактора с указанным номером.



Команда Window


Tile(“черепица”) - располагает окна так, чтобы каждое окно было видно на экране и все они имели бы равные  размеры.

Cascade  -   окна располагаются  каскадом, с перекрытием.

Zoom([F5]) –  распахиваeт окно на весь экран или возвращаeт ему прежний вид.

Next([F6]) – переключение от одного активного окна к другому.

Close([Alt + F3]) – закрывает активное окно.



Монитор


Монитор, называемый иногда дисплеем, служит для отображения информации, передаваемой пользователю. Наиболее распространенным в настоящее время является дисплей с экраном размером  15 дюймов (15¢¢~ 38 см) по диагонали. Такие мониторы устойчиво и комфортно показывают изображение, состоящее из 800х600 пикселов и содержащее более миллиона цветов и оттенков. Современные мониторы оснащены функцией энергосбережения и не нуждаются  в установке защитного фильтра на экран.   



Основные приемы работы в NC


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

-    Для того, чтобы войти в каталог, надо выделить имя каталога и нажать [Enter]. Для выхода из каталога (чтобы попасть в “родительский” каталог) нужно выделить “горизонтальное двоеточие” вверху  таблицы и нажать [Enter].

-    Просмотр файла. После выделения файла следует нажать [F3]. Выход из режима просмотра - клавиша [Esc] или [F10]. Если файл не помещается в рамки одного экрана, то при просмотре следует делать прокрутку клавишами управления курсором  [­],  [¯].

-    Смена рабочего диска осуществляется клавишами [Alt + F1] (для левой панели) и [Alt + F2] (для правой панели). Далее в появившемся диалоговом окне необходимо выбрать искомый диск и нажать [Enter].

-    Копирование файлов. Оболочка NC позволяет достаточно просто и наглядно выполнять операцию копирования из одной панели на другую панель. Первый этап операции состоит в настройке одного из окон на каталог, содержащий файл, который следует копировать. Другое окно настраивается на диск и каталог, в котором должна появиться копия файла. На втором этапе выделяем имя копируемого файла и нажимаем клавишу [F5]. В появившемся окне запрашивается подтверждение на выполнение операции (в нем при необходимости можно ввести новое имя для копии), и после нажатия [Enter] происходит копирование. NC позволяет выполнять и групповые операции над файлами, такие, например, как перемещение и копирование. Для этого надо лишь выделить с помощью клавиши [Ins] необходимое количество файлов, а затем, как уже указывалось выше, нажать [F5]  и  [Enter].

-    Создать

новый подкаталог (папку) в текущем каталоге можно с помощью клавиши [F7]. В появившемся окне необходимо набрать нужное имя создаваемого каталога и нажать [Enter].

-    Для удаления файла или каталога следует выделить имя этого объекта и нажать [F8]. В диалоговом окне будет запрошено подтверждение необходимости выполняемой операции.



Работа с окнами


Несмотря на то, что Турбо Паскаль как интегрированная среда программирования возник намного раньше, чем операционная среда Windows (по-русски  это  -   Окна), в нём практически уже были заложены и реализованы многие черты перспективного принципа поддержки многооконного режима работы.

Для обмена информацией между программистом и средой в Турбо Паскале существует несколько основных видов окон. В окне редактора программист набирает и корректирует тексты программ, причем одновременно может быть загружено несколько текстов. Окно программы служит для показа результатов выполнения(“прогона”) программы(“горячие” клавиши - [Alt+F5] , а выход из этого окна в редактор – нажатие любой клавиши). В процессе отладки, используя окно наблюдения (команда DEBUG/WATCH), пользователь может в “реальном времени” пооператорно отслеживать изменение значений переменных. Имеется и справочное окно (сочетание клавиш [Ctrl+F1]), в котором появляются различные полезные сведения. Прямо из него можно скопировать и перенести в свою программу фрагмент текста действующего примера. Одновременно на экране, накладываясь частично друг на друга, может присутствовать сразу несколько окон, однако только одно из них активно в каждый момент. Активное окно очерчивается двойной рамкой, неактивное -  одинарной. Для смены активного окна используется клавиша [F6] или щелчoк мыши. Клавиша [F5] распахивает окно на весь экран или возвращает окну обычный размер. Команда [Alt+F3] закрывает окно и удаляет его с экрана.

Положениe и размеры активного окна можно изменить. Для этого командой [Ctrl+F5] вызываем режим модификации. Рамка окна становится зеленой. Теперь клавишами управления курсором окно перемещаем по экрану, а в сочетании с клавишей [Shift] меняем размеры окна. Фиксируем все изменения клавишей [Enter]. При работе с мышью эти же действия можно выполнить, захватывая указателем мыши заголовок окна или правый нижний его угол. Щелкая указателем мыши по позиции [?] в заголовке, мы закрываем и удаляем окно с экрана. Позиции [­] или [×] служат для распахивания окна или возвращения его к обычным размерам.   

Кроме рассмотренных типов окон, по мере надобности на экране разворачиваются диалоговые окна. Внутри них может быть несколько полей.  C помощью поля ввода, в котором имеется мерцающий курсор, программист может ввести с клавиатуры числа или текстовую строку. В поле выбора среда предлагает возможные варианты опций, служащих для установки необходимых настроек среды. Для перехода от одних полей к другим служит клавиша [Tab]. Внутри полей перемещение производится клавишами управления курсором или мышью. Закрыть диалоговое окно можно клавишей [Enter]. В этом случае реализуются все изменения, проведенные в окне. Чтобы закрыть окно без сохранения результатов наших манипуляций, нажимаем кнопку [Cancel].



Системный блок


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