Архив рубрики: Задачи по программированию на C++. Практика программирования.

В этой категории собраны все опубликованные статьи, которые содержат задачи по программированию на языке C++. Что примечательно – ко всем задачам прилагается наш вариант решения с комментариями.

Задача: Палиндром в массиве

Проверить число в массиве на наличие палиндрома (именно через массив).

задача с решением, палиндром, наличие палиндрома в массиве с++, число палиндром, практика программирования
Определение Палиндром – сайт Википедия

Решение:

Единственное место, которое в коде может вызвать затруднение, это логическое присвоение:

Здесь проверяется равенство символов, отстоящих на i позиций от начала и от конца исследуемой строки. Если результат отрицательный (не равно), то это уже не палиндром, и можно выходить из цикла, а дальнейшие сравнения не проводить. Переменная poli здесь не является необходимой, и оставлена для наглядности – можно принимать решение (if) прямо из проверяемого условия.

Проверки делаются до середины строки, потому что дальнейшее продолжение цикла (из-за симметрии условия) только повторит то, что уже сделано ранее.

Выполнение:

задача с решением, палиндром, наличие палиндрома в массиве с++, число палиндром, практика программированияПримечание:

Как легко смогут заметить наблюдательные читатели, этот код проверит на палиндром не только запись числа, но и любую текстовую строку, при выполнении таких условий:

  • строка содержит только латинские (не русские, не китайские, …) литеры (интернациональные литеры в Unicode представляются более чем 1-м байтом);
  • строка не содержит символов пробела и знаков препинания (потому что в определениях палиндромов эти символы, обычно, исключают из сравнений: “Я иду с мечем судия“, “На в лоб, болван“).

Рассылка новых уроков по программированию:

Задача: Класс “Геометрическая прогрессия”

Классы С++ могут создаваться для описания самых неожиданных сущностей реального мира. Создайте класс «геометрическая прогрессия», объекты которого:

  • отображали бы геометрическую прогрессию с заданным начальным членом и знаменателем;
  • по индексации позволяли получить значения члена прогрессии с любым порядковым номером;
  • позволяли получить сумму начальных N-членов прогрессии;

Дополните класс, возможно, другими полезными свойствами.

Решение:

Можно было бы, конечно, в качестве класса геометрической прогрессии хранить нужное число начальных членов ряда. Но это а). крайне расточительно и б). при таком представлении непонятно, какое число членов ряда хранить? Показанное же решение компактное и эффективное:

Особенностью решения является то, что при выполнении операции индексации (извлечения члена прогрессии) делается быстрое рекурсивное (алгоритм Хоара) возведение в степень знаменателя.

Параметром командной строки можно переопределить длину тестового массива, куда переписываются члены прогрессии:

Рассылка новых уроков по программированию:

Задача: Дописать единицу к числу

С клавиатуры вводится натуральное число, к десятичной записи которого добавляется в начало и в конец цифра 1 (например: 478->14781). В итоге определить, простое ли это число?

Решение:

Результат:

задачи с решением с++, c++ для начинающих

Рассылка новых уроков по программированию:

задачи и решения с++, практика программирования

Задачи и решения: Указатель на указатель

1) Создать двумерный массив 5х5, заполнить его случайными числами от 10 до 99 и вывести на экран. Поменять местами максимальный элемент каждой строки с первым элементом в соответствующей строке. Задачу решить с помощью указателей.


2) Задача на умножение матриц. Пользователь произвольно задает размерность двух матриц и заполняет значениями вручную. Не забывайте, что необходимо выделить соответствующие участки памяти для матриц, которые будет заполнять пользователь и для третьей итоговой матрицы. Далее отобразите на экране обе заполненные матрицы и итоговую матрицу (их воспроизведение).

Возможно кто-то не знает, как умножать матрицы. Посмотрите это короткое видео (автор: Приходовский М.А.)


Чтобы поддержать наш сайт – нажмите на копилку и выберите любой удобный для Вас способ.

Рассылка новых уроков по программированию:

Задача: заполнение строки словом

Есть некоторая строка (слово, число), например “home”. Необходимо заполнить этим словом строку (последовательно буквами этого слова) за определённое количество итераций.

Например: базовая строка – “home”, требуемое число символов результата 11, результат: “homehomehom”

В этой задаче главным требованием должно быть: сделать это как можно больше разными способами! (задача то сама по себе совсем элементарная).

Решения:

Вот как это будет выглядеть при исполнении:

задача и решение, с++, практика программирования

Здесь показано несколько (5) вариантов решения для базовой строки в формате std::string. Но ещё много интересных вариантов может быть записано для строки в формате char[] (такой код будет даже проще для понимания).

P.S. В таком случае ваши функции вариантов (если вы хотите сохранить массив функций-обработчиков) могут иметь прототип:

Предлагайте следующие варианты!

Рассылка новых уроков по программированию:

