2

该程序应该返回输入日期的星期几。无效的日期之一是 01012000。根本没有返回任何内容。但在其他一些闰年,可以计算出三月的第一天。有时看似随机的日期也不起作用。我不知道如何解决这个问题。此外,我应该编写计算“daynumber”的部分,然后稍后再调用它,所以我不确定我是否做对了。

对不起初学者的问题,这是我的第一个 C 程序。

#include<stdio.h>
#include<math.h>
int main()
{
int day, month, year, lastday, dayname, daynumber, input, d;

//Determine the last day of user specified month

printf("Enter date: ddmmyyyy:\n");
scanf("%d", &input);

day = input/1000000;
month = (input/10000) % 100;
year = input % 10000;

if (month == 1 || month == 3 || month == 5 || month == 7 || 
    month == 8 || month == 10 || month == 12)
    lastday = 31;
else if (month == 4 || month == 6 || month == 9 || month == 11)
    lastday = 30;
else if ((year%4 == 0 && year%100 !=0) || year%400 == 0)
    lastday = 29;
else
    lastday = 28;

//Verify the date

if (year < 0)
    return 1;
if (month < 1 || month > 12)
    return 2;
if (day < 1 || day > lastday)
    return 3;

//Algorithm

{

int m, d, y, c, daynumber;

if (month > 3)
    m = month - 2;
else
    m = month + 10;

if (m == 11 || m == 12)
    year = year - 1;
else
    year = year;

d = day;
y = year % 100;
c = year / 100;

daynumber = (((13*m - 1)/5) + d + y + (y/4) + (c/4) - 2*c) % 7;

if (daynumber == 0)
    printf("Sunday\n");
if (daynumber == 1)
    printf("Monday\n");
if (daynumber == 2)
    printf("Tuesday\n");
if (daynumber == 3)
    printf("Wednesday\n");
if (daynumber == 4)
    printf("Thursday\n");
if (daynumber == 5)
    printf("Friday\n");
if (daynumber == 6)
    printf("Saturday\n");

}

}
4

3 回答 3

1

我看不到您的错误,但是无需扫描整数并除以,使用:

scanf("%2d%2d%4d", &day, &month, &year);

使用Sakamoto 的算法,您可以在几行中执行相同的操作:

#include <stdio.h>

static int wday(int d, int m, int y)
{
    static int offset[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};

    y -= m < 3;
    return (y + y / 4 - y / 100 + y / 400 + offset[m - 1] + d) % 7;
}

int main(void)
{
    const char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    int d, m, y;

    printf("Enter date [ddmmyyyy]: ");
    scanf("%2d%2d%4d", &d, &m, &y);
    printf("%s\n", days[wday(d, m, y)]);
    return 0;
}
于 2014-02-13T07:01:46.090 回答
1

这个

(((13*m - 1)/5) + d + y + (y/4) + (c/4) - 2*c)

可能是负面的。的结果% 7仍然是负数,并且没有打印任何内容。

只需daynumber = (daynumber + 7) % 7;在行后添加

daynumber = (((13*m - 1)/5) + d + y + (y/4) + (c/4) - 2*c) % 7;
于 2014-02-13T07:58:34.483 回答
0

您正在使用:

 printf("Enter date: ddmmyyyy:\n");
 scanf("%d", &input);

在这里,您将输入存储为 int。如果 sizeof(int) 为 2 字节,则其范围将在-32,768 到 32,767之间,并且您的输入将超出范围。为此,您应该使用long int

于 2014-02-13T06:55:47.810 回答