Задача 1.
Вычислить: y = sin1 + sin1.1 + sin1.2 + … + sin2.
Первый вариант решения данной задачи.
Анализируя данную формулу, видим, что аргумент функции sin очередного слагаемого отличается от предыдущего на 0.1. Поэтому для решения данной задачи можно составить следующий алгоритм:
Переменные:
с – очередное слагаемое;
i – аргумент функции;
y – сумма.
- Обнуляем начальное значение переменной y (строка 5), в которой будем накапливать сумму.
- Начальное значение аргумента функции i равно 1 (строка 6).
- Проверяем, значение i меньше или равно 2, т.к. по заданию аргумент функции изменяется от 1 до 2 (строка 7)?
- Если «да», то определяем очередное значение функции (строка 9). Сохраняем его в переменной с. Если «нет», то расчет суммы закончен – переходим на шаг 78.
- Добавляем это слагаемое в сумму (строка 10).
- Увеличиваем значение аргумента i на 0.1 (строка 11).
- Переходим на шаг 3.
- Выводим результат на экран (строка 13).
var y, c, i : real; begin writeln(‘Полученное значение расчета формулы ‘, ‘y=sin1+sin1.1+sin1.2+ … +sin2 = ‘); y:=0; i:=1; while i <=2 do Begin c := sin(i); y:=y+c; i:=i+0.1; end; writeln(y); end. |
Второй вариант решения данной задачи.
Анализируя данную формулу, видим, что каждое слагаемое данной суммы можно рассчитать по формуле sin(1 + 0.1 * i), где i изменяется от 0 до 10. Поэтому для решения данной задачи можно составить следующий алгоритм.
Переменные:
i – параметр цикла;
y – сумма.
- Обнуляем начальное значение переменной y (строка 6), в которой будем накапливать сумму.
- Организуем цикл для определения суммы (параметр дан-ного цикла должен измениться от 0 до 10) .
- В данном цикле определяем очередное слагаемое по фор-муле и добавляем это слагаемое в сумму (строка 7).
- Выводим результат на экран (строка 8).
var y : real; i : integer; Begin writeln(‘Полученное значение расчета формулы ‘, ‘y=sin1+sin1.1+sin1.2+ … +sin2 = ‘); y:=0; for i:=0 to 10 do y:=y+sin(1+0.1*i); writeln(y); end. |
Задача 2.
Вычислить: y = 1*3*5* … *(2n–1), n>0;
var y : real; i, n : integer; begin writeln(‘Введите количество чисел’); readln(n); y:=1; for i:=1 to n do y:=y*(2*i–1); writeln(‘Полученное значение y= ‘, y) end. |
Задача 3.
Дано натуральное число N. Разложить его на простые множители.
Переменные:
n – исследуемое число;
i, j – переменные циклов;
f – вспомогательный флаг.
Алгоритм решения задачи:
- Вводим значение переменной n. Т.к. пользователь может случайно ввести отрицательное число, то необходимо дать ему возможность для повторного ввода значения переменной n. По-этому организуем цикл (строки 3–6 текста программы). Лучше использовать цикл с пост проверкой условия (Repeat…Until). Тело цикла составляют два оператора: вывода на экран приглашения для ввода значения переменной n (строка 4) и оператор чтения с клавиатуры – для непосредственного ввода значения переменной n (строка 5). Данный цикл будет выполняться до тех пор, пока пользователь не введет любое положительное число (срока 6).
- Выводим на экран значение переменной n и начинаем формировать ответ. Ответ будет представлен в следующем виде (например, в качестве значения переменной n ввели 8): 8 = 1*2*2*2. Т.к. единица является простым множителем для любого числа, то выводим ее на экран (строка 7). В результате выполнения данной строки на экране появится: 8=1.
- Вспомогательной переменной f присваиваем значение false. Данная переменная нам будет необходима для определения, а были ли вообще найдены простые множители у заданного числа n. Запоминаем исходное значение переменной n в переменной j (строка 8).
- В цикле по переменной i начинаем порождение натуральных чисел, не превосходящих середины заданного числа n, для определения делителей данного числа n (строка 9). Данный цикл начали с 2, т.к. единицу мы уже учли (шаг 2 данного алгоритма). Т.к. в цикле For можно использовать только целые переменные, то воспользовались оператором целочисленного деления на 2 (n div 2). В данном цикле выполняем следующее. Определяем, является ли очередное i делителем числа n (в качестве n в данном цикле используем j). Для этого определяем остаток от деления j на i. Если остаток равен 0 (строка 10), т.е. число i является делителем j, то определяем, сколько таких делителей, уменьшая число n (строки 11–18). Переменной f присваиваем значение true (строка 12) – это означает, что у заданного числа n есть делители. Организуем цикл, пока остаток от деления j на i равен 0 (строка 13). В данном цикле выводим делитель на экран (строка 15) и уменьшаем заданное число, деля его целочисленно на делитель (строка 16). Повторяем цикл. После завершения этого цикла возвращаемся на цикл For (строка 9), изменяем i и повторяем те же действия для нового делителя.
- Если у числа нет делителей (оно является простым), то данное число можно разложить только на 1 и само себя. Вспомогательная переменная f и определяет, были ли делители у числа n. Если значение переменной f осталось false, то делителей не было, поэтому выводим само это число (строка 19).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
var i, n, j : integer; f: boolean; begin repeat write(‘Введите натуральное число N= ‘); readln(n); until n>0; write (N:6, ‘=1’); f:=false; j:=n; for i:=2 to n div 2 do if j mod i = 0 then begin f:=true; {цикл определят, сколько таких множителей i в нашем числе n} while j mod i=0 do begin write(‘*’, i); j:=j div i; end; end; {f определяет, были ли найдены простые множители, которые больше единицы} if not f then writeln(‘*’, n); writeln end. |
Задача 4.
Даны натуральное число n и последовательность a1, a2,…,an вещественных чисел. Найдите знакочередующую сумму S = a1 –a2 + a3 –…+ (–1)n+1 an.
Переменные:
n – количество чисел;
a – очередное число;
p – булевский признак знака слагаемого;
i – переменная цикла;
S – знакочередующая сумма чисел.
Алгоритм решения задачи:
- вводим длину последовательности n и устанавливаем начальное значение S;
- булевская переменная p первоначально истинна, она будет указывать на знак слагаемого в сумме;
- последовательно считываем числа, и если p = true, то прибавляем очередное число к сумме S, иначе – отнимаем;
- на каждом шаге цикла значение p меняем на противоположное;
- выводим результат.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var n, i : integer; a, S : real; p: boolean; begin repeat write(‘Введите длину последовательности n=’); readln(n); until n>0; p:= true; S:=0; for i:=1 to n do begin write(‘Введите a=’); readln(a); if p then S:=S+a else S:=S–a; p:= not p end; writeln(‘Знакочередующая сумма чисел S= ‘, S); end. |
Задача 5.
Найти сумму первых n членов ряда y = 1 + x/2 + x2/3 + +x3/4+…, при |x|<1.
Переменные:
n – количество членов ряда;
x – переменная ряда;
z – вспомогательная переменная;
i – переменная цикла;
y – сумма ряда.
Алгоритм решения задачи:
- вводим количество членов ряда n и переменную X;
- в цикле порождаем очередной член ряда и прибавляем его к сумме y;
- выводим результат.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var x, y, z : real; n, i : integer; begin repeat writeln(‘Введите переменную ряда x, |x|<1, x=’); readln(x); write(‘Введите число членов ряда n=’); readln(n); until (abs(x)<1) and (n>0); y:=1; z:=1; for i:=2 to n do begin z:=z*x; y:=y+z/i; end; writeln(‘Сумма первых n членов ряда y =’, y); end. |
Задача 6.
Вводится последовательность из N целых чисел. Найти сумму всех отрицательных чисел.
Переменные:
n – количество чисел;
x – очередное число;
i – переменная цикла;
sum – сумма отрицательных чисел.
Алгоритм решения задачи:
- вводим длину последовательности n и устанавливаем на-чальное значение sum;
- последовательно считываем числа и, если число отрица-тельное, то прибавляем его к сумме sum;
- в зависимости от значения sum выводим результат.
var n, x, sum, i : integer; begin repeat write(‘Введите длину последовательности n=’); readln(n); until n>0; sum:=0; for i:=1 to n do begin write(‘Введите x=’); readln(x); if x<0 then sum:=sum+x; end; if sum=0 then writeln(‘Отрицательных чисел нет’) else writeln(‘Сумма отрицательных чисел sum= ‘, sum); end. |
Задача 7.
Вводится последовательность из N целых чисел. Найти наибольшее число.
Переменные:
n – количество чисел;
x – очередное число;
i – переменная цикла;
max – наибольшее число.
Алгоритм решения задачи:
- вводим длину последовательности n и устанавливаем на-чальное значение max по первому числу;
- последовательно считываем числа и, если очередное чис-ло x больше max, то переприсваиваем значение max := x;
- выводим результат.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var n, x, max, i : integer; begin repeat write(‘Введите длину последовательности n=’); readln(n); until n>0; write(‘Введите x=’); readln(x); max:=x; for i:=2 to n do begin write(‘Введите x=’); readln(x); if (x>max) then max:=x; end; writeln(‘Наибольшее из чисел max=’, max); end. |
Задача 8.
Вводится последовательность целых чисел, 0 – конец по-следовательности. Найти два наименьших числа.
Переменные:
x – очередное число;
min1 – первое наименьшее число;
min2 – второе наименьшее число (min2>=min1).
Алгоритм решения задачи:
- устанавливаем начальные значения min1 и min2 по двум первым числам;
- последовательно считываем числа и, если очередное чис-ло x меньше или равно min1 (min1<min2), то переприсваиваем значение min1 и min2;
- если x попадает в интервал от min1 до min2, то перепри-сваиваем только min2;
- выводим результат.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
var x,min1,min2:integer; begin write(‘Введите x=’); readln(x); min1:=x; write(‘Введите x=’); readln(x); min2:=x ; {min1<=min2} repeat if x<=min1 then begin min2:=min1; min1:=x; end else if (min1<x) and (x<min2) then min2:=x; write(‘Введите x=’); readln(x); until (x=0); writeln( ‘Два наименьших числа равны’, min1, ‘и’, min2); end. |
Задача 9.
Вводится последовательность ненулевых чисел, 0 – конец последовательности. Определить, является ли последователь-ность возрастающей.
Переменные:
old – предыдущее число;
new – рассматриваемое число;
f – флаг.
Решение данной задачи строится от противного. Математи-чески для того, чтобы последовательность была возрастающей, для каждого очередного элемента new и предыдущего old должно выполняться условие new > old. Любое нарушение данного усло-вия приводит к тому, что последовательность не может быть возрастающей.
Алгоритм решения задачи:
- вводим два первых числа как old и new, задаем начальное значение флага f;
- в цикле ищем нарушение свойства членов возрастающей последовательности;
- пере присваиваем значение old:=new и вводим новое – new;
- в зависимости от флага выводим результат.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var old, new : real; f : boolean; begin write(‘Введите x=’); readln(old); write(‘Введите x=’); readln(new); f:=true; repeat if new<=old then f:=false; old:=new; write(‘Введите x=’); readln(new); until new=0; if f then writeln( ‘Последовательность возрастающая’) else writeln( ‘Последовательность не является возрастающей’); end. |
Задача 10.
Даны натуральное n и последовательность веществен-ных чисел a1, a2,…, an. Сколько отрицательных чисел в начале по-следовательности (до первого неотрицательного)?
Переменные:
k – счетчик;
i – переменная цикла;
n – количество членов последовательности;
a – очередной член последовательности;
p – признак отрицательного числа в начале последователь-ности.
Алгоритм решения задачи:
- вводим длину последовательности, задаем начальное значение счетчика k;
- устанавливаем признак отрицательного цисла p=true;
- в цикле вводим очередной член последовательности;
- если это отрицательное число и до этого неотрицательных чисел не было, то увеличиваем значение счетчика на единицу;
- в противном случае, если член последовательности неот-рицателен, то полагаем p=false;
- в зависимости от k выводим результат.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var a: real; p: boolean; k,n : integer; begin repeat write(‘Введите длину последовательности n=’); readln(n); until n>0; k:=0; p:=true; for i:=1 to n do begin writeln(‘Введите число’); readln(a); if (a<0) and p then k:=k+1else if a>=0 then p :=false end; if k=0 then writeln(‘отрицательных чисел в начале нет’) else writeln(‘последовательность начинается с ‘, k, ‘ чисел’) end. |
Задача 11.
Дан прямоугольный бильярдный стол со сторонами А и В, где А, В – натуральные числа (бильярд Льюиса Кэролла). Из угловой лузы вылетает шар под углом 45 градусов к боковым стенкам, ударяется о борт, отскакивает, ударяется еще раз и т.д., пока не вылетит через одну из угловых луз. Рассчитать ко-личество отрезков в ломаной траектории шара. Считать угол падения равным углу отражения.
Данная задача решается с помощью стандартных функций выделения целой части от деления y на x (y div x) и выделения остатка y mod x. При прохождении шаром прямоугольного стола и отражении его от боковых сторон происходит увеличение числа отрезков траектории на два, а обратный путь вычисляется как y:=a–x+y mod x, где y – обратный путь для шара, a – длинная сторона стола, x – короткая сторона стола.
Переменные:
в функции bill:
x, y – два натуральных числа (формальные параметры);
k – вспомогательная переменная (локальная переменная);
a – длинная сторона стола (глобальная переменная);
в основной программе:
a, b – два натуральных числа (глобальные переменные).
Алгоритм решения задачи:
- создаем описание функции bill;
- вводим два натуральных числа a и b (не кратные друг другу);
- вызываем функцию bill для определения количества от-резков;
- завершаем работу программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var a, b : integer; function bill(y,x:integer):integer; var k:integer; begin k:=0; while y mod x <>0 do begin k:=k+y div x+2; y:=a–x+y mod x; end; bill:=k; end; begin repeat writeln(‘Введите два натуральных числа A>B’); readln(a,b); until a>=b; writeln(‘Количество отрезков в траектории: ‘, bill(a,b)); end. |
Задача 12.
Пусть процедура maxmin(x,y) присваивает параметру x большее из вещественных чисел x и y, а параметру y – меньшее. Описать данную процедуру и использовать ее для перераспреде-ления значений вещественных переменных a, b и c так, чтобы стало a > = b > = c.
var a,b,c : real; procedure maxmin( var x,y:real); var r:real; begin if x<y then begin r:=x; x:=y; y:=r end end; begin writeln(‘Введите три числа a,b,c –’); readln(a,b,c); maxmin(a,b); maxmin(a,c); {a=max} maxmin(b,c); {c=min} writeln(a,b,c); end. |
Задача 13.
Если среди чисел sin(x n) (где степень n = 1, 2, … ,30) есть хотя бы одно отрицательное число, то логической переменной t присво-ить значение true, а иначе – значение false.
var y,x : real; n : integer; t : boolean; begin write(‘Введите значение x –’); readln(x); y:=1; n:=0; repeat n:=n+1; y:=x*y; t:=sin(y)<0 until t or (n=30); writeln(t); end. |
Задача 14.
Определить k – количество трехзначных натуральных чисел, сумма цифр которых равна n ( 1 < n < 27 ). Операции деления ( /, div и mod) не использовать.
var d1, d2, d3, k, n : integer; begin writeln(‘Введите число n, с которым будем сравнивать сумму цифр числа’); readln(n); k:=0; {d1 – левая, d2 – средняя, d3 – правая цифры числа} for d1:=1 to 9 do for d2:=0 to 9 do for d3:=0 to 9 do if d1+d2+d3=n then begin k:=k+1; write(d1,d2,d3, ‘ ‘); end; writeln(‘Количество искомых чисел равно –’, k); end. |
Тема: Решение задач на языке Pascal.
Цели урока:
1. Обобщить и систематизировать знания учащихся по данной теме.
2. Продолжить формировать практические навыки по составлению блок схем и программ.
3. Показать взаимосвязь математики и информатики. Научить использовать знания, полученные на уроке математики при решении задач по информатике.
4. Развивать логическое мышление, умение обобщать, сопоставлять и применять полученные знания на практике.
5. Развивать познавательную деятельность учащихся, прививать интерес к составлению программ, развивать умение анализировать происходящие изменения в решении задач.
Воспитательные цели:
1. Развивать познавательный интерес, творческую активность, интеллект.
2. Развивать интуицию, эрудицию, самостоятельность в суждениях, упорство в достижении цели.
3. Развивать культуру общения, воспитывать внимание, сообразительность, находчивость, тренировку памяти, умение работать в группе.
Тип урока: Комбинированный.
Метод: Проблемно – поисковый метод при решении задач по информатике.
ХОД УРОКА
Учитель: В начале урока я предлагаю следующую задачу для решения в классе: Найти наибольшее число из трех заданных чисел. На доске записываю несколько троек чисел: 568, 742, 390.
Учащиеся называют максимальное число: 742.
Вопрос: “Каким образом вы определили, что данное число максимальное?”.
Если это первые уроки программирования, то учащиеся затрудняются ответить на этот вопрос, поскольку они еще не привыкли отслеживать свои действия при решении задач. Надо помочь дополнительными вопросами, в поисках верного ответа:
Учитель: Мы сравнили числа друг с другом.
Учитель: А как на уроке математике вы бы сравнили натуральные трехзначные числа?
Ответ: Посмотрели разряд числа – если единицы разрядов сотен равны, то сравниваем единицы разрядов десятков, если они равны, сравниваем разряд единиц и больше то число, у которого разряд сотен больше.
Вывод: Итак, максимальное число: 742
Проблема: “А как компьютер сравнит три числа?”
Я обращаю внимание ребят, что машина может сравнивать только два числа
Обозначим одно число буквой А, второе число буквой B, третье число – буквой С.
Учащиеся: Предлагают такой вариант решения проблемы: надо сравнивать первые два числа, а затем, большее из них с третьим числом.
Учитель: Нарисуйте в тетради блок – схему для сравнения трех чисел.
Учащиеся в тетради рисуют блок – схему, а затем сравнивают составленную ими схему с блок – схемой на доске. Одному из учащихся предлагаю сделать анализ блок – схемы. А теперь в соответствии с блок – схемой составьте – программу.
Учащиеся самостоятельно составляют программу.
Учитель: Проверьте правильность работы программы, введите заданные числа и посмотрите результат.
Проблема: А может ли измениться исходное значение переменной А в процессе работы программы?
Ответ: Да.
Учитель: А как? Ответ обоснуйте.
Решение:
1. Находим наибольшее из первых двух данных чисел A и B, а затем – максимальное из полученного числа и третьего данного числа С.
Program MAX1;
Var A, B, C, max: real;
begin
writeln (‘Введите три числа A, B, C’);
readln (A, B, С);
if AB then max:=A else max:=b;
if C max then max:=C;
writeln(‘Максимальное значение=’,max);
end.
Учитель: Как вы думаете, можно ли решить задачу другими способами?
Учащиеся получают задание на уроке и продолжают поиск решения задачи.
Предполагаемые решения учащихся:
2 способ. При решении задачи можно проверить, является ли первое число A максимальным и если не является, то сравниваем второе и третье число B и C.
Program MAX2;
Var A, B, C, max: real;
begin
writeln (‘Введите три числа A, B, C’);
readln (A, B, С);
If (AB) and (AC) then max:=A;
if BC then Max:=B else Max :=C;
Writeln(‘Максимальное значение =’, Max);
End;
3 способ. Можно решить задачу, сравнивая попарно все числа .
Program MAX3;
var A, B, C, Max: real;
begin
Writeln(‘Введем три числа’);
readln(A, B, C);
If (AB) and (AC) then Max:= A;
If (BA) and (BC) then Max:=B;
If (CA) and (CB) then Max:=C;
Writeln(Max:6:2);
end.
Чтобы убедиться в правильности выполнения программы, желательно рассмотреть ее выполнение с помощью таблицы значений. При проверке правильности выполнения программы необходимо рассматривать все возможные варианты АВС, АСВ, ВСА, СВА, ВАС, САВ.
Проблема: А можно написать программу, чтобы она выстраивала числа в порядке возрастания или убывания?
Ученики предлагают свои варианты решения данной проблемы.
Варианты решения задачи:
Программа выстраивает числа в порядке убывания.
Program MAX4;
Var A, B, C, Max: real;
begin
Writeln(‘Введите три числа’);
Readln(A, B, C);
If (AB) and (AC) and (BC) then writeln (A, ‘ ‘,B,’ ‘,C);
If (BC) and (BA) and (AC) then writeln (B, ‘ ‘,A,’ ‘,C);
If (CA) and (CB) and (AB) then writeln (C, ‘ ‘,A,’ ‘,B);
If (AB) and (AC) and (CB) then writeln (A, ‘ ‘,C,’ ‘,B);
If (BC) and (BA) and (CA) then writeln (B, ‘ ‘,C,’ ‘,A);
If (CA) and (CB) and (BA) then writeln (C, ‘ ‘,B,’ ‘,A);
End.
Программа печатает максимальное число, минимальное число и среднее число.
Program MAX5;
Var A, B, C, Max, Min, Sr : real;
begin
Writeln(‘Введите три числа’);
Readln(A, B, C);
If AB Then Max:=A else Max:=B;
If C Max Then Max:=C;
If AIf CIf (AB) and (AIf (BA) and (BIf (CA) and (CIf (BC) Then Sr:=B;
If (AC) Then Sr:=A;
If (CB) Then Sr:=C;
Writeln (‘Max=’, Max:6:2);
Writeln (‘Sr=’, Sr:6:2);
Writeln (‘Min=’, Min:6:2);
End.
РАССМОТРИМ ЗАДАЧУ № 2.
Даны три натуральных числа. Найти их наибольший общий делитель.
Вопрос: Какие существуют методы нахождения НОД?
Ответ: Существуют различные методы нахождения наибольшего общего делителя нескольких натуральных чисел:
1. разложения на простые сомножители,
2. алгоритм Евклида,
3. целочисленное деление.
Найти НОД чисел 48, 36, 24
Разложим на множители числа:
48 = 2 * 2 * 2 * 2 *3
36 = 2 * 2 * 3 * 3
24 = 2 * 2 * 2 * 3
Из множителей вычеркиваем те, которые не входят в разложение второго и третьего числа
– это числа 2 * 2 * 3 =12
Учитель: Сделайте вывод для тройки чисел x, y, z.
Проблема: Какие же знания и умения необходимы для построения алгоритма нахождения НОД?
Для того чтобы построить алгоритм, необходимо уметь:
-
определять все простые множители в пределах заранее неизвестных чисел х и у, z;
-
хранить эти простые множители и обращаться к ним;
-
хранить все сомножители для чисел х и у, z;
-
выбирать из трех множеств одинаковые элементы.
Сделайте анализ.
Каждая часть задачи сложна для алгоритмизации. Построение массива простых чисел требует проверки, является ли число простым, т.е. не делится ли оно на все простые числа, меньше данного.
Второй метод решения – рекурсивный. Его общепринятое название – алгоритм Евклида – это алгоритм нахождения наибольшего общего делителя (НОД) двух целых неотрицательных чисел.
НОД (х, у) вычисляется в соответствии со следующим правилом:
НОД (х, у)=
Мы разбирали решение задачи для нахождения НОД двух чисел.
Для решения данной задачи воспользуемся циклом с постусловием.
Третий метод решения – это целочисленное деление.
Пусть х и у – одновременно не равные нулю целые неотрицательные числа, и пусть ху. Если у = 0, то НОД (х, у) = х, а если у0, то для чисел х, у и r, где r остаток от деления х на у, выполняется равенство НОД (х, у) = НОД (у, r).
В соответствие со следующим правилом:
НОД(48, 18) = НОД(18, 12) = НОД(12, 6) = 6.
Первое число делим нацело на второе. Очевидно, что остаток целочисленного деления меньше второго числа. Если остаток равен нулю, то это значит, что первое число нацело делится на второе, и в этом случае второе число и будем считать НОД (в соответствие с определением). Если остаток не равен нулю, то заменим первое число на второе, а второе – на остаток, и будем повторять действия до тех пор, пока остаток не станет равным нулю.
Запишем алгоритм решения задачи:
1. Ввод натуральных чисел х, у.
2. Найдем r – остаток от деления х нацело на у.
3. Если r = 0, то найдем значение у, иначе х:=у; у:= r.
4. Найдем r – остаток от деления х нацело на у.
-
Вычислить значение х
-
Порядок действий имеет большое значение. Результат выполнения операций x:=x; y:=r отличен от результата выполнения операций
y: = r; x: =y.
Проблема: А правильно ли мы составили алгоритм?
Задание на дом: Докажите правильность алгоритма.
Решение задачи для нахождения НОД двух чисел.
Program NOD_1;
Var x, y:integer;
Begin
Writeln(‘Введите два числа’);
Readln (x, y);
Repeat
If x y then x:= x mod y else y:= y mod x;
Until (x = 0) or ( y = 0);
{до тех пор, пока одно из чисел не станет равно нулю}
Writeln (‘НОД=’, x + y);
{ Вывод НОД. Одно из чисел обязательно равно нулю}
Readln;
End.
Машина может находить НОД двух чисел.
Проблема:
Как составить программу для нахождения НОД трех?
Учащиеся:
Сначала находим НОД двух чисел, а затем находим НОД третьего числа.
НОД (a, b, c) = НОД (НОД(a, b), c).
Я предлагаю ученикам самим решить задачу.
Один из способов решения задачи, предлагаемый учениками приведен ниже.
Программа на Паскале:
Program NOD_2;
Var A, B,C, S:integer;
Begin
Readln(A, B, C);
Repeat
If AB then A:=A mod B
Else B:=B mod A;
Until (A = 0) or ( B = 0);
Writeln (‘НОД=’, A + B);
S:=A + B;
Repeat
If S C then S:= s mod C else C:= C mod S;
Until (S = 0) or ( C = 0);
Writeln (‘НОД=’, S + C);
{Вывод НОД. Одно из чисел обязательно равно нулю
Readln;
End.
Предложенные методы и соответствующие им алгоритмы существенно не различаются, но для конкретных выбранных значений обнаруживается существенная разница в количестве операций при решении задачи. Оценить заранее, какой метод будет эффективнее для конкретных исходных данных, не возможно, так, как нельзя оценить, сколько раз будет выполняться тело цикла (количество повторов).
Для учеников проблема состоит еще и в том, чтобы выбрать метод, который будет более эффективен и прост в решении.
Домашнее задание:
1) Написать программу вычисления нахождения максимального числа из трех заданных чисел.
2) Найти НОД трех чисел любым удобным для вас способом.
текст программы:
var a:string;
begin
writeln(‘Введите Ваше имя’);
readln(a);
writeln(‘Здравствуйте, ‘,a);
end.
Напишите программу, запрашивающую Ваше имя, Ваш возраст и рост в см (ввод с клавиатуры) и выводящую на экран следующее сообщение:
Здравствуйте, …
Вам … лет
Ваш рост … см
текст программы
var a:string;
v,r:integer;
begin
writeln(‘Введите Ваше имя’);
readln(a);
writeln(‘Сколько Вам лет’);
readln(v);
writeln(‘Введите Ваш рост в см’);
readln(r);
writeln(‘Здравствуйте, ‘,a);
writeln(‘Вам ‘,v,’ лет’);
writeln(‘Ваш рост ‘,r,’ см’);
end.
Вычисление математических выражений
Задача (урок )
Напишите программу для вычисления значение выражения y=5x+20 где x целое число, вводимое с клавиатуры. Вывод оформите следующим образом:
при x=… y=…
Обратите внимание, что если x – цело число, то вычисляемый y тоже будет целым числом.
Математические выражения на Pascal расписываются со всеми математическими операциями и учитывая порядок действий: y:=5*x+20
текст программы:
var x,y:integer;
begin
writeln(‘введите целое число’);
readln(x);
y:=5*x+20;
writeln (‘при x=’,x,’ y =’,y);
end.
Задача (урок )
Программа демонстрирующая работу функций div и mod.
текст программы:
var a,b:integer;
begin
writeln(‘введите целое число a’);
readln(a);
writeln(‘введите целое число b’);
readln(b);
writeln (‘a mod b = ‘,a mod b);
writeln (‘a div b = ‘,a div b);
end.
Условный оператор if … then … else (если … тогда … иначе)
Задача (урок )
Напишите программу для вычисления значение выражения
где x целое число, вводимое с клавиатуры.
Пояснение.
В данной задаче используется условный оператор if для того, чтобы исключить деление на 0. Пример алгоритма с ветвлением (или разветвляющийся алгоритм).
блок-схема
текст программы:
var x:integer;
y:real;
begin
writeln(‘введите целое число’);
readln(x);
if (x-3)<>0 then
begin
y:=(x+5)/(x-3);
writeln (‘при x=’,x,’ y =’,y);
end
else
writeln(‘значение выражения не определено’);
end.
Задача (урок )
Вычислите значение выражения
x целое число, вводимое с клавиатуры.
Обратите внимание, что в данной задаче у нас идет ограничение на переменную x: под корнем выражение (5x-20) должно быть больше или равно 0 и (x-4) не равно 0. Задачу решаем с использование сложного условия.
Вариант 1 с “и”: (5*x-20>=0) and (x-4<>0)
Вариант 2 с “или”: (5*x-20<0) or (x-4=0)
блок-схема вариант 1
Задача (урок )
Составить программу, которая если вводимое с клавиатуры целое число четное выводить на экран сообщение “это четное число”, в противном случае – “это нечетное число”.
текст программы:
var x:integer;
begin
writeln(‘Ведите целое число’);
readln(x);
if x mod 2=0 then writeln(‘это четное число‘)
else writeln(‘это нечетное число‘);
end.
Задача (урок )
Составить программу, которая если вводимое с клавиатуры целое число больше 0 выводить на экран сообщение “это число положительное”, если число равно 0 – “это ноль”, если число меньше 0 – “это число отрицательное”.
var x:integer;
begin
writeln(‘Ведите целое число’);
readln(x);
if x>0 then writeln(‘это число положительное‘);
if x=0 then writeln(‘это ноль‘);
if x<0 then writeln(‘это число отрицательное‘);
end;
Задача (урок )
Составить программу-тест по арифметике, состоящую из 5 примеров. Программа должна работать следующим образом: на экран выводится пример (вопрос) и пользователь вводит ответ с клавиатуры. За 5 правильных ответов ставиться оценка “5”, за 4 – “4”, за 3 – “3”, за 2, 1, 0 правильных ответов оценка “2”.
Пояснение.
При написании программы по данной задаче нам потребуется 5 переменных числового типа (лучше использовать тип real, но если оговорить, что ответами на примеры должны быть целые числа, ведь примеры подбирает сам учащийся, то используем тип integer). Назовем наши переменные для хранения ответов ot1, ot2, ot3, ot4, ot5, для оценки – oz.
Подсчет и выставление оценки: через оператор if за каждый правильный ответ будем прибавлять 1 бал, а чтобы баллы накапливались используем формулу oz:=oz+1. Таким образом, в переменной oz будет храниться правильное количество ответов, но оценки 0 и 1 нет по условию задачи, следовательно нужно через if поставить “2” если oz<=2.
текст программы
var ot1,ot2,ot3,ot4,ot5:real;
oz:integer;
begin
writeln(‘Вычислите’);
writeln(’12-4=?’);
readln(ot1);
if ot1=8 then oz:=oz+1;
writeln(‘3*15=?’);
readln(ot2);
if ot2=45 then oz:=oz+1;
writeln(‘8+13=?’);
readln(ot3);
if ot3=21 then oz:=oz+1;
writeln(‘7/2=?’);
readln(ot4);
if ot4=3.5 then oz:=oz+1;
writeln(‘9*7=?’);
readln(ot5);
if ot5=63 then oz:=oz+1;
if oz<=2 then oz:=2;
writeln(‘Ваша оценка ‘,oz);
end.
Задача (урок )
Напишите программу для нахождения корней квадратного уравнения
текст программы
var a,b,c,D:integer;
x1,x2:real;
begin
writeln(‘Решение квадратного уравнения a*x*x+b*x+c=0’);
writeln(‘введите a’);
readln(a);
writeln(‘введите b’);
readln(b);
writeln(‘введите c’);
readln(c);
D:=b*b-4*a*c;
if D>=0 then
begin
x1:=(-b+sqrt(D))/2*a;
x2:=(-b-sqrt(D))/2*a;
writeln(‘x1=’,x1,’ x2=’,x2);
end
else writeln(‘нет корней’);
end.
Задача (урок )
Напишите программу нахождения наибольшего числа из трех случайных чисел от 1 до 10.
Для нахождения наибольшего числа из трех, нужно сначала сравнить два числа и выбрать наибольшее из них через оператор if, затем сравнить полученное наибольшее с третьим числом, если третье число больше, то переприсваиваем.
текст программы
var a,b,c,max:integer;
begin
a:=random(20)+1;
writeln(a);
b:=random(20)+1;
writeln(b);
c:=random(20)+1;
writeln(c);
readln(c);
if a>b then max:=a else max:=b;
if max<c then max:=c;
writeln (‘наибольшее из трех чисел ‘,max);
end.
Задача (урок )
Напишите программу которая “умеет” определять четное число вводиться с клавиатуры или нечетное.
Пояснение: четные числа делятся на 2 с остатком 0, поэтому нужно использовать в качестве условия функцию mod (x mod 2=0).
var m:integer ;
begin
writeln(‘введите число’);
readln(m);
if m mod 2=0 then writeln(‘число четное’)
else writeln(‘число нечетное’);
end.
Работа со строковыми функциями copy и length
Задача (урок )
Напишите программу, которая у любого введенного с клавиатуры слова, длинной не более 15 символов вырезает подстроку с 5-го символа длинной в 5 символов.
текст программы
var sl:string[15];
begin
writeln(‘Ведите слово длинной не более 15 символов’);
readln(sl);
writeln(‘Результат – ‘,copy(sl,5,5));
end.
Задача 10 (урок 09.03.21)
Напишите программу, которая у любого введенного с клавиатуры слова меняет местами 1-ю и последнюю буквы.
Пояснение.
Пусть исходная строка храниться под именем s, тогда последний символ нового слова он же первый символ исходного подстрока – copy(s,1,1).
Как узнать номер последнего символа исходного слова? У нас есть функция вычисляющая длину строки length, количество символов в слове и номер последнего символа это одно и то же число. Получаем первый символ нового слова – copy(s,length(s),1).
Осталось найти середину: нам нужно вырезать со второго символа строчку длинной на 2 символа меньше, чем длинна исходного слова (первый и последний символу уже использованы) – copy(s,2,length(s)-2)
Чтобы было проще записывать выражение, присвоим значение функции переменной n:=length(s)
текст программы
var s:string;
n:integer;
begin
writeln(‘Ведите слово’);
readln(s);
n:=length(s);
writeln(‘Результат -‘, copy(s,n,1)+copy(s,2,n-2)+copy(s,1,1));
end.
Задача (урок )
Напишите программу, которая получает с клавиатуры слово и если количество букв в слове четное выводит половинку слова (например: дорога – дор), если количество букв в слове нечетное, тогда часть слова до центральной буквы и последнюю букву (например: ромашка – рома).
текст программы
var
s:string;
k:integer;
begin
writeln(‘введите слово‘);
readln(s);
k:=length(s);
if k mod 2=0 then writeln(copy(s,1,k div 2))
else
writeln(copy(s,1,k div 2)+copy(s,k,1));
end.
Задача (урок )
Напишите программу, которая получает с клавиатуры слово и если количество букв в слове кратно 4 выводит вторую половинку слова (например: крокодил – одил), если количество букв в слове не кратно 4, тогда последние 2 буквы (например: ромашка – ка).
текст программы
var
s:string;
k,n:integer;
begin
writeln(‘введите слово‘);
readln(s);
k:=length(s);
if k mod
4=0 then
begin
n:=k div 2;
writeln(copy(s,n+1,n))
end
else
writeln(copy(s,k-1,2));
end.
Задача (урок )
Напишите программу, которая для любого вводимого с клавиатуры трехзначного числа вычисляет и выводит на экран количество сотен, десятков и единиц (например, для числа 741 результат будет: сотен – 7, десятков, – 4, единиц – 1)
текст программы
var x:integer;
e,d,s:integer;
begin
writeln(‘введите 3-х значное число’);
readln(x);
s:=x div 100;
e:=x mod 10;
d:=x div 10 mod 10;
writeln(‘сотен – ‘,s,’ десятков – ‘,d,’ единиц – ‘,e);
end.
Задача (урок)
Составить программу, в которой стороны прямоугольника (a – ширина, b – высота) задаются двумя случайных числа в диапазоне от 5 до 20 и если a больше b, то вычисляется площадь прямоугольника, иначе – периметр. Вывод данных оформить следующим образом:
ширина …
высота …
площадь (или периметр) …
блок-схема
текст программы
var a,b,s,p:integer;
begin
a:=random(16)+5;
writeln(a);
b:=random(16)+5;
writeln(b);
if a>b then
begin
s:=a*b;
writeln(‘площадь ‘,s);
end
else
begin
p:=2*(a+b);
writeln(‘периметр ‘,p);
end;
end.
Оператор цикла с известным количеством повторений for i:=начальное значение to конечное значение do оператор
Задача (урок )
Составьте программу, которая из 10 случайных чисел из промежутка от 10 до 20 находит количество чисел меньших 17. Оформите вывод следующим образом: вывод чисел через пробел в строчку, на следующей строке количество чисел меньших 17.
блок-схема
текст программы
var i,x,k:integer;
begin
k:=0;
for i:=1 to 10 do
begin
x:=random(11)+10;
write(x,’ ‘);
if x<17 then k:=k+1;
end;
writeln;
writeln(‘Количество меньших 17 ‘,k);
end.
Задача (урок )
Составьте программу, которая выводит на экран в строчку 15 случайных чисел из промежутка от 1 до 30 и подсчитывает количество четных чисел.
Пояснение.
Обратите внимание, что переменная k – счетчик, поэтому начальное значение переменной обнуляем. Условие для подсчета четных: if a mod 2 =0 then k:=k+1, т.е. если число четное, то k увеличивается на 1.
Текст программы
var i,a,k:integer;
begin
k:=0;
for i:=1 to 15 do
begin
a:=random(30)+1;
if a mod 2=0 then k:=k+1;
write(a,’ ‘);
end;
writeln;
writeln(‘Количество четных ‘,k);
end.
Задачи из ОГЭ по информатике на циклы:
Что будет напечатано в результате работы следующей программы?
var s,k:integer;
begin
s:=50;
for k:=1 to 6 do s:=s-4;
write(s);
end.
Работа программы:
var s,k:integer; – описание переменных целого типа s и k
s:=50; – s=50
for k:=1 to 6 do s:=s-4;
k=1 s=50-4=46
k=2 s=46-4=42
k=3 s=42-4=38
k=4 s=38-4=34
k=5 s=34-4=30
k=6 s=30-4=26
write(s); – вывод на экран значение переменной s равное 26
Можно решить данную задачу выражением.
Цикл выполняется 6 раз, следовательно s = 50 – 6*4 = 26
Оператор цикла while (цикл ПОКА)
while <условие> do оператор;
Выполняет действие или действия пока истинно условие. После каждого прохождения тела цикла, условие проверяется и если условие ложно, осуществляется выход из цикла.
Если условие истинно всегда, то происходит зацикливание.Чтобы прервать зациклившуюся программу, следует использовать комбинацию клавиш Ctrl-F2.
Условие – логическое выражение, записанное с помощью логических операторов сравнения.
Задача (урок )
Составьте программу,которая для введенного с клавиатуры целого числа выводит на экран в столбик число единиц, десятков, сотен и т.д.
Пример: 742
результат
2
4
7
Текст программы
var x,a:integer;
begin
readln(x);
writeln(‘результат’);
while x<>0 do
begin
a:=x mod 10;
writeln(a);
x:=x div 10;
end;
end.
Задача (урок 27.04.2021)
Составьте программу, которая пока не будет введен 0 запрашивает целые положительные числа с клавиатуры и находит среди них наибольшее. Результат выводится на экран.
Пояснение
Обратите внимание, что если требуется найти наибольшее число, начальное значение переменной, в которой будем его хранить, делаем наименьшим из возможных (в данном случае max=0).
Условие для нахождения максимального элемента if a>max then max:= a.
блок-схема
Текст программы
var x,max:integer;
begin
max:=0;
readln(x);
while x<>0 do
begin
if x>max then max:=x;
readln(x);
end;
writeln(‘max=’,max);
end.
Задача (урок )
Составьте программу, которая пока не будет введен 0 запрашивает целые положительные числа с клавиатуры и находит среди них количество двузначных чисел, оканчивающихся на цифру 3. Среди вводимых чисел обязательно есть такое число. Результат выводится на экран.
Пояснение.
Для подсчета количества используем накопитель, переменную k. Обратите внимание, что переменная k – счетчик, поэтому начальное значение переменной обнуляем. Условие для подсчета: (x mod 10=3) – окончание на 3, (x>9) and (x<100) – двузначное число, k:=k+1, т.е. если число удовлетворяет условию, то k увеличивается на 1.
Текст программы
var x,k:integer;
begin
k:=0;
readln(x);
while x<>0 do
begin
if (x mod 10=3)and(x>9)and(x<100) then k:=k+1;
readln(x);
end;
writeln(‘результат’,k);
end.
Задача (урок)
Составьте программу, которая выводит на экран в строчку 10 случайных чисел из промежутка от 2 до 7 и подсчитывает количество чисел равных 2.
Пояснение.
Для подсчета количества двоек используем накопитель, переменную k. Обратите внимание, что переменная k – счетчик, поэтому начальное значение переменной обнуляем. Условие для подсчета 2: if a=2 then k:=k+1, т.е. если число равно 2, то k увеличивается на 1.
Текст программы
var i,a,k:integer;
begin
k:=0;
for i:=1 to 10 do
begin
a:=random(6)+2;
if a=2 then k:=k+1;
write(a,’ ‘);
end;
writeln;
writeln(‘Количество двоек ‘,k);
end.
Задача (урок)
Составьте программу, которая выводит на экран в строчку 10 случайных чисел из промежутка от 1 до 30 и находит наибольшее число.
Пояснение
Обратите внимание, что если требуется найти наибольшее число, начальное значение переменной, в которой будем его хранить, делаем наименьшим из возможных (в данном случае max=0).
Условие для нахождения максимального элемента if a>max then max:= a.
Текст программы
var i,a,max:integer;
begin
max:=0;
for i:=1 to 10 do
begin
a:=random(30)+1;
if a>max then max:=a;
write(a,’ ‘);
end;
writeln;
writeln(‘Максимальное ‘,max);
end.
Задача (урок)
Составьте программу, которая выводит на экран в строчку 10 случайных чисел из промежутка от 1 до 30 и находит наименьшее число.
Пояснение
Обратите внимание, что если требуется найти наименьшее число, начальное значение переменной, в которой будем его хранить, делаем наибольшим из возможных (в данном случае min=31).
Условие для нахождения наименьшего if a<min then min:= a.
Текст программы
var i,a,min:integer;
begin
min:=31;
for i:=1 to 10 do
begin
a:=random(30)+1;
if a<min then min:=a;
write(a,’ ‘);
end;
writeln;
writeln(‘Наименьшее ‘,min);
end.
Задача (урок)
Составьте программу, которая выводит на экран в строчку 10 случайных чисел из промежутка от 1 до 10 и находит сумму чисел <=3.
var i,a,s:integer;
begin
s:=0;
for i:=1 to 10 do
begin
a:=random(10)+1;
if a<=3 then s:=s+a;
write(a,’ ‘);
end;
writeln;
writeln(‘Сумма чисел <=3 ‘,s);
end.
Задача (урок)
Составьте программу, которая из 5, вводимых с клавиатуры целых чисел, находит максимальное число, оканчивающееся на цифру “5” (среди вводимых чисел обязательно есть такое число).
Текст программы
var i,a,max:integer;
begin
max:=0;
for i:=1 to 5 do
begin
readln(a);
if (a mod 10=5) and (a>max) then max:=a;
end;
writeln(‘Максимальное число оканчивающееся на 5: ‘,max);
end.
Задача (урок)
Составьте программу, вычисляющую значение выражения f=1+2+3+4+ …+n, где n – целое положительное число, вводимое с клавиатуры.
Пояснение
Обратите внимание, что в формуле складываются числа с 1 и по порядку до n. Мы знаем, что переменная цикла for i, тоже принимает значения с начального до конечного по порядку. Если n будет конечным значение переменной цикла, то i будет принимать нужные нам слагаемые: 1, 2 ,3, 4 … n.
Остается понять как организовать сложение, здесь и в подобных случаях используется формула f:=f+i и в самом начале программы или перед циклом переменной f присваивается значение 0 (f:=0)
Ход программы (пример):
пусть f=0, n=4
работа оператора for i:=1 to n do f:=f+i
шаг 1: i=1 f=0+1=1, в ОП (оперативной памяти) f=1
шаг 2: i=2 f=1+2=3, в ОП f=3
шаг 2: i=3 f=3+3=6, в ОП f=6
шаг 2: i=4 f=6+4=10, в ОП f=10
Проверка: f=1+2+3+4=10
Текст программы
var i,f,n:integer;
begin
f:=0;
writeln(‘введите целое число < 100’);
readln(n);
for i:=1 to n do f:=f+i;
writeln(‘f=’,f);
end.
Задача (урок)
Составьте программу, вычисляющую значение выражения f=1*2*3*4* …*n, где n – целое положительное число, вводимое с клавиатуры.
Пояснение
В данной программе мы используем тот же прием, что и в примере 8, но в данной ситуации нам не подходит начальное значение f=0 (при умножении на 0 произведение равно 0). Нам нужно число не влияющее на результат умножения, т.е. начальное значение f=1.
Получаем: for i:=1 to n do f:=f*i
Текст программы
var i,f,n:integer;
begin
f:=1;
writeln(‘введите целое число < 100’);
readln(n);
for i:=1 to n do f:=f*i;
writeln(‘f=’,f);
end.
Задача (урок)
Составьте программу, вычисляющую значение выражения
где n – целое положительное число, вводимое с клавиатуры.
Пояснение
В данной программе целесообразно отдельно посчитать в цикле числитель (например, f1=1+2+3+…+n) и знаменатель (f2=1*2*3*…*n), а после цикла вычислить все выражение f=f1/f2.
Обратите внимание, что в данной программе знаменатель никогда не будет равным 0, поэтому исключать деление на 0 через оператор if не нужно.
Текст программы
var i,f1,f2,n:integer;
f:real;
begin
f1:=0;
f2:=1;
writeln(‘введите целое число < 100’);
readln(n);
for i:=1 to n do
begin
f1:=f1+i;
f2:=f2*i;
end;
f:=f1/f2;
writeln(‘f=’,f);
end.
Задача (урок)
Составьте программу, вычисляющую значение выражения
где x – целое число, n – целое положительное число, вводимые с клавиатуры.
Пояснение
В данной задаче на каждом шаге цикла нам нужно получить соответствующую степень числа x. На первом – 1-ю, на втором – 2-ю и т.д. Мы не можем использовать переменную цикла i в формуле, так как в pascal нет функции степень с произвольным показателем. Если взять переменную p с начальным значением 1 (p:=1) и в цикле использовать формулу для подсчета степени числа x p:=p*x, то получим:
шаг 1: i=1 p=1*x=x
шаг 2: i=2 p=x*x
шаг 3: i=3 p=x*x*x и т.д.
Но нам нужно подсчитывать и сумму степеней f=x+x*x+x*x*x+…. В этом же цикле будем считать сумму по формуле f:=f+p, задав начальное значение f=0.
шаг 1: i=1 p=1*x=x, f=0+p=x
шаг 2: i=2 p=x*x, f=x+p=x+x*x
шаг 3: i=3 p=x*x*x, f=x+x*x+x*x*x и т.д.
Текст программы
var i,f,p,n,x:integer;
begin
f:=0;
p:=1;
writeln(‘введите целое число < 100’);
readln(n);
writeln(‘введите число x’);
readln(x);
for i:=1 to n do
begin
p:=p*x;
f:=f+p;
end;
writeln(‘f=’,f);
end.
Задача (урок)
Составьте программу, вычисляющую значение выражения f= x+2x+3x+…+nx
где x – целое число, n – целое положительное число, вводимые с клавиатуры.
Пояснение
В этой программе будем использовать переменную цикла i как коэффициент для переменной x:
for i:=1 to n do f:=f+i*x
Текст программы
var i,f,n,x:integer;
begin
f:=0;
writeln(‘введите целое число < 100’);
readln(n);
writeln(‘введите число x’);
readln(x);
for i:=1 to n do f:=f+i*x;
writeln(‘f=’,f);
end.