6 алгоритмы.ppt
- Количество слайдов: 28
Алгоритмизация и программирование Развитие языков программирования Алгоритм и его свойства Основные алгоритмические структуры
История развития языков программирования 20 -е годы ХIХ века - революционная идея Ч. Бэббиджа о предварительной записи порядка действий машины при автоматической реализации вычислений – программе. Бэббидж использовал запись программ на перфокартах, придуманную французским изобретателем Жозефом Жаккаром для управления ткацким станком. Ада Лавлейс теоретически разработала некоторые приёмы управления последовательностью вычислений и описала одну из важнейших конструкций любого языка программирования – цикл. ХХ век (первая половина) – появление системы кодирования машинных команд с помощью специальных символов, предложенная Дж. Моучли (Пенсильванский унив) Грейс Мюррей Хоппер (1906 -1992) – «третий в мире программист первого в мире большого цифрового компьютера» . Компьютер становится переводчиком с языков программирования на машинный код: подпрограммы (1944), отладка (debugging), компилятор (1951 г), язык программирования близкий к обычному английскому. Cobol – Common Business Oriented Laguage. Компилятор Хоппер осуществлял функцию объединения команд и в ходе трансляции производил организацию подпрограмм, выделение памяти компьютера, преобразование команд высокого уровня в машинные коды.
Середина 50 -х годов – стремительный прогресс: появление языков программирования нового типа (посредник между машиной и человеком). 1954 г IBM: Фортран (переводчик формул) 1964 г: BASIC (универсальный символический код для начинающих), Томас Курц и Джон Кемени Впоследствии число языков высокого уровня превысило 3 000, но в практической деятельности используется не более 20. В 60 -е годы предпринимались попытки создания универсального языка программирования: PL/1 (1967), Алгол-68. «Всеохватность» языка приводила к неоправданной сложности конструкций, неэффективности компиляторов. Выбор языка программирования определяется: удобностью для пользователя, пригодностью для конкретного компьютера и конкретной задачи: Бейсик – простые программы; Фортран – классический язык при решении математических и инженерных задач; Кобол – задумывался как основной язык для массовой обработки данных в сфере управления и бизнеса; ЛОГО – для обучения программированию школьников (Сеймур Пейперт); Пролог – создание систем искусственного интеллекта; Алгол – запись алгоритмов, строящихся в виде последовательности процедур, применяемых для решения поставленных задач.
В начале 70 -х: Паскаль (Николаус Вирт), Турбо-Паскаль (Филип Кан). 1975 -79 гг: АДА, прямой наследник языка Паскаль, предназначен для создания и длительного сопровождения больших программных систем. Допускает возможность параллельной обработки, управления процессами в реальном времени и др. , чего трудно или невозможно достичь средствами более простых яз. 1972 г: первая версия Си. Сочетает в себе черты как языка высокого уровня, так и машинно-ориентированного языка, допуская программиста ко всем машинным ресурсам, чего нет в Бейсике и Паскале. программирование непроцедурное операциональное: Ассемблеры, Фортран, Бейсик, Си структурное: Паскаль, Модула объектное: С++, Делфи, Смолток декларативное Логическое: Пролог Функциональное: Лисп
Классическое операциональное и/или процедурное программирование: детальное описание того, как решить задачу (формулирование алгоритма и его специальная запись). Ожидаемые свойства результата обычно не указываются. Основные понятия: оператор и данные. При процедурном подходе операторы объединяются в группы – процедуры. Непроцедурное программирование. Объектно-ориентированный язык создаёт окружение в виде множества независимых объектов. При использовании декларативного языка программист указывает исходные информационные структуры, взаимосвязи между ними и то, какими свойствами должен обладать результат (алгоритм его получения не строится). В этих языках отсутствует понятие «оператор» .
Языки программирования высокого уровня Язык программирования – это формальный язык специально созданный для общения человека с компьютером. Алфавит – фиксированный для данного языка набор основных символов, допускаемых для составления программы на этом языке. Синтаксис – система правил, определяющих допустимые конструкции языка из букв алфавита. Семантика – система правил однозначного толкования отдельных языковых конструкций, позволяющих воспроизвести процесс обработки данных. Понятие языка – некоторая синтаксическая конструкция и определяемые ею свойства программных объектов или процесса обработки данных. Понятия языка определяются взаимодействием синтаксических и семантических правил: операторы, идентификаторы, переменные, функции и процедуры, модули и пр. В отличие от естественных языков правила грамматики и семантики должны быть сформулированы явно, однозначно и чётко.
Языки «низкого уровня» - машинно-ориентированные языки: - машинная команда записывается с помощью двух символов (0 и 1); - каждая ЭВМ имеет ограниченный набор машинных операций, ориентированных на структуру процессора. Языки программирования, имитирующие естественные языки, обладающие укрупнёнными командами, ориентированными на решение прикладных содержательных задач, называются языками «высокого уровня» . Достоинства языков высокого уровня: - алфавит языка значительно шире машинного, что значительно повышает наглядность и понятность текста; - набор операций не зависит от набора машинных операций, а выбирается из соображений удобства формулирования алгоритмов решения задач определённого класса; - конструкции команд (операторов) отражают содержательные виды обработки данных и задаются в удобном для пользователя виде; - используется аппарат переменных и действия с ними; - поддерживается широкий набор типов данных. Языки программирования высокого уровня являются машиннонезависимыми и требуют использования соответствующих программпереводчиков (трансляторов) для представления программы на языке машины, на которой она будет использоваться.
Аль-Хорезми (IX век) algorithmi - сформулировал правила выполнения арифметических операций. Первоначально под алгоритмом понимали только правила выполнения 4 -х арифметических действий над многозначными числами. Алгоритм – это строго детерминированная последовательность действий, описывающая процесс преобразования объекта из начального состояния в конечное, записанная с помощью понятных исполнителю команд. Наличие алгоритма формализует процесс решения задачи. Например: процесс редактирования текста. Исполнитель алгоритма – объект, выполняющий операции. Свойства алгоритма • Дискретность: разделение информационного процесса в алгоритме на отдельные элементарные команды; • Понятность: использование команд, входящих в Систему команд исполнителя; • Детерминированность: заранее определённая последовательность выполнения команд. Предписания, входящие в алгоритм должны быть точными и понятными; • Результативность: алгоритм должен обеспечивать преобразование объекта из начального состояния в конечное за конечное число шагов; • Массовость. Алгоритм должен быть пригоден для решения всех задач данного типа;
Формальное выполнение алгоритма Алгоритм позволяет формализовать выполнение информационного процесса Представление информационного процесса в форме алгоритма позволяет поручить его автоматическое исполнение различным техническим устройствам. Компьютер – автоматический исполнитель алгоритмов. Алгоритм, записанный на «понятном» компьютеру языке программирования, называется программой.
Блок-схема – это ориентированный граф, указывающий порядок исполнения команд алгоритма - начало и конец алгоритма - обработка данных (операция присваивания) - ввод/вывод данных - решение (оператор условного перехода). - цикл (подготовка), организация циклического процесса
Основные алгоритмические структуры: • следование • ветвление • цикл: - цикл с предусловием (цикл-ПОКА); - цикл с постусловием (цикл-ДО); - цикл с заданным числом повторений (с параметрами)
Основные алгоритмические структуры: следование, ветвление, цикл. Начало ввод: v 1, v 2, v 3, t 1, t 2, t 3 S 1: = v 1*t 1 S 2: = v 2*t 2 S 3: = v 3*t 3 S: = S 1+S 2+S 3 Вывод S Конец Линейный алгоритм – алгоритм, в котором действия выполняются по очереди, друг за другом. Линейный алгоритм не содержит проверок условий и повторений. Пример: Пешеход шёл по пересечённой местности. По равнине его скорость (v 1) составляла 1 км/час, в гору (v 2) – 2 км/час, под гору (v 3) – 3 км/час. Время движения соответственно t 1=1, t 2=2, t 3=3 часа. Какой путь (S) прошёл пешеход?
Начало ввод: v 1, v 2, v 3, t 1, t 2, t 3 Пример: Пешеход шёл по пересечённой местности. По равнине его скорость (v 1) составляла 1 км/час, в гору (v 2) – 2 км/час, под гору (v 3) – 3 км/час. Время движения соответственно t 1=1, t 2=2, t 3=3 часа. Какой путь (S) прошёл пешеход? S 1: = v 1*t 1 Var v 1, v 2, v 3, s 1, s 2, s 3, s: real; t 1, t 2, t 3: integer S 2: = v 2*t 2 S 3: = v 3*t 3 S: = S 1+S 2+S 3 Вывод S Конец begin writeln (‘введите скорость и время’); readln (v 1, v 2, v 3, t 1, t 2, t 3); s: =0; s 1: =v 1*t 1; s 2: =v 2*t 2; s 3: =v 3*t 3; s: =s 1+s 2+s 3; writeln (‘путь пешехода =’, s); end.
Ветвление (развилка) Ветвящимся называется алгоритм, в котором вычисления реализуются по одному из нескольких заранее предусмотренных условий Начало t; s: =1000; р: =5% нет да ЕСЛИ t>15 n=0 n=t*s*0, 05 Вывод n Конец Пример: вычислить размер пени за просрочку платежа. Срок погашения 15 число каждого месяца, сумма платежа 1000, пени начисляется 5% от суммы за каждый день просрочки.
Пример: вычислить размер пени за просрочку платежа. Срок погашения 15 число каждого месяца, сумма платежа 1000, пени начисляется 5% от суммы за каждый день просрочки. Var t, s: integer n, p: real; begin writeln (‘введите дату оплаты, сумму платежа, пени’); Начало readln (t, s, р); t; s: =1000; р: =5% нет n: =0; If t>15 then да ЕСЛИ t>15 n=0 begin n=t*s*0, 05 t: =t-15; n: =t*s*p; writeln (‘штраф =’, n); Вывод n Конец end else writeln (‘штрафа нет’); end.
Циклы цикл-ПОКА; цикл-ДО; цикл с заданным числом повторений Циклическим называется алгоритм, в котором выполнение действия повторяются с одними и теми же или модифицированными данными. Цикл с заданным числом повторений (цикл с параметром) В практических задачах обычно известны значения начальных и конечных изменяемых величин. Закон изменения и конечное число повторений. В таких случаях тело цикло выполняется заданное количество раз. Пример: вычислить сумму пяти чисел, введённых произвольно с клавиатуры s: =0 i: =1 до 5 х s: =s+i
Пример: вычислить сумму пяти чисел, введённых произвольно с клавиатуры s: =0 Program summa_5; Var i: =1 до 5 x, S, i: integer; Begin S: =0; For i: =1 to 5 do х begin write(‘Введите число ’); readln(x); s: =s+i S: =S+x; end; Writeln (‘S=‘, S); End. Введите 3 число Введите 5 число Введите 2 число Введите 9 число Введите 7 число 26
Цикл-ПОКА (с предусловием) Работа цикла продолжается пока выполняется условие (true). Если условие принимает значение false, цикл заканчивает работу. A>0 A: =A-1 Тело цикла может не выполняться ни разу, если условие, стоящее в начале цикла выполняется сразу.
Задача: Найти сумму цифр введенного целого числа Начало Var n, ost, s: integer; Begin n S: =0 - Program number; n>0 + ost: =n mod 10 Write(‘Введите число ‘); Readln (n); S: =0; n: =n div 10 s: =s+ ost; n: =n div 10; Writeln(‘S=‘, s); End. Конец 1354>0 begin End; S условия While (n>0) do ost: =n mod 10; s: =s+ ost n ost S Проверка 1354 4 4 135 0 135>0 5 9 13 13 1 0 13>0 3 1 12 S=13 1>0
Цикл-ДО (с постусловием) a: =в+1 a>в Тело цикла выполняется до тех пор, пока не будет выполнено условие. Этот цикл используют тогда, когда тело цикла должно быть выполнено хотя бы один раз.
Задача: Найти наибольший общий делитель двух целых чисел 18 и 48 (алгоритм Евклида). начало Program NOD; a , b - a > b Var a, b, NOD: integer; + Begin Write (‘Введите два числа ‘); b: =b-a a: =a-b Readln (a, b); repeat - a=b + if a>b then a: =a-b else b: =b-a; NOD: =a NOD а в 24 NOD 18 пров услов 24>18 6 6<18 12 6<12 6 6=6 6 конец Until (a=b); NOD: =a; Writeln (‘NOD=‘, NOD); End.
Чему будет равно значение переменной m после выполнения фрагмента программы: х: = 42; у: = 23 выбор при div(у, 7)=mod(x+1, 13): m: = 7 при div(у, 7)=mod(x, 13): m: = x+y div(у, 7)=mod(x-1, 13): m: = x при div – вычисляет результат целочисленного деления (без остатка); mod – вычисляет остаток от целочисленного деления иначе m=0 все m=65
Функция mod вычисляет остаток от деления нацело первого аргумента на второй. Значение переменной K после выполнения следующей программы: k: =0; нц для i от 1 до 100 если (mod(i, 3)=2) и (mod(i, 5)=1) то k: =k+1 все кц будет равно … 6 11, 26, 41, 56, 71, 86 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98
Что вычисляет следующий фрагмент программы ЕСЛИ Х < Y ТО ЕСЛИ X < Z ТО M : = X ИНАЧЕ M : = Z ВСЕ ИНАЧЕ ЕСЛИ Y < Z ТО M : = Y Находит наибольшее ИНАЧЕ M : = Z значение ВСЕ Задан фрагмент алгоритма: 1) если aa выполнить действия d=d+1, с=с-1 В результате выполнения данного алгоритма с начальными значениями a=8, b=3, переменные c и d примут значения. . . 1) c=5, d=0 2) c=10, d=1 3) c=8, d=2 4) c=-5, d=1
На рисунке представлен фрагмент алгоритма, имеющий _____ структуру циклическую с предусловием
В результате работы блок-схемы алгоритма переменные А и В примут значения А=1; В=1
Если А=15, то в результате выполнения алгоритма, значение переменной С будет равно начало Ввод А Х=1, С=0 С<=A да Х=Х*4 нет Вывод С С=С+Х конец 20
Выводы 1. Основа языков программирования была заложена в 19 веке Ч. Бэббиджем и Адой Лавлейс 2. Теоретическую основу современных языков программирования разработала Грейс Мюррей Хоппер, введя такие понятия как подпрограммы, отладка, компилятор и разработав язык, близкий к обычному английскому (Cobol). 3. Программирование можно разделить на процедурное (операциональное и структурное) и непроцедурное (объектное и декларативное: логическое и функциональное). 4. Язык программирования – это формальный язык специально созданный для общения человека с компьютером и имеющий алфавит, синтаксис, семантику, понятия языка. Правила грамматики и семантики должны быть сформулированы явно, однозначно и чётко 5. Языки «низкого уровня» - машинно-ориентированные языки, языки «высокого уровня» - это Языки программирования, имитирующие естественные языки, обладающие укрупнёнными командами, ориентированными на решение прикладных задач. 6. Алгоритм – это строго детерминированная последовательность действий, описывающая процесс преобразования объекта из начального состояния в конечное, записанная с помощью понятных исполнителю команд. 7. Алгоритм обладает следующими свойствами: дискретность, понятность, детерминированность, результативность, массовость. 8. Основные алгоритмические структуры: следование, ветвление, цикл (цикл с предусловием, цикл с постусловием, цикл с заданным числом повторений


