ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПАСКАЛЬ
ЗНАКОМСТВО С ЯЗЫКОМ ПАСКАЛЬ
Программа на Паскаль состоит из заголовка и тела (блока) , в конце которого следует точка – признак конца программы. В свою очередь, блок содержит разделы описаний и раздел операторов :
Program ;
Label ;
Const ;
Type ;
Var ;
Procedure (Function) ;
Begin ;
End.
ПРИМЕРЫ ПРОГРАММ
Запись программы на языке Паскаль похожа на английский перевод алгоритма, записанного на алгоритмическом языке.
// Первая программа
program HelloWorld;
begin
writeln('Привет, мир!');
end .
Пример программы деления двух обыкновенных дробей:
Алгебраическая форма записи -
Исходными данными здесь являются целочисленные переменные a, b, c, d, результат – целые величины m и n.
алг деление_дробей
Program Division;
цел a, b, c, d, m, n
Var a,b,c,d,m,n: Integer;
Begin ReadLn(a,b,c,d);
нач ввод a, b, c, d
m := a d
m:=a*d;
n := b c
n:=b*c;
WriteLn(m,n)
вывод m, n
кон
End.
Заголовок программы начинается со слова Program (программа) за которым следует произвольное имя, придуманное программистом ( Division – деление).
Раздел описания переменных начинается со слова Var (variables - переменные), за которым следует список переменных.
Тип указывается после двоеточия словом Integer (целый). Начало и конец раздела операторов программы отмечаются словами Begin (начало) и End (конец). В конце программы обязательно ставится точка.
Ввод исходных данных с клавиатуры производится с помощью процедуры ReadLn (read line – считывать строку).
Вывод результатов на экран производится с помощью процедуры WriteLn (write line – писать в строку).
Точка с запятой «;» ставится в конце заголовка программы, в конце раздела описания переменных, после каждого оператора. Перед словом End точку с запятой можно не ставить.
Запятая «,» является разделителем элементов в списке переменных, в разделе описания, списке вводимых и выводимых величин.
ИДЕНТИФИКАЦИЯ ТИПОВ ДАННЫХ
Таблица стандартных функций языка Паскаль
Название и математическое обозначение функции
Абсолютная величина (модуль)
| х |
Указатель функции
Корень квадратный
abs(x)
Натуральный логарифм
sqrt(x)
Ln x
Экспонента (степень числа е ~ 2.718)
Квадрат числа х
e x
Ln(x)
exp(x)
х 2
х в степени y
х у
Частное от деления целого х на целое y
sqr(x)
exp(y*Ln(x))
Остаток от деления целого х на целое y
x div y
Случайное число в диапазоне от 0 до х
x mod y
Синус (угол в радианах)
sin x
Косинус (угол в радианах)
Random (x)
sin(x)
cos x
Округление по правилам
cos(x)
Округление отбрасыванием дроби
Дробная часть числа
Round(x)
Арктангенс (главное значение в радианах)
Trunc(x)
Frac(x)
arctg x
Число Пи
arctg(x)
π
Pi
Начало
Осматриваю устройство
Эта штуковина работает?
Нет
Да
Эта штуковина работает?
Да
Не трогай её!
Ты её трогал?
Нет
Зря ты это сделал!
Кто-нибудь об этом знает?
Да
Нет
Нет
Да
Кто-нибудь рассердился?
Держи это при себе!
Я тебе не завидую…
Забудь об этом!
Ты можешь свалить вину на другого?
Нет
Да
Проблема решена.
Конец
7
Запишите по правилам программирования выражения:
1.
5.
6.
2.
3.
7.
4.
8.
9.
10.
Оператор ветвления на Паскале
В языке Паскаль имеется оператор ветвления . Другое его название - условный оператор .
Формат полного оператора ветвления следующий:
if then else
Здесь if - "если", then - "то", else - "иначе".
Логическое
выражение
Простой формой логического выражения является операция отношения. В Паскале допускаются все виды отношений :
(больше);
(не равно).
+( then )
-( else )
Серия 1
Серия 2
B then Write(‘Число А больше В’) else Write(‘Число A меньше В’) end. Формат неполного оператора ветвления следующий: if then Program primer2; var А, В, С : real; begin readln(А, В); С:=А; if BA then C:=B; write(С) end. Да Нет BA C:=B 10 " width="640"
Пример использования полного ветвления:
Program primer1; var А, В : real; begin readln(А, В); if AB then Write(‘Число А больше В’)
else Write(‘Число A меньше В’) end.
Формат неполного оператора ветвления следующий:
if then
Program primer2; var А, В, С : real; begin readln(А, В); С:=А; if BA then C:=B; write(С) end.
Да
Нет
BA
C:=B
10
B then if AC then D:=A else D:=C else if BC then D:=B else D:=C; writeln(D) end. Перед else точка с запятой не ставится. Вся ветвящаяся часть структуры алгоритма заканчивается на точке с запятой после оператора D:=C. " width="640"
Программирование вложенных ветвлений
Запишем на Паскале программу определения большего из трех чисел:
Program primer3_1; var А, В, С, D: real; begin readln(А, В, С); if AB then if AC then D:=A else D:=C else if BC then D:=B else D:=C; writeln(D) end.
Перед else точка с запятой не ставится. Вся ветвящаяся часть структуры алгоритма заканчивается на точке с запятой после оператора D:=C.
=B) and (A=C) then D:=A; if (B=A) and (B=C) then D:=B; if (C=A) and (C=B) then D:=C; writeln(D) end. Здесь использованы три последовательных неполных ветвления. А условия ветвлений представляют собой сложные логические выражения , включающие логическую операцию and (И). Обратите внимание на то, что отношения, связываемые логическими операциями, заключаются в скобки. Так надо делать всегда! Например, требуется определить, есть ли среди чисел А, В, С хотя бы одно отрицательное. Эту задачу решает следующий оператор ветвления: if (Athen write ('YES ') else write('NO '); Выражение, истинное для отрицательного числа, может быть записано еще и так: not (A = 0) " width="640"
Реализовать на Паскале программу определения большего из трех чисел можно также другим способом, при помощи логических операций:
Program primer3_2; var А,В,С,D: real; begin readln(А,В,С); if (A=B) and (A=C) then D:=A; if (B=A) and (B=C) then D:=B; if (C=A) and (C=B) then D:=C; writeln(D) end.
Здесь использованы три последовательных неполных ветвления. А условия ветвлений представляют собой сложные логические выражения , включающие логическую операцию and (И).
Обратите внимание на то, что отношения, связываемые логическими операциями, заключаются в скобки. Так надо делать всегда! Например, требуется определить, есть ли среди чисел А, В, С хотя бы одно отрицательное. Эту задачу решает следующий оператор ветвления:
if (Athen write ('YES ') else write('NO ');
Выражение, истинное для отрицательного числа, может быть записано еще и так: not (A = 0)
Y then begin С:=X; X:=Y; Y:=C end ; write(X,Y) end. Если на какой-то из ветвей оператора ветвления находится несколько последовательных операторов, то их нужно записывать между служебными словами begin и end . Конструкция такого вида: begin end называется - составным оператором. " width="640"
Пример использования составного оператора :
Составим программу сортировки по возрастанию значений двух переменных: А и В
Program primer4; var X, Y, С : real; begin readln(X, Y) ; if XY then begin С:=X; X:=Y; Y:=C end ; write(X,Y) end.
Если на какой-то из ветвей оператора ветвления находится несколько последовательных операторов, то их нужно записывать между служебными словами begin и end .
Конструкция такого вида: begin end
называется - составным оператором.
Вопросы и задания
1. Как программируется на Паскале полное и неполное ветвление?
2. Что такое составной оператор? В каких случаях составной оператор используется в операторе ветвления?
3. Составьте вариант программы определения наименьшего из трех данных чисел.
4. Составьте программу сортировки по возрастанию значений трех переменных: А, В, С.
5. Составьте программу вычисления корней квадратного уравнения по данным значениям его коэффициентов.
0 then n:=n+1; if b0 then n:=n+1; if c0 then n:=n+1; writeln('Количество положительных чисел: ', n); end . Program If_5; var a, b, c, n, n2: integer; begin write('Введите три целых числа: '); readln(a, b, c); If a0 then n:=n+1; if athen n2:=n2+1; if b0 then n:=n+1; if bthen n2:=n2+1; if c0 then n:=n+1; if cthen n2:=n2+1; writeln('Количество положительных чисел: ', n, ' Количество отрицательных чисел: ',n2 ); end . " width="640"
Program If_4;
var
a, b, c, n: integer;
begin
write('Введите три целых числа: ');
readln(a, b, c);
If a0 then n:=n+1;
if b0 then n:=n+1;
if c0 then n:=n+1;
writeln('Количество положительных чисел: ', n);
end .
Program If_5;
var
a, b, c, n, n2: integer;
begin
write('Введите три целых числа: ');
readln(a, b, c);
If a0 then n:=n+1;
if athen n2:=n2+1;
if b0 then n:=n+1;
if bthen n2:=n2+1;
if c0 then n:=n+1;
if cthen n2:=n2+1;
writeln('Количество положительных чисел: ', n, ' Количество отрицательных чисел: ',n2 );
end .
Циклы в Паскале
В программировании блоки кода, которые требуется повторять не единожды, оборачиваются в специальные конструкции – циклы . У циклов выделяют заголовок и тело. Заголовок определяет, до каких пор или сколько раз тело цикла будет выполняться. В зависимости от результата тело цикла либо повторяется, либо поток выполнения переходит к следующему выражению после всего цикла.
В языке программирования Паскаль существует три вида циклических конструкций:
Цикл For («Для»)
Цикл for называют циклом со счетчиком. И в нём количество повторений может быть вычислено заранее.
В заголовке цикла указываются два значения:
- первое значение присваивается так называемой переменной-счетчику, от этого значения начинается отсчет количества итераций (повторений). Отсчет идет всегда с шагом равным единице;
- второе значение указывает, при каком значении счетчика цикл должен остановиться. Другими словами, количество итераций цикла определяется разностью между вторым и первым значением плюс единица. В Pascal тело цикла не должно содержать выражений, изменяющих счетчик.
Цикл for существует в двух формах:
for счетчик := значение to конечное_значение do
тело_цикла ;
for счетчик := значение downto конечное_значение do
тело_цикла ;
Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to , то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto , то значение параметра будет уменьшаться на единицу.
Количество итераций цикла for известно именно до его выполнения, циклу уже точно известно, сколько раз надо выполниться.
program Zvezda1;
var i, n:Integer;
begin
write('Количество знаков: ');
readln(n);
for i := 1 to n do write ('(*) ')
end .
Цикл While («Пока»)
Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true , то тело цикла выполняется, если false – то нет.
Когда тело цикла было выполнено, то ход программы снова возвращается в заголовок цикла. Условие выполнения тела снова проверяется (находится значение логического выражения). Тело цикла выполнится столько раз, сколько раз логическое выражение вернет true . Поэтому очень важно в теле цикла предусмотреть изменение переменной, фигурирующей в заголовке цикла, таким образом, чтобы когда-нибудь обязательно наступала ситуация false . Иначе произойдет так называемое зацикливание , одна из самых неприятных ошибок в программировании.
program Zvezda2;
var i, n: integer;
begin
write('Количество знаков: ');
readln(n);
i := 1;
while i do begin
write ('(*) ');
i := i + 1
end ;
end .
n; end . В примере, даже если n будет равно 0, одна звездочка все равно будет напечатана. " width="640"
Цикл R epeat («До»)
Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false . Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз, не зависимо оттого, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием.
В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while , здесь всё наоборот: в случае true происходит выход из цикла, в случае false – его повторение.
program Zvezda3;
var i, n: integer;
begin
write('Количество знаков: ');
readln(n);
i := 1;
repeat
write('(*) ');
i := i + 1
until i n;
end .
В примере, даже если n будет равно 0, одна звездочка все равно будет напечатана.
Контрольная работа
- Дано натуральное число, найти количество цифр в записи этого числа.
- Найти сумму квадратов 10 чисел, расположенных подряд по возрастанию.
- Вывести на экран числа от А до В в прямом, а затем в обратном порядке.
- Вычислить произведение чисел от 1 до 5 используя различные варианты цикла в одной программе.
- Найти сумму цифр целого числа N.
'); readln(a); S:=0; WHILE (a0) DO Begin c:= a mod 10; a:= a div 10; S:=S+c; End ; Writeln ('S= ', S); End . 5 " width="640"
1
2
4
Var a, s, c : longint;
Begin
Writeln('Программа находит сумму цифр числа');
Writeln ('Введите число');
Write('a-');
readln(a);
S:=0;
WHILE (a0) DO
Begin
c:= a mod 10;
a:= a div 10;
S:=S+c;
End ;
Writeln ('S= ', S);
End .
5
МАССИВЫ
Одномерный массив — это фиксированное количество элементов одного и того же типа (integer, real или char), объединенных одним именем, где каждый элемент имеет свой номер. Обращение к элементам массива осуществляется с помощью указания имени массива и номеров элементов.
Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу).
// Первый вариант
var
a : array [1..N] of integer ;
// Второй вариант
type
massiv = array[1..N] of integer ;
var
a: massiv;
Между именем типа и именем переменной ставится знак «двоеточие».
Array — служебное слово (в переводе с английского означает «массив», «набор»);
[1..N] — в квадратных скобках указывается номер первого элемента, затем, после двух точек, номер последнего элемента массива;
of — служебное слово (в переводе с английского «из»);
integer — тип элементов массива.
Индексом могут быть не только натуральные числа, можно написать так: [0..10], [-29..45], [‘a’..’z’], [false..true] — то есть подходят любые символы и числа — главное соблюсти следующее условие: левая часть меньше правой . Для того чтобы определить, что меньше — восклицательный знак(‘!’) или точка(‘.’) используем таблицу ASCII и функции Ord() и Chr() ( Ord (L) т.е. (код) буквы «L», по таблице ASCII код буквы «L» - 76 ).
Для того чтобы ввести или вывести значения элементов массива, можно использовать любой цикл.
for i := 1 to N do
read (a[i]); //a[i] - элемент одномерного массива a с индексом (порядковым номером) i .
Ввод массива
Var A : array [1..10] of integer ; I : byte ; {переменная I вводится как индекс массива} Begin For i:=1 to 10 do Readln (a[i]); {ввод i-го элемента производится с клавиатуры}
Случай, когда массив Паскаля заполняется автоматически случайными числами, с использованием функции random( N ):
Var A: array [1..10] of integer ; I : byte ; {переменная I вводится как индекс массива} Begin For i :=1 to 10 do A [ i ]:= random(10) ; {i-му элементу массива присваивается «случайное» целое число в диапазоне от 0 до 10}
Вывод массива
Вывод массива в Паскале осуществляется поэлементно, в цикле, где параметром выступает индекс массива, принимая последовательно все значения от первого до последнего.
Var A: array [1..10] of integer; I : byte ; {переменная I вводится как индекс массива} Begin For i :=1 to 10 do Write ( a [ i ],' '); {вывод массива осуществляется в строку, после каждого элемента печатается пробел}
Вывод можно осуществить и в столбик с указанием соответствующего индекса.
Var A: array [1..10] of integer; I : byte ; {переменная I вводится как индекс массива} Begin For i:=1 to 10 do Writeln ('a[', i,']=', a[i]); {вывод элементов массива в столбик}
Пример решения задачи с использованием массивов Паскаля
Дано целое число N и набор из N целых чисел. Вывести в том же порядке все четные числа из данного набора и количество K таких чисел.
var
a: array [1..1000] of integer ;
k, N, i: integer ;
begin
write ('N = ');
readln (N);
write ('Введите ', N, ' целых чисел: ');
for i := 1 to N do
read (a[i]); {заполняем масссив}
write ('Чётные числа: '); {Начинаем выбирать чётные числа}
for i := 1 to N do begin
if a[i] mod 2 = 0 then begin
Inc(k);
write (a[i], ' ');
end;
end;
writeln ();
writeln ('Количество четных чисел: ', k);
end.