Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Временная структура tm  [new]
donaldkzat83
Member

Откуда:
Сообщений: 1
Подскажите по какой причине в коде не проходит обработка дня, при вводе даты 26.03.2021, код выдает что читатель имеет задолженность, хотя должен выдавать не имеет.

#include <iostream>
#include <iomanip>
#include "student.h"
#include "ctime"
using namespace std;
int main()
{
    ios_base::left;
    setlocale(0, "");
    // Объявление массива
    // структур students типа student
    student students[10] = {};
    // Объявление
    // вспомогательной переменной buffer типа student
    student buffer;
    int i, j, records = 0;
    // Объявление символьной переменной-флага
    char flag = 'y';
    cout << setw(40) << "Ввод данных о читателях" << endl;
    // Ввод данных
    do {
        cout << "Читатель " << records + 1 << endl;
        cout << "Введите фамилию: ";
        cin >> students[records].fam;
        cout << "Введите номер читательского билета: ";
        cin >> students[records].id_number;
        cout << "Введите название книги: ";
        cin >> students[records].book;
        cout << "Срок возврата книги:" << endl;
        cout << "Введите год: ";
        cin >> students[records].birthday.year;
        cout << "Введите месяц: ";
        cin >> students[records].birthday.month;
        cout << "Введите день: ";
        cin >> students[records].birthday.day;
        records++;
        cout << "Продолжить ввод? (y/n)";
        cin >> flag;
 
    } while (flag == 'y');
    cout << endl << "Список читателей" << endl;
    cout << setw(16) << "Фамилия" << setw(10) <<
        "№Билета" << setw(16) << "Книга" << setw(16) << "Срок возврата" << endl;
    for (i = 0; i < records; i++) {
        cout << setw(16) << students[i].fam << setw(10) <<
            students[i].id_number << setw(16) << students[i].book << setw(5) <<
            students[i].birthday.day << "." << students[i].birthday.month << "." << students[i].birthday.year << endl;
    }
    time_t now = time(0);
    tm ltm;
    localtime_s(&ltm, &now);
    for (i = 0; i < records; i++)
    {
        if (students[i].birthday.year < ltm.tm_year + 1900)
        {
            cout << "Читатель " << students[i].fam << " с номером билета " << students[i].id_number << " имеет задолженность по возврату книги" << endl;
        }
        else
        {
            if (students[i].birthday.year = ltm.tm_year + 1900)
            {
                if (students[i].birthday.month <= ltm.tm_mon + 1)
                {
                    cout << "Читатель " << students[i].fam << " с номером билета " << students[i].id_number << " имеет задолженность по возврату книги" << endl;
                }
 
                else
                {
                    if (students[i].birthday.month == ltm.tm_mon + 1)
                    {
                        if (students[i].birthday.day <= ltm.tm_mday + 13)
                        {
                            cout << "Читатель " << students[i].fam << " с номером билета " << students[i].id_number << " имеет задолженность по возврату книги" << endl;
                        }
                    }
                    else
                    {
                        if (students[i].birthday.day > ltm.tm_mday + 13)
                            {
                                cout << "Читатели с задолженностями не найдены! " << endl;
                            }        
                    }
                }
            }
        }
    }
    system("pause");
    return 0;
}
14 мар 21, 19:31    [22294341]     Ответить | Цитировать Сообщить модератору
 Re: Временная структура tm  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

donaldkzat83
Подскажите по какой причине в коде не проходит обработка дня

"Если код не работает, значит в нём баг." (с) мой.

Отлаживай. Проходи пошагово и смотри где значения переменных отличаются от тех, которые ты
ожидаешь.

Posted via ActualForum NNTP Server 1.5

14 мар 21, 19:36    [22294343]     Ответить | Цитировать Сообщить модератору
 Re: Временная структура tm  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
А это что такое? Стыдливо спрятал.

#include "student.h"
#include "ctime"
14 мар 21, 20:38    [22294365]     Ответить | Цитировать Сообщить модератору
 Re: Временная структура tm  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1966
donaldkzat83
при вводе даты 26.03.2021, код выдает что читатель имеет задолженность, хотя должен выдавать не имеет.

Потому что ты вводишь март как 3, а в структуре tm поле месяцев tm_mon хранит номера месяцев начиная с 0 (январь). Март, соответственно - это 2.

           if (students[i].birthday.year = ltm.tm_year + 1900)
            {
                if (students[i].birthday.month <= ltm.tm_mon + 1)
                {
                    cout << "Читатель " << students[i].fam << " с номером билета " << students[i].id_number << " имеет задолженность по возврату книги" << endl;
                }
15 мар 21, 00:26    [22294434]     Ответить | Цитировать Сообщить модератору
 Re: Временная структура tm  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Тут структуру студента и struct tm текущего времени надо привести к общему виду. И чтоб компаратор
поддерживался. Тогда эта колбаса
if (students[i].birthday.year < ltm.tm_year + 1900)

сведется к одной проверке двух типизированных дат.
15 мар 21, 00:53    [22294441]     Ответить | Цитировать Сообщить модератору
 Re: Временная структура tm  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1966
mayton
И чтоб компаратор

Ну конечно, "компаратор" вместо замены знака "<=" на "<".

Сообщение было отредактировано: 15 мар 21, 02:07
15 мар 21, 02:05    [22294451]     Ответить | Цитировать Сообщить модератору
 Re: Временная структура tm  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
И чтоб компаратор

А еще проще и лучше будет сделать student.bithday типа time_t, вводить данные сразу туда, а потом просто difftime() на эту и текущую даты.
15 мар 21, 04:09    [22294458]     Ответить | Цитировать Сообщить модератору
 Re: Временная структура tm  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Студент задолжал книгу в момент рождения... Ух ты...

Posted via ActualForum NNTP Server 1.5

15 мар 21, 13:49    [22294716]     Ответить | Цитировать Сообщить модератору
 Re: Временная структура tm  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
White Owl
mayton
И чтоб компаратор

А еще проще и лучше будет сделать student.bithday типа time_t, вводить данные сразу туда, а потом просто difftime() на эту и текущую даты.

Да. Типизация - важная вещь. А от этого - волосы дыбом встают. Раздельная проверка лет и месяцев. Брр....

       
 if (students[i].birthday.year < ltm.tm_year + 1900)
        {
            cout << "Читатель " << students[i].fam << " с номером билета " << students[i].id_number << " имеет задолженность по возврату книги" << endl;
        }
        else
        {
             if (students[i].birthday.year = ltm.tm_year + 1900)
            {
                 if (students[i].birthday.month <= ltm.tm_mon + 1)


А если там минуты и секунды проверять? А если в Римской системе? А если часовые пояса?...
15 мар 21, 16:10    [22294845]     Ответить | Цитировать Сообщить модератору
 Re: Временная структура tm  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Ну уж что нагуглилось...

Posted via ActualForum NNTP Server 1.5

15 мар 21, 16:23    [22294858]     Ответить | Цитировать Сообщить модератору
 Re: Временная структура tm  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
donaldkzat83, mayton уже написал, что делать: приводим обе даты к единому формату, а потом сравниваем их специальной функцией сравнения. Делается примерно так:
#include <assert.h>
#include <time.h>
#include <iostream>

using namespace std;

struct date_t {
  int year;
  int month; // 1 .. 12
  int day; // 1 .. 31
};

date_t current_date() {
  time_t t;
  time(&t);
  tm* info = localtime(&t);
  date_t result;
  result.year = 1900 + info->tm_year;
  result.month = 1 + info->tm_mon;
  result.day = info->tm_mday;
  return result;
}

// если date_1 < date_2, возвращает число < 0
// если date_1 = date_2, возвращает 0
// если date_1 > date_2, возвращает число > 0
int compare_dates(date_t date_1, date_t date_2) {
  assert((1 <= date_1.month) && (date_1.month <= 12));
  assert((1 <= date_1.day) && (date_1.day <= 31));
  assert((1 <= date_2.month) && (date_2.month <= 12));
  assert((1 <= date_2.day) && (date_2.day <= 31));
  if (date_1.year != date_2.year) {
    return date_1.year - date_2.year;
  }
  if (date_1.month != date_2.month) {
    return date_1.month - date_2.month;
  }
  return date_1.day - date_2.day;
}

int main() {
  ...
  date_t cur_date = current_date();
  for (...) {
    if (compare_dates(students[i].return_book_date, cur_date) < 0) { // return_book_date вместо birthday
      // студент должен был вернуть книгу до сегодняшнего дня, но не вернул
      // пора высылать коллекторов
      ...
    }
  }
  return 0;
}
16 мар 21, 04:23    [22295163]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить