gpt4 book ai didi

c - 使用文件存储日历

转载 作者:行者123 更新时间:2023-11-30 14:49:15 26 4
gpt4 key购买 nike

我对 C 有点陌生。我正在制作一整年的日历并将其存储到文件中。我的主要问题是,每当我尝试创建文件时,它都会显示为空白。我已经尝试弄清楚这个问题有一段时间了,最​​后决定问一下。有人可以告诉我我做错了什么吗?提前致谢!

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

#define MIN_YEAR 2000
#define MAX_YEAR 3000
#define JANUARY 1
#define FEBRUARY 2
#define MARCH 3
#define APRIL 4
#define MAY 5
#define JUNE 6
#define JULY 7
#define AUGUST 8
#define SEPTEMBER 9
#define OCTOBER 10
#define NOVEMBER 11
#define DECEMBER 12

bool getContinueChoice();
int getYear ();
int getStartingDay (int year);
bool isLeapYear (int year);
void makeFile (int year, int startingDay);
void makeMonthHeading (int month, int year, FILE *file);
int getNumberOfDays (int month, int year);

int main()
{
int startingDay,
year;

printInstructions();

while(getContinueChoice() == true)
{
year = getYear();
startingDay = getStartingDay(year);
makeFile(year, startingDay);
printf("\nCalendar made for the year %d.\n", year);
printf("Look for the file called file.txt to see it.\n");
}

printGoodbye();

return 0;
}

bool getContinueChoice()
{
char getChoice;
bool choice;

scanf(" %c", &getChoice);

while(getChoice != 'y' || 'n')
{
printf("\n***************************************\n");
printf("* Error: That was not a (y/n) answer. *\n");
printf("***************************************\n\n");
printf("Would you like to print a calendar? (y/n): ");
scanf(" %c", &getChoice);
}

if(getChoice == 'y')
{
choice = true;
}
else
{
choice = false;
}

return choice;
}

int getYear()
{
int userYear;

printf("\nPlease enter a year.\n");
scanf("%d", &userYear);

return userYear;
}

int getStartingDay(int year)
{
int firstDay;

firstDay = (((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) +
((year - 1) / 400) + 1) % 7;

return firstDay;
}

bool isLeapYear(int year)
{
bool leapYear;

if((!(year % 4) && (year % 100)) || !(year % 400))
{
leapYear = true;
}

return leapYear;
}

void makeFile(int year, int startingDay)
{
int daysInMonth;
FILE *file;

file = fopen("file.txt","w");

for(int month = JANUARY; month <= DECEMBER; month++)
{
makeMonthHeading(month, year, file);

fprintf(file, "SUN MON TUE WED THU FRI SAT\n");

for(int day = 1; day <= 1 + startingDay * 5; day++)
{
printf(" ");

daysInMonth = getNumberOfDays(month, year);

for(int days = 1; days <= daysInMonth; days++)
{
fprintf(file, "%2d", days);

if((days + startingDay) % 7 > 0)
{
printf(" ");
}
else
{
printf("\n");
}
}
}
}

printf("Calendar made for the year %d", year);
printf("\nLook for the file called file.txt to see it.\n\n");

getContinueChoice();

return;

}

void makeMonthHeading(int month, int year, FILE *file)
{
if(month == JANUARY)
{
fprintf(file, "JANUARY %d\n", year);
}
else if(month == FEBRUARY)
{
fprintf(file, "\nFEBRUARY %d\n", year);
}
else if(month == MARCH)
{
fprintf(file, "\nMARCH %d\n", year);
}
else if(month == APRIL)
{
fprintf(file, "\nAPRIL %d\n", year);
}
else if(month == MAY)
{
fprintf(file, "\nMAY %d\n", year);
}
else if(month == JUNE)
{
fprintf(file, "\nJUNE %d\n", year);
}
else if(month == JULY)
{
fprintf(file, "\nJULY %d\n", year);
}
else if(month == AUGUST)
{
fprintf(file, "\nAUGUST %d\n", year);
}
else if(month == SEPTEMBER)
{
fprintf(file, "\nSEPTEMBER %d\n", year);
}
else if(month == OCTOBER)
{
fprintf(file, "\nOCTOBER %d\n", year);
}
else if(month == NOVEMBER)
{
fprintf(file, "\nNOVEMBER %d\n", year);
}
else if(month == DECEMBER)
{
fprintf(file, "\nDECEMBER %d\n", year);
}

return;
}

int getNumberOfDays(int month, int year)
{
int monthDays;

if(month == JANUARY)
{
monthDays = 31;
}
else if(month == FEBRUARY)
{
if(isLeapYear(year) == true)
{
monthDays = 29;
}
else
{
monthDays = 28;
}
}
else if(month == MARCH)
{
monthDays = 31;
}
else if(month == APRIL)
{
monthDays = 30;
}
else if(month == MAY)
{
monthDays = 31;
}
else if(month == JUNE)
{
monthDays = 30;
}
else if(month == JULY)
{
monthDays = 31;
}
else if(month == AUGUST)
{
monthDays = 31;
}
else if(month == SEPTEMBER)
{
monthDays = 30;
}
else if(month == OCTOBER)
{
monthDays = 31;
}
else if(month == NOVEMBER)
{
monthDays = 30;
}
else if(month == DECEMBER)
{
monthDays = 31;
}

return monthDays;
}

最佳答案

您在同一行有两个问题:

while(getChoice != 'y' || 'n')
  • 这并不像你想象的那样。让我们看一个示例,其中 getChoice = 'a'

    第一个操作 getChoice != 'y' 将计算为 TRUE,因为 'a' != 'y'。请记住,您将从该操作中得到TRUE

    现在,你只剩下TRUE || 'n' 始终为 TRUE

    因此,您的 while 条件将始终为 TRUE,这就是您陷入该循环的原因。

如果你解决这个问题

while((getChoice != 'y') || (getChoice != 'n'))

您将意识到该行的第二个问题,这是您的逻辑。

  • 想象一下,如果用户输入'y'。然后会发生什么?

    (getChoice != 'y') 将为 FALSE,但 (getChoice != 'n') 将为 TRUE,因此您的 while 条件将为 TRUE,并且您将再次陷入该循环。

    考虑一下其他场景,然后你会得出结论,你需要使用 && 而不是 ||

因此,将该行更改为:

while((getChoice != 'y') && (getChoice != 'n'))

此外,正如@purec所说,您需要在完成文件后fclose()该文件。

关于c - 使用文件存储日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49760762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com