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


1.1 Основные особенности языка Паскаль

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

  1. Это традиционный язык программирования, продолжающий линию algol-60;
  2. Содержит удобные средства для представления данных и развитую систему типов. Типы переменных фиксируются при описании, что позволяет осуществлять строгий контроль доступа к данным;
  3. Набор операторов языка отражает принципы структурного программирования и позволяет писать компактные и понятные программы;
  4. Синтаксис языка не сложен, программы записываются в свободном формате, что делает их наглядными и удобными для отладки.

Мы будем изучать широко известную реализацию языка Паскаль фирмы Borland для IBM-совместимых компьютеров – систему Турбо-Паскаль (версии 6.0, 7.0).

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

  1. универсальный текстовый многооконный редактор для создания и корректировки текстов;
  2. компилятор – программу, переводящую текст программы в машинные коды;
  3. компоновщик, позволяющий компоновать программу из отдельных частей;
  4. отладчик, служащий для выполнения программы по шагам и устранения ошибок;
  5. систему контекстной информационной помощи.

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

Алфавит языка – совокупность допустимых в языке символов. Состоит из следующих символов:

  1. заглавные и строчные латинские буквы и знак “подчерк”: A…Z, a…z, _
  2. цифры 0…9
  3. 22 специальных символа: +, -, *, /, >, <, (, ), [, ], @, #, $, ….

1.3 Лексическая структура языка

Лексическая структура языка включает следующие элементы:

  1. служебные (зарезервированные, ключевые) слова (52 слова): begin, end, if,while,for… . Это группа слов, смысл которых фиксирован в языке, их нельзя использовать в качестве имен, вводимых программистом,
  2. идентификаторы (имена) - для обозначения переменных, констант, типов… Образуются из букв и цифр, начинаются всегда обязательно с буквы, длина произвольная, но компилятор воспринимает первые 63 символа. Не существует различия между прописными и строчными буквами: Например, index, INDEX, Index – одна переменная.

Пример:

Верная запись: lab1, name_a, g255

Неверная запись:1lab, name a, g*255

  1. в тексте программы допускаются фрагменты пояснительного текста – комментарии, которые располагаются между фигурными скобками или знаками (* *) и компилятором игнорируются.

Пример:

{комментарий}

{ тоже комментарий, но

на двух строках }


1.4 Общая структура программы

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

Итак, рассмотрим структуру программы подробнее.

Заголовок программы Program Pr1;

В Турбо-Паскале заголовок программы необязателен и компилятором (см. п.1.1.) игнорируется; Кроме того, в Турбо-Паскале существует еще один раздел – раздел объявления используемых модулей:

Uses Crt, Graph;

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

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

  1. описание меток Label M1, Met;
  2. - используются для передачи управления внутри программы,

  3. описание констант Const a=2; c=3.5;
  4. константы – элементы программы, значения которых не меняются в процессе ее выполнения.

    В результате приведенного примера описания констант, система отведет две ячейки памяти с именами a и c и занесет в них значения 2 и 3,5 соответственно. При попытке записать в эти ячейки памяти какие-либо значения во время работы программы – система выдаст сообщение об ошибке.

    Константы могут быть целыми, вещественными, символьными и строковыми.

    Пример:

    Const a=5; - целая десятичная.

    b=$F; - целая шестнадцатеричная (~15)

    c=-0.5; d=7.5E-5; - вещественные (Е или е – показатель степени; 7.5Е–5 = 7.5× 10-5 ).

    Обратите внимание: целая часть отделяется от дробной – точкой (а не запятой).

    e=’*’; - символьная.

    f=’Турбо’; - строковая.

    Бывают Типизированные константы – переменные, которым при описании присваивается начальное значение. Могут использоваться как обычные переменные (о типах и переменных см. далее)

    Пример:

    Const max: integer = 92;

    R: real = 2.7;

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

  5. описание типов Type Mas = array [1..10] of integer;
  6. tp = 1..6;

    int = integer;

    Под типом данных понимается множество допустимых значений этих данных и совокупность операций над ними. В языке определены несколько стандартных типов данных: integer, real, char, Boolean,… (о стандартных типах Паскаля см. далее в разделе 2). Кроме того, можно описывать и собственные типы в разделе Type (см. также п.2.7).

  7. описание переменных Var x: real; y,z: integer;
  8. p:Boolean;

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

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

    - в ячейку x можно записывать только вещественные числа из диапазона значений, соответствующего типу Real; {о типах и соответствующих диапазонах см. в разделе 2}

    - в ячейки y,z можно записывать только целые числа из диапазона от -32768 до +32767.

    При попытке записать в эти переменные значение, например, 32768, система выдаст сообщение об ошибке: выход за границы диапазона типа.

    - в ячейку p можно записывать только значения True (истина) или False (ложь).

  9. описание подпрограмм: функций Function F(x: real): real;
    и (или) процедур Procedure Alfa;

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

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

