Исходные данные: в первой строке расположены числа 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 |


