Файл: Основные структуры алгоритмов сравнительный анализ и примеры их использования.pdf
Добавлен: 29.03.2023
Просмотров: 63
Скачиваний: 1
После этого набранные данные заносятся в соответствующие им переменные, и выполнение программы продолжается.
Оператор вывода
Оператор вывода позволяет выводить на экран монитора данные из списка вывода.
Формат оператора:
Write(<Список вывода>);
Writeln(<Список вывода>);
Например:
Write(‘Результат=’, Pi*r*r);
Элементами списка вывода могут являться имена переменных, констант, выражения (которые предварительно вычисляются), текст, заключенный в апострофы. Элементы списка, также как и в операторах ввода, разделяются запятыми.
Различие между операторами Write и Writeln: после выполнения оператора Writeln (от Write line) курсор переходит на новую строчку, а после выполнения оператора Write курсор остается на текущей строке вывода, и следующий оператор вывода начинает вывод именно с этой позиции.
Оператор Writeln без параметров (Writeln;) реализует переход к началу следующей строки.
После имени переменной или выражения через двоеточие можно указать формат числа, который задает ширину поля вывода. Для переменной целого типа – это одно число, указывающее число позиций, отводимых под целое значение (например, write(x:10);). Для переменной вещественного типа – это два числа, первое из которых указывает число позиций, отводимых под все число, включая десятичную точку, второе – число позиций, отводимых под дробную часть числа (например, write(y:7:2);). Если для вещественных величин формат вывода не задан, то значение выводится в форме с плавающей точкой.
Приведем пример использования форматированного вывода.
Пусть имеется фрагмент программы:
a := 52.6;
Write (a);
На экране будет отражена запись 5.2600000000Е+01, т.е. 5.2600000000*101
26
Условный оператор
Условный оператор позволяет проверить некоторое условие и в зависимости от результатов проверки выполнить то или иное действие. Таким образом, условный оператор используется для реализации ветвлений в программе, которые происходят при выполнении некоторого условия.
Формат условного оператора:
If <условие>
Then <оператор 1>
Else <оператор 2>;
Работа оператора может быть выражена простыми словами:
Если <условие> {Если выполняется условие}
то < оператор 1> {то выполнить оператор № 1}
иначе < оператор 2> {иначе – выполнить оператор № 2}
Условный оператор работает по следующему алгоритму. Вначале вычисляется условное выражение, если результат вычисления имеет значение ИСТИНА, то выполняется оператор или группа операторов следующих за словом then, если же выражение имеет значение ЛОЖЬ, то выполняется оператор следующий после слова else.
Следует обратить ваше внимание на то что после <оператора 1> перед словом else не ставится точка с запятой.
Существуют конструкции когда условный оператор записывается без слова else, т.е.
If <условие> then <оператор 1>;
В таких случаях при вычислении логического выражения, когда результат имеет значение ЛОЖЬ, выполняется оператор следующий за оператором условия.
После слов then и else стоит только один оператор. Но что делать, если требуется по выполнению или невыполнению условия совершить не одно, а несколько действий? Здесь приходит на помощь.
уже составной оператор. В операторные скобки можно заключить любое количество операторов. Вариант условного оператора в этом случае:
If <условие>
Then Begin <группа операторов 1> end
Else Begin < группа операторов 2> end;
27
пример
Заданы целые значения x и y. Определить z = max (x2, y2).
Program primer1;
Var
z, x, y : integer;
Begin
Readln (x, y);
If sqr(x) > sqr(y) then z := sqr(x)
else z := sqr(y);
Write ('Z = ', z);
End.
Оператор цикла «Пока»
Формат цикла «Пока» (цикл с предусловием):
While <условие> Do <оператор>;
По-русски можно прочитать так: «Пока истинно условие, выполнять оператор».
Работает оператор следующим образом. Вначале вычисляется условие, если результат вычисления имеет значение ИСТИНА, то выполняется оператор в цикле, после чего вычисление выражения <условие> и его проверка повторяются. Если логическое выражение имеет значение ЛОЖЬ, оператор While прекращает свою работу.
Здесь, так же, как в формате условного оператора, подразумевается выполнение только одного оператора. Если необходимо выполнить несколько действий, то используется составной оператор. Тогда формат оператора принимает такой вид:
While <условие> Do Begin
<оператор 1>;
<оператор 2>;
<оператор 3>;
. . .
End;
Пример. Дана последовательность целых чисел за которой следует ноль. Вычислить сумму элементов последовательности.
28
Program primer;
Var i, a, s : integer;
Begin
s := 0;
Read (a);
While a <> 0 do begin
s := s + a;
Read (a);
end;
Write ('Сумма элементов равна ', s);
End.
Оператор цикла До
Формат цикла «До» (цикл с постусловием):
Repeat
<оператор 1>;
<оператор 2>;
<оператор 3>;
. . .
Until <условие>;
Читается так: «Выполнять оператор 1, оператор 2. и т. д. до выполнения условия».
Здесь не требуется использование составного оператора, потому что сами слова Repeat и Until являются операторными скобками.
ператор Repeat – Until работает следующим образом. В начале выполняется тело цикла, после чего вычисляется логическое выражение следующее за словом Until, если результатом вычисления выражения является ЛОЖЬ, то операторы в теле цикла будут выполнены повторно. в противном случае, если логическое выражение имеет значение ИСТИНА, оператор цикла с постусловием прекратит свою работу.
Пример. Дана последовательность целых чисел, последним элементом которой является число 100. Вычислить среднее арифметическое элементов этой последовательности.
29
Program primer;
Var i, a, s, x : integer;
Begin
s := 0;
x := 0;
Repeat
Read (a);
s := s + a;
x := x + 1;
Until a = 100;
s := s / x;
Write ('среднее арифметическое: ', s);
End.
Массивы
Рассмотренные выше простые типы данных – логический (boolean), целый (integer , word , byte , longint), вещественный (real), символьный (char) позволяют работать с одиночными объектами. В языке Паскаль могут использоваться также объекты, содержащие множество однотипных элементов. Массив – это упорядоченная последовательность однотипных данных, рассматриваемых как одно целое. Упорядоченность данных в массиве позволяет обращаться к любому элементу массива по его порядковому номеру (индексу). Элементы массива расположены последовательно в непрерывной области памяти.
Нужно четко понимать, что индекс ячейки массива не является ее содержимым. Содержимым являются хранимые в ячейках данные, а индексы только указывают на них. Индексы элементов массива обычно целые числа, однако могут быть и символами, а также описываться другими порядковыми типами. Зачастую для задания количества элементов массива используется тип-диапазон. Типдиапазон задается левой и правой границами изменения индекса массива.
Описание массива
Перед использованием массив, как и любая переменная, должна быть объявлена (описана).
Описание типа массива задается следующим образом:
type
имя типа = array[ список индексов ] of тип;
30
Здесь имя типа – правильный идентификатор; список индексов – список одного или нескольких индексных типов, разделенных запятыми; тип – любой тип данных.
Пример.
Const
n = 5;
type
mas = array[1..n] of integer; {Объявлен тип mas, являющийся массивом (array) целых чисел (integer), границы изменения индекса массива – 1… n}
var
a: mas;
Определить переменную как массив можно и непосредственно при ее описании в разделе var, без предварительного описания типа массива, например:
var
a,b,c: array[1..10] of integer; {Объявлены три массива a, b, c, состоящие из десяти целых элементов}
Обращение к определенному элементу массива осуществляется путем указания имени переменной массива и в квадратных скобках индекса элемента, например a[3] – обращение к третьему элементу массива a, a[i] – обращение к i-му элементу массива a. Простой массив является одномерным. Он представляет собой линейную структуру.
Основные действия с массивами
Единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы
однотипны, – это присваивание. Если в программе описаны две переменные одного типа, например,
Var
a , b : array [1..10] of real;
то можно переменной a присвоить значение переменной b (a:=b). При этом каждому элементу массива a будет присвоено соответствующее значение из массива b. Все остальные действия над массивами Паскаля производятся поэлементно.
31
Ввод массива
Для того чтобы ввести значения элементов массива, необходимо последовательно изменять значение индекса, начиная с первого до последнего, и вводить соответствующий элемент. Для реализации этих действий удобно использовать цикл с заданным числом повторений, где параметром цикла будет выступать переменная – индекс массива. Значения элементов могут быть введены с клавиатуры или определены с помощью оператора присваивания.
Пример фрагмента программы ввода массива с клавиатуры:
Var
A : array [1..10] of integer;
i : byte; {переменная i как индекс массива}
Begin
For i:=1 to 10 do
Read (a[i]); { ввод i- го элемента производится с клавиатуры }
Рассмотрим теперь случай, когда массив заполняется автоматически случайными числами. Для этого будем использовать генератор случайных чисел – random ( N ).
Пример фрагмента программы заполнения массива случайными числами: Var
A: array [1..10] of integer;
i : byte ;
Begin
For i :=1 to 10 do
A [ i ]:= random (50)-25; {i-му элементу массива присваивается «случайное» целое число в диапазоне от 0 до 49 с вычетом 25, т.е. окончательный диапазон от -25 до 24} .
32
Вывод массива
Вывод массива в Паскале осуществляется также поэлементно, в цикле, где параметром выступает индекс массива, принимая последовательно все значения от первого до последнего.
Пример фрагмента программы вывода массива:
Var
A: array [1..10] of integer;
i : byte ; {переменная i как индекс массива}
Begin
Writeln(‘Массив А’);
For i :=1 to 10 do
Write ( a [ i ]:5); {вывод массива осуществляется в строку, под каждый элемент выделяется 5 позиций, иначе элементы массива будут выведены слитно} .
Writeln; (Для перевода курсора на следующую строку)
На экране мы увидим, к примеру, следующие значения:
Массив А _ _ _ _ 5_ _ _ - 2_ _ 1 1 5 и т.д.
Вывод можно осуществить и в столбик (использовать оператор Writeln). Но в таком случае нужно учитывать, что при большой размерности массива все элементы могут не поместиться на экране и будет происходить скроллинг, т.е. при заполнении всех строк экрана будет печататься очередной элемент, а верхний смещаться за пределы экрана.
Пример программы вывода массива в столбик:
Var
A: array [1..10] of integer;
i : byte ;
Begin
For i:=1 to 10 do
Writeln (‘a[‘, i,’]=’, a[i]); {вывод элементов массива в столбик} .
На экране мы увидим, к примеру, следующие значения:
a [1]=2
a [2]=4
a [3]=1 и т.д.
33
3. Практическая часть
Практической части рассмотрим основный структуры алгоритмов на языке паскаль и в блоке-схем начнем пожалуй самого простого алгоритма.
Линейный Алгоритм
Линейный алгоритм - это алгоритм, имеющий четкую последовательность действий, повторяющихся один раз.
Например, алгоритм открывания двери:
1. Достать ключ;
2. Вставить ключ в замочную скважину;
3. Повернуть ключ;
4. Вытащить ключ;
5. Потянуть дверь.
По большому счету линейный алгоритм мы исполняемый ежедневно
а как же будет он выглядеть в языке программирование и в блок-схеме вот задача.
Задача
Найти площадь треугольника по известным сторонам A,B,C с помощью формулы герона
и также полупериметр
Вот так будет выглядеть блок-схема
34
Теперь как он будет выглядеть в языке паскаль
Program Geron;
var
a,b,c,p,S:real;
begin
writeln('Введите первую сторону треугольника a=');
readln(a);
writeln('Введите второю сторону треугольника b=');
readln(b);
writeln('Введите третью сторону треугольника c=');
readln(c);
p:=(a+b+c)/2;
S:=sqrt(p*(p-a)*(p-b)*(p-c));
Writeln('Площадь треугольника равна', S);
readln;
End.
На мониторе должный увидеть Окно вывода
Введите первую сторону треугольника a=3
Введите второю сторону треугольника b=4
Введите третью сторону треугольника c=5
Таким способом узнаем что
площадь треугольника равна=6.
35
Цикличесйкй алгоритм
Циклический алгоритм – описание действий, которые должны повторяться указанное число раз или пока не выполнено заданное условие. Перечень повторяющихся действий называют телом цикла.
Также как и линейный алгоритм циклический также присутствует в нашей жизнь.
Задача
Какой значения будет переменной s,
При запуске программы
program S;
var s,k: integer;
begin
s:=0;
for k:=3 to 5 do
s:=s+6;
writeln(s);
End.
Значения переменой s будет равняться=18
Вот так будет выглядеть блок схемы этой задачи
36
Разветвляющиеся алгоритмы
Разветвляющиеся алгоритмы-представляют собой алгоритм, последовательность выполнения команд которого находится в зависимости от соответствия заявленному условию. Команда «ветвления» относится к структурным командам. Выполнение такой команды всегда происходит в несколько шагов: проверка заданного условия и дальнейшее исполнение команд по одной из ветвей: «да» или «нет».
Например
Взглянуть в окно
Идет дождь не идти гулять
Нет дождя пойти гулять
Задача
Выбрать значения которой больше чем другое
Program project;
var a,b,c: integer;
begin
write ('370,257');
read(a,b);
if A>B then C:=a else
C:=B;
write('Max=A',C)
End.
Значения А больше чем B
Вот так будет выглядеть блок схемы этой задачи.
37
Сравнения
Конечно, каждый алгоритм эффективен, но у них также есть плюсы и минусы
Давайте начнем, пожалуй, с линейного, что первый был в практической работе, это быстрота и эффективность, где особенно нужно больше скорости и точности и, в конечном счете, эффективность, во всех своих преимуществах он имеет очень большой недостаток, это узко направленость в отличиях от разветвленого где есть выбор ну, он нуждается в условии, который будет выполнять та или иная команда да
разветвленный алгоритм удобен, но он также заканчивается как линейный алгоритм, в отличие от циклического алгоритма, который повторяет одно и то же действие несколько раз, пока он не получит корректный результат, но он также с минусом, он лишь выполняет только одну командую.
38