
Л4 Программирование циклов окончание Примеры.ppt
- Количество слайдов: 25
Оператор цикла с предусловием Оператор цикла с постусловием Оператор цикла с параметром нет да REPEAT WHILE условие DO оператор UNTIL оператор параметр цикла FOR переменная : = выражение 1 TO FOR переменная : = выражение 1 DOWNTO Имя параметра (счетчика) цикла выражение 2 Начальное значение счетчика цикла условие DO оператор выражение 2 DO оператор Конечное значение счетчика цикла Цикл – это многократно выполняемая последовательность операторов (команд). В языке Паскаль используются три основные циклические конструкции: (WHILE. . . DO. . . ), (REPEAT. . . UNTIL. . . ), (FOR. . . TO / DOWNTO. . . DO. . . ). Цикл с параметром (FOR … DO …) является частным случаем цикла с предусловием.
Пример1. Найти сумму квадратов всех натуральных чисел от 1 до 100. С использованием цикла "Пока“ Program Ex 1; Var A : Integer; S : Longint; Begin A: =1; S: =0; While A<=100 Do Begin S: =S+A*A; A: =A+1 End; Writeln(S) End. С использованием цикла "До“ Program Ex 2; Var A : Integer; S : Longint; Begin A: =1; S: =0; Repeat S: =S+A*A; A: =A+1 Until A>100; Writeln(S) End. С использованием цикла "С параметром“ Program Ex 3; Var A : Integer; S : Longint; Begin S: =0; For A: =1 To 100 Do S: =S+A*A; Writeln(S) End.
Массивом будем называть упорядоченную последовательность данных одного типа, объединенных под одним именем. Описание типа линейного массива выглядит так: Type <Имя типа>=Array [<Диапазон индексов>] Of <Тип элементов>; Например: Type vector=array [1. . 40] of real; В качестве индексов могут выступать переменные любых порядковых типов. При указании диапазона начальный индекс не должен превышать конечный. Тип элементов массива может быть любым (стандартным или описанным ранее). Описать переменную-массив можно и сразу (без предварительного описания типа) в разделе описания переменных: Var <Переменная-массив> : Array [<Диапазон индексов>] Of <Тип элементов>; Примеры описания массивов: Var S, BB : Array [1. . 40] Of Real; N : Array ['A'. . 'Z'] Of Integer; R : Array [-20. . 20] Of Word; T : Array [1. . 40] Of Real; V: vector; Теперь переменные S, BB, T и V представляют собой массивы из сорока вещественных чисел; массив N имеет индексы символьного типа и целочисленные элементы; массив R может хранить в себе 41 число типа Word.
Единственным действием, которое возможно произвести с массивом целиком - присваивание. Var S, BB : Array [1. . 40] Of Real; T : Array [1. . 40] Of Real; Для данного примера описания впоследствии допустима следующая запись: S: =BB; Однако, присваивать можно только массивы одинаковых типов. Даже массиву T присвоить массив S нельзя, хотя, казалось бы, их описания совпадают, произведены они в различных записях раздела описания. Никаких других операций с массивами целиком произвести невозможно, но с элементами массивов можно работать точно также, как с простыми переменными соответствующего типа. Обращение к отдельному элементу массива производится при помощи указания имени всего массива и в квадратных скобках - индекса конкретного элемента. Например: R[10] - элемент массива R с индексом 10. BB[15] - прямая адресация; BB[K] - косвенная адресация через переменную K, значение которой будет использовано в качестве индекса элемента массива BB.
Обработка массивов Пример 2. Ввод массива среднемесячных температур. Вычисление среднегодовой температуры.
Месяц 01 02 03 04 05 06 07 08 09 10 11 12 T [ 1: 12 ] T [1] T [2] T [3] T [4] T [5] T [6] T [7] T [8] T [9] T [10] T [11] T [12] Температура -21 -18 -7 -6 10 18 23 24 17 6 -7 -18 var имя массива : array [ нижняя граница индекса. . верхняя граница индекса ] of тип массива ; начало PROGRAM : i : VAR T i : = 1, 12 Temperature ARRAY ; [ 1. . 12 ] OF REAL INTEGER ; i : = 1 TO 12 BEGIN вывод ” T [ i ] = ” FOR BEGIN ввод T [ i ] WRITE ( ’ T [ ’ , i : 2, ’ ] = ’ ) READLN ( T [ i ] ) END конец DO END. ; ; ;
Ввод массива среднемесячных температур Program Temperature; Var T: array[1. . 12] of real; {Описание одномерного массива} i: integer; Tsred: real; Begin {Цикл ввода} for i: =1 to 12 do begin Write('T[', i: 2, '] = '); Readln(T[i]) еnd; Вычисление среднегодовой температуры {Цикл суммирования всех значений температуры} Tsred: =0; for i: =1 to 12 do Tsred: =Tsred+T[i]; {Вычисление средней температуры} Tsred: =Tsred/12; {Вывод результата} Writeln('Среднегодовая температура = ', Tsred: 6: 2, ' градусов') End.
Вычисление ежемесячных отклонений от средней температуры {Вычисление и вывод ежемесячных отклонений от средней температуры} for i: =1 to 12 step 1 do begin Dt[i]: =T[i] - Tsred; Writeln('Dt[', i: 2, ']=', Dt[i]: 6: 2) end End.
Результаты работы программы: Ввод массива среднемесячных температур. Вычисление среднегодовой температуры и ежемесячных отклонений от средней температуры
Пример 3:
Программа заполняет массив Rand случайными числами в диапазоне от 0 до 50, вводит число Х, и вычисляет, сколько раз Х входит в массив Rand Program Example 2; Var Rand: array[1. . 20] of integer; I, X, Number. X : integer ; Begin {Установка датчика случайных чисел} Randomize; {Заполнение массива случайными числами и вывод их на экран} Writeln(‘Массив случайных чисел: ’); For I: =1 to 10 do begin Rand[I]: =random(50); Write(Rand[I]: 4) end; Writeln; {Ввод Х} Write(‘Введите Х: ’); Readln(X); {Подсчет числа вхождений Х в массив} Number. X: =0; For I: =1 to 10 do If Rand[I]=X then Number. X: =Number. X+1; {Анализ и вывод результата} If Number. X=0 then writeln(‘В массиве нет числа ’, X) else writeln(‘Число ’, X, ’ в массиве присутствует ’, Number. X, ’ раза’) End.
Результаты работы программы
Пример 4: Определить, является ли введенная строка "перевертышем". Перевертышем называется такая строка, которая одинаково читается с начала и с конца. Например, "казак" и "потоп" - перевертыши, "канат" - не перевертыш". Метод решения: из введенной строки сформируем другую строку из символов первой, записанных в обратном порядке, затем сравним первую строку со второй; если они окажутся равны, то ответ положительный, иначе - отрицательный. Program Str 4; Var S, B : String; i : Byte; Begin Writeln('Введите строку'); Readln(S); B: =‘ ‘; {Переменной B присваиваем значение "пустая строка"} For i: =1 to Length(S) do B: =S[i]+B; {Конкатенация. Символы строки S пристыковываются к} {переменной B слева. Самым левым окажется последний. } If B=S Then Writeln('Перевертыш') else Writeln('Не перевертыш') End.
Пример 5: Рассмотрим решение задачи по подсчету количества цифр данного числа. Program ex 5; var m, n: longint; k: integer; begin writeln (‘Введите целое число не равное 0'); readln ( n ); m: =n; k: =0; while m<>0 do begin k: =k+1; m: =m div 10; end; writeln (‘В числе ’, n, ‘ - ', k, ' цифр. '); readln; end. Модифицируя данную программу, можно решить следующие задачи: • • • найти сумму цифр числа; найти первую цифру числа, например для числа 7654 это цифра 7; поменять порядок цифр числа на обратный. Например, было 2345, стало 5432; найти количество четных цифр числа; найти сумму цифр числа, больших 5; ответить на вопрос, сколько раз данная цифра встречается в числе?
Пример 6: ПРОСТЫЕ ЧИСЛА. Целое положительное число p называется простым, если оно имеет только два делителя, а именно 1 и p. Научимся устанавливать факт: является ли число N простым? По соглашению 1 не считают простым числом. Начало последовательности простых чисел имеет вид: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89. . . program ex 6; var i, n: longint; begin writeln ('Введите натуральное число n'); • Считаем, что делители readln ( n ); числа находятся в интервале от 2 до (n div 2), i: =1; {делитель числа n} точнее в интервале от 2 до repeat целой части sqrt( n ). i: =i+1; • Если число n простое, то until (i>n div 2) or (n mod i=0); выведем на экран if i>n div 2 сообщение об этом. then writeln ('Число ', n, ' - простое') • Если оно не является else writeln ('Число ', i, 'первый делитель простым, то выведем на числа ', n); экран первый делитель readln; числа n. End.
Результаты работы программы
Пример 7: Сумма ряда Двумя способами (используя, оператор цикла с предусловием и оператор цикла с постусловием) для данного значения х найти сумму ряда S с точностью до члена ряда, по абсолютной величине меньшего eps = 0. 0001. Сравнить эту сумму со значением контрольной функции y.
Математическая модель Аргументы 1. Точность eps = 0. 0001 = 1 E-4 2. Аргумент: x - вещественный тип Промежуточные результаты: 1. Номер очередного члена ряда n: целый тип 2. Член ряда: u - вещественный тип (представляет собой дробь, её числитель: ch, её знаменатель: zn) Результаты 1. Сумма ряда: summa - вещественный тип 2. Значение контрольной функции: y - вещественный тип
Математическая модель • Формулы: Сумма ряда: summa : = summa + u Член ряда: u= сh/zn • Числитель – знакопеременный, у каждого следующего члена ряда • числитель больше в х*х раз, то есть ch: =(-1)*ch*x*x • Знаменатель = (2 n)!= (2 n-2)!*(2 n-1)*(2 n) (например для 4 члена ряда, n=4, знаменатель = 8!=6!*7*8), то есть zn: =zn*(2*n-1)*2*n • Значение контрольной функции: y=cos(x)
Алгоритм решения 1. Вводим исходные данные и делаем начальные присвоения (для члена ряда с номером =0): readln(x); n: =0; summa: =1; u: =1; ch: = 1; zn: = 1 n: =0 summa: =1 u: =1; ch: = 1; zn: = 1
Алгоритм решения Члены ряда будут уменьшаться с увеличением их номера, т. к. знаменатель (факториал) растет быстрее числителя (степень). 2. Пока очередной член ряда по модулю > 0. 0001 будем вычислять следующий за ним член ряда и находить сумму получившегося ряда: while abs(u) > eps do begin n: = n + 1; ch: =-ch*x*x; zn: =zn*(2*n-1)*2*n; u: = ch/zn; summa : = summa + u; end;
Алгоритм решения 3. Когда очередной член ряда по модулю станет < eps, выходим из цикла, вычисляем значение контрольной функции и выводим на экран результаты: y: =cos(x); writeln (Сумма данного ряда при х = ‘, x: 6: 4); writeln (‘ с точностью до 0. 0001 равна', summa: 6: 4); writeln (‘Значение контрольной y=cos(x) функции при том же значении х и с той же точностью равно ', y: 6: 4 );
Program sum; uses crt; const eps = 1 E-4; var n: integer; x, u, summa, y, ch, zn: real; Вegin clrscr; write(‘Введите значение х: ' ); readln(x); n: =0; summa: =1; u: =1; ch: = 1; zn: = 1; while abs(u) > eps do begin n: = n + 1; ch: =-ch*x*x; zn: =zn*(2*n-1)*2*n; u: = ch/zn; summa : = summa + u; end; writeln (Сумма данного ряда при х = ‘, x: 6: 4); writeln (‘ с точностью до 0. 0001 равна', summa: 6: 4); y: =cos(x); writeln (‘Значение контрольной функции'); writeln (‘при том же значении х и с той же точностью равно ', y: 6: 4 ); End.
Результаты работы программы • Результаты показывают, что значение суммы ряда и значение контрольной функции совпадают с заданной точностью. • Чтобы записать программу, используя цикл с постусловием, достаточно слова while abs(u) >= eps do begin заменить на repeat, a end заменить на until abs(u) <= eps;