Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 2744, средняя оценка - 4.89
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
#1

Задачи для тренировки и лучшего понимания - C++

15.07.2010, 05:53. Просмотров 341699. Ответов 1272
Метки нет (Все метки)

Ребят. Кто-нибудь может дать задачу для тренировки? Приблизительно по всему курсу С++. Буду благодарен за сложную задачу, но которую способен сделать новичок-любитель. Затраты сил-времени не важно. Главное, чтобы это было интересно и не слишком рутинно. + Если найдется человек который даст задачу просьба помогать с кодом, который я буду себя скидывать. Не переписывать за меня, но указывать на ошибки и желательно объяснять. Заранее спасибо.

Список задач, решение которых присутствует в данной теме:
Лучшие ответы (59)
Сообщение: #857841 Сообщение: #857861 Сообщение: #858352 Сообщение: #859371 Сообщение: #860160 Сообщение: #860255 Сообщение: #860259 Сообщение: #860317 Сообщение: #860368 Сообщение: #860466 Сообщение: #860508 Сообщение: #860720 Сообщение: #861091 Сообщение: #862174 Сообщение: #862617 Сообщение: #867259 Сообщение: #870298 Сообщение: #872053 Сообщение: #876456 Сообщение: #880114 Сообщение: #882889 Сообщение: #884418 Сообщение: #886414 Сообщение: #886989 Сообщение: #887733 Сообщение: #888464 Сообщение: #888487 Сообщение: #888941 Сообщение: #888947 Сообщение: #889040 Сообщение: #889450 Сообщение: #889587 Сообщение: #891772 Сообщение: #891790 Сообщение: #891862 Сообщение: #897758 Сообщение: #897782 Сообщение: #906325 Сообщение: #907991 Сообщение: #943672 Сообщение: #943700 Сообщение: #967735 Сообщение: #1053777 Сообщение: #1054209 Сообщение: #1083853 Сообщение: #1083928 Сообщение: #1131058 Сообщение: #1131359 Сообщение: #1273743 Сообщение: #1275465 Сообщение: #1276743 Сообщение: #1279215 Сообщение: #1282583 Сообщение: #1309088 Сообщение: #1315633 Сообщение: #1366395 Сообщение: #1550164 Сообщение: #1603678 Сообщение: #1604364
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2010, 05:53     Задачи для тренировки и лучшего понимания
Посмотрите здесь:
C++ Элементарные программы, для лучшего понимания языка...
Нужны задачи для тренировки C++
Нужны задачи для тренировки C++
C++ Нужны простые задачи для тренировки
C++ Какая база требуется для понимания C++?
C++ Builder Прошу примеров для понимания INDY
C++ Нужен пример рекурсивной функции для понимания ее назначения и практической пользы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
27.02.2011, 21:54     Задачи для тренировки и лучшего понимания #1221
Цитата Сообщение от delete1991 Посмотреть сообщение
a=b+0;
b=a+0;
После выполнения этих строк и a и b будут равны b.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
20.03.2011, 05:59  [ТС]     Задачи для тренировки и лучшего понимания #1222
Для тех кто не читал Саттера - будет интересно.
Кто читал - итак знает.

Является данный код корректным с точки зрения гарантии безопасности исключений?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <memory>
 
template<class T, class T1>
void f(std::auto_ptr<T> one, std::auto_ptr<T1> sec)
{
    //Некий код, не имеющий отношения к делу.
}
 
int main()
{
    f(std::auto_ptr<int>(new int), std::auto_ptr<double>(new double));
}
Если да - почему?
Если нет - почему и как сделать, чтобы являлся?
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.03.2011, 14:01     Задачи для тренировки и лучшего понимания #1223
ForEveR
Не является. В точке вызова f возможна утечка памяти. Первыми будут выполнены операторы выделения памяти (порядок выполнения никак не оговаривается) и если первый выполнится удачно, а второй вызовет исключение, то будем иметь утечку.
Решение:
C++
1
2
3
4
std::auto_ptr<int>    one   (new int);
std::auto_ptr<double> second(new double);
 
f(one, second);
Evg
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,683
Записей в блоге: 26
20.03.2011, 16:37     Задачи для тренировки и лучшего понимания #1224
CyBOSSeR
По-моему в вопросе про другое спрашивалось. А то, о чём писал ты, оно будет точно такой же проблемой как и в варианте без auto_ptr (т.е. просто с new)
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.03.2011, 18:41     Задачи для тренировки и лучшего понимания #1225
Evg
Да, но в данном случае auto_ptr имеются и благодаря им проблему можно решить и сделать код безопасным относительно исключений, что и показано в коде решения.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
20.03.2011, 20:19  [ТС]     Задачи для тренировки и лучшего понимания #1226
2Evg
Evg, Нет. Он прав.


