Слайд 1Тема : “Система программирования
Турбо Паскаль”
Программирование циклов
Слайд 2Цикл с параметром
Оператор цикла с параметром:
For := А То В
Do ;
For :=А Downto В Do ;
где А
− начальное значение параметра,
В − конечное значение параметра.
Оператор цикла с параметром применяют тогда, когда заранее известно число повторений одной и той же последовательности операторов.
Начальное и конечное значения параметра цикла могут быть представлены константами, переменными или арифметическими выражениями.
Если <тело цикла> состоит из нескольких операторов, то операторы тела цикла заключаются в операторные скобки Begin-End.
Слайд 3Рассмотрим, как выполняется оператор цикла с параметром вида
For :=А То
В Do
Сначала вычисляются значения выражений А и В.
Если А<В, то <параметр> последовательно принимает значения, равные А, А+1,..., В-1, В и для каждого из этих значений выполняется <тело цикла>. Если А>В, то <тело цикла> не выполняется ни разу.
Оператор цикла с параметром
For <параметр>:=А Downto В Do
<тело цикла>
выполняется аналогичным образом, но значение <параметра> изменяется с шагом, равным -1.
Слайд 4Пример 1
Задано натуральное число n. Написать программу вычисления суммы натуральных
чисел от 1 до n:
S=1+2+3+…n
Program Example_36;
{вычисление суммы натуральных чисел}
var n,
s, I: integer;
begin
writeln('Введите натуральное число');
readln(n);
s:=0
for I:=1 to n do s:=s+I;
writeln('сумма натуральных чисел= ',s);
readln;
end.
Слайд 5Пример 2
Для заданного натурального числа n написать программу вычисления его
факториала
n!=1*2*...*n
Восклицательный знак в конце буквы n! − это знак математической
операции, называется он факториал и обозначает произведение всех натуральных чисел от единицы до указанного числа. Например:
6!=1*2*3*4*5*6=720.
Слайд 6Пример 2
Для заданного натурального числа n написать программу вычисления его
факториала
program Example_42;
var f, i, n: integer;
begin
writeln('Введите натуральное число');
readln(n);
f:=1;
for i:=1 to
n do f:=f*i;
writeln(n, '!= ', f);
readln;
end.
Слайд 7Пример 3
Из чисел от 10 до 99 вывести те, сумма
цифр которых равна s (0
− старшую цифру числа k, р2 − младшую цифру числа k, s − сумму цифр числа k. Число k будем печатать только в том случае,
когда сумма р1 и р2 будет равна s.
Program Example_32;
Var k,n,p1,p2,s:Integer;
Begin
Writeln('введите целое число ');
Readln(n); {вводим целое число}
For k:=10 To 99 Do
Begin
p1:=k div 10; {выделяем старшую цифру}
p2:=k mod 10; {выделяем младшую цифру}
s:=p1+p2; {находим сумму цифр}
If s=n Then Writeln(k); {если сумма равна n, то вывод k}
End;
Readln;
End.
Слайд 8Пример 4
Задано натуральное число n. Написать программу вывода на экран
натуральных чисел от 1 до n в обратном порядке.
Program Example_37;
var
n, i,: integer;
begin
writeln('Введите натуральное число');
readln(n);
for i:=n downto 1 do
writeln(i);
readln;
end.
Слайд 9Пример 5
Дано четырехзначное число n. Каким образом можно построить перевертыш
данного числа
Решение
Обозначим через n вводимое число, m − дубликат
числа n, а − перевертыш числа n, i − переменная цикла для создания перевертыша.
Program Example_34;
Var n,m,a,i: Integer;
Begin
Writeln('введите целое число, не большее 9999'); Readln(n);
m:=n; a:=0; {создание перевертыша}
For i:=l To 4 Do {так как число четырехзначное}
Begin
a:=a*10+m Mod 10; m:=m div 10; End;
If a=n Then Writeln('ДА!')
Else Writeln('НЕТ!'); {если перевертыш равен данному числу, то выводим "ДА", иначе - "НЕТ"}
Readln; End.
Слайд 10ЦИКЛЫ С УСЛОВИЯМИ
Цикл с предусловием
Цикл с предусловием используется тогда, когда
число повторений оператора цикла заранее не известно, а задается некоторое
условие продолжения цикла.
Оператор цикла с предусловием
While <условие> Do <тело цикла>;
Выполнение оператора цикла с предусловием начинается с проверки условия, записанного после слова While. Если оно соблюдается, то выполняется <тело цикла>, затем вновь проверяется условие и т.д. Как только при очередной проверке окажется, что условие не соблюдается, <тело цикла> выполняться не будет.
Слайд 11Примечание
1. Если состоит из нескольких операторов, то они
объединяются операторными скобками.
2. В теле цикла обязательно должен быть оператор,
влияющий на соблюдение условия, в противном случае произойдет зацикливание.
Пример 1
Подсчитать количество цифр заданного натурального числа n.
Решение
Подсчет количества цифр начнем с последней цифры числа. На очередном шаге цикла увеличим счетчик цифр на единицу, а число уменьшим в 10 раз (тем самым мы избавляемся от последней цифры числа). Далее с получившимся числом проделаем ту же последовательность действий и т.д., пока число не станет равным нулю.
Слайд 12Program Example_43;
Var m, n: Longint;
k: Integer; {счетчик цифр}
Begin
Writeln('Введите натуральное
число');
{вводим натуральное число n>0}
Readln(n);
m:=n; k:=0;
While m0 Do
{пока (While) число m<>0 делать (Do)}
Begin
Inc(k); {k:=k+1;}
m:=m div 10; {"выбрасываем" из числа последнюю цифру}
End;
Writeln('В числе ',n,' - ' , k,' цифр'); {вывод количества цифр}
Readln;
End.
Слайд 13Домашнее задание:
№1
Составить программу печати натуральных чисел от 1 до 10
и их квадратов.
№2
Найти произведение N произвольных чисел.
№6
Ввести N чисел. Определить,
сколько среди них превосходит первое число
Слайд 14Пример 2
Дана непустая последовательность натуральных чисел, за которой следует 0.
Найти порядковый номер наименьшего элемента последовательности.
Решение
Обозначим через х и i
очередной элемент последовательности и его номер; min и k − минимальный элемент последовательности и его номер. Считывание элементов последовательности производится до тех пор, пока не будет введен 0, то есть пока х<>0. Начальное значение минимума определяется значением первого элемента последовательности. Очередное вводимое число (очередной элемент последовательности) требуется сравнивать с текущим значением минимума, и если текущее значение min окажется больше очередного элемента последовательности, то min нужно изменить, а номер очередного элемента последовательности − запомнить. Учитывая вышесказанное, составим программу:
Слайд 15Program Example_44;
Var x, i, min, k: Integer;
Begin
Writeln('Введите первый элемент последовательности');
Read(x);
k:=1;
min:=x; i:=2;
While x0 Do
Begin
If x
End;
Writeln('Введите ', i , ' элемент
последовательности');
Read(x);
Inc(i); {k:=k+1;}
End;
Writeln('Номер минимального элемента - ', k);
End.
Слайд 16 Цикл с постусловием
Для реализации циклических алгоритмов с неизвестным заранее
числом повторений имеется еще один оператор − оператор цикла с
постусловием, который имеет следующий вид:
Repeat (повторять}
<оператор 1>;
<оператор 2>;
……………
<оператор n>;
Until {до тех пор, пока не} <условие>;
Этот оператор отличается от цикла с предусловием тем, что проверка условия производится после очередного выполнения тела цикла. Это обеспечивает выполнение цикла хотя бы один раз.
Слайд 17 Цикл с постусловием
Для реализации циклических алгоритмов с неизвестным заранее
числом повторений имеется еще один оператор − оператор цикла с
постусловием, который имеет следующий вид:
Repeat (повторять}
<оператор 1>;
<оператор 2>;
……………
<оператор n>;
Until {до тех пор, пока не} <условие>;
Этот оператор отличается от цикла с предусловием тем, что проверка условия производится после очередного выполнения тела цикла. Это обеспечивает выполнение цикла хотя бы один раз.
Слайд 18 Обратите внимание на то, что данный оператор цикла предполагает
наличие нескольких операторов в теле цикла, поэтому служебные слова Begin
и End не нужны.
Последовательность операторов, входящих в тело цикла, выполняется один раз, после чего проверяется соблюдение условия, записанного следом за служебным словом Until.
Если условие соблюдается, цикл завершается. В противном случае тело цикла выполняется еще раз, после чего снова проверяется соблюдение условия.
С помощью процедуры KeyPressed модуля CRT и цикла с постусловием можно организовать ожидание нажатия любой клавиши:
Repeat Until KeyPressed.
Слайд 19 Пример 1
Составить программу планирования закупки товара в магазине на
сумму, не превышающую заданной величины.
Решение
Обозначим через х и k цену
и количество товара, через р − заданную предельную сумму, через s − стоимость покупки. Начальное значение общей стоимости покупки s равно нулю. Значение предельной суммы считывается с клавиатуры. Необходимо повторять запрос цены и количества выбранного товара, вычислять его стоимость, суммировать ее с общей стоимостью и выводить результат на экран до тех пор, пока стоимость не превысит предельной суммы р.
Слайд 20 Program Example_47;
Var x, k, p, s: Integer;
Begin
Writeln('Предельная сумма');
Readln(p);
s:=0;
Repeat
Writeln('Введите цену товара
и его количество');
Readln(x, k);
s:=s+x*k;
Writeln('Стоимость покупки равна ',s);
Until s>p;
Writeln('Суммарная стоимость покупки
превысила предельную сумму');
End.
Слайд 21 Алгоритм Евклида
Алгоритм Евклида это алгоритм нахождения наибольшего общего делителя
(НОД) двух целых неотрицательных чисел.
Пусть х и y одновременно
не равные нулю целые неотрицательные числа, и пусть x>y. Если y=0, то НОД(х, у)=х, а если y0, то для чисел х, y и r, где r − остаток от деления x на y, выполняется равенство НОД(х,y)=НОД(x,r).
Например, пусть х=48, а у=18.
НОД(48,18)=НОД(18,12)=НОД(12,6)=
НОД(6,0)=6.
Слайд 22Пример 1
Написать программу нахождения наибольшего общего делителя двух неотрицательных чисел.
Решение
Для
решения данной задачи воспользуемся циклом с постусловием:
Program Example_49;
Var x, у:
Integer;
Begin
Writeln('Введите два числа');
Readln(х,у);
Repeat {выполнять}
If x>y Then x:=x mod у Else y:=y mod х;
Until (x=0) or (y=0); {до тех пор, пока одно из чисел не станет равно нулю}
Writeln('НОД=', х+у); {вывод НОД. Одно из чисел обязательно равно нулю}
Readln;
End.
Слайд 23Домашнее задание:
№1 Дана последовательность операторов:
a:=1;
b:=1:
while a+b
s:=a+b;
Сколько раз будет повторен цикл, и какими будут значения переменных
a, b и s после завершения этой последовательности операторов?
Слайд 24Домашнее задание:
№2
Определить значение переменной s после выполнения следующих операторов:
s:=0;
i:=l;
repeat
s:=s+5 div i;
i:=l-l;
until i
Слайд 25Вложенные циклы
Пример 1
Даны натуральные числа n и k. Составить программу
вычисления выражения 1k+2k+…+nk.
Решение
Для вычисления указанной суммы целесообразно организовать цикл с
параметром i, в котором, во-первых, находилось бы значение очередного члена ряда (у:=ik) и, во−вторых, осуществлялось бы накопление искомой суммы путем прибавления полученного слагаемого к сумме всех предшествующих (s:=s+y).
Слайд 26Вложенные циклы
Program Example_51;
Var n, k, у, i, s, m: Integer;
Begin
Writeln('Введите
n и k ');
Readln(n,k);
s:=0;
For i:=1 To n Do
Begin
y:=1;
For m:=1 To
k Do y:=y*i;
{нахождение степени k числа i}
s:=s+y;
End; Writeln('Ответ: ',s); End.
Для решения задачи потребовалось организовать два цикла, один из которых пришлось поместить внутрь другого. Такие конструкции называют вложенными циклами.
Слайд 27Вложенные циклы
Program Example_51;
Var n, k, у, i, s, m: Integer;
Begin
Writeln('Введите
n и k ');
Readln(n,k);
s:=0;
For i:=1 To n Do
Begin
y:=1;
For m:=1 To
k Do y:=y*i;
{нахождение степени k числа i}
s:=s+y;
End; Writeln('Ответ: ',s); End.
Для решения задачи потребовалось организовать два цикла, один из которых пришлось поместить внутрь другого. Такие конструкции называют вложенными циклами.
Слайд 28Вложенные циклы
Пример 4
Cтаринная задача. Cколько можно купить быков, коров и
телят, если плата за быка − 10 рублей, за корову
− 5 рублей, за теленка − полтинник (0,5 рубля) и на 100 рублей надо купить 100 голов скота?
Решение
Обозначим через b количество быков; k − количество коров; t − количество телят. После этого можно записать два уравнения: 10b+5k+0.5t=100 и b+k+t=100. Преобразуем их: 20b+10k+t=200 и b+k+t=100.
На 100 рублей можно купить:
• не более 10 быков, т.е. 0≤b≤10;
• не более 20 коров, т.е. 0≤k≤<20;
• не более 200 телят, т.е. 0≤t≤200. Таким образом, получаем:
Слайд 29Program Example_54;
Var b, k, t: Integer;
Begin
For b:=0 To 10 Do
For
k:=0 To 20 Do
For t:=0 To 200 Do
If (20*b+10*k+t=200)
and (b+k+t=100)
Then Writeln('быков ',b,' коров ',
k,' телят ',t);
End.
Слайд 30Значение переменной b изменяется 11 раз (от 0 до 10),
для каждого ее значения переменная k изменяется 21 раз, а
для каждого значения переменной k переменная t изменяется 201 раз. Таким образом, условие будет проверяться 11х21х201 раз. Но если известно количество быков и коров, то количество телят можно вычислить по формуле t=100-(b+k) − и цикл по переменной t исключается.
Program Example_55;
Var b, k, t: Integer;
Begin
For b:=0 To 10 Do
For k:=0 To 20 Do
Begin
t:=100-(b+k);
If (20*b+10*k+t=200) Then
Writeln('быков ',b,' коров ',
k,' телят ',t);
End;
End. При этом решении условие проверяется 11х21 раз.
Слайд 31Пример 5
Написать программу нахождения среди чисел от 1 до 100
всех пар чисел, для которых их сумма равна их произведению.
Program
Example_56;
var k, a, b: integer;
begin
k:=0;
for a:=1 to 100 do
for b:=1 to 100 do
begin
if a+b=a*b then
begin
k:=k+1;
writeln('Искомая пара чисел: ',a, ' и ', b); end;
end;
if k=0 then writeln('Таких чисел нет');
end.
Слайд 32Одномерные массивы. Работа с элементами (разбор на примерах)
Одномерный массив
это фиксированное количество элементов одного типа, объединенных одним именем,
причем каждый элемент имеет свой уникальный номер и номера элементов идут подряд. Например имя А общее для всех элементов.
Одномерный массив описывается следующим образом:
Array[n1..n2] Of <тип элементов>;
где n1 номер первого элемента, n2 номер последнего элемента, в качестве типа элементов может использоваться любой тип данных, кроме файлового.
Для того чтобы обратиться к элементу этого массива, необходимо указать имя массива и в квадратных скобках номер элемента. Например, первый элемент массива А А[1], а пятый А[5] .
Слайд 33Program Example_88; { Ввод элементов массива с клавиатуры и вывод
его на печать + нахождение суммы элементов массива}
Const n=30; {Количество
элементов массива}
Var A: array[1..n] Of Integer; i,sum: Integer;
Begin
Writeln('Введите ', n, ' чисел');
For i:=1 To n Do
Readln(a[i]); {Ввод массива с клавиатуры}
For i:=1 To n Do {Вывод массива}
Write(a[i]: 3); {Вывод i-гo элемента}
sum:=0; {Начальное значение суммы}
For i:=1 To n Do sum:=sum+a[i];
Writeln('их сумма равна ',sum);
Readln; End.
Слайд 34(Перед этим дать процедуры ввода и вывода массивов Книга
Турбо Паскаль стр 37)
Заполнение массива с помощью генератора случайных чисел.
Этот способ более удобен, когда в массиве много элементов, а их точные значения не слишком важны.
Для получения случайных чисел практически во всех современных языках программирования имеется стандартная функция. В языке Паскаль имеется функция Random. Формулы для расчета случайного числа x различного типа в программе приведены в таблице:
Слайд 35При каждом новом запуске программы с использовании функции Random будут
генерироваться одни и те же случайные числа. Чтобы исключить это,
необходимо записать (желательно в начале программы) оператор Randomize (без параметров), инициализирующий генератор случайных чисел.
Составим программу заполнения одномерного массива с помощью генератора случайных чисел. Процедура вывода уже составлена ранее
Слайд 36Program Example_90;
Const n=30; dd=51; {n - количество элементов
массива, dd используется
в генераторе
случайных чисел}
Type myarray = Array [1..n] Of Integer;
Var
A: myarray;
Procedure Init2 (Var m: myarray);
{Процедура заполнения (инициализации)
массива случайными числами}
Var : Integer;
Begin
For i:=1 To n Do m [i]:=-25+Random(dd);
{Функция Random выбирает случайное число из отрезка от 0 до dd-1. Очередному элементу массива будет присвоена сумма выбранного случайного числа и -25, таким образом, массив будет заполняться случайными числами от -25 до -25+(dd-1), то есть до -26+dd}
Слайд 37End;
Procedure Print (m:myarray);
{процедура вывода (распечатки) массива}
…
Begin
Randomize;
{Инициализация генератора случайных чисел}
Init2(А);
{Обращение к
процедуре заполнения массива}
Print(A);
{Обращение к процедуре вывода массива}
Readln;
End.
Слайд 38Работа с элементами массива
(разбор на примерах) Книга Турбо Паскаль
стр 37
При работе с элементами массива можно выделить несколько
видов задач.
Нахождение суммы (или произведения) элементов (Найти сумму элементов, кратных заданному числу.)
Нахождение номеров элементов, обладающих заданным свойством (Найти номера четных элементов.)
Нахождение количества элементов, обладающих заданным свойством (Найти количество положительных и отрицательных элементов в данном массиве.)
Есть ли в данном массиве элементы с данным свойством, или найти первый (последний) элемент, отвечающий
заданным условиям (Есть ли отрицательный элемент в массиве?),
(Найти номер последнего отрицательного элемента массива.)
Слайд 39Методы работы с элементами
одномерного массива Книга Турбо Паскаль стр
39
Изменение значений некоторых элементов
(Заменить отрицательные элементы массива на
их абсолютные величины.)
(Прибавить к каждому элементу массива число 25)
(Если очередной элемент массива четный, то прибавить к нему первый, если нечетный − прибавить последний. Первый и последний элементы не изменять.)
Создание массива
Даны два одномерных массива одинаковой размерности. Получить третий массив такой же размерности, каждый элемент которого равен сумме соответствующих элементов данных массивов.
Даны первый член арифметической прогрессии и ее разность. Записать в массив первые n членов прогрессии.
Слайд 40Работа с несколькими массивами
Даны два одномерных массива − А и
В. Найти их скалярное произведение.
Решение
Скалярным произведением двух массивов одинаковой размерности
называется сумма произведений соответствующих элементов:
a[1]*b[1]+a[2]*b[2]+...+a[n-1]*
*b[n-1]+...+а[n]*b[n],
где n − количество элементов в массивах.
Program Example_102;
Function Sp (a, b: myarray): longint;
Var i: Integer;
s: Longint;
Begin
s:=0;
For i:=1 To n Do s:=s+a[i]*b[i];
Sp:=s;
End;
Слайд 41Удаление элементов из одномерного
массива Книга Турбо Паскаль стр
40
Удалить из массива, в котором все элементы различны, максимальный
элемент. После удаления максимального элемента массив "уплотнить", сдвинув все следующие за ним элементы влево. Последнему (самому правому) элементу массива присвоить 0.
Решить предыдущую задачу, считая, что максимальный элемент может встречаться несколько раз.
Слайд 42 Вставка элементов
в одномерный массив Книга Турбо Паскаль
стр 42
Вставка элемента после элемента с заданным номером
Вставка элемента
перед элементом с данным номером
Вставка нескольких элементов
Слайд 43 Перестановки элементов массива
Книга Турбо Паскаль стр 43
Перестановка двух
элементов
Перестановка нескольких элементов (части) массива (Дан одномерный массив А, состоящий
из 2n элементов. Поменять местами его половины.)
Слайд 44 ДВУХМЕРНЫЕ МАССИВЫ.
Описание. Работа с элементами
Книга Турбо Паскаль стр
44
Двухмерные массивы можно представить в виде прямоугольной таблицы или
матрицы.
Рассмотрим матрицу А размерностью 2х3 (состоящую из двух строк по три элемента в каждой):
a11 a12 a13
A=
a21 a22 a23
Положение каждого элемента определяется двумя числами: номером строки, в которой находится элемент, и номером столбца. Например, а12 − это элемент, стоящий в первой строке и во втором столбце.
Слайд 45 ДВУХМЕРНЫЕ МАССИВЫ.
Описание. Работа с элементами
Книга Турбо Паскаль стр
44
Нужно объявить массив в разделе описания переменных:
Var a:
Array[1..n,1..m] Of <тип элементов>;
Рассмотренные выше методы решения задач обработки одномерных массивов могут применяться и для обработки двухмерных массивов.
Слайд 46 ДВУХМЕРНЫЕ МАССИВЫ.
Описание. Работа с элементами
Книга Турбо Паскаль стр
44
Поскольку положение элемента в двухмерном массиве описывается двумя
индексами (первый − номер строки, второй − номер столбца), программы для решения большинства матричных задач строятся на основе вложенных циклов. Обычно внешний цикл организуется по строкам матрицы, то есть в нем выбирается требуемая строка матрицы, а внутренний цикл − по столбцам матрицы, в нем выбирается элемент строки. Для присваивания значений элементам массива могут быть использованы операторы присваивания и операторы ввода.