Конец холивара. Pascal vs C

Кривцов М. А.

Часть первая

Язык программирования Pascal

 

 

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

 

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

Например: PROGRAM PRIMER1 (INPUT, OUTPUT);

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

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

Основным разделом программы является раздел операторов, который состоит из последовательности операторов, заключённых в операторные скобки BEGIN и END (такая конструкция называется составным оператором). Операторы отделяются друг от друга точкой с запятой.

Комментарии к программе пишутся после // – строка после этого знака игнорируется при работе программы. Блок между фигурными скобками {…} – тоже игнорируется.

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

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

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

 

Стандартные типы данных и описание переменных

Значение присваиваемое переменной должно соответствовать её типу указанному в разделе описаний. В Pascal есть четыре стандартных типа величин (помимо тех, что могут быть дополнительно определены в каждой программе – в разделе описания типов данных): INTEGER (целый), REAL (действительный или вещественный), CHAR (литерный), BOOLEAN (логический).

INTEGER – только целые числа.

REAL – любые числа.

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

BOOLEAN – состоит только из двух значений: TRUE – истина и FALSE – ложь. Над ними определены булевские операции: конъюнкция (AND), дизъюнкция (OR), отрицание (NOT).

AND – и

OR – или

NOT – не

Описание переменной имеет вид: VAR <имя> : <тип>;

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

VAR A, B, SUM : REAL;

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

 

Константы

Константы определяются до переменных, например:

CONST PI=3.14159;

VAR R, L : REAL;

 

Процедуры ввода и вывода

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

READ – читать

Например: READ (X);

READLN – читать с новой строки

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

WRITE – писать

WRITELN – писать с переходом на новую строку

Например: WRITELN (‘X=’, X);

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

WRITE (X:8:3);

Где 8 – число позиций, а 3 – число позиций после точки.

 

Арифметические операции

+ – сложение

— – вычитание

* – умножение

/ – деление

DIV – деление нацело

MOD – остаток от деления нацело

 

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

ABS (X) – абсолютная величина X.

ARCTAN (X) – вычисление угла в радианах, тангенс которого равен X.

COS (X) – вычисление косинуса угла в радианах.

EXP (X) – Вычисление e x .

LN (X) – вычисление натурального логарифма от X.

PI – вычисление числа Пи.

RANDOM – вычисление случайного числа в диапазоне от 0 (включительно) до 1.

RANDOM (N) – вычисление случайного целого числа в диапазоне от 0 (включительно) до N.

ROUND (X) – округление X до ближайшего целого.

SIN (X) – вычисление синуса угла, заданного в радианах.

SQR (X) – вычисление квадрата числа X.

SQRT (X) – вычисление корня квадратного из X.

TRUNC (X) – отбрасывает дробную часть числа X.

 

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

Оператор присваивания – :=. Для удобства понимания записи алгоритмов его можно читать, например, так:

X := … – пусть X будет ….

 

2. Программные конструкции

 

2.1. Ветвление (выбор)

 

2.1.1. Альтернатива (условный оператор)

Пример 1.1: Вычисление значений функции Y=1/X.

Если X ≠ 0

то писать (1/X)

иначе писать (‘0 не входит в область определения функции Y=1/X’);

IF X <> 0

THEN WRITE (1/X)

ELSE WRITE (‘0 не входит в область определения функции Y=1/X’);

IF – если.

THEN – то.

ELSE – иначе.

Блок-схема алгоритма вычисления значений этой функции:

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

 

2.1.2. Неполный условный оператор

Пример 1.2: Если X <3, то вывести на печать значение X.

IF X <3 THEN WRITE (X);

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

> – больше

< – меньше

> = – не меньше

<= – не больше

= – равно

<> – не равно

AND – и.

OR – или.

NOT – не.

Пример сложного (составного) условия:

IF (Z> X) OR (X> Y) THEN…

 

2.1.3. Оператор варианта (переключатель)

Переключатель

Пример 1.3.1

Выбрать N из

1: писать (‘N равно единице’);

2: писать (‘N равно двум’);

3, 4: писать (‘N равно трём или четырём’)

Конец;

CASE N OF

1: WRITE (‘N равно единице’);

2: WRITE (‘N равно двум’);

3, 4: WRITE (‘N равно трём или четырём’)

END;

CASE – случай, вариант

OF – из

END – конец

Пример 1.3.2

CASE A> B OF

TRUE: M:=A;

FALSE: M:=B

END;

Такой вариант использования этого оператора соответствует условному оператору.

TRUE – истина

FALSE – ложь

FALSE

 

2.2. Повторение (операторы цикла)

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

 

2.2.1. Цикл типа “пока” (цикл с предусловием)

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

Пока X ≠ Y делать

если X> Y

то X:=X-Y

иначе Y:=Y-X;

Писать (‘НОД=’, X);

WHILE X <> Y DO

IF X> Y

THEN X:=X-Y

ELSE Y:=Y-X;

WRITE (‘НОД=’, X);

WHILE – пока

DO – делать

Цикл с предусловием

 

2.2.2. Цикл типа “до” (цикл с постусловием)

Этот цикл выполняется не менее одного раза

Пример 1.5: Решение предыдущей задачи.

Цикл с постусловием

Повторять

если X> Y

то X:=X-Y

иначе Y:=Y-X

до X=Y;

Писать (‘НОД=’, X);

REPEAT

IF X> Y

THEN X:=X-Y

ELSE Y:=Y-X

UNTIL X=Y;

WRITE (‘НОД=’, X);

REPEAT – повторять

UNTIL – до

 

2.2.3. Цикл с параметром (со счётчиком)

Пример 1.6: Вычислить факториал числа (n!=1×2×3×…×n).

F:=1;

Для K:=1 до N делать

F:=F*K;

Писать (‘n!=’, F);

F :=1;

FOR K:=1 TO N DO

F:=F*K;

WRITELN (‘n!=’, F);

FOR – для

TO – до

DO – делать

Цикл с параметром

Если в этом операторе вместо TO использовать DOWNTO, то при каждой итерации значение параметра K будет уменьшаться на единицу.

 

3. Процедуры и функции (подпрограммы)

 

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

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

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

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

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

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

Структура процедуры или функции имеет только два различия от структуры обычной программы: процедуры и функции начинаются с заголовка PROCEDURE или FUNCTION, а не с заголовка PROGRAM, и заканчиваются не точкой, а точкой с запятой.

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

На этом, в том числе, базируется структурное программирование. По данной методологии любая программа строится без использования оператора безусловного перехода (goto) из трёх базовых управляющих структур: последовательность, ветвление и цикл. Кроме того, используются подпрограммы. Притом, разработка программы ведётся пошагово, методом “сверху вниз”. Методология структурного программирования появилась, как следствие возрастания сложности решаемых на компьютерах задач и усложнения программ.

 

3.1. Функции

Пример 1.7: Функция вычисляющая факториал.

VAR A, Y : INTEGER;

FUNCTION FAKTORIAL (N : INTEGER) : INTEGER;

VAR F, K : INTEGER;

BEGIN

F := 1;

FOR K := 1 TO N DO

F := F * K;

FAKTORIAL := F

END;

BEGIN

WRITELN (‘ВВЕДИТЕ ЦЕЛОЕ ПОЛОЖИТЕЛЬНОЕ ЧИСЛО’);

READLN (A);

Y := FAKTORIAL (A);

WRITELN (‘N!=’, Y);

READLN;

READLN

END.

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

 

3.2. Процедуры

Пример 1.8: Процедура вычисляет корни квадратного уравнения

AX2+BX+C=0

PROGRAM KU (INPUT, OUTPUT);

VAR A, B, C, D, X1, X2 : REAL;

PROCEDURE KVUR (A, B, C: REAL; VAR D, X1, X2: REAL);

BEGIN

D:=SQR (B) -4*A*C;

IF D = 0 THEN X1:= (-B) / (2*A)

ELSE

IF D> 0 THEN

BEGIN

X1:= ((-B) – SQRT (D)) / (2*A);

X2:= ((-B) + SQRT (D)) / (2*A)

END

END;

BEGIN

WRITE (‘Введите A=’);

READLN (A);

WRITE (‘Введите B=’);

READLN (B);

WRITE (‘Введите C=’);

READLN (C);

KVUR (A, B, C, D, X1, X2);

IF D <0 THEN WRITELN (‘Действительных корней нет’)

ELSE

IF D = 0 THEN WRITELN (‘X=’, X1)

ELSE

BEGIN

WRITELN (‘X1=’, X1);

WRITELN (‘X2=’, X2)

END;

READLN;

READLN

END.

Где SQR – квадрат числа, а SQRT – корень квадратный.

 

4. Массивы и индексированные переменные

Массив – это упорядоченный набор переменных одинакового типа. Доступ к элементу массива производится по его номеру (индексу). Массивы удобно использовать для хранения однородной по составу информации, например, элементов таблиц, коэффициентов уравнений, матриц. Частным случаем массива символов является строка (переменная типа STRING).

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

Массивы бывают одномерные (например: VAR A : ARRAY [1..100] OF INTEGER;) и двумерные (например: VAR B : ARRAY [1..10, 1..10] OF INTEGER;). Двумерный массив – это таблица.

ARRAY (массив), OF (из) – ключевые слова.

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

Пример 1.9: Программа генерирует таблицу умножения и оформляет вывод результатов в матрицу 10 на 10 используя двумерный массив.

VAR A : ARRAY [1..9, 1..9] OF INTEGER;

I, K : INTEGER;

BEGIN

FOR I := 1 TO 9 DO

FOR K := 1 TO 9 DO

A [I, K] := I * K;

FOR I := 1 TO 9 DO

BEGIN

FOR K := 1 TO 9 DO

WRITE (I, '*’, K, '=’, A [I, K],’’);

WRITELN

END;

READLN;

READLN

END.

 

5. Заглянем в вычислительную математику

Метод половинного деления

Один из методов численного решения уравнений с одним неизвестным. Пусть имеется уравнение Y (x) =0 с непрерывной на отрезке [а, b] функцией Y (х), принимающей на концах отрезка значения разных знаков и имеющей внутри [а, b] единственный корень X. Для приближенного нахождения X отрезок [а, b] делят пополам и вычисляют значение Y (x1) в средней точке x1= (a+b) /2. Если Y (x1) не равна нулю, то из двух отрезков [а, х1] и [х1,b] для последующего деления пополам выбирается тот, на концах которого значения функции различны по знаку. Возникающая в процессе такого дробления последовательность середин отрезков х1, х2, x3, … сходится к корню X. Вычисление прекращается, когда длинна отрезка становится меньше заданной погрешности вычисления.

Пример 1.10: Найти корень уравнения X2 – 3 = 0.

VAR A, B, E, X, Y, Y1 : REAL;

PROCEDURE FNY;

BEGIN

Y := SQR (X) – 3

END;

BEGIN

WRITELN (‘ВВЕДИТЕ ГРАНИЦЫ ИНТЕРВАЛА И ПОГРЕШНОСТЬ’);

READLN (A, B, E);

X := A;

FNY;

Y1 := Y;

WHILE B – A> = E DO

BEGIN

X := (A + B) /2;

FNY;

IF Y*Y1> = 0

THEN

BEGIN

A := X;

Y1 := Y

END

ELSE B := X

END;

WRITELN (‘X =’, X);

READLN;

READLN

END.

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

 

6. Чего ещё не хватает?

Много чего не хватает, а, особенно, денег. Но, в контексте программирования на Паскале, вас не удивляло – почему Николаус Вирт не ввёл в ряд его стандартных функций, довольно распространённый в вычислениях, кубический корень?

Сейчас мы исправим этот недочёт!

Набирайте в разделе описаний, сразу после описаний переменных, следующую функцию и будет вам счастье!

FUNCTION KUBKOR (X: REAL): REAL;

BEGIN

KUBKOR := EXP (1/3 * LN (X))

END;

Для Си это не актуально, поскольку там есть функция вычисляющая любую степень, в том числе, и дробную. А кубический корень числа – это, по другому, число в степени 1/3.