B:p- в крайние правые позиции поля шириной p символов выводится результат булевского выражения B True или False.
Pos
Синтаксис:functionPos(Строка: string; Подстрока: string): byte;Действие:Возвращает позицию (номер символа) подстроки в строке.
Length
Синтаксис:functionLength(Строка: string): integer;Действие:Возвращает значение, равное количеству символов строки-аргумента.
Delete
Синтаксис:procedureDelete(var s: srting; НомерСимвола: integer; Сколько: integer);Действие:Удаляет из строки s ее часть, которая начинается с символа с номером п и состоит из i символов.
Сору
Синтаксис:functionCopy(s: string; n:integer; 1: integer): string;Действие:Возвращает подстроку — часть строки а. Подстрока начинается с символа с номером л и состоит из i символов.
Concat
Синтаксис:functionConcat(si [, s2, …,sN] : string): string;Действие:Возвращает строку, являющуюся объединением строк, указанных при вызове функции.
Chr
Синтаксис:functionChr{КодСимвола: byte): char;Действие:Возвращает символ с указанным кодом.
4. Конструкция цикла WHILE … DO.
Для создания циклов в ТП существует третья и последняя конструкция – WHILE … DO. Общий вид этой конструкции следующий:
WHILE Условие DO
BEGIN
Оператор_1;
Оператор_2;
. . . . . . . .
Оператор_N;
END;
В конструкции WHILE … DO проверка условия выхода выполняется в начале, а не в конце цикла, поэтому, если условие не удовлетворяется до начала выполнения цикла, то тело цикла игнорируется и выполняется оператор, стоящий сразу же после окончания тела цикла.
(пример)
Program Poisk; VAR i,b,n: INTEGER; VAR c: STRING; VAR a: ARRAY[0..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; WHILE a[i]<>b DO i:=i+1; IF i>n THEN c:='net'; WriteLn(c); END. |
5.Типы алгоритмических структур: следование, разветвление и цикл
Алгоритмы можно представлять как некоторые структуры, состоящие из отдельных базовых (т.е. основных) элементов. Естественно, что при таком подходе к алгоритмам изучение основных принципов их конструирования должно начинаться с изучения этих базовых элементов.
1. Базовая структура "следование". Образуется последовательностью действий, следующих одно за другим:
2. Базовая структура "ветвление". Обеспечивает в зависимости от результата проверки условия (да или нет) выбор одного из альтернативных путей работы алгоритма. Каждый из путей ведет к общему выходу, так что работа алгоритма будет продолжаться независимо от того, какой путь будет выбран. Структура ветвление существует в четырех основных вариантах:
Школьный алгоритмический язык | Язык блок-схем |
1. если—то | |
если условие то действия все | |
2. если—то—иначе | |
если условие то действия 1 иначе действия 2 все | |
3. выбор | |
выбор при условие 1: действия 1 при условие 2: действия 2 . . . . . . . . . . . . при условие N: действия N все | |
4. выбор—иначе | |
выбор при условие 1: действия 1 при условие 2: действия 2 . . . . . . . . . . . . при условие N: действия N иначедействия N+1 все |
Примеры структуры ветвление
Школьный алгоритмический язык | Язык блок-схем |
еслиx > 0 тоy := sin(x) все | |
еслиa > b тоa := 2*a; b := 1 иначеb := 2*b все | |
выбор при n = 1: y := sin(x) при n = 2: y := cos(x) при n = 3: y := 0 все | |
выбор приa > 5: i := i+1 при a = 0: j := j+1 иначеi := 10; j:=0 все |
6. Форматы B, B:p. Примеры
REPEAT
Внутренний оператор;
UNTIL логическое выражение;
Результатом выражения должен быть результат булевского типа.
Операторы, заключенные между ключевыми словами repeat и until, выполняются последовательно до тех пор, пока результат выражения не примет значения True. Последовательность операторов выполняется по крайней мере один раз, поскольку вычисление выражения производится после каждого выполнения последовательности операторов.
Внимательно рассмотрите приведенный ниже пример программы, иллюстрирующий использование перечисляемого цикла. Наберите этот текст программы в ТП и выполните программу несколько раз для различных значений входных данных. Сформулируйте условие задачи, которую решает эта программа
Program Poisk; VAR i,b,n: INTEGER; VAR c: STRING; VAR a: ARRAY[1..100] OF INTEGER; BEGIN WriteLn('Введите n i b'); ReadLn(n,b); WriteLn('Введите ', n, ' чисел'); FOR i:=1 TO n DO Read(a[i]); c:='Да'; i:=0; a[n+1]:=b; REPEAT i:=i+1; UNTIL a[i]=b; IF i>n THEN c:='Нет'; WriteLn(c); END. |
10. Цикл со счетчиком FOR…TO (DOWNTO) … DO. Пример
Для организации циклов в ТП можно использовать конструкцию FOR…TO (DOWNTO) … DO. Такая конструкция позволяет реализовать повторение в Паскаль-программах. Ее называют перечисляемым циклом или циклом со счетчиком. В этом операторе указываются следующие параметры:
- имя переменной, в которой хранится число повторений цикла (переменной цикла или счетчика цикла),
- некоторое начальное значение для переменной цикла (счетчика), которое она получает при первом выполнении цикла),
- некоторое конечное значение для переменной цикла, достигнув которое повторение цикла прекращается (условие завершения цикла).
Внимательно рассмотрите приведенный ниже пример программы, иллюстрирующий использование перечисляемого цикла, и выясните, что эта программа делает.
Program Summing;
VAR
I, Sum, a: INTEGER;
BEGIN
Sum:=0;
FOR i:=1 TO 10 DO
BEGIN
Read(a);
Sum:=Sum+a;
END;
WriteLn('Sum= ',Sum);
ReadLn;
END.
11. Понятие сортировки. Виды сортировок
Под сортировкой понимают процесс переупорядочивания некоторого множества объектов с целью их размещения в заданном порядке. Это универсальный вид деятельности с точки зрения обработки данных, которые представляют собой последовательность ключей. С помощью сортировки добиваются такого их размещения, чтобы было выполнено условие:
f(a[1]) f(a[2])f(a[3])… f(a[N]),
где символ означает знак предшествования, а f-некоторая функция упорядочивания. При упорядочивании по возрастанию, после сортировки будет выполнено условие:
a[1] a[2] a[3] . . . a[N]
В ходе сортировки элементы последовательности меняются местами. Сортировка называется устойчивой, если на этапе замены два одинаковых ключа не меняются местами. Сортировка называется внутренней, если все сортируемые ключи размещаются в оперативной памяти. Если некоторая часть ключей размещается на внешнем носителе, то сортировка называется внешней.
В данных лабораторно-практических работах будут рассмотрены методы, у которых на входе - вектор с произвольным положением ключей, а на выходе - этот же вектор упорядочен по возрастанию.
Существует три группы методов внутренней сортировки (сортировка включением, сортировка выбором, обменная сортировка). В данной лабораторной работе рассмотрены методы сортировки включением и выбором.
12. Формы записи алгоритмов
Чтобы составить алгоритм, необходимо знать систему команд предполагаемого исполнителя, правила записи отдельных команд и всего алгоритма в целом.
1.
Овал: Начало или окончание процесса.
2.
Параллелограмм: Ввод или вывод.
3.
Ромб: Принятие решения.
4.
Прямоугольник: Выполнение действия.
Последовательность действий указывается с помощью стрелок, соединяющих фигуры, обозначающие шаги алгоритма. Вот так, например, с помощью блок-схемы можно представить алгоритм кипячения воды с помощью электрического чайника:
Пример записи алгоритма
13. Стек. Основные операции
Стек – это линейный список, в котором добавление новых элементов и удаление существующих производится только с одного конца, называемого вершиной стека.
Стек часто называют структурой LIFO [сокращение LIFO означает LastIn – FirstOut (последний пришел, первый вышел)]. Это сокращение представляет удобный способ запомнить механизм работы стека
При программировании на Паскале стек реализуется чаще всего в виде однонаправленного списка. Каждый элемент структуры содержит указатель на следующий. Считается лишь, что для этого списка не существует обход элементов. Доступ возможен только к верхнему элементу структуры.
Стек предполагает вставку и удаление элементов, поэтому он является динамической, постоянно меняющейся структурой.
Стеки довольно часто встречаются в практической жизни. Простой пример: детская пирамидка. Процесс ее сборки и разборки подобен процессу функционирования стека.
Итак, если стек – это список, то добавление или извлечение элементов происходит с начала и только с начала (или возможно с конца и только с конца) списка.
Значением указателя, представляющего стек, является ссылка на вершину стека, каждый элемент стека содержит поле ссылки.
Таким образом, описать стек можно следующим образом:
Type EXST = ^ST; ST = record Data : integer; Next : EXST; end; Var Stack : EXST; {Текущаяпеременная} |
Операции:
Занесениеэлементавстек
Procedure FormStack;
Var
Stack : EXST; {Текущаяпеременная}
Digit : integer;
Procedure writeStack(Var u : EXST; Digit : integer);
Var
x : EXST;
Begin
new(x); {выделяемпамятьподхранениеновогоэлементастека}
x^.Data := Digit; {заполняемполеданныхэлемента}
x^.Next := u; {новыйэлемент "связываем" состеком}
u := x; {созданныйэлементопределяемкаквершинустека}
End;
Begin
Stack := Nil; {инициализациястека}
writeln('Введитеэлементыстека. Окончаниеввода – 0');
read(Digit);
while Digit <> 0 do
begin
writeStack(Stack, Digit);
read(Digit);
end;
End;
Извлечениеэлементаизстека
Procedure readStack(Var u : EXST; Vari : integer);
Var
x : EXST;
Begin
i := u^.Data; {считываемзначениеполяданныхвпеременную}
x := u; {запоминаем адрес вершины стека}
u := u^.Next; {переносим вершину стека на следующий элемент}
dispose(x); {освобождаем память, занятую уже ненужным элементом стека}
End.
14. Алгоритмический язык.
Алгоритмический язык программирования — формальный язык, используемый для записи, реализации и изучения алгоритмов. В отличие от большинства языков программирования, алгоритмический язык не привязан к архитектуре компьютера, не содержит деталей, связанных с устройством машины.
Для изучения основ алгоритмизации применяется так называемый Русский алгоритмический язык(школьный алгоритмический язык), использующий понятные школьнику слова на русском языке.
Алголо-подобный алгоритмический язык с русским синтаксисом был введён в употребление академиком А. П. Ершовым в середине 1980-х годов, в качестве основы для "безмашинного" курса информатики.
Пример Вычислить сумму квадратов целых чисел от 1 до n.
алг Сумма квадратов (арг цел n, рез цел S)
дано | n > 0
надо | S = 1*1 + 2*2 + 3*3 + ... + n*n
нач цел i
|ввод n; S:=0
| нц для i от 1 до n
| | S:=S+i*i
| кц
| вывод "S = ", S
кон
15. Сортировки включением.
Сортировка прямым включением. Элементы условно разделяют на готовую a[1],...,a[i-1] и входную последовательности a[i],...,a[n]. Сначала i=2. На каждом шаге, увеличивая i на единицу, берут i-й элемент входной последовательности и передают в готовую последовательность, вставляя на подходящее место.
Итак, в начале рассматривается второй элемент (i=2) последовательности ключей. Он сравнивается с первым элементом (a[i-1]) и если он его меньше, то они меняются местами. В противном случае проход заканчивается, i увеличивается на 1 и процесс повторяется. Заметим, что упорядоченная последовательность a[i-1] называется готовой последовательностью и новый элемент вставляется в готовую последовательность на свое место.
На каждом проходе происходит перемещение i-того элемента в готовую последовательность, а некоторое число элементов сдвигается вправо. Данный процесс перемещения называется просачиванием элемента.
Здесь и далее, во всех процедурах сортировки ключи упорядочиваются по возрастанию. На входе процедур – количество элементов массива (n), на выходе – упорядоченный массив элементов (а).
Сортировка бинарными включениями.Алгоритм сортировки прямыми включениями можно легко улучшить, пользуясь тем, что готовая последовательность a[1],...,a[i-1], в которую нужно включить новый элемент, уже упорядочена. Поэтому место включения можно найти значительно быстрее, применив бинарный поиск, который исследует средний элемент готовой последовательности и продолжает деление пополам, пока не будет найдено место включения. Модифицированный алгоритм сортировки называется сортировкой бинарными включениями.
program crab;
vark:integer;
b:array[-400..1000] of integer;
j:integer;
Procedure Straight_Insertion(n:integer; Var a:array[-400..1000] of integer);
Var
i,j,x:integer;
Begin
For i:=2 To n Do
begin
x:=a[i]; a[0]:=x; j:=i-1;
End;
While x<a[j] Do
begin
a[j+1]:=a[j]; j:=j-1;
end;
a[j+1]:=x
end;
begin
writeln ('Введите k'); read (k);
writeln ('Введите массив b: ');
for j:=1 to k do read(b[j]);
Straight_Insertion(k,b);
writeln ('Рассортированныймассив');
for j:=1 to k do write(b[j], ' ');
end.
16. Общий вид алгоритма на алгоритмическом языке
Алгоритм на русском алгоритмическом языке в общем виде записывается в форме:
алг название алгоритма (аргумент и результат)
дано условия применимости алгоритма
надо цель выполнения алгоритма
нач описание промежуточных величин
| последовательность команд (тело алгоритма)
кон
В записи алгоритма ключевые слова обычно подчёркивались либо выделялись полужирным шрифтом. Для выделения логических блоков применялись отступы, а парные слова начала и конца блока соединялись вертикальной чертой.
Пример вычисления суммы квадратов:
алг Сумма квадратов (аргцел n, резцел S)
дано | n > 0
надо | S = 1*1 + 2*2 + 3*3 + … + n*n
начцелi
| ввод n; S:=0
| нц для i от 1 до n
| | S := S + i * i
| кц
| вывод "S = ", S
кон
17. Обработка строковых данных.
Строка — это последовательность символов. Каждый символ занимает 1 байт памяти (код ASCII). Количество символов в строке называется ее длиной. Длина строки может находиться в диапазоне от 0 до 255. Строковые величины могут быть константами и переменными. Особенностью строки в TurboPascal является то, что с ней можно работать как с массивом символов, с одной стороны, и как с единым объектом, — с другой. За счет этого обработка строк достаточно гибка и удобна. Строковая константа есть последовательность символов, заключенная в апострофы. Например: 'это строковая константа', ‘272’. Строковая переменная описывается в разделе описания переменных следующим образом:
Var<идентификатор> :string[<максимальная длина строки>];
Например:
VarName :string[20];
В ядро Паскаля включен ряд стандартных подпрограмм для обработки строковых данных. Опишем их прототипы, то есть, перечислим заголовки подпрограмм с указанием типа и количества формальных параметров.
function Length (s:string):integer;
- определяет и возвращает длину строки s в символах;
function copy
(s:string; N,L:integer): string;
- возвращает часть строки s длиной L символов, начиная с позиции N;
procedure Insert
(s0:string; var s: string; N: integer);
- в строку s вставляет строку s0, начиная с позиции N;
procedure Delete
(vars:string; N,L:integer);
- в строке s удаляет L символов, начиная с позиции N;
function Pos (s0, s:string): integer;
- возвращает позицию, начиная с которой строка s0 содержится в строке s или значение 0, если s0 не содержится в s;
procedure str (x: числовой; vars:string);
- преобразует число x в строку s, параметр x может иметь любой числовой тип;
procedure Val (s:string;
var x: числовой; varerror:integer);
- преобразует строку s в число x. Параметр x может иметь любой числовой тип. Параметр-переменная error служит для контроля правильности преобразования. Если преобразовать удалось, то error=0, иначе error будет равен номеру первого непреобразуемого символа строки s.
1. Разобрать предложение на слова и вывести каждое слово на новой строке экрана. Алгоритм работы этой программы очень прост -- до тех пор, пока в исходной строке предложения s есть хотя бы один пробел, вся часть строки до пробела копируется в строковую переменную w (слово). Если пробелов уже нет (или не было изначально), то вся строка -- это одно слово. После обработки очередного слова (в нашем случае -- это вывод его на новую строку экрана оператором writeln) обработанная часть строки вместе с пробелом удаляются из s -- чтобы следующий шаг цикла не нашел то же самое слово. var s,w:string; {предложение и слово} p:integer; {позиция пробела} begin writeln ('Введите текст'); readln (s); repeat p:=pos (' ',s); if p>0 then w:=copy (s,1,p-1) else w:=s; writeln (w); delete (s,1,p); until p=0; end. |
18. Проверка расстановок скобок в арифметическом выражении
usescrt;
varst:string;
k,i:integer;f:boolean;
Begin
clrscr;
write('ВВод ');
readln(st);
k:=0;
f:=true;
fori:=1to length(st)do
Begin
if k<0then
Begin
f:=false;
break;
End
Else
casest[i]of
'(':inc(k);
')':dec(k);
end;
end;
if f and k=0thenwriteln('Скобкирасставленыверно')
elsewriteln('Скобки расставлены неверно');
readln;
end.
19. Оператор цикла с управляемой переменной
В цикле со счетчиком тело цикла повторяется заранее определенное число раз. Циклы со счетчиком используются довольно часто, и поэтому в языке Паскаль для этих целей имеется специальная конструкция.
Можно, конечно, циклы со счетчиком моделировать при помощи операторов while и Repeat, но структура цикла со счетчиком проще.
Индекс массива
Номер элемента массива называется индексом. Индекс – это значение порядкового типа, определенного, как тип индекса данного массива. Очень часто это целочисленный тип ( 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 : 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-ти в языке программирования Паскаль просто так факториал вычислить нельзя.
Допустим, требуется определить факториал числа,