Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
0 / 0 / 1
Регистрация: 20.07.2017
Сообщений: 75

Реализовать работу со списком дел на месяц

03.08.2017, 19:35. Показов 5551. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У каждого из нас есть ежемесячные дела, каждое из которых нужно выполнять в конкретный день каждого месяца: оплата счетов за электричество, абонентская плата за связь и пр. Вам нужно реализовать работу со списком таких дел, а именно, обработку следующих операций:
ADD i s
Добавить дело с названием s в день i.
NEXT
Закончить текущий месяц и начать новый. Если новый месяц имеет больше дней, чем текущий, добавленные дни изначально не будут содержать дел. Если же в новом месяце меньше дней, дела со всех удаляемых дней необходимо будет переместить на последний день нового месяца.
Обратите внимание, что количество команд этого типа может превышать 11.
DUMP i
Вывести все дела в день i.
Изначально текущим месяцем считается январь. Количества дней в месяцах соответствуют Григорианскому календарю с той лишь разницей, что в феврале всегда 28 дней.
Указание
Для дописывания всех элементов вектора v2 в конец вектора v1 удобно использовать метод insert:





C++
1
v1.insert(end(v1), begin(v2), end(v2));

Формат ввода
Сначала число операций Q, затем описания операций.
Названия дел s уникальны и состоят только из латинских букв, цифр и символов подчёркивания. Номера дней i являются целыми числами и нумеруются от 1 до размера текущего месяца.
Формат вывода
Для каждой операции типа DUMP в отдельной строке выведите количество дел в соответствующий день, а затем их названия, разделяя их пробелом. Порядок вывода дел в рамках каждой операции значения не имеет.
Пример

Ввод
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  
12
ADD 5 Salary
ADD 31 Walk
ADD 30 WalkPreparations
NEXT
DUMP 5
DUMP 28
NEXT
DUMP 31
DUMP 30
DUMP 28
ADD 28 Payment
DUMP 28

Вывод
C++
1
2
3
4
5
6
1 Salary
2 WalkPreparations Walk
0
0
2 WalkPreparations Walk
3 WalkPreparations Walk Payment


вот мое решение, но проблема в том что вывод у моей программы ненормальный:
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
 //#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>
using namespace std;
void Show_tasks(int day, const vector<vector<string>>& tsks) {
    cout << tsks[day - 1].size();
    for (auto i : tsks[day - 1]) {
        cout << " " << i << "\n";
    }
}
void Next_month(int& indx, const vector<int>& dim, vector<vector<string>>& tsks) {
    indx++;
    if (indx > 11)indx = 0;
    vector<vector<string>> NewMonth = tsks;
    int a = tsks.size();
    int b = dim[indx];
    tsks.resize(b);
    const int e = b - 1;
    if (a > b) {
        for (b; a > b; b++) {
            tsks[e].insert(end(tsks[e]), begin(NewMonth[b]), end(NewMonth[b]));
        }
    }
    NewMonth.clear();
}
 
int main()
{
    int q;
    cin >> q;
    vector<int> days_in_month = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    vector<vector<string>> tasks;
    int index_of_month = 0;
    tasks.resize(days_in_month[index_of_month], {});
    for (int i = 0; q > i; i++) {
        string c;
        int d;
        string t;
        cin >> c;
        if (c == "NEXT") {
            Next_month(index_of_month, days_in_month, tasks);
        }
        else if (c == "DUMP") {
            cin >> d;
            Show_tasks(d, tasks);
        }
        else if (c == "ADD") {
            cin >> d >> t;
            tasks[d - 1].push_back(t);
        }
    }
    return 0;
}
вот вывод моей программы:
C++
1
2
3
4
5
6
7
8
1 Salary
2 WalkPreparations
 Walk
002 WalkPreparations
 Walk
3 WalkPreparations
 Walk
 Payment
а вот необходимый:
C++
1
2
3
4
5
6
1 Salary
2 WalkPreparations Walk
0 
0 
2 WalkPreparations Walk
3 WalkPreparations Walk Payment
что не так в коде понять не могу. Если убрать символ "\n" то вывод будет таким:
C++
1
1 Salary2 WalkPreparations Walk002 WalkPreparations Walk3 WalkPreparations Walk Payment
Добавлено через 5 часов 35 минут
Вопрос все еще актуален.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.08.2017, 19:35
Ответы с готовыми решениями:

Как реализовать работу со списком строк и списком цифр в классе List?
Добрый день! Проблема такая Есть класс-список: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using...

