Задача 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).
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 меняем на противоположное;
- выводим результат.
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;
- выводим результат.
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.