Я хочу обновить структуру даты и времени.Я использую пример из программирования 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
Я ожидаю, что дата также будет обновлена.