2CyBOSSeR
CyBOSSeR, Да. Именно так. Но подозреваю дичайше, что ты читал Саттера)


Добавлено через 4 минуты
Еще задачка. Строго желательно решать без компиля, иначе все сразу видно. Собственно на знание стандарта и/или Саттера.
Достаточно для работы программы так обработать исключение?
Другими словами, может-ли конструктор "поглотить" выброшенное исключение?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
 
struct A
{
    A()
    {
        throw std::exception("A() exception");
    }
};
 
struct B
{
    B()
    {
        throw std::exception("B() exception");
    }
};
 
struct C:private A
{
    C()
    try:A(), b_()
    {
    }
    catch(const std::exception& e)
    {
        std::cerr<<e.what()<<'\n';
    }
private:
    B b_;
};
 
int main()
{
    C c;
}
Ma3a
Эксперт C++
616 / 460 / 31
Регистрация: 28.01.2011
Сообщений: 605
20.03.2011, 21:03     Задачи для тренировки и лучшего понимания #1227
ForEveR
ForEveR, могу ошибаться, но по-моему в стандарте оговорено, что даже если в конструкторе отловлено исключение, то оно обязано быть выброшенным повторно, так что если не поставить дополнительное try {} catch(){} в main'е, то повторно выброшенное исключение от A даст ошибку. Так что такой меры недостаточно.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
20.03.2011, 21:22  [ТС]     Задачи для тренировки и лучшего понимания #1228
Ma3a
Ma3a, Под кат спрячь. Может кто еще ответить захочет. А так да. Верно.


Добавлено через 13 минут
Напишите почти строго безопасный оператор копирующего присваивания для класса
C++
1
template<class T> class Some_class
.
Определение класса решите сами, какое будет.
Как минимум должно быть такое.

C++
1
2
3
4
5
6
7
8
template<class T> class Some_class//:зависит от реализации.
{
public:
   Some_class();
   Some_class& operator =(const Some_class& other);
private:
   //T arg; зависит от реализации
};
CyBOSSeR
20.03.2011, 21:57
  #1229

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Но подозреваю дичайше, что ты читал Саттера)
Неа, до Саттера руки не дошли, но вот до Майерса дотянулись.

Ma3a
Эксперт C++
616 / 460 / 31
Регистрация: 28.01.2011
Сообщений: 605
21.03.2011, 22:24     Задачи для тренировки и лучшего понимания #1230
ForEveR
Честно говоря,ничего более толкового в голову не пришло, кроме как сделать функцию-переходник, для которой запрещено выбрасывание исключений. вышло в самом грубом приближении так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
template <typename T> 
class Some_class
{
public:
   Some_class(T _arg = T());
   Some_class& operator =(Some_class const & other);
 
   void swap(Some_class & other) throw();
private:
   T arg;
};
 
template <typename T>
Some_class<T>::Some_class(T _arg)
    {
    arg = _arg;
    }
 
template <typename T>
void Some_class<T>::swap(Some_class<T> & other) throw()
    {
    T temp = other.arg;
    other.arg = this->arg;
    this->arg = temp;
    }
 
template <typename T>
Some_class<T> & Some_class<T>::operator=(Some_class const & other)
    {
    Some_class<T> temp(other);
 
    swap(temp);
 
    return *this;
    }
 
int main()
    {
    Some_class<int> A(10),B;
    B = A;
    }
Тогда вроде как удается избежать возможных проблем с исключениями, если "задавить" их таким ходом.


Добавлено через 23 часа 20 минут
Also 2ForEveR

Погорячился я с такой реализацией )
Вообще говоря, насколько я понимаю строго безопасную обработку исключений, при случае чего плохого, состояние объекта должно остаться неизменным, то есть в случае чего нужно откатить все изменения без порчи ссылок и прочего, я правильно понимаю?
Тогда если действовать в соответствии с таким принципом, то приходится извернуться со ссылками и накрутить нечто с std::auto_ptr, так как ни один его член не может выкинуть исключение и вообще семантика как раз располагает к пользованию безопасных указателей
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
template <typename T> 
class Some_class
    {
    public:
        Some_class();
        Some_class(Some_class<T> const & other);
        Some_class& operator =(Some_class const & other);
 
        void swap(Some_class & other) throw();
    private:
        std::auto_ptr<T> arg;
    };
 
