Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/2010: Рейтинг темы: голосов - 2010, средняя оценка - 4.88
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
#1

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

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

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

Список задач, решение которых присутствует в данной теме:
43
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2010, 05:53
Ответы с готовыми решениями:

Прошу примеров для понимания INDY
Уважаемые коллеги и братья по интересу. Прошу примеров использования Indy UDP...

Ищу примеры для понимания взаимодействия Callback + event
Господа, подкиньте плиз какой-нибудь пример для понимания взаимодействия...

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

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

Нужны задачи для тренировки
Здравствуйте киньте пожалуйста задания по с++ для человека начинающего ...

1272
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
27.02.2011, 21:54 #1221
Цитата Сообщение от delete1991 Посмотреть сообщение
a=b+0;
b=a+0;
После выполнения этих строк и a и b будут равны b.
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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));
}
Если да - почему?
Если нет - почему и как сделать, чтобы являлся?
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 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);
1
Evg
Эксперт CАвтор FAQ
19134 / 6978 / 522
Регистрация: 30.03.2009
Сообщений: 19,628
Записей в блоге: 30
20.03.2011, 16:37 #1224
CyBOSSeR
По-моему в вопросе про другое спрашивалось. А то, о чём писал ты, оно будет точно такой же проблемой как и в варианте без auto_ptr (т.е. просто с new)
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
20.03.2011, 18:41 #1225
Evg
Да, но в данном случае auto_ptr имеются и благодаря им проблему можно решить и сделать код безопасным относительно исключений, что и показано в коде решения.
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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;
}
0
Ma3a
Эксперт С++
619 / 463 / 57
Регистрация: 28.01.2011
Сообщений: 605
20.03.2011, 21:03 #1227
ForEveR
ForEveR, могу ошибаться, но по-моему в стандарте оговорено, что даже если в конструкторе отловлено исключение, то оно обязано быть выброшенным повторно, так что если не поставить дополнительное try {} catch(){} в main'е, то повторно выброшенное исключение от A даст ошибку. Так что такой меры недостаточно.
1
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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; зависит от реализации
};
1
CyBOSSeR
20.03.2011, 21:57
  #1229

Не по теме:

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

1
Ma3a
Эксперт С++
619 / 463 / 57
Регистрация: 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;
    }
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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);
    }
};
0
Ma3a
Эксперт С++
619 / 463 / 57
Регистрация: 28.01.2011
Сообщений: 605
22.03.2011, 23:04 #1232
ForEveR
Хм, была такая мысль, но я посчитал, что инкапсулировать объект класса T в еще одной скрытой внутренней реализации для Some_class будет излишне, хотя паттерн конечно замечательный Саттера не читал, как-то не дошли руки до сих пор, но Майерса давно начинал читать, там было что-то похожее, надо будет наконец дочитать.
1
carlilenny
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 4
10.04.2011, 06:29 #1233
привет всем.недавно зарегился на mipt пытаюсь решить задачу 201 почему-то не проходит мое решение оно я думаю n*ln(n).
Так ли это,если ошибаюсь объясните плиз,задача вроде легкая.
0
Хохол
Эксперт С++
475 / 443 / 34
Регистрация: 20.11.2009
Сообщений: 1,292
10.04.2011, 08:26 #1234
Конечно, местные гуру способны оценить асимптотику твоего решения по одной лишь ауре твоего поста.
0
NightmareZ
1422 / 611 / 57
Регистрация: 31.03.2009
Сообщений: 1,978
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;
}
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 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;   
}
1
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;
}
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
11.04.2011, 14:16  [ТС] #1238
carlilenny,
C
1
#define x 2
???
0
carlilenny
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 4
11.04.2011, 14:20 #1239
там типа #define x 10000
0
NightmareZ
1422 / 611 / 57
Регистрация: 31.03.2009
Сообщений: 1,978
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;
}

А, вообще, мне кажется, как-то ну совсем не хорошо разбирать подобные задачи на форуме. Люди ж там типа соревнуются, а ты приходишь и выпрашиваешь готовые ответы.
0
11.04.2011, 16:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2011, 16:04

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

Какая база требуется для понимания C++?
Доброго времени суток! Возникло желание научиться работать в Си, но одолели...

Какую литературу для первоначального понимания С++ нужно учить
Что первоначальное для понимания нужно учить и от куда лучше вычитывать? ...


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

Или воспользуйтесь поиском по форуму:
1240
Закрытая тема Создать тему
Опции темы

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