Виды вычислительных алгоритмов
Любой алгоритм, реализующий решение задачи на компьютере, может быть разработан в виде комбинации трёх базовых алгоритмических конструкций: линейной, разветвляющейся и циклической.
В линейном алгоритме все действия выполняются в строгом порядке, последовательно одно за другим.
В разветвляющемся алгоритме те или иные действия выполняются в зависимости от выполнения или невыполнения некоего условия.
В циклическом алгоритме повторяются некоторые действия, составляющие тело цикла, при выполнении некоего условия. При этом в цикле содержатся повторяющиеся действия с какой-либо изменяющейся величиной, называемой параметром цикла. Ниже приведены блок-схемы алгоритмов: рис.5.1,а – линейный; рис.5.1,б – разветвляющийся; рис.5.1,в – циклический.
Рисунок 1.1
Здесь S, S1, S2 …. – операторы или блоки операторов языка программирования.
Все алгоритмы имеют общее свойство: один вход и один выход. Именно благодаря этому свойству на их основе можно создавать наглядные алгоритмы, уменьшая тем самым вероятность ошибок при решении сложных информационных задач. Допускается неограниченное соединение структур и их вложение друг в друга. Что позволяет проектировать сложные алгоритмы.
Линейный вычислительный процесс
Линейный вычислительный процесс представляет собой набор операторов, выполняемых последовательно, один за другим. Основу программы линейного вычислительного процесса составляют операторы присваивания, ввода и вывода данных.
Оператор присваивания
Оператор присваиванияиспользуется для сохранения результата вычисления выражения в переменной. Общий вид:
переменная := выражение;
Знак := читается как "присвоить".
Работа оператора:
Сначала вычисляется выражение, стоящее справа от знака :=, затем результат записывается в переменную, стоящую слева от знака. Например, после выполнения оператора
k:=k+2;
текущее значение переменной k увеличится на 2.
Тип переменной должен быть не младшетипа выражения (например, если выражение дает целое число, результат можно писать и в целую, и в вещественную переменную, если результат вычисления выражения вещественный, писать его в целую переменную нельзя, т.к. может произойти потеря точности).
Примеры:
1. Записать оператор присваивания, который позволяет вычислить расстояние между двумя точками на плоскости с координатами (x1, y1) и (x2, y2).
Ответ:d:=sqrt(sqr(x1–x2)+sqr(y1–y2));
2. Записать последовательность операторов присваивания, обеспечивающих обмен значениями переменных x и y в памяти компьютера.
Ответ: c:=x;
x:=y;
y:=c;
где с – дополнительная переменная того же типа, что x и y, через которую осуществляется обмен. Грубой ошибкой было бы, например, попытаться выполнить обмен операторами x:=y; y:=x; - ведь уже после первого из них мы имеем два значения y, а исходное значение x потеряно.
Операторы ввода и вывода
В данном разделе рассмотрим организацию ввода и вывода данных с терминального устройства. Терминальное устройство - это устройство, с которым работает пользователь, обычно это клавиатура и экран (дисплей).
Ввод данных
Для ввода исходных данных чаще всего используется процедуры Read и ReadLn. Общий вид записи операторов:
Read(A1,A2,...AK);ReadLn(A1,A2,...AK);Здесь и далее список данных, передаваемых любому оператору (а позднее и написанным нами подпрограммам), мы будем называть параметрами. Таким образом, параметрами оператора (точней, стандартной процедуры) Read являются имена переменных, описанных ранее в разделе var.
При вводе исходных данных происходит преобразование из внешней формы представления во внутреннюю, определяемую типом переменных. Переменные, образующие список ввода, могут принадлежать либо к целому, либо к вещественному, либо к символьному типам. Чтение исходных данных логического типа в языке Паскаль недопустимо!
Работа операторов:
По достижении оператора ввода выполнение программы останавливается и ожидается ввод данных пользователем. Вводимые с клавиатуры значения переменных разделяются пробелом или нажатием клавиш табуляции и Enter. Не допускается разделение вводимых чисел запятыми!
После ввода значений всех переменных из списка работа программы продолжается со следующего оператора. Процедура производит чтение К значений исходных данных и присваивает эти значения переменным А1, А2, ..., АК.
Readln отличается от Read только тем, что все переменные должны быть введены в одну строку экрана, Enter нажимается один раз в конце. Readln используется в основном для ввода строк текста, для ввода чисел лучше использовать Read, т.к. в этом случае пользователь может вводить данные более свободно (и в одну, и в несколько строк экрана).
Если пользователь вводит данные недопустимого типа (например, строку текста вместо числа), то выводится сообщение об ошибке и работа программы прерывается.
Пример: нужно ввести данные для решения квадратного уравнения
var a,b,c:real;
. . . .
read (a,b,c);
Например, a=1, b=4, c=2.5 На экране вводим:
1_4_2.5
_ означает пробел
означает нажатие Enter, переходим на следующую строку
или
2.5
или
4_2.5
Пробелов может быть и несколько.
Как правило, перед оператором ввода ставится оператор вывода, служащий приглашением к вводу и поясняющий пользователю, что именно следует сделать (см. ниже).
Вывод данных
Для вывода результатов работы программы на экран используются процедуры:
Write(A1,A2,...AK);WriteLn(A1,A2,...AK);Переменные, составляющие список вывода, могут относиться к целому, действительному, символьному или булевскому типам. В качестве элемента списка вывода кроме имен переменных могут использоваться выражения и строки.
Работа операторов:
Элементы списка выводятся в пользовательское окно программы. Форма представления значений в поле вывода соответствует типу переменных и выражений: величины целого типа выводятся как целые десятичные числа, действительного типа - как действительные десятичные числа с десятичным порядком, символьного типа и строки - в виде символов, логического типа - в виде логических констант TRUE и FALSE.
Вещественные значения выводятся в экспоненциальной форме (с буквой E). Строки выводятся "как есть". После вывода работа программы продолжается со следующего оператора.
Оператор writeln отличается от write лишь тем, что после вывода значения последнего элемента списка выполняется перевод курсора на следующую строку экрана.
Примеры:
1) Нужно дать пользователю возможность ввести с клавиатуры число, затем программа возведет это число в квадрат и выведет результат на экран.
var a,a2:integer;
. . . .
writeln ('Введите целое число:'); {это приглашение к вводу!}
read (a);
a2:=sqr(a);
writeln ('Квадрат числа=',a2);
Если ввести a=2, на экране будет напечатано
Квадрат числа=4
| ---курсор на следующей строке
После вывода результата выполнение программы продолжится, а если оператор writeln был в ней последним, то и завершится. Чтобы пользователь успел прочитать результат, следует в конце программы добавить оператор
readln;
который будет ждать нажатия клавиши Enter.
2) Нужно вывести результаты решения квадратного уравнения x1=1.5 и x2=2.5
write ('x1=',x1,'_x2=',x2);
-пробел здесь нужен, чтоб значение x1 не слилось со строкой 'x2='
на экране будет напечатано:
x1= 1.5000000000E+00 x2= 2.5000000000E+00|
-курсор остался в конце строки, т.к. использован write!
Вещественные числа читать в подобной форме неудобно, для их вывода используйте решение из следующего пункта.