Почему одна структура внутри другой обновляется, а вторая нет? - PullRequest
0 голосов
/ 21 января 2019

Я хочу обновить структуру даты и времени.Я использую пример из программирования 4-го издания Стивена Кочана:

"Напишите функцию с именем clockKeeper (), которая принимает в качестве аргумента структуру dateAndTime, как определено в этой главе. Функция должна вызывать функцию timeUpdate (), и если время достигает полуночи, функция должна вызвать функцию dateUpdate для переключения на следующий день. Пусть функция вернет обновленную структуру dateAndTime. "

Это процесс обучения для меня, и кажется, чтоЯ не совсем понимаю, как использовать структуры, кто-нибудь может показать мне, где проблема и дать краткое объяснение?Программа всегда обновляет время, но дата остается неизменной, я пытался внести изменения, но независимо от того, что я делаю, это вызывает ошибку компиляции.

#include <stdio.h>
#include <stdbool.h>

//does not work properly issues with - the date update
//Program to update date and time

struct time timeUpdate (struct time now);
struct date dateUpdate (struct date today);
struct dateAndTime  clockKeeper (struct dateAndTime  dt);

struct date
{
    int month;
    int day;
    int year;
};

struct time
{
    int hour;
    int minutes;
    int seconds;
};

struct dateAndTime 
{
    struct date   sdate;
    struct time   stime; 
};

struct dateAndTime  dt1 =
     {
         { 1, 11, 19 }, { 00, 00, 00 }
     };

bool  isLeapYear (struct date  d);
int  numberOfDays  (struct date  d);
int main(int argc, char const *argv[])
{
    printf ("Current date and time is %.2i/%.2i/%.2i "
        "%.2i:%.2i:%.2i\n",
        dt1.sdate.month, dt1.sdate.day, dt1.sdate.year,
        dt1.stime.hour, dt1.stime.minutes, dt1.stime.seconds);

    dt1 = clockKeeper (dt1);

    printf ("Updated date and time is %.2i/%.2i/%.2i "
        "%.2i:%.2i:%.2i\n\n", 
        dt1.sdate.month, dt1.sdate.day, dt1.sdate.year,
        dt1.stime.hour, dt1.stime.minutes, dt1.stime.seconds);
}

struct dateAndTime  clockKeeper (struct dateAndTime  dt)
{
     struct time  timeUpdate (struct time  now);
     struct date  dateUpdate (struct date  today);

     dt.stime = timeUpdate (dt.stime);
//looks like this is not working :(
    if ( dt.stime.hour == 0  &&  dt.stime.minutes == 0  &&
             dt.stime.seconds == 0 )
         dt.sdate = dateUpdate (dt.sdate);

        return  dt;
}

  //counting time
struct time timeUpdate (struct time now)
{
    ++now.seconds;

    if (now.seconds == 60 ) 
    {
            now.seconds = 0;
        ++now.minutes;
    }
        if( now.minutes == 60) 
        {

            now.minutes = 0;
            ++now.hour;
        }
            if( now.hour == 24) 
            {

                now.hour = 0;

            }



return now;
}

struct date dateUpdate (struct date today)
{
    struct date tomorrow;
    int numberOfDays (struct date d);

    if(today.day != numberOfDays (today))
    {
        tomorrow.day = today.day +1;
        tomorrow.month = today.month;
        tomorrow.year = today.year;
    }

    else if(today.month == 12) //end of year
    {
        tomorrow.day = 1;
        tomorrow.month = 1;
        tomorrow.year = today.year + 1;
    }
    else
    {
        tomorrow.day = 1;
        tomorrow.month = today.month + 1;
        tomorrow.year = today.year;
    }
    return tomorrow;
}

// Function to find the number of days in a month

 int  numberOfDays  (struct date  d)
{
      int days;
      bool  isLeapYear (struct date  d);

      const int   daysPerMonth[12] ={ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

      if ( isLeapYear (d) == true &&  d.month == 2 )days = 29;
       else
           days = daysPerMonth[d.month - 1];

    return days; 
} 

bool  isLeapYear (struct date  d) 

{

bool  leapYearFlag;
    if ( (d.year % 4 == 0  &&  d.year % 100 != 0)  ||d.year % 400 == 0 )
        leapYearFlag = true;   // It's a leap year

        else

        leapYearFlag = false;  // Not a leap year

return leapYearFlag; 
}

Текущий результат: текущие дата и время01/11/19 00:00:00 Обновленные дата и время: 01/11/19 00: 00: 01

Я ожидаю, что дата также будет обновлена.

1 Ответ

0 голосов
/ 21 января 2019

Почему вы говорите, что ваш код не работает? Для меня это хорошо работает

Через одну секунду после 01/11/19 00:00:00 это 01/11/19 00:00:01, день не должен меняться

если я изменю начальное время, имея:

struct dateAndTime  dt1 =
 {
     { 1, 11, 19 }, { 23, 59, 59 }
 };

, что дает:

Current date and time is 01/11/19 23:59:59
Updated date and time is 01/12/19 00:00:00

и дата изменилась так же, как и время


Как сказал Джонатан Леффлер в примечании, удалите объявление функций в функции

в clockKeeper удалить строки

  struct time  timeUpdate (struct time  now);
  struct date  dateUpdate (struct date  today);

и dateUpdate удалить строку

int numberOfDays (struct date d);

Вы уже объявили функции вверху файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...