Make your own free website on Tripod.com

                                               פרופ' אבא  אנגלברג

          טורבו  פסקל. תכנות  מבני  למתחילים  ומתקדמים  כולל  גרסאות  5.5  ו- 6.0

                                                     Проф. Аба Ангельберг   

Турбо Паскаль. Структурное программирование для начинающих и продолжающих (включительно версии 5.5 и 6.0)

 

Предисловие

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

Язык  Паскаль - Pascal - назван  в  честь  французского  математика  и  философа  Блеза  Паскаля(Blaise  Pascal, 1623 - 1662). Паскаль  изобрел  вычислительную  машину  Pascaline   для  помощи  отцу  в  подсчете  налогов. Его  научные  и  теоретические  работы  в  области  вычислений  много   дали  развитию  компьютерных  наук  наших  дней.

Язык  программирования  “Паскаль”  разработан  проф.  Николасом  Виртом (prof. N. Wirth) из  федеральной  политехнической  школы, Цюрих, Швейцария. Проектирование  языка  началось  в  1969, а  через  год  была  готова  его  первая  версия. Первая  же  стандартная  версия  была  опубликована  в  1974  году.

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

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

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

b).Можно  рассматривать  последовательность  основных  действий  в  каждом  фрагменте  программы  по  отдельности  и  последовательность  основных  фрагментов, составляющих  программу.

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

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

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

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

a).последовательная  структура(Sequence);

b).итерационная  структура(Iteration);

c).избирательная  структура(Selection).

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

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

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

a).эффективный  и  экономный  компилятор, который  мог  действовать  и  на  микрокомпьютерах;

b).большая  простота  по  сравнению  с  предшествующими  ему  языками  Fortran, Cobol, PL/1;

c).улучшенные  функции  по  сравнению  с   Fortran  и  Basic.

d).большое  число  средств, соответствующих  принципам  структурного  программирования;

e).простота  использования  данных  средств: записей, сцепленных  списков  и  множеств;

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

Свойства   d’ - f’  характерны  и  для  языка   PL/1, разработанного  IBM. Этот  язык  сложнее  и  богаче  Паскаля, он  обладает  дополнительными  свойствами, необходимыми  в  области  обработки  данных  управления  и  в  инженерно-научной  области. В  языке  Паскаль  делается  упор  на  основные  функции  обслуживания, характерные  для  научной  и  инженерной  обработки, на  дисциплину  структурного  программирования  и  на  обязательные  определения  без  деклараций  по  умолчанию (Default  Option). Такая  конструкция  (Design)  языка  Паскаль  приводит  к  тому, что  его  можно  легко  задействовать  даже  на  мини- и  микрокомпьютерах.

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

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

Про  саму  книгу

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

Язык  Паскаль  составляет  основу  этой  книги. Дополнительно  даются  объяснения  особых  средств, составляющих  “оболочку”(среду)  Турбо. Эти  вспомогательные  средства  включают  специальный  редактор (editor)  Турбо  Паскаля, особый  отладчик(debugger), функции  и  процедуры, которые  позволяют  управлять  файлами, экраном, диалогом  пользователь - компьютер  и  т.п.

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

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

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

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

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

В  главах  2, 3, 4  показаны  операции  управления, характерные  вообще  для  программирования  и  для  прграммирования  на  Паскале  в  частности.

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

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

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

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

Главы  9 - 16  принадлежат  второму  этапу  изучения  языка. Их  рекомендуется  изучать  по  порядку, но  можно  и  пропускать  по  желанию  некоторые  темы (эти  фрагменты  обозначены  звездочкой *). Желательно, чтобы  ученик  знал  способы  представления  чисел  в  компьютере  согласно  объяснений  в  приложении  a’.

Глава  9  обсуждает  тему  записей. Это - центральная  тема, важная  при  продолжении  изучения, поэтому  рекомендуется  поработать  над  примерами  использования  записей.  Глава  10  представляет  специальные  процедуры  Турбо  Паскаля  для  обслуживания  строк.

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

Глава  13  занимается  множествами. Это  отдельная  тема, она  не  базируется  на  изучении  файлов.

Главы  14, 15, 16  составляют  один  раздел, хотя  можно  пропустить  главу  14 (рекурсии)  и  некоторые  темы  главы  16.

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

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

Приложение c’  есть  краткое  описание  операционной  системы  DOS. В  ходе  изучения  Турбо  Паскаля  можно  и  даже  нужно  пользоваться  этим  материалом  для  верной  и  эффективной  работы  с  компьютером.

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

Словарь  основных  терминов  по  теме  на  иврите  и  английском.

Как  работать  с  книгой?

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

a).Изучить  содержание  главы. Если  встретились  трудности, стоит  прогнать  на 

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

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

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

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

 

Глава  1. Программирование  вычислений  и  печати (вывода)

1.1.Решение  задачи  на  языке  программирования

1.1.1.Проектирование  решения

Процесс решения  задачи  на  компьютере  включает  два  этапа:

a).Замысел(Design). На  этом  этапе  описывают  логические  шаги  решения  задачи. Для  этого  пользуются, как  мы  увидим  в  дальнейшем,  блок-схемами.

b).Программирование(Programming)  или  кодирование(Coding). На  этом  этапе  указанные  шаги  переводятся  в  компьютерные  команды, которые  записываются  на  языке  программирования.

Последовательность  команд, которая  называется  программой(Program), заставляет  копьютер  совершить  определенные  действия, целью  которых  является  достижение  определенного  результата  или  решение  некоторой  задачи. На  первый  взгляд  команды  эти  надо  писать  на  машинном  языке(Machine  Language), чтобы  компюьтер  или  его  электронные  компоненты  могли  их  исполнить. Такой  путь  не  рационален  и  не  обсуждается  здесь. Вместо  этого  программирование  ведется  на  языке  высокого  уровня (High  Level  Language) - языке  Паскаль (Pascal), который  похож  на  человеческий  язык  и  удобен  для  программирования. Чтобы  компьютер  смог  действовать  по  этой  программе, необходимо  перевести  ее  на  машинный  язык. Это  действие  осуществляется  без  вмешательства  программиста, посредством  компилятора (Compiler). После  компиляции  получаем  программу  на  языке  машины, теперь  ее  можно  прогнать (Run)  или, что  то  же,  исполнить (Execute)  на  компьютере.

В  следующем  примере  надо  решить  задачу  вычисления  недельной  оплаты  работника  согласно  часов  его  работы. Решение  мы  представим, как  было  сказано, в  компьютерной  программе  на  языке  Паскаль. Во  время  составления  программы  мы  не  знаем  почасовую  оплату  и  число  часов  работы. Будем  рассматривать  эти  данные  как  неизвестные (или  переменные - Variables, поскольку  эти  значения  могут  быть  разными  при  каждом  прогоне  программы)  и  дадим  им  имена  SHIUR(почасовая  плата  - на  иврите)  и  SHAOT(часы), соответственно.  

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

Нам  осталось  только  выделить  место  в  пямяти  компьютера, куда  будет  помещен (Store, по  ошибке  прежде  говорилось  сохранен, складирован)  по  готовности  верный  ответ. Место  это  назовем  SACHAR(плата), это - третья переменная  программы.

С  точки  зрения  компьютера  определенные  нами  неизвестные  есть  имена  ячеек  в  памяти (Memory), которые  могут  содержать  знаки, составляющие  числа, буквы  и  специальные  символы. Каждое  имя  отождествляется  с   этим  местом  в  памяти  в   ходе  исполнения  программы, поэтому  оно  именуется  адресом (Address). Переменные  в  памяти  могут  располагаться  так: (Рис. 1  Память  SHIUR   SHAOT   SACHAR)     

1.1.2.Блок-схема  решения  задачи

Чтобы  запрограммировать  решение, подготовим  сперва  блок-схему(Flow  Chart).

(Рис. 2  (1)старт  (2)прочти  SHIUR, SHAOT  (3)SHIUR*SHAOT ® SACHAR  

(4)напечатай  SACHAR   (5)конец).

 

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

(1)Этот  символ  обозначает  старт  или  финиш  программы.

(2)Параллелограмм  обозначает  ввод (Input) - чтение  внешних  данных  компьютером  или  вывод (Output) - печать  данных  из  памяти  компьютера, например, на  бумагу  или  представление  на  экран. В  нашей  задаче  нам  нужно, чтобы  во  время  исполнения  программы  компьтер  был  готов  воспринять  числа, которые  ей  нужны, например, с консоли(клавиатуры).  Первое  число  представляет  собой  почасовую  плату  рабочего, оно  будет  записано  по  адресу  SHIUR  в  памяти. Вторым  является  число  отработанных  им  часов, оно  будет  записано  по  адресу  SHAOT  в  памяти.

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

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

(5)Как  и  (1).

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

 

1.2.Программа  на  языке  Паскаль

Запишем  теперь  решение  задачи, представленной  в  1.1, в  виде  программы  на  языке  Паскаль:

program  maskort1;                  {1}

var                                             {2}

  shiur, shaot, sachar:   real;       {3}

begin                                         {4}

  read(shiur, shaot);                    {5}

  sachar := shiur*shaot;              {6}

  writeln(sachar);                         {7}

end.                                            {8}

Если  ввод  в  компьтер  есть  18.0  10.0 , то  вывод  будет  1.80000Е+02 , т.е. 180.

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

Жирный  шрифт  некоторых  слов  указывает, что  они  установлены  правилами  языка  и  должны  появляться  в  каждой  программе  по  этим  правилам. Это - зарезервированные  слова (Reserved  Words), которые  и  составляют  язык  программирования. Шрифт  подчеркивания  использован  исключительно  для  примера.

Чтобы  написать  и  прогнать  эту  программу  на  IBM-совместимом  PC  c  Турбо  Паскалем, надо  совершить  следующие  действия(соответствующие  Turbo  Pascal  5.5):  

1.Набрать  слово  Turbo.

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

3.Перейди  к  опции  Edit  и  набери  нашу  программу, рассмотренную  выше(можно  без  номеров  строк).

4.По  завершении  нажми  F2, дай  программе  имя  и  нажми  Enter.

5.Нажми  F10, чтобы  вернуться  в  строку  главного  меню, и  выбери  опцию  Compile

(более  быстрый путь - прямо  с  экрана - нажми  Alt-C). Если  в  программе  есть  ошибки, курсор  обозначит  их  местоположение. Ты  можешь  исправлять  ошибки  и  повторять  текущий  шаг  до  появления  слова  Success  в  окне  в  центре  экрана.

6.Чтобы  прогнать  скомпилированную  программу, нужно  сделать  одно  из  следующих  действий:   a).Нажми  F10; R; Enter.   b).Нажми  Alt-R; Enter.     c).Нажми  Ctrl-F9.

7.Введи  данные, когда  курсор  ожидает  ввода.

8.Чтобы  посмотреть  вывод  после  возвращения  в  программу, нажми  Alt-F5. А  затем  F5 - для  возвращения  в  программу.

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

F6 - переводит  тебя  в  нижнее  окно, которое  называется  окном  слежения(Watch  Window) - будет  объяснено  в  дальнейшем.  

Alt-F6 - переводит  тебя  в  окно  вывода, занимающее  половину  экрана. Теперь  возможно  перемещение  между  половинами  экрана  с  помощью  F6.

Если  ты  хочешь, чтобы  окно  редактирования  или  окно  вывода  заняло  бы  весь  экран, можно  нажать F5  в  то  время, когда  это  окно  действительно. Повторное  F5  возвращает  экран  в  предыдущее  состояние. Клавиши  вроде  F5, F6  и  Alt-F6, которые  выполняют  некоторое  действие  и  затем  обратное  ему действие, называются Toggle.

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

В  следующих  параграфах  будет  представлено  объяснение  программы. Числа  в  скобках  относятся  к  обозначенным  ими  строкам  программы. Так  будет  и  при  других  объяснениях  на  протяжении  книги.

1.2.1.Заголовок  программы

{1}Имя  программы(Program) есть  Maskort1. Имя  это  дается  программистом, чтобы  обозначить  цель  программы  и  чтобы  отличить  ее  от  других  программ, которые также  сохраняются  в  компьютере. (Необязательная  часть. INPUT - отмечает, что  программа  ждет  данные  извне. Данные  ввода  обеспечиваются  стандартным  устройством(Device)  ввода  используемого  компьютера, в  нашем  случае  это  клавиатура  консоли. OUTPUT - отмечает, что  программа  выдает  результаты, называемые  выводом. Вывод  обеспечиваются  стандартным  устройством  вывода  используемого  компьютера, обычно  это  принтер  или  экран  консоли).

Для  отделения  оператора  от  оператора  используется  точка  с  запятой(;).

1.2.2.Объявление  переменных

{2}var - от  слова  variable(переменная) - заголовок  списка  переменных, которые  будут  использоваться  в  программе. Запрещено  использование  по  ходу  программы  переменных, которые  не  были  провозглашены. Оператор  var  есть  оператор  объявления (Declaration  Statement), поскольку  он  дает  общую  информацию  о  переменных  и  не  обязан  совершать  с  ними  какие-либо  действия.

{3}Имена  shaot, shiur  и  sachar  выбраны  программистом  для  подчеркивания  их  смысла(на  иврите).

Имена  задаются  программистом   имя  программы  и  имя  переменной)  по  следующим  правилам:     a).Имя  переменной  должно  начинаться  буквой(т.е.  одной  из  от  A(a)  до  Z(z))  или  с  линии  нижнего  подчеркивания, которая  выглядит  так: _(underscore).      b).Остальные  символы  имени  переменной  это  буквы, цифры  и  линии  подчеркивания; запрещено  использовать  любые  другие  символы (например, +, -, *, ?, /). Символ  _  улучшает  читаемость  переменной, когда  хотят, чтобы  имя  состояло  из  двух  частей, например: yeled_gadol  место  yeledgadol(большой_мальчик).    c).Максимальная  длина  имени   127  символов, но  компилятор  работает  только  с  63  первыми  символами.    d).Запрещено  использовать  в  качестве  имени  зарезервированное  слово  конце  главы  приведен  список  всех  этих  слов). Примеры  разрешенных  имен: inventory, abc, a500, sachar, mas_hachnasa.      Примеры  запрещенных  имен: 1a50(сначала - цифра), toza-ah(содержит  запрещенный  символ), program(зарезервированное  слово), mas hachnasa(/подоходный  налог/ - пробел  запрещен).

После  двоеточия (в  строке  3 программы) идет  слово  real, которое  переводится -  вещественный. Оно  определяет  переменную, принимающую  значения  действительных  чисел, как  в  нашем  примере - десятичные  числа(с  десятичной  дробью). Кроме  чисел  типа   real  можно  пользоваться  переменными  типа  integer, т.е.  целыми  переменными.  Слово  real  указывает  на  то, что  внутренное  представление  числа  в  компьютере - с  плавающей  точкой, а  слово  integer  указывает  на  внутреннее  представление  целого  числа  в  виде  дополнения  до  2-х. Исчерпывающее  объяснение  этого  вопроса  см.  в  приложении   1, разделы  4  и  5. Там  указано  относительно  целых  чисел, что  кроме  типа  integer, можно  пользоваться  типом  longint(длинные  целые  числа), shortint(числа  между  -128  и  127). Особенно  большие  вещественные  числа  с  большим  числом  значащих  цифр  содержатся  в  типах  double  и  extended.

Оператор  var  можно  схематически  описать  так: (Рис. 3   var  переменная   тип).  Далее  мы  будем  пользоваться  подобными  эскизами  для  схематического  описания  операторов  Паскаля. Каждый  символ  или  слово  внутри  кружка  должно  присутствовать  в  команде  так, как  написано. Слово  на  иврите(русском)  внутри  прямоугольника  надо  заменять  на  переменную, устанавливаемую  программистом. Когда  стрелки  разветвляются, то  это  значит, что  имеется  более  одной  возможности  продвижения  программы,  и  программисту  предстоит  избрать  направление  согласно  условия  задачи. Отсюда  следует, что  в  объявлении  var  можно  записывать  переменные  одного  типа, где  запятая  разделяет  имена  переменных. Можно  описывать  также  несколько  типов  переменных, при  этом  точка  с  запятой (;)  разделяет  типы.

1.2.3.Исполнимая  часть

{4}Слово  begin  (начало)  отмечает  начало  исполнимых  команд  программы. Операторы  до  этого  слова  являются  декларациями (Declarations). Операторы  после  него  есть  команды (Instructions). Слово  begin  считается  знаком  препинания, а  не  оператором, поэтому  после  него  не  нужно  ставить  точку  с  запятой.

Чтение  данных

{5}Команда  read  обозначает, что  требуется  получить  на  вводе  значения  двух  переменных  shiur  и  shaot. Наберем  на  терминале  два  десятичных  числа, разделенных  ...  хотя  бы  одним  пробелом. Следует  помнить, что  после  набора  данных  нужно  нажать  на  клавишу, указывающую  компьютеру  их  ввести, чтобы  они  были  переданы  с  терминала  в  память  компьютера. Клавиша  эта  называется  ...  ENTER ... .

Десятичное  число  можно  представлять  двумя  способами.

a).Десятичное  представление (читать  слева  направо):

[знак +(можно опускать) или - по  выбору] [хотя  бы  одна  цифра] [.] [хотя  бы  одна  цифра]

Например, законные  десятичные  числа: -29.4  +0.14  17.1

Незаконные  числа: .17 (нет  цифры  слева)   17. (нет  цифры  справа).

b).Научное  представление (читать  слева  направо, начиная  с  первой  строчки):

[знак  +  или  -  по  выбору] [хотя  бы  одна  цифра]

[нет  точки  или, если  она  есть,  хотя  бы  одна  цифра  справа  от  нее]

[E] [знак  +  или  -  по  выбору] [одна  или  две  цифры]

Символ  E  заменяет  слова  “умноженное  на  10  в  степени”, т.е.  5Е2  это  5, умноженное  на  10  во  второй  степени. 

Например, законное  представление: -26.4Е7  26.4Е+7  +26.4Е+07   26Е-7

Незаконное  представление: -7.5E4.1(после  Е  возможно  только  целое  число)  E14(хотя  бы  одна  цифра  должна  быть  перед  Е)    16.1E125(максимум  две  цифры  после  Е) Отсюда, если  во  время  исполнения  программы  набрать  на  терминале    1.4E1  42.5  переменная  shiur  примет  значение  14, а  переменная  shaot  примет  значение  42.5. Значения  читаются  слева  направо.

Можно  подытожить  представление  вещественных  чисел  в  следущем  наброске:

(Рис. 4   цифра  цифра  цифра)

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

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

Целое  число  определяется  так(слева  направо):

[знак  +  или  -  по  выбору] [хотя  бы  одна  цифра]

Для  примера, законное  представление: -3   03   4287   MAXINT(наибольшее  целое  число  типа  integer  в  Турбо  Паскале).  Незаконное  представление: 4,861(запятая  запрещена)  7- (знак  справа)   3.0 (целое  число  не  содержит  признак  дроби).

Можно  также  представлять  шестнадцатиричное  число  подстановкой  знака  $  перед  числом. Например, $c3  равно: 12×161 + 3×160 = 195(см. приложение  1, часть  2).

В  примере  вычисления  оплаты  мы  набрали  18.0  10.0 . Но  могли  набрать  18   10 . И  получили  бы  верный  результат, т.к.  любое  целое  число  является  также  и  вещественным, что  можно  видеть  из  схематического  описания  вещественного  числа. Целые  и  вещественные  числа  могут  появляться  и  в  теле  программы, а  не  только  при  вводе  извне. Когда  они  написаны  в  программе, их  называют  постоянными (Constants).

Операторы  присвоения(подстановки)

{6}Операторы  со  знаком  :=  это  операторы  присвоения (Assignment  Statement). Знак  *  обозначает  действие  умножения. Назначение  операции  в  том, что  число, находящееся  по  адресу  shaot,  будет  перемножено  с  числом  по  адресу  shiur, а  результат  передан  по  адресу  sachar.  Если  по  адресу  sachar  до  передачи  было  записано  какое-либо  значение, оно  будет  стерто  и  заменено  произведением  shaot  и  shiur.  Смысл  знака  :=  напоминает  стрелку  ->(т.е. замени  на ...), но  не  знак  равенства(=). Поэтому  можно  писать  n := n + 1, когда  мы  намерены  обратиться  к  предыдущему  значению  n(20, например), добавить  к  нему  1  и  занести  сумму  21  в  качестве  нового  значения  n  по  адресу   этой  переменной. В  этом  действии  предыдущее  значение  n(20)  будет  стерто.  С  другой  стороны, в  n = n + 1  имеет  место  математическое  противоречие. Но  существует  много  языков  программирования, в  которых  знак  =  используется  для  двух  различных  целей и  для  сравнения  и  для  подстановки. Другие  опреации, кроме умножения, определенные  между  постоянными  и  переменными, это  сложение(+), вычитание(-)  и  деление(/).

Если  А  и  В - целые  переменные, можно  определить  два  вида  деления.  

a).Целое  деление. При  делении  А  на  В  получают  два  результата - целых  числа: частное (Quotient)  и  остаток(Remainder). Частное  получают  с  помощью  операции        A div B, а  остаток - посредством  операции  A mod B. Например, если  А = 10,   В = 3, то  после  выполнения  команд C := A div B; D = A mod B;  получаем  результаты  C = 3, D = 1, соответственно. В  дальнейшем  надо  будет  обсудить  случаи, когда  A < 0, B < 0.

b).Десятичное(вещественное)  деление. Обозначается  А/В. Согласно  значениям  из  предыдущего  примера  после  выполнения  C := A/B; получим  С = 3.333. Хотя  операнды  А  и  В - целые, результат  получается  вещественный, и  переменную  С  надо  определить  как  вещественную. И  еще  пример: деление  8/2  даст  число  4.0(а  не  4).

В  команде  присвоения, находящейся  в  шестой  строке (sachar := shiur*shaot;)  все  три  переменные  определены  как  вещественные. Нельзя  было  бы  написать  эту  команду, если  бы  sachar  было  объявлено  целым, поскольку  переменная, предназначенная  для  хранения  целых  чисел, не  может  содержать  результат, который  в  большинстве  случаев - не  целый. В  то  же  время, если  происходит  обратное, т.е.  shiur  и  shaot  определены  как  целые, а  sachar - как  вещественная  переменная, разрешено  писать sachar := shiur*shaot; . Это  допустимо, т.к.  если  sachar  может  содержать  вещественное  число, она, конечно, может  хранить  и  целое, представленное  в  виде  вещественного.

Схематическое  описание(Рис. 5  Переменная   Арифметическое  выражение)  команды  присвоения(подстановки).

Арифметическое  выражение(Arithmetic  Expression)  содержит  одну переменную  или  постоянную  или  произвольное  сочетание  переменных  и  постоянных, связанных  знаками  арифметических  действий(Arithmetic  Operators)  +, -, *, /, div  или  mod. Для  примера  запишем  несколько  арифметических  выражений:

A

-5 + 7

B*A - 17

10 mod 3*4

17

15 + 15/5

Каким  будет  значение  последнего  выражения: 18 (15+(15/5) = 18)  или  6 ((15+15)/5 = 6)?

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

(1).выражение  в  скобках;

(2).знак  - , когда  он  обозначает  отрицательность, а  не  вычитание;

(3).mod, div, /, *;

(4).-, + .

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

В  выражении  15+15/5  сперва  вычисляется  15/5, т.к.  деление(уровень  3)  предшествует  сложению(уровень  4), а  потому  получается  18. Но  если  написать  (15+15)/5, сперва  вычисляется  выражение  в  скобках(уровень  1)  и  в  итоге  получается  значение  выражения  6.

В выражении  -5+7  сперва  вычисляется  -5, т.к.  минус  выражает  отрицательность(уровень  2), затем  прибавляется  7(уровень  4)  и  получается  2. Если  бы  порядок  действий  был  обратным(т.е.  сложение  перед  отрицательным  знаком), получилось  бы  -12. Чтобы  осуществить  сложение  перед  переменой  знака, надо  написать  это  выражение  в  форме  -(5+7).

Выражение   10 mod 3*4  содержит  две  операции  одного  уровня, которые  исполняются  в  порядке  слева  направо. Значение  выражения  равно  4, т.е. “10 mod  надо  помножить  на  4.

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

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

{7}Для  вывода  результатов  из  компьютера  используют  команду  writeln. Это  есть  указание  компьютеру  написать  на  терминале  или  принтере  значение  переменной, указанной  в  скобках (sachar), а  затем  перейти  на  другую  строчку(экрана, листа).

Завершение  программы

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

Когда  программист  запускает  программу, он  во  время  ее  исполнения  набирает значения  переменных  shaot  и  shiur  и  получает  результат: ^1.800...0+02(мы  воспользовались  символом  ‘^’  для  обозначения  пробела). Пробел  заменяется  знаком  минус, если  число  отрицательное. Всего  для  результата  требуется  17  позиций: 4  под  степень, 10 - для  десятичной  дробной  части, одна - для  точки, одна - для  цифры  слева  от  точки  и  одна - для  пробела  или  знака  минус  по  потребности.

 

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

У  предыдущей  программы  есть  несколько  недостатков:

a).Как  узнать  программисту, когда  компьютер  ожидает  ввода, который  нужно  набрать?

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

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

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

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

 

program maskort2;                                                                               {1}

(*Программа  вычисляет  заработок  работника*)                              {2}   

const                                                                                                      {3}

 matana = 25;      (*Подарок(матана)  на  праздник  песах*)                {4}

var                                                                                                           {5}

 shiur,                   (*Почасовая  оплата  труда*)                                   {6}

 shaot:   real;         (*Число  часов  работы*)                                         {7}

begin                                                                                                       {8}

 writeln('Kakova  oplata  v  chas? Skolko  chasov  on  rabotal?');            {9}

 read(shiur, shaot);                                                                                  {10}

 writeln('Emy  prichitaetsa  shekeley  ‘,                                                    {11}

  shiur*shaot+matana:6:2,'za':6,                                                              {12}

  round(shaot):5,' chasov  raboti.')                                                            {13}

end.                                                                                                         {14}

Прогон  программы.

Вывод  на  экран:                 Kakova  oplata  v  chas? Skolko  chasov  on  rabotal?

Подача  данных:                   18.0   10.6

Вывод.

Emy  prichitaetsa  shekeley  215.80    za  11  chasov  raboti.

Объяснение.

{1}Имя  программы.

{2}Комментарии(Remarks)  не  являются  частью  программы. Их  можно  писать  на  английском  или  иврите(русском), но  всегда  в  помеченных  пределах. Все  символы, которые  находятся  между  скобками  вида  { }  считаются  примечаниями. Компилятор  игнорирует  примечания и  не  пытается  переводить  их  в  команды, они  также  не  выводятся  в  результатах. С  другой  стороны, всякий  раз, когда  программа  копируется, примечания  появляются  на  печати, читателю  поставляется  объяснение  программы, переменных  или  хода  решения  задачи. Если  пара  знаков  {..}  отсутствует  на  клавиатуре, ее  можно  заменить  скобками  со  звездочками  в  таком  виде  (*..*). Любой  символ  может  появиться  внутри  примечания, кроме  символов  }  или  *), чтобы  компилятор  не  посчитал, что  примечание  завершилось, при  просмотре  его  слева  направо. Примечание  не  есть  команда, поэтому  нет  нужды  в  точке  с  запятой  для  его  отделения  от  следующей  команды.

{3}Постоянная. Постоянными  можно  пользоваться  без  их  объявления  заранее. Однако, рекомендуется  использовать  декларацию  const  для  придания  постоянным  имен  по  тем  же  правилам, по  которым  даются  имена  переменным. Если  действовать  так, то  по  этому  имени  предотвращается  получение  любого  другого  значения, кроме  указанного. Этим  декларация  const  отличается  от  декларации  var.

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

a).Когда  постоянной  пользуются  много  раз  в  ходе  программы (и, особенно, когда  она  является  длинным  числом, например, p = 3.1415926536), легче  объявить  ее  один  раз  в  начале  программы  и  тем  самым  избежать  ее  повторных  написаний  и  возможных  ошибок.

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

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

d).Если  есть  опасение, что  смысл  постоянной  не  будет  понят, само  данное  ей  имя  может  помочь  . Например, в  этом  примере  имя  matana (подарок  на  иврите)  разъясняет  причину  добавки  значения  25.

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

const  minimum_hacnasa = 15E1;   maximum_hachnasa = 15E2;    shiur_mas = 0.35;

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

Можно  представить  схематически  эту  декларацию(Рис. 6  const   имя    постоянная).

На  этом  рисунке  представлено  объявление  постоянной, которую  нельзя  изменять  посредством  присвоения. Поэтому-то  и  используется  действительный  знак  равенства  =,  а  не  знак  подстановки  :=(сочетание  двоеточия  и  знака  равенства). Слово  const  присутствует  здесь  один  раз, но  можно  объявлять  отдельные  постоянные, разделенные  точками  с  запятой.  Постоянная  иногда  используется  для  объявления  переменной, поэтому  декларация  const  должна  предшествовать  декларации  var.

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

Ниже  даны  ряд  примеров  typed  constant. Так  они  называются, потому  что  вместе  с  типом(type)  записываются  и  начальные  значения.

const

   maximum       :  integer = 999;

   achuz             :  real = 0.15;      {ахуз - процент}

   gvul_tachton  :  integer = -25;   {гвуль_тахтон - нижний  предел}

{5} - {7} - объявление  переменных. Декларация  var  занимает  три  строчки. Нет  ограничений  на  длину  команды(декларации)  в  строчках, кроме  требований, которые  запрещают  делить  имя  переменной, резервированное  слово  или  постояную  между  строчками.

{9} - команда  записи. Цель  этой  команды - известить  на  терминале, что  ожидается  ввод  переменных, упомянутых  в команде  {10}: shiur  и  shaot.

В  Паскале  есть  две  команды  записи:  write  и  writeln.  Обе  они  указывают  на  запись  на  терминал  или  печать  на  принтере. В  этих  командах  записывают  текст, который  представляет  собой  строку(string)  символов  между  апострофами(‘abc’). Строка  будет  напечатана  как  часть  результатов(работы программы),  и  этим  она  отлична  от  примечания, которое  не  входит  в  печать  результатов.  Такая строка  не  может  содержать  апострофов, ведь  тогда  компилятор  посчитает, что  мы завершили  строку. Поэтому, когда  хотят  вставить  аапостроф  в  строку, надо  написать  два  апострофа  подряд. На  выводе  появится  один  апостроф. Например: writelnThis^’’^is  geresh’); (geresh - апостроф).

Общая  форма  команд  write  или  writeln  такова:

(Рис. 7  Арифметическое  выражение  или  строка)

Команды  write  или  writeln  передают  необходимые  для  печати  значения  в  тот  участок  компьютерной  памяти, который  называется  буфером(Buffer)  и  предназначен  для  формирования  строчек  вывода. Каждое  поле  или  данное, которое  передается  в  буфер, занимает  в  нем  определенное  число  позиций(символов). Заполнение  буфера  начинается  слева(нижний  адрес)  и  продолжается  направо(верхний  адрес).

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

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

Имеется  различие  между  командами   write  и  writeln. В  команде  writeln  после  занесения  последнего  ее  данного  в  буфер  данные  передаются  на  устройство  вывода   даже, если буфер  не  заполнен. Команда  write  не  обязана  освобождать  буфер, если  он  не  заполнен. Буфер  распечатывается  только, если  последнее  данное, введенное  в  него  командой  write, заполняет  его. В  действительности  на  терминале  вывод  появляется  немедленно  за  использованием  команды  write, но  курсор(Cursor)  не переместится  к  следующей  строчке  так, как  это  происходит  по  команде  writeln, он  остается  на  своем  месте. Следующая  команда  write  будет  писать  в  той  же  строке  сразу  за  символами, которые  теперь  были  выданы.  В  предыдущем  примере  мы  воспользовались  командой   writeln, т.к.  хотели, чтобы  курсор  перешел  на  следующую  строчку  после  вывода  вопросов. Того  же  результата, что  и  по  команде  в  строке  {9},  можно  достичь  еще  двумя  путями:

a).  write('Kakova  oplata  v  chas? ‘);

      wrieln(‘Skolko  chasov  on  rabotal?');

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

b).         write('Kakova  oplata  v  chas? Skolko  chasov  on  rabotal?');

              writeln;

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

{10}Команда  чтения. На  языке  Паскаль  можно  использовать  две  различных  команды  чтения:  read  и  readln.  Общая  форма  команд  read  и  readln(Рис. 8   имя  переменной).

Чтение  с  внешнего  устройства  осуществляется  в  буферную  память. Команда  read   указывет(Pointer)  продвинуться  в  буфере  до  того  числа, которое  в  нашем  примере  будет  введено  как  значение  переменной  shiur. Указатель  продолжает  искать  данное  для  переменной  shaot. Если  бы  чтение  было  инициировано  дополнительной  командой  read, поиск  начался  бы  немедленно  после  данного, которое  было  получено  как  значение  shaot.

Команда  readln  отличается  от  команды  read. При  чтении  переменных  командой  readln  буфер  перед  этим  очищается  и  указатель  автоматически  сдвигается  к  началу  буфера, который  теперь  служит  для  ввода  следующей  строки. Команда  read  или  следующая  readln  снова  заполнит  буфер  новыми  данными.  Она  начнет  обрабатывать  новые  данные  от  начала  буфера, а  не  с  того  места, где  был  указатель  по  завершении  предыдущего  чтения. И  эти  данные  будут  переданы  переменным, перечисленным  в  команде.  В  нашем  примере  вместо  команды  read(shiur, shaot);  можно  написать: read(shiur);

                              read(shaot);

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

                              readln(shiur);

                              read(shaot);               

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

К  примеру, предположим, что  ввод  выглядит  так:  1   2   3    (первая  строка  терминала),  4    5   6    (вторая  строка  терминала).   После  выполнения  команд   read(a, b);   read(c, d);    значения  переменных  будут  A = 1;  B = 2;  C = 3; D = 4.   После  выполнения  команд   readln(a, b);   readln(c, d);  значения  переменных  будут  A = 1;  B = 2;  C = 4; D = 5.

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

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

b).Каждое  данное  должно  соответствовать  переменной, которой  оно  присваивается. Т.е.  целое  число  присаивается  переменной, определенной  как  целая, а  вещественное  число - вещественной  переменной. Можно  присвоить  целое  значение  вещественной  переменной, но  оно  будет  присвоено  в виде  числа  с  плавающей  точкой.

c).Хотя  бы один  пробел  должен  разделять  данные  между  собой.

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

{11}Составная  команда  записи. В  этой  команде  сочетаются  вместе  строки  и  арифметические  выражения, разделенные  запятыми. Компьютер  напечатает  все  в  том  порядке, в  котором  они  находятся  в  команде  writeln, начиная  с  левого  элемента. Чтобы  значение  арифметического  выражения  из  строки  {12}  не  напечаталось  вплотную  к  предшествующей  строке, мы  добавили  к  ней  пробел.

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

{12}Арифметическое  выражение  в  команде  write.  Следует  обратить  внимание на  то, что  в  этой  программе  не  определена  переменная под  именем  sachar. Выражение  значения  sachar, использовавшееся  в  предыдущей  программе, здесь  записано  прямо  в команде  writeln. Арифметическое  выражение  shiur*shaot + matana  составлено  из  двух  вещественных  переменных  и  целой  постоянной. Такой  состав  выражения  приводит  к  вещественнуму  результату.

Мы  уже  видели, что  опция  по  умолчанию(Default  Option)  числа  символов  при  печати  вещественного  числа  в  Турбо  Паскале  равно  17. Число  6  после  первого  двоеточия  отмечает, что  мы  выделяем  поле  из  6  символов  для  вывода. В  это  поле  должны  быть  помещены  все  символы, которые  мы  хотим  напечатать, включая  цифры, знаки, точку, букву  Е  и  пустые  позиции. Цифра  2  после  второго  двоеточия  указывает, что  нам  не  нужно  научное(экспоненциальное)  представление, а  необходимо  десятичное  представление  с  двумя  цифрами  после  точки.

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

Опция  по  умолчанию  длины  строчки  есть  число  символов  между  апострофами, но  и  здесь  можно  поменять  длину  добавлением  двоеточия  и  числа. Например, слово  za  занимает  только  2  символа, но  число  6  после  двоеточия  приведет  к  тому, что  появится  4  пробела  слева  от  слова. В  любом  случае, когда  выделяется  больше  позиций, чем  нужно  строке, излишек  появляется  в  виде  пробелов  слева. 

{13}Функция  в  команде. shaot  есть  вещественная переменная. Ее  мы  хотим  преобразовать  к  целому  виду, т.е.  к  виду  без  десятичной  точки. Это  делают  с  помощью  функции(Function), которая  назывется  round. Функцию  можно  рассматривать  как  маленькую  программу, которая  принимает  ввод  и  обеспечивает  вывод. Ввод  называется  аргументом(Argument), он  записывается  в  скобках, следующих  за  именем  программы.

Функция  round(x)  принимает  в  качестве  аргумента  x  только  вещественное  число, например, 7.69. Результат  всегда  есть  наиболее  близкое  к  заданному  целое  число, в  примере  это  8. Если  дробная часть  равна  0.5, то  округление  всегда  идет  в  сторону  увеличения. Например, round(8.5)  равно  9. Еще  о  функциях  см. в  следующем  параграфе  и  в  главах  8  и  9.

Выбор  по  умолчанию  числа  позиций  для  целого  числа  во  время  его  появления  на  терминале  или  во  время  печати  есть  длина  результата. Эту  опцию  можно  изменить  с  помощью  добавления  двоеточия  и  затем  числа(позиций). Так  делается  в  командах    write  или  writeln, если  можно  оценить  значения переменной  или  постоянной. В  примере  мы  написали  round(shaot):5  для  выделения  5  позиций  под  целый  результат  функции  round.  Поскольку  число  часов  не  потребует  больше  двух  позиций, мы  написали  5, чтобы  слева  от  числа  было  не  меньше  3-х  пробелов - для  отделения  его  от  предшествующего  ему  слова  ‘za’.  Стоит  отметить, что  если  количество  выделенных  позиций  меньше  фактического  количества  цифр  в  числе, указание  о  размерах  поля  игнорируется  и  число  выдается  полностью.

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

a).Между  второй  и  третьей  строками  вставить  команду   uses  printer; .

b).В  строчках  9  и  11  вместо  общей  формы  writeln(строка  вывода);  следует  написать writeln(lst, строка  вывода); , где  lst (list - список) относится  к  принтеру.

 

1.4.Функции

Функция(Function)  есть   программа, которая  обычно  исполняет  одно  ограниченное  задание. Например, существуют  функции, включенные  в  компилятор, вроде  возведения  числа  во  вторую  степень, вычисления  синуса, квадратного  корня, экспоненты, логарифма  и  т.д. Функция  на  входе  получает  данные  и  обеспечивает  на  выходе  только  одно  значение  с  именем  функции. Ввод  функции  называется  аргументом (Argument), его  записывают  в  скобках  после  имени  функции. Фунция  round(x), например, получает  вещественный  аргумент, а  возвращает  целый  результат. Похожа  на  нее  функция  trunc(x), которая  обрезает  дробную  часть  аргумента  и  таком  образом  превращает  число  в  целое. Например, trunc(7.69)  равняется  7.

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

синус  от  х(в  радианах) - sin(x);

косинус  от  х(в  радианах) - cos(x);

арктангенс  в  радианах  от  х - arctan(x);

натуральный  логарифм  от  х - ln(x);

корень  квадратный  из  х - sqrt(x);

e  в  степени  х - exp(x).

Примечание. 1  радиан = 57.2957795 градусов  » 57.3 градуса.

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

абсолютное  значение  х - abs(x);

х  в  квадрате(т.е. х*х) - sqr(x);

Возведение  в  степень. Компилятор  Паскаля  не позволяет  возводить  Х  в  степень  У (ХУ). Если  У  равен  2-м, можно  воспользоваться  функцией  компилятора  sqr(x). Используя  функции, мы  можем  осуществить  операцию  возведения  в  степень  по  следующей  формуле: дано: Z = XY, поэтому  ln(Z) = Y×ln(X), отсюда  Z = eY×l n(X).

Согласно  этой  формулы  напишем  программу  X_BECHEZKAT_Y(Х в степени У) возведения  числа  в  степень.

program x_bechezkat_y;                                                                                      {1}

(*В  программе  X  возводится  в  степень Y, результат  печатается  из Z*)   {2,3}

var                                      {4}

 x, y, z :  real;                       {5}

begin                                   {6}

 writeln('Vvedi znachenie chisla X(>0) i stepeni Y');            {7}

 readln(x, y);                                                                        {8}

 z := exp(y*ln(x));                                                                 {9}

 writeln('Znachenie ',x:6:2,' v stepeni ',y:6:2,' ravno ',z:6:2)  {10}

end.                                    {11}

Печать  прогона  программы:

Vvedi znachenie chisla X(>0) i stepeni Y'

3.2   4.5     (ввод)

Znachenie^^^3.20^v^stepeni^^^4.50^ravno^187.57   (вывод)

Объяснение

{1-3}Имя  программы.

{4,5}Определение  переменных, описанных  выше.

{7,8}Чтение  данных.

{9}После  чтения  данных  в  строке  {8}  можно  перейти  к  вычислению  Х  в  степени  У. exp  это  функция, которая  возводит  e  в  степень  ее  аргумента. ln - функция, которая  находит  натуральный  логарифм  своего  аргумента. Значение  аргумента  функции  exp  есть  y*ln(x), поэтому   Z  равно  eY×l n(X).

{10}Вывод. Иногда  во  время  вывода  стоит  напомнить  данные  ввода, чтобы  человек, не  поставлявший  данные, но  получивший  результаты, мог  их  понять  и  извлечь  из  них  пользу. Для  дробной  части  Z  выделено  только  две  позиции, но  т.о.  будут  напечатаны  все  значимые  дробные  цифры, если  они  есть.

Функции  sqr(x)  и  sqrt(x). В  большинстве  случаев  не  используется  степени  больше  2-х  или  3-х  и  меньше  1/2(т.е. корень  квадратный).  Поэтому  мы  можем  пользоваться  определенными  в  системе  функциями  sqr  для  возведения  в  квадрат  и  sqrt - для  извлечения  квадратного  корня. Рассмотрим  следующий  пример  по  имени  merchak(расстояние).

program merchak;                                                                                              {1}

(* Программа  вводит  целые  координаты  двух  точек  на  плоскости *)      {2}

(* - X1,Y1 и  X2,Y2, вычисляет  и  выводит  расстояние  между  ними *)       {3,4}

var                      {5}

 x1, y1,                {6} (*координаты  начальной  точки *)

 x2, y2                 {7} (*координаты  конечной  точки *)

           : integer;  {8}

 merch  : real;     {9}

begin               {10}

 writeln('Vvedi nachalnuu tochku X1,Y1 i konechnuu X2,Y2');         {11}

 read(x1, y1, x2, y2);                                                                        {12}

 merch := sqrt(sqr(x2-x1) + sqr(y2-y1));                                          {13}

 write('Rasstoanie mejdu tochkami (',x1:2,',',y1:2,')',' i (');                {14}

 writeln(x2:2,',',y2:2,')',' ravno ',merch:7:2);                                      {15,16}

end.                                                                                                 {17}

Пример  прогона  программы:

Vvedi nachalnuu tochku X1,Y1 i konechnuu X2,Y2

4   3    7   10                                                            (ввод)

Rasstoanie^mejdu^tochkami (^4,^3)^i^(^7,10)^ravno^^^7.62

Объяснение

{1-4}Имя  программы  и  ее  описание.

{5-9}Определение  переменных  с  сопровождающим  объяснением.

{11,12}Чтение  данных.

{13}Вычисление  расстояния  с  помощью  известной  формулы:

merch = Ö((X2 - X1)2+(Y2 - Y1)2).

{14-16}Вывод. В  строке  {14}  мы  хотим, чтобы  было  напечатано  “(^4,^3). Чтобы  так  получилось, надо  отдельно  слева  направо  напечатать  5  элементов: 

·символ  ‘(‘ ;     ·Х1, значение  которого  4 ;     ·символ  ‘,‘ ;   ·У1, значение  которого  4;    

·символ  ‘)‘   и  текст  справа  от  него .

Для  Х1  и  У1  установили  ширину  поля  по   2  символа  вместо  стандартной(?)  ширины  в  10  позиций  для  каждого, чтобы  получить  более  ясную  редакцию  вывода.

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

 

1.5.Примеры  программ

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

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

program hafoch_mispar;                                                                                    {1}

(* Программа  меняет  порядок  цифр  в веденном  числе  на  обратный *) {2}

var                                                                                        {3}

 mispar, yechidot, asarot, meot : integer;                              {4}

begin                                                                                    {5}

 writeln('Naberi trehznachynoe celoe chislo');                       {6}

 readln(mispar);                                                                     {7}

 yechidot := mispar mod 10;                                                 {8}

 asarot := (mispar mod 100) div 10;                                     {9}

 meot := mispar div 100;                                                       {10}

 write('Chislo ',mispar:1,' s ciframi v obratnom poradke: ');     {11}

 writeln(yechidot:1, asarot:1, meot:1)                                      {12}

end.                                                                                        {13}

Если  прогнать  программу, получим:

Naberi trehznachynoe celoe chislo

532                   

Chislo^532^s ciframi v obratnom poradke:

235

Объяснение

{1,2}Имя  программы.

{3,4}Определение  переменных, используемых  в  программе.

{5}Начало  исполнимой  части  программы.

{6,7}Чтение  числа, в  котором  нужно  поменять  порядок  цифр  на  обратный.

{8}Операция  mod  поставляет  цифру  единиц  как  остаток  от  деления  числа  на  10.

{9}В  остатке  от  деления  на  100  получаются  двузначное  число - цифра  десятков  и  цифра  единиц. Чтобы найти  только  цифру  десятков, делим  на  10  и  не  занимаемся остатком.

{10}Делением  на  100  без  сохранения  остатка получаем  цифру  сотен.

{11,12}Выделяем  поле  в  одну  позицию  для  mispar, но  знаем, что  число  требует  больше  позиций. Если  назначить  поле  в  одну  позицию, то  число  займет  только  одну  позицию, если  оно  однозначное. Число  будет  выведено  полностью, если  оно  состоит  из  большего  числа  цифр, как  в  нашем  примере. Таким  образом  мы  гарантированы  от  создания  лишних  пробелов  при  печати  mispar  и  если  потребуется  больше  одной  позиции.  Все  цифры - yechidot, asarot, meot - займут  по  одной  только  позиции, поэтому  им  назначается  ширина  1, чтобы  они  были  напечатаны  слитно  как  единое  число  из  3-х  цифр.

{13}Конец  исполнимого  раздела  программы.

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

program zman_sicha;                                                                                             {1}

(*Программа  читает  время  начала  разговора  в  часах(0-23),*)                      {2}

(*минутах  и  секундах. Продолжительность  разговора  дается  в  секундах.*) {3}

(*Вывод  программы - время  завершения  разговора.*)                                      {4}

var                                                                {5}

 shaai, dakai, shniyai,                                    {6} (*Время  начала  разговора*)

 shaa,  daka,  shniya,                                    {7} (*Вычисляемое  время  конца  разговора*)

 orech_hasicha  :  integer;                             {8} (*Длина  разговора  в  секундах*)

begin                                                                                             {9}

 writeln('Naberi chas, minutu i sekundu nachala razgovora');         {10}

 readln(shaai, dakai, shniyai);                                                         {11}

 writeln('Vvedi prodoljitelnost razgovora v sekundah');                    {12}

 readln(orech_hasicha);                                                                  {13}

 (*Вычисление  времени  завершения  разговора*)                   {14}

 shniya := shniyai + orech_hasicha;                                                {15}

 daka := dakai + shniya div 60;                                                       {16}

 shniya := shniya mod 60;                                                              {17}

 shaa := shaai +  daka div 60;                                                        {18}

 daka := daka mod 60;                                                                   {19}

 shaa := shaa mod 24;                                                                   {20}

 writeln('Dlina razgovora ',orech_hasicha:1,' sekund');                   {21}

 writeln;                                                                                           {22}

 writeln('Nachalo razgovora v ',shaai:2,'/',dakai:2,'/',shniyai:2);        {23,24}

 writeln;                                                                                            {25}

 writeln('Konez razgovora v ',shaa:2,'/',daka:2,'/',shniya:2);              {26,27}

end.                                                                                                 {28}

Пример  прогона  программы.

Naberi chas, minutu i sekundu nachala razgovora          (Ввод)

23  56  35

Vvedi prodoljitelnost razgovora v sekundah

3421

Dlina razgovora 3421 sekund                                          (Вывод)

 

Nachalo razgovora v 23/56/35

 

Konez razgovora v ^0/53/36

Объяснение

{1-4}Имя  программы.

{6}Переменные  ввода.

{7}Переменные  вывода.

{8}Продолжительность  разговора - переменная  ввода.

{10-13}Ввод  данных.

{14-20}Вычисление  времени  завершения  разговора. Прибавляем  его  длину  в  секундах  к  числу  секунд  времени  начала  разговора {15}. Сумма  может  превысить  60  секунд. Поэтому  в  {16}  делим  число  секунд  на  60, чтобы  увидеть, сколько  в  них  содержится  минут. Это  число  минут  прибавляется  к  числу  минут, которое  было  вначале. После  извлечения  в  строке  {16}  кратного  60  числа  используют  операцию   mod  в  строке  {17},  чтобы  поместить  число  секунд  в  интервал  0..59. Затем  в  строке  {18}  число  минут  делится  на  60, а  результат  прибавляется  к  часу  начала  разговора. После  этого  в  строке  {19}  можно  посмотреть, сколько  точно  минут  осталось(т.е.  нужно  число  меньше  60). И  возникает  другая  проблема: может  общее  число  часов  равно  или  превысило  24 - столько  часов  в  сутках. Эта  проблема  разрешается  в  строке  {20}.

{21-27}Вывод. Подготовка  вывода  немного  сложная, т.к.  дополнительно  к  собщению  о  времени  начала  разговора  или  его  конца  мы  хотим, чтобы  оно  было  выдано  в  форме  ЧЧ/ММ/СС(часы/минуты/секунды). Поэтому  в  {23}  и  {27}  вывод  состоит  из  пяти  компонент:

a).Печать  shaai (ввод)  или  shaa(вывод), где  полю  выделяется  только  2  позиции.

b).Печать  символа  ‘\’.

c).Печать  dakai   или  daka, где  полю  выделяется  только  2  позиции.

d).Печать  символа  ‘\’.

e).Печать  shniyai  или  shniya, где  полю  выделяется  только  2  позиции.

 

1.6.Структура  программы - резюме

Согласно  изложенному  программа  на  Паскале  состоит  из  трех  частей:

a).Заголовок  программы(Program  Heading) - имя  программы.

b).Раздел  деклараций(Declaration  Section) - описание  данных, которые  обрабатываются  в  третьей  части.

c).Исполнимая  часть  или  команды (Statement  Section), которая  содержит  все  исполняемые  в  программе  команды.

Части  b’  и  c’  вместе  называются  блоком (Block). Отсюда  следует, что  любая  программа  Паскаля  состоит  из  заголовка  и  блока. Эти  части  описываются  на  следющей  схеме  программы.

Первая  часть

 

Вторая  часть

 

 

 

 

 

 

Третья  часть

program  имя;  {Заголовок  программы}

 

const                 {Раздел  деклараций, может  быть  пустым}

         декларация

         ...................;

var                      {Продолжение  деклараций}

         декларация

         ...................;

 

begin

         команда;    {Раздел  команд, он  не  может  быть  пустым}

         команда;

         ..............;

         ..............     {Точка  с  запятой  не  обязательна}

end.

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

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

На  схеме  программы  слова  program, const, var, begin  и  end  выровнены  одно  под  другим  по  левому  краю. Содержимое  каждой  части  сдвинуто  вправо.  Некоторые  считают  необходимым  писать  содержимое  деклараций  const  и  var  в  отдельных  строках  от  имени декларации. Это  рекомендуется, когда  содержимое  декларации  нуждается  более  чем  в  одной  строке. И  еще  принято  для  читабельности  программы, удобства  при  исправлении  и  сопровождении  определять  любую  постоянную  в  декларации  const. Единственные  постоянные, которые  появляются  в  программе  без  объявления,  это  числа  0  и  1. Русские  слова  на  остове  программы  будут  заменены  на  соответствующие  объявления  и  команды.

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

*absolute

and

array

begin

case

const

div

do

downto

else

end

*external

file

for

function

goto

if

in

*implementation

*inline

*interface

*interrupt

label

mod

nil

not

of

or

packed

procedure

program

record

repeat

set

*shl

*shr

*string

then

to

type

*unit

until

*uses

var

while

with

*xdr

 

 

1.7.Редактирование  в  языке  Турбо  Паскаль

Во  время  набора  программы  Паскаля  нам  надлежить  перемещать  с  места  на  место  курсор, а  также  перемещать, копировать, стирать  строки  ее  кода. Редактор(editor)  Турбо  Паскаля  позволяет  нам  выполнять  такие  действия:

1.Перемещение  курсора  (Символом  ^  обозначим  здесь  нажатие  на  клавишу   Ctrl).

a).Стрелки: перемещаем курсор  в начало  следующего/предыдущего  слова  в  направлении  стрелки, если  нажимаем  на  Ctrl  вместе  со  стрелкой(обозначается  ^®  или  ^¬), соответственно.

b).PgUp, PgDn: перемещаем  курсор  на  страницу  вперед  или  назад, соответственно.

c).^PgUp, ^PgDn: перемещаем  курсор  в  начало  или  конец  файла, соответственно. Вместо  ^PgUp  можно  также  нажать  ^QR, а  вместо  ^PgDnP  - нажать  ^QC.

c).^QS, ^QD: перемещаем  курсор  в  начало  или  конец  строки, соответственно.

2.Добавление  и  стирание  символов  и  строк

a).Del: стирание  символа  под  курсором.

b).Backspace: стирание  символа  перед  курсором.

c).^QY: стирание  символов  от  курсора  до  конца  строки.

d).^Y:  стирание  всей  строки.

e).^N: добавление  пустой  строки.

f).Ins: Существует  возможность  при  наборе  новых  символов  стирать  те, которые  были  прежде. А  можно  добавлять  набираемые  символы  и  при  этом  не  стирать  старые,  а  сдвигать  текст  вправо. Переходят  от  одной  возможности  к  другой,  нажимая  Ins.

3.Выделение  блоков  в тексте

Такие  операции  нужны, чтобы  перенести, скопировать  или  стереть  целый  блок.

a).^KB: отмечание  начала блока.

b).^KK: омечание  конца  блока.

4.Действия  с  блоками  после  их  выделения

a).Копирование  блока: перенеси  курсор  в  то  место, с  которого  нужно  добавить  блок,  и  набери  ^KC.

b).Перенесение  блока: перенеси  курсор  в  то  место, на  которое  нужно  перенести  блок,  и  набери  ^KV.

c).Стирание  блока: ^KY.

d).Копирование  блока  во  внешний  файл: набери  ^KW. В  появившемся  окне  напиши  имя  файла, который  должен  содержать  выделенный  блок.

e).Перенесение  внешнего  файла  в  определенное  место  действующей  программы: перенеси  курсор  в  то  место  , с  которого  мы  хотим  добавить  содержимое  внешнего  файла, и  нажми  ^KR.  Заполни  появившееся окно  именем  этого  внешнего  файла.

f).Отмена  блока: если  хотят  отменить  выделение  блока, нажимают  ^KH  и  выделение  отменяется. Если  хотят  вернуть  определение  того  же  блока, снова  нажимают  ^KH.

5.Нахождение  строк  и  их  замена

a).Нахождение  строки

^QF: появляется  слово  FIND, после  которого  следует  написать  разыскиваемую  строку(до  30  символов). После  нажатия  на  Enter  появляется  слово  OPTIONS(опции). Возможны  опции: 1).B: поиск  в  обратном  направлении;  2).U: без  различения  больших  и  маленьких  английских  букв;  3).W: поиск  строки, представляющей  собой  полное  слово, но  не  часть  какого-либо  слова.  Можно  выбирать  более  одной  опции. Например, можно  набрать  UW с  исполнением  обеих  опций.

Если  хотят  продолжить  поиск  после  нахождения  одной  строки, можно  нажать  на    ??^L. Курсор  переходит  на  следующий  за  последним  символ  найденной  строки, если  она появится  в  тексте. Иначе  курсор  останется  на  месте.

b).Замена  строки

^QA: появляется  слово  FIND, после  которого  следует  написать  разыскиваемую  строку. Затем  появятся  слова  Replace  With, после  которых  надо  написать  струку, заменяющую  разыскиваемую. Кроме  опций,  действующих  при  поисках  строки, существуют  дополнительные: 1).G: замени  все  появления  строки  в  файле. Вместо  G  можно  написать  число  строк, которое  мы  хотим  поменять;  2).N: просьба  не  вопрошать  перед  каждой  заменой  действительно  ли  мы  этого  хотим. И  в  режиме  замены  процесс  можно  продолжить  с  помощью  нажатия  ^L.

 

1.8.Упражнения

1.8.1.Вопросы

(1)Далее  даны  шаги  вычисления  диагонали  и  периметра  прямоугольника  длиной  А  и  шириной  В. На  их  основе  подготовь  соответствующую  блок-схему.

(a)Старт.

(b)Чтение  A  и  B.

(c)Вычисление  C,  равного  корню  квадратному  из  суммы  квадратов  А  и  B.

(d) D = 2A + 2B.

(a) Напечатай  C.

(a) Напечатай  D.

(a) Останов.

(2)Какие  из  имен, указанных  ниже, - незаконны?  Объясни  почему.

(a)$dollar;  (b)verylongidentifier;  (c)top1;  (d)100achuz;   (e)alphabetic;   (f)x-ray;   (g)input.

(3)Напиши  декларации  переменных, указанных  ниже. Уточни  типы  переменных(целые  или  вещественные): partno - номер  предмета  в  каталоге;   price - цена  предмета;   vat - процент  налога  на  добавленную  стоимость;  profit - прибыль  до  налога  на  него.

(4)Оцени  относительно  данных  ниже  чисел  одну  из  трех  возможностей : ·целое;  ·вещественное;   ·представление  незаконно(с  объяснением).

a).132;  b).4.587;  c).6.3;  d).0.8376;   e).4000;   f).2E6;   g).132.0; h).0.0099;  i).28937265;  j).0;  k).10E-2;   l).0.03E4;   m).1.7E999;   n)132.;   o).3.13749.

(5)Дана  декларация  следующих  переменных:

var     a, b, c: integer;

           x, y, z: real;

Какие  из  следующих  команд - ошибочны:

(a)c := b div b;      (b)b := a mod c;    (c)x := b/a;    (d)z := x div c;   (e)y := c mod a;

(f)b := x + y;          (g)a := a + 1;          (h)a := z;       (i)z := a + 1;

(6)Воспользуйся  декларацией  const  для объявления  следующих  постоянных; выбери  для  них  подходящие  имена: ·453.59;  ·132;   ·’HI  THERE’ .

1.8.2.Программы

(1)Напиши  программу, которая  вводит  переменную  по  имени  height - рост  человека  в  дюймах, а  выводит  переменную  gova - его  рост  в  см (один  дюйм  равен  2.54  см). Подготовь  также  блок-схему  программы.

(2)Человек хочет  поменять  шекели  на  доллары. За  такую  операцию  полагается  платить комиссионные. Напиши  программу, которая  вводит  следующие  данные: ·shekalim - количество  шекелей, которыми  располагает  человек;  ·achuz - процент  комиссионных, обычно  он  колеблется  между  0.125%  и  0.5%;   ·shaar - действующий  курс, т.е. количество  шекелей, которые  дают  за  один  доллар. Программа  выводит  сумму  долларов, которую  причитаются  за  эти  шекели. Сначала  подготовь  блок-схему.

(3)Измени  программу  maskoret2  так, чтобы  она  отвечала  следующим  требованиям: a).Заработная  плата(кроме  подарка) облагается  подоходным  налогом  5.3%.  b).Результаты  на  экране   имеют  следующую  структуру(символ  ^  обозначает  пробел):

Часы         Часовая                          Всего       Подоходный       К

работы^^^^оплата^^^^^Подарок^^^^денег^^^^^налог^^^^^^^^^^^^оплате

_________________________________________________________

      ХХХ      ХХ.ХХ        ХХХ.ХХ       ХХХХ.ХХ    ХХХХ.ХХ         ХХХХ.ХХ

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

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

(6)Напиши  программу, которая  вводит  длину, ширину  и  высоту  прямоугольного  параллелепипеда(Рис. 9)  в  см. Вычисляет  она  следующие  значения:  ·площадь  боковых  сторон(2×(iii));   ·площадь  верхнего  и  нижнего  оснований(2×(ii)); ·площадь  фасадной  и  тыльной  сторон(2×(i));   ·объем  параллелепипеда.

Если  квадратный  метр  алюминиевой  фольги  стоит  30  шекелей, то  во  что  обойдется  завернуть(заклеить)  коробку  в  фольгу?

(7)Ученик  получил  в  течение  семестра  3  оценки. Напиши  программу, которая  вычисляет  среднее  этих  трех  оценок, отличия  каждой  из  оценок  от  среднего, абсолютное  отклонение(т.е. абсолютное  значение  отклонения) каждой  оценки  от  среднего  и  стандартное(квадратичное)  отклонение  отметок. Стандартное  отклонение (stiyat_hateken)  трех  оценок  Х1, Х2, Х3  определяется  так:

stiyat_hateken = Ö((3×(X12 + X22 + X32) - (X1 + X2 + X3)2)/32)

(8)Напиши  программу, которая  вводит  целое  положительное  число  N(>2)  и  вычисляет  корень, квадрат  и  произведения  на  5  и  10    для  трех  чисел  перед  N, самого  N  и  двух  чисел  после  N.

(9)Дан  радиус  окружности. Напиши  программу, которая  печатает  ее  диаметр, площадь  круга  и  длину  окружности.

(10)Напиши  программу, которая  вводит  температуру F по  Фаренгейту, а  выводит  соответствующую  ей  температуру С  по  Цельсию. Формула  связи: F = 9/5×C + 32.

(11)Напиши  программу  вычисления  корней  квадратного  уравнения  ax2 + bx + c = 0  с  помощью  формулы  x1,2 = (-b ± Ö(b2 - 4×a×c))/(2×a) в  предположении  существования  вещественных  корней, т.е. должно  быть  b2 - 4×a×c > 0.

(12)Напиши  программу  вычисления  площади  треугольника  со  сторонами  a, b, c   с  помощью  формулы: площадь = Ö(p(p-a)(p-b)(p-c)), где  p = (a+b+c)/2. Должно  выполняться  предположение, что  заданные  стороны  действительно  образуют  треугольник.

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

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

(15)Напиши  программу, которая  вводит  вес  человека  в  фунтах  и  печатает  его  в  унциях, килограммах  и  граммах. Для  твоего  сведения  в  одном  фунте  16  унций, фунт  равен  0.45359 кг.

 

Глава  2. Булевы  переменные  и  выражения

2.1.Булевы(логические)  переменные

Иногда  необходимо  оценить  отношения  между  числами  и  действовать  в  соответствии  с  полученным  результатом. Какой  ожидается  ответ  на, например, такой  вопрос:           “А  равняется  В?”.  Возможно  числа  равны, а  может  не  равны. Возможно  также  ответить  верно(true)  или  неверно(false), соответственно. В  Паскале  такие  ответы  содержатся  в  булевых  переменных(Boolean  Variable), которые  принимают  одно  из  двух  указанных  значений  true  или  false. В  компьютере  значение  “верно”  изображается  цифрой  1(один), а  значение  “неверно” - цифрой  0.

Рассмотрим  следующую  программу(hashvaah - сравнение, mispar - число, katan - меньше, shaveh - равно, gadol - больше):

program hashvaah;                                                       {1}

(* Chitaet dva chisla i ustanavlivaet, kakoe bolshe*)       {2}

var                                                                                  {3}

 mispar1, mispar2 : integer;                                            {4}

 katan, shaveh, gadol: boolean;                                       {5}

begin                                                                              {6}

 writeln('Kakie chisla ti hochesh sravnit?');                      {7}

 writeln('Naberi pervoe chislo i vtoroe');                           {8}

 read(mispar1, mispar2);                                                 {9}

 katan := mispar1 < mispar2;                                           {10}

 shaveh := mispar1 = mispar2;                                        {11}

 gadol := mispar1 > mispar2;                                           {12}

 writeln('Sravnivalis  ',mispar1,'i  ':5,mispar2);                  {13}

 writeln('chislo1 < chisla2:  ',katan);                                  {14}

 writeln('chislo1 = chislu2:  ',shaveh);                               {15}

 writeln('chislo1 > chisla2:  ',gadol);                                  {16}

end.                                                                                 {17}

Прогон  этой  программы  даст  следующий  вывод:

Kakie chisla ti hochesh sravnit?

Naberi pervoe chislo i vtoroe

5   10

Sravnivalis^^5^^i^^10

chislo1 < chisla2:^^TRUE

chislo1 = chislu2:^^FALSE

chislo1 > chisla2:^^FALSE

Пояснения

{1}Имя  программы.

{2}Описание  назначения  программы.

{4}Переменные  mispar1  и  mispar2  примут  вводимые  значения  и  будут  сравниваться  друг  с  другом.

{5}Подобно  тому,  как  объявляют  целые  и  вещественные  переменные, в  операторе var  декларируются  и  булевы(логические)  переменные. Термин  boolean  при  описании  таких  переменных  заменяет  термины  integer  или  real.  Имена  булевых  переменных  устанавливаются  согласно  принятым  в  языке  Паскаль  правилам.

Эти  булевы переменные  в  ходе  программы  будут  принимать  значения  true  или  false. Например,  katan  примет  значение  true, только  если  отношение mispar1 < mispar2 “верно”, иначе   его  значение  будет  false, т.е. “неверно”. Булева  переменная  shaveh    примет  значение  true, только  если  mispar1 окажется  равным  mispar2,  а  булева  переменная  gadol   примет  значение  true,  если  mispar1  больше  mispar2.

{7-9}Чтение  чисел, которые  будут  сравниваться.

{10-12}В  стандартном  Паскале  булева  переменная  принимает  значение  только  в  результате  исполнения  команды  присвоения, но  не  в  результате  ввода,  чтения  извне(есть  версии Паскаля, позволяющие  придать  булевой  переменной  значение  с  помощью  операции  ввода). Справа  в  команде  присвоения  записывают:

·условие или условия, которые компьютер проверит и получит  результат  true  или  false; ·слово true  или  false.

Это  значение  будет  занесено  по  адресу  булевой  переменной.

{13}Подготовка  вывода. Мы  написали  'i^^':5 , чтобы  с  обеих  сторон  слова  i  было  по  два  пробела(два  пробела  в  строке  после  i  и  число  5  после  двоеточия  приведут  к  тому, что :  для  всей  строки  будет  выделено  5  позиций, между  апострофами  у  нас  записано  3  символа, слева остается  место  для  двух  пробелов).

{14}Значение  переменной   katan  есть  true  или  false, поэтому  команда  приведет  печати  одного  из  следующих  предложений:    a). chislo1 < chisla2:^^TRUE

                                                                             b).chislo1 < chisla2:^^FALSE

Компилятор  выделяет  5  позиций  для  слова TRUE(слева  один  дополнительный  пробел)  и  для  слова  FALSE. С  помощью  явного  указания  можно  изменить  число  позиций, выделенных  для  этих  слов. Например, если  написать  katan:10, то  слева  будет  добавлено  к  слову  FALSE(длиной  5  символов)пять  пробелов, а  к  слову  TRUE  (длиной  4  символа)шесть  пробелов.

{15-17}Исполнение  подобно  команде  в  строке  {14}.

 

2.2.Булевы  выражения

Компьютер  может  вычислять  значение  простого  условия (Simple Condition), построенного  так:  арифметическое  выражение  отношение  арифметическое  выражение

Возможны  следующие  отношения:

равно 

    =

неравно 

    <>

больше  

      >

больше  или  равно

              >=

меньше 

    <

меньше  или  равно

                <=

Относительно  каждого  условия  можно  сказать, что  оно  либо  выполняется (true), либо  нет (false), а  потому  может  быть  присвоено  булевой  переменной. Условие  должно  быть  таким, чтобы  можно  было  установить  его  верность. Т.е.  сравниваемые  значения  должны  быть  одного  вида. Нельзя  сравнивать  булеву  переменную  со  значением  true  с  вещественной  переменной, значение  которой  равно  7.62. А  вот  две  булевых  переменных  сравнивать  можно. Значение  false  считается  предшествующим (“меньше”)  значению  true (принято  внутреннее  представление  false  битом  0, а  true - битом  1).

Пусть  mispar1  равняется  5, а  mispar2  равняется  10.  Проверка  mispar1 < mispar2  даст  нам  результат  true, который  будет  присвоен  переменной  katan. В  таком  случае  переменным  shaveh  и  gadol  в  командах  {11}  и  {12}  будет  присвоено  значение  false.

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

                        lachatz*(hom-4*pi) <> nefach -lachatz

Две  переменные, постоянные  или  два  арифметических  выражения  можно  сочетать  вместе  посредством  арифметических  операций(+, -, *, /, div, mod)  для  получения  составных  арифметических  выражений. И  так  же  можно  сочетать  вместе  простые  условия  с  помощью  логических  операций  not, or, and  для  получения  составных  условий (Complex  Condition).

Значение, относящееся  к  двум  простым  условиям, соединенным  операцией  and, будет  равняться  true, только  если  оба  эти  условия  дадут  true. А  вот  значение  , относящееся  к  двум  простым  условиям, соединенным  операцией  or, будет  равняться  false, только  если  оба  эти  условия  дадут  false. Операция  or  действует  только  над  одним  условием  и  меняет  его  значение  с  true  на  false  и  наоборот.

Пусть  переменным  А  и  В  присваиваются  значения  двух  различных  условий. Следующая  таблица, которая  называется  таблицей  истинности(Truth  Table),  суммирует  действие  указанных  операций  на  эти  переменные.

A

B

A  AND  B

A  OR B

NOT  A

true

true

false

false

true

false

true

false

true

false

false

false

true

true

true

false

false

false

true

true

К  примеру, пусть  А  равно  5, В  равно  10  и  С  равно  2. Тогда  выражение

(A < 7*C) and (B+7 < A+C) представляет  собой  сложное  условие, у  которого  левое  простое  условие  есть  true(т.к.  А (5) действительно  меньше  7*С(14)), а  второе  простое  условие  B+7 < A+C  есть  false(т.к. В+7 (17)  не  меньше  А+С(7)). Поскольку  левое  условие  выполняется(верно), а  правое - неверно, и  они  соединены  операцией  and, то  значением  составного  условия  будет  false.

Арифметическое  выражение  может  содержать  одно  или  более  постоянных  и  числовых  переменных, соединенных  знаками  арифметических  действий. Аналогично  можно  определить  логическое  выражение (Boolean  Expression)  как  сочетание  одного  или  более  условий, логических  переменных  и  постоянных(т.е. слов  true  и/или  false), связанных  булевыми  операциями. Значением  арифметического  выражения  может  быть  любая  величина  в  области  чисел, поддерживаемых  компьютером. А  вот  значение  булева  выражения  ограничено  только  двумя  величинами: true  и  false. 

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

(1)Выражение  в  скобках.   

(2)-  или  +, когда  они  есть  знаки  отрицательности  или  положительности; not.

(3)mod, div, /, *, and