Главная » Статьи » Мои статьи

Задачи с решением и пояснениями (продолжение)

Задача 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.
Категория: Мои статьи | Добавил: kuchma-anna (27.01.2015) | Автор: Решения задач на паскале с решениям
Просмотров: 529 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar