crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
__ilya__
  опции профиля:
сообщение 11.9.2012, 13:21
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 19.1.2012
Пользователь №: 3143

Спасибо сказали: 0 раз(а)




Репутация:   0  


есть контейнер
QMap<QDate, int>timecard;

данный контейнер сохраняется в файл и извлекается из него. пользователь каждый день(или не каждый) добавляет в него некое число int.
А собственно вопросов два:

1) как можно подщитать сумму значений за месяц? Не за 30 дней, а за месяц, скажем сентябрь или январь.

2)как подщитать сумму значений за год, например 2011
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iReset
  опции профиля:
сообщение 11.9.2012, 15:15
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 178
Регистрация: 6.6.2012
Пользователь №: 3414

Спасибо сказали: 23 раз(а)




Репутация:   2  


Цитата(__ilya__ @ 11.9.2012, 14:21) *
есть контейнер
QMap<QDate, int>timecard;

данный контейнер сохраняется в файл и извлекается из него. пользователь каждый день(или не каждый) добавляет в него некое число int.
А собственно вопросов два:
1) как можно подщитать сумму значений за месяц? Не за 30 дней, а за месяц, скажем сентябрь или январь.
2)как подщитать сумму значений за год, например 2011

Например, так:
QDate firstDate (2012, 8, 1); // Дата начала периода
QDate lastDate (2012, 9, 1);  // Дата, следующая за окончанием периода
QMap<QDate, int>::const_iterator i = timecard.find (firstDate);
int count = 0; // Искомая сумма
while (i != map.end() && i.key() < lastDate) {
    count += i.value();
    ++i;
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
__ilya__
  опции профиля:
сообщение 11.9.2012, 16:47
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 19.1.2012
Пользователь №: 3143

Спасибо сказали: 0 раз(а)




Репутация:   0  


а как устанавливать дату начала и конца периода? в ручную?
не такое не подхродит
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iReset
  опции профиля:
сообщение 11.9.2012, 17:04
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 178
Регистрация: 6.6.2012
Пользователь №: 3414

Спасибо сказали: 23 раз(а)




Репутация:   2  


Цитата(__ilya__ @ 11.9.2012, 17:47) *
а как устанавливать дату начала и конца периода? в ручную?
не такое не подхродит

Можно и не вручную. Смотря что есть на входе.
Если, например, известен месяц, за который нужно посчитать сумму, то, например:
int month = 8;  // Заранее известный нам месяц
int year = QDate::currentDate ().year ();  // Получаем текущий год
// Тут подразумеваем, что месяц указан за последний год
// т.е. если заданный месяц больше текущего, то год должен быть предыдущий
if (month > QDate::currentDate ().month ())
    year--;
QDate firstDate (year, month, 1);
QDate lastDate = firstDate.addMonth (1);  // Конечная дата на месяц больше

Это как вариант.
Так что есть изначально? Или нужно посчитать суммы по всем месяцам и годам, содержащимся в контейнере?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
__ilya__
  опции профиля:
сообщение 11.9.2012, 17:32
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 57
Регистрация: 19.1.2012
Пользователь №: 3143

Спасибо сказали: 0 раз(а)




Репутация:   0  


известно год и месяц. Надо посчитать за месяц и за год.

Цитата
 // Тут подразумеваем, что месяц указан за последний год
// т.е. если заданный месяц больше текущего, то год должен быть предыдущий
if (month > QDate::currentDate ().month ())
    year--;


мне не понятно для чего это
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iReset
  опции профиля:
сообщение 11.9.2012, 19:38
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 178
Регистрация: 6.6.2012
Пользователь №: 3414

Спасибо сказали: 23 раз(а)




Репутация:   2  


Цитата(__ilya__ @ 11.9.2012, 18:32) *
мне не понятно для чего это

При подсчёте суммы за месяц нам известен номер месяца, например, август, 8. Если известно, за какой год этот август, то эта вставка не нужна, достаточно сформировать fitstDate с известным годом, известным месяцем и числом - 1.
Проблема возникает, если год неизвестен. Вероятнее всего, подразумевается последний август (по крайней мере, я именно так считал). Но если сейчас сентябрь, то август уже был и как раз в этом году. А если сейчас, например, январь? Значит, август был в прошлом году. Именно это и определяется указанным кодом: если нужный нам месяц больше текущего, значит, в этом году его еще не было, а он был в прошлом - вычитаем из текущего года один год.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.9.2012, 19:50
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


__ilya__, этот тот самый случай, когда файл - зло, а БД золото.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 3.6.2025, 16:18