Не получается решить задачу
Стоит задача:"
У каждого из нас есть повторяющиеся ежемесячные дела, каждое из которых нужно выполнять в конкретный день каждого месяца: оплата счетов за электричество, абонентская плата за связь и пр. Вам нужно реализовать работу со списком таких дел на месяц, а именно, реализовать набор следующих операций:
ADD i s Назначить дело с названием s на день i текущего месяца.
DUMP i Вывести все дела, запланированные на день i текущего месяца.
NEXT Перейти к списку дел на новый месяц. При выполнении данной команды вместо текущего (старого) списка дел на текущий месяц создаётся и становится активным (новый) список дел на следующий месяц: все дела со старого списка дел копируются в новый список. После выполнения данной команды новый список дел и следующий месяц становятся текущими, а работа со старым списком дел прекращается. При переходе к новому месяцу необходимо обратить внимание на разное количество дней в месяцах:
если следующий месяц имеет больше дней, чем текущий, «дополнительные» дни необходимо оставить пустыми (не содержащими дел); если следующий месяц имеет меньше дней, чем текущий, дела со всех «лишних» дней необходимо переместить на последний день следующего месяца. Замечания Историю списков дел хранить не требуется, работа ведется только с текущим списком дел текущего месяца. Более того, при создании списка дел на следующий месяц, он «перетирает» предыдущий список. Обратите внимание, что количество команд NEXT в общей последовательности команд при работе со списком дел может превышать 11. Начальным текущим месяцем считается январь. Количества дней в месяцах соответствуют Григорианскому календарю с той лишь разницей, что в феврале всегда 28 дней. Формат ввода Сначала число операций Q, затем описания операций.
Названия дел s уникальны и состоят только из латинских букв, цифр и символов подчёркивания. Номера дней i являются целыми числами и нумеруются от 1 до размера текущего месяца.
Формат вывода Для каждой операции типа DUMP в отдельной строке выведите количество дел в соответствующий день, а затем их названия, разделяя их пробелом. Порядок вывода дел в рамках каждой операции значения не имеет."
Вот мой код:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void ADD(vector <vector <string> >& vec, int num, string str ){
vec[num].push_back(str);
}
void DUMP (vector <vector <string> >& vec, int num ){
int i = vec[num].size();
for( int j = 0; j < i; j++){
cout<<vec[num][j];
}
}
void next_month( const vector <int> &m, int &num, vector <vector <string> >& vec){
num ++;
vector <vector <string> > vec_new(m[num]);
vec_new.insert(end(vec_new), begin(vec), end(vec));
vec = vec_new;
vec_new.clear();
}
int main() {
vector <int > month {31,28,31,30,31,30,31,31,30,31,30,31};
int current_month = 0;
int Q;
cin >> Q;
vector <vector <string> > vec(month[current_month]);
for(int i = 0; i < Q; i++ ){
string temp;
cin >> temp;
if(temp == "ADD"){
int j;
string str;
cin>>j>>str;
ADD(vec, j, str);
}
else if (temp == "DUMP"){
int j;
cin>>j;
DUMP(vec, j);
}
else if (temp == "NEXT"){
next_month(month, current_month,vec);
}
}
}
Функции "DUMP" и "ADD" работают,однако программа падает на выполнении функции "next".Сколько не пытался,никак не могу найти ошибку. Буду сильно благодарен за помощь
Ответы (1 шт):
void next_month( const vector <int> &m, int &num, vector <vector <string> >& vec)
{
num = (num + 1) % 12; // %12 is needed for december->january
if (vec.size() == m[num] )
{
return;
}
else if (vec.size() < m[num])
{
vec.resize(m[num]);
}
else
{
// copy all data from non-existing days to the last day of the month
// ...
}
}
Вам осталось дополнить код в последней части: else ...
Обратите внимание на следующие моменты:
Правильно оформлен переход на новый год.
Вектор преобразуется на месте, без дополнительного вектора.
Если новый месяц такой же длины, как предыдущий, вектор не изменяется.
Если новый месяц длиннее предыдущего, то к вектору добавляются пустые элементы.
Если новый месяц короче предыдущего, то надо скопировать все данные из лишних элементов в последний день, и изменить размер вектора. Эту часть я оставил вам для завершения задания.