06
Марафон задач по С++. День 3.
Категория: Школа Программирования Автор: Семён Давыдов Опубликовано: 06-04-2012
Метки: Курсы, программирование, С++
Евклид 2500 лет назад в своем труде «Начала» изложил разницу между ссылкой и указателем. С++ – язык вне моды и времени.
Финальный забег. Завершающий третий день марафона.
Гарантирую, сегодня придется попотеть. Напомню, что награда победителю марафона – скидка 50% на действительно полезный курс С++. Управление памятью.
Кстати, поскольку разбора задачек еще нет, вновь присоединившиеся могут присылать задачки из первых двух марафонов.
Крайний срок сдачи всего – 21:00, суббота. Решения присылать на почту c.davydov.prog@gmail.com.
Онлайн рейтинг участников тут.
В теме письма: Имя Фамилия – Марафон С++ – День <1-2-3>
Если создаете проект в Visual Studio, то выбирайте «Empty project» и пишите с чистого листа, чтобы исключить нестандартные вещи, вроде stdafx.h и tmain. На компьютере, который окажется у меня под рукой в момент проверки, скорее всего нет Windows.
День 3.
1. Два в одном.
Какой-то умник поменял местами кнопки в лифте. Поставил вместо первого этажа второй, а вместо второго – первый. Честное слово, мне лень ковырять кнопки. Я лучше перепрограммирую лифт. Но программировать мне тоже лень. На вас вся надежда. Напишите, пожалуйста, функцию-переключатель, которая возвращает 1, если на входе 2 и 2, если на входе 1.
2. Горе от копирования.
Решил я как-то разобраться с тем, как работает копирующий конструктор и оператор =.
Написал такую программу:
#include <iostream> class Trouble { public: Trouble() : data(0) {} Trouble(const Trouble& other) { std::cout << "Copy constructor called\n"; *this = other; } Trouble operator = (const Trouble& other) { std::cout << "= operator called\n"; data = other.data; return *this; } public: void SetData(const int value) { data = value; } int GetData() { return data; } private: int data; }; int main() { Trouble first; first.SetData(42); Trouble second(first); std::cout << "second.data " << second.GetData() << '\n'; return 0; }
Результаты превзошли все ожидания. Что произошло и как это исправить?
3. Выскочка
Есть массив чисел размера N, в котором хранятся целые числа 0 до N-1. Среди всех чисел есть какое-то одно, которое встречается как минимум два раза (возможно, больше). Найти это число за линейное время. Дополнительной памяти у нас совсем немного. Максимум на несколько переменных. Вход – размер массива, сам массив. Выход – число, которое повторяется.
Вход:
6
1 2 3 2 4 5
Выход:
2
«4 мая буду с вами!»
P.S. Объявление победителей и разбор задач состоится в понедельник 9 апреля.






В Школе Программирования с момента её основания главное внимание уделяется языкам программирования, широко используемым в веб-разработке. И это понятно. У многих людей довольно ясное представление, чему можно относительно быстро научиться и как применить полученные знания: забацать свой личный прикольный сайт, сделать интернет-магазин или другую интернет-систему для продвижения бизнеса, фрилансить, наконец. И эту несправедливость мы будем исправлять. Многие не обращают внимание на то, чем прямо или косвенно пользуется веб-разработчик и чему он обязан своей комфортной жизни в труде и отдыхе: текстовые редакторы для написания кода, компиляторы и интерпретаторы и вообще среды разработки, СУБД, браузеры, наконец офисные программы, медиа-проигрыватели, игры и прочие настольные приложения. Надо не забыть системное и особенно серверное программное обеспечение, поддерживающее такую кипящую жизнь во всемирной сети: операционные системы, менеджеры системных ресурсов, веб-сервисы, веб-серверы, поисковые движки и прочее. Кто всё это пишет и на каких языках? Ясно, что не на PHP. И хотя, отвечая на этот вопрос, можно перечислить много различных языков, речь у нас пойдёт о С++.

