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

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

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

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

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

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

BDA,
Так и сделаю , но вначале попробую сам через массив сделать вычисления,
по поводу ошибки - я думаю она в коде %99, судя по предыдущим моим косякам.
Спасибо за советы)
ep1ckby вне форума Ответить с цитированием
Старый 17.10.2020, 07:39   #12
ep1ckby
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 20
По умолчанию

получилось решить задачу без костыля в виде ctime и его плюшек
но не с помощью массива , а с помощью циклов и условий
Код:
#include <iostream> 
using namespace std;

int main() {
    setlocale(0, "");
    int d, m, y;
    int d1, m1, y1;
   
    cout << "Введите день и месяц рождения: ";
    cin >> d >> m;

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

    y = y1;
    if (m1 > m) {
        y = y1 + 1;
    }
    else if (m1 == m) {
        if (d1 >= d) {
            y = y1 + 1;
        }
        if (d1 == d) {
            cout << "С днем рождения!" << endl;
            return 0;
        }
    }
    
    if (d1 > 31 || d > 31) {
        cout << "Введенная вами дата неверна!";
            return 0;
    }

    if (y1 > 3001 || y1 > 3001 || y1 < 1920) {
        cout << "По условиям задания, программа работает в диапазоне от 1920 по 3000 год включительно!";
        return 0;
    }
    int diff_in_years, diff;
    int Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec;
    int A, B, Jan2, Feb2, Mar2, Apr2, May2, Jun2, Jul2, Aug2, Sep2, Oct2, Nov2, Dec2;
    if (y1 % 400 == 0 || y % 4 == 0) 
    {
        switch (m1)
        {
        case 1: {A = Jan = d1; }break;
        case 2: {A = Feb = d1 + 31; }break;
        case 3: {A = Mar = d1 + 31 + 29; }break;
        case 4: {A = Apr = d1 + 31 + 29 + 31; }break;
        case 5: {A = May = d1 + 31 + 29 + 31 + 30; }break;
        case 6: {A = Jun = d1 + 31 + 29 + 31 + 30 + 31; }break;
        case 7: {A = Jul = d1 + 31 + 29 + 31 + 30 + 31 + 30; }break;
        case 8: {A = Aug = d1 + 31 + 29 + 31 + 30 + 31 + 30 + 31; }break;
        case 9: {A = Sep = d1 + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31; }break;
        case 10: {A = Oct = d1 + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30; }break;
        case 11: {A = Nov = d1 + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31; }break;
        case 12: {A = Dec = d1 + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; }break;
            
        default: cout << "Такого месяца не существует!" << endl;
        }
    }
    else if (y1 % 100 != 0)
    {
        switch (m1)
        {
        case 1: {A = Jan = d1; }break;
        case 2: {A = Feb = d1 + 31; }break;
        case 3: {A = Mar = d1 + 31 + 28; }break;
        case 4: {A = Apr = d1 + 31 + 28 + 31; }break;
        case 5: {A = May = d1 + 31 + 28 + 31 + 30; }break;
        case 6: {A = Jun = d1 + 31 + 28 + 31 + 30 + 31; }break;
        case 7: {A = Jul = d1 + 31 + 28 + 31 + 30 + 31 + 30; }break;
        case 8: {A = Aug = d1 + 31 + 28 + 31 + 30 + 31 + 30 + 31; }break;
        case 9: {A = Sep = d1 + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31; }break;
        case 10: {A = Oct = d1 + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30; }break;
        case 11: {A = Nov = d1 + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31; }break;
        case 12: {A = Dec = d1 + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; }break;
            
        default: cout << "Такого месяца не существует!" << endl;
        }
    }

    if (y1 % 400 == 0 || y1 % 4 == 0)
    {
        switch (m)
        {
        case 1: {B = Jan2 = d; }break;
        case 2: {B = Feb2 = d + 31; }break;
        case 3: {B = Mar2 = d + 31 + 29; }break;
        case 4: {B = Apr2 = d + 31 + 29 + 31; }break;
        case 5: {B = May2 = d + 31 + 29 + 31 + 30; }break;
        case 6: {B = Jun2 = d + 31 + 29 + 31 + 30 + 31; }break;
        case 7: {B = Jul2 = d + 31 + 29 + 31 + 30 + 31 + 30; }break;
        case 8: {B = Aug2 = d + 31 + 29 + 31 + 30 + 31 + 30 + 31; }break;
        case 9: {B = Sep2 = d + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31; }break;
        case 10: {B = Oct2 = d + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30; }break;
        case 11: {B = Nov2 = d + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30+ 31; }break;
        case 12: {B = Dec2 = d + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; }break;

        default: cout << "Такого месяца не существует!" << endl;
        }
    }
    else if (y1 % 100 != 0)
    {
        switch (m)
        {
        case 1: {B = Jan2 = d; }break;
        case 2: {B = Feb2 = d + 31; }break;
        case 3: {B = Mar2 = d + 31 + 28; }break;
        case 4: {B = Apr2 = d + 31 + 28 + 31; }break;
        case 5: {B = May2 = d + 31 + 28 + 31 + 30; }break;
        case 6: {B = Jun2 = d + 31 + 28 + 31 + 30 + 31; }break;
        case 7: {B = Jul2 = d + 31 + 28 + 31 + 30 + 31 + 30; }break;
        case 8: {B = Aug2 = d + 31 + 28 + 31 + 30 + 31 + 30 + 31; }break;
        case 9: {B = Sep2 = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31; }break;
        case 10: {B = Oct2 = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30; }break;
        case 11: {B = Nov2 = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31; }break;
        case 12: {B = Dec2 = d + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; }break;

        default: cout << "Такого месяца не существует!" << endl;
        }
    }

    diff_in_years = y - y1;
    diff = (B - A) + (365 * diff_in_years) + diff_in_years;
    
    cout << endl;
    cout << "До дня рождения осталось дней:  " << diff << endl;
    cin.get(); cin.get();
    return 0;
}
как то так получается

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

Один косяк остался
если к примеру ввести 3.03 как др , а текущую дату к пример 25.02 , то високосные года работают , прибавляют по +1.


но если идет переход через год
пример 3.03 др и дата 17.10.2019 , то високосные года у программы пропадают и он считает не правильно их .

Код:
if (d1 > 31 || d > 31) {
        cout << "Введенная вами дата неверна!";
            return 0;
    }

    if (y1 > 3001 || y > 3001 || y1 < 1920) {
        cout << "По условиям задания, программа работает в диапазоне от 1920 по 3000 год включительно!";
        return 0;
на эти условия можно не смотреть , там не прописаны они для всех месяцев , а только для тех в которых 31 день , это я сам
легко исправлю.

upd: кажется я понял в чем проблема )
Код:
diff = (B - A) + (365 * diff_in_years) + diff_in_years;
нужно добавить исключение для високосного года и поменять её на diff = (B - A) + (366 * diff_in_years) + diff_in_years;

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

Сейчас в вашем решении нет циклов. Писать такие свитчи плохо - слишком много одинакового кода, можно ошибиться.
Код:
#include <iostream>
using namespace std;

int is_leap(int y)
{
    return ((y % 4 == 0) && (y % 100 != 100)) || (y % 400 == 0);
}

int main()
{
    int months[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    setlocale(0, "");
    int d, m, y;
    int d1, m1, y1;

    cout << "Введите день и месяц рождения: ";
    cin >> d >> m;

    if (m > 12 || m < 1) {
        cout << "Неверный номер месяца рождения" << endl;
        return 0;
    }

    // TODO: 29 февраля не может быть днем рождения
    if (d > months[m - 1] || d < 1) {
        cout << "Неверный номер дня рождения" << endl;
        return 0;
    }

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

    if (y1 > 3000 || y1 < 1920) {
        cout << "По условиям задания, программа работает в диапазоне от 1920 по 3000 год включительно!" << endl;
        return 0;
    }

    if (m1 > 12 || m1 < 1) {
        cout << "Неверный номер месяца" << endl;
        return 0;
    }

    int is_leap_y = is_leap(y1);

    if (d1 > months[m1 - 1] + (m1 == 2) * is_leap_y || d1 < 1) {
        cout << "Неверный номер дня" << endl;
        return 0;
    }

    int diff_days = d - d1;
    if (m1 > m || (m1 == m && d1 > d)) {
        for (int i = m1; i < 13; i++) {
            diff_days += months[i - 1] + (i == 2) * is_leap_y;
        }
        is_leap_y = is_leap(y1 + 1);
        for (int i = 1; i < m; i++) {
            diff_days += months[i - 1] + (i == 2) * is_leap_y;
        }
    } else {
        for (int i = m1; i < m; i++) {
            diff_days += months[i - 1] + (i == 2) * is_leap_y;
        }
    }

    if (diff_days) {
        cout << "До дня рождения осталось дней: " << diff_days << endl;
    } else {
        cout << "С днем рождения!" << endl;
    }

    cin.get(); cin.get();
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.10.2020, 20:27   #15
ep1ckby
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 20
По умолчанию

BDA,
Действительно циклов не было там , одни условия только .(
Надо в VS разобрать чтобы понять окончательно .
Пока не понимаю вывода
Код:
int is_leap(int y)
из главной функции (это рекурсия?)

рекурсия это вызов функции самой себя какое то кол-во раз
нужна для решения задач , аналог цикла ( у меня вот так записано в тхт файлах )

и
Код:
diff_days += months[i - 1] + (i == 2) * is_leap_y
не до конца понятна пока , но это наверное потому что только встал , а первые 2-3 часа голова плохо соображает


Большое спасибо за потраченное время и оказанную помощь , задание нашел в сети для самообучения(хотя наверное переоценил себя вначале и надо начинать с вещей попроще).
ep1ckby вне форума Ответить с цитированием
Старый 18.10.2020, 05:07   #16
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Это не рекурсия, так как функция is_leap не вызывает сама себя. Просто нужно было проверить високосность нескольких разных лет. Чтобы не писать одинаковый код несколько раз, он был помещен в отдельную функцию, а затем вызван в нужных местах. Про суммирование: просто прибавляются дни месяца с номером i (но нумерация массива с 0, а номера месяцев отсчитываются от 1), а для месяца с номером 2 прибавляется еще один день, если год високосный. Да, это уже не совсем простая задача, но в принципе можно и на такой тренироваться, просто чуть дольше разбираться с нюансами.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.10.2020, 00:15   #17
ep1ckby
Пользователь
 
Регистрация: 15.10.2020
Сообщений: 20
По умолчанию

Хорошо, в видео видел что рекомендуют книгу Стефан Рэнди Дэвис C++ для "чайников" , прочитаю его с конспектами, а то походу 30 уроков на ютубе - это не совсем та база, которая нужна.
Тему можно закрыть и спасибо за помощь.
ep1ckby вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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