
Язык программирования Паскаль 2.ppt
- Количество слайдов: 54
Язык программирования Паскаль Операторы цикла. Обработка последовательностей 1
Повторение Указать значение величины s после выполнения команд: a: =2; b: =5; b: =b-a; s: =b+a l Четыре из приведенных ниже арифметических выражений соответствуют одной и той же формуле, а одно – другой формуле. Найти это «лишнее» выражение. 1/(V*T*Z)/(X*Y) X/Z/T/V*Y Y/V*X/Z/T (X*Y)/V/(T*Z) (X*Y)/(T*Z*V) l 2
Повторение l Найти выражение, тождественное выражению A or B: not (not A or not B) not A or not B (A > B) or (A < B) not (not A and not B and (C or not C)) (not A or B) and (B and not B). 3
Оператор выбора (варианта) Case Оператор варианта, который позволяет выбрать одну из нескольких альтернатив. Пример 1 var i: Integer; begin Read. Ln(i); Case i Of 0, 2, 4, 6, 8: Writeln(‘четное число меньше 10’); 1, 3, 5, 7, 9: Writeln(‘нечетное число меньше 10’); 10. . 20: Writeln(‘число меньше от 10 до 20’); Else Writeln(‘число больше 20’) End. 4
Пример 2. Составить программу, запрашивающую 2 целых числа и знак арифметического действия, а затем выполняющую это действие над заданными числами. Program plus; Var x, y: integer; R: real; znak: char; Begin Write. Ln(‘Введите два целых числа’); Read. Ln(x, y); Write. Ln(‘Введите знак’); Readln(znak); Case znak Of ‘+’: Write. Ln(x+y); ‘*’: Write. Ln(x*y); ‘-’: Write. Ln(x-y); ‘: ’, ’/’: Write. Ln(x/y); Else Write. Ln(‘неверный ввод’) End. 5
Задание Определите значения переменных p и d после выполнения фрагмента программы: k: =47; Case k Div 9 Of 5: Begin d: =k; p: =True End; 0. . 2: Begin d: =2; p: =False End; 8: Begin d: =3; p: =False End; Правильный ответ: p=True d=47 Else Begin d: =1; p: =True End; 6
Алгоритм обмена значений двух переменных Задание. Написать программу обмена значениями двух переменных х и y. Алгоритм с использованием дополнительной переменной: . . . c: =x; x: =y; y: =c; . . . Алгоритм без использования дополнительной переменной: . . . x: =x+y; y: =x-y; x: =x-y; . . . 7
Целый тип данных В языке Турбо Паскаль существует пять целых типов данных для представления целых чисел. Тип Диапазон значений Объем памяти Short. Int -128. . . 127 1 байт, со знаком Integer -32768. . . 32767 2 байта, со знаком Long. Int -2147483648. . . 2147483647 4 байта, со знаком Byte 0. . . 255 1 байт, без знака Word 0. . . 65535 2 байта, без знака 8
Вещественный тип данных Тип Наименовани е Допустимые значения Точность (число значащих цифр) Объем памяти (Байт) Real Вещественный 2. 9 Е-39… 1. 7 Е 38 11 -12 6 Single С одинарной точностью 1. 5 Е-45… 3. 4 Е 38 7 -8 4 Double С двойной точностью 5 Е-324… 1. 7 Е 308 15 -16 8 Extended С повышенной точностью 3. 4 Е-4932…. 1 Е 4932 19 -20 10 Comp Сложный (длинное целое) -9. 2 Е 18… 9. 2 Е 18 19 -20 8 9
Доступ к числовым типам данных single, double, comp и extended возможен только при особых режимах компиляции. Подключить директиву компилятора можно, набрав в начале программы {$N+} - повышенная точность вычислений, или включив опции Optios/Compiler…/Numeric Processing 80287, Emulation. Тип данных comp трактуется как вещественное число без экспоненциальной и дробной частей. Фактически, comp – это «большое» целое число со знаком, сохраняющее 19. . 20 значащих десятичных цифр. 10
Вещественные числа хранятся приближенно и поэтому не должны сравниваться обычным способом, то есть с использованием стандартных конструкций языка типа "=" и т. п. Более точная проверка: вместо if (x=y) нужно писать if (abs(x-y)<epsilon) где "epsilon" есть малая константа, определяющая желаемую точность сравнения, например epsilon = 0. 0001 для сравнения с точностью до 5 разряда. 11
Не рекомендуется использовать операции, дающие вещественный результат без необходимости. Не писать if z=sqrt(x*x+y*y)! Использовать if x*x+y*y=z*z Не писать if(x+y)/2=t! Лучше писать if x+y=2*t. 12
Операторы циклов Многократно повторяющийся участок вычислительного процесса называется циклом. В языке Паскаль существует три типа циклов: 1) цикл с предусловием; 2) цикл с постусловием; 3) цикл с параметром. 13
Оператор цикла с параметром Цикл с параметром используется в тех случаях, когда число повторений цикла известно заранее. for <переменная>: = <выражение 1> to <выражение 2> do <оператор>; или for <переменная> : = <выражение 1> downto <выражение 2> do <оператор>; 14
Порядок выполнения цикла с параметром с использованием «to» l l 1) вычисляются значения «выражения 1» и «выражения 2» ; 2) параметру цикла (счётчику) присваивается значение «выражения 1» ; 3) параметр цикла сравнивается со значением «выражения 2» и, если он меньше или равен ему, то происходит выполнение тела цикла; 4) значение параметра цикла автоматически увеличивается на 1 и происходит возврат на начало цикла. 15
Особенности цикла с параметром 1) начальная установка счётчика не требуется (в отличие от циклов с предусловием и с постусловием); 2) внутри цикла изменение параметра происходит автоматически, поэтому изменение вручную нежелательно (может привести к непредсказуемым последствиям, это является семантической ошибкой); 3) количество повторений цикла определяется значениями верхней и нижней границ; 4) цикл может быть не выполнен ни разу; 5) в качестве параметра должна использоваться переменная порядкового типа[1]. В частности, тип Real использовать нельзя (семантическая ошибка); 6) если в цикле должно выполняться более одного оператора, то необходимо ставить операторные скобки. [1] Порядковый тип – это тип, состоящий из счётного количества значений, которые можно пронумеровать. К порядковым типам относятся все целые типы, логический и символьный тип. 16
Примеры. Что будет выведено на экран? 1) Квадраты чисел от 2 -х до 10 -и: for x: =2 to 10 do Write. Ln(x*x); 2) Латинский алфавит: for ch: ='A' to 'Z' do Writeln(ch); 3) Использование цикла с downto. for i: =10 downto 1 do Write. Ln(i); 4) Использование составного оператора. for x: =1 to 10 do begin y: =2*x+3; Write. Ln('f(', x, ')=', y); end; 17
Задание 1. Написать программу вычисления суммы ряда S=1+2+3+…+N. Program summa; Var i, N, S: integer; Begin Read. Ln(N); For i: =1 to N Do S: =S+i; Write. Ln(‘S=’, S) End. 18
Задание 2. Дано натуральное четырёхзначное число N (1000<=N<=9999). Определить, является ли оно палиндромом (перевёртышем). Program palindrom; Var n, m, r, i: integer; Begin Write. Ln(‘Введите целое число, не большее 9999’); Read. Ln(N); m: =n; r: =0; For i: =1 To 4 Do Begin r: =r*10+m Mod 10; m: =m Div 10 End; If r=n Then Writeln(‘ДА’) Else Writeln(‘НЕТ’) End. Построить трассировочную таблицу для N=3994. 19
Оператор цикла с предусловием Циклы с предусловием обычно используются в тех случаях, когда количество повторений цикла заранее неизвестно. Цикл с предусловием выполняется до тех пор, пока условие истинно. while <выражение> do <оператор>; 20
Особенности цикла while: l l l 1) В цикле с предусловием сначала идёт проверка условия, а затем – тело цикла. 2) После служебного слова Do в цикле с предусловием выполняется только один оператор. 3) Цикл с предусловием может не выполняться ни разу. 21
Пример 1. Сколько раз выполнится тело цикла? eps: =0. 01; x: =1; while x > eps do x: =x/2; Пример 2. Сколько раз выполнится тело цикла? . . . x: =0; While x<=10 Do; x: =x+1; . . . 22
Задание 1. В первый день Винни-Пух съел 1 кг мёда, во второй - 2 кг, а каждый последующий день он съедал столько мёда, сколько съел за два предыдущих дня. На какой день Винни-Пух съест не менее 25 кг мёда? Program puh; Var yesterday, before, today, i : integer; Begin Before: =1; yesterday: =2; today: =before+yesterday; i: =3; While today<25 Do Begin before: =yesterday; yesterday: =today; today: =before+yesterday; i: =i+1 End; Write. Ln(‘На ‘, i, ’-ый день) End. 23
Задание 2. Дано натуральное число. Подсчитать количество цифр данного числа. Program sum_cif; Var m, n: Long. Int; K: integer; Begin Write. Ln(‘Введите целое число, не равное 0’); Read. Ln(N); m: =N; k: =0; While m<>0 Do Begin k=k+1; m: =m Div 10; End; Write. Ln(‘В числе ’, n, ’ – ‘, k, ’ цифр!’) End. 24
Оператор цикла с постусловием Цикл с постусловием выполняется до тех пор, пока ложно условие, стоящее в конце цикла. repeat <оператор>; . . . <оператор> until <выражение>; 25
Особенности цикла until l 1) В цикле с постусловием сначала идёт тело цикла, а затем – проверка условия. l 2) В цикле может выполняться любое количество операторов, и операторные скобки в этом случае не требуются (их роль играют служебные слова Repeat и Until). l 3) Цикл с постусловием обязательно выполняется хотя бы один раз. l 4) Цикл выполняется до тех пор, пока условие ложно. Пример repeat Write. Ln('Введите положительное число'); Read. Ln(x); until x>0; 26
Задание 1. Составить программу, которая запрашивает числовой пароль до тех пор, пока он не будет правильно введён. Использовать цикл с постусловием. Program kod; Var parol, vvod: integer; Begin Parol: =3424; Repeat Write. Ln(‘Введите пароль’); Read. Ln(vvod); Until parol=vvod End. 27
Задание 2. Целое положительное число p называется простым, если оно имеет только два делителя, а именно 1 и p. Единица (1) простым числом не считается. Определить, является ли число N простым. Использовать цикл с постусловием. Program simple; Var i, N: Long. Int; Begin Write. Ln(‘Введите натуральное число’); Read. Ln(n); i: =1; Repeat i: =i+1 Until (i>n Div 2) Or (n Mod i=0); If i>n Div 2 Then Writeln(‘Число ‘, n, ’ – простое’) Else Writeln(‘Число , n, ’ – не простое’) End. 28
Тестовые задания на работу с циклами Задание 1. Определите значения переменных i и s после выполнения фрагмента программы: s: =0; i: =0; While i<=6 do begin s: =s+i; i: =i+2 end; Правильный ответ: i=8 s=12. 29
Задание 2. Определите значение переменной k после выполнения фрагмента программы: k: =0; For i: =1 To 100 Do If (i mod 3 = 1) And (i mod 5 = 2) Then k: =k+1; Правильный ответ: 7. 30
Задание 3. Определите, результаты каких совпадают при одинаковых исходных данных. program P 1; var S, X: real; I, N: integer; begin read(N, X); S: =0; for I: =1 to N do S: =sqrt(S+X); writeln(S) end. program P 3; var S, X: real; I, N: integer; begin read(N, X); S: =0; I: =1; repeat S: =sqrt(S+X); I: =I+1 until I<=N; writeln(S) end. программ program P 2; var S, X: real; I, N: integer; begin read(N, X); S: =0; I: =N; while I >= 1 do begin S: =sqrt(S+X); I: =I– 1; end; writeln(S) end. Правильный ответ: P 1 и P 2. 31
Решение задач о нахождении бесконечных сумм Пример 1. Найти сумму ряда с заданной точностью , где 0< <1 ( =10 -2, 10‑ 3, … чем меньше , тем точнее решение): В данной задаче каждое слагаемое вычисляется самостоятельно через порядковый номер i: ai=1/i Условие продолжения вычисления: |ai|> , т. е. выполнение цикла должно завершиться в момент достижения требуемой точности. 32
Программа: Const eps=1 E-4; Var a, S: Real; i: Integer; begin S: =0; i: =1; a: =1; while (abs(a)>=eps) Do begin S: =S+a; i: =i+1; a: =1/i; end. 33
Пример 2. Написать программу вычисления суммы ряда S=1!+2!+3!+…+N!. l. Решая эту задачу «в лоб» путем вычисления на каждом шаге факториала, получим очень неэффективный алгоритм, требующий выполнения большего числа операций. l. Чтобы решить задачу подобного типа, надо сначала определить, как вычисляется каждый последующий член ряда. Для этого надо составить рекуррентное соотношение. 34
Рекуррентная последовательность Пусть известно k чисел: а 1, …, ak. Эти числа являются началом числовой последовательности. Следующие элементы этой последовательности вычисляются так: ak+1 = F(a 1, …, ak); ak+2 = F(a 2, …, ak+1); ak+3 = F(a 3, …, ak+2) … Здесь F(…) – функция от k аргументов. Формула вида ai = F(ai-1, …, ai-k) называется рекуррентной формулой. Другими словами, рекуррентная последовательность – это бесконечный ряд чисел, каждое из которых, за исключением k начальных, вычисляется через предыдущие. 35
Примеры рекуррентных последовательностей Арифметическая и геометрическая прогрессии: a 1=1, a 2=3, a 3=5, … Рекуррентная формула: ai=ai-1+2. a 1=1, a 2=2, a 3=4, … Рекуррентная формула: ai=2*ai-1. В целом рекуррентная последовательность описывается совокупностью начальных значений и рекуррентной формулы. Все это можно объединить в одну ветвящуюся формулу: Аналогично записывается формула для геометрической прогрессии. 36
Числа Фибоначчи: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, … Начиная с третьего элемента, каждое число равно сумме двух предыдущих, т. е. это рекуррентная последовательность с глубиной, равной 2. Ветвящаяся форма: Факториал от целого числа n! можно рассматривать как значение n-ого элемента следующего ряда чисел: a 1=1, a 2=1!, a 3=2!, … Рекуррентное соотношение такой последовательности: 37
Вывод рекуррентного соотношения для примера 2 ak-1=1*2*…*(k-1) ak=1*2*. . (k-1)*k Рекуррентное соотношение для вычисления каждого последующего слагаемого для данной задачи определяется формулой ak=k*ak-1 (т. е. чтобы получить очередное слагаемое, нужно предыдущее слагаемое умножить на порядковый номер текущего), где k=2, 3, . . ; первое слагаемое – a 1=1!=1. 38
Program summa; Var i, N, S, k: integer; Begin Read. Ln(N); Построить трассировочную таблицу для N=4. k: =1; S: =0; i k s For i: =1 to N Do 1 0 Begin 1 1 1 k: =k*i; 2 2 3 S: =S+k; 3 6 9 End; 4 24 33 Write. Ln(‘S=’, S) End. 39
Вывод l Если каждое слагаемое какой-либо суммы представляет собой степень какого-либо числа или выражения, а также факториалы, то надо составлять соответствующее рекуррентное соотношение для вычисления каждого последующего слагаемого через предыдущее. 40
Пример 3. Найти сумму ряда с заданной точностью . Определим общий вид слагаемого данного ряда: Слагаемое представляется в виде произведения двух сомножителей. Один из сомножителей вычисляется . через аналогичный сомножитель предыдущего слагаемого (через рекуррентное соотношение, см. пример 2), а второй – через номер слагаемого (аналог примера 1). Рекуррентное соотношение для вычисления степени 41 числа: ak=ak-1*x, где k=2, 3, …), a 1=x. Написать программу самостоятельно.
Задача 1. Даны суммы: (1) (2) (3) (4) (5) 2+4+6+8+…(2*k)+… Разделить суммы по правилам вычисления слагаемых на три группы. 42
Группа 1 S=2+4+6+8+…(2*k)+… (аналог примера 1): (5) – слагаемое вычисляется через порядковый номер: ak=2*k. 43
Группа 2 (2) (3) (аналог примера 2): каждое последующее слагаемое вычисляется через предыдущее (степень какого-либо числа или выражения и факториалы): . Для получения следующего слагаемого выписываются рекуррентные соотношения: (2): . ak=ak-1*x/k; начинает работать с k=1, 2, 3, … a 0=1. 44
Группа 3 (аналог примера 3): слагаемое представляется в виде произведения двух сомножителей: ak=bk ck. 1): (4): bk= – bk-1; k=2, 3, . . . ; b 1=1 45
Взаимозаменяемость циклов Найти сумму пяти чисел, вводимых пользователем. Использовать а) цикл с параметром; б) цикл с предусловием; в) цикл с постусловием. 46
Сумма пяти чисел, вводимых пользователем, используется цикл с параметром Program rand 1; Var a, S: integer; Begin S: =0; Write(‘Определение суммы чисел ‘); For i: =1 to 5 Do Begin Write. Ln(‘Введите ’, i, ’-ое целое число: ’); Read. Ln(a); S: =S+a End; Write. Ln(‘Сумма введенных 5 -и чисел равна ‘, S) End. 47
Сумма пяти чисел, вводимых пользователем, используется цикл с предусловием Program rand 2; Var a, i, S: integer; Begin S: =0; i: =1; Write(‘Сумма чисел ‘); While i<=5 Do Begin Read. Ln(a); S: =S+a; i: =i+1 End; Write. Ln(‘равна ‘, S) End. Начальная инициализация счетчика цикла и его увеличение в цикле на единицу прописываются явно. 48
Сумма пяти чисел, вводимых пользователем, используется цикл с постусловием Program rand 3; Var a, i, S: integer; Begin S: =0; i: =1; Write(‘Сумма чисел ‘); Repeat Read. Ln(a); S: =S+a; i: =i+1 Until i>5 Write. Ln(‘равна ‘, S) End. Начальная инициализация счетчика цикла и его увеличение в цикле на единицу прописываются явно. Условие цикла Repeat (U 2) прямо противоположно условию цикла While (U 1) U 2 = not U 1, при условии идентичности тела цикла. 49
Вложенные циклы l l l Для решения задач часто приходится использовать две и более циклические конструкции, одна из которых располагается внутри другой. Такие конструкции называются вложенными циклами. При этом сочетание for, while, repeat могут быть любыми. Цикл, который содержит в себе другой – называется внешним. Цикл, находящийся в теле первого – внутренним (вложенным). Правила организации как внешнего, так и внутреннего циклов такие же, как и для простого цикла каждого из этих видов. 50
Особенности использования вложенных циклов: l l l Все операторы внутреннего должны полностью располагаться в теле внешнего цикла. При вложении циклов внутренний цикл выполняется полностью от начального до конечного значения, при неизменном значении параметра внешнего цикла. Затем значение параметра внешнего цикла изменяется (например, увеличивается на 1), и опять от начала до конца выполняется вложенный цикл. Итак, до тех пор – пока значение параметра внешнего цикла не станет больше конечного значения, определяемого во внешнем цикле. 51
Пример 1. Даны натуральные числа n и k. Составить программу вычисления выражения 1 k+2 k+3 k+…+nk. Program summa; Var n, k, y, s, I, j: integer; Begin Writeln(‘Введите исходные данные n и k’); Read. Ln(n, k); S: =0; For i: =1 To n Do Begin Y: =1; For j: =1 to k Do y: =y*i; S: =S+y End; Writeln(‘Ответ ‘, s) End. l 52
l Задача 2. Модифицировать предыдущую программу так, чтобы она вычисляла сумму 11 + 22 +. . . + nn. Program summa 1; Var n, y, i, s, m: Integer; Begin Writeln('Введите начальное значение n '); Readln(n); s: =s; For i: =1 To n Do Begin y: =1; For m: =1 To i Do y: =y*i; {нахождение степени k числа i} s: =s+y; End; Writeln('Ответ: ', s); End. 53
l Пример 3. Сложим все цифры какого-либо числа. Получим новое число. Сложим снова его цифры. Получим снова новое число. Продолжим процесс до тех пор, пока не получим число, состоящее из одной цифры. Написать программу для нахождения такого числа. Program root; Var n, k, s: Long. Int; Begin Writeln(n); s: =n; While s>9 Do Begin k: =s; s: =0; Repeat s: =s+k Mod 10; k: =k Div 10 Until k=0 End; Writeln(‘Из числа ‘, n, ’ получилось ’, s) End. 54
Язык программирования Паскаль 2.ppt