Дистанционная олимпиада по программированию 2 тур

advertisement
Сазонов Никита Алексеевич, 11 класс
Дата рождения:27.10.1998;
Сот.телефон: 89625351843
Учитель информатики: Шагалеева Гульнур Зиннуровна
453852, Россия, Республика Башкортостан, г.Мелеуз, ул.Бурангулова, д. 11, МОБУ Лицей
№6
Задание 1
Разработайте программу, которая формирует таблицу 10 на 10, заполняет ее
случайными числами и сортирует по строкам.
Язык программирования – Pascal
Среда -PascalABC.NET, версия 1.8, сборка 513 (09.11.2012).
Входные данные: матрица размером 10 х 10.
Выходные данные: отсортированная матрица по строкам.
program zad_1;
const
N = 10;
// Объявляем тип массива N x N
type
ArrN = array[1..N, 1..N] of integer;
// Функция сравнивает строки m и i массива A, начиная со столбца j-1
// Если в строке i найден хотя бы один элемент, которой больше элемента
// в строке m в том же самом столбце, тогда возвращается False.
// Если ни одного элемента не найдено, тогда возвращается True.
function ComparePrev(A: ArrN; m, i, j: integer): Boolean;
var
p: integer;
begin
result := true;
for p := j-1 downto 1 do
if A[i, p] > A[m, p] then begin
result := false;
break;
end;
end;
var
A: ArrN;
i, j, m, k, p: integer;
begin
// Заполнение
for i := 1 to N do
begin
for j := 1 to N do
begin
A[i, j] := random(9);
write(A[i, j], ' ');
end;
writeln();
end;
writeln();
// Основной алгоритм
for j := 1 to N do
// Столбцы
begin
for k := 1 to N do // Строки
begin
// Для каждого столбца j и строки k ищем строку m, в которой элемент
A[m, j]
// минимальный
m := k;
for i := k to N do
// Для 1-ой строки для поиска минимального элемента просто сравниваем
// элементы столбца между собой
if (j = 1) and (A[i, j] < A[m, j]) then
m := i
else
// Для столбца j > 1 помимо сравнения элементов столбца нужно
// еще сравнить между собой все предыдущие элементы в строках i и m
// Для этого вызываем функцию ComparePrev()
if (j > 1) and (A[i, j] < A[m, j]) then
if ComparePrev(A, m, i, j) then
m := i;
if k <> m then begin
// Если нашли m, тогда меняем строки местами
for p := 1 to N do
swap(A[k, p], A[m, p]);
end;
end;
end;
// Вывод результата
for i := 1 to N do
begin
for j := 1 to N do
write(A[i, j], ' ');
writeln();
end;
end.
Задание 2
Разработайте программу, которая формирует таблицу 10 на 10,
заполняет ее случайными числами и сортирует по столбцам.
Язык программирования – Pascal
Среда -PascalABC.NET, версия 1.8, сборка 513 (09.11.2012).
Входные данные: матрица размером 10 х 10.
Выходные данные: отсортированная матрица по столбцам.
program zad_2;
const
N = 10;
// Объявляем тип массива N x N
type
ArrN = array[1..N, 1..N] of integer;
// Функция сравнивает строки m и i массива A, начиная со столбца j-1
// Если в строке i найден хотя бы один элемент, которой больше элемента
// в строке m в том же самом столбце, тогда возвращается False.
// Если ни одного элемента не найдено, тогда возвращается True.
function ComparePrev(A: ArrN; m, i, j: integer): Boolean;
var
p: integer;
begin
result := true;
for p := i-1 downto 1 do
if A[p, j] > A[p, m] then begin
result := false;
break;
end;
end;
var
A: ArrN;
i, j, m, k, p: integer;
begin
// Заполнение
for i := 1 to N do
begin
for j := 1 to N do
begin
A[i, j] := random(9);
write(A[i, j], ' ');
end;
writeln();
end;
writeln();
// Основной алгоритм
for i := 1 to N do
// Строки
begin
for k := 1 to N do // Столбцы
begin
// Для каждой строки i и столбца k ищем столбец m, в которой элемент
A[i, m]
// минимальный
m := k;
for j := k to N do
// Для 1-ого столбца для поиска минимального элемента просто
сравниваем
// элементы строки между собой
if (i = 1) and (A[i, j] < A[i, m]) then
m := j
else
// Для строки i > 1 помимо сравнения элементов строки нужно
// еще сравнить между собой все предыдущие элементы в стоблцах j и m
// Для этого вызываем функцию ComparePrev()
if (i > 1) and (A[i, j] < A[i, m]) then
if ComparePrev(A, m, i, j) then
m := j;
if k <> m then begin
// Если нашли m, тогда меняем строки местами
for p := 1 to N do
swap(A[p, k], A[p, m]);
end;
end;
end;
// Вывод результата
for i := 1 to N do
begin
for j := 1 to N do
write(A[i, j], ' ');
writeln();
end;
end.
Задание 3
Разработайте программу, которая формирует таблицу 10 на 10, заполняет ее
случайными числами и находит наибольшие четные значения в каждом столбце.
Язык программирования – Pascal
Среда -PascalABC.NET, версия 1.8, сборка 513 (09.11.2012).
Входные данные: матрица размером 10 х 10.
Выходные данные: отсортированная матрица по столбцам.
program zad_3;
const
N = 10;
var
// Объявляем массив N x N
A: array[1..N, 1..N] of integer;
i, j, k, max: integer;
begin
//Заполнение матрицы N х N;
for i := 1 to N do
begin
writeln();
for j := 1 to N do
begin
A[i, j] := random(100);
write(A[i, j], ' ');
end;
end;
writeln();
//Основная часть программы;
k := 0;
for j := 1 to N do
begin
max := -1;
//Ищем в цикле максимальный чётный элемент;
for i := 1 to N do
if (A[i, j] > max) and (A[i, j] mod 2 = 0) then
begin
max := A[i, j];
end;
if max <> -1 then
begin
writeln('Максимальное чётное число в ', j, ' столбце : ', max);
k := k + 1;
end
else
writeln('Чётных чисел в ', j, ' столбце нет');
end;
end.
Задание 4
Разработайте программу для кодирования последовательности из N символов,
которая использует неравномерный минимальный двоичный код, позволяющий
однозначно декодировать полученную двоичную последовательность.
Язык программирования – Pascal
Среда -PascalABC.NET, версия 1.8, сборка 513 (09.11.2012).
Входные последовательность из N символов.
Выходные закодированная последовательность из N символов.
Содержимое файла с входными данными input_4.txt:
15
АбраКАДАбраБуМС
Текст программы:
program zad_4;
// Функция формирует массив с уникальными символами из исходной строки S
function GetArrayABC(S: string; var n: integer): array[,] of string;
var
A: array[,] of string;
sABC: string;
i: integer;
begin
sABC := '';
for i := 1 to Length(S) do
if Pos(S[i], sABC) = 0 then
sABC := sABC + S[i];
n := Length(sABC);
SetLength(A, 2, n);
for i := 0 to Length(sABC) - 1 do
A[0, i] := Copy(sABC, i + 1, 1);
result := A;
end;
// Функция преобразует число k в двоичное представление этго числа
function CodeSymbol01(k: integer; n: integer): string;
var
c, s0, code: string;
begin
code := '';
repeat
c := IntToStr(k mod 2);
code := code + c;
k := k div 2;
until k = 0;
code := ReverseString(code);
s0 := StringOfChar('0', n - Length(code));
code := s0 + code;
result := code;
end;
// Функция возвращает для заданного символа двоичный код (строку)
function GetCodeSymbol(sym: string; B: array[,] of string; n: integer):
string;
var
code: string;
i: integer;
begin
code := '';
for i := 0 to n do
if B[0, i] = sym then
begin
code := B[1, i];
break;
end;
result := code;
end;
// Функция возвращает для заданного двоичного кода символ,
// который был закодирован этим кодом
function GetDecodeSymbol(code: string; B: array[,] of string; n: integer):
string;
var
sym: string;
i: integer;
begin
sym := '';
for i := 0 to n do
if B[1, i] = code then
begin
sym := B[0, i];
break;
end;
result := sym;
end;
const
InputFile = '.\input_4.txt';
var
f1: Text;
N, j, n1, n2: integer;
B: array[,] of string;
S, scode, sym, code, sdecode: string;
begin
// Заполняем массив данными
Assign(f1, InputFile);
Reset(f1);
Readln(f1, N);
Readln(f1, S);
// Получим массив с уникальными символами из исходной строки
B := GetArrayABC(S, n1);
// Определяем длину кода для символа
if n1 mod 2 = 0 then
n2 := n1 div 2 - 1
else
n2 := n1 div 2;
// Основной алгоритм: кодируем символы
for j := 0 to n1 - 1 do
B[1, j] := CodeSymbol01(j, n2);
// Вывод закодированной строки
scode := '';
for j := 0 to N - 1 do
begin
sym := Copy(S, j + 1, 1);
scode := scode + GetCodeSymbol(sym, B, n1);
end;
writeln('Закодированная строка:', scode);
// Тестируем раскодирование
sdecode := '';
for j := 0 to N - 1 do
begin
code := Copy(scode, n2 * j + 1, n2);
sdecode := sdecode + GetDecodeSymbol(code, B, n1);
end;
writeln('Раскодированная строка:', sdecode);
end.
Задание 5
Разработайте программу, которая по четырехбайтовому IP-адресу узла и IP-адресу маски
подсети вычисляет сетевой адрес.
Язык программирования – Pascal
Среда -PascalABC.NET, версия 1.8, сборка 513 (09.11.2012).
Входные данные: матрица размером 10 х 10.
Выходные данные: отсортированная матрица по строкам.
program zad_5;
type
IpAddress = array[1..2, 1..4] of byte;
// Функция заполняет строку с номером index массива ipNode частями адреса
sNode
// Если функция выполнилась успешно, возвращается True, иначе - False
function FillipAddress(var ipNode: IpAddress; index: integer; sNode: string):
Boolean;
var
p1, p2, p3: integer;
begin
result := true;
p1 := PosEx('.', sNode, 1);
if p1 <> 0 then
begin
ipNode[index, 1] := Byte(StrToInt((Copy(sNode, 1, p1 - 1))));
p2 := PosEx('.', sNode, p1 + 1);
if p2 <> 0 then
begin
ipNode[index, 2] := Byte(StrToInt(Copy(sNode, p1 + 1, p2 - p1 - 1)));
p3 := PosEx('.', sNode, p2 + 1);
if p3 <> 0 then
begin
ipNode[index, 3] := Byte(StrToInt(Copy(sNode, p2 + 1, p3 - p2 - 1)));
ipNode[index, 4] := Byte(StrToInt(Copy(sNode, p3 + 1, Length(sNode) p3)));
end
else
begin
writeln('Неверный формат ip-адреса узла');
result := false;
end;
end
else
begin
writeln('Неверный формат ip-адреса узла');
result := false;
end;
end
else
begin
writeln('Неверный формат ip-адреса узла');
result := false;
end;
end;
var
// В массиве ipNode будем хранить в 1-ой строке ip-адрес узла,
// во 2-ой строке ip-адрес маски
ipNode: IpAddress;
sNode, sMask, sNet: string;
i, res: integer;
begin
// Вводим исходные данные
writeln('Введите ip-адрес узла');
Readln(sNode);
writeln('Введите ip-адрес маски');
Readln(sMask);
// Заполняем массив частями ip-адреса узла
if FillipAddress(ipNode, 1, sNode) then
begin
// Заполняем массив частями ip-адреса маски
if FillipAddress(ipNode, 2, sMask) then
begin
sNet := '';
// Формирумем сетевой ip-адрес
for i := 1 to 4 do
begin
// Накладываем маску с помощью побитовой операции AND
res := (ipNode[1, i] and ipNode[2, i]);
if Trim(sNet) = '' then
sNet := IntToStr(res)
else
sNet := sNet + '.' + IntToStr(res);
end;
// Выводим сетевой ip-адрес
writeln('Сетевой ip-адрес ', sNet);
end;
end
else
writeln('Невозможно определить сетевой ip-адрес!');
end.
Задание 7
Представим себе бесконечную последовательность цифр, составленную из
записанных друг за другом возрастающих степеней десятки. Вот начало этой
последовательности: 110100100010000… Всё, что надо — определить, какая цифра
находится в такой последовательности на определённом месте.
Язык программирования – Pascal
Среда -PascalABC.NET, версия 1.8, сборка 513 (09.11.2012).
Входные данные: матрица размером 10 х 10.
Выходные данные: отсортированная матрица по столбцам.
program zad_7;
// Функция возвращает символ из заданной позиции
function GetSymbol(var N: integer): char;
var
stroka, x: string;
s, c, K, l: integer;
begin
c := N;
K := 1;
l := Length(stroka);
while N > 0 do
begin
s := 1 * K;
K := K * 10;
str(s, x);
stroka := stroka + x;
N := N - 1;
end;
result := stroka[c];
end;
var
A: array of char;
N, KOL, j, i: integer;
begin
// Вводим количество строк для считывания;
readln(KOL);
SetLength(A, KOL);
j := 1;
while KOL > 0 do
begin
// Считываем очередное число (позицию)
readln(N);
// Получаем символ в заданной позиции
A[j - 1] := GetSymbol(N);
j := j + 1;
KOL := KOL - 1;
end;
// Выводим результат
writeln();
for i := 0 to High(A) do
write(A[i], ' ');
end.
Задание 8
Условие этой задачи очень простое: вам всего лишь надо определить, сколько
клеток находится под боем шахматного коня, одиноко стоящего на шахматной доске. На
всякий случай напомним, что конь ходит буквой «Г» — на две клетки по горизонтали или
вертикали в любом направлении, и потом на одну клетку в направлении,
перпендикулярном первоначальному.
Язык программирования – Pascal
Среда -PascalABC.NET, версия 1.8, сборка 513 (09.11.2012).
Входные данные: матрица размером 10 х 10.
Выходные данные: отсортированная матрица по столбцам.
program zad_8;
const
A: array[1..8] of integer = (1, 2, 2, 1, -1, -2, -2, -1);
B: array[1..8] of integer = (2, 1, -1, -2, -2, -1, 1, 2);
var
i, j, x, y, n, s: integer;
c: char;
begin
readln(n);
for i := 1 to n do
begin
read(c);
// Дает положение коня по горизонтали;
x := 1 + ord(c) - ord('a');
readln(c);
// Дает положение коня по вертикали;
y := 1 + ord(c) - ord('1');
s := 0;
for j := 1 to 8 do
if ((x + A[j]) in [1..8]) and ((y + B[j]) in [1..8])
Then s := s + 1;
Writeln(s);
end;
end.
Download