Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / Временная структура tm / 11 сообщений из 11, страница 1 из 1
14.03.2021, 19:31
    #40053361
donaldkzat83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временная структура tm
Подскажите по какой причине в коде не проходит обработка дня, при вводе даты 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
14.03.2021, 19:36
    #40053363
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временная структура tm
donaldkzat83Подскажите по какой причине в коде не проходит обработка дня

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

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

Код: plaintext
1.
2.
#include "student.h"
#include "ctime"
...
Рейтинг: 0 / 0
15.03.2021, 00:26
    #40053412
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временная структура tm
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
15.03.2021, 00:53
    #40053416
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временная структура tm
Тут структуру студента и struct tm текущего времени надо привести к общему виду. И чтоб компаратор
поддерживался. Тогда эта колбаса
Код: plaintext
1.
if (students[i].birthday.year < ltm.tm_year + 1900)


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

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

А еще проще и лучше будет сделать student.bithday типа time_t, вводить данные сразу туда, а потом просто difftime() на эту и текущую даты.
...
Рейтинг: 0 / 0
15.03.2021, 13:49
    #40053581
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временная структура tm
Студент задолжал книгу в момент рождения... Ух ты...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.03.2021, 16:10
    #40053684
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временная структура tm
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
15.03.2021, 16:23
    #40053696
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временная структура tm
Ну уж что нагуглилось...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.03.2021, 04:23
    #40053868
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временная структура tm
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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Временная структура tm / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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