template <typename T>
Some_class<T>::Some_class()
    : arg(new T())
    {
    }
 
template <typename T>
Some_class<T>::Some_class(Some_class<T> const & other)
    : arg(new T(*other.arg))
    {
    }
 
template <typename T>
void Some_class<T>::swap(Some_class<T> & other) throw()
    {
    std::auto_ptr<T> temp(arg);
    arg = other.arg;
    other.arg = temp;
    }
 
template <typename T>
Some_class<T> & Some_class<T>::operator=(Some_class const & other)
    {
    Some_class<T> temp(other);
 
    swap(temp);
 
    return *this;
    }
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
22.03.2011, 00:41  [ТС]     Задачи для тренировки и лучшего понимания #1231
2Ma3a
Ma3a, Да. Вполне вариант. По книжке Саттера предпочтительнее похожий, но несколько другой вариант.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
template<class T>
class SomeClass
{
public:
    SomeClass(T arg=0):impl_(new SomeClassImpl(arg))
    {
    }
    ~SomeClass()
    {
    }
    SomeClass(const SomeClass& other):impl_(new T(*other.impl_))
    {
    }
    SomeClass& operator =(const SomeClass& other)
    {
        SomeClass tmp(other);
        Swap(tmp);
        return *this;
    }
private:
    class SomeClassImpl;
    std::auto_ptr<SomeClassImpl> impl_;
    void Swap(SomeClass& other)
    {
        std::auto_ptr<SomeClassImpl> tmp(impl_);
        impl_=other.impl_;
        other.impl_=tmp;
    }
};
 
template<class T>
class SomeClass<T>::SomeClassImpl
{
public:
    SomeClassImpl(T arg_=0):arg(arg_)
    {
    }
    ~SomeClassImpl()
    {
    }
    SomeClassImpl(const SomeClassImpl& other):arg(other.arg)
    {
    }
    SomeClassImpl& operator =(const SomeClassImpl& other)
    {
        SomeClassImpl tmp(other);
        Swap(tmp);
        return *this;
    }
private:
    T arg;
    void Swap(SomeClassImpl& other)
    {
        std::swap(arg, other.arg);
    }
};
Ma3a
Эксперт C++
616 / 460 / 31
Регистрация: 28.01.2011
Сообщений: 605
22.03.2011, 23:04     Задачи для тренировки и лучшего понимания #1232
ForEveR
Хм, была такая мысль, но я посчитал, что инкапсулировать объект класса T в еще одной скрытой внутренней реализации для Some_class будет излишне, хотя паттерн конечно замечательный Саттера не читал, как-то не дошли руки до сих пор, но Майерса давно начинал читать, там было что-то похожее, надо будет наконец дочитать.
carlilenny
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 4
10.04.2011, 06:29     Задачи для тренировки и лучшего понимания #1233
привет всем.недавно зарегился на mipt пытаюсь решить задачу 201 почему-то не проходит мое решение оно я думаю n*ln(n).
Так ли это,если ошибаюсь объясните плиз,задача вроде легкая.
Хохол
Эксперт C++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
10.04.2011, 08:26     Задачи для тренировки и лучшего понимания #1234
Конечно, местные гуру способны оценить асимптотику твоего решения по одной лишь ауре твоего поста.
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
10.04.2011, 08:38     Задачи для тренировки и лучшего понимания #1235
Цитата Сообщение от carlilenny Посмотреть сообщение
привет всем.недавно зарегился на mipt пытаюсь решить задачу 201 почему-то не проходит мое решение оно я думаю n*ln(n).
Так ли это,если ошибаюсь объясните плиз,задача вроде легкая.
Моё решение. Но оно по time limit не проходит

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdlib.h>
#include <stdio.h>
 
#define SIZE 4
 
inline int is_decision(const int* const xs, const int n)
{
    int sum = 0;
 
    for (int i = 0; i < SIZE; i++)
        sum += xs[i] * (i + 1);
 
    return sum == n;
}
 
inline int max_value(const int* const xs, const int idx, int n)
{
    int sum = 0;
 
    for (int i = idx + 1; i < SIZE; i++)
        sum += xs[i] * (i + 1);
 
    n -= sum;
    return n / (idx + 1);
}
 
int calc(int n)
{
    int count, idx = 0, to = SIZE - 1;
    int xs[SIZE] = {0};
 
    count = !n;
 
    do
    {
        xs[0]++;
 
        for (int i = 0; i < to; i++)
            if (xs[i] > max_value(xs, i, n))
            {
                xs[i] = 0;
                xs[i + 1]++;
            }
 
        count += is_decision(xs, n);
    } while (xs[SIZE - 1] * SIZE <= n);
 
    return count;
}
 
int main(void)
{
    int n;
    scanf("%d", &n);
    printf("%d", calc(n));
    return 0;
}
Mr.X
Эксперт С++
3043 / 1688 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
10.04.2011, 10:40     Задачи для тренировки и лучшего понимания #1236
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/////////////////////////////////////////////////////////////////////////////////////////
//Найдите количество решений уравнения 
//x1 + 2x2 + 3x3+ 4x4= n,     где n и xi — неотрицательные целые числа.
//Вход: одна строка, содержащая число n < 1000. 
//Выход: одна строка, содержащая количество решений уравнения.
//ВХОД #1:
//3
//ВЫХОД #1:
//3
//
//ВХОД #2:
//10
//Выход #2:
//23
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
int  get_solutions_total_for(int  n)
{
    int  res = 0;
    for(int  dig_4 = 0; dig_4 <= n / 4; ++dig_4)
    {
        for(int  dig_3 = 0; dig_3 <= (n - 4 * dig_4) / 3; ++dig_3)
        {
            int  rem = n - 4 * dig_4 - 3 * dig_3;
            if(rem >= 0)
            {
                res += rem / 2 + 1;
            }            
        }    
    }
    return  res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    const int  MAX_N = 999;
    int  n = 0;
    do
    {
        std::cout << "Введите n < "
                  << MAX_N + 1 
                  << ": ";
 
        std::cin >> n;
    }while(MAX_N < n);
 
    std::cout << "Уравнение x1 + 2x2 + 3x3 + 4x4 = "
              << n
              << std::endl
              << "имеет "
              << get_solutions_total_for(n)
              << " решений."
              << std::endl;   
}
carlilenny
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 4
11.04.2011, 14:11     Задачи для тренировки и лучшего понимания #1237
снова mipt пытаюсь решить задачу 001
мой код не проходит 7 тест в чем проблема?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdlib.h>
#include<stdio.h>
#define x 2
#define EOF (-1)
int  a[x];
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main(void)
{
register int i=x;
while(i!=EOF)
{
scanf("%ld",&a[i]) ;
i--;
}
qsort (a, x, sizeof(int), compare);
printf("%ld",a[x-1]);
 
return 0;
}
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
11.04.2011, 14:16  [ТС]     Задачи для тренировки и лучшего понимания #1238
carlilenny,
C
1
#define x 2
???
carlilenny
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 4
11.04.2011, 14:20     Задачи для тренировки и лучшего понимания #1239
там типа #define x 10000
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2011, 16:04     Задачи для тренировки и лучшего понимания
Еще ссылки по теме:
C++ Киньте задачки для тренировки
Дайте задания для тренировки C++
Книги для тренировки/развития котелка и просто убийства времени C++
C++ Какой компилятор выбрать для лучшего изучения С++ по книге Берна Страуструпа?п
На соревнованиях по фигурному катанию оценки заносятся в компьютер. Составить программу для вывода на экран лучшего результата после каждого выступлен C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
11.04.2011, 16:04     Задачи для тренировки и лучшего понимания #1240
Mr.X, тесты оно прошло?

Цитата Сообщение от carlilenny Посмотреть сообщение
снова mipt пытаюсь решить задачу 001
мой код не проходит 7 тест в чем проблема?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdlib.h>
#include<stdio.h>
#define x 2
#define EOF (-1)
int  a[x];
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main(void)
{
register int i=x;
while(i!=EOF)
{
scanf("%ld",&a[i]) ;
i--;
}
qsort (a, x, sizeof(int), compare);
printf("%ld",a[x-1]);
 
return 0;
}
Штоэто за кусорт? Зачем?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <limits.h>
 
int main(void)
{
    int max = INT_MIN;
    int curr;
 
    while (scanf("%d", &curr) != EOF)
        max = curr > max ? curr : max;
    printf("%d", max);
    return 0;
}

А, вообще, мне кажется, как-то ну совсем не хорошо разбирать подобные задачи на форуме. Люди ж там типа соревнуются, а ты приходишь и выпрашиваешь готовые ответы.
Yandex
Объявления
11.04.2011, 16:04     Задачи для тренировки и лучшего понимания
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru