Исходные данные: в первой строке расположены числа R, x0, y0, во второй – число n, в следующих n строках находятся координаты n точек.

Результат работы программы: целое число, соответствующее числу точек, попадающих внутрь окружности. Если ни одна из точек не лежит внутри окружности, то предусмотреть выдачу текста «Точек внутри окружности нет».

Задача 6 (15 баллов)

Положение фигуры на шахматной доске (8x8) описывается двумя числами – номером горизонтали и номером вертикали. Ввести с клавиатуры координаты белого ферзя (X, Y) и координаты чёрной ладьи (M, N). Других фигур на доске нет. Проверить, находится ли фигура под ударом. Ферзь бьёт по вертикали, горизонтали и диагонали.

Исходные данные: в первой строке вводятся координаты белого ферзя, во второй – координаты чёрной ладьи.

Результаты работы программы: текст «Ладья под ударом» либо «Ладья не под ударом».

Задача 7 (20 баллов)

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

Исходные данные: в первой строке входной информации находится последовательность из букв: к, ж, з.

Результат работы программы: число (максимальное количество бусинок) и цвет бусинок, т. е. слово «красный», «жёлтый» или «зелёный».

Дополнительная задача (10 баллов)

Даны две целочисленные переменные a и b (a≠0, b≠0, a≠b). Поменять значения a и b, не используя промежуточной переменной.

Исходные данные: целые числа a и b.

НЕ нашли? Не то? Что вы ищете?

Результат работы программы: полученные числа a и b.

Решения задач олимпиады

среди учащихся ГПТК строителей г. Кобрина

Задача 1

Задача несложная и сводится к получению (выводу) нужных формул. Ясно, что масса полученного раствора есть сумма масс исходных растворов: m = m1 + m2. С определением концентрации полученного раствора дело обстоит уже не так просто. Вспомним, некоторые определения.

Пусть смесь массы М содержит некоторое вещество массой m. Концентрацией данного вещества в смеси называют величину c = m / М, а процентным содержанием данного вещества – величину с·100%. Тогда при известных величинах концентрации вещества и общей массы смеси масса данного вещества, очевидно, определяется по формуле m = с · М. Так как в полученной смеси масса данного вещества определяется выражением с1 · m1 + с2 · m2, то концентрация данного вещества будет равна

c = (c1·m1 + c2·m2) / (m1 + m2).

Теперь остаётся просто организовать ввод данных в соответствии с условием задачи, посчитать массу и концентрацию по указанным выше формулам и правильно (в соответствии с условием) организовать вывод значений массы полученного раствора и его концентрации. Если вводить, как это принято в химии концентрацию в процентах (т. е. вводить процентное содержание вещества), то формула для определения концентрации не меняется. Ответ будет выдан в процентах.

Ниже приведён один из возможных вариантов решения данной задачи.

Program olimp1;

Uses Crt;

Var m1,m2,m, c1,c2,c:Real;

Begin

ClrScr; {очистка экрана}

Write('Введите массу и концентрацию 1-го раствора: ');

Readln(m1,c1);

Write('Введите массу и концентрацию 2-го раствора: ');

Readln(m2,c2);

m:=m1+m2;

c:=(c1*m1+c2*m2)/m;

Writeln('Масса полученного раствора m = ',m:7:2);

Writeln('Концентрация полученного раствора с = ',c:7:2);

Readln;

End.

С данной задачей полностью или частично справились почти все участники олимпиады (кроме одного). Ещё раз подчеркну важность такого рода «утешительных» задач.

Задача 2

Задача тоже относилась к разряду «утешительных» задач. Дело в том, что учащиеся обычно хорошо «схватывают» начальные сведения, связанные с обработкой строк, символов и множеств. Удобнее всего при решении задачи использовать множества. Можно было бы использовать и строки. С этой задачей успешно справились все участники олимпиады и это просто замечательно!

Program olimp2;

Uses Crt;

Var A, B,C: Set Of Char;

S:Char;

Begin

ClrScr;

Write('Введи букву: ');

Readln(S);

A:=['а','е', 'ё', 'и', 'о', 'у', 'ы', 'э', 'ю', 'я'];

B:=['ь','ъ'];

C:=['б','в', 'г', 'д', 'ж', 'з', 'к', 'л', 'м', 'н', 'п', 'р', 'с', 'т', 'ф', 'х', 'ц', 'ч', 'ш', 'щ'];

If S In A Then Writeln ('Гласная');

If S In B Then Writeln ('Разделитель');

If S In C Then Writeln ('Согласная');

Readln;

End.

Ниже приведён вариант программы с использованием строк.

Program olimp21;

Uses Crt;

Var A, B,C, D: String;

S:Char;

k, n: Byte;

Begin

ClrScr;

Write('Введи букву: ');

Readln(S);

A:='аеёиоуыэюя';

B:='ьъ';

C:='бвгджзклмнпрстфхцчшщ';

D:=A+B+C;

For k:=1 to Length(D) do

If S=D[k] Then n:=k;

If n<=Length(A) Then Writeln ('Гласная')

Else If n<=Length(A)+Length(B)

Then Writeln ('Разделитель')

Else Writeln ('Согласная');

Readln;

End.

Задача 3

Трамвайный билет имеет шестизначный номер. Так как шестизначное число больше 32767 (тип Integer), то для описания переменной, соответствующей номеру билета, необходимо использовать тип Longint (до 10 знаков).

Program olimp3;

Uses Crt;

Var  x1,x2:integer;
  x:longint; 

Begin

ClrScr;

  Write('введите номер билета');

  Readln(х);

{находим сумму первых трёх цифр}

x1:=x div 100000+(x div 10000) mod 10+(x div 1000) mod 10;

{находим сумму последних трёх цифр}

x2:=(x div 100) mod 10+(x div 10) mod 10+x mod 10;

  If x1=x2 Then Writeln ('билет счастливый ')
  Else Writeln('билет не счастливый ');

Readln; 

End.

Ниже приведён вариант программы с использованием строк. Здесь используются функции перевода числа в строку (String) и строки в число (Val). При использовании функции Str задано количество символов во введённом числе (если этого не сделать, то программа будет выдавать неправильные результаты при вводе номеров билетов, начинающихся с цифры 0).

Program olimp31;

Uses Crt;

Var s:string[6];

x:Longint;

code, k:Integer;

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

Begin

ClrScr;

Write('введите номер билета ');

Readln(x);

{перевод числа в строку}

Str(x:6,s);

For k:=1 to 6 do Val(s[k],a[k],code);

{перевод символов в числа}

If a[1]+a[2]+a[3]=a[4]+a[5]+a[6] Then Writeln ('Da ')

Else Writeln('Net ');

Readln;

End.

Задача 4

Идея решения задачи состоит в следующем: убираем все пробелы в начале и конце строки, а все пробелы в середине строки заменяем одним пробелом. Тогда количество слов будет на единицу больше количества пробелов в получившейся строке. Ниже представлена возможная реализация этого алгоритма.

Program olimp4;

Uses Crt;

Var k, n:Integer;

s:String;

Begin

ClrScr;

Write('введи строку: ');

Readln(s);

{удаление пробелов спереди}

While s[1]=' ' Do Delete(s,1,1);

{удаление пробелов сзади}

While s[Length(s)]=' ' Do Delete(s, Length(s),1);

{удаление двойных пробелов в строке}

While Pos(' ',s)<>0 Do Delete(s, Pos(' ',s),1);

n:=0;

{подсчёт числа пробелов в строке}

For k:=1 To Length(s) Do

If S[k]=' ' Then n:=n+1;

Writeln('Число слов n=',n+1);

Readln;

End.

Задача 5

Удобнее не заводить массив для координат точек, а вводить координаты в цикле и тут же проверять: лежит ли точка внутри круга, ограниченного окружностью. Уравнение окружности радиуса R с центром в точке с координатами (x0,y0) имеет вид: (x-x0)2+(y-y0)2=R2. Точка с координатами (x, y) лежит внутри круга, если (x-x0)2+(y-y0)2<R2. Одна из возможных реализаций алгоритма выглядит так.

Program olimp5;

Uses Crt;

Var R, x0,y0,x, y:Real;

k, n,col:Integer;

Begin

ClrScr;

Write('Введите радиус и координаты центра: ');

Readln(R, x0,y0);

Write('Введите количество точек: ');

Readln(n);

col:=0;

For k:=1 To n Do

Begin

Readln(x, y);

If (x-x0)*(x-x0)+(y-y0)*(y-y0)<R*R Then col:=col+1;

End;

If col=0 Then Writeln('Точек внутри нет')

Else Writeln('Внутри ',col,' точек');

Readln;

End.

Задача 6

Как известно ферзь (королева) ходит по горизонтали, вертикали и диагонали. Поэтому ферзь будет бить ладью, если ферзь и ладья находятся на одной горизонтали (X=M – совпадают первые координаты), ферзь и ладья находятся на одной вертикали (Y=N – совпадают вторые координаты), ферзь и ладья находятся на одной диагонали (|M-X|=|N-Y| – отрезок, соединяющий ферзь и ладью, является диагональю квадрата).

Program olimp6;

Uses Crt;

Var X, Y,M, N:Integer;

Begin

ClrScr;

Write('Введите координаты ферзя: ');

Readln(X, Y);

Write('Введите координаты ладьи: ');

Readln(M, N);

If (X=M) And (Y=N)

Then Writeln('Положение невозможно')

Else If (X=M) Or (Y=N) Or (Abs(M-X)=Abs(N-Y))

Then Writeln('Ладья под ударом')

Else Writeln('Ладья не под ударом');

Readln;

End.

Задача 7

Решение этой задачи рассмотрено в двух вариантах. В первом случае ожерелье не замкнуто (разорвано), во втором – замкнуто. Задачу можно решать по-разному. Ниже представлен способ, основанный на использовании строковой функции Pos, которая проверяет, входит ли одна строка в качестве подстроки в другую строку. Эта функция в качестве результата выдаёт целочисленное значение, соответствующее индексу первого символа подстроки в строке. Если же подстрока не входит в строку, то функция в качестве результата выдаёт значение нуль. Поэтому в цикле находим длины максимальных цепочек из букв одного цвета. Затем из трёх полученных значений находим максимальное значение. После этого выводим на экран полученное максимальное значение и, сравнивая найденные значения с максимальным, печатаем цвет (или цвета) бусинок.

Program olimp71; {ожерелье разорвано}

Uses Crt;

Const nmax=20;

Var a, b,c, d:String;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5