Pascal: Примеры задач с решением

Задача 1.

Вычислить: y = sin1 + sin1.1 + sin1.2 + … + sin2.


Первый вариант решения данной задачи.

Анализируя данную формулу, видим, что аргумент функции sin очередного слагаемого отличается от предыдущего на 0.1. Поэтому для решения данной задачи можно составить следующий алгоритм:

Переменные:

с – очередное слагаемое;

i – аргумент функции;

y – сумма.

  1. Обнуляем начальное значение переменной y (строка 5), в которой будем накапливать сумму.
  2. Начальное значение аргумента функции i равно 1 (строка 6).
  3. Проверяем, значение i меньше или равно 2, т.к. по заданию аргумент функции изменяется от 1 до 2 (строка 7)?
  4. Если «да», то определяем очередное значение функции (строка 9). Сохраняем его в переменной с. Если «нет», то расчет суммы закончен – переходим на шаг 78.
  5. Добавляем это слагаемое в сумму (строка 10).
  6. Увеличиваем значение аргумента i на 0.1 (строка 11).
  7. Переходим на шаг 3.
  8. Выводим результат на экран (строка 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 – сумма.

  1. Обнуляем начальное значение переменной y (строка 6), в которой будем накапливать сумму.
  2. Организуем цикл для определения суммы (параметр дан-ного цикла должен измениться от 0 до 10) .
  3. В данном цикле определяем очередное слагаемое по фор-муле и добавляем это слагаемое в сумму (строка 7).
  4. Выводим результат на экран (строка 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 – вспомогательный флаг.

Алгоритм решения задачи:

  1. Вводим значение переменной n. Т.к. пользователь может случайно ввести отрицательное число, то необходимо дать ему возможность для повторного ввода значения переменной n. По-этому организуем цикл (строки 3–6 текста программы). Лучше использовать цикл с пост проверкой условия (Repeat…Until). Тело цикла составляют два оператора: вывода на экран приглашения для ввода значения переменной n (строка 4) и оператор чтения с клавиатуры – для непосредственного ввода значения переменной n (строка 5). Данный цикл будет выполняться до тех пор, пока пользователь не введет любое положительное число (срока 6).
  2. Выводим на экран значение переменной n и начинаем формировать ответ. Ответ будет представлен в следующем виде (например, в качестве значения переменной n ввели 8):         8 = 1*2*2*2. Т.к. единица является простым множителем для любого числа, то выводим ее на экран (строка 7). В результате выполнения данной строки на экране появится: 8=1.
  3. Вспомогательной переменной f присваиваем значение false. Данная переменная нам будет необходима для определения, а были ли вообще найдены простые множители у заданного числа n. Запоминаем исходное значение переменной n в переменной j (строка 8).
  4. В цикле по переменной 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 и повторяем те же действия для нового делителя.
  5. Если у числа нет делителей (оно является простым), то данное число можно разложить только на 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 – знакочередующая сумма чисел.

Алгоритм решения задачи:

  1. вводим длину последовательности n и устанавливаем начальное значение S;
  2. булевская переменная p первоначально истинна, она будет указывать на знак слагаемого в сумме;
  3. последовательно считываем числа, и если p = true, то прибавляем очередное число к сумме S, иначе — отнимаем;
  4. на каждом шаге цикла значение p меняем на противоположное;
  5. выводим результат.
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 – сумма ряда.

Алгоритм решения задачи:

  1. вводим количество членов ряда n и переменную X;
  2. в цикле порождаем очередной член ряда и прибавляем его к сумме y;
  3. выводим результат.
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 – сумма отрицательных чисел.

Алгоритм решения задачи:

  1. вводим длину последовательности n и устанавливаем на-чальное значение sum;
  2. последовательно считываем числа и, если число отрица-тельное, то прибавляем его к сумме sum;
  3. в зависимости от значения 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 – наибольшее число.

Алгоритм решения задачи:

  1. вводим длину последовательности n и устанавливаем на-чальное значение max по первому числу;
  2. последовательно считываем числа и, если очередное чис-ло x больше max, то переприсваиваем значение max := x;
  3. выводим результат.
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).

Алгоритм решения задачи:

  1. устанавливаем начальные значения min1 и min2 по двум первым числам;
  2. последовательно считываем числа и, если очередное чис-ло x меньше или равно min1 (min1<min2), то переприсваиваем значение min1 и min2;
  3. если x попадает в интервал от min1 до min2, то перепри-сваиваем только min2;
  4. выводим результат.
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. Любое нарушение данного усло-вия приводит к тому, что последовательность не может быть возрастающей.

Алгоритм решения задачи:

  1. вводим два первых числа как old и new, задаем начальное значение флага f;
  2. в цикле ищем нарушение свойства членов возрастающей последовательности;
  3. пере присваиваем значение old:=new и вводим новое – new;
  4. в зависимости от флага выводим результат.
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 – признак отрицательного числа в начале последователь-ности.

Алгоритм решения задачи:

  1. вводим длину последовательности, задаем начальное значение счетчика k;
  2. устанавливаем признак отрицательного цисла p=true;
  3. в цикле вводим очередной член последовательности;
  4. если это отрицательное число и до этого неотрицательных чисел не было, то увеличиваем значение счетчика на единицу;
  5. в противном случае, если член последовательности неот-рицателен, то полагаем p=false;
  6. в зависимости от k выводим результат.
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 – два натуральных числа (глобальные переменные).

Алгоритм решения задачи:

  1. создаем описание функции bill;
  2. вводим два натуральных числа a и b (не кратные друг другу);
  3. вызываем функцию bill для определения количества от-резков;
  4. завершаем работу программы.
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.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *