Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2020, 21:47   #1
ep1ckby
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 20
По умолчанию Преобразование переменной через цикл

Программа
Код:
#include <iostream> 
#include <ctime> 
#define DAY 86400 
using namespace std;

int main()
{
    setlocale(0, "");

    int d, m, y;
    int d1, m1, y1;
    
    time_t t1, t2, daysDifference;

    

    cout << "Введите день и месяц рождения: ";
    cin >> d >> m;
    cout << "В этом году у вас уже был День Рождения? 0 - да, 1 - нет ";
    cin >> y;
    

    cout << endl;
    cout << "Введите текущую дату - число, месяц, год:  ";
    cin >> d1 >> m1 >> y1;

    if (y == 0) {
        y = y1 + 1;
    }
    if (y == 1) {
        y = y1;
    }

    if (y1 >= 2500) {
        tm dateBeg = { 0, 0, 0, d1, m1 - 1, y1 - 1920, 0, 0, 0 };
        tm dateEnd = { 0, 0, 0, d, m - 1, y - 1920, 0, 0, 0 };
        t1 = mktime(&dateBeg);
        t2 = mktime(&dateEnd);
    } 
    else {
    tm db = { 0, 0, 0, d1, m1 - 1, y1 - 1800, 0, 0, 0 };
    tm de = { 0, 0, 0, d, m - 1, y - 1800, 0, 0, 0 };
    t1 = mktime(&db);
    t2 = mktime(&de);
    }
    
    daysDifference = ((t1 > t2) ? t1 - t2 : t2 - t1) / DAY; 

    cout << endl;
    cout << "До дня рождения осталось дней:  " << daysDifference << endl;
    cin.get(); cin.get();
    return 0;
}

в конечном виде хочется видеть это так

Код:
#include <iostream> 
#include <ctime> 
#define DAY 86400 
using namespace std;

int main()
{
    setlocale(0, "");

    int d, m, y;
    int d1, m1, y1;
    
    time_t t1, t2, daysDifference;

    

    cout << "Введите день и месяц рождения: ";
    cin >> d >> m;
     
    cout << endl;
    cout << "Введите текущую дату - число, месяц, год:  ";
    cin >> d1 >> m1 >> y1;

    
    Цикл для сравнения дат d(дня) и  m(месяца)
        и если d.m идет позже  d1.m1  то у=у1
        а если d.m идет раньше d1.m1  то y=y1+1 
        если d.m = d1.m1 то у=у1+1 и cout << "  ";






    if (y1 >= 2500) {
        tm dateBeg = { 0, 0, 0, d1, m1 - 1, y1 - 1920, 0, 0, 0 };
        tm dateEnd = { 0, 0, 0, d, m - 1, y - 1920, 0, 0, 0 };
        t1 = mktime(&dateBeg);
        t2 = mktime(&dateEnd);
    } 
    else {
    tm db = { 0, 0, 0, d1, m1 - 1, y1 - 1800, 0, 0, 0 };
    tm de = { 0, 0, 0, d, m - 1, y - 1800, 0, 0, 0 };
    t1 = mktime(&db);
    t2 = mktime(&de);
    }
    
    daysDifference = ((t1 > t2) ? t1 - t2 : t2 - t1) / DAY; 

    cout << endl;
    cout << "До дня рождения осталось дней:  " << daysDifference << endl;
    cin.get(); cin.get();
    return 0;
}

пробовал вот так
Код:
if (em <= bm, ed < bd) {
        ey = by + 1;
    }
    if (em >= bm, ed > bd) {
        ey = by + 1;
    }
    if (em >= bm, ed > bd) {
            ey = by;
        }
    if (em >= bm, ed < bd) {
        ey = by;
    }

    if (em < bm) {
        ey = by + 1;
    }
и так
Код:
if (em < bm, ed < bd) {
        ey = by + 1;
    }
    if (em < bm, ed > bd) {
        ey = by + 1;
        }
    if (em < bm, ed = bd) {
        ey = by + 1;
    }
    if (em > bm, ed > bd) {
        ey = by;
    }
    if (em > bm, ed < bd) {
        ey = by;
    }
    if (em > bm, ed = bd) {
        ey = by;
    }
    else{
        cout << endl;
        cout << " С Днем Рождения!!!";
        return 0;
    }
и так

Код:
if ((em < bm) && (ed < bd)) {
        ey = by + 1;
    }
    if ((em < bm) && (ed >= bd)) {
            ey = by + 1;
    }   
    if ((em > bm) && (ed < bd)) {
                ey = by;
    }
    if ((em > bm) && (ed > bd)) {
        ey = by;
    }
    if ((em = bm) && (ed > bd)) {
        ey = by;
    }
    if ((em = bm) && (ed < bd)) {
        ey = by + 1;
    }
    if ((em = bm) && (ed = bd)) {
        ey = by + 1;
    }
