C 语言的日期计算器程序

发布于 2024-11-09 03:29:39 字数 3057 浏览 0 评论 0原文

我正在尝试用 C 程序编写一个日期计算器,范围从 1/1/1902 到 12/31/2299,我遵循 http://en.wikipedia.org/wiki/Calculated_the_day_of_the_week 带有世纪表、月份表和日期表,但是当我尝试打印出来时,这就是我的 而不是

Enter Year, Month and Day as YYYY,M,DD
1982 4 24
Saturday1982 ,6, 24, is  6

1982 4 24 is a Saturday

我写的程序有什么问题?开关盒的位​​置?

#include <stdio.h>

int main (void)
{
    // insert code here...
    int day,month,year;

    printf("Enter Year, Month and Day as YYYY,M,DD\n");

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

    if (year >= 1901 && year <= 2299 &&
        month >= 1 && month <= 12 &&
        day >= 0 && day <= 31)
    {
        int century = year/100;

        /* making a century table for calculation*/

        switch(century)
        {
            case 19:
                century=0;
                break;
            case 20:
                century=6;
                break;
            case 21:
                century=4;
                break;
            case 22:
                century=2;
                break;
        }

        int last2_of_year= year % 100;

        /* Last 2 digits of the year entered*/

        int last2_div_4 =  last2_of_year/4;

        switch (month)
        {
            case 1:
                month=0;
                break;

            case 2:
                month=3;
                break;
            case 3:
                month=3;
                break;
            case 4:
                month=6;
                break;
            case 5:
                month=1;
                break;
            case 6:
                month=4;
                break;
            case 7:
                month=6;
                break;
            case 8:
                month=2;
                break;
            case 9:
                month=5;
                break;
            case 10:
                month=0;
                break;
            case 11:
                month=3;
                break;
            case 12:
                month=5;
                break;
         }


        int total_num = (century+ last2_of_year +day +month +last2_div_4)%7;

        switch (total_num) 
        {
            case 0:
            printf("Sunday");
                break;
            case 1:
            printf("Monday");
                break;
            case 2:
            printf("Tuesday");
                break;
            case 3:
            printf("Wednesday");
                break;
            case 4:
            printf("Thursday");
                break;
            case 5:
            printf("Friday");
                break;
            case 6:
            printf("Saturday");
                break;
        }

        printf("%d ,%d, %d, is a %d", year,month,day,total_num);
        }
        else
        {
            printf("invalid\n");
        }



    return 0;

    }

I'm trying to write a date calculator in C program with the range from 1/1/1902 to 12/31/2299, I've follow the algorithm from http://en.wikipedia.org/wiki/Calculating_the_day_of_the_week with the century table,month table and day table, but when I tried to print out, this is what I have

Enter Year, Month and Day as YYYY,M,DD
1982 4 24
Saturday1982 ,6, 24, is  6

Instead of saying 1982 4 24 is a Saturday

What is wrong in the program I wrote? The placement of the switch cases?

#include <stdio.h>

int main (void)
{
    // insert code here...
    int day,month,year;

    printf("Enter Year, Month and Day as YYYY,M,DD\n");

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

    if (year >= 1901 && year <= 2299 &&
        month >= 1 && month <= 12 &&
        day >= 0 && day <= 31)
    {
        int century = year/100;

        /* making a century table for calculation*/

        switch(century)
        {
            case 19:
                century=0;
                break;
            case 20:
                century=6;
                break;
            case 21:
                century=4;
                break;
            case 22:
                century=2;
                break;
        }

        int last2_of_year= year % 100;

        /* Last 2 digits of the year entered*/

        int last2_div_4 =  last2_of_year/4;

        switch (month)
        {
            case 1:
                month=0;
                break;

            case 2:
                month=3;
                break;
            case 3:
                month=3;
                break;
            case 4:
                month=6;
                break;
            case 5:
                month=1;
                break;
            case 6:
                month=4;
                break;
            case 7:
                month=6;
                break;
            case 8:
                month=2;
                break;
            case 9:
                month=5;
                break;
            case 10:
                month=0;
                break;
            case 11:
                month=3;
                break;
            case 12:
                month=5;
                break;
         }


        int total_num = (century+ last2_of_year +day +month +last2_div_4)%7;

        switch (total_num) 
        {
            case 0:
            printf("Sunday");
                break;
            case 1:
            printf("Monday");
                break;
            case 2:
            printf("Tuesday");
                break;
            case 3:
            printf("Wednesday");
                break;
            case 4:
            printf("Thursday");
                break;
            case 5:
            printf("Friday");
                break;
            case 6:
            printf("Saturday");
                break;
        }

        printf("%d ,%d, %d, is a %d", year,month,day,total_num);
        }
        else
        {
            printf("invalid\n");
        }



    return 0;

    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

送你一个梦 2024-11-16 03:29:39

你说:

printf("%d ,%d, %d, is a %d", year,month,day,total_num);

这将打印

L, M, N, is a P

其中 LMNP 是数字的地方。

您需要在日期名称开关之前使用printf(),并且需要删除最后的%d以及来自 printftotal_num。然后 printf 将打印出来

L, M, N, is a

,并且 name-of-days switch 中的 printf 将在同一行打印出当天的名称,为您提供

L, M, N, is a XXXXXXXXXXX

编辑地址注释

查看您的程序中的输出语句。

遇到的第一个输出语句是日期名称开关中的 printf 调用,用于打印日期名称。因此,当您的程序在给定您提到的输入的情况下运行时,将打印出的第一件事是

Saturday

然后在日期名称切换之后,下一个 printf

printf("%d ,%d, %d, is a %d", year,month,day,total_num);

因为 year1982424total_num6printf

1982, 4, 24, is a 6

与之前的 Saturday 输出在同一行输出,这意味着整个输出为

Saturday1982, 4, 24, is a 6

You say:

printf("%d ,%d, %d, is a %d", year,month,day,total_num);

That's going to print

L, M, N, is a P

where L, M, N, and P are numbers.

You need that printf() before the name-of-days switch and need to remove the final %d and the total_num from the printf. Then that printf will print

L, M, N, is a

and the printfs in the name-of-days switch will print out the name of the day on the same line, giving you

L, M, N, is a XXXXXXXXXXX

Edited to address comment:

Look at your program for output statements.

The first output statement encountered are the printf calls in the name-of-days switch that prints out the day names. So when your program runs given the input you mention, the first thing that will be printed out is

Saturday

Then after the name-of-days switch the next printf is

printf("%d ,%d, %d, is a %d", year,month,day,total_num);

Since year is 1982, month is 4, day is 24, and total_num is 6, that printf will output

1982, 4, 24, is a 6

on the same line as the previous Saturday output, which means the entire output is

Saturday1982, 4, 24, is a 6
那伤。 2024-11-16 03:29:39

看起来 @QuantumMechanic 找到了问题的根本原因,但我想建议一些更改:

    int century = year/100;

    /* making a century table for calculation*/

    switch(century)
    {
        case 19:
            century=0;
            break;

非常对使用单个变量来表示两个不同的事物持怀疑态度。这里,世纪代表了用户输入的人类可读的世纪和该世纪一周第一天的偏移量。两个变量可以提供更清晰的代码,并允许您在以后需要时重新使用世纪信息。

其次,使用 case 语句来存储月份的偏移量感觉有点……过头了:

    switch (month)
    {
        case 1:
            month=0;
            break;

        case 2:
            month=3;
            break;
        case 3:
            month=3;
            break;

这可以通过数组查找来处理:

int leap_month[] = [-1, 6, 2, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5];
int norm_month[] = [-1, 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5];

if (leap_year)
    month_offset = leap_month[month];
else
    month_offset = norm_month[month];

-1 只是为了允许使用人类友好的索引(Jan == 1)引用表格。如果您觉得更简单,请随意删除它并使用 leap_month[month-1] 或类似的方法。

Looks like @QuantumMechanic found the root cause of the problem, but I'd like to suggest a few changes:

    int century = year/100;

    /* making a century table for calculation*/

    switch(century)
    {
        case 19:
            century=0;
            break;

I'm very leery of using a single variable to represent two different things. Here, century represents both the user-input human-readable century and an offset to the first day of the week for the century. Two variables would give clearer code, and allow you to re-use the century information later, should the need arise.

Second, using a case statement to store offsets for the months feels a little ... overdone:

    switch (month)
    {
        case 1:
            month=0;
            break;

        case 2:
            month=3;
            break;
        case 3:
            month=3;
            break;

This could instead be handled with an array lookup:

int leap_month[] = [-1, 6, 2, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5];
int norm_month[] = [-1, 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5];

if (leap_year)
    month_offset = leap_month[month];
else
    month_offset = norm_month[month];

The -1 is just to allow referring to the table with human-friendly indexes (Jan == 1). Feel free to remove it and use leap_month[month-1] or similar if you find that easier.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文