Дистанционная олимпиада по программированию для 10-11 классов/2015-2016 уч.г. (1 тур) Выполнил: Ракипов Динаф Рауфович Образовательное учреждение: МОБУ СОШ №2 с.Буздяк МР Буздякский район Задание №1 Текст задания: Разработать программу, случайным перемешивающую дни недели (повторы дней не допускаются). Язык программирования: PascalABC.Net Версия: 3.0 Сборка 1073 Исходный код программы: образом const n = 7; var m: array [1..n] of integer; i, k,a,b,c,d,e,f,j: integer; t: text; time:real; begin writeln ('Нажмите ENTER что бы запустить рандомизацию...'); //Диалог с пользователем readln; time:=milliseconds; // Начало подсчета времени работы программы randomize; // Начало рандомизации от 1 до 7 т.к в одной недели 7 дней i := 0; while i < n do begin i := i + 1; m[i] := random(1,7); for k := 1 to i - 1 do //Цикл для исключения дублей if m[k] = m[i] then begin i := i - 1; break; end; end; assign (t,'saverandom.txt'); //Объявляем файл для сохранении рандомных не повторяющихся цифр в промежутке от 1 до 7 rewrite (t); //Открыть файл на перезапись for i := 1 to n do begin writeln(t,m[i]:3); //Записываем цифры end; close (t); // Закрываем файл, конец рандомизации assign (t,'saverandom.txt'); // Открываем созданный нами файл saverandom.txt reset (t); readln (t,a); // К каждому числу присваиваем переменную readln (t,b); // 7 переменных 7 дней readln (t,c); readln (t,d); readln (t,e); readln (t,f); readln (t,j); close (t);//Закрываем файл writeln ('Рандомный вывод:'); //Вывод названия дня недели в зависимости каким числом является переменная writeln; case a of 1: writeln ('Пн'); //Если 1 то Пн, если 2 то Вт и т.д 2: writeln ('Вт'); 3: writeln ('Ср'); 4: writeln ('Чт'); 5: writeln ('Пт'); 6: writeln ('Сб'); 7: writeln ('Вс'); end; case b of 1: writeln 2: writeln 3: writeln 4: writeln 5: writeln 6: writeln 7: writeln end; case c of 1: writeln 2: writeln 3: writeln 4: writeln 5: writeln 6: writeln 7: writeln end; //Так поступаем с каждой переменной ('Пн'); ('Вт'); ('Ср'); ('Чт'); ('Пт'); ('Сб'); ('Вс'); ('Пн'); ('Вт'); ('Ср'); ('Чт'); ('Пт'); ('Сб'); ('Вс'); case d of 1: writeln 2: writeln 3: writeln 4: writeln 5: writeln 6: writeln 7: writeln end; ('Пн'); ('Вт'); ('Ср'); ('Чт'); ('Пт'); ('Сб'); ('Вс'); case e of 1: writeln 2: writeln 3: writeln 4: writeln 5: writeln 6: writeln 7: writeln end; ('Пн'); ('Вт'); ('Ср'); ('Чт'); ('Пт'); ('Сб'); ('Вс'); case f of 1: writeln 2: writeln 3: writeln 4: writeln 5: writeln 6: writeln 7: writeln end; ('Пн'); ('Вт'); ('Ср'); ('Чт'); ('Пт'); ('Сб'); ('Вс'); case j of 1: writeln ('Пн'); 2: writeln ('Вт'); 3: writeln ('Ср'); 4: writeln ('Чт'); 5: writeln ('Пт'); 6: writeln ('Сб'); 7: writeln ('Вс'); end; writeln; time:=(milliseconds-time)/1000; //Конец подсчета времени writeln ('Программа проработала ',time,' сек.'); //Вывод затраченного времени readln; end. Комментарии к решению: В программе используем метод рандомизации цифр, используя цикл для исключения дублей. Используется файл saverandom.txt для сохранения цифр и их дальнейшего присвоения к переменным. Каждая цифра — это день недели 1 это Пн. 2, Это Вт. и т.д. Так же для интереса добавил функцию подсчета времени выполнения программы в сек. Программа работает исправно, сбоев не происходило. «Рандомизированные» дни выходят на экране пользователя. Комментарии присутствуют и в самом программном коде, если что-то не понятно обращаться туда. Скриншоты: Задание №2 Текст задания: Разработать интерактивную программу для игры «Камень-Ножницы-Бумага-Ящерица-Спок» пользователя с компьютером. Язык программирования: PascalABC.Net Версия: 3.0 Сборка 1073 Исходный код программы: Uses Crt; Var z,x,c,a:Integer; begin writeln ('Камень-Ножницы-Бумага-Ящерица-Спок - это расширенный вариант игры «Камень, ножницы, бумага»'); //Диалог с пользователем writeln; writeln ('Правила:'); //Диалог с пользователем writeln ('Ножницы режут бумагу. Бумага заворачивает камень. Камень давит ящерицу, а ящерица травит Спока, в то время как Спок ломает ножницы, которые, в свою очередь, отрезают голову ящерице, которая ест бумагу, на которой улики против Спока. Спок испаряет камень, а камень, разумеется, затупляет ножницы.'); //Диалог с пользователем repeat //Цикл повтора игры writeln; Writeln('Выберите один из вариантов'); //Диалог с пользователем Writeln('Камень - 0'); Writeln('Ножницы - 1'); Writeln('Бумага - 2'); Writeln('Ящерица - 3'); Writeln('Спок - 4'); readln(z); x:=random(0,4); //Компьютер выбирает рандомное число от 0 до 4 , каждому числу соответствует Камень,Ножница,Бумага,Ящерица или Спок If // Условие ничьи (z=0) and (x=0) or (z=1) and (x=1) or (z=2) and (x=2) or (z=3) and (x=3) or (z=4) and (x=4) then begin writeln; write('Ничья т.к. вы выбраали'); case z of 0: write (' Камень'); 1: write (' Ножницы'); 2: write (' Бумагу'); 3: write (' Ящерицу'); 4: write (' Спок'); end; write (' и компьютер выбрал'); case x of 0: write (' Камень'); 1: write (' Ножницы'); 2: write (' Бумагу'); 3: write (' Ящерицу'); 4: write (' Спок'); end; writeln; end else If //Условие выигрыша (z=0) and (x=1) or (z=1) and (x=2) or (z=2) and (x=0) or (z=3) and (x=4) or (z=4) and (x=1) or (z=1) and (x=3) or (z=3) and (x=2) or (z=2) and (x=4) or (z=4) and (x=0) then begin writeln; write(' Вы выиграли т.к. вы выбраали'); case z of 0: write (' Камень'); 1: write (' Ножницы'); 2: write (' Бумагу'); 3: write (' Ящерицу'); 4: write (' Спок'); end; write (' а компьютер выбрал'); case x of 0: write (' Камень'); 1: write (' Ножницы'); 2: write (' Бумагу'); 3: write (' Ящерицу'); 4: write (' Спок'); end; writeln; end else //В остальных случаях пользователь проигрывает begin writeln; Write ('Вы проиграли т.к. вы выбраали'); case z of 0: write (' Камень'); 1: write (' Ножницы'); 2: write (' Бумагу'); 3: write (' Ящерицу'); 4: write (' Спок'); end; write(' а компьютер выбрал'); case x of 0: write (' Камень'); 1: write (' Ножницы'); 2: write (' Бумагу'); 3: write (' Ящерицу'); 4: write (' Спок'); end; writeln; end; writeln; writeln ('Сыграть еще раз ? ДА-0 Нет-1'); //Предложение сыграть еще раз readln (a); until a = 1; //Если не 1 , то выполнить снова End. Комментарии к решению: В программе снова как и в первой задачи используется рандомные цифры в промежутке. Далее дело оставалось за малым записать условия ничьи, выигрыша и проигрыша. Дополнительные фалы использованы не были. Все результаты выходят на экране пользователя. Комментарии так же присутствуют в программном коде. Скриншоты: Задание №3 Текст задания: Разработать программу, которая выводит на экран все простые числа в диапазоне от 1 до 1000. Язык программирования: PascalABC.Net Версия: 3.0 Сборка 1073 Исходный код программы: var i,j,max: integer; f:boolean; begin max:=1000; // до тысячи writeln ('Нажми ENTER для вывода всех простых чисел от 1 до 1000'); //Диалог с пользователем readln; writeln; writeln('Все простые числа:'); writeln; for i:=1 to max do //Цикл от 1 до 1000 begin f:=true; // Сначала же любое число True for j:=2 to i-1 do if i mod j =0 then //Но если оно на цело делится на числа от 2 до -1 нее, исключаем само число и единицу, тем самым если число не соответствует данному условию, то оно остается True begin f:=false; // То это число становиться False break; end; if f then write (i,', '); //Если True вывести это число end; writeln; end. Комментарии к решению: Все комментарии к программе в исходном коде. Все данные выводятся на экран пользователя. Скриншоты: Задание №4 Текст задания: Разработать программу «Угадай число», которая с помощью генератора случайных чисел загадывает и проверяет угадывание числа. В программе используется интервал от 1 до 100 и дается пять попыток угадывания. Язык программирования: PascalABC.Net Версия: 3.0 Сборка 1073 Исходный код программы: var a,b,c:integer; begin writeln ('Привет, я робот. Давай сыграем в игру "Угадай число". Я загадаю, а ты одгадывай.');//Диалог с пользователем repeat //Цикл сыграть заново writeln; writeln ('Итак, я загадываю число от 1 до 100... '); //Диалог с пользователем writeln ('Дам тебе 5 попыток'); //Диалог с пользователем a:=random(1,100); // Робот выберает случайное число от 1 до ста writeln; //Первый раз write ('И твое число: '); //Диалог с пользователем read (b); //Считывает число введенное пользователем writeln; if b=a then //Условия совпадения случайногоисла и числа которое ввел пользователь begin writeln ('Спервого раза!? Да ты везучий!'); //Диалог с пользователем writeln; writeln ('Игра окончена, ты угадал число'); exit //При победе конец программы end else writeln ('Первый блин комом, у тебя осталось 4 попытки.'); writeln; //Первый раз //Далле таких еще 4 условий //Второй раз write ('И твое число: '); read (b); writeln; if b=a then begin writeln ('Со второго раза!? Превосходно!'); writeln; writeln ('Игра окончена, ты угадал число'); exit end else writeln ('Эхх... еще чуть-чуть , у тебя осталось 3 попытки.'); writeln; //Второй раз //Третий раз write ('И твое число: '); read (b); writeln; if b=a then begin writeln ('Превосходно! Ты угадал мое число!'); writeln; writeln ('Игра окончена, ты угадал число'); exit end else writeln ('Ты в шаге от победы , у тебя осталось 2 попытки.'); writeln; //Третий раз //Четвертый раз write ('И твое число: '); read (b); writeln; if b=a then begin writeln ('Вот! С четвертого раза! Молодец!'); writeln; writeln ('Игра окончена, ты угадал число'); exit end else writeln ('Оу... , у тебя осталось 1 попытка.'); writeln; //Четвертый раз //Пятый раз write ('И твое число: '); read (b); writeln; if b=a then begin writeln ('Ну ты и везунчик! С последней попытки!'); writeln; writeln ('Игра окончена, ты угадал число'); exit end else begin writeln ('Ты не угадал число попробуем снова ? ДА-0 Нет-1'); // Если пользователь не угадал число 5 раз подряд , ему предлагается сыграть еще раз до тех пор пока он не угадает число. readln (c); writeln; end; //Пятый раз until c = 1; //Цикл сыграть заново end. Комментарии к решению: Робот загадывает число, после чего пять раз проверяет его на соответствие с числами, которые ввел пользователь. Все комментарии к программе в исходном коде. Все данные выводятся на экран пользователя. Скриншоты: Задание №5 Текст задания: Разработать программу подсчета количество пар любых двух целых чисел диапазоне от 1 до 10000 для которых справедливо утверждение: Сумма квадратов любых двух целых чисел равно кубу одного из этих чисел. Если такие пары чисел существуют, подсчитать среди них количество нечетных чисел. Если такие пары чисел существуют, вывести построчно значения этих чисел. Язык программирования: PascalABC.Net Версия: 3.0 Сборка 1073 Исходный код программы: var i,d,j,a,b,c,max,cx,bx: integer; f,t:boolean; r: text; begin max:=10000; //Максимум 10000 writeln ('Нажмите ENTER что бы найти пары чисел в промежутке от 1 до 10000, которые соответствуют условиям задачи:'); //Диалог с пользователем readln; for i:=1 to max do //Двойной цикл первой число пары for j:=1 to max do //Второе число пары. Будем проверять соответсвуют ли они условиям задачи begin a:=(i*i)+(j*j);// Условие задачи первое : " Сумма квадратов любых двух целых чисел " b:=(i*i*i); // Условие задачи второе :" кубу одного из этих чисел " if (a=b) then // Если условие выполняется :" Сумма квадратов любых двух целых чисел равно кубу одного из этих чисел. " begin f:=true; // Присваеваем True end else begin f:=false; // Если нет False end; if f then // Работаем с числами если True begin if i mod 2 <> 0 // Проверяем нечетность первого числа then cx+=1 else if j mod 2 <> 0 // Проверяем нечетность второго числа then bx+=1; // Если соответсвует условию то добавляем 1 end; if f then // Если правда выводим пары чисел writeln (i,' ', j); end; //Конец двойного цикла writeln ; writeln ('Кол-во нечетных чисел в парах: ',cx+bx ); //Выводим сумму нечетных чисел writeln; end. Комментарии к решению: Используется двойной цикл, компьютер проверяет числа на соответствие условиям задачи. Дополнительные комментарии в исходном коде. Все данные выводятся на экран пользователя. Скриншоты: Задание №6 Текст задания: Какое число меньше миллиона имеет больше всего делителей? Разработать программу, которая выводит такое число, делители числа и их количество. Язык программирования: PascalABC.Net Версия: 3.0 Сборка 1073 Исходный код программы: var j1,n,i,j,k,max,maxn:longint; time:real; begin max:=1; //Начальное значение maxn:=1; //Начальное значение time:=milliseconds; //Начало подсчета времени writeln ('Просчет числа ...');//Диалог с пользователем for i:=2 to 1000000 do //Цикл от 2 до 1 000 000 begin k:=2;//1 и само for j:=2 to trunc(sqrt(i)) do //считаем делители до корня из числа и умножаем на 2 if i mod j = 0 then inc(k,2); if frac(sqrt(i))=0 then dec(k);//если число полный квадрат, то минус 1 if k>max then begin max:=k; //Подсчитывает максимальное число делителей maxn:=i; //Подсчитываем максимальное число от 1 до 1 000 000 end; end; writeln; writeln ('Просчет делителей ...'); // Диалог с пользователем for j:=1 to maxn do //Цикл от 1 до самого числа begin if maxn mod j = 0 then write (j,' ,');//Выводим делители end; time:=(milliseconds-time)/1000; //Конец подсчета времени writeln; writeln ('Это число: ',maxn); //вывод числа writeln ('Кол-во делителей: ',max); //вывод кол-во делителей writeln ('Затрачено время: ',time,' сек.'); //вывод затраченного времени writeln; end. Комментарии к решению: Просчитываем числа через цикл выявляя максимальное кол-во делителей и максимальное значение числа. Для того что бы программа не уходила в глубокий цикл просчитываем делители до корня из искомого числа. Дополнительные комментарии в исходном коде. Все данные выводятся на экран пользователя. Реализован подсчет времени из-за долгого процесса подсчета чисел. Скриншоты: Задание №7 Текст задания: Каждая страница книги содержит 64 строки. В каждой строке содержится 32 символа. Разработать программу, которая подсчитывает число страниц в книге, если известно, что текст книги занял 512 Кбайт памяти. Для кодирования каждого символа использовалась кодировка Unicode. Язык программирования: PascalABC.Net Версия: 3.0 Сборка 1073 Исходный код программы: const stroki=64; // число строк s=32; //число символов в строке V=512; //Кбайт ones=2; //2 байт занимает 1 символ var a: integer; Vpage,pages: real; в Unicoode begin writeln ('Нажмите ENTER для подсчета страниц...');//Диалог с пользователем readln; a:=stroki*s; //Подсчет символов на одной странице Vpage:=a*ones; //Объем страницы в байтах Vpage:=Vpage/1024; //Объем страницы в Кбайтах pages:=V/Vpage; //Подсчет кол-ва страниц writeln ('В книге ',pages,' стр. '); writeln; end. Комментарии к решению: Просто все подсчитывается. Дополнительные комментарии в исходном коде. Все данные выводятся на экран пользователя. Скриншоты: Задание №8 Текст задания: Разработать программу подсчета количества единиц, используемых при записи целых положительных чисел в двоичной и восьмеричной системах счисления. В программе используются числа, которые не больше числа 65 в десятичной системе счисления, Язык программирования: PascalABC.Net Версия: 3.0 Сборка 1073 Исходный код программы: var a,b,c,d,i: integer; begin d:=4; // так в двоичной системе при переводе из десятичной у еденицы 1,у двойки 10 ,у тройки 11, всего 4 еденицы , поэтому d=4 for a:=4 to 65 do // цикл от 4 до 65 , так как для первых 3 цифр кол-во едениц мы уже завели begin //все наверное знает как переводить числа из десятичной в двоичную , главной целью является подсчитать кол-во едениц поэтому без разницы как считать цифры 0,1 b:= a mod 2 ; //вычисляем остаток от деления write (b); c:= a div 2; //вычисляем целую часть деления if b=1 then //если это еденица то добаляем к d еденицу d:=d+1; repeat //цикл повтора b:= c mod 2; //снова вычесляем остаток от деления write (b); if b=1 then //если это еденица то добаляем к d еденицу d:=d+1; c:= c div 2; //вычисляем целую часть деления until c<2; //цикл повтора write(c); if c=1 then //если в конце всех вычислений и с = 1 то добаляем к d еденицу d:=d+1; writeln; end; writeln ; writeln ('Число едениц в двоичной системе : ',d); // вывод кол-ва едениц writeln; i:=1; //в восмеричной системе исчисления от 1 до 3 , только одна еденица for a:=4 to 65 do // все остальне в принцепе так же , просто в место 2 ставим 8 и все , комп вычеслит все сам begin b:= a mod 8 ; write (b); c:= a div 8; if b=1 then i:=i+1; repeat b:= c mod 8; write (b); if b=1 then i:=i+1; c:= c div 8; until c<8; write(c); if c=1 then i:=i+1; writeln; end; writeln; writeln ('Число едениц в восмертчной системе : ',i); // вывод колва едениц в восмеричной системе исчисления writeln; writeln ('Общее кол-во едениц : ',d+i); //сумма всех едениц end. Комментарии к решению: Комментарии в исходном коде. Все данные выводятся на экран пользователя. Скриншоты: Задание №9 Текст задания: Определите аминокислотную последовательность первого белка (в информационной РНК кодирующая последовательность расположена между триплетами AUG), закодированную в правой половинке ДНК. Разработать программу, которая определяет аминокислотную последовательность первого белка в указанной последовательности. Язык программирования: PascalABC.Net Версия: 3.0 Сборка 1073 Исходный код программы: var i,j:integer; s,a:string; c:char; f:text; begin assign (f,'in.txt'); // Объявляем файл с содержанием кода правой половинке ДНК reset (f); readln(f,s);//считываем строку close (f);//закрываем строку For i:=1 to length(s) do begin //Начинаем переделовать правую половинку в левую , как в условии If s[i] = 'T' then // Темин на Аденини , Аденин на Темин s[i]:='A' else if s[i] = 'A' then s[i]:='T'; If s[i] = 'G' then // Гуанин на цетазин s[i]:='C' else if s[i] = 'C' then // Цетазин на гуанин s[i]:='G'; end; //Переделали правуб половинку в левую assign (f,'out.txt'); //Объявляем файл для дальнейшей инверсии rewrite (f); // На перезапись for i:=length(s) downto 1 do begin write (f,s[ i]); // Записываем строку в перевернутом виде end; close (f); //Закрываем файл assign (f,'out.txt'); //Снова откроем reset (f); //Для чтения readln(f,s); close (f);// Закрываем //Инверсия окончена... For i:=1 to length(s) do begin If s[i] = 'T' then //Заменяем Темин на Гуанин s[i]:='U' end; //Начало белка i := Pos('AUG', s); // Приравниваем к позитции AUG if i > 0 then begin Delete(s, i, 3); //удаляем 3 символа Insert('***', s, i); //в место них записываем *** end; //Конец белка i := Pos('AUG', s); if i > 0 then begin Delete(s, i, 1000); //Удаляем AUG и все после нее так это часть РНК нам не нужно end; i := Pos('***', s); // Приравниваем к позитции *** j := 1; if i > 0 then begin Delete(s, j, i+2); // Удаляем *** и все до нее end; //Остается та часть которая нужна для определения аминокислотной последовательности первого белка j:= length(s) div 3; //Приравниваем к целому значению, деления на 3 . Т.к один триплет 3 буквы for i:=1 to j do //начинам определние аминокислотной последовательности begin a:= copy (s, 1 , 3); //Копируем первые 3 символа case a совпадение //По U 'UUU': 'UUC': 'UUA': 'UUG': of //Сравниваем с таблицей генетических кодов, при выводим write write write write ('Phe, ('Phe, ('Leu, ('Leu, '); '); '); '); 'UCU': 'UCC': 'UCA': 'UCG': write write write write ('Ser, ('Ser, ('Ser, ('Ser, '); '); '); '); 'UAU': 'UAC': 'UAA': 'UAG': write write write write ('Uyr, '); ('Uyr, '); ('Stop, '); ('Stop, '); 'UGU': 'UGC': 'UGA': 'UGG': write write write write ('Cys, '); ('Cys, '); ('Stop, '); ('Trp, '); //По C 'CUU': 'CUC': 'CUA': 'CUG': write write write write ('Leu, ('Leu, ('Leu, ('Leu, '); '); '); '); 'CCU': 'CCC': 'CCA': 'CCG': write write write write ('Pro, ('Pro, ('Pro, ('Pro, '); '); '); '); 'CAU': write ('His, '); 'CAC': write ('His, '); 'CAA': write ('Gin, '); 'CAG': write ('Gin, '); 'CGU': 'CGC': 'CGA': 'CGG': write write write write ('Arg, ('Arg, ('Arg, ('Arg, '); '); '); '); //По A 'AUU': 'AUC': 'AUA': 'AUG': write write write write ('IIe, ('IIe, ('IIe, ('Met, '); '); '); '); 'ACU': 'ACC': 'ACA': 'ACG': write write write write ('Thr, ('Thr, ('Thr, ('Thr, '); '); '); '); 'AAU': 'AAC': 'AAA': 'AAG': write write write write ('Asn, ('Asn, ('Lys, ('Lys, '); '); '); '); 'AGU': 'AGC': 'AGA': 'AGG': write write write write ('Ser, ('Ser, ('Arg, ('Arg, '); '); '); '); //По G 'GUU': 'GUC': 'GUA': 'GUG': write write write write ('Val, ('Val, ('Val, ('Val, '); '); '); '); 'GCU': 'GCC': 'GCA': 'GCG': write write write write ('Ala, ('Ala, ('Ala, ('Ala, '); '); '); '); 'GAU': 'GAC': 'GAA': 'GAG': write write write write ('Asp, ('Asp, ('Glu, ('Glu, '); '); '); '); 'GGU': 'GGC': 'GGA': 'GGG': write write write write ('Gly, ('Gly, ('Gly, ('Gly, '); '); '); '); end; delete (s, 1, 3); //Удаляем эти три буквы, т.к в дальнейшем они уже не нужны end; // Конец цикла end. Комментарии к решению: Все комментарии в исходном коде. Все данные выводятся на экран пользователя. Есть дополнительные файлы in.txt и out.txt их предназначение описано в коде программы. Скриншоты: Задание №10 Текст задания: Сколько в ней генов AGAA? Определить индексы этих генов. Разработать программу, которая определяет количество и индексы этих генов. Язык программирования: PascalABC.Net Версия: 3.0 Сборка 1073 Исходный код программы: var b,i,j:integer; s,a:string; c:char; f:text; q: real; begin assign (f,'in.txt'); //считываем строку s reset (f); readln(f,s); close (f); for b:=1 to length(s) div 4 do //саздаем цикл begin i := Pos('AGAA', s); // находим AGGA if i > 0 then begin // если больше нуля ,то добавляем к количеству еденицу j:=j+1; end; Delete(s, i, 4); // удаляем, для раюоты он больше не понадобиться end; writeln ('Кол-во AGAA : ',j); //Выводим кол-во end. Комментарии к решению: Все комментарии в исходном коде. Все данные выводятся на экран пользователя. Скриншоты: \