в итоге ничего не работает , выскакивают ошибки (

помогите пожалуйста написать правильно цикл
думаю ошибка банальная, но не могу её найти

p.s. надеюсь понятно объяснил проблему.
ep1ckby вне форума Ответить с цитированием
Старый 15.10.2020, 22:00   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Особо не вглядывался в саму идею ифов, но сравнение на равенство пишется "==", а проверка на истинность двух условий через && (как в вашем последнем примере).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 15.10.2020, 22:16   #3
ep1ckby
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 20
По умолчанию

BDA,

а можно ли тогда так записывать ?
Код:
if ((m < m1) && (d < d1)) {
        y = y1 + 1;
    }
    if ((m < m1) && (d > d1)) {
        y = y1 + 1;
    }
    if ((m < m1) && (d == d1)) {
        y = y1 + 1;
    }
    if ((m > m1) && (d < d1)) {
        y = y1;
    }
    if ((m > m) && (d > d1)) {
        y = y1;
    }
    if ((m > m) && (d == d1)) {
        y = y1;
    }
    if ((m == m1) && (d > d1)) {
        y = y1;
    }
    if ((m == m1) && (d < d1)) {
        y = y1 + 1;
    }
    if ((m == m1) && (d == d1)) {
        cout << "С Днем Рождения!!!" << endl;
        y = y1 + 1;
    }
ведь я вывел все возможные варианты
ну наверное кроме того что m=d; m=d1; m1=d; m1=d1; хотя они несут разные значения, но код не работает (
что я делаю не так ? может что то не учел ?
ep1ckby вне форума Ответить с цитированием
Старый 15.10.2020, 22:23   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Можно рассматривать только случаи, меняющие год:
Код:
y = y1;
if (m1 > m) {
    y = y1 + 1;
} else if (m1 == m) {
    if (d1 >= d) {
        y = y1 + 1;
    }
    if (d1 == d) {
        cout << "С днем рождения!" << endl;
    }
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 15.10.2020, 22:30   #5
ep1ckby
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 20
По умолчанию

BDA,
спасибо за такое упрощение , даже не думал в таком ключе (
в итоге всё заработало я даже поменял код на ответе , = не поменял на == в одном месте и из за этого не работало )

но осталась лишь одна проблема с годами 2000 2400 2800 , программа не считает их за высокосный год , а считает за обычный , вот именно эти 3 года )
в чем может быть проблема ?)
upd: 2800 считает
ep1ckby вне форума Ответить с цитированием
Старый 15.10.2020, 22:40   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Честно говоря, не понимаю, почему в коде вычитается 1920 или 1800, если в структуре должно храниться количество лет с 1900 (т.е. вычитать нужно 1900). Второе замечание: зависит от постановки задачи, но, скорее всего, ожидается самостоятельный подсчет дней до дня рождения, а не через ctime плюшки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 15.10.2020, 22:45   #7
ep1ckby
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 20
По умолчанию

BDA,
потому что если прописать 1900 то он не будет затрагивать 1920 год
а мне нужно от 1920 до 3000 включительно и методом подбора я решил это для себя так(

upud:
буду признателен если посоветуете где почитать про самостоятельный подсчет

Последний раз редактировалось ep1ckby; 15.10.2020 в 22:52.
ep1ckby вне форума Ответить с цитированием
Старый 15.10.2020, 23:09   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Идея самостоятельного подсчета. Завести массив количества дней в месяцах [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]. Завести переменную для подсчета суммы. Пробегаться по месяцам от m1+1 до 12 и от 1 до m-1 (если день рождения уже был) или от m1+1 до m-1 (если еще не было). Складывать количество дней. Прибавить к этой сумме дни с краев (в месяце m1 вычесть уже прошедшие дни, а в месяце m просто прибавить d дней). Не забыть учитывать високосность текущего года (если цикл пройдет по февралю).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 15.10.2020 в 23:11.
BDA на форуме Ответить с цитированием
Старый 15.10.2020, 23:20   #9
ep1ckby
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 20
По умолчанию

BDA,

спасибо , как раз этим тогда и займусь)

а по поводу
Код:
tm db = { 0, 0, 0, d1, m1 - 1, y1 - 1900, 0, 0, 0 };
    tm de = { 0, 0, 0, d, m - 1, y - 1900, 0, 0, 0 };
действительно считает правильно всё , а при других значениях через раз ) но он не считает года которые ниже 1990 и если стоит задача от 1920 считать , то что делать ?
ep1ckby вне форума Ответить с цитированием
Старый 16.10.2020, 01:24   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Ну если исходить из того, что структура поддерживает года от 1900, то должно правильно считаться от него же. Вероятность, что ошибка в самой библиотеке, крайне низка. Поэтому, легче предположить, что ошибка или в коде или в неверной интерпретации результата. Чтобы это определить, выложите тогда текущий исходный код, входные данные, полученный результат работы программы и ожидаемый результат. В принципе, имеет смысл довести до ума вариант с ctime, чтобы потом сравнивать результат самостоятельного подсчета с ним.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[решено] Преобразование строки из переменной в дату через datetime.strptime - Python lazgo Python 3 28.06.2018 14:47
Цикл for...to... глюк переменной mosq Общие вопросы Delphi 15 04.03.2015 10:23
преобразование переменной даты в постоянную strannick Microsoft Office Excel 6 25.12.2011 09:14
Преобразование данных таблицы переменной в переменную xap4o PHP 4 24.02.2010 19:41
преобразование переменной AnsiString в PAnsiChar для использования в процедуре loadlibrary The Best Общие вопросы Delphi 2 12.07.2009 20:42