Московский городской Дворец детского (юношеского) творчества Набор заданий для образовательной программы «Прикладное программирование С/С++» Автор: Левин К.М. 2012г. ПОЯСНИТЕЛЬНАЯ ЗАПИСКА Данная работа является набором заданий по программированию. Задания предназначены для практического закрепления учебного материала по курсу «Программирование С/С++». Задачи разбиты на несколько разделов. a) Задания на ввод-вывод. Они знакомят учащихся с интерфейсом общения с программой, учат начальному синтаксису: объявлению и использованию переменных, знакомят с основными типами данных. b) Задания на использование условного оператора. Знакомят учащихся с таким понятием, как ветвления, развивают навыки разработки алгоритмов. Задачи раздела не отличаются особой сложностью, поэтому позволяют «набить руку» в написании несложных алгоритмов, тем самым закрепляя знание синтаксиса языка и его основных конструкций. c) Задания на циклы и рекурсию. Знакомят учащихся с основными средствами создания алгоритмов. Также вводятся принципиально новые понятия функции и рекурсии. В совокупности со знаниями предыдущих разделов учащиеся получают необходимый аппарат для написания любых алгоритмов. d) Задания на типы данных. Знакомят учащихся с составными типами: структурами и классами, подготавливая почву для освоения объектноориентированного программирования, а также закрепляя все полученные ранее навыки. В каждом разделе выделена группа контрольных заданий различного уровня сложности. Они помечены символом (К). Задания разделены по уровням сложности следующим образом: a) Ознакомительный (без звездочки) b) Начальный (*) c) Средний (**) d) Сложный (***) Ознакомительные задания предназначены, прежде всего, для закрепления знаний синтаксиса операторов, функций и алгоритмических конструкций. Более сложные задачи помечены звездочками. Задачи со звездочками позволяют отрабатывать навыки более эффективного написания алгоритмов. В работе содержится много математических задач. Процесс решения таких задач позволяет взглянуть на математические задачи с точки зрения программирования и алгоритмов, развивая, тем самым, разносторонний подход к решению проблем у учащихся. Сами тексты заданий взяты из открытых источников. Работа автора заключалась в подборке этих заданий, распределению по уровням сложности, подборке контрольных задач, составлении пояснений (разборов) к задачам. Данная работа может использоваться педагогом, ведущий подобный курс программирования (язык не важен). Возможно использовать данные задания, как в процессе занятий в классе, так и в качестве домашних заданий. Задания расположены в порядке, предусматривающем логически целостное восприятие материала. Содержание: Ввод– вывод, оператор присваивания, арифметические операции............4 1) Гипотенуза ....................................................................................................................5 2) Следующее и предыдущее.....................................................................................5 3) Последняя цифра ......................................................................................................5 4) Дележ яблок 1..............................................................................................................5 5) Дележ яблок 2 (К) ......................................................................................................5 6) МКАД* .............................................................................................................................5 7) Число десятков двузначного числа....................................................................5 8) Число десятков(К) ......................................................................................................5 9) Сумма цифр .................................................................................................................6 10) Следующее четное ....................................................................................................6 11) Электронные часы 1* ...............................................................................................6 12) Электронные часы 2* ...............................................................................................6 13) Обмен значений ..........................................................................................................6 14) Конец уроков* ..............................................................................................................7 15) Стоимость покупки*(К) .............................................................................................7 16) Разность времен* .......................................................................................................7 17) Автопробег*..................................................................................................................7 18) Дележ яблок 3** .........................................................................................................7 19) Улитка*** ........................................................................................................................8 20) Симметричное число**.............................................................................................8 21) Проверьте делимость**(К) ......................................................................................8 22) Максимум*** .................................................................................................................8 3. Условный оператор .........................................................................................................8 1) Максимум ...........................................................................................................................9 2) Високосный год ..........................................................................................................9 3) Знак числа ....................................................................................................................9 4) Какое из чисел больше ............................................................................................9 5) Максимум из трех(К) .................................................................................................9 6) Ладья ..............................................................................................................................9 7) Слон* ...............................................................................................................................9 8) Ферзь*(К) .......................................................................................................................9 9) Король ..........................................................................................................................10 10) Конь* .............................................................................................................................10 11) Шоколадки* ................................................................................................................10 12) Фишки* .........................................................................................................................10 13) Уравнение*..................................................................................................................10 14) Сложное уравнение*(К) ..........................................................................................11 15) Сдача* ...........................................................................................................................11 16) Мороженое**...............................................................................................................11 17) Котлеты* ......................................................................................................................11 18) Координатные плоскости .....................................................................................11 19) Существует ли треугольник* ...............................................................................12 20) Совпадающие числа ...............................................................................................12 21) Квадратное уравнение* .........................................................................................12 22) Тип треугольника* ...................................................................................................12 23) Коровы**(К) .................................................................................................................12 24) Метро** .........................................................................................................................12 25) Координаты соседей* .............................................................................................13 26) Четные и нечетные числа .....................................................................................13 1. 27) Римская система счисления* ..............................................................................13 28) Упорядочить три числа(К) ....................................................................................13 4. Циклы и рекурсия ...........................................................................................................14 1) Сумма квадратов ...........................................................................................................14 2) Факториал ...................................................................................................................14 3) Степень ........................................................................................................................14 4) Сочетания*(К).............................................................................................................14 5) Прогрессия .................................................................................................................14 6) Сумма - 1 .....................................................................................................................14 7) Сумма - 2(К) ................................................................................................................14 8) Сумма степеней ........................................................................................................14 9) Четные числа.............................................................................................................14 10) Остаток.........................................................................................................................14 11) Квадраты* ...................................................................................................................14 12) Делители числа ........................................................................................................14 13) Число делителей ......................................................................................................14 14) Подсчет чисел ...........................................................................................................14 15) Число решений*(К) ...................................................................................................15 16) Двоичный логарифм* .............................................................................................15 17) Пробежка* ...................................................................................................................15 18) Числа Фибоначчи* ...................................................................................................15 19) Номер числа Фибоначчи* .....................................................................................15 20) Раздвоитель** ...........................................................................................................15 21) Среднее значение последовательности* .......................................................15 22) Второй максимум* ...................................................................................................15 23) Максимальное число идущих подряд равных элементов* .....................15 24) Число локальных максимумов** .......................................................................16 25) Наименьшее расстояние между локальными максимумами** ...............16 26) Сумма цифр* ..............................................................................................................16 27) Число нулей* .............................................................................................................16 28) Наибольшая и наименьшая цифры* ................................................................16 29) Двоичная запись - 1* ...............................................................................................16 30) Двоичная запись - 2**(К) ........................................................................................16 31) Обратная запись** ...................................................................................................16 5. Типы данных ....................................................................................................................17 1) IP-адрес**.....................................................................................................................17 2) Две одинаковые буквы** ......................................................................................17 3) Обмен значений*(К) .................................................................................................17 4) Удали пробелы .........................................................................................................17 5) Двоичный перевод** ...............................................................................................17 6) Количество слов* .....................................................................................................17 7) Регистр .........................................................................................................................17 8) Шифр**(К) ....................................................................................................................17 9) Точки плоскости** ....................................................................................................17 10) Сортировка точек**..................................................................................................17 11) Учащиеся без троек**(К).........................................................................................18 12) Обмен значений**.....................................................................................................18 13) Максимальная площадь** .....................................................................................18 14) Максимальный периметр** (К) ............................................................................18 15) Личные дела***..........................................................................................................18 * Условия заданий взяты с сайта Московского Центра Непрерывного Математического Образования - http://www.mccme.ru/ Ввод– вывод, оператор присваивания, арифметические операции 1) Гипотенуза Задание: Дано два числа a и b. Выведите гипотенузу треугольника с заданными катетами. Разбор: По теореме Пифагора квадрат гипотенузы равен сумме квадратов катетов, поэтому нам нужно вывести sqrt(a*a+b*b). Число может получиться не целым, поэтому надо использовать вещественный тип. 2) Следующее и предыдущее Задание: Напишите программу, которая считывает целое число и выводит текст, аналогичный приведенному в примере. Пробелы, знаки препинания, заглавные и строчные буквы важны! 3) Последняя цифра Задание: Дано натуральное число. Выведите его последнюю цифру. Разбор: Чтобы найти последнюю цифру числа n надо найти остаток от деления n на 10. 4) Дележ яблок 1 Задание: N школьников делят K яблок поровну, неделящийся остаток остается в корзинке. Сколько яблок достанется каждому школьнику? Программа получает на вход числа N и K и должна вывести искомое количество яблок. Разбор: Если а - количество школьников, b - количество яблок, то ответом является целая часть частного от деления b на a. 5) Дележ яблок 2 (К) Задание: N школьников делят K яблок поровну, неделящийся остаток остается в корзинке. Сколько яблок останется в корзинке? Программа получает на вход числа N и K и должна вывести искомое количество яблок. Разбор: Ответом будет остаток от деления N на K. 6) МКАД* Задание: Длина Московской кольцевой автомобильной дороги —109 километров. Байкер Вася стартует с нулевого километра МКАД и едет со скоростью v километров в час. На какой отметке он остановится через t часов? Программа получает на вход значения v и t. Если v>0, то Вася движется в положительном направлении по МКАД, если же значение v<0, то в отрицательном. Программа должна вывести целое число от 0 до 108 — номер отметки, на которой остановится Вася. Разбор: Найдем сколько километров он прошел по кольцевой (т.е S = |v| * t). Теперь так как это кольцевая то он может крутится несколько раз, чтобы это учесть мы найдем остаток от деления S на 109. После этого если s = 0,то выводим 0. Потом проверяем если v < 0, то выводим 109- (S mod 109) иначе выводим S mod 109. 7) Число десятков двузначного числа Задание: Дано двузначное число. Найдите число десятков в нем. Разбор: Результат целочисленного деления двузначного числа на десять и будет ответом на эту задачу. 8) Число десятков(К) Задание: Дано натуральное число. Найдите число десятков в его десятичной записи (то есть вторую справа цифру его десятичной записи). Разбор: Чтобы найти число десятков числа n надо найти остаток от деления n на 100, а потом это же число делить нацело на 10. 9) Сумма цифр Задание: Дано трехзначное число. Найдите сумму его цифр. Разбор: Чтобы найти сумму цифр трехзначного числа n надо найти каждую цифру отдельно, а потом их сложить. Последняя цифра находится с помощью остатка от деления числа n на 10. Чтобы найти перед последнюю цифру надо остаток от деления n на 100, а потом это же число делить нацело на 10. А чтобы найти перед-перед последнюю цифру надо n делить нацело на 100. 10) Следующее четное Задание: Дано целое число n. Выведите следующее за ним четное число. При решении этой задачи нельзя использовать условную инструкцию if и циклы. Разбор: можно наше число сделать ближайшим четным: (N div 2) * 2. А потом прибавить 2. 11) Электронные часы 1* Задание: Дано число n. С начала суток прошло n минут. Определите, сколько часов и минут будут показывать электронные часы в этот момент. Программа должна вывести два числа: количество часов (от 0 до 23) и количество минут (от 0 до 59). Учтите, что число n может быть больше, чем количество минут в сутках. Разбор: Для начала отсечём лишние сутки: n mod 1440. Затем найдем время в полных часах: n div 60, а потом минуты n mod 60. Не забудьте про n mod 1440! 12) Электронные часы 2* Задание: Электронные часы показывают время в формате h:mm:ss, то есть сначала записывается количество часов, потом обязательно двузначное количество минут, затем обязательно двузначное количество секунд. Количество минут и секунд при необходимости дополняются до двузначного числа нулями. С начала суток прошло n секунд. Выведите, что покажут часы. Разбор: Число часов в сутки будет равен количество секунд разделенных на 3600. Теперь остаток у нас имеет в себе число минут и секунд. Если этот остаток делить на 60, то мы получим количество минут, а остаток этого остатка будет у нас число секунд. Но не забудьте, что вывод должен быть в формате h:mm:ss (т.е 12:59:59). Такой формат можно сделать следующим образом: Сделаем так h = h mod 24, а потом выводим h. Потом выводим символ «:». Если количество минут < 10, то выводим «0», а потом число m, иначе выводим m. Потом выводим символ «:». Если количество секунд < 10, то выводим «0», а потом число m, иначе выводим m. Можно вывести в формате h:mm:ss ,не используя условный оператор: выводим h, символ ":",m div 10, m mod 10,символ ":", s div 10, s mod 10 13) Обмен значений Задание: Напишите программу, которая считывает значения двух переменных a и b, затем меняет их значения местами (то есть в переменной a должно быть записано то, что раньше хранилось в b, а в переменной b записано то, что раньше хранилось в a). Затем выведите значения переменных. Разбор: С помощью дополнительной переменной: с:=a; a:=b; b:=c; 14) Конец уроков* Задание: В некоторой школе занятия начинаются в 9:00. Продолжительность урока — 45 минут, после 1-го, 3-го, 5-го и т.д. уроков перемена 5 минут, а после 2-го, 4-го, 6-го и т.д. — 15 минут. Дан номер урока (число от 1 до 10). Определите, когда заканчивается указанный урок. Выведите два целых числа: время окончания урока в часах и минутах. При решении этой задачи нельзя пользоваться циклами и условными инструкциями. Разбор: Решение этой задачи усложняется с этим условием "При решении этой задачи нельзя пользоваться циклами и условными инструкциями.". Так как каждый урок состоит из 45 минут, то мы знаем что с начало суток прошло 9*60 + n*45 (где n количества уроков). Теперь мы учитываем количество минут прошедших в переменах (т.е (n div 2) * (5 + 15)). Но, при нечетном n, у нас выводит не правильный ответ и поэтому количества минут прошедших на переменах у нас будет (n div 2) * (5 + 15) - (n mod 2 - 1) * 15. В конце концов, ответом будет 9*60 + n*45 + (n div 2) * (5 + 15) - (n mod 2 - 1) * 15. Но это все в минутах, их надо перевести в часы и минуты. 15) Стоимость покупки *(К) Задание: Пирожок в столовой стоит a рублей и b копеек. Определите, сколько рублей и копеек нужно заплатить за n пирожков. Программа получает на вход три числа: a, b, n и должна вывести два числа: стоимость покупки в рублях и копейках. Разбор: Сначала переведем все в копейки (100*a + b). Теперь найдем сколько компеек стоит n пирожков (т.е. (100*a + b)*n ). Если вот это число перевести в рубли и копейки, то будет ответ на задачу. 16) Разность времен* Задание: Даны значения двух моментов времени, принадлежащих одним и тем же суткам: часы, минуты и секунды для каждого из моментов времени. Известно, что второй момент времени наступил не раньше первого. Определите, сколько секунд прошло между двумя моментами времени. Программа на вход получает три целых числа — часы, минуты, секунды, задающие первый момент времени и три целых числа, задающих второй момент времени. Выведите число секунд между этими моментами времени. Разбор: Переведем все время в секунды. Для этого часы умножаем на 3600, минуты на 60. Находим сколько секунд было в первый и второй момент времени,затем от второго значения отнимем первое. Это и будет ответ. 17) Автопробег* Задание: За день машина проезжает n километров. Сколько дней нужно, чтобы проехать маршрут длиной m километров? Программа получает на вход числа n и m. При решении этой задачи нельзя пользоваться условной инструкцией if и циклами. Разбор: (m div n) + 1 * ((m mod n) > 0) 18) Дележ яблок 3** Задание: n школьников делят k яблок “поровну”, то есть так, чтобы количество яблок, доставшихся любым двум школьникам, отличалось бы не более, чем на 1. Программа получает на вход числа n и k и должна вывести количество школьников, которым достанется яблок меньше, чем некоторым из их товарищей. При решении этой задачи нельзя пользоваться условной инструкцией if и циклами. Разбор: Несложно прийти к формуле (n-k%n)%n: вычитаем количество учеников, получивших наибольшее число яблок из числа всех учеников и берем остаток от деления на n на случай, если таких таких учеников нет. (% - операция получения остатка от деления одного числа на другое) 19) Улитка*** Задание: Улитка ползёт по вертикальному шесту высотой h метров, поднимаясь за день на a метров, а за ночь спускаясь на b метров. На какой день улитка доползёт до вершины шеста? Программа получает на вход натуральные числа h, a, b и должна вывести одно натуральное число. Гарантируется, что a>b. При решении этой задачи нельзя пользоваться условной инструкцией if и циклами. 20) Симметричное число** Задание: Дано четырехзначное число. Определите, является ли его десятичная запись симметричной. Если число симметричное, то выведите 1, иначе выведите любое другое целое число. Число может иметь меньше четырех знаков, тогда нужно считать, что его десятичная запись дополняется слева незначащими нулями. При решении этой задачи нельзя пользоваться условной инструкцией if и циклами Разбор: найдем каждую цифру по отдельности: 1) Первая цифра будет равна a = n div 1000. Вторая цифра будет равна b = (n mod 1000) div 100; Теперь сумма этих цифр будет s1 = 10*a + b; 2) Третья цифра будет равна c = (n mod 100) div 10; , а четвертая цифра будет d = n mod 10;Теперь их сумма будет равна s2 = c + d*10; Ответом к этой задаче будет s1-s2+1, потому что в условии сказано, что если они симметричны то вывести 1, а если нет то вывести любое другое. 21) Проверьте делимость**(К) Задание: Даны два натуральных числа n и m. Если одно из них делится на другое нацело, выведите 1, иначе выведите любое другое целое число. При решении этой задачи нельзя пользоваться условной инструкцией if и циклами. Разбор: Данный ответ можно получать, например, используя следующую формулу: 1 + (n%m)*(m%n) Тогда, если одно из чисел делится на другое, второе слагаемое будет равняться 0, иначе оно будет равно произведению остатков от деления. 22) Максимум*** Задание: Напишите программу, которая считывает два целых числа a и b и выводит наибольшее значение из них. Числа — целые от 1 до 1000. При решении задачи можно пользоваться только целочисленными арифметическими операциями +, -, *, //, %, =. Нельзя пользоваться нелинейными конструкциями: ветвлениями, циклами, функциями вычисления модуля, извлечения квадратного корня. Разбор: Докажем справедливость данной формулы нахождения максимума из двух чисел: w:=(abs(a-b)+(a+b)) / 2; Если a>b то модуль раскроется с плюсом: (a-b+a+b) / 2 = (2a) / 2 = a. Если a<b то модуль раскроется с минусом: (b-a+a+b) / 2 = 2b/2 = b. Если a=b тогда: a-b=0 и (т.к a=b) (a+a)/2=a. Так как в условии задачи сказано не пользоваться функциями вычисления модуля предлагаю вариант свёрстанный на DIVах;) (((a+b) div b-1)*a+((a+b) div a-1)*b) div(a div b+b div a) З.Ы. Не представляю как эту формулу описать словами. 1. Условный оператор 1) Максимум Задание: Даны два целых числа, каждое число записано в отдельной строке. Выведите наибольшее из данных чисел. Разбор: Достаточно написать один if или просто использовать готовую функцию max(). 2) Високосный год Задание: Требуется определить, является ли данный год високосным. (Напомним, что год является високосным, если его номер кратен 4, но не кратен 100, а также если он кратен 400.) Разбор: Достаточно написать один оператор if, аккуратно указав в нем все условия. 3) Знак числа Задание: В математике функция sign(x) (знак числа) определена так: sign(x) = 1, если x > 0, sign(x) = -1, если x < 0, sign(x) = 0, если x = 0. Для данного числа x выведите значение sign(x). Разбор: Эту задачу можно решить через 3 простых if. 4) Какое из чисел больше Задание: Даны два целых числа, каждое записано в отдельной строке. Программа должна вывести число 1, если первое число больше второго, число 2, если второе больше первого, или число 0, если они равны. Разбор: Задача решается двумя вложенными if-ами. Если a>b, то выводим ответ иначе оно, либо равно, либо меньше b, что и проверяем ещё одним if-ом. 5) Максимум из трех(К) Задание: Задача решается двумя вложенными if-ами. Если a>b, то выводим ответ иначе оно, либо равно, либо меньше b, что и проверяем ещё одним if-ом. Разбор: Выведите наибольшее из данных чисел (программа должна вывести ровно одно целое число). 6) Ладья Задание: Требуется определить, бьет ли ладья, стоящая на клетке с указанными координатами (номер строки и номер столбца), фигуру, стоящую на другой указанной клетке. Вводятся четыре числа: координаты ладьи (два числа) и координаты другой фигуры (два числа), каждое число вводится в отдельной строке. Разбор: Если ладья бьет некоторое поле, то это поле должно лежать в той же строке или в том же столбце. Это означает, что хотя бы одна координата поля должна совпадать с соответствующей координатой ладьи. 7) Слон* Задание: Требуется определить, бьет ли слон, стоящий на клетке с указанными координатами (номер строки и номер столбца), фигуру, стоящую на другой указанной клетке. Вводятся четыре числа: координаты слона и координаты другой фигуры. Разбор: Заметим, что если две клетки лежат на одной диагонали, то либо сумма координат (x+y), либо разность координат (x-y) у них должны быть равны (в зависимости от направления диагонали). 8) Ферзь*(К) Задание: Требуется определить, бьет ли ферзь, стоящий на клетке с указанными координатами (номер строки и номер столбца), фигуру, стоящую на другой указанной клетке. Вводятся четыре числа: координаты ферзя и координаты другой фигуры. Разбор: необходимо объединить if'ы от слона и ладьи (так как ферзь бьет как по диагонали, так и по вертикалям) 9) Король Задание: Поле шахматной доски определяется парой чисел (a, b), каждое от 1 до 8, первое число задает номер столбца, второе – номер строки. Заданы две клетки. Определите, может ли шахматный король попасть с первой клетки на вторую за один ход. Даны 4 целых числа от 1 до 8 каждое, первые два задают начальную клетку, вторые два задают конечную клетку. Начальная и конечная клетки не совпадают. Числа записаны в отдельных строках. Программа должна вывести YES, если из первой клетки ходом короля можно попасть во вторую, или NO в противном случае. Разбор: Шахматный король может попасть с одной клетки на вторую за один ход, если значения модулей разности соответствующих координат равны 1 или 0, т.е. если |a-c| = 0 или 1 и |b-d| = 0 или 1, где b и d - координаты второй клетки. 10) Конь* Задание: Требуется определить, бьет ли конь, стоящий на клетке с указанными координатами (номер строки и номер столбца), фигуру, стоящую на другой указанной клетке. Вводятся четыре числа: координаты коня и координаты другой фигуры. Разбор: Если конь стоит в точке (x1,y1), то он бьет фигуру, стоящую в точке (x2,y2) только в двух случаях abs(x1-x2)=1 and abs(y2-y1)=2 или abs(x1-x2)=2 and abs(y2-y1)=1. 11) Шоколадки* Задание: Требуется определить, можно ли от шоколадки размером n × m долек отломить k долек, если разрешается сделать один разлом по прямой между дольками (то есть разломить шоколадку на два прямоугольника). Вводятся 3 числа: n, m и k; k не равно n × m. Гарантируется, что количество долек в шоколадке не превосходит 30000. Разбор: Если от шоколадки размером n x m можно отломить k долек, то k должно делиться на n или на m без остатка. Также следует учесть, что при k > n x m программа должна выдать отрицательный ответ (NO). 12) Фишки* Задание: В каждую крайнюю клетку квадратной доски поставили по фишке. Могло ли оказаться, что выставлено ровно k фишек? (Например, если доска 2 x 2, то выставлено 4 фишки, а если 6 x 6 - то 20). Вводится одно натуральное число k. Разбор: В данной задаче фишки расставлены по периметру клетчатой квадратной доски. Зная формулу для нахождения периметра клетчатой доски: P = a x 4 - 4, где P - периметр; a - сторона квадрата, выразим а. Таким образом, в задаче нужно, проверить делится ли введённое число P на 4. Также нужно отдельно рассмотреть случаи когда введённое число P равно 0 и 1. 13) Уравнение* Задание: Решить в целых числах уравнение ax + b = 0. Вводятся 2 числа: a и b. Необходимо вывести все решения, если их число конечно, “NO” (без кавычек), если решений нет, и “INF” (без кавычек), если решений бесконечно много. Разбор: Если a равняется нулю, b равняется нулю - уравнение имеет бесконечно много решений. Если a равняется нулю, b не равняется нулю решений нет. В остальных случаях нужно проверить, делится ли -b на a без остатка (т.к. надо решить уравнение в целых числах), и если да - вывести результат. Следует учесть, что результат должен быть целого типа. 14) Сложное уравнение*(К) Задание: Решить в целых числах уравнение ( ax + b ) : ( cx + d ) = 0. Вводятся 4 числа: a, b, c и d; c и d не равны нулю одновременно. Необходимо вывести все решения, если их число конечно, “NO” (без кавычек), если решений нет, и “INF” (без кавычек), если решений бесконечно много. Разбор: Если a=c и b=d или a=0 и b<>0, то уравнение не имеет решений. Если a=0 и b=0, то уравнение имеет бесконечно много решений. И последний случай: если a<>0, то находим корень, проверяем, является ли он целым числом, и проверяем, не получится ли 0 в знаменателе. Если все условия выполняются - выводим корень, если нет - уравнение не имеет решений. 15) Сдача* Задание: Товар стоит a руб. b коп. За него заплатили c руб. d коп. Сколько сдачи требуется получить? Вводятся 4 числа: a, b, c и d. Необходимо вывести 2 числа: e и f, число рублей и копеек, соответственно. Разбор: От C отнимем A и от D отнимем B. Если D<0, то уменьшаем С на единицу и увеличиваем D на 100. Если после всего этого С<0, то у покупателя попросту не хватит денег и надо выводить 0 иначе выводим С и D. 16) Мороженое** Задание: В кафе мороженое продают по три шарика и по пять шариков. Можно ли купить ровно k шариков мороженого? Разбор: Заметим, что можно купить 8 шариков (3+5), 9 шариков (3+3+3) и 10 шариков (5+5). Заметим также, что если можно купить k шариков, то можно купить и k+3 шарика. Осталось рассмотреть все k<8. 17) Котлеты* Задание: На сковородку одновременно можно положить k котлет. Каждую котлету нужно с каждой стороны обжаривать m минут непрерывно. За какое наименьшее время удастся поджарить с обеих сторон n котлет? Вводятся 3 числа: k, m и n. Все числа не превосходят 32000. Разбор: Если котлеты помещаются на сковородку, то время на их обжарку равно 2m, если же нет, то подсчитаем сколько всего сторон котлет надо обжарить (2n). Теперь разделим полученное число сторон на число котлет на сковородке, получим число жарок. Если разделилось без остатка, то умножим полученное число на время одной жарки, а если при делении получился остаток, то увеличим число жарок на 1 и умножим полученный результат на время одной жарки. 18) Координатные плоскости Задание: Даны координаты двух точек на плоскости, требуется определить, лежат ли они в одной координатной четверти или нет (все координаты отличны от нуля). Вводятся 4 числа: координаты первой точки (x1, y1) и координаты второй точки (x2, y2) Разбор: Они могут быть на одной четверти, если знаки x1, x2 совпадают. Но не забываем и про y1,y2 если их знаки тоже совпадают, то эти точки лежат на одной четверти. Пример 1: 1 1 3 2 x1 y1 x2 y2 x1>0 and x2>0 and y1>0 and y2>0. То есть надо проверить все эти случаи. Их всего будет 4 19) Существует ли треугольник* Задание: Даны три натуральных числа a, b, c, записанные в отдельных строках. Определите, существует ли треугольник с такими сторонами. Если треугольник существует, выведите строку YES, иначе выведите строку NO. Разбор: Треугольник существует если сумма длин любых 2ух его сторон строго больше длины третьей стороны. 20) Совпадающие числа Задание: Даны три целых числа, записанных в отдельных строках. Определите, сколько среди них совпадающих. Программа должна вывести одно из чисел: 3 (если все совпадают), 2 (если два совпадают) или 0 (если все числа различны). Разбор: Сравниваем первые два числа. Если они равны - сравниваем первое с третьим, и если они равны - выводим 3, иначе - 2. Если первые 2 числа не равны - сравниваем второе с третьим, и если они равны - выводим 2, иначе сравниваем первое с третьим, и если они равны выводим 2, иначе 0 21) Квадратное уравнение* Задание: Даны действительные числа a, b, c. Найдите все решения квадратного уравнения bx + c = 0. Разбор: Найдём дискриминант. Если он равен нулю - находим единственный корень и выводим его. Если дискриминант больше нуля - находим два корня и выводим их. Случай когда дискриминант меньше нуля рассматривать не обязательно, т.к. тогда уравнение не будет иметь корней и по условию ничего выводить не нужно. ax2 + 22) Тип треугольника* Задание: Определите тип треугольника (остроугольный, тупоугольный, прямоугольный) с данными сторонами. Разбор: Для начала для удобства расположим длины сторон в порядке неубывания. Пусть мы получили числа a,b,c (a<=b<=c). Треугольник прямоугольный, если для него будет выполняться теорема Пифагора: a*a+b*b = c*с, остроугольный, если a*a+b*b > c*с и, в остальных случаях, тупоугольный. 23) Коровы**(К) Задание: По данному числу n (<=100) закончите фразу "На лугу пасется..." одним из возможных продолжений: "n коров", "n корова", "n коровы", правильно склоняя слово "корова". Разбор: Рассмотреть, какие мы получаем ответы при n от 1 до 19, и заметить, что при n >= 20 ответы мы получаем такой же как и при n от 0 до 9.(смотрим по модулю 10). 24) Метро** Задание: Билет на одну поездку в метро стоит 15 рублей, билет на 10 поездок стоит 125 рублей, билет на 60 поездок стоит 440 рублей. Пассажир планирует совершить n поездок. Определите, сколько билетов каждого вида он должен приобрести, чтобы суммарное количество оплаченных поездок было не меньше n, а общая стоимость приобретенных билетов – минимальна. Разбор: Целая часть от деления n на 60 будет являтся количеством билетов на 60 поездок. Однако если остаток, полученый в результате этого деления, будет больше или равен 35, то "выгоднее" купить ешё 1 билет на 60 поездок, чем 3 на 10 и 5 на 1. Если остаток меньше 35 - берем целую часть от его деления на 10 - получим кол-во белетов на 10 поездок. Если остаток от этого деления равен 9, то "выгоднее" купить ещё 1 билет на 10 поездок, чем 9 на 1. Если остаток меньше 9 - то этот остаток и будет являться кол-вом билетов на 1 поездку. 25) Координаты соседей* Задание: Для клетки с координатами (x, y) в таблице размером M × N выведите координаты ее соседей. Соседними называются клетки, имеющие общую сторону. Разбор: Соседями точки (x,y) являются точки (x+1,y),(x-1,y),(x,y+1),(x,y-1), надо просто "проследить" за тем, чтобы эти соседи не выходили за пределы таблицы. 26) Четные и нечетные числа Задание: Даны три целых числа A, B, C. Определить, есть ли среди них хотя бы одно четное и хотя бы одно нечетное. Разбор: 1)Можно создать 2 булевские переменные и каждое число проверять одним if-ом, если число четное, то 1-ой переменной присваиваем true, иначе 2ой переменной присваиваем true. В конце проверим если обе переменные true, то ответ "YES" иначе "NO". 2) Можно сделать одним if-ом с приоритетами. Если (a-четное или b-четное или c-четное) и (a-нечетное или b-нечетное или cнечетное) то “YES”, иначе “NO”. 27) Римская система счисления* Задание: Дано число X в десятичной системе счисления (1 ≤ X ≤ 100). Требуется перевести это число в римскую систему счисления. Разбор: Следует отдельно переводить число десятков и число единиц, рассмотрев все случаи (всего их 18). Также, следует рассмотреть отдельно случай, когда вводимое число Х равно 100. 28) Упорядочить три числа(К) Задание: Дано три числа, записанный в отдельных строках. Упорядочите их в порядке неубывания. Программа должна считывать три числа a, b, c, затем программа должна менять их значения так, чтобы стали выполнены условия a <= b <= c, затем программа выводит тройку a, b, c. 2. Циклы и рекурсия 1) Сумма квадратов Задание: По данному натуральному n вычислите сумму 12+22+...+n2. 2) Факториал Задание: Вычислите N! ("факториал") – произведение всех натуральных чисел от 1 до N ( N!=1∙2∙3∙…∙ N ). N – натуральное, не превосходит 12. 3) Степень Задание: Выведите число 2 N. N не превосходит 30. 4) Сочетания*(К) Задание: По данным натуральным n и k вычислите значение (n!*k!)/(n−k)! (число сочетаний из n элементов по k). 5) Прогрессия Задание: По данному действительному числу a и натуральному n вычислите сумму 1+a+a2+...+an, не используя формулу суммы геометрической прогрессии. Время работы программы должно быть пропорционально n. 6) Сумма - 1 Задание: По данному числу n вычислите сумму 1+1/22+1/32+...+1/n2. 7) Сумма - 2(К) Задание: По данному числу n вычислите сумму 4(1-1/3+1/5-1/7+...+(-1)n/ (2n+1)). 8) Сумма степеней Задание: Вычислите 1+2+22+23+…+2 N. N – натуральное, не превосходит 30. 9) Четные числа Задание: Выведите (через пробел) все четные числа от a до b (включительно). 10) Остаток Задание: Вводятся 4 числа: a, b, c и d. Выведите все числа на отрезке от a до b, дающие остаток c при делении на d. 11) Квадраты* Задание: Выведите все числа на отрезке от a до b, являющиеся полными квадратами. 12) Делители числа Задание: Выведите все натуральные делители числа x в порядке возрастания (включая 1 и само число). 13) Число делителей Задание: Подсчитайте количество натуральных делителей числа x (включая 1 и само число; x <= 30000). 14) Подсчет чисел Задание: Подсчитайте, сколько среди данных N чисел нулей, положительных чисел, отрицательных чисел. Вводится число N, а затем N чисел. Необходимо вывести сначала число нулей, затем число положительных и отрицательных чисел. 15) Число решений*(К) Задание: Вводятся 5 чисел: a, b, c, d и e. Найдите все целые решения уравнения (ax3 + bx2 + cx + d) / (x - e) = 0 на отрезке [0,1000] и выведите их количество. 16) Двоичный логарифм* Задание: По данному натуральному числу N выведите такое наименьшее целое число k, что 2k≥N. 17) Пробежка* Задание: В первый день спортсмен пробежал x километров, а затем он каждый день увеличивал пробег на 10% от предыдущего значения. По данному числу y определите номер дня, на который пробег спортсмена составит не менее y километров. Программа получает на вход действительные числа x и y и должна вывести одно натуральное число. 18) Числа Фибоначчи* Задание: По данному числу n определите n-е число Фибоначчи φn. 19) Номер числа Фибоначчи* Задание: Дано натуральное число A. Определите, каким по счету числом Фибоначчи оно является, то есть выведите такое число n, что φn=A. Если А не является числом Фибоначчи, выведите число -1. 20) Раздвоитель** Задание: Исполнитель “Раздвоитель” преобразует натуральные числа. У него есть две команды: “Вычесть 1” и “Разделить на 2”, первая команда уменьшает число на 1, вторая команда уменьшает число в два раза, если оно чётное, иначе происходит ошибка. Дано два натуральных числа A и B (A>B). Напишите алгоритм для Развоителя, который преобразует число A в число B и при этом содержит минимальное число команд. Команды алгоритма нужно выводить по одной в строке, первая команда обозначается, как -1, вторая команда как :2. 21) Среднее значение последовательности* Задание: Определите среднее арифметическое элементов последовательности, завершающейся числом 0. Число 0 в последовательность не входит. Числа, следующие за нулем, считывать не нужно. 22) Второй максимум* Задание: Последовательность состоит из различных натуральных чисел и завершается числом 0. Определите значение второго по величине элемента в этой последовательности. Числа, следующие за числом 0, считывать не нужно. 23) Максимальное число идущих подряд равных элементов* Задание: Дана последовательность натуральных чисел, завершающаяся числом 0. Определите, какое наибольшее число подряд идущих элементов этой последовательности равных друг другу. Числа, следующие за числом 0, считывать не нужно. 24) Число локальных максимумов** Задание: Элемент последовательности называется локальным максимумом, если он строго больше предыдущего и последующего элемента последовательности. Первый и последний элемент последовательности не являются локальными максимумами. Дана последовательность натуральных чисел, завершающаяся числом 0. Определите количество строгих локальных максимумов в этой последовательности. Числа, следующие за числом 0, считывать не нужно. 25) Наименьшее расстояние между локальными максимумами** Задание: Определите наименьшее расстояние между двумя локальными максимумами последовательности натуральных чисел, завершающейся числом 0. Если в последовательности нет двух локальных максимумов, выведите число 0. 26) Сумма цифр* Задание: Дано натуральное число N. Напишите функцию int SumOfDigits (int n) (C/C), вычисляющую сумму цифр числа N. 27) Число нулей* Задание: Дано натуральное число N. Напишите функцию int NumberOfZeroes(int n) (C/C++), определяющую количество нулей среди всех цифр числа N. 28) Наибольшая и наименьшая цифры* Задание: Дано натуральное число N. Напишите функцию int MinDigit (int n) (C/C++), определяющую наименьшую и наибольшую цифры данного числа. 29) Двоичная запись - 1* Задание: Дано натуральное число N. Выведите его представление в двоичном виде в обратном порядке. 30) Двоичная запись - 2**(К) Задание: Дано натуральное число N. Выведите его представление в двоичном виде в нормальном порядке. 31) Обратная запись** Задание: Напишите функцию int reverse(int n) (C/C++), которая переставляет цифры числа в обратном порядке. 3. Типы данных 1) IP-адрес** Задание: Напишите программу, которая определяет, является ли заданная строка правильным IP-адресом. 2) Две одинаковые буквы** Задание: Дана строка. Известно, что она содержит ровно две одинаковые буквы. Найдите эти буквы. 3) Обмен значений*(К) Задание: Напишите функцию bool IsDigit(unsigned char определяющую, является ли данный символ цифрой или нет. c) (C/C++), 4) Удали пробелы Задание: Дана строка, Вам требуется преобразовать все идущие подряд пробелы в один. 5) Двоичный перевод** Задание: написать программу, которая заменяет все встречающиеся в тексте числа на эти же числа, но в двоичной системе счисления. Разбор: Пробежим по строке, когда встречаем цифру, запоминаем начало, бежим до тех пор, пока не встретим знак, запомнив последнюю цифру. После этого преобразовываем, полученный промежуток, между двумя запомненными переделываем в двоичную систему и выводим, если когда мы бежим, встречаем не цифру, то просто выводим и бежим дальше. 6) Количество слов* Задание: Дана строка, содержащая пробелы. Найдите, сколько в ней слов (слово – это последовательность непробельных символов, слова разделены одним пробелом, первый и последний символ строки – не пробел). 7) Регистр Задание: Измените регистр символа, если он был латинской буквой: сделайте его заглавным, если он был строчной буквой и наоборот. Для этого напишите отдельную функцию, меняющую регистр символа. 8) Шифр**(К) Задание: Юлий Цезарь использовал свой способ шифрования текста. Каждая буква заменялась на следующую по алфавиту через K позиций по кругу. Необходимо по заданной шифровке определить исходный текст. 9) Точки плоскости** Задание: Программа получает на вход набор точек на плоскости. Сначала задано количество точек n, затем идет последовательность из n строк, каждая из которых содержит два числа: координаты точки. Величина n не превосходит 100, все исходные координаты – целые числа, не превосходящие 103. Выведите координаты точки, наиболее удаленной от начала координат. Создайте структуру Point и сохраните исходные данные в массиве структур Point. 10) Сортировка точек** Задание: Программа получает на вход набор точек на плоскости. Сначала задано количество точек n, затем идет последовательность из n строк, каждая из которых содержит два числа: координаты точки. Величина n не превосходит 100, все исходные координаты – целые числа, не превосходящие 103. Необходимо вывести все исходные точки в порядке возрастания их расстояний от начала координат. Программа выводит только координаты точек, их количество выводить не надо. Создайте структуру Point и сохраните исходные данные в массиве структур Point. Разбор: Создадим структуру point в которой объявим два открытых переменных целого типа х, у. Теперь объявим массив a типом point в которой мы будем хранить координаты точек. В a[i].x мы будем хранить координаты абсцисса точки i, а в a[i].y координаты ордината точки i. Теперь сделаем сортировку пузырьком таким образом: Пробежим циклом for с 2 до n c счетчиком i. Внутри этого цикла создадим еще один цикл с n до i с счетчиком j. Внутри второго цила мы будем проверять если ((a[j-1].x * a[j-1].x + a[j-1].y * a[j1].y) > ( a[j].x * a[j].x + a[j].y*a[j].y)) то меняем значениями a[j-1] <-> a[j]. После этих циклов мы выводим массив а как во входных данных. 11) Учащиеся без троек**(К) Задание: Заданы сначала количество учащихся n, затем n строк, каждая из которых содержит фамилию, имя и три числа (оценки по трем предметам: математике, физике, информатике). Данные в строке разделены одним пробелом. Оценки принимают значение от 1 до 5. Выведите фамилии и имена учащихся, не имеющих троек (а также двоек и колов). Необходимо вывести пары фамилия-имя по одной на строке, разделяя фамилию и имя одним пробелом. Выводить оценки не нужно. Порядок вывода должен быть таким же, как в исходных данных. 12) Обмен значений** Задание: Входные данные аналогичны задаче 4.11. Выведите фамилии и имена учащихся в порядке убывания их среднего балла. 13) Максимальная площадь** Задание: Среди исходных точек найдите три, образующие треугольник максимальной площади. Выведите данную площадь. Создайте структуру Point и сохраните исходные данные в массиве структур Point. 14) Максимальный периметр** (К) Задание: Среди исходных точек найдите три, образующие треугольник с максимальным периметром. Выведите данный периметр. Создайте структуру Point и сохраните исходные данные в массиве структур Point. 15) Личные дела*** Задание: Однажды, неловкая секретарша перепутала личные дела учащихся. Теперь их снова необходимо упорядочить сначала по классам, а внутри класса по фамилиям. В первой строке дано число N (1 ≤ N ≤ 1000) – количество личных дел. Далее для каждого из N учащихся следующие данные (каждое в своей строке): фамилия и имя, класс, дата рождения. Фамилия и имя – строки не более чем из 20 символов, класс – строка состоящая из числа (от 1 до 11) и латинской буквы (от "A" до "Z" ), дата рождения – дата в формате "ДД.ММ.ГГ" . Гарантируется, что внутри одного класса нет однофамильцев. В выходной файл требуется вывести N строк, в каждой из которых записаны данные по одному учащемуся. Строки должны быть упорядочены сначала по классам, а затем по фамилиям. Литература : 1. Г.Шилдт – Базовый курс по С++