Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ «Неделя вторая - Контейнер vector - Ежемесячные дела» #11

Войти
Регистрация
Восстановить пароль
Оценить эту запись

С++ «Неделя вторая - Контейнер vector - Ежемесячные дела» #11

Запись от acmades размещена 16.07.2017 в 11:01

Продолжаю пилить курс: «Основы разработки на C++: белый пояс»
Задание:
У каждого из нас есть ежемесячные дела, каждое из которых нужно выполнять в конкретный день каждого месяца: оплата счетов за электричество, абонентская плата за связь и пр. Вам нужно реализовать работу со списком таких дел, а именно, обработку следующих операций:

ADD i s
Добавить дело с названием s в день i.

NEXT
Закончить текущий месяц и начать новый. Если новый месяц имеет больше дней, чем текущий, добавленные дни изначально не будут содержать дел. Если же в новом месяце меньше дней, дела со всех удаляемых дней необходимо будет переместить на последний день нового месяца.
Обратите внимание, что количество команд этого типа может превышать 11.

DUMP i
Вывести все дела в день i.
Изначально текущим месяцем считается январь. Количества дней в месяцах соответствуют Григорианскому календарю с той лишь разницей, что в феврале всегда 28 дней.

Указание
Для дописывания всех элементов вектора v2 в конец вектора v1 удобно использовать метод insert:
v1.insert(end(v1), begin(v2), end(v2));

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

Формат вывода
Для каждой операции типа DUMP в отдельной строке выведите количество дел в соответствующий день, а затем их названия, разделяя их пробелом. Порядок вывода дел в рамках каждой операции значения не имеет.

Пример:

Ввод
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

Вывод
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
#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>
using namespace std;
void Next_month(int& index,const vector<int>& diy, vector<vector<string>>& tfd) { //создает следующий месяц и переносит дела
    index++; // берем индекс следующего месяца
    if (index > 11)index = 0; //если индекс стал > 11(т.е. 12) то начинаем год с начала
    vector<vector<string>> NewMonth = tfd; //новый вектор и копируем в него старый
    int a = tfd.size(); //посчитаем размер старого вектора
    int b = diy[index]; //и размер нового вектора
    tfd.resize(b); //и меняем размер(обрезаем или дописываем пустые значения)
    const int e = b - 1; // переменная для определения индекса последнего дня в новом месяце
    if (a > b) { //если старый больше нового, то
        for (b; a > b; b++) { //перебираем все дни, которые не влезли с прошлого месяца
            tfd[e].insert(end(tfd[e]), begin(NewMonth[b]), end(NewMonth[b])); //все задачи из дня старого месяца дописываем в конец последнего дня нового месяца
        }
    }
    NewMonth.clear(); //очищаем новый вектор
}
void Task_display(int day, const vector<vector<string>>& tfd) { // вывод задач в определенный день
    cout << tfd[day - 1].size();
    for (auto i : tfd[day - 1]){ //перебираем все задачи в конкретном дне
        cout << " " << i; //и выводим через пробел
    }
}
int main()
{
    int Q;
    cin >> Q; //ввели количество операций
    vector<int> day_in_year = { 31,28,31,30,31,30,31,31,30,31,30,31}; //явно указываем сколько дней в каждом месяце
    vector<vector<string>> task_for_day; //создаем новый вектор для задач в каждом дне месяца
    int index_of_month = 0; //переменная для определения индекса текущего месяца
    task_for_day.resize(day_in_year[index_of_month], {}); //увеличиваем вектор до количества дней в текущем месяце
    for (int i = 0; Q > i; i++) { //и пока лимит операций (Q) не закончится считываем их и выполняем по ходу
        string comand; //команда
        int day; //день месяца
        string task; //задача на день
        cin >> comand; //прочитали команду...
        if (comand == "NEXT") { //если это запрос "перейти на другой месяц" ...
            Next_month(index_of_month, day_in_year, task_for_day); //переходим в функции
        }
        else if (comand == "DUMP") { //если команда "показать задачи в определенном дне", то
            cin >> day; //считываем день
            Task_display(day,task_for_day); //показываем задачи
        }
        else if (comand == "ADD") { //если команда "добавить задачу в день", то
            cin >> day >> task; //считываем день и задачу
            task_for_day[day - 1].push_back(task); //в нужный день вставляем задачу в конец дня
        }
    }
    return 0;
}
Всего комментариев 8

Комментарии

  1. Старый комментарий
    Аватар для ZarinZomanu4
    Хорошая такая задача.Уже 3 дня вожусь никак идею не могу понять.
    Запись от ZarinZomanu4 размещена 16.07.2017 в 21:11 ZarinZomanu4 вне форума
  2. Старый комментарий
    Задача, как понимаю, на логику и умение применять уже изученное. Сам пол дня сидел думал как написать компактно. У меня в решении по идее всё описано. Просто смотрел в задание, что нужно сделать и делал это по-порядку (например, вижу ввод разных команд - нужно принимать их по разному для каждого, если такая команда, то нужно особенное для него действие - подойдет условие if) . Короче, у нас есть команды разные и по разному вводятся с разными добавками. Соответственно нужно в главной функции как-то это разобрать и принять эти данные для дальнейшего разбора. Самое простое - это считать первое слово (их всего 3 штуки) и, в зависимости от того какое ввели, принимать следующий аргумент или сразу что-то делать . Можно там же в главной описать что делать, но как-то навалено все будет и поэтому для каждого напишем отдельную функцию(кроме одного, там одна строчка всего, бессмысленно). Эти функции будут принимать данные и что-то с ними делать. (это вот так я и размышлял пол дня...) . Если надо чтобы для каждого дня были свои задачи и чтобы все это можно было вытащить по индексу - точно, сделаю вектор векторов (вектор в котором другие вектора лежат).
    Можно сказать что нет там идеи, я просто разбивал большую задачу на маленькие и решал их. А по началу, когда увидел задание в общем, обескураживает; потом подумал "да фиг с ним, как мне данные то принять... а как хранить удобнее чтоб желательно в одном месте... а как обрезать вектор и задачи в конец дописать..." - так и нарешалось.
    Запись от acmades размещена 17.07.2017 в 00:53 acmades вне форума
  3. Старый комментарий
    О! благодаря вашему решению сообразил, как это решается. Но вот столкнулся с проблемой у проверяющего компьютера вывод моей программы идет в одну строчку а не в столбец, как указано в условиях. Хотя у меня вывод нормальный, с чем это может быть связано?
    Запись от Albatrosso размещена 03.08.2017 в 19:58 Albatrosso вне форума
  4. Старый комментарий
    Цитата:
    Сообщение от Albatrosso Просмотреть комментарий
    О! благодаря вашему решению сообразил, как это решается. Но вот столкнулся с проблемой у проверяющего компьютера вывод моей программы идет в одну строчку а не в столбец, как указано в условиях. Хотя у меня вывод нормальный, с чем это может быть связано?
    Может быть с отсутствием перевода строки (endl)? У меня в решении нет перевода строки, но этого хватило.
    Запись от acmades размещена 03.08.2017 в 21:09 acmades вне форума
  5. Старый комментарий
    Цитата:
    Сообщение от acmades Просмотреть комментарий
    Может быть с отсутствием перевода строки (endl)? У меня в решении нет перевода строки, но этого хватило.
    я пробовал и с endl не вышло. на выводе переносилось слово walk. Сижу уже два дня, решение обтачивал и обтачивал и ей- богу не знаю уже, что делать.
    Запись от Albatrosso размещена 03.08.2017 в 23:13 Albatrosso вне форума
  6. Старый комментарий
    Цитата:
    Сообщение от Albatrosso Просмотреть комментарий
    я пробовал и с endl не вышло. на выводе переносилось слово walk. Сижу уже два дня, решение обтачивал и обтачивал и ей- богу не знаю уже, что делать.
    Так вы пишите код, или тему новую создайте здесь на форуме. Без кода код не разобрать ))))
    Запись от acmades размещена 04.08.2017 в 18:46 acmades вне форума
  7. Старый комментарий
    Спешу сообщить радостную для меня новость. Удалось найти решение данной проблемы.
    Запись от Albatrosso размещена 04.08.2017 в 23:02 Albatrosso вне форума
  8. Старый комментарий
    Цитата:
    Сообщение от Albatrosso Просмотреть комментарий
    Спешу сообщить радостную для меня новость. Удалось найти решение данной проблемы.
    Запись от acmades размещена 05.08.2017 в 00:27 acmades вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru