Л_8_9Алгоритмизация_2012_белый.ppt
- Количество слайдов: 47
Алгоритмизация задач 16. 02. 2018 1
Этапы решения задач на ЭВМ. 1. Постановка задачи определяется цель решения задачи. Задача формулируется на уровне профессиональных понятий (д. б. понятна пользователю). Ошибка в постановке задачи, обнаруженная на последующих этапах, приводит к тому, что работа над задачей начинается сначала. Пример. Найти площадь треугольника по заданным сторонам a, b, c 2. Математическая формулировка задачи Разрабатывается мат. модель решаемой задачи: a) осуществляется формализация задачи путем описания ее с помощью формул; b) определяется перечень исходных данных и получаемых результатов, начальные условия, точность вычисления и т. д. Пример. 16. 02. 2018 2
2. Выбор численного метода решения. В ряде случаев одна и та же задача может быть решена с помощью различных численных методов. Выбор определяется многими факторами: временем решения, точностью и т. д. 4. Разработка алгоритма решения задачи. 5. Написание программы. 6. Ввод программы и исходных данных. 7. Отладка и тестирование программы. 8. Решение задачи на ЭВМ. 9. Анализ результатов. 16. 02. 2018 3
4. Разработка алгоритма решения задачи. Слово «алгоритм» появилось в результате искаженного перевода с арабского на европейские языки имени узбекского ученого IX века Аль Хорезми Алгоритм – некоторая конечная последовательность правил, определяющая процесс преобразования исходных и промежуточных данных в результат решения задачи. 16. 02. 2018 4
Свойства алгоритма. Алгоритм имеет ряд обязательных свойств, отличающих его от других предписаний и обеспечивающих его автоматическое выполнение. • Массовость алгоритм позволяет решать не одну задачу, а целый класс задач • Детерминированность однозначно определяет выполняемые действия (при одинаковых исходных данных промежуточные и окончательные результаты разных пользователей будут одинаковыми) • Результативность позволяет получать результат после конечного числа шагов • Дискретность предусматривает разбиение процесса обработки информации на более простые этапы (шаги выполнения), выполнение которых человеком или компьютером не вызывает затруднений 16. 02. 2018 5
Способы задания алгоритмов • Словесный предполагает описание алгоритма без формул и таблиц. Этим способом можно описывать алгоритмы с любой степенью детализации. • Формульнословесный более компактный. В нем словесные описания сочетаются с формулами. • Табличный предполагает представление алгоритма в виде таблицы решений и в основном носит вспомогательный характер. • Графический 16. 02. 2018 Схема алгоритмов представляет собой последовательность блоков, предписывающих выполнение определенных действий, и связи между ними 6
Графический способ описания алгоритмов Наименование Процесс Решение Модификация Предопределенный процесс Обозначение Функции Вычислительное действие или последовательность вычислительных действий Проверка условия и выбор направления выполнения алгоритма Начало цикла Вычисление по подпрограмме Вводвывод данных на монитор Дисплей 16. 02. 2018 7
Наименование Обозначение Функции Безотносительный ввод-вывод Данные Вывод на принтер Документ Пуск-останов Начало и конец обработки данных Соединитель Указание связи между прерванными линиями Комментарий 16. 02. 2018 Связь между элементами схемы и пояснениями 8
Основные структуры алгоритмов • Основные структуры алгоритмов – это ограниченный набор блоков и стандартных способов их соединения для выполнения типичных последовательностей действий. • Структурный подход предполагает использование только нескольких основных структур, комбинация которых дает все многообразие алгоритмов и программ. По управлению вычислительным процессом структуры алгоритмов бывают: 1. Линейные 2. Разветвляющиеся 3. Циклические 4. Со структурой вложенных циклов 5. Комбинированные 16. 02. 2018 9
Понятие переменной Переменная – программный объект, обладающий именем и значением, которое может быть получено и изменено программой. При составлении алгоритмов следует знать, что для каждой переменной выделяется ячейка, которая обладает свойствами: • к началу выполнения программы содержимое всех ячеек считается неопределенным (в частности, их нельзя считать и пустыми); • значение в ячейку заносится оператором присваивания (: =)и хранится до тех пор, пока в эту ячейку не будет помещено новое значение, при этом предыдущее значение уничтожается; • в ячейке хранится одно значение; • ячейка способна хранить значения только одного и того же типа. Попытка поместить значение другого типа расценивается как ошибка в программе; • значение ячейки может быть использовано многократно, при этом содержимое ячейки не меняется (выдается копия). 16. 02. 2018 10
Чтобы переменную использовать в программе, ее надо предварительно описать, указав 4 характеристики • Имя переменной (идентификатор) -последовательность английских букв, цифр, символов подчеркивания и не начинающаяся с цифры • Тип определяет, какая информация хранится в данной переменной (число, логическая переменная, символ, строка и т. д. ), а также операции, которые можно над ней выполнять. Согласно типу отводится объем памяти для хранения. • Каждая единица информации хранится в ячейке памяти, имеющей адрес. Понятие переменной позволяет отвлечься от конкретного адреса и обращаться к содержимому памяти с помощью имени. • Значение переменной Имя real 12. 34 Адрес 16. 02. 2018 Тип Значение Пример alpha $1000: $2 A 34 11
После описания переменной к ней можно обращаться, но она имеет неопределенное значение. Переменную можно применять т. и т. т. , когда ей задано определенное значение либо в результате выполнения оператора присваивания , либо оператора ввода. Оператор присваивания имеет две части – левую (имя переменной) и правую (выражение), соединенные знаком присваивания (: =). Оператор присваивания • вычисляет значение правой части; • записывает вычисленное значение в переменную, указанную слева. alpha: = 12. 34; f: =b*2+c; b 1: =b 1 -5; Оператор ввода • Заполняет ячейки памяти с клавиатуры • делает программу более универсальной (массовой), т. к. дает возможность решать одни и те же задачи для разных значений переменных: Write(‘Введи число alpha : ’); readln(alpha); 16. 02. 2018 12
I. Алгоритмы линейной структуры (следование) Алгоритмы линейной структуры - это алгоритмы, в которых все действия выполняются последовательно друг за другом (в естественном порядке). Пример. Найти S треугольника по заданным begin сторонам a, b, c. Численный метод: формула Геррона a, b, c P: =(a+b+c)/2 S p, S end 16. 02. 2018 uses crt; var a, b, c : real; p, S : real; begin clrscr; write('Введите числa a, b, c: '); readln(a, b, c); p: =(a+b+c)/2; S: =sqrt(p*(p-a)*(p-b)*(p-c)); writeln(‘p=', p: 5: 2, ’S=’, S: 5: 2); end. 13
Элементы программирования 16. 02. 2018 14
II. Алгоритмы разветвляющейся структуры a)Разветвление – алгоритмы, в которых в зависимости от выполнения некоторого условия вычислительный процесс должен идти по одной или другой ветви. Пример. Вычислить 1/xy b) Обход - это частный случай разветвления, когда одна из ветвей не содержит никакого действия. c) Множественный выбор. Является обобщением разветвления, когда в зависимости от значения переменной (I) выполняется одно из нескольких действий (Д 1, Д 2 , . . . , Дn). 16. 02. 2018 Условие действие 1 действие 2 Условие действие 1 I Д 1 Д 2 …. Дn 15
Условный оператор имеет две формы: полную и короткую. Полная форма (ветвление) if<логич. выражение>then<команда 1>else<команда 2>; • Действие команды. Если логическое выражение истинно, то выполняется команда 1, в противном случае – команда 2. Команды 1 и 2 могут быть простыми или составными. Короткая форма (обход) if<логич. выражение>then<команда 1>; • Действие команды. Если логическое выражение истинно, то выполняется команда 1, иначе выполняется команда, которая находится после данной конструкции.
Пример. (Разветвление) Даны два действительных числа x, y. Вычислить t=1/(xy). begin x, y xy=0 t: =1/(xy) x, y uses crt; var x, y : real; t : real; begin clrscr; + write('Введите числa x, y: '); readln(x, y); if x*y =0 then writeln(' Деление на 0 ') else begin ‘Деление на 0’ t: =1/(x*y); writeln(‘t=', t: 5: 2); end. 16. 02. 2018 17
Пропустить. Пример. (Разветвление) Даны два действительные числа. Большее число заменить их uses crt; суммой, а меньшее их удвоенным произведением. begin x, y a: =x b: =y + - x>y x: =a+b y: =2 ab y: =a+b x: =2 ab x, y end. 16. 02. 2018 var x, y : real; a, b : real; begin clrscr; write('Введите числa x, y: '); readln(x, y); a: =x; b: =y; if x>y then begin x: =a+b; y: =2*a*b end else begin y: =a+b; x: =2*a*b end; writeln('x=', x: 5: 2, ’y=’, y: 5: 2); end. 18
Пример. (Обход). Даны два действительные числа. Найти наименьшее из них. begin x, y z: =x + z>y z: =y z end. 16. 02. 2018 uses crt; var x, y : real; z: real; begin clrscr; write('Введите числa x, y: '); readln(x, y); z: =x; if z>y then z: =y; writeln(‘z=', z: 5: 2); end.
Множественный Если значение выражения выбор. совпадает с некоторым В Паскале множественному выбору соответствует команда выбора case: значением из i-го списка, то case <выражение> of выполняется команда с <список значений 1> : <команда 1>; номером i, а другие команды. . . этой конструкции <список значений i> : <команда i>; игнорируются. . . <список значений n> : <команда n> else <команда n+1> end; Список значений перечисляется через запятую. Короткая форма команды case не содержит else - часть. Если значение <выражения> <выражение> –переменная одного из типов не совпадает ни с одним значением из любого списка, целого, то выполняется команда n+1; символьного, в случае перечислимого, короткой формы – следующая логического типа; команда после <списки значений> - константы, case. которых совпадает с типом тип <выражения>. 16. 02. 2018 20
Пример. Дано целое i (1≤i≤ 99), где i означает число лет. Напечатать фразу: «Мне i лет (год, года)» begin i - i<=14 и i>=11 + z=i mod 10 . 9 , 5. 0 z ‘Мне’, i, ‘лет’ 16. 02. 2018 ‘Мне’, i, ‘лет’ 2, 4 1 ‘Мне’, i, ‘год’ end. ‘Мне’, i, ‘года’ uses crt; var i, z : byte; begin clrscr; write('Введите число i: '); readln(i); if (i<=14) and(i>11) then writeln('Мне ', i, ' лет' ) else begin z: = i mod 10; case z of 0, 5. . 9: writeln('Мне ', i, ' лет' ); 1 : writeln('Мне ', i, ' год'); 2. . 4 : writeln('Мне ', i, ' года'); end; end. 21
III. Алгоритмы циклической структуры Алгоритм циклической структуры – это алгоритм, содержащий многократно выполняемые группы действий, называемые циклами. Каждый этап выполнения цикла имеет номер и называется шагом или итерацией Группа повторяющихся действий на каждом шаге цикла называется телом цикла. С алгоритмической точки зрения различают виды циклов: – арифметические с заданным числом шагов ( «строгий цикл» ); – итерационные с неизвестным числом повторений число шагов может меняться в зависимости от значений параметров, из которых формируется условие повторения цикла. 16. 02. 2018 22
Стандартные циклические структуры Арифметические a) for-цикл - цикл с параметром ; Начальные значения Заголовок цикла Тело цикла . . . Итерационные b)while-цикл - цикл с предусловием; c) repeat-цикл с постусловием Начальные значения Условие повторения цикла + Тело цикла - Условие выхода из цикла + 16. 02. 2018 . . . 23
Цикл с параметром (for-цикл). В Паскале есть два вида команды for. Графическая схема <параметр>, <выражение 1> , <выражение 2> могут иметь целый, символьный, логический или перечислимый тип; Начальные значения Заголовок цикла Тело цикла . . . for <параметр>: =<выраж. 1> to <выраж. 2> do for <параметр>: =<выраж. 1> downto <выраж. 2> do <команда 1> где <параметр> - переменная цикла; <выражение 1> - стартовое значение параметра; <выражение 2> - конечное значение параметра; <команда 1> - тело цикла. Если тело цикла содержит несколько операторов, то используется составная команда. 16. 02. 2018 24
for <параметр> : =<выраж. 1> to <выраж. 2> do <команда 1>; Действие команды: 1) выполняется оператор присваивания: 1. <параметр> : =<выражение 1> 2) выполняется проверка условия <параметр> ≤ <выражение 2> а) если условие имеет значение true, то v v v выполняется тело цикла готовится очередная итерация: параметр автоматически увеличивается на 1 повторяется пункт 2; б) если условие имеет значение false, то цикл завершается, управление передается следующему оператору. Замечания. 1) Не корректно изменять <параметр> в теле цикла. 2) После цикла переменная цикла считается неопределенной. 3) Циклы вида игнорируются. for i : =5 to 4 do <команда 1>; 16. 02. 2018 25
for <параметр> : =<выраж. 1> downto <выраж. 2> do <команда 1>; Действие команды: 1) выполняется оператор присваивания: 2) выполняется проверка условия <параметр> : =<выражение 1> ≥ <выражение 2> а) если условие имеет значение true, то v v v выполняется тело цикла готовится очередная итерация: параметр автоматически уменьшается на 1 повторяется пункт 2; б) если условие имеет значение false, то цикл завершается, управление передается следующему оператору. Замечания. 1) Не корректно изменять <параметр> в теле цикла. 2) После цикла переменная цикла считается неопределенной. 3) Циклы вида 16. 02. 2018 for i : =4 downto 5 do <команда 1>; игнорируются. 26
while <логическое выражение> do <команда 1> ; Действие команды: 1) условие продолжения цикла: <логическое выражение > = true; условие выхода из цикла : <логическое выражение> = false, 2) если перед первой итерацией <логическое выражение> = false, то цикл не выполняется; 3) <команда 1> может быть записана как составная команда; 4) вечный цикл : while true do; repeat <команды> until <логическое выражение>; 1) цикл стартует сразу и выполняется по крайней мере один раз; 2) repeat открывает, until закрывает цикл. Между ними может находится более одного оператора; 3) условие продолжения цикла: <логическое выражение > = false; условие выхода из цикла : <логическое выражение > = true; 4) вечный цикл : repeat until false; 16. 02. 2018 27
Важные замечания. 1) <логическое выражение> должно содержать корректные выражения и значения. Они определяются в программе до проверки условия; 2) цикл должен иметь шанс когда-нибудь завершиться содержимое тела цикла должно влиять на <логическое выражение> 3) для безопасности рекомендуется писать тело цикла так, чтобы оператор, влияющий на изменение <логического выражения>, был последним в цикле. 4) тело цикла может содержать другие циклы (структура вложенных циклов); 16. 02. 2018 28
Стандартные алгоритмы циклической структуры 16. 02. 2018 29
Вычислить Y=n! =1*2*…*n. Блок схема begin n Y: =1 i: =1, n Y: =Y*i i<= n + Y: =Y*i i: =i+1 - i>n + Y Y Y end. 16. 02. 2018 end. 30
Пример. Вычислить Y=n! =1*2*…*n. Программа uses crt; var n, i, : byte; y : longint; begin clrscr; write('Введите n: ’); readln(n); y: =1; for i: =1 to n do y: =y*i; writeln(‘n!=‘, y); end. 16. 02. 2018 uses crt; var n, i, : byte; y : longint; begin clrscr; write('Введите n: ’); readln(n); y: =1; i: =1; while i<= n do begin y: =y*i; i: =i+1 end; writeln(‘n!=‘, y); end. uses crt; var n, i, : byte; y : longint; begin clrscr; write('Введите n: ’); readln(n); y: =1; i: =1; repeat y: =y*i; i: =i+1 until i>n; writeln(‘n!=‘, y); end. 31
Пример. Дано целое n. Найти минимальное из uses crt; a 1, a 2, …, an. чисел begin n, a y: =a i: =2, n a + y>a y: =a var n, i : byte; a, y : real; begin clrscr; write('Введите n – число элементов: ); readln(n); write('Введите a– 1 -й элемент: '); readln(a); y: =a; for i: =2 to n do begin write('Введите a–‘, i, ’-й элемент: '); readln(a); if y>a then y: =a; end; writeln('y=', y: 5: 2 ); end. y end. 16. 02. 2018 32
• В процессе решения задачи некоторая переменная Р может изменять свои значения, но в любой момент в памяти хранится только одно - последнее значение. • Изменение значения происходит по правилу, которое формулирует программист из условия задачи: P: =f(P) (новое значение получено преобразованием старого). Например, • Y: =Y+1; • F: =F*X; • X: =N*X+1/N 16. 02. 2018 33
Пример. Накопление суммы. Вычислить • • • Если необходимо накопить сумму значений некоторой функции при различных значениях аргумента, организуют цикл, в котором необходимо: Ø вычислять значение функции; Ø накапливать сумму путем прибавления полученного значения к сумме предыдущих слагаемых. Поскольку запоминать все значения функции и промежуточные суммы нет необходимости, целесообразно для накопления суммы использовать формулу S: =S+y, (где у - очередное слагаемое). Операция присваивания означает, что вычисляемое значение выражения S+y присваивается переменной S, как новое ее значение. Если перед циклом задать начальное значение S=0, то Ø после первого выполнения цикла S будет равно первому слагаемому, Ø после второго - сумме первого и второго и т. д. , Ø после окончания цикла S будет равно сумме всех вычисленных слагаемых. 16. 02. 2018 34
Пример. begin a, b S: =0 i: =a, b x S: =S+x/i S end. 16. 02. 2018 uses crt; var x : real; S : real; a, b, i : byte; begin clrscr; write('Введите границы суммирования a, b: ’); readln(a, b); S: =0; for i: =a to b do begin write('Введите x–‘, i, ’-й элемент: '); readln(x); S: =S+x/i end; writeln(‘S=', S: 5: 2 ); end. 35
Пример. Задача табулирования функции. Вычислить значения функции Z=sin(x)/x begin uses crt; при a<=х<=b с шагом : real; h. var a, b, h x, z x: =a x<= + b z: =sinx/x x, z x: =x+h end. 16. 02. 2018 : real; begin clrscr; write('Введите границы отрезка a, b: ’); readln(a, b); writeln('Введите шаг изменения х : h'); readln(h); x: =a; while x<=b do begin z: =sin(x); writeln('При х=', x, 'функция z =', z); x: =x+h end; end. 36
Пример. Схема Горнера. Вычислить значение многочлена Выполним преобразования у=а 1 x n + a 2 x nn-1 a +. . . + x + + a a n a x a n+1 = в y=а 1 x + 2 x n-1 n n+1 заданной точке х 1 x+a 2)x+. . . + a n) x + a n+1 = (. . . (a y=3 x 3 -5 x 2 +4 x -7 = (3 x 2 -5 x+4) x -7= ((3 x-5)x+4) x -7 ØОбозначим выражениево внутренних скобках через y выражение в следующих скобках можно вычислить по формуле y: =y*x+a ØНачальное значение У =0 y=(((0*x+3)х-5)x+4) x -7 ØЗначение многочлена получается после выполнения цикла n+1 раз ØЕсли многочлен не содержит элементов с некоторыми степенями, то соответствующие коэффициенты равны 0. ØАлгоритм м. б. применен для перевода чисел из произвольной системы счисления в десятичную. 16. 02. 2018 37
Пример. Схема Горнера begin n, x Y: =0 i: =1, n+1 a Y: =Y*x+a Y end. 16. 02. 2018 uses crt; var x, a : real; y : real; n, i : byte; begin clrscr; write('Введите степень многочлена n: ’); readln(n); writeln('Введите точку х='); readln(x); y: =0; for i: =1 to n+1 do begin write('Введите коэффициент а[', i , '] : '); readln(a); y: =y*x+a; end; writeln('Значение многочлена в точке x = ', x, ' равно ', y: 4: 2); end. 38
Пример. Вычисление суммы бесконечного ряда. Не используя стандартные функции (за исключением abs), вычислить с точностью eps>0 y=ex=1+x/1!+x 2/2!+. . . +xn/n!+. . . Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps, - все последующие слагаемые можно уже не учитывать. 16. 02. 2018 39
1. begin 2. x, - abs(x)<= 1 + k: =0; d: =1 S: =1 3. - «Ряд расходится» d> + k: =k+1 d: =d*x/k S: =S+d d 4. Организуется цикл с неизвестным числом повторений. Выход из цикла осуществляется по достижению требуемой точности. При вычислении любого члена ряда с номером k используется прием накопления произведения d=d*x/k Для вычисления результата используется прием накопления суммы S=S+d k, S 16. 02. 2018 40 End.
uses crt; var x, e : real; d , s : real; k : byte; begin clrscr; writeln('Введите точность вычислений: E'); readln(e); writeln('Введите х '); readln(x); if abs(x)<=1 then begin k: =0; d: =1; s: =1; while d>e do begin k: =k+1; d: =d*x/k; s: =s+d; end; writeln('Для значения k=', k , ' Сумма = ', S: 2: 7); end else writeln('Для значения x=', x: 2: 7 , ' ряд расходится') end. 16. 02. 2018 41
Домашнее задание Нахождение наибольшего (наименьшего) значения вычисляемой функции. 16. 02. 2018 42
for <параметр> : =<выражение 1> to <выражение 2> do <команда 1>; Действие команды: Графическая схема Начальные значения Заголовок цикла Тело цикла Следующий оператор 16. 02. 2018 1) параметру цикла присваивается значение <выражения 1> <параметр> : =<выражение 1> 2) выполняется проверка <параметр> ≤ <выражение 2> а) если условие имеет значение true, то v выполняется очередной шаг цикла; v параметр автоматически увеличивается на 1 v повторяется пункт 2; б) если условие имеет значение false, то v цикл завершается v управление передается следующему оператору. Замечания. 1) Цикл for i : =5 to 4 do <команда 1>; игнорируется. 2) Не корректно изменять <параметр> в теле цикла. 3) После цикла переменная цикла считается неопределенной. 43
for <параметр> : =<выражение 1> > downto <выражение 2> do <команда 1>; Графическая схема Начальные значения Заголов ок цикла Тело цикла . . . 16. 02. 2018 Действие команды: 1) параметру цикла присваивается значение <выражения 1> <параметр> : =<выражение 1> 2) выполняется проверка <параметр> ≥ <выражение 2> а) если условие имеет значение true, то § выполняется очередная итерация цикла (т. е. операторы, составляющие тело цикла); § значение параметра автоматически уменьшается на 1 и повторяется пункт 2; б) когда значение <параметра> станет меньше, чем <выражение 2>, то цикл завершается, и управление передается следующему за циклом оператору. Замечания. 1) Цикл for i : =4 down to 5 do <команда 1>; игнорируется. 2) Не корректно изменять <параметр> в теле цикла. 3) После цикла переменная цикла считается неопределенной. 44
while <логическое выражение> do <команда 1> ; Действие команды: 1) <логическое выражение> должно содержать корректные выражения и значения, которые определяются в программе до первого выполнения тела цикла; 2) пока значение логического выражения истинно, выполняется <команда 1> (истинное логическое выражение определяет условие продолжения цикла); 3) если <логическое выражение> перед первой итерацией принимает значение ложь, то цикл вообще не выполняется; 4) если после do должно быть выполнено несколько операторов, то используется составная команда; 5) тело цикла может содержать другие циклы (имеет структуру вложенных циклов); 6) цикл должен иметь шанс когда-нибудь завершиться, т. е. содержимое его тела должно влиять на <логическое выражение> 7) вечный цикл : while true do; 8) для безопасности рекомендуется писать тело цикла так, чтобы оператор, влияющий на изменение <логического выражения>, был последним в цикле. 16. 02. 2018 45
repeat <команды> until <логическое выражение>; Действие команды: 1) <логическое выражение> должно содержать корректные выражения и значения, которые определяются в программе до проверки условия; 2) пока значение логического выражения ложно, выполняются <команды>, составляющие тело цикла. (Истинное логическое выражение определяет условие выхода из цикла); 3) цикл repeat выполняется по крайней мере один раз; 4) repeat открывает, until закрывает цикл. Между ними может находится более одного оператора; 5) тело цикла может содержать другие циклы (имеет структуру вложенных циклов); 6) цикл должен иметь шанс когда-нибудь завершиться, т. е. содержимое его тела должно влиять на <логическое выражение> 7) вечный цикл : repeat until false; 8) для безопасности рекомендуется писать тело цикла так, чтобы оператор, влияющий на изменение <логического выражения>, был последним в цикле. 16. 02. 2018 46
Вычислить Y=n! =1*2*…*n begin n Y: =1 i: =1, n Y: =Y*i i<= n + Y: =Y*i i: =i+1 - i>n + Y Y Y end. 16. 02. 2018 end. 47


