Массив – однородная совокупность элементов
Самой распространенной структурой, реализованной практически во всех языках программирования, является массив.
Массивы состоят из ограниченного числа компонент, причем все компоненты массива имеют один и тот же тип, называемый базовым. Структура массива всегда однородна. Массив может состоять из элементов типа integer , real или char , либо других однотипных элементов. Из этого, правда, не следует делать вывод, что компоненты массива могут иметь только скалярный тип.
Другая особенность массива состоит в том, что к любой его компоненте можно обращаться произвольным образом. Что это значит? Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу).
Индекс массива
Номер элемента массива называется индексом. Индекс – это значение порядкового типа, определенного, как тип индекса данного массива. Очень часто это целочисленный тип ( integer , word или byte ), но может быть и логический и символьный.
Описание массива в Паскале. В языке Паскаль тип массива задается с использованием специального слова array (англ. – массив), и его объявление в программе выглядит следующим образом:
Type < имя _ типа >= array [ I ] of T;
где I – тип индекса массива, T – тип его элементов.
Можно описывать сразу переменные типа массив, т.е. в разделе описания переменных:
Var a,b: array [ I ] of T;
Обычно тип индекса характеризуется некоторым диапазоном значений любого порядкового типа : I 1 .. I n . Например, индексы могут изменяться в диапазоне 1..20 или ‘ a ’..’ n ’.
При этом длину массива Паскаля характеризует выражение:
ord ( I n )- ord ( I 1 )+1.
Вот, например, объявление двух типов: vector в виде массива Паскаля из 10 целых чисел и stroka в виде массива из 256 символов:
Type
Vector=array [1..10] of integer;
Stroka=array [0..255] of char;
С помощью индекса массива можно обращаться к отдельным элементам любого массива, как к обычной переменной: можно получать значение этого элемента, отдельно присваивать ему значение, использовать его в выражениях.
Опишем переменные типа vector и stroka :
Var a: vector;
c: stroka;
далее в программе мы можем обращаться к отдельным элементам массива a или c . Например, a [5]:=23; c [1]:=’ w ’; a [7]:= a [5]*2; writeln ( c [1], c [3]).
Основные действия с массивами Паскаля
Как известно, определение типа данных означает ограничение области допустимых значений, внутреннее представление в ЭВМ, а также набор допустимых операций над данными этого типа. Мы определили тип данных как массив Паскаля. Какие же операции определены над этим типом данных? Единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы однотипны, – это присваивание. Если в программе описаны две переменные одного типа, например,
Var
a , b : array [1..10] of real ;
то можно переменной a присвоить значение переменной b ( a := b ). При этом каждому элементу массива a будет присвоено соответствующее значение из массива b. Все остальные действия над массивами Паскаля производятся поэлементно (это важно!).
Ввод массива Паскаля
Для того чтобы ввести значения элементов массива, необходимо последовательно изменять значение индекса, начиная с первого до последнего, и вводить соответствующий элемент. Для реализации этих действий удобно использовать цикл с заданным числом повторений, т.е. простой арифметический цикл, где параметром цикла будет выступать переменная – индекс массива Паскаля. Значения элементов могут быть введены с клавиатуры или определены с помощью оператора присваивания.
Пример фрагмента программы ввода массива Паскаля
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]); { вывод элементов массива в столбик }
На экране мы увидим, к примеру, следующие значения:
a [1]=2
a [2]=4
a [3]=1 и т.д.
34 Функция, определенная пользователем.
Функция, определенная пользователем, состоит из заголовка и тела функции.
Заголовок содержит зарезервированное слово function, идентификатор (имя) функции, заключенный в круглые скобки, необязательный список формальных параметров и тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе. В целом структура функции, определенной пользователем имеет вид:
function <имя> (Формальные параметры) : <тип результата>;
const ...
type ...
var
begin
<операторы>
end;
В разделе операторов должен находиться, по крайней мере, один оператор, присваивающий имени функции значение. В точку вызова возвращается результат последнего присваивания.
Обращение к функции осуществляется по имени с необязательным указанием списка аргументов. Каждый аргумент должен соответствовать формальным параметрам, указанным в заголовке, и иметь тот же тип.
Пример программы с использованием функции, определенной пользователем
Пусть требуется разработать программу вычисления выражения:
Z=( + )/2* ,
в которой возведение в степень выполняется функцией Step.
program DemoFunc;
Var
М : integer;
А,Z,R : real ;
{Функция вычисления степени. N - степень, X – число, возводимое в данную степень. N, X — формальные параметры; результат, возвращаемый функцией в точку вызова, имеет вещественный тип}
function Step(N : integer; X : real): real;
Var
I : integer;
Y : real;
begin
Y:=1;
for I:=1 to N do{Цикл вычисления N—й степени числа X)
Y:=Y*X;
Step:=Y ; {Присваивание функции результата вычисления степени}
end; {Конец функции}
Begin {Начало основной программы}
Write('Введите значение числа А и показатель степени М');
Readln(A,M) ;
Z:=Step(5,А) ; {Вызов функции с передачей ей фактических параметров N=5, X=А}
Z:=Z+ Step(3,l/A); {Вызов функции с передачей ей фактических параметров N=3, X=1/А}
if M=0 then R:=l {если число возводится в нулевую степень, то результат всегда равен 1}
else if M>0 then R:=Step(M,A){Вызов функции Step с передачей ей фактических параметров М, А}
else R:=Step(-M,A); {Вызов функции с передачей ей фактических параметров: - М, отрицательная степень}
Z:=Z/(2*R) ;
Writeln(' Для А= ',А,'М= ',М,' Значение выражения= ',Z);
end.
В начале программы описываются переменная целого типа М и переменные вещественного типа А, Z, R, после этого описывается функция вычисления степени числа Step с формальными параметрами N и X, результат, возвращаемый функцией в точку вызова, - вещественного типа.
В описании функции вводятся две локальных (местных) переменных I и Y. Переменная I служит для подсчета числа повторений цикла, а в Y накапливается значение степени как произведения N одинаковых сомножителей. В заключение функции присваивается значение вычисленного произведения.
В начале выполнения основной программы на экран выводится запрос "Введите значение числа А и показатель степени М" и считывается с клавиатуры значение вещественного числа А и целого числа М.
Затем выполняется оператор:
Z:=Step(5,A);
Осуществляется вызов функции Step с передачей ей фактических параметров 5, А. Их значения присваиваются формальным параметрам функции N и X. По окончании вычисления степени числа значение функции Step, вычисленное для фактических параметров 5 и А, присваивается переменной Z. Аналогично в операторе:
Z := Z + Step(3,l/A);
сначала осуществляется вызов функции Step с передачей ей фактических параметров 3, 1/A, после чего значение переменной Z увеличивается на величину возвращенного в основную программу результата вычисления функции Step.
Операторы:
if M=0 then R:=1
else if M>0 then R:=Step(M,A)
else R:=Step(- M,A);
проверяют условия М=0, М>0 и в зависимости от их соблюдения либо присваивает переменной R значение 1 (при М=О), либо выполняет вызов функции Step для фактических значений М, А или -М, А, а после вычисления значения функции Step присваивает его переменной R.
Оператор:
Z:=Z/(2*R);
выполняет вычисление значения выражения, а затем присваивает вычисленное значение переменной Z.
В заключение программы стандартная процедура Writeln выводит на экран сообщение о результате вычислений степени М числа А.
35 Двоичный поиск.
Сортировка бинарными включениями.Алгоритм сортировки прямыми включениями можно легко улучшить, пользуясь тем, что готовая последовательность a[1],...,a[i-1], в которую нужно включить новый элемент, уже упорядочена. Поэтому место включения можно найти значительно быстрее, применив бинарный поиск, который исследует средний элемент готовой последовательности и продолжает деление пополам, пока не будет найдено место включения. Модифицированный алгоритм сортировки называется сортировкой бинарными включениями.
Procedure Binary_Insertion(n:word;Var a: array[-400..1000] of integer);
Var
i,j,l,r,m:word;
x:integer;
Begin
For i:=2 To n Do
begin
x:=a[i]; l:=1; r:=i-1;
While l<=r Do
begin
m:=(l+r) div 2;
If x<a[m] Then r:=m-1
Else l:=m+1
end;
For j:=i-1 DownTo l Do a[j+1]:=a[j];
a[l]:=x
end;
End;{Binary_Insertion}
36 Алгоритм нахождения из трех чисел наименьшего.
1. начало(в овале)
ввод a,b,min (в паралелограмме)
a<b (в ромбе)
2 стрелки, первая стрелка "нет" и в прямоугольнике min:=b
вторая стрелка "да" и в прямоугольнике min:=a
вывод min (в паралелограмме)
конец(в овале)
2.начало(в овале)
ввод a,b, c, min (в паралелограмме)
a<b (в ромбе)
2 стрелки, первая стрелка "нет" и в прямоугольнике min:=b
вторая стрелка "да" и в прямоугольнике min:=a
min<c (в ромбе)
2 стрелки, первая стрелка "нет" и в прямоугольнике min:=c
вторая стрелка сразу к выводу
вывод min (в паралелограмме)
конец(в овале)
37 Процедуры для обработки строк.
Процедура Insert может быть использована для вставки фрагмента из одной строки в другую. При этом задается номер позиции в строке, с которой будет вставляться фрагмент.
Процедура Delete позволяет удалить из строки символов фрагмент. В качестве аргументов в этой процедуре указывается имя строковой переменной, из которой будет удаляться фрагмент, номер позиции, с которой расположен удаляемый фрагмент, и длина удаляемого фрагмента.
38 Последовательный поиск.
PROGRAM CHASTOT2;
VAR A: ARRAY[1..20] OF REAL;
K: ARRAY[1..20] OF INTEGER;
I,J,N,M: INTEGER;
BEGIN
WriteLn('Vvedite N');
ReadLn(N);
WriteLn('Vvedite N chisel ');
FOR I:=1 TO N DO
Read(A[I]);
M:=0;
FOR I:=1 TO N DO
BEGIN
A[M+1]:=A[I]; J:=1;
WHILE A[J]<>A[I] DO
J:=J+1;
IF J=M+1
THEN
BEGIN M:=M+1; K[M]:=1; END
ELSE K[J]:=K[J]+1;
END;
WriteLn('Kolichestvorazlichnyxsimvolov ', M:3);
FOR I:=1 TO M DO
WriteLn(‘R[‘,I:2,’]=’,A[I]:2:0,’ K[‘,I:2,’]=’, K[I]:2);
END.
39 Нахождение номеров строки и столбца с максимальным элементом.
Programdd11Dl;
var
A: ARRAY[1..10,1..10] ofREAL;
i, j, i_max, j_max, n, m: INTEGER;
var max: real;
BEGIN
WriteLn ('Vveditechislo N'); Read(n);
WriteLn ('Введите число M'); Read(m);
For i:=1 to n do
Begin
For j:=1 to m do read (a[i,j]); writeLn; end;
Max:= A[i,j]; i_max:=1; j_max:=1;
For i:=1 to n do
For j:=1 to m do
If a[i,j]>=max then
begin max:=a[i,j]; i_max:=i; j_max:=j end;
WriteLn ('Максимум = ', max,' Номерстроки: ',i_max,' Номерстолбца ',j_max);
end.
40 Циклические алгоритмы.
Кроме рассмотренной в предыдущей лабораторной работе конструкции FOR…TO (DOWNTO) … DO для организации циклов в ТП можно использовать конструкцию REPEAT … UNTIL. При использовании в программе этой циклической конструкции последовательность операторов (тело цикла) обрамляется словами REPEAT и UNTIL. В любом случае последовательность операторов, входящих в тело цикла, выполняется один раз, после чего проверяется условие завершения цикла, записанное следом за словом UNTIL. Если это условие выполняется, цикл завершается. В противном случае – тело цикла повторяется еще раз, после чего снова проверяется условие завершения цикла. Обобщенная форма записи оператора REPEAT … UNTIL выглядит следующим образом:
REPEAT
Оператор_1;
Оператор_2;
. . . . . . . .
Оператор_N;
UNTIL Условие;
Внимательно рассмотрите приведенный ниже пример программы, иллюстрирующий использование перечисляемого цикла. Наберите этот текст программы в ТП и выполните программу несколько раз для различных значений входных данных. Сформулируйте условие задачи, которую решает эта программа.
Program Poisk;
VAR i,b,n: INTEGER;
VAR c: STRING;
VAR a: ARRAY[1..100] OF INTEGER;
BEGIN
WriteLn('Vvedite n i b');
ReadLn(n,b);
WriteLn('Vvedite ', n, ' chisel');
FOR i:=1 TO n DO
Read(a[i]);
c:='da'; i:=0; a[n+1]:=b;
REPEAT
i:=i+1;
UNTIL a[i]=b;
IF i>n
THEN c:='net';
WriteLn(c);
END.
Для создания циклов в ТП существует третья и последняя конструкция – WHILE … DO. Общий вид этой конструкции следующий:
WHILE Условие DO
BEGIN
Оператор_1;
Оператор_2;
. . . . . . . .
Оператор_N;
END;
В конструкции WHILE … DO проверка условия выхода выполняется в начале, а не в конце цикла, поэтому, если условие не удовлетворяется до начала выполнения цикла, то тело цикла игнорируется и выполняется оператор, стоящий сразу же после окончания тела цикла.
41 Тип данных STRING.
Для обработки строк (цепочек символов) в ТП существует специально предназначенный тип данных STRING (строка). Переменная типа STRING состоит из цепочки символов, то есть элементов типа CHAR. Поэтому этот тип данных занимает промежуточное место между простыми и структурированными типами данных.
При описании строковой переменной используется зарезервированное слово STRING. В квадратных скобках за ним может следовать максимальный размер строки. Если этот размер отсутствует, то считается, что строка имеет размер, равный 255. Примеры объявления переменных типа STRING:
VAR
Stroka: STRING;
Family: STRING[15];
42 Алгоритм нахождения суммы диагональных элементов.
Program matrix;
Uses crt;
var
mas:array [1..10,1..10] of integer;
s:integer;
i,j,n,m:integer;
Begin
Сlrscr;
writeln('Введите количество строк n:');
readln(n);
writeln('Введите количество столбцов m:');
readln(m);
for i:=1 to n do {ввод элементов двумерного массива}
begin
for j:=1 to m do
begin
writeln('Введите ',i,',',j,'-й элемент матрицы: ');
readln(mas[i,j]);
end;
end;
writeln('Введенный массив: ');
for i:=1 to n do {вывод элементов двумерного массива}
begin
for j:=1 to m do
write(mas[i,j]:5);
end; {конец вывода}
s:=0; {обнуление суммы}
for i:=1 to n do
begin
for j:=1 to m do
begin
s:=s+mas[i,j];{вычисление суммы элементов}
end;
end;
write('Summa:');
write('S= ',S); {вывод на экран полученной суммы}
End.
43 Вызов стандартной процедуры или функции.
Вызов стандартной процедуры или функции
Для использования стандартной процедуры или функции к программе подключается тот или иной специализированный библиотечный модуль, в котором записана данная стандартная процедура или функция (исключение составляет модуль System, так как он подключается к программе автоматически), для чего имя специализированного библиотечного модуля указывается в разделе uses. Затем в программе записывается вызов процедуры или функции, для чего записывается ее имя и указываются фактические параметры, например: Pi, Sin(X), Chr(125), Inc(X,5). Так как после выполнения функции ее значение присваивается имени, то имя функции используется в выражении.
44 Алгоритм нахождения n-го числа Фибоначчи.
PROGRAM FIB;
VAR n,i,F1,F2,F: INTEGER;
BEGIN
ReadLn(n);
IF n=1
THEN F:=0
ELSE IF n=2
THEN F:=1
ELSE
BEGIN
F1:=0; F2:=1; i:=2;
WHILE i<n DO
BEGIN
F:=F1+F2; F1:=F2; F2:=F; i:=i+1;
END;
END;
WriteLn('n = ', n, ' Fib = ', F);
END.
45 Скалярные процедуры и функции.
Скалярные процедуры и функции
Dec(X{,n}) — процедура уменьшает значение целочисленной переменной Х на величину n. При отсутствии необязательного параметра n значение Х уменьшается на единицу.
Inc(X{,n}) — процедура увеличивает значение целочисленной переменной Х на n. При отсутствии необязательного параметра n значение Х увеличивается на единицу.
Pred(S) — функция возвращает элемент, предшествующий S в списке значений типа. Тид результата совпадает с типом параметра. Если предшествующего S элемента не существует, возникает программное прерывание.
Succ(S) — функция возвращает значение, следующее за S в списке значений типа. Тип результата совпадает с типом параметра. Если следующее за S значение отсутствует, возникает программное прерывание.
Odd(I: integer): boolean — возвращает True, если I нечетное, и False, если I четное.
46 Заполнение квадрата натуральными числами.
47 Алгоритм нахождения n!.
Факториал числа представляет собой произведение всех натуральных чисел от 1 до этого числа включительно. Например, факториал числа 7 выглядит так:
1 * 2 * 3 * 4 * 5 * 6 * 7
Факториал числа обозначается как само число после которого следует восклицательный знак. Например, 7!. Таким образом:
7! = 1 * 2 * 3 * 4 * 5 * 6 * 7 = 5040
С увеличением числа его факториал быстро возрастает. Так если 3! = 6, то уже 10! = 3628800. Поэтому для натуральных чисел больше 12-ти в языке программирования Паскаль просто так факториал вычислить нельзя.
Допустим, требуется определить факториал числа, которое ввел пользователь.
Алгоритм решения задачи:
Переменной factorial сначала присваивается значение 1.
0! = 1 и 1! = 1.
Если пользователь ввел число больше единицы, то выполняется цикл, в теле которого на каждой итерации значение переменной factorial умножается на следующее натуральное число (переменную i).
Программа на языке Паскаль:
Var
factorial: longint;
n, i: byte;
Begin
write('n = '); readln(n);
factorial := 1;
for i:=2 to n do
factorial := factorial * i;
writeln('n! = ', factorial);
readln;
end.
48 Форматы R, R:p, R:p:q. Примеры.
Операторы вывода допускают использование в явном виде указаний о ширине поля, отводимого под значение выводимой величины. Форма представления выводимых переменных определяется типом переменных. Величины целого типа выводятся в обычной форме или в формате I:p, где p – целое число, указывающее количество позиций экрана, отводимых под запись числа. При выводе значений действительных типов с фиксированной точкой указывается ширина поля, отводимая под 5.7 -1.107 2.7 128 25 все значение и под дробную часть, т.е. в формате R:p:q. Каждое значение выводимых величин занимает крайние правые позиции отведенного поля, при этом незаполненные остаются свободными, образуя пробелы. Если при выводе действительных значений не указывается количество позиций, отведенных под дробную часть числа, то результат получается в экспоненциальном виде с десятичным порядком. Пример 3. Program prog1_3; var a, b, с : real; k, t : integer; Begin read (а, b, с); readln; read(k, t); write(a:8:3); writeln(b:10:4,c:10:4); writeln(k,t:5); End. Экран пользователя в примере 3 примет вид: Значения переменных a, b и c размещаются в одной строке и занимают a – восемь, b и c – десять позиций. Под дробную часть отводится 3, 4, 4 позиции соответственно. Значения k, t выводятся на следующей строке, оба в поле по пять позиций.
49 Два пути обработки переменных типа STRING.
Существует два пути обработки переменных типа STRING. Первый путь предполагает обработку всей строки как единого целого, то есть единого объекта. Второй путь рассматривает строку как составной объект, состоящий из отдельных символов, то есть элементов типа CHAR, которые при обработке доступны каждый в отдельности. Для обращения к конкретному элементу строки указывается в квадратных скобках номер его позиции в строке.
Примеры операций со строками:
Family:='Bil'; {1 оператор}
Family:= Family + ' ' + 'Getc'; {2 оператор}
Family:= ' '; {3 оператор}
Family[1]:= 'A'; {4 оператор}
Family[2]:= #49; {5 оператор}
В результате выполнения первого оператора строка Family будет содержать текст – Bil. После выполнения второго оператора к тексту Bil справа будет добавлен пробел и текст Getc. Выполнение третьего оператора приведет к тому, что строка Family будет содержать два пробела (это не означает, что она станет пустой). Четвертый оператор на первой позиции строки Family разместит символ A, а пятый оператор на второй позиции строки Family разместит цифру 1, поскольку #49 это есть ASCII-код цифры 1.
50 Правила использования оператора сase.
Правила использования оператора сase. При использовании оператора выбора case должны выполняться следующие правила:
1. Значения выражения "переключателя", записанного после служебного слова case, должны принадлежать дискретному типу (лат. discretus — прерывистый, дробный, состоящий из отдельных частей); для целого типа они должны лежать в диапазоне integer.
2. Все константы, предшествующие операторам альтернатив, должны иметь тип, совместимый с типом выражения.
3. Все константы в альтернативах должны быть уникальны в пределах оператора варианта (т. е. повторения констант в альтернативах не допускаются); диапазоны не должны пересекаться и не должны содержать констант, указанных в данной или других альтернативах.
51 Функции для обработки строк.
Для обработки строк в ТП имеется целый ряд функций и процедур. Ниже рассмотрим наиболее важные из них.
Функция Length позволяет определить фактическую длину текстовой строки, хранящейся в указанной переменной (а не величину предельного размера строки, установленную при декларации).
Функция UpCase преобразовывает строчную литеру в прописную. Эта функция рассчитана на обработку отдельного символа. Поэтому для обработки строки символов с помощью этой функции приходится организовывать цикл. Русские литеры не могут обрабатываться этой функцией.
Функция Copy предназначена для копирования фрагмента некоторой строки из одной переменной в другую. Вызывая функцию, необходимо указывать следующие параметры:
– имя строки, из которой должен извлекаться копируемый фрагмент;
– позицию в строке, начиная с которой будет копироваться фрагмент;
– число копируемых символов.
Следует иметь в виду, что сообщения об ошибке не будет, если начальная или конечная позиции копируемого фрагмента находятся вне пределов исходной строки символов. Результатом выполнения операции в первом случае будет строка нулевой длины, во втором – фрагмент от начальной позиции копирования до конца исходной строки.
С помощью функции Pos можно осуществить поиск определенного фрагмента в строке. Если заданный фрагмент в строке присутствует, то функция возвращает номер позиции в строке, с которой этот фрагмент начинается. Если фрагмент в строке не найден, то функция возвращает нуль.
52 Операторы Write и WriteLn. Общие сведения о форматах.
В процедурах вывода Write и WriteLn имеется возможность записи выражения, определяющего ширину поля вывода. В приведенных ниже форматах используются следующие обозначения:
I, p, q – целочисленное выражение;
R –выражение вещественного типа;
B – выражение булевского типа;
Ch –выражение символьного типа;
S –выражение строкового типа;
# -цифра;
* - знак “+” или “-“;
_-пробел.
I-выводится десятичное представление величины I, начиная с позиции расположения курсора.
I:p -выводится десятичное представление величины I в крайние правые позиции поля шириной p.
R- в поле шириной 18 символов выводится десятичное представление величины R в формате с плавающей точкой. Если R>=0.0, используется формат _#.##########E*##.
R:p –в крайние правые позиции поля шириной p символов выводится десятичное представление значения R в формате с плавающей точкой. Если R>=0.0, используется формат _ _…_##..#E*##, причем минимальная длина поля вывода составляет 7 символов.
R:p:q –в крайние правые позиции поля шириной p символов выводится десятичное представление значения R в формате с фиксированной точкой, причем после десятичной точки выводится q цифр (0<=q<=24), представляющих дробную часть числа. Если q=0, ни дробная часть, ни десятичная точка не выводится. Если q>24, то при выводе используется формат с плавающей точкой.
Ch-начиная с позиции курсора выводится значение Ch.
Ch:p-в крайнюю правую позицию поля шириной p выводится значение Ch.
S- начиная с позиции курсора, выводится значение S (строка или массив символов, если его длина соответствует длине строки).
S:p- значение S выводится в крайние правые позиции поля шириной p символов.
B- выводится результат выражения B True или False, начиная с текущей позиции курсора.
B:p- в крайние правые позиции поля шириной p символов выводится результат булевского выражения B True или False.
Оператор записи WriteLn аналогичен процедуре Write, но после вывода последнего в списке значения для текущей процедуры WriteLn происходит перевод курсора к началу следующей строки.
Процедура WriteLn, записанная без параметров, вызывает перевод строки.
53 Форматы I, I:p. Примеры.
Операторы вывода допускают использование в явном виде указаний о ширине поля, отводимого под значение выводимой величины. Форма представления выводимых переменных определяется типом переменных. Величины целого типа выводятся в обычной форме или в формате I:p, где p – целое число, указывающее количество позиций экрана, отводимых под запись числа. При выводе значений действительных типов с фиксированной точкой указывается ширина поля, отводимая под 5.7 -1.107 2.7 128 25 все значение и под дробную часть, т.е. в формате R:p:q. Каждое значение выводимых величин занимает крайние правые позиции отведенного поля, при этом незаполненные остаются свободными, образуя пробелы. Если при выводе действительных значений не указывается количество позиций, отведенных под дробную часть числа, то результат получается в экспоненциальном виде с десятичным порядком. Пример 3. Program prog1_3; var a, b, с : real; k, t : integer; Begin read (а, b, с); readln; read(k, t); write(a:8:3); writeln(b:10:4,c:10:4); writeln(k,t:5); End. Экран пользователя в примере 3 примет вид: Значения переменных a, b и c размещаются в одной строке и занимают a – восемь, b и c – десять позиций. Под дробную часть отводится 3, 4, 4 позиции соответственно. Значения k, t выводятся на следующей строке, оба в поле по пять позиций.
54 Оператор условия if.
Оператор условия if
Оператор условия if является одним из самых популярных средств, изменяющих естественный порядок выполнения операторов программы.
Он может принимать одну из следующих форм:
if <условие> then <оператор1>
else <оператор2>;
if <условие> then <оператор>;
В переводе с английского языка данные форматы можно определить как:
ЕСЛИ<условие>ТО<оператор1>ИНАЧЕ<оператор2>
ЕСЛИ<условие>ТО<оператор>
Оператор условия if выполняется следующим образом. Сначала вычисляется выражение, записанное в условии. В результате его вычисления получается значение булевского типа.
В первом случае, если значение выражения есть True (истина), выполняется <оператор1>, указанный после слова then (в переводе –“то”). Если результат вычисления выражения в условии есть False (ложь), то выполняется <оператор2>.
Во втором случае, если результат выражения True, выполняется <оператор>, если False - оператор, следующий сразу за оператором if. Операторы if могут быть вложенными.
Особенность применения оператора if. При использовании вложенных условных операторов может возникнуть синтаксическая неоднозначность, например:
if условие1 then if условие2 then <оператор1> else <оператор2>
Возникающая двусмысленность, к какому оператору if принадлежит часть else <оператор2>, разрешается тем, что служебное слово else всегда ассоциируется (связывается) с ближайшим по тексту служебным словом if, которое еще не связано со служебным словом else.
55 Понятие структурного программирования.
При создании средних по размеру приложений (несколько тысяч строк исходного кода) используетсяструктурное программирование, идея которого заключается в том, что структура программы должна отражать структуру решаемой задачи, чтобы алгоритм решения был ясно виден из исходного текста. Для этого надо иметь средства для создания программы не только с помощью трех простых операторов, но и с помощью средств, более точно отражающих конкретную структуру алгоритма. С этой целью в программирование введено понятие подпрограммы – набора операторов, выполняющих нужное действие и не зависящих от других частей исходного кода. Программа разбивается на множество мелких подпрограмм, каждая из которых выполняет одно из действий, предусмотренных исходным заданием. Комбинируя эти подпрограммы, удается формировать итоговый алгоритм уже не из простых операторов, а из законченных блоков кода, имеющих определенную смысловую нагрузку, причем обращаться к таким блокам можно по названиям.
Идеи структурного программирования появились в начале 70-годов в компании IBM, в их разработке участвовали известные ученые Э. Дейкстра, Х. Милс, Э. Кнут, С. Хоор.
Структурное программирование основано на модульной структуре программного продукта и типовыхуправляющих структурах алгоритмов обработки данных различных программных модулей.
Типы управляющих структур:
– последовательность;
– альтернатива (условие выбора);
– цикл.
Распространены две методики (стратегии) разработки программ, относящиеся к структурному программированию:
– программирование «сверху вниз»;
– программирование «снизу вверх».
Программирование «сверху вниз», или нисходящее программирование – это методика разработки программ, при которой разработка начинается с определения целей решения проблемы, после чего идет последовательная детализация, заканчивающаяся детальной программой.
Сначала выделяется несколько подпрограмм, решающих самые глобальные задачи (например, инициализация данных, главная часть и завершение), потом каждый из этих модулей детализируется на более низком уровне, разбиваясь в свою очередь на небольшое число других подпрограмм, и так происходит до тех пор, пока вся задача не окажется реализованной.
В данном случае программа конструируется иерархически - сверху вниз: от главной программы к подпрограммам самого нижнего уровня, причем на каждом уровне используются только простые последовательности инструкций, циклы и условные разветвления.
Такой подход удобен тем, что позволяет человеку постоянно мыслить на предметном уровне, не опускаясь до конкретных операторов и переменных. Кроме того, появляется возможность некоторые подпрограммы не реализовывать сразу, а временно откладывать, пока не будут закончены другие части. Например, если имеется необходимость вычисления сложной математической функции, то выделяется отдельная подпрограмма такого вычисления, но реализуется она временно одним оператором, который просто присваивает заранее выбранное значение (например, 5). Когда все приложение будет написано и отлажено, тогда можно приступить к реализации этой функции.
Программирование «снизу вверх», или восходящее программирование – это методика разработки программ, начинающаяся с разработки подпрограмм (процедур, функций), в то время когда проработка общей схемы не закончилась.
Такая методика является менее предпочтительной по сравнению с нисходящим программированием так как часто приводит к нежелательным результатам, переделкам и увеличению времени разработки.
56 Определение подпрограмм.
При решении сложных объемных задач часто целесообразно разбивать их на более простые. В этом случае говорят о вспомогательных алгоритмах или подпрограммах. Использование подпрограмм позволяет сделать основную программу более наглядной, понятной, уменьшить вероятность ошибок и облегчить процесс отладки программы, а в случае, когда одна и та же последовательность команд встречается в программе несколько раз, сократить объем программы. Подпрограмма – это поименованная последовательность операторов, которую можно многократно вызывать для исполнения в любом месте программы. При обращении к подпрограмме в нее передаются исходные данные, а после выполнения операторов подпрограммы передаются в основную программу результаты расчетов. В языке Паскаль существует два вида подпрограмм, определяемых программистом: процедуры и функции, которые отличаются способом использования в программе. Процедуры и функции, используемые в программе, должны быть соответствующим образом описаны в разделе описаний до первого их упоминания. Процедуры и функции, входящие в программу, могут содержать свои подпрограммы и вызвать процедуры и функции более низкого уровня и т.д.
57 Функции. Особенности использования.
Функции в Паскале
За наличие подпрограмм как средства структурирования программ язык программирования Турбо Паскаль называется процедурно-ориентированным.
Подпрограммы в Турбо Паскале реализованы посредством процедур и функций. Имея один и тот же смысл и аналогичную структуру, процедуры и функции различаются назначением и способом их использования.
Функция — это независимая именованная часть программы, которую можно вызвать по имени для выполнения определенных действий. Структура функции повторяет структуру программы.
Особенности использования функции:
• функция передает в точку вызова скалярное значение;
• имя функции может входить в выражение как операнд.
Например, функция Chr(65) возвратит в точку вызова символ А (код ASCII — 65), Sqr(X) — возведет в квадрат значения целого или вещественного Х и возвратит в точку вызова вычисленное значение квадрата числа X.
Все процедуры и функции языка Турбо Паскаль делятся на две группы: встроенные (стандартные) и определенные пользователем. Первые входят в состав языка и вызываются для выполнения по строго фиксированному имени. Вторые разрабатываются и именуются самим пользователем. Все стандартные средства расположены в специализированных библиотечных модулях, которые имеют системные имена.
58 Фактические и формальные параметры.
Формальные параметры – перечень имен для обозначения исходных данных и результатов работы процедуры, используемых для описания процедуры, с указанием их типов. Раздел описаний может иметь такие же подразделы, как и раздел описаний основной