Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Марафон задач по С++. День 3.



Марафон задач по С++. День 3.
2012-04-06 12:41 Семён Давыдов

Евклид 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&amp; other)
    {
        std::cout << "Copy constructor called\n";
        *this = other;
    }
 
    Trouble operator = (const Trouble&amp; other)
    {
        std::cout << "= operator called\n";
        data = Trouble.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 апреля.



Марафон задач по С++. День 3.
2012-04-06 12:41 Семён Давыдов

Евклид 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&amp; other)
    {
        std::cout << "Copy constructor called\n";
        *this = other;
    }
 
    Trouble operator = (const Trouble&amp; other)
    {
        std::cout << "= operator called\n";
        data = Trouble.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 апреля.



В избранное