Задача: подсчёт цифр

Вводится целое число. Подсчитайте программно сколько раз в его десятичную запись входит некоторая цифра, скажем 3. Вот и всё условие. Например: 123 -> 1; 54321345 -> 2; 3333 -> 4 и т.д.

Задача очень простая … на уровне средней школы. Но для того, чтобы задачу сделать не совсем уж тривиальной – усложним:
– предложите несколько (как можно больше) разных способов реализации;
– для каждой реализации сократите запись кода так, чтобы он был, как можно более кратким.

Решения (из-за простоты задачи есть где развернуться, решений может быть очень много, дополняйте своими):

Здесь всё решение укладывается в один оператор do … while. Но, обратим внимание на то, что “вводится целое число” – это ввод всегда строки, представляющей число (здесь подвох в формулировке задачи). Тогда:

Или так:

Или даже так:

И вот как это выглядит:

P.S. Эта задача является хорошей иллюстрацией того основополагающего принципа программирования, что любая поставленная задача может быть решена многими и очень разными способами.

Рассылка новых уроков по программированию:

Задача: гипотеза Коллатца

Гипотеза Коллатца – это одна из нерешённых проблем в математике с 1937 года (Гипотеза Коллатца, Collatz conjecture), которую математики не могут ни доказать, ни опровергнуть. Гипотеза состоит в том, для любого натурального числа n>1 последовательное применение функции:

– приведёт к числовому ряду, который, в конечном итоге (рано или поздно) приведёт к числу 1 (то есть, на каждом шаге преобразований для чётных значений следующим шагом вычисляется n/2, а для нечетных – 3n+1). Например, для n=3 это будет ряд преобразований: 3,10,5,16,8,4,2,1. Для некоторых n эта последовательность чисел будет весьма короткой, но для некоторых – очень длинной…

Наше задание не в том, чтобы решить задачу, которую все математики мира не могут решить 80 лет, а в том, чтобы для любого n построить цепочку числовых для такого преобразования (то, что математики называют: чи́сла-гра́дины).

Конечно, как и раньше, одним из критериев качества решения будет: код должен быть записан как можно короче.

Решение.

Как это выполняется:

задача и решение, гипотеза коллатца, с++, практика программирования

Рассылка новых уроков по программированию:

Решение задач под заказ

решение задач под заказ, c++, помощь в решении задач на с++Предлагаем помощь в решении задач по программированию на языках С и С++ за умеренную плату (минимум 300 руб. / 100 грн.) Условие задачи отправляйте нам заранее (за 2-3 дня до желаемой даты получения результата) используя форму ниже или по адресу admin@purecodecpp.com. Мы свяжемся с вами и обговорим детали.

Сотрудничающие с нами специалисты, берутся выполнять задачу или программную работу любой без исключения сложности. Стоимость работы определяется только её трудоёмкостью (временем, которое нужно затратить на подготовку кода, отладку и тестирование задачи).

Наши специалисты не только подготовят программный код решения, но и подготовят для него тестовые данные, проведут отладку и предоставят результаты тестирования кода. Все решения задач проверяются исполнением.

Если у вас возникнут сложности с компиляцией и настройкой программы, наши коллеги могут подключиться к вашему компьютеру средствами удалённой работы (ssh, putty, TeamViewer, Mikogo и др.) и в режиме удалённого управления настроить и продемонстрировать непосредственно на вашем домашнем компьютере.

В зависимости от сложности, оплата за выполненную работу производится либо после предоставления предварительных результатов её выполнения (работающие первоначальные варианты, черновики выполнения, …), либо с частичной предоплатой. По предоставленным решениям мы обязуемся выполнить все требуемые последующие разъяснения и консультации без дополнительных плат.

Ваше имя (обязательно)

Ваш e-mail (обязательно)

Ссылка на вашу страницу ВКонтакте или Имя в Skype

Сколько готовы заплатить за решение:

Условие задачи:

Дата выполнения:

Способы оплаты за решенные задачи

Задача: Ханойская башня




задача и решение, ханойская башня с++Из разделов чистой математики (не углубляясь в деталях) известно, что в форме рекурсивной формулировки может быть выражен любой вычислимый алгоритм. Одной из самых любопытных иллюстраций возможностей и мощи рекурсивных вычислений является задача Ханойская башня.

Утверждается, что эту задачу сформулировали и решают до сих пор монахи каких-то из монастырей Тибета. Задача состоит в том, чтобы пирамидку из колец (на манер детской игрушки), нанизанную на один из 3-х стержней, перенести на другой такой же стержень, придерживаясь строгих правил:

  • пирамидка состоит из N колец разного размера, уложенных по убыванию диаметра колец один на другой;
  • перекладывать за одну операцию можно только одно кольцо с любого штыря на любой …
  • но только при условии, что класть можно только меньшее кольцо сверху на большее, но никак не наоборот;
  • нужно, в итоге, всю исходную пирамидку, лежащую на штыре №1, переместить на штырь №3, используя штырь №2 как промежуточный.

Например, для 2-х колец результат получается такой вот последовательностью перекладываний: 1 => 2 , 1 => 3 , 2 => 3

По преданию, эту задачу по перекладыванию N=10 колечек, решают тибетские монахи, и когда они её, наконец, решат, тогда и наступит конец света … Армагедон, в нашей западной нотации.

Для особо желающих поупражняться, тут же формулируем задачу №2: попробуйте решить эту задачу не рекурсивными методами (это очень непростое занятие)!

А теперь запишем решение задачи:




Решение здесь (если его таковым можно назвать) состоит в том, чтобы при необходимости переноса пирамиды из n колец с штыря с номером from на штырь с номером to последовательно сделать следующее:

  • перенести (каким-то образом) меньшую пирамиду из n-1 колец временно на штырь с номером temp, чтобы не мешала…
  • перенести оставшееся единственное нижнее (наибольшее) кольцо на результирующий штырь с номером to
  • после чего, точно так же как в первом пункте, водрузить пирамиду (n-1 колец) с номера temp поверх этого наибольшего кольца на штырь с номером to.

Здесь важно то, что мы не знаем каким образом, и не умеем выполнить 1-й и 3-й пункт нашей программы, но надеемся, что он будет рекурсивно раскручиваться по аналогии, по тому же алгоритму, но для меньшего числа n-1 (основополагающий принцип рекурсии)… пока n не станет равным 1 – а там уже совсем просто.

И вот как разворачивается решение для различных N:

Можете выполнить эту программу для N=10 (только не спровоцируйте тем конец света!) и убедиться, что число перестановок для этого потребуется 1023. И вообще, для любого N число перестановок будет 2**(N – 1), что представляет собой очень высокую степень роста вычислительной сложности задачи — экспоненциальную.

Рассылка новых уроков по программированию:

Задача: Построение периодической дроби

Условие:
Есть (вводится с терминала) правильная рациональная дробь a / b (запись в виде простой дроби).
– a и b – целые числа;
– если дробь правильная, то a < b.

Нужно программно определить период периодической дроби и вывести её в формате с десятичной точкой, вида 0.12(34) (из курса школьной арифметики помним, что это 0.12343434… – бесконечная дробь).

Усложняем задачу тем, том, что система счисления записи бесконечной дроби может быть произвольной и выбирается случайно (при вводе данных).

Например, в 10-тичной системе мы должны получить:
1 / 12 = 0.08(3)
11 / 13 = 0.8(461538)
2 / 5 = 0.4
А в 2-ичной системе, соответственно:
17 / 47 = 0.(01011100100110001000001)

Это 1-я задача. А после решения этой первой задачи, ставим себе задачу 2: переделать программу так, чтобы на каждом шаге (определения цифры) не делать полный поиск уже встречавшихся ранее остатков…

Решение:

Прежде всего, вспомним как рациональная дробь (1/3) преобразовывается в бесконечную (0.3333… или 0.(3)) – это можно подробно почитать здесь – Обращение обыкновенных дробей в десятичные и обратно:

  • В цикле находим частное и остаток от деления числителя на знаменатель.
  • Частное – это очередная цифра в бесконечной записи. Сохраняем остатки на каждом шаге.
  • Умножаем остаток на основание системы счисления – это у нас будет числитель для следующегошага итерации.
  • Если остаток на каком-то шаге равен нулю, то дробь – конечная.
  • Иначе ищем остаток в числе ранее сохранённых. Если нашли, то мы нашли период (дальше всё будет периодически повторяться).
  • Если не нашли, то сохраняем текущий остаток и возвращаемся к вычислению следующего разряда.

Собственно, этого достаточно, чтобы записать решение задачи 1 (с поиском сохранённых остатков):

Как легко видеть, весь алгоритм начинается со строки 39 и занимает всего 12 строк – всё остальное это ввод и подготовка данных:

(Внутренняя механика происходящего не совсем очевидная, поэтому предусмотрен режим диагностического вывода – если запускать программу с любым параметром)

И теперь мы видим, что на каждом шаге нам нужно искать полученный остаток в массиве (векторе) на совпадение с ранее полученными. Это расточительно. Зная, как работает алгоритм, можно пойти на такой трюк:

  • для знаменателя N остаток может иметь только N значений 0…N-1
  • создадим массив из N элементов, и разметим его значением -1, которое означает “такое значение остатка ещё не встречалось”…
  • а вот если на очередном шаге мы получим значение M, то в элемент [M] массива запишем номер итерации, на котором было это значение…
  • теперь, если после очередного шага, мы получим значение K, то нам не нужно искать это значение во всём массиве, а нужно только проверить элемент [K] массива на его положительность.

И вот что из этого получается:

Рассылка новых уроков по программированию: