powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Временная структура tm
11 сообщений из 11, страница 1 из 1
Временная структура tm
    #40053361
donaldkzat83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите по какой причине в коде не проходит обработка дня, при вводе даты 26.03.2021, код выдает что читатель имеет задолженность, хотя должен выдавать не имеет.

Код: plaintext
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.
#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;
}
...
Рейтинг: 0 / 0
Временная структура tm
    #40053363
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
donaldkzat83Подскажите по какой причине в коде не проходит обработка дня

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

Отлаживай. Проходи пошагово и смотри где значения переменных отличаются от тех, которые ты
ожидаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Временная структура tm
    #40053377
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это что такое? Стыдливо спрятал.

Код: plaintext
1.
2.
#include "student.h"
#include "ctime"
...
Рейтинг: 0 / 0
Временная структура tm
    #40053412
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
donaldkzat83
при вводе даты 26.03.2021, код выдает что читатель имеет задолженность, хотя должен выдавать не имеет.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
           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;
                }
...
Рейтинг: 0 / 0
Временная структура tm
    #40053416
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут структуру студента и struct tm текущего времени надо привести к общему виду. И чтоб компаратор
поддерживался. Тогда эта колбаса
Код: plaintext
1.
if (students[i].birthday.year < ltm.tm_year + 1900)


сведется к одной проверке двух типизированных дат.
...
Рейтинг: 0 / 0
Временная структура tm
    #40053419
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
И чтоб компаратор

Ну конечно, "компаратор" вместо замены знака "<=" на "<".
...
Рейтинг: 0 / 0
Временная структура tm
    #40053421
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
И чтоб компаратор

А еще проще и лучше будет сделать student.bithday типа time_t, вводить данные сразу туда, а потом просто difftime() на эту и текущую даты.
...
Рейтинг: 0 / 0
Временная структура tm
    #40053581
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Студент задолжал книгу в момент рождения... Ух ты...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Временная структура tm
    #40053684
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
mayton
И чтоб компаратор

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
       
 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)



А если там минуты и секунды проверять? А если в Римской системе? А если часовые пояса?...
...
Рейтинг: 0 / 0
Временная структура tm
    #40053696
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну уж что нагуглилось...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Временная структура tm
    #40053868
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
donaldkzat83, mayton уже написал, что делать: приводим обе даты к единому формату, а потом сравниваем их специальной функцией сравнения. Делается примерно так:
Код: plaintext
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.
#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;
}
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Временная структура tm
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]