Сборник задач с решениями на языке программирования Паскаль (10 класс)

Сборник 

задач с решениями 

на языке 

программирования Паскаль















Подготовила: Алдошина Е.А., 

учитель информатики 

МБОУ СОШ №18 

г. Узловая 

Тульской области



















Задача 1 



Компьютер в первую секунду печатает на экране 1, во вторую – число 12, в третью – число 23. То есть, в каждую следующую секунду – на 11 больше, чем в предыдущую. В какую секунду впервые появится число, делящееся на 2009? 



Программа



program z1;

var

k,x:integer;

Begin

     k:=1;

     x:=1;

     while x mod 2009<>0 do

     begin

          k:=k+1;

          x:=x+11;

     end;

     writeln ('Через ', k, ' секунд');

end.





Задача 2 

Найдите количество четных цифр в десятичной записи числа n.

Пример



Входные данные

Результат

1486

371

3

0



Программа



program z2;

var

   x, y, k:integer;

   Begin

       readln (x);

        k:=0;

        while x<>0 do

        begin

             y:=x mod 10;

             if y mod 2 =0 then k:=k+1;

             x:=x div 10;

        end;

        writeln ('k=',k);

   end.



Задача 3 



Выясните, лежат ли на одной прямой точки А(x1, y1), B(x2, y2), C(x3, y3)



Пример



Входные данные

Результат

x1=1      y1=1

x2=6     y2=3

x3=11   y3=5

Точки лежат на одной прямой



Программа



program z3;

var

   x1, x2, x3, y1, y2, y3, z, n:real;

Begin

     write (‘Введите координаты точки А ');

     readln (x1,y1);

     write (‘Введите координаты точки В ');

     readln (x2,y2);

     write (‘Введите координаты точки  C ');

     readln (x3,y3);

     z:=(x3-x1)/(y3-y1);

     n:=(x3-x2)/(y3-y2);

     if (z=n) and (z=(x2-x1)/(y2-y1)) then

        writeln ('Точки лежат на одной прямой’)

     else

         writeln ('Точки не лежат на одной прямой’);

end.





Задача 4 



Сообщество роботов живет по следующим законам: один раз в год они объединяются в полностью укомплектованные группы по 3 или 5 роботов (причем число групп из 3 роботов - максимально возможное). За год группа из 3 роботов собирает 5, а группа из 5 - 9 новых собратьев. Каждый робот живет 3 года после сборки. Известно начальное количество роботов (К>7), все они только что собраны. Определить, сколько роботов будет через N лет.



Пример



Входные данные

Результат

8      3

10   10

152

143702







Программа



program z4;

var k, i, n, p:integer;

s, x, y:longint;

r:array [1..3] of longint;

Begin

write('количество роботов k='); readln(k);

write('количество лет n='); readln(n);

r[1]:=k; r[2]:=0; r[3]:=0; s:=k;

for i:=1 to n do

     begin

x:=s div 3;

p:=s mod 3;

if p=0 then y:=0

else if p=1 then begin x:=x-3; y:=2 end

else begin x:=x-1; y:=1 end;

r[3]:=r[2]; r[2]:=r[1]; r[1]:=5*x+9*y;

s:=r[1]+r[2]+r[3];

       end;

        writeln (‘Количество роботов - ’,s);

end.







Задача 5 



Суточный рацион коровы составляет a кг сена, b  кг силоса и c кг комбикорма. В хозяйстве, содержащем стадо из k  голов, осталось x центнеров сена, y тонн силоса и z мешков комбикорма по 50 кг. Сколько еще дней хозяйство сможет кормить коров по полному рациону. 



Программа



program z5;

var

  a,b,c,x,y,z,kol,r:real;

Begin

readln (a,b,c);

readln (x,y,z);

readln (r);

   x:=int(x*100/a);

   y:=int(y*1000/b);

   z:=int(z*50/c);

   kol:=0;

   if (x>=r) and (y>=r) and (z>=r) then

   begin

	   	if (x<=y) and (x<=z) then kol:=int(x/r);

	  	if (y<x) and (y<=z) then kol:=int(y/r);

	   	if (z<x) and (z<y) then kol:=int(z/r);

   end;

   writeln (kol);

end.

Задача 6 



Предприниматель, начав дело, взял кредит размером k рублей под p процентов годовых и вложил его в свое дело. По прогнозам, его дело должно давать прибыль r  рублей в год. Сможет ли он накопить сумму, достаточную для погашения кредита, и если да, то через сколько лет? 



Программа



program z6;

var

   k,p,r,s, h:real;

   kol: integer;

Begin

   readln (k,p,r);

   kol:=0;

   while (k>0) and (kol<50) do

   begin

       kol:=kol+1;

       k:=k+k*(p/100);

       k:=k-r;

   end;

   if kol>=50 then writeln ('no') else writeln (kol);

end.





Задача 7



Дано два целых положительных числа: a и b. Требуется написать программу, которая находит цифру, на которую оканчивается число a^b.



Входные данные

Результат

a=2

b=4

6




Программа



program z7;

var

   a,b,d:integer;

   c:byte;

Begin

   writeln ('Введите a');  readln (a);

   writeln ('Введите b');  readln (b);

   d:=a;

   if b=1 then writeln (a)

   else

   begin

      for c:=2 to b do

        d:=d*a;

        d:=d mod 10;

   end;

   writeln (d);

end.

Задача 8



Из одного порта в другой необходимо перевезти 15 различных грузов. Грузоподъемность судна, на котором будет проходить перевозка, 50 тонн. Грузы пронумерованы, и информация о массах грузов хранится в массиве М(15). Определить, сколько рейсов необходимо сделать судну, если грузы неделимы и могут перевозиться только подряд в порядке их нумерации. (Предполагается, что масса отдельного груза не превышает 50 тонн). 



Программа



program z8;

type

mas=array[1..15] of integer;

var

   m:mas;

   k,i,s:integer;

Begin

   for i:=1 to 15 do

      begin

         writeln ('Введите m','[',i,']');

         readln (m[i]);

      end;

      k:=1; i:=1; s:=0;

      repeat

         if s+m[i]<=50 then

           begin

             s:=s+m[i];

             i:=i+1;

           end

              else

                 begin

                   k:=k+1;

                   s:=0;

                 end;

       until i>15;

       writeln ('Потребовалось, k,'рейсов');





Задача 9

Коммерсант, имея стартовый капитал k рублей, занялся торговлей, которая ежемесячно увеличивает капитал на p%. Через сколько лет он накопит сумму s, достаточную для покупки собственного магазина? 

Пример



Входные данные

Результат

200000

5

3000000

4

Программа



program z9;

var

   s,k,p:real;

   n:integer;

Begin

writeln ('Введите стартовый капитал');

readln(k);

writeln ('Введите % увеличения капитала');

readln(p);

writeln ('Введите сумму, необходимую для покупки магазина');

readln(s);

while k<s do

      begin

      k:=k+k*(p/100);

      n:=n+1;

      end;

writeln ('Количество лет -',int(n/12));

end.





Задача 10

Число Цукермана – натуральное число, которое делится на произведение своих цифр, например: 175 делится на 1·7·5=35. Составить программу, которая выводит на экран все трехзначные числа Цукермана. 

Программа



program z10;

var i,a,b,c: integer;

Begin

  for i := 111 to 999 do

  begin

    a := i div 100;

    b := (i div 10) mod 10;

    c := i mod 10;

    if (b <> 0) and (c <> 0) and (i mod (a * b * c) = 0) then writeln (i);

  end;

end.



















Задача 11



На конференцию приехало N  человек. Для их перевоза выделили автомобили вместимостью К и М человек (без водителя). К гостинице автомобили подаются в таком порядке: сначала вместимостью К человек, потом – М человек и так далее. В автомобиле можно перевозить не более максимально допустимого количества пассажиров. Определить, сколько необходимо автомобилей для перевозки всех делегатов конференции.



Пример



Входные данные

Результат

20

3

4

6



Программа



program z11;

var

N,M,K,x:integer;

Begin

writeln ('Введите количество участников');

readln(N);

writeln ('Введите вместимость первого автомобиля');

readln(K);

writeln ('Введите вместимость второго автомобиля');

readln(M);

  x:=0;

  while N>0 do

  begin

  	   x:=x+1;

 	   if x mod 2<>0 then N:=N-K else N:=N-M;

  end;

  writeln (x);

end.



























Задача 12



Имеется четыре коробки спичек и в каждой из них по 15 спичек. Номер коробки, из которой берется очередная спичка, выбирается случайно. Сколько спичек будет сожжено, прежде чем одна из коробок опустеет? Составить программу.



Программа



program z12;

var

   A: array [1..4] of integer;

   i, m ,n:integer;

Begin

for i:=1 to 4 do

A[i]:=15;

repeat

n:=1+random(4);

A[n]:=A[n]-1;

m:=m+1;

until A[n]=0;

writeln ('В коробке', n, 'закончились спички');

writeln ('Израсходовано спичек', m);

end.



Задача 13



Сформировать квадратную матрицу следующего вида.



1

2

3

4

5

2

3

4

5

1

3

4

5

1

2

4

5

1

2

3

5

1

2

3

4



Программа



program z13;

var

   A: array [1..5, 1..5] of byte;

   i, j:integer;

begin

for i:=1 to 5 do

for j:=1 to 5 do

A[i, j]:=1+(i+j-2) mod 5;

for i:=1 to 5 do

begin

for j:=1 to 5 do

write (a[i, j]:2);

writeln;

end;

end.

Задача 14



Дано число типа byte. Проверить, является ли палиндромом его двоичное представление с учетом того, что сохранены старшие нули. Пример таких чисел: 102 (т. к. 102 = 0110 01102, а это палиндром), 129 (129 = 1000 00012) и т. д.



Пример



Входные данные

Результат

n=129

n=128

true

false



Программа



program z14;

var

   n, a, b, c, d: byte;

Begin

   readln (n);

   a := n mod 2;

   n := n div 2;

   b := n mod 2;

   n := n div 2;

   c := n mod 2;

   n := n div 2;

   d := n mod 2;

   n := n div 2;

   a := 8 * a + 4 * b + 2 * c + d;

   writeln (n = a);

end.





Задача 15



Даны два натуральных числа. Найти их наименьшее общее кратное.

Примечание: наименьшим общим кратным двух чисел m и n называется наименьшее натуральное число, которое делится на m и n. Обозначение: НОК(m, n)



Пример



Входные данные

Результат

m=5

n=11

55



















Программа



program z15;

var

m, n, prod: word;

Begin

readln(m, n);

prod := m * n;

while m <> n do begin

if m > n then begin

m := m – n

end

else begin

n := n – m

end

end;

writeln(prod div m)

  end.





Задача 16



Дана последовательность символов длины n (n >= 1). Проверить баланс круглых скобок в этом выражении. Например, при вводе выражения (())() программа должна сообщить о правильности расстановки скобок, а при вводе выражения ((()) – о неправильности.

Примечание: сбалансированной скобочной записью называется символьное выражение, в котором каждой открывающей скобке соответствует закрывающая скобка правее и наоборот, каждой закрывающей скобке соответствует открывающая скобка левее.



Пример



Входные данные

Результат

n=7

(((()))

false

             

Программа



program Z16;

   var

   count: integer;

   i, n: byte;

   c: char;

Begin

   readln(n);

   count := 0;

   for i := 1 to n do begin

   read(c);

   if c = '(' then inc(count);

   if c = ')' then dec(count);

   if count = -1 then break

   end;

   writeln(count = 0)

end.



Задача 17

 

Сколько существует упорядоченных пар натуральных чисел а и b, для которых известны их наибольший общий делитель d и их наименьшее общее кратное m? 



Пример



Входные данные

Результат

d=2

m=30

(6, 10)

(2, 30)



Программа



program Z17;

var

   a, b, i, j, d, m:integer;

   function nod(a, b:integer):integer;

   begin

   if a=b then nod:=a

   else

   if a>b then nod:=nod(a-b, b) else nod:=nod(a, b-a)

   end;

Begin

   writeln (‘Введите НОД двух чисел d’);

   readln (d);

writeln (‘Введите НОK двух чисел m’);

   readln (d);

   for i:=1 to 100 do

   begin

   for j:=1 to 100 do

   begin

   a:=i;

   b:=j;

   if ((nod(a, b)=d) and ((a*b div nod(a, b))=m)) then writeln (i, j);

   end;

   end;

   readln

end.



























Задача 18



Правительство гарантирует, что инфляция в новом году составит р% в месяц. Какого роста цен за год можно ожидать? Составить программу решения задачи. 



Пример



Входные данные

Результат

p=1

p=10

s=12.68

s=213.84





Программа



Пояснения: 

Сложные проценты вычисляются по формуле .



program Z18;

var

    a, p, s:real;

Begin

   writeln (‘Введите процент месячной инфляции’);

readln (p);

   a:=exp(ln(1+p/100)*12);

   s:=(a-1)*100;

   writeln (s:10:2);

   readln

end.





Задача 19



Факультету выделен стипендиальный фонд в размере f рублей в месяц. Результаты сессии таковы:  «отличников»,  «хорошистов»,  «троечников». Повышенная стипендия (для отличников) составляет  рублей, обычная -  рублей;  задолжники стипендии лишаются. Составить программу, определяющую сколько студентов каждой категории могут получать стипендию и каков будет остаток фонда на материальную помощь малоимущим студентам? 



Программа



program Z19;

var

    n1,n2,n3,k1,k2,k3,s,s1,s2:integer;

    f:longint;

 Begin

 writeln (‘Введите размер фонда’);

 readln (f);

 writeln (‘Введите количество отличников, хорошистов и троечников’);

 readln (n1,n2,n3);

 writeln (‘Введите размер стипендий’);

 readln (s1,s2);

 if f>s1*n1 then k1:=n1 else k1:=f div s1;

 f:=f-s1*k1;

 if f>s2*n2 then k2:=n2 else k2:=f div s2;

 f:=f-s2*k2;

 if f>s2*n3 then k3:=n3 else k3:=f div s2;

 f:=f-s2*k3;

 writeln ('Количество отличников, получивших стипендию=',k1);

 if k2>0 then writeln ('Количество хорошистов, получивших стипендию= ',k2);

 if k3>0 then writeln ('Количество троечников, получивших стипендию =',k3);

 writeln (‘Фонд материальной помощи=’, f);

 readln

 end.



Задача 20



N коробок стоят по кругу. В i-ой коробке j змей. Каждую минуту змеи переползают в соседнюю коробку (из i-ой в i+1-ую), а из N-ой – в первую. Составить программу, определяющую количество змей в каждой коробке через  М минут. 



Пример



Входные данные

Результат

N=6

M=4

3  4  5  6  1  2



Программа



program Z20;

var

    n, m, i, j:integer;

Begin

    writeln (‘Введите количество коробок n’);

    readln (n);

             writeln (‘Введите количество минут m’);

    readln (m);

    m:=m mod n;

    if m=0 then begin j:=0; m:=n end else j:=n-m;

    for i:=1 to n do

    begin

    j:=j+1;

    write (j,' ');

    if i=m then j:=0;

    end;

    writeln (n);

    readln

end.













Задача 21



 У Вас имеется в наличии 2000 рублей. Вам необходимо купить в общей сложности 200 предметов по следующим ценам: фломастеры - 20 рублей за упаковку, тетради общие - 10 рублей за штуку, стержни - 1,5 рубля за штуку. Вы должны потратить все деньги. 



Программа



program z21;

var

   x,y,z,kol:integer;

   sum:real;

Begin

for x:=1 to 200 do

begin

    for y:=1 to 200 do

    begin

        for z:=1 to 200 do

        begin

        sum:=20*x+10*y+1.5*z;

        kol:=x+y+z;

        if (sum=2000) and (kol=200) then writeln('фломастеры -',x,' тетради -', y, ' стержни -', z);

        end;

    end;

end;

end.





Задача 22



 Имеется N точек, расположенных в произвольном порядке на плоскости. Найти две точки, расстояние между которыми наименьшее.



Пример



Входные данные

Результат

n=5

3   4

7   2

9   9

 -7  -3

 -1  -1

Номера точек

1   2





Программа



program z22;

const n=5;

var

    a:array[1..n] of integer;

    b:array[1..n] of integer;

    i,j,num1,num2:integer;

    m,q:real;

begin

FOR i:= 1 TO n do

    begin

    readln(a[i], b[i]);

    end;

    num1:=1;

    num2:=2;

    m:=SQRT(SQR(a[1] - a[2])+ SQR(b[1] - b[2]));

    FOR i:= 1 TO n - 1 do

    begin

         FOR j:= i + 1 TO n  do

         begin

         q:=SQRT(SQR(a[1] - a[2])+ SQR(b[1] - b[2]));

         IF q < m THEN

         begin

         m:=q;

         num1:=i;

         num2:=j;

         end;

    end;

    end;

writeln(‘Номера точек’);

writeln(num1,'   ',num2);

end.





Задача 23





В книге N страниц. Составить программу подсчета количества десятичных цифр, требуемых для нумерации всех страниц книги. Нумерация проводится от 1 и далее. 



Пример



Входные данные

Результат

N=10

N=100

s=11

s=192



Программа



program z23;

var

   n, i, s:integer;

   k:string;

Begin

readln (n);

s:=0;

for i:=1 to n do

begin

str(i,k);

   s:=s+length(k);

end;

         writeln ('Количество десятичных цифр=' ,s);

end.





Задача 24



																Король Флатландии решил вырубить некоторые деревья, растущие перед его дворцом. Деревья перед дворцом короля посажены в ряд, всего там растет  N деревьев, расстояния между соседними деревьями одинаковы. 

																После вырубки перед дворцом должно остаться M деревьев, и расстояния между соседними деревьями должны быть одинаковыми. Помогите королю выяснить, сколько существует способов вырубки деревьев. 

																Требуется написать программу, которая по заданным числам N и M определит, сколько существует способов вырубки некоторых из N деревьев так, чтобы после вырубки осталось M деревьев и соседние деревья находились на равном расстоянии друг от друга.





Пример



Входные данные

Результат

N=5

M=3

4



Программа



program z24;

var

    n, m ,k: longint;

    i, d, s: longint;

        Begin

readln(n);

readln(m);

s := 0;

k:=(n-1) div (m-1);

d:=m-1;

s:=(2+(k-1)*d)*k div 2;

writeln (‘Количество способов вырубки деревьев=’, s);

end.



























Задача 25 



Из элементов массива А(2n) получить массивы В(n) и C(n) следующим образом. Выбрать в массиве А два наиболее близких по значению элемента; меньший из них поместить в массив В, а больший – в массив С. Продолжить выбор из оставшихся элементов до полного заполнения массивов В и С.



Пример



Входные данные

Результат

Массив А

8  0  10  4  1  99  3  15  2  11

Массив В

0  2  4  10  15

Массив С

1  3  8  11  99

             

Программа



program z25;

var

   i, j, x,k,n:integer;

   min,d:real;

   a:array[1..10] of real;

   b:array[1..5] of real;

   c:array[1..5] of real;

Begin

x:=0;

k:=0;

for i:=1 to 10 do

    read(a[i]);

    writeln('Массив А');

    for i:=1 to 10 do

    write(a[i], '  ');

    writeln;

for i:=1 to 10 do

    begin

    min:=a[i];

         for j:=i+1 to 10 do

         begin

              if a[j]<min then

              begin

                   min:=a[j];

                   n:=j;

              end;

         end;

              if i mod 2<>0 then

                 begin

                 x:=x+1;

                 b[x]:=min;

                 end

              else

                  begin

                  k:=k+1;

                  c[k]:=min;

                  end;

    d:=a[n];

    a[n]:=a[i];

    a[i]:=d;

    end;

    writeln('Массив B');

    for i:=1 to 5 do

    begin

    write(b[i], '  ');

    end;

    writeln;

    writeln('Массив C');

    for i:=1 to 5 do

    begin

    write(c[i], '  ');

    end;

end.





Задача 26 



Дан прямоугольник, длины сторон которого равны натуральным числам А и В.  Составить программу, которая будет находить на сколько квадратов можно разрезать данный прямоугольник, если от него каждый раз отрезать квадрат наибольшей площади.



Пример



Входные данные

Результат

7

5

5 * 5 - 1

2 * 2 - 2

1 * 1 - 2

5





Программа



program z26;

var

   a,b,k,c:real;

begin

readln(a);

readln(b);

k:=0;

while (a<>0)and (b<>0)  do

      begin

      IF  a<b THEN

      begin

      c:=int(b/a);

      writeln(a, ' * ', a, ' - ', c);

      b:=b-c*a

      end

      ELSE

      begin

      c:=INT(a/b);

      writeln(b, ' * ', b, ' - ', c);

      a:=a-c*b;

      end;

k:=k+c;

end;

writeln('Количество квадратов-',k);

end.





Задача 27 





  Папа Карло, играя на шарманке, ежедневно зарабатывает у туристов 5 золотых (монет). Весь заработок уходит на обед папы Карло и его друзей в харчевне «Три пескаря», где плату принимают только деревянными (монетами). В меняльных лавках папу Карло не обслуживают. Банкир Карабас-Барабас для друзей папы Карло установил индивидуальные правила обмена золотых на деревянные в разных лавках (смотри таблицу). Каждый из друзей может обменять только один золотой и в каждой лавке могут обслужить только одного из друзей.



Таблица обмена одного золотого на деревянные



№ лавки



Буратино

Мальвина

Пьеро

Арлекино

Артемон

1

12

13

10

7

8

2

10

11

9

7

9

3

11

10

9

8

4

4

10

11

8

10

5

5

7

12

10

9

7



   Составить программу нахождения оптимального плана обмена 5 золотых на деревянные в виде: Буратино, N лавки; Мальвина, N лавки; Пьеро, N лавки; Арлекино, N лавки; Артемон, N лавки; количество полученных деревянных.

В программе рассматривается  =120 возможных вариантов обмена золотых монет на деревянные и выбирается оптимальный вариант обмена.



















Программа



program z27;

var

   Q:array[1..5,1..5]of integer;

   F:array[1..5] of integer;

   P:array[1..5] of string;

   a,b,c,d,e,N,i,S:integer;

Begin

N:=0;

Q[1, 1]:=12; Q[1, 2]:=13;  Q[1, 3]:=10; Q[1, 4]:=7;  Q[1, 5]:=8;

Q[2, 1]:=10; Q[2, 2]:=11;  Q[2, 3]:=9;  Q[2, 4]:=7;  Q[2, 5]:=9;

Q[3, 1]:=11; Q[3, 2]:=10;  Q[3, 3]:=9;  Q[3, 4]:=8;  Q[3, 5]:=4;

Q[4, 1]:=10; Q[4, 2]:=11;  Q[4, 3]:=8;  Q[4, 4]:=10; Q[4, 5]:=5;

Q[5, 1]:=7;  Q[5, 2]:=12;  Q[5, 3]:=10; Q[5, 4]:=9;  Q[5, 5]:=7;

P[1]:='Буратино'; P[2]:='Мальвина'; P[3]:='Пьеро';

P[4]:='Арлекино';  P[5]:='Артемон';

FOR a:=1 TO 5 do

FOR b:=1 TO 5 do

FOR c:=1 TO 5 do

FOR d:=1 TO 5 do

FOR e:=1 TO 5 do

if (a<>b) AND (a<>c) AND (a<>d) AND (a<>e) AND (b<>c) AND (b<>d)AND (b<>e) AND (c<>d) AND (c<>e) AND (d<>e) then

   begin

        S:=Q[a, 1]+Q[b, 2]+Q[c, 3]+Q[d, 4]+Q[e, 5];

        IF S>N THEN

        begin

        F[1]:=A;  F[2]:=B;  F[3]:=C;  F[4]:=D;  F[5]:=E;  N:=S;

        end;

   end;

FOR i:=1 TO 5 do

writeln (P[i], '   номер лавки - ', F[i], '   количество денег -', Q[F[i], i]);

writeln (N);

end.