Сазонов Никита Алексеевич, 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.