Не удается реализовать в БД просмотр дел на завтра, послезавтра и т.д
Само условие задачи: &quot;Дата, время и протяженность мероприятия, место проведения.Просмотр дел на завтра, послезавтра и так далее&quot;. ...

Используя элементы управления «СЧЕТЧИК» и «ПОЛЕ СО СПИСКОМ», построить календарь на заданный год и месяц
Доброго времени суток. Помогите найти ошибку в задании 3 Он не определяет имя..не понимаю в чем прикол. Надеюсь на вашу помощь. Спасибо.

14
7 / 7 / 7
Регистрация: 26.04.2015
Сообщений: 220
04.08.2017, 12:00
C++
1
2
3
4
for (auto i : tsks[day - 1]) {
        cout << " " << i;
    }
 cout << endl
а если так?
ой, не то извини

Добавлено через 10 минут
на счет нулей так:
C++
1
2
3
4
5
6
7
void Show_tasks(int day, const vector<vector<string>>& tsks) {
    cout << tsks[day - 1].size();
    if(day - 1 == 0) {cout <<  endl; return}
    for (auto i : tsks[day - 1]) {
        cout << " " << i << "\n";
    }
}
Добавлено через 7 минут
хм, а если так?
C++
1
2
3
4
5
6
void Show_tasks(int day, const vector<vector<string>>& tsks) {
    cout << tsks[day - 1].size();
    if(day - 1 == 0) { cout <<  endl; return }
    for (auto i : tsks[day - 1]) {  cout << " " << i; }
    cout <<  endl;
}
0
0 / 0 / 1
Регистрация: 20.07.2017
Сообщений: 75
04.08.2017, 15:36  [ТС]
Увы, это тоже не помогло( Все равно спасибо.
0
7 / 7 / 7
Регистрация: 26.04.2015
Сообщений: 220
04.08.2017, 15:44
Albatrosso, потому что я корчь)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Show_tasks(int day, const vector<vector<string>>& tsks)
{
    cout << tsks[day - 1].size();
    if( tsks[day - 1].size() != 0) 
    {
        for (auto i : tsks[day - 1])
        {
              cout << " " << i;
        }
    }
    else
        { 
              cout <<  endl;
        }
}
а так?
0
0 / 0 / 1
Регистрация: 20.07.2017
Сообщений: 75
04.08.2017, 16:31  [ТС]
Тоже не сработало, но стоит отметить, что вывод стал лучше
C++
1
2
3
1 Salary2 WalkPreparations Walk0
0
2 WalkPreparations Walk3 WalkPreparations Walk Payment
0
7 / 7 / 7
Регистрация: 26.04.2015
Сообщений: 220
04.08.2017, 16:36
Albatrosso, ну я как обычно все время что-нибудь теряю)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Show_tasks(int day, const vector<vector<string>>& tsks)
{
    cout << tsks[day - 1].size();
    if( tsks[day - 1].size() != 0) 
    { 
         cout <<  endl; return;
    }
    for (auto i : tsks[day - 1])
    {
         cout << " " << i;
    }
    cout <<  endl;     
}
а так)?
0
0 / 0 / 1
Регистрация: 20.07.2017
Сообщений: 75
04.08.2017, 17:34  [ТС]
опять нет( ответ:
C++
1
2
3
4
5
6
1
2
0
0
2
3
0
7 / 7 / 7
Регистрация: 26.04.2015
Сообщений: 220
04.08.2017, 18:11
Лучший ответ Сообщение было отмечено Albatrosso как решение

Решение

Albatrosso, я же говорю я корчь, за мной перепроверять надо)) вместо != Ставь ==
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.08.2017, 18:54
мой говнокот.
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <iostream>
#include <deque>
#include <map>
 
struct Month
{
  const static int        sMonths[];
  constexpr static size_t sMonthsCount = 12;
  int mCurrent = 0;
  int mPrev    = 0;
  
  bool lessAndIncrease()
  {
    mPrev = mCurrent;
    if (mCurrent == sMonthsCount - 1)
    {
      mCurrent = 0;
      return sMonths[mCurrent] < sMonths[sMonthsCount - 1];
    }
    else
    {
      ++mCurrent;
      return sMonths[mCurrent] < sMonths[mCurrent - 1];
    }
  }
};
 