Раздел описания данных может вообще отсутствовать.


Раздел описания действий (еще его называют выполняемая часть программы илитело программы)

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

Пример:

Begin
   Write('*****');
End.

Данная программа содержит только одну команду – оператор вывода на экран. В результате ее работы на экране мы увидим строку из 5-ти звездочек: ***** . Раздел описания данных для этой задачи не требуется.

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

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

1 вариант:

const a=3.5; b=2;
var sum: real;
Begin
   sum:=a+b;        {складывается содержимое ячеек a и b, результат записывается в ячейку sum }
   write(a,' + ',b,' = ',sum);     {на экран выводится: 3.5 + 2 = 5.5}
End.

2 вариант:

var a,b: real;
Begin
 a:=3.5; b:=2;      {в ячейку a заносится число 3.5, в b – число2}
 a:=a+b;           {складывается содержимое ячеек a и b, результат записывается в ячейку sum }
 write(' сумма = ',a);    {на экран выводится: сумма = 5.5}
End.

В 3-м варианте к моменту выполнения команды write в ячейке a содержится уже не слагаемое (3.5), а результат (5.5), поэтому вывод слагаемых как в первых двух вариантах невозможен. Таким образом, если слагаемые еще необходимо далее использовать в программе, то для хранения результата надо выделять отдельную ячейку памяти, как в вариантах1 и 2.

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


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

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

  1. Арифметические функции
  2. y := abs(x);y = |x|

    y := sin(x);y = sin x

    y := cos(x);y = cos x

    y := arctan(x);y = arctg x

    y := exp(x);y = ex

    y := ln(x);y = ln x

    y := sqr(x);y = x2

    y := sqrt(x);y = √x

    y := pi;y = π

    y := frac(x);дробная часть числа frac(3.9)=0.9

    y := int(x);целая часть числа int(3.9)=3.0

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

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

    yx = exp(x*ln(y));

  3. Некоторые другие функции и процедуры
y := round(x); округление вещественного числа до ближайшего целого:
round(4.7)=5; round(3.2)=3; round(2.5)=2
y := trunc(x); целая часть вещественного числа: trunc(4.7)=4
y := odd(x); проверка величины х на нечетность: true, если х нечетный, иначе false Например, odd(3) = True; odd(2) = False;
write(x); вывод значения х на экран
writeln(x); вывод значения х на экран с последующим переводом курсора на новую строку
read(x); ввод значения х с клавиатуры
readln(x); ввод значения х с клавиатуры с последующим переводом строки
clrscr; очистка экрана, перевод курсора в его левый верхний угол Чтобы использовать эту процедуру, надо подключить к программе модуль CRT: uses crt;
delay(msec); задержка экрана, msec – число в микросекундах
Random(n); генератор случайных целых чисел - в каждый момент времени выдает одно случайное целое число из диапазона от 0 до n-1 включительно.
Random; генератор случайных чисел без параметра - генерирует вещественное число из диапазона от 0 до 1.
Randomize; процедура инициализации (первоначальная настройка) генератора случайных чисел. Всегда вызывается до использования random. Если не использовать Randomize, то при каждом новом запуске программы на выполнение, генератор случайных чисел будет выдавать одну и ту же первоначально выданную последовательность случайных чисел.

Пример:

x:=random(10);{случайное целое число из диапазона от 0 до 9}
x:=random(100)-50;{ random(100) - случайное целое число из диапазона от 0 до 99,
                     минимально возможное значение x = 0 – 50 = -50;
                     максимально возможное значение x = 99 – 50 = 49; }
y:=random*10;{ случайное вещественное число из диапазона от 0 до 9}
z:=random*10-10;{ случайное вещественное отрицательное число из диапазона от 0 до 9}

Пример: программа вычисления площади круга S= πr2.

Uses Crt; {подключение модуля Crt - в нем описана процедура Clrscr – очистка экрана}
Var s,r: real; {раздел описания переменных–описаны 2 переменные вещественного типа}
Begin
  Clrscr; { очистка экрана }
  Write('Введите радиус r = '); {выведет на экран текст: Введите радиус r = }
  Readln(r); {приостановит работу программы до ввода какого-либо (одного) числа: надо
             набрать на клавиатуре число и нажать клавишу Enter. После этого введенное число
             автоматически запишется в переменную, указанную в скобках }
  s:=pi*r*r; {вычислит значения выражения и запишет результат в s; pi ≈ 3,14…}
  writeln('Площадь круга S =', s:10:5); {выведет на экран текст из апострофов и значение s}
  delay(10000); {задержит результат на экране в течении 10 секунд, затем вернется к исходному тексту программы}
End.
 

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

dec (x [, N]) - уменьшает содержимое переменной x на значение выражения N (если N не задано, то на 1); тип переменной x и выражения N - INTEGER (точнее, любой целый тип: см.п.2.1);

inc (x [, N]) - увеличивает значение x на N (если N не задано, то на 1).

Например

  a:=6; b:=4; x:=7; y:=0;
  dec(a,3); inc(b,3); dec(x); inc(y);
  write('a=',a,' b=',b,' x=',x,' y=',y);

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

a=3 b=7 x=6 y=1

 

1.6 Процедуры ввода/вывода

  1. Для вывода используются процедуры write и writeln (окончание ln означает перевод курсора на следующую строка после вывода).

Форма записи:write (<список параметров>); - выводит параметры на экран; курсор вывода

остается на этой же строке.

writeln (<список параметров>); - выводит параметры на экран; переводит курсор

вывода на следующую строка после вывода.

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

Переменные: а, в, х1… - выводятся значения переменных;

Строки: ‘a = ’, ‘сумма = ’ - заключаются в апострофы, выводится то, что в апострофах.

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

  1. для целых чисел и строк: х:М, где М – ширина поля вывода (количество позиций, выделяемых под запись числа х)
  2. для вещественных чисел: у:M:N, где N – количество цифр после десятичной точки.

Пример 1:

 S:=2.71828;
 Writeln('_sum=', S:7:3, ' ':3, 'p=', 2+4);

№ позиции экрана:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

На экране:

Пример 2:

I:=’+’;

Writeln(i); На экране увидим: +

Writeln(i); +

Write(i); + +

Writeln(i); +

Write(i);

Замечание: оператор writeln; без параметров переводит курсор на следующую строку.

2. Для вводаданных используются процедуры read и readln.

Форма записи:read(<список параметров>);

readln(<список параметров>);

приостановит работу программы до ввода какого-либо (одного) числа: надо

набрать на клавиатуре число и нажать клавишу Enter. После этого введенное число

автоматически запишется в переменную, указанную в скобках

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

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

 

Значения вводятся так:

1 способ: после каждого введенного значения нажимать клавишу Enter.

2 способ: после каждого введенного значения нажимать клавишу Пробел, а после последнего введенного значения - клавишу Enter.

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

 

Пример: на экране:

Readln(a,b,c);

Read(x);

Замечания:

1. Отличие операторов read(<список параметров>); и readln(<список параметров>); заключается в следующем: после read экранный курсор вывода остается на прежней строке, а после readln – перемещается на следующую строку.

2. Оператор readln; без параметров осуществляет задержку выполнения программы до тех пор, пока не будет нажата какая-либо клавиша. Например, в примере вычисления площади круга (см. п.1.4) можно вместо команды delay(10000); применить readln. Отличие будет в том, что delay(10000); задержит результат на экране в течении 10 секунд, затем вернется к исходному тексту программы, а readln - задержит результат на экране до нажатия пользователем какой-либо клавиши, затем так же вернется к исходному тексту программы.

 

Задачи для самоконтроля

1.1. Какой оператор является ошибочным?

const a =7.5;
      b:rea =4.6;
var c:real;
Begin
  a:=3.4;
  b:=5.2;
  c:=8.5;

1.2. Вычислить значения выражений

а) trunc(6.9); б) round(6.9);

в) trunc(-1.8); г) round(-1.8).

 

1.3. Что увидим на экране после выполнения данного фрагмента программы:

  a:=4;
  write(a);
  writeln; writeln(a);
  write(a);
  writeln(a);
  writeln;
  write(a);

1.4. Определите диапазон возможных значений числа X:

а) X:=random(56);

б) X:=random(25) – 32;

в) X:= 67 - random(43);

г) X:=random(98) – 32;