Я работаю с программой, которая обновляет введенную дату и обновляет ее. Принимая во внимание дней в месяце и будет ли это високосный год, и т.д.Я правильно использовал указатели в функции updateDate?
Я пытаюсь упражнение в указателях главе «Программирование в C»:
«Учитывая определение date
структуры, как определено в этой главе напишите функцию, называемую dateUpdate()
, которая принимает указатель на структуру date
в качестве аргумента и обновляет структуру на следующий день (см. Программу 8.4). "
Не могли бы вы рассказать мне, если бы я сделал то, что было задано?
Это исходный код:
#include <stdio.h>
#include <stdbool.h>
struct date
{
int month;
int day;
int year;
};
struct date dateUpdate (struct date today);
int numberOfDays (struct date d);
bool isLeapYear(struct date d);
int main (void)
{
struct date thisDay, nextDay;
printf("Enter today's date (mm dd yyyy) : ");
scanf("%i%i%i", &thisDay.month, &thisDay.day, &thisDay.year);
nextDay = dateUpdate(thisDay);
printf("Tomorrow's date is %i/%i/%.2i.\n", nextDay.month, nextDay.day, nextDay.year % 100);
return 0;
}
struct date dateUpdate (struct date today)
{
struct date tomorrow;
int numberOfDays (struct date d);
if(today.day != numberOfDays (today))
{
tomorrow = (struct date) {today.month, today.day + 1, today.year};
}
else if(today.month == 12)
{
tomorrow = (struct date) {1, 1, today.year + 1};
}
else
{
tomorrow = (struct date) {today.month + 1, 1, today.year};
}
return tomorrow;
}
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) && 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 % d.year % 100 != 0) || d.year % 400 == 0)
{
leapYearFlag = true;
}
else
{
leapYearFlag = false;
}
return leapYearFlag;
}
А вот моя попытка использовать указатели в updateFunction
:
#include <stdio.h>
#include <stdbool.h>
struct date
{
int month;
int day;
int year;
};
struct date dateUpdate (struct date* today);
int numberOfDays (struct date d);
bool isLeapYear(struct date d);
int main (void)
{
struct date thisDay, nextDay, *datePtr;
printf("Enter today's date (mm dd yyyy) : ");
scanf("%i%i%i", &thisDay.month, &thisDay.day, &thisDay.year);
datePtr = &thisDay;
nextDay = dateUpdate(datePtr);
printf("Tomorrow's date is %i/%i/%.2i.\n", nextDay.month, nextDay.day, nextDay.year % 100);
return 0;
}
struct date dateUpdate (struct date* today)
{
struct date tomorrow;
int numberOfDays (struct date d);
if(today->day != numberOfDays (*today))
{
tomorrow = (struct date) {today->month, today->day + 1, today->year};
}
else if(today->month == 12)
{
tomorrow = (struct date) {1, 1, today->year + 1};
}
else
{
tomorrow = (struct date) {today->month + 1, 1, today->year};
}
return tomorrow;
}
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) && 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 % d.year % 100 != 0) || d.year % 400 == 0)
{
leapYearFlag = true;
}
else
{
leapYearFlag = false;
}
return leapYearFlag;
}
Сейчас обе программы компиляции и, кажется, для правильной работы.
Я не совсем понимаю ваш вопрос.Но чтобы сделать указатель на структуру, вы будете делать данные структуры * завтра; И везде у вас есть оператор точки, просто введите его в оператор стрелки ->. Пример: вместо завтрашнего дня сделать это завтра-> день; –
Моя вина, позвольте мне переписать этот автокаталог вопроса. – gloopit
Вы пробовали? –