const int Month::sMonths[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
class Calendar;
 
struct ICommand
{
  virtual ~ICommand() = default;
  virtual void input(std::istream & strm) {}
  virtual void execute(Calendar & calendar) = 0;
};
 
enum class CommandType
{
  DUMP,
  NEXT,
  ADD
};
 
class Calendar
{
public:
  void addCase(int day, const std::string & text)
  {
    mDays[day].mCases.push_back(text);
  }
  
  void nextMonth()
  {
    if (mMonth.lessAndIncrease())
    {
      const int day = Month::sMonths[mMonth.mCurrent];
      for (int it = Month::sMonths[mMonth.mCurrent] + 1; it <= Month::sMonths[mMonth.mPrev]; ++it)
      {
        mDays[day].mCases.insert(std::end(mDays[day].mCases), std::begin(mDays[it].mCases), std::end(mDays[it].mCases));
        mDays.erase(it);
      }
    }
    else
    {
      for (int it = Month::sMonths[mMonth.mPrev] + 1; it <= Month::sMonths[mMonth.mCurrent]; ++it)
        mDays.erase(it);
    }
  }
  
  void showCasesByDay(int day, std::ostream & strm) const
  {
    if (mDays.find(day) == mDays.end())
    {
      strm << 0 << "\n";
      return;
    }
    
    strm << mDays.at(day).mCases.size() << " ";
    
    for (const auto & it : mDays.at(day).mCases)
      strm << it << " ";
    strm << "\n";
  }
  
private:
  struct Day
  {
    std::deque<std::string> mCases;
  };
  
  std::map<int, Day>  mDays;
  Month               mMonth;
};
 
class DumpCommand : public ICommand
{
public:
  virtual void input(std::istream & strm) override
  {
    strm >> mDay;
  }
  
  virtual void execute(Calendar & c) override
  {
    c.showCasesByDay(mDay, std::cout);
  }
  
private:
  int mDay;
};
 
class NextCommand : public ICommand
{
public:
  virtual void execute(Calendar & c) override
  {
    c.nextMonth();
  }
};
 
class AddCommand : public ICommand
{
public:
  virtual void input(std::istream & strm) override
  {
    strm >> mDay >> mText;
  }
 
  virtual void execute(Calendar & c) override
  {
    c.addCase(mDay, mText);
  }
  
private:
  int         mDay;
  std::string mText;
};
 
ICommand * createCommand(CommandType command)
{
  switch (command)
  {
  case CommandType::DUMP:
    return new DumpCommand;
  case CommandType::NEXT:
    return new NextCommand;
  case CommandType::ADD:
    return new AddCommand;
  default:
    return nullptr;
  }
}
 
int main()
{
  
  const std::map<std::string, CommandType> commandExec
  {
    { "DUMP", CommandType::DUMP },
    { "NEXT", CommandType::NEXT },
    { "ADD",  CommandType::ADD  }
  };
  
  size_t n{};
  
  std::cin >> n;
  
  std::deque<ICommand *> commands;
  Calendar calendar;
  
  for (size_t it = 0; it < n; ++it)
  {
    std::string s;
    
    std::cin >> s;
    
    commands.push_back(createCommand(commandExec.at(s)));
    commands.back()->input(std::cin);
  }
  
  for (auto & it : commands)
  {
    it->execute(calendar);
  }
}
2
0 / 0 / 1
Регистрация: 20.07.2017
Сообщений: 75
04.08.2017, 19:13  [ТС]
Воу воу. я пока еще не настолько продвинулся, но все равно спасибо!

Добавлено через 39 секунд
Помогло! Поклон до ступней!
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.08.2017, 19:19
про удаление я, как всегда, забыл...
в цикле после 185 строки надо вставить: delete it;.

Добавлено через 3 минуты
да и в структуре Month можно метод переделать на:
C++
1
2
3
4
5
6
7
8
9
bool lessAndIncrease()
{
  mPrev = mCurrent;
  if (mCurrent == sMonthsCount - 1)
    mCurrent = 0;
  else
    ++mCurrent;
  return sMonths[mCurrent] < sMonths[mPrev];
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
04.08.2017, 21:07
GbaLog-, Если позволите, мое скромное ИМХО: Передавать разделяемый ресурс (потоки) вниз по иерархии вызовов - плохая идея. Иногда (когда формат файла хитров...ный и, соответственно, получается контекстно зависимая грамматика) без этого не обойтись, но не в данном случае. Чем это плохо: 1) Множество точек, где поток может испортиться. 2) Вы смешиваете лексический и синтаксический парсер - получается спагетти код.

В данном случае, функции надо только прочитать данные, но при этом она изменяет поток. Это плохо. Вообще, нужно избегать передавать любой общий ресурс куда бы то ни было. Ну или передавать его по ссылке на константу (это не про потоки). По обычной ссылке нужно передавать только в функции специально предназначенные для изменения ресурса.
1
11 / 11 / 6
Регистрация: 13.11.2016
Сообщений: 57
05.08.2017, 09:09
GbaLog-, 83 строка Вашего кода (strm << it << " ";) компилируется не везде. Мне помогло добавление #include <string> в начало файла.

В классе basic_ostream отсутствует перегрузка оператора << для basic_string.

Не знаю — может, очевидные вещи говорю, но мне вот пришлось поразбираться.

Добавлено через 11 минут
Кстати, в классе Calendar разрешается добавление задач на день 32-й и более, и никто потом этот мусор не чистит.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
05.08.2017, 10:08
avgoor, если вы про метод input и showCasesByDay, то я писал их в самом конце и просто не придумал за 2 минуты ничего лучше, хотелось уже спать уйти.
кстати, на счёт разделяемого ресурса, чем это плохо?
просто вспоминаю сериализацию/десериализацию с этими read/write и не понимаю, что плохого.
Цитата Сообщение от Courfeyrac Посмотреть сообщение
компилируется не везде.
просто забыл добавить заголовок.
извечная проблема, ведь у меня компилировалось и так.
Цитата Сообщение от Courfeyrac Посмотреть сообщение
Кстати, в классе Calendar разрешается добавление задач на день 32-й и более, и никто потом этот мусор не чистит.
я показал, как можно, а не как надо.

в самом начале же написал ещё:
Цитата Сообщение от GbaLog- Посмотреть сообщение
мой говнокот.
Добавлено через 1 минуту
Цитата Сообщение от GbaLog- Посмотреть сообщение
кстати, на счёт разделяемого ресурса, чем это плохо?
увидел.
Цитата Сообщение от avgoor Посмотреть сообщение
По обычной ссылке нужно передавать только в функции специально предназначенные для изменения ресурса.
теперь не понимаю снова, чего я не так сделал.
мне ж и надо из потока прочитать.
а это, само собой, модифицирует его.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.08.2017, 16:36
Цитата Сообщение от GbaLog- Посмотреть сообщение
теперь не понимаю снова, чего я не так сделал.
мне ж и надо из потока прочитать.
а это, само собой, модифицирует его.
Вопрос в том, где именно читать. Чем меньше различных мест (функций) в коде, где происходит чтение из потока - тем лучше. Алгоритм, ведь, известен давно - разбиваем входной поток на токены (чтение, в идеале в одной строке), а дальше передаем, соответственно, только эти токены. В данном случае, например, можно читать файл построчно, разбивать на слова и в зависимости от первого слова передавать дальше, например вектор строк, ну или просто сравнивать начало прочитанной строки со списком комманд и всю строку передавать дальше.

То, что чтение из какого-то объекта модифицирует этот объект (причем, не обязательно поток, суть в побочных эффектах чтения) - и есть проблема!

Гуру пишут: "используйте const где только можно". Понимание "зачем так надо" приходит обычно только после наступания на грабли: "Ну ведь ничего страшного, что работу с ресурсом чуть размазали по коду. Через два года непрерывного релиза наступает озарение... И что-то трогать уже страшно".

Добавлено через 4 минуты
UPD: Главного не написал. В чем разница: Если вы передаете строку, а в функции баг - не работает только эта функция. Если вы передаете поток - функция гадит глобально.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.08.2017, 16:36
Помогаю со студенческими работами здесь

Реализовать структуру моделирующую работу аэропорта; реализовать поиск по заданному полю в массиве таких структур
Здравствуйте. Каким образом можно сделать ввод данных через массив, а так же все последующие действия в соответствии с заданием? То есть, я...

Приму на работу php программиста 500$ месяц
Нужен программист который имеет опыт работы с CURL также mysql оплата строго по графику некаких задержек даже если небудет не какой ...

Динамические данные: Организовать работу со списком типа стек
объясните, пожалуйста, что такое t=^a, u:t, buf^.z, buf^.u, buf^.u:=verh а задание такое : Организовать работу со списком типа стек...

Подскажите сайты или сервисы, где можно найти работу ~ 60 000 р. в месяц
О-о-очень нужно найти работу 60 000 р. в месяц на удаленку программистом или копирайтером / рерайтером, можно модератором**. Нужно до...

Реализовать кнопку с выпадающим списком
Добрый день! Есть необходимость реализовать CommandButton на форме, но что - то идей как это сделать нет, может не правильно ищу...:...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru