Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/2345: Рейтинг темы: голосов - 2345, средняя оценка - 4.54
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
1

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

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

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

Список задач, решение которых присутствует в данной теме:
44
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2010, 05:53
Ответы с готовыми решениями:

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

Задачи для тренировки и лучшего понимания языка
Предлагаю в этой теме размещать задачи, которые помогут новичкам (и не только) более детально...

Литература для лучшего понимания сути программирования
Привет! Подскажите литературу, которая поможет разобраться в сути самого процесса программирования,...

Набор задачь для тренировки и улучшения понимания программирования
Добрый вечер всем. Если кто знает модскажите где можно найти подобный набор задачь...

1272
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
27.02.2011, 21:54 1221
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от delete1991 Посмотреть сообщение
a=b+0;
b=a+0;
После выполнения этих строк и a и b будут равны b.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
Эксперт С++
2347 / 1720 / 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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
20.03.2011, 16:37 1224
CyBOSSeR
По-моему в вопросе про другое спрашивалось. А то, о чём писал ты, оно будет точно такой же проблемой как и в варианте без auto_ptr (т.е. просто с new)
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
20.03.2011, 18:41 1225
Evg
Да, но в данном случае auto_ptr имеются и благодаря им проблему можно решить и сделать код безопасным относительно исключений, что и показано в коде решения.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
20.03.2011, 21:03 1227
ForEveR
ForEveR, могу ошибаться, но по-моему в стандарте оговорено, что даже если в конструкторе отловлено исключение, то оно обязано быть выброшенным повторно, так что если не поставить дополнительное try {} catch(){} в main'е, то повторно выброшенное исключение от A даст ошибку. Так что такой меры недостаточно.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
Эксперт С++
623 / 467 / 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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
22.03.2011, 23:04 1232
ForEveR
Хм, была такая мысль, но я посчитал, что инкапсулировать объект класса T в еще одной скрытой внутренней реализации для Some_class будет излишне, хотя паттерн конечно замечательный Саттера не читал, как-то не дошли руки до сих пор, но Майерса давно начинал читать, там было что-то похожее, надо будет наконец дочитать.
1
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 4
10.04.2011, 06:29 1233
привет всем.недавно зарегился на mipt пытаюсь решить задачу 201 почему-то не проходит мое решение оно я думаю n*ln(n).
Так ли это,если ошибаюсь объясните плиз,задача вроде легкая.
0
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
10.04.2011, 08:26 1234
Конечно, местные гуру способны оценить асимптотику твоего решения по одной лишь ауре твоего поста.
0
Заблокирован
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
Эксперт С++
3225 / 1752 / 436
Регистрация: 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
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.04.2011, 14:16  [ТС] 1238
carlilenny,
C
1
#define x 2
???
0
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 4
11.04.2011, 14:20 1239
там типа #define x 10000
0
Заблокирован
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2011, 16:04
Помогаю со студенческими работами здесь

Проверить на правильность и закомментировать весь код для лучшего понимания
Всем здравствуйте. Условие задачи - Заданная матрица целых чисел размером (N, N). Найти среднее...

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

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

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


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

Или воспользуйтесь поиском по форуму:
1240
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru