Технология нисходящего программирования. Подготовила: Камалова Нафиса Ахатовна, учитель информатики высшей квалификационной категории МАОУ «СОШ 5» МО «ЛМР» РТ г. Лениногорск, 2012 Решение экспериментальных задач
Из записной книжки программиста: Прежде чем написать программу, проверьте, существует ли компьютер, способный ее переварить.Прежде чем написать программу, проверьте, существует ли компьютер, способный ее переварить. Если, по-твоему, программа составлена правильно, это еще не значит, что с этим согласится машина.Если, по-твоему, программа составлена правильно, это еще не значит, что с этим согласится машина. Если программа заработала, не расстраивайся, долго это продолжаться не будет.Если программа заработала, не расстраивайся, долго это продолжаться не будет.
Из записной книжки программиста: Каждому программисту компьютер выдает то, что он заслуживает.Каждому программисту компьютер выдает то, что он заслуживает. Запрещается пользоваться аспирином, малиновым вареньем и горчичниками для понижения температуры перегревшегося компьютера.Запрещается пользоваться аспирином, малиновым вареньем и горчичниками для понижения температуры перегревшегося компьютера. Вкладывая в программу всю свою душу, не забывай, что ее еще будут эксплуатировать.Вкладывая в программу всю свою душу, не забывай, что ее еще будут эксплуатировать.
Вопросы для повторения: Что такое подпрограмма? Какие виды подпрограмм вы знаете?Что такое подпрограмма? Какие виды подпрограмм вы знаете? Запишите структуру процедуры.Запишите структуру процедуры. Что такое формальные и фактические параметры?Что такое формальные и фактические параметры? Как записывается вызов процедуры?Как записывается вызов процедуры? Запишите структуру функции.Запишите структуру функции. Как записывается вызов функции?Как записывается вызов функции?
Самостоятельная работа. Определите, какие числа (число) будут напечатаны в результате выполнения следующего алгоритма: 1 вариант 2 вариант Var x, y: byte; Procedure A1 (a: byte; Var b: byte); Var b: byte);Begin Writeln (a, b); Writeln (a, b); a:= a + 10; a:= a + 10; b := b + a; b := b + a; Writeln (a, b); Writeln (a, b);End;Begin x := 3; x := 3; y := 5; y := 5; Writeln (x, y); Writeln (x, y); A1 (x, y); A1 (x, y); Writeln (x, y); Writeln (x, y);End. Var a, b, t, M, R: Integer; Function F (x:Integer): Integer; Begin F := 4*(x-1)*(x-3); F := 4*(x-1)*(x-3);End;Begin a := -20; b := 20; a := -20; b := 20; M := a; R := F(a); M := a; R := F(a); For t := a To b Do For t := a To b Do Begin Begin If (F(t) < R) Then Begin If (F(t) < R) Then Begin M := t; M := t; R := F(t); R := F(t); End; End; End; Write (M); End. Ответ: x=3; y=18 Проверь себя! Ответ: М = 2 Проверь себя!
Основная идея технологии нисходящего программирования. Основой такой технологии является идея постепенной декомпозиции исходной задачи на ряд подзадач. Сначала формулируется самая грубая модель решения, отдельные детали которой на первом этапе могут быть довольно расплывчатыми. По мере разработки программ, разбивая наиболее неясные части алгоритма и добиваясь все более точных и детализированных формулировок, мы получаем более подробное решение.
Решение отдельного фрагмента сложной задачи может представлять собой самостоятельный программный блок, называемый подпрограммой. Такой процесс детализации продолжается до тех пор, пока не станут ясны все детали решения задачи. Такой процесс детализации продолжается до тех пор, пока не станут ясны все детали решения задачи.
В этом случае программу решения сложной задачи можно представить как иерархическую совокупность относительно самостоятельных фрагментов – подпрограмм.
Подпрограмма – обособленная, оформленная в виде отдельной синтаксической конструкции и снабженная именем часть программы.
В Паскале имеется два вида подпрограмм – процедуры и функции. Их структура похожа на структуру основной программы.
За наличие подпрограмм как средства структурирования программ язык программирования Turbo Pascal называется процедурно- ориентированным. Подпрограммы в Turbo Pascal реализованы посредством процедур и функций.
Различие процедур и функций Имея один и тот же смысл и аналогичную структуру, процедуры и функции различаются назначением и способом их использования.
Различие процедур и функций Процедура не может выступать как операнд (величина или выражение, над которым производится операция) в выражении.Процедура не может выступать как операнд (величина или выражение, над которым производится операция) в выражении. Упоминание имени процедуры в тексте программы приводит к активизации процедуры и называется ее вызовом.Упоминание имени процедуры в тексте программы приводит к активизации процедуры и называется ее вызовом.
Различие процедур и функций Функция аналогична процедуре, но имеет два отличия: 1) функция передает в точку вызова скалярное значение; вызова скалярное значение; 2) имя функции может входить в выражение как операнд. выражение как операнд. Например, функция Sqr(x) – возведет в квадрат значение целого числа или вещественного Х и возвратит в точку вызова вычисленное значение квадрата числа Х.
Различие процедур и функций Процедуры служат для задания совокупности действий, направленных на изменение внешней по отношению к ним программной обстановки.Процедуры служат для задания совокупности действий, направленных на изменение внешней по отношению к ним программной обстановки. Функции обязательно возвращают в точку вызова основной программы единственный результат как значение имени этой функции.Функции обязательно возвращают в точку вызова основной программы единственный результат как значение имени этой функции.
При вызове подпрограммы (процедуры или функции), определенной программистом, работа главной программы на некоторое время приостанавливается и начинает выполняться вызванная подпрограмма. Она обрабатывает данные, переданные ей из главной программы.
По завершении выполнения подпрограмма-функция возвращает главной программе результат (подпрограмма-процедура не возвращает явно результирующего значения).По завершении выполнения подпрограмма-функция возвращает главной программе результат (подпрограмма-процедура не возвращает явно результирующего значения). Передача данных из главной программы в подпрограмму и возврат результата выполнения функции осуществляется с помощью параметров.Передача данных из главной программы в подпрограмму и возврат результата выполнения функции осуществляется с помощью параметров.
Задача 1. Даны три натуральных числа x, y, z. Вычислить P = x! + 2y! – (x + z)! P = x! + 2y! – (x + z)! Использовать процедуру (или функцию), вычисляющую факториал заданного натурального числа. n! = 1*2*3* … *(n-1)*n.
Задача 1. Первый способ. Для решения используется подпрограмма-процедура. Вспомогательный алгоритм Основной алгоритм P := p * i i := 1, x, 1 Factorial (x, y) P := 1 Factorial (x, y) P := 1 i := 1, x, 1 P := 1 Начало Factorial (x, y) P := p * i i:= 1, x, 1 i := 1, x, 1 P := 1 Конец Ввод x, y, z P := 0 Factorial (x, p1) P := p +p1+2*p2-p3 Вывод P Конец Начало Ввод x, y, z P := 0 Начало Ввод x, y, z Factorial (x, p1) P := 0 Ввод x, y, z Factorial (x, p1) P := 0 Ввод x, y, z Factorial (x, p1) P := 0 Ввод x, y, z P := p +p1+2*p2-p3 Factorial (x, p1) P := 0 Ввод x, y, z P := p +p1+2*p2-p3 Factorial (x, p1) P := 0 Начало Вывод P Ввод x, y, z Конец P := p +p1+2*p2-p3 Factorial (x, p3) Factorial (x, p2) Factorial (x, p1) P := 0 Factorial (x, p) P := p * i i:= 1, x, 1 i := 1, x, 1 P := 1 Конец Factorial (x, p) P := p * i i:= 1, x, 1 i := 1, x, 1 P := 1 Конец
Задача 1. Program Ex_1; Var x, y, z: integer; P, p1, p2, p3: Longint; Procedure Factorial (x: integer; Var p: Longint); Var i: integer; Begin P:= 1; P:= 1; For i:= 1 To x Do p:= p*i For i:= 1 To x Do p:= p*iEnd;Begin Write (x=); Readln (x); Write (x=); Readln (x); Write (y=); Readln (y); Write (y=); Readln (y); Write (z=); Readln (z); Write (z=); Readln (z); P:=0; P:=0; Factorial (x, p1); Factorial (x, p1); Factorial (y, p2); Factorial (y, p2); Factorial (x + z, p3); Factorial (x + z, p3); P:= p+p1 + 2*p2 – p3; P:= p+p1 + 2*p2 – p3; Writeln (p=, p); Writeln (p=, p);Readln End.
Задача 1. Второй способ. Для решения используется подпрограмма-функция. Program Ex_2; Var x, y, z: integer; P, p1, p2, p3: Longint; Function Factorial (x: integer) : Longint; Var i: iInteger; p: Longint; Begin P:= 1; P:= 1; For i:= 1 To x Do p:= p*I; For i:= 1 To x Do p:= p*I; Factorial := p Factorial := pEnd;Begin Write (x=); Readln (x); Write (x=); Readln (x); Write (y=); Readln (y); Write (y=); Readln (y); Write (z=); Readln (z); Write (z=); Readln (z); P:=0; P:=0; P1 := Factorial (x); P1 := Factorial (x); P2 := Factorial (y); P2 := Factorial (y); P3 := Factorial (x + z); P3 := Factorial (x + z); P:= p+p1 + 2*p2 – p3; P:= p+p1 + 2*p2 – p3; Writeln (p=, p); Writeln (p=, p);Readln End.
Задача 2. Даны натуральные числа n и m, действительное число x. Вычислить: Для вычисления суммы использовать функцию Для вычисления суммы использовать функцию.
Решение: - обобщенная формула для суммы. Функция summa имеет пять формальных параметров: k, a, b, c, d –входные данные, i – промежуточная (локальная) переменная, z – результат. - i – ое слагаемое.
Задача 2. Первый способ. Для решения используется подпрограмма-функция. Вспомогательныйалгоритм Z := 0 Summa (k,a,c,d,b) i:= 1, k, 1 i := 1, k, 1 Конец Summa := z Z := 0 Основнойалгоритм Ввод n, m, x Начало Z1:= summa (n, 2, 1, 2, x) Z2:= summa (m, 1, 5, 3, x) Z:= z1 + z2 Вывод z Конец Ввод n, m, x
Задача 2. Первый способ. Для решения используется подпрограмма-функция. Program Ex_3; Var n, m: integer; X, z, z1, z2: real; Function summa (k, a, c, d: integer; x: real): Real; Var i: integer; z: real; Begin z:= 0; z:= 0; For i:= 1 To k Do For i:= 1 To k Do z:= z+(a*b+c)/ (sqr (i)+d); z:= z+(a*b+c)/ (sqr (i)+d); Summa:= z Summa:= zEnd; Begin Begin Write (n,m,x); Readln (n,m,x); Write (n,m,x); Readln (n,m,x); z1:= summa(n,2,1,2,x); z1:= summa(n,2,1,2,x); z2:= summa(m,1,5,3,x); z2:= summa(m,1,5,3,x); z:= z1+z2; z:= z1+z2; Writeln (z=, z:8:1); ReadlnEnd.
Задача 2. Второй способ. Для решения используется подпрограмма-процедура. Program Ex_4; Var n, m: integer; x, z, z1, z2: real; Procedure summa (k, a, c, d: integer; x: real; var z: real); Var i: integer; Begin z:= 0; z:= 0; For i:= 1 To k Do For i:= 1 To k Do z:=z+(a*x+c)/(sqr (i) + d); z:=z+(a*x+c)/(sqr (i) + d);End; Begin Begin Write ('n,m,x'); Readln (n,m,x); Write ('n,m,x'); Readln (n,m,x); summa(n,2,1,2, x, z1); summa(n,2,1,2, x, z1); summa(m,1,5,3, x, z2); summa(m,1,5,3, x, z2); z:=z1+z2; z:=z1+z2; Writeln ('z=', z:8:1); Readln End.
Выводы: Использование подпрограмм позволяет, сосредоточив в них подробное описание некоторых операций, в остальной программе только указывать имена подпрограмм, чтобы выполнить эти операции.Использование подпрограмм позволяет, сосредоточив в них подробное описание некоторых операций, в остальной программе только указывать имена подпрограмм, чтобы выполнить эти операции. Такие вызовы подпрограммы возможны неоднократно из разных участков программы, причем при вызове подпрограммы можно передать некоторую информацию.Такие вызовы подпрограммы возможны неоднократно из разных участков программы, причем при вызове подпрограммы можно передать некоторую информацию. Использование подпрограмм уменьшает объем используемой памяти компьютера.Использование подпрограмм уменьшает объем используемой памяти компьютера. Использование подпрограмм не только улучшает структуру и внешний вид программы, но и уменьшает вероятность появления ошибок и облегчает отладку программы.Использование подпрограмм не только улучшает структуру и внешний вид программы, но и уменьшает вероятность появления ошибок и облегчает отладку программы.
Домашнее задание. Задача. Составить программу, которая вычисляет значение функции при следующих значениях х = -5, -4.5, -4, …, 1, 1.5, 2.