Задача 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).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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).
1 2 3 4 5 6 7 8 9 |
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;
1 2 3 4 5 6 7 8 9 |
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 выводим результат.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 |
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) не использовать.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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. |