Элементы лексического и синтаксического разбора
Шифровка
Группа мальчишек играла во дворе в разведчиков. Чтобы передать, друг другу шифровки, дети использовали несложный шифр. Они оставляли в секретных местах листовки с написанным текстом. Зашифрованное слово должно было содержать отсутствующие в тексте буквы латинского алфавита.
Задание. Напишите программу, которая определяет, какие именно латинские буквы отсутствуют в исходном тексте.
Входные данные. В единственной строке входного файла SHIFR.TXTнаходятся заглавные буквы латинского алфавита. Количество букв в строке не более 255.
Выходные данные. Выходной файл OUTSHIFT.TXT должен содержать 1 строку латинских букв. Каждая буква повторяется единожды.
Пример входных и выходных данных:
SHIFR.TXT | OUTSHIFR.TXT |
QJZWSXEDCFTGBYHNUMIK | ALOPRV |
Шифровка
Решение
Задача заключается в том, чтобы определить какие из заглавных букв латинского алфавита не встречаются в тексте.
Для этого прочитаем текст посимвольно и образуем множество латинских букв, которые в нём встречаются. Затем переберём все символы и выведем те, которые не принадлежат множеству.
Множество букв представим типом chars = set of char. Множество букв, которые встречаются в тексте, получим путём добавления каждой прочитанной буквы к множеству, а множество оставшихся букв (absend) – как разницу между множествами всех латинских букв (lats) и букв первого множества (present). Образование множества латинских букв текста оформим процедурой textLets. Перебор и печать символов, не принадлежащих множеству present, оформим процедурой writeSet.
program shifrovka;
type chars = set of char; //объявление типа множества
procedure textLets(var st: chars; const GlobSet: chars); //процедура формирования множества латинских букв текста
var f: text; c: char;
begin
assign(f,'SHIFR.txt'); //назначение входящей файловой переменной
reset(f); //открытие файла для чтения
st:=[]; //начальное значение символьного множества
while not eof(f) do begin //пока не достигнет конца входящего файла
read (f,c); //читаем содержимое входящего файла
if c in GlobSet then st:=st+[c];
end;
close(f);
end;
procedure writeSet(const st:chars); //формирование процедуры перебора и печати множества букв
var f1:text; c:char;
begin
assign(f1, 'OUTSHIFR.txt'); //назначение файловой переменной
rewrite (f1); //открываем файл в режиме замещения существующего
for c:=#0 to #255 do
if c in st then write (f1,c);
close(f1); //закрываем файл
end;
const lats:chars=['A'..'Z']; //задаём все заглавные латинские буквы
var present, absend: chars;
begin
textLets (present, lats); //вызов процедуры формирования 1-го множества
absend:=lats-present; //поиск множества букв не входящих в 1-е множество
writeSet(absend); //вызов процедуры перебора и печати символов 2-го множества
end.
Сортировка и поиск
Независимые судьи
В некоторых видах спортивных соревнований выступление каждого спортсмена оценивается независимо несколькими судьями, потом из этой совокупности оценок удаляется наибольшая и наименьшая, а для тех оценок, что остались, определяется среднее арифметическое, которое идет в зачёт спортсмену. Если наибольшую оценку выставило несколько судей, то из совокупности оценок удаляется только одна такая оценка (аналогично поступают с наименьшими оценками).
Пусть n (n ≥ 3) судей выставили одному из спортсменов соответственно оценки: а1, а2, …, аn. Определить, какая итоговая оценка пойдёт спортсмену в зачёт.
Во входном файле input.txtв первой строке дано количество судей n, во второй – баллы первого судьи, в третьей – баллы второго судьи и т. д., в n+1 строке – баллы n-го судьи. В выходном файле output.txtсодержится одно число – итоговая оценка спортсмена.
Пример входного и выходного файлов
input.txt | output.txt |
19.5 |
Независимые судьи
Решение
program sport;
var n, i, max, min, s:integer;
a:array[1..100] of integer;
sr: real;
f, g: text;
begin
assign (f,'input.txt');
assign (g,'output.txt');
reset (f);
readln (f, n); //чтение из файла количества судей
for i:=1 to n do
readln (f, a[i]); //чтение из файла оценок судей
close (f);
max:=a[1];
min:=a[1];
for i:=2 to n do
begin
if a[i]>=max then max:=a[i]; //нахождение max и min оценок
if a[i]<=min then min:=a[i];
end;
s:=0;
for i:=1 to n do
begin
s:=s+a[i]; //нахождение суммы всех оценок
end;
s:=s-max-min; //изымание max и min оценок из общей суммы
sr:=s/(n-2); //нахождение среднего арифметического оценок
rewrite (g);
writeln (g, sr);
close (g);
end.
Длинная арифметика
Сувениры
Два брата-путешественника независимо друг от друга совершили кругосветное путешествие. Они посетили не менее 10 и не более 500 населенных пунктов, и в каждом населенном пункте могли купить сувениры (не более 9). Встретившись, каждый из братьев записал в файл data.txt строку со своим числом, каждая цифра которого означала количество сувениров, купленных в отдельном населенном пункте.
Задание. Помогите братьям найти сумму полученных таким образом чисел и записать ее в выходной файл sum.txt.
Примеры входного и выходного файлов
data.txt | sum.txt |
Сувениры
Решение
program files1;
type mass=array [1..500] of integer;
var f1, f2: text; s, q, t, d, y: string; a, b, c: mass; i, n, k, r, max, p: integer;
begin
assign (f1,'data.txt'); //связь файловой переменной с входным файлом
reset (f1);
readln (f1, s); // считывание первого слагаемого в виде строки символов
readln (f1, q); // считывание второго слагаемого в виде строки символов
n:=length (s); //длина первого числа
// каждый символ первого числа превращается в цифру (числовой формат) и записывается в массив а, причем самый правый символ – младший разряд числа |
begin
t:=copy (s, i, 1);
val (t, r);
a[n-i+1] := r;
end;
// каждый символ второго числа превращается в цифру (числовой формат) и записывается в массив b, причем самый правый символ – младший разряд числа |
for i:=k downto 1 do
begin
t:=copy (q, i, 1);
val (t, r);
b[k-i+1]:=r;
end;
close (f1); // закрываем файловую переменную
// определяем размер массива, в котором будет храниться сумма чисел |
// р – сумма цифр соответствующих разрядов |
p:=0;
for i:=1 to max do
// формирование цифр в числе-сумме с учетом перехода через десяток |
p:=a[i]+b[i]+p div 10;
c[i]:=p mod 10;
end;
// //массив с результатом преобразуется в строковую переменную у и посимвольно накапливается в строке d таким образом, чтобы слева начинались старшие разряды суммы |
for i:=max downto 1 do
begin str(c[i],y); d:=d+y end;
assign (f2,'sum.txt'); // файловая переменная связывается с выходным файлом
rewrite (f2); // подготовка выходного файла для записи
write (f2,d); // запись результата в выходной файл
close (f2); // закрытие выходного файла
end.
Метод перебора вариантов
Треугольник
Условие задачи
На плоскости даны n точек и их координаты: x1, y1, x2,y2, ….. xn, yn.
Найти наибольшую площадь треугольника по координатам трех произвольных точек плоскости. Во входном файле input.txtв первой строке дано количество точек n (натуральное число n ≤ 1000), во второй – координаты первой точки x1, y1, в третьей – x2, y2, и т. д. в n+1 строке координаты n-й точки xn, yn (координаты – действительные числа). В выходном файле output.txtсодержится одно число (действительное) – площадь треугольника.
Примеры входного и выходного файлов
input.txt | output.txt |
1 1 2 2 4 1 1 4 2 3 | 4.5000000000E+00 |
Треугольник
Решение
s – искомая площадь, s 1 – площадь треугольника образованного тремя произвольными точками из данного множества
Массивы х и у содержат координаты точек
program ploschad;
var n, i, j, k: integer;
x: array [1..1000] of real;
y: array [1..1000] of real;
s, s1: real;
f, g: text;
Begin
assign (f,’input.txt’);
assign (g,’output.txt’);
reset (f);
readln (f, n); // чтение из файла количества точек
for i:=1 to n do
readln (f, x[i], y[i]); //чтение координат точек, запись их в массив
s:=0; close (f);
for i:=1 to n do //перебор всех точек по три
for j:=2 to n do
for k:=3 to n do
begin
s1:=0.5*abs(x[i]*(y[j]-y[k])+x[j]*(y[k]-y[i])+x[k]*(y[i]-y[j])); //вычисление площади по координатам его вершин
if s1>s then s:=s1; //выбор наибольшей площади
end;
rewrite(g);
writeln(g,s); //запись в файл
close(g);
End.