Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/2010: Рейтинг темы: голосов - 2010, средняя оценка - 4.88
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
1

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

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

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

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

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

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

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

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

1272
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.01.2011, 18:27  [ТС] 1101
Пробежался на бумажке. Вроде все четко

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
#include <iostream>
#include <fstream>
 
int main()
{
        std::ifstream ifs("input.txt");
        std::ofstream ofs("output.txt");
        std::cin.rdbuf(ifs.rdbuf());
        std::cout.rdbuf(ofs.rdbuf());
        unsigned long long K; 
             int N;
        std::cin>>K>>N;
        unsigned long long res=K;
        for(int i=1; i<N; ++i)
        {
                unsigned long long To_five=K/5;
                unsigned long long To_three=0;
                if(To_five)
                        K-=5*To_five;
                if(K)
                {
                        while(K)
                        {
                                if(K%3 == 0)
                                {
                                        To_three+=K/3;
                                        K%=3;
                                        break;
                                }
                                if(To_five)
                                {
                                        K+=5;
                                        --To_five;
                                }
                        }
                }
                res+=To_three*5+To_five*9;
                K=res;
        }
        std::cout<<res<<'\n';
        return 0;
}
0
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
16.01.2011, 18:43 1102
ForEveR, Превышение времени на 5-ом тесте. Сейчас буду разбираться.

Добавлено через 3 минуты
ForEveR, Контрпример: 4 2
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.01.2011, 18:46  [ТС] 1103
valeriikozlov, АГа... Понято. Попробую исправить.
А кстати какой в нем должен быть ответ? Остаток 1 в любом случае будет в первом году
Посчитал на бумаге вышло 24...
Примерно таким макаром.

Смотрим кол-во 5-к - 0.
Смотрим делится ли на 3 без остатка - нет.
Смотрим есть ли 5-и - нет.
Делим на 3 - получаем 1. Итого в первый год изготовили 5 роботов. Итого 9 всего. 4 прошлых + 5 в этом году.

Смотрим кол-во 5-к - 1.
Смотрим делится ли полученный остаток (4) на 3 без остатка - нет.
Смотрим есть ли 5-и - да.
Прибавляем 5-у к кол-ву роботов - 9.
Уменьшаем кол-во пятерок - 0.
Смотрим делится ли на 3 - да.
9/3=3.
3*5.
9+15=24.

В расчетах мог ошибиться, но идея верна?
0
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
16.01.2011, 18:53 1104
ForEveR, Здесь вариант такой (чтобы максимальное кол-во получилось): одна тройка которая даст 5 новых. И в начале второго года всего будет 9.
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.01.2011, 18:57  [ТС] 1105
Считал для трех лет.. Для двух будет 9 по идее. Верно?

Добавлено через 45 секунд
Ясно. Вот код. ПРоверьте)

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
#include <iostream>
#include <fstream>
 
int main()
{
        std::ifstream ifs("input.txt");
        std::ofstream ofs("output.txt");
        std::cin.rdbuf(ifs.rdbuf());
        std::cout.rdbuf(ofs.rdbuf());
        unsigned long long K; 
             int N;
        std::cin>>K>>N;
        unsigned long long res=K;
        for(int i=1; i<N; ++i)
        {
                unsigned long long To_five=K/5;
                unsigned long long To_three=0;
                if(To_five)
                        K-=5*To_five;
                if(K)
                {
                        while(K)
                        {
                                if(K%3 == 0)
                                {
                                        To_three+=K/3;
                                        K%=3;
                                        break;
                                }
                                if(To_five)
                                {
                                        K+=5;
                                        --To_five;
                                }
                                else
                                {
                                    To_three+=K/3;
                                    break;
                                }
                        }
                }
                res+=To_three*5+To_five*9;
                K=res;
        }
        std::cout<<res<<'\n';
        return 0;
}
0
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
16.01.2011, 19:11 1106
ForEveR, неправильный ответ на 6-ом тесте, сейчас еще посмотрю.

Добавлено через 6 минут
ForEveR, Я только сейчас заметил: У Вас в коде вообще не учтено -
каждый робот живет ровно три года после сборки.
Тут мне кажется без массива или вектора не обойтись.

Добавлено через 19 секунд
ForEveR, Я только сейчас заметил: У Вас в коде вообще не учтено -
каждый робот живет ровно три года после сборки.
Тут мне кажется без массива или вектора не обойтись.
1
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.01.2011, 19:36  [ТС] 1107
valeriikozlov, Оу фак. А ведь и правда. Я это условие как-то тоже не заметил...

Добавлено через 22 минуты
Хм... А так?

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
#include <iostream>
#include <fstream>
#include <vector>
 
int main()
{
        std::vector<unsigned long long> vec;
        std::ifstream ifs("input.txt");
        std::ofstream ofs("output.txt");
        std::cin.rdbuf(ifs.rdbuf());
        std::cout.rdbuf(ofs.rdbuf());
        unsigned long long K; 
        int N;
        std::cin>>K>>N;
        unsigned long long res=K;
        vec.push_back(res);
        for(int i=1; i<N; ++i)
        {
                unsigned long long To_five=K/5;
                unsigned long long To_three=0;
                if(To_five)
                        K-=5*To_five;
                if(K)
                {
                        while(K)
                        {
                                if(K%3 == 0)
                                {
                                        To_three+=K/3;
                                        K%=3;
                                        break;
                                }
                                if(To_five)
                                {
                                        K+=5;
                                        --To_five;
                                }
                                else
                                {
                                    To_three+=K/3;
                                    break;
                                }
                        }
                }
                vec.push_back(To_three*5 + To_five* 9);
                res+=To_three*5+To_five*9;
                if(i >= 3)
                    res-=vec[i-3];
                K=res;
        }
        std::cout<<res<<'\n';
        return 0;
}
1
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
16.01.2011, 19:41 1108
ForEveR, Все тесты Ваш код прошел.
1
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.01.2011, 21:10  [ТС] 1109
Вопрос
valeriikozlov, По поводу задачи с планетами... Посидел - подумал.. На бумажке порисовал... Все вцелом понятно как делать (не факт, что в 5 секунд), но не могу вспомнить алгоритм для поиска путей в НЕ взвешенном графе... Название не подкините? Вроде бы поиск в ширину может подойти, но я не уверен
0
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
16.01.2011, 21:30 1110
ForEveR, Не помню название. Если имеете ввиду алгоритм для поиска всех путей, то по моему подойдет поиск в глубину. Но по опыту скажу, если искать все пути в графе для этой задачи, то по времени там не уложитесь.
1
2 / 2 / 0
Регистрация: 16.01.2011
Сообщений: 23
16.01.2011, 22:07 1111
ForEveR, у меня есть задачка, могу изложить? или не до неё сейчас?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.01.2011, 22:10  [ТС] 1112
DarK_Fifti'S, Если не обычная студ. лаба - то пожалуйста. Иначе - лучше в личку или создать отдельную тему на форуме
0
2 / 2 / 0
Регистрация: 16.01.2011
Сообщений: 23
16.01.2011, 22:24 1113
ForEveR, программка, мы её называли "устный счет". Программа последовательно выдает арифметические задачи(типа: а+(-,:,*)b, ) заданного уровня сложности, при получении от пользователя ответа выдает сообщения: "правильно", "не правильно". Количество задач задается заранее пользователем. В конце программы проводится подсчет результатов с учетом времени и количества правильных ответов и выставляется оценка.
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.01.2011, 23:34  [ТС] 1114
Полагаю имелось ввиду нечто вроде этого.
Не учтены дробные числа при делении.
Генерация рандомных отрицательных чисел.
Уровня 3, можно развить и под большее.

Но мне лень)

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
 
struct lev
{
    enum level {easy, middle, hard};
    static level inttolvl(int one)
    {
        if(one >= 0 && one < size)
            return level(one);
        else
            throw std::logic_error("There is no such level");
    }
    static int const size=3;
};
 
struct oper
{
    enum operations {add='+', sub='-', div='/', mul='*'};
    static operations chartoop(char one)
    {
        return operations(one);
    }
    static char optochar(operations one)
    {
        return char(one);
    }
};
 
struct minmax
{
    int max, min;
    minmax(int ma, int mi):max(ma), min(mi)
    {
    }
    minmax()
    {
    }
};
 
struct numbers
{
    int first, second;
    numbers(int f, int s):first(f), second(s)
    {
    }
    numbers()
    {
    }
};
 
minmax find_minmax(const lev::level& lvl)
{
    minmax mm;
    switch(lvl)
    {
        case lev::easy:
        {
            mm.max=10;
            mm.min=1;
        }
        break;
        case lev::middle:
        {
            mm.max=100;
            mm.min=10;
        }
        break;
        case lev::hard:
        {
            mm.max=1000;
            mm.min=100;
        }
        break;
    }
    return mm;
}
 
int return_result(const numbers& numbs, const oper::operations& op)
{
    int result=0;
    switch(op)
    {
    case oper::add:
        {
            result=numbs.first+numbs.second;
        }
        break;
    case oper::sub:
        {
            result=numbs.first-numbs.second;
        }
        break;
    case oper::mul:
        {
            result=numbs.first*numbs.second;
        }
        break;
    case oper::div:
        {
            if(numbs.second)
                result=numbs.first/numbs.second;
            else
                result=0;
        }
        break;
    }
    return result;
}
 
int main()
{
    srand(static_cast<unsigned>(time(0)));
    lev::level lvl;
    while(1)
    {
        int level;
        std::cout<<"Enter your level (0 - easy, 1 - middle, 2 - hard)\n";
        std::cin>>level;
        try
        {
            lvl=lev::inttolvl(level);
            break;
        }
        catch(const std::exception& e)
        {
            std::cout<<e.what()<<'\n';
        }
    }
    const std::string opers="+-*/";
    oper::operations op;
    minmax mm=find_minmax(lvl);
    numbers numbs;
    int numb_of_tryes=0;
    std::cout<<"Enter numb of tryes: ";
    std::cin>>numb_of_tryes;
    int good_ans=0, bad_ans=0;
    for(int i=0; i<numb_of_tryes; ++i)
    {
        numbs.first=mm.min+rand()%(mm.max-mm.min);
        numbs.second=mm.min+rand()%(mm.max-mm.min);
        op=oper::chartoop(opers[rand()%opers.size()]);
        int right_ans=return_result(numbs, op);
        int ans=0;
        std::cout<<numbs.first<<oper::optochar(op)<<numbs.second<<" = "<<"?\n";
        std::cin>>ans;
        if(ans == right_ans)
        {
            std::cout<<"Right!\n";
            good_ans++;
        }
        else
        {
            std::cout<<"Wrong\n";
            bad_ans++;
        }
    }
    std::cout<<"Quetions: "<< numb_of_tryes<<". Right answers: "<< good_ans
        <<". Bad answers: "<< bad_ans <<'\n';
    std::cout<<"Your note is: ";
    double procents=good_ans*100.0/numb_of_tryes;
    if(procents < 50)
        std::cout<<"2\n";
    else if(procents >= 50 && procents < 65)
        std::cout<<"3\n";
    else if(procents >= 65 && procents < 90)
        std::cout<<"4\n";
    else if(procents >= 90 && procents <= 100)
        std::cout<<"5\n";
    return 0;
}
1
2 / 2 / 0
Регистрация: 16.01.2011
Сообщений: 23
16.01.2011, 23:44 1115
ForEveR, у тебя Microsoft Visual C++ 6.0?...у меня не компилируется, две ошибки, я своим опытом не могу так сразу найти их
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
16.01.2011, 23:51  [ТС] 1116
DarK_Fifti'S, Нет. У меня Visual Studio 2008, 2010... 2005 еще где-то валяется. Советую компилятор новее)
0
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
17.01.2011, 21:35 1117
Свадьба
(Время: 1 сек. Память: 16 Мб Сложность: 32%)

Одна предприимчивая и очень симпатичная дамочка с прелестнейшим именем Горгона решила заработать себе денег на роскошную жизнь. N молодых людей так влюблены в нее, что предложили руку и сердце. К несчастью для них, Горгона видит в них только мешок с деньгами. Она планирует выйти замуж и почти сразу же развестись с некоторыми из молодых людей ради денежной выгоды. Все, что ей нужно, это подзаработать как можно больше денег (и уж, конечно, остаться незамужней). По законам этой прекрасной страны при разводе каждый из супругов получает половину всего имущества.

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

В первой строке входного файла INPUT.TXT записано целое число N — количество молодых людей, без памяти влюбленных в Горгону (1 < N <= 40). Далее следует N чисел — сумма денег на счету каждого молодого человека. В последней строке записано целое число А — сумма денег на счету Горгоны. Суммы денег на счету — целые неотрицательные числа, не превосходящие 10^9.
Выходные данные

В выходной файл OUTPUT.TXT выведите единственное число — максимальную сумму денег, которой сможет обладать Горгона после своей махинации. Ответ выводите с точностью до шести знаков ровно в формате без мантиссы.
Пример:
INPUT.TXT

2
5 10
5
OUTPUT.TXT
7.500000

Пример:
INPUT.TXT

3
1 3 2
0
OUTPUT.TXT
2.125000
0
Freelance
Эксперт С++
2871 / 1806 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
17.01.2011, 22:10 1118
valeriikozlov, Хм, а какой подвох ? Или просто делить каждую суму на два и додавать до общей сумы ?
0
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
17.01.2011, 22:16 1119
asics, Нужно таким способом найти максимально возможную сумму. Попробуйте на примерах. Кстати я здесь не вижу например такого примера:
2
2 10
5
Что должно получится?
0
Freelance
Эксперт С++
2871 / 1806 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
17.01.2011, 22:19 1120
valeriikozlov, 6 ?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2011, 22:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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