用c语言编写日期与星期的计算

img

日期与星期的计算:
已知1990年元旦是星期一,用函数实现:
( 1)求1990年元旦到2019年元旦中有几个元旦是星期一(包含1990年元旦星期一)。
( 2) 输出1990年到2019年元旦为星期一的年份。
(3)从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几



#include <stdio.h>

// 判断是否是闰年函数,如果是则返回 1,否则返回 0
int isLeap(int year) {
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 1 : 0;
}

// 统计1990年到2019年元旦为星期一的年份,并输出结果
void countNewYearMondays() {
    int num = 0; // 统计星期一的个数
    int year, days, y, weekday;
    printf("1990年到2019年元旦为星期一的年份:\n");
    for(year = 1990; year <= 2019; year++) {
        days = 0; // 当前年份距离1990年元旦的天数
        for(y = 1990; y < year; y++) {
            if(isLeap(y)) 
            {days += 366;}
            else
            {days += 365;}
        }
        weekday = (days + 1) % 7; // 当前年份的元旦是星期几
        if(weekday == 1) {
            printf("\t%d", year); // 输出符合条件的年份
            num++; // 统计个数
        }
    }
    printf("\n\n1990年到2019年元旦共有%d个元旦是星期一\n\n", num); // 输出总数
}

// 根据输入的日期,计算出这一天是星期几,并输出结果
void getWeekDay() {
    int year, month, day, days, y, m;
    printf("请输入一个日期(格式:XXXX XX XX,如:2023 05 11):");
    scanf("%d %d %d", &year, &month, &day);
    days = 0;
    // 计算输入年份距离1990年元旦的天数days
    for(y = 1990; y < year; y++) {
        if(isLeap(y))
        {days += 366;}
        else {days += 365;}
    }
    // 计算到输入月份最后一天的天数days
    for(m = 1; m < month; m++) {
        switch(m) {
        case 4:
        case 6:
        case 9:
        case 11:
        days += 30;
        break;
        case 2:
        days += (isLeap(year) ? 29 : 28);
        break;
        default:
        days += 31;
        }
    }
    days += day - 1; // 加上输入的天数
    int weekday = (days + 1) % 7; // 计算是星期几
    // 根据结果输出星期几
    switch(weekday) {
        case 0:
        printf("%d年%d月%d日是星期日\n", year, month, day);
        break;
        case 1:
        printf("%d年%d月%d日是星期一\n", year, month, day);
        break;
        case 2:
        printf("%d年%d月%d日是星期二\n", year, month, day);
        break;
        case 3:
        printf("%d年%d月%d日是星期三\n", year, month, day);
        break;
        case 4:
        printf("%d年%d月%d日是星期四\n", year, month, day);
        break;
        case 5:
        printf("%d年%d月%d日是星期五\n", year, month, day);
        break;
        default:
        printf("%d年%d月%d日是星期六\n", year, month, day);
    }
}

// 主函数
int main() {
    countNewYearMondays(); // 统计1990年到2019年元旦为星期一的年份
    getWeekDay(); // 输入日期,计算是星期几
    return 0; 
}

我用基姆拉尔森给你实现:

#include <stdio.h>

void countMondays() {
    int count = (1 + 2 * 365 + (365 / 4) - (365 / 100) + (365 / 400) + 1) % 7;
    int days = 365;
    int leap = 0;
    int countMondays = 0;
    for (int i = 1990; i <= 2019; i++) {
        count = (count + (i % 4 == 0 && i % 100 != 0 || i % 400 == 0 ? 2 : 1)) % 7;
        if (count == 1) {
            countMondays++;
        }
    }
    printf("1990年元旦到2019年元旦中有%d个元旦是星期一\\n\\n", countMondays);
}

void printMondays() {
    printf("1990年到2019年元旦为星期一的年份为:");
    for (int year = 1990; year <= 2019; year++) {
        int count = (1 + 2 * 365 + (365 / 4) - (365 / 100) + (365 / 400) + 1) % 7;
        for (int i = 1990; i < year; i++) {
            count = (count + (i % 4 == 0 && i % 100 != 0 || i % 400 == 0 ? 2 : 1)) % 7;
        }
        if (count == 1) {
            printf("%d ", year);
        }
    }
    printf("\\n\\n");
}

void calculateWeekday() {
    int year, month, day;
    printf("请输入日期:");
    scanf("%d-%d-%d", &year, &month, &day);
    int count = (1 + 2 * 365 + (365 / 4) - (365 / 100) + (365 / 400) + 1) % 7;
    for (int i = 1990; i < year; i++) {
        count = (count + (i % 4 == 0 && i % 100 != 0 || i % 400 == 0 ? 2 : 1)) % 7;
    }
    int days = 0;
    for (int i = 1; i < month; i++) {
        if (i == 2) {
            days += (year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? 29 : 28);
        } else if (i == 4 || i == 6 || i == 9 || i == 11) {
            days += 30;
        } else {
            days += 31;
        }
    }
    days += day;
    count = (count + days - 1) % 7;
    printf("%d年%d月%d日是星期%d\\n\\n", year, month, day, count);
}

int main() {
    countMondays();
    printMondays();
    calculateWeekday();
    return 0;
}


#include <stdio.h>

// 函数声明
int isLeapYear(int year);
int countLeapYears(int year);
int getDayOfWeek(int year, int month, int day);
int countMondays(int startYear, int endYear);
void printMondays(int startYear, int endYear);
int getWeekday(int year, int month, int day);

int main() {
    int startYear = 1990;
    int endYear = 2019;

    // 问题 1:求1990年元旦到2019年元旦中有几个元旦是星期一
    int mondaysCount = countMondays(startYear, endYear);
    printf("从1990年元旦到2019年元旦中有 %d 个元旦是星期一\n", mondaysCount);

    // 问题 2:输出1990年到2019年元旦为星期一的年份
    printf("1990年到2019年元旦为星期一的年份为:\n");
    printMondays(startYear, endYear);

    // 问题 3:从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几
    int year, month, day;
    printf("请输入日期(格式:年 月 日):");
    scanf("%d %d %d", &year, &month, &day);
    int weekday = getWeekday(year, month, day);
    printf("该日期是星期%d\n", weekday);

    return 0;
}

// 判断是否为闰年
int isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// 计算闰年的数量
int countLeapYears(int year) {
    if (year <= 2) {
        return 0;
    } else {
        return year / 4 - year / 100 + year / 400;
    }
}

// 计算给定日期是星期几
int getDayOfWeek(int year, int month, int day) {
    // 蔡勒公式
    if (month < 3) {
        month += 12;
        year--;
    }
    int century = year / 100;
    year %= 100;
    int weekday = (year + year / 4 + century / 4 - 2 * century + 26 * (month + 1) / 10 + day - 1) % 7;
    if (weekday < 0) {
        weekday += 7;
    }
    return weekday;
}

// 计算某个时间段内元旦为星期一的数量
int countMondays(int startYear, int endYear) {
    int count = 0;
    for (int year = startYear; year <= endYear; year++) {
        if (getDayOfWeek(year, 1, 1) == 1) {
            count++;
        }
    }
    return count;
}


void printMondays(int startYear, int endYear) {
    printf("1990年到2019年元旦为星期一的年份为:\n");
    for (int year = startYear; year <= endYear; year++) {
        if (getWeekday(year, 1, 1) == 1) {
            printf("%d\n", year);
        }
    }
}

int getWeekday(int year, int month, int day) {
    int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    int totalDays = 0;
    for (int y = 1990; y < year; y++) {
        totalDays += 365;
        if (isLeapYear(y)) {
            totalDays += 1;
        }
    }

    for (int m = 1; m < month; m++) {
        totalDays += daysInMonth[m];
        if (m == 2 && isLeapYear(year)) {
            totalDays += 1;
        }
    }

    totalDays += day;

    int weekday = (totalDays + 1) % 7; // 元旦是星期一,所以需要加1
    return weekday;
}
该回答引用ChatGPT
题目要求用C语言编写日期与星期的计算,包括以下三个问题:

1.求1990年元旦到2019年元旦中有几个元旦是星期一(包含1990年元旦星期一)。

2.输出1990年到2019年元旦为星期一的年份。

3.从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几。

下面是代码实现:

c
#include <stdio.h>

// 1.计算1990年元旦到2019年元旦中有几个元旦是星期一
int countMondays() {
int year, day, i, count = 0;
int month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 计算1990年元旦到2018年12月31日的天数
day = (365 * 28 + 7) % 7; // 初始星期一
for (year = 1990; year <= 2018; year++) {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
month_days[1] = 29; // 闰年二月29天
} else {
month_days[1] = 28; // 平年二月28天
}
for (i = 0; i < 12; i++) {
if (day == 0 && i == 0) { // 元旦是星期一
count++;
}
day = (day + month_days[i] % 7) % 7;
}
}
if (day == 0) { // 2019年元旦是星期一
count++;
}
return count;
}

// 2.输出1990年到2019年元旦为星期一的年份
void printMondays() {
int year, day, i;
int month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 计算1990年元旦到2018年12月31日的天数
day = (365 * 28 + 7) % 7; // 初始星期一
for (year = 1990; year <= 2018; year++) {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
month_days[1] = 29; // 闰年二月29天
} else {
month_days[1] = 28; // 平年二月28天
}
for (i = 0; i < 12; i++) {
if (day == 0 && i == 0) { // 元旦是星期一
printf("%d年
", year);
}
day = (day + month_days[i] % 7) % 7;
}
}
if (day == 0) { // 2019年元旦是星期一
printf("2019年
");
}
}

// 3.从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几
void printWeekday() {
int year, month, day, i, count = 0;
int month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int weekday[7] = {'日', '一', '二', '三', '四', '五', '六'};
printf("请输入日期(格式: 年 月 日,如2019 1 1): ");
scanf("%d %d %d", &year, &month, &day);
// 计算1990年元旦到该日期的天数
for (i = 1990; i < year; i++) {
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
count += 366; // 闰年366天
} else {
count += 365; // 平年365天
}
}
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
month_days[1] = 29; // 闰年二月29天
} else {
month_days[1] = 28; // 平年二月28天
}
for (i = 0; i < month - 1; i++) {
count += month_days[i];
}
count += day - 1; // 日期是从0开始计数的,所以要减1
printf("星期%c
", weekday[count % 7]);
}

int main() {
// 1.计算1990年元旦到2019年元旦中有几个元旦是星期一
printf("1990年元旦到2019年元旦中有%d个元旦是星期一
", countMondays());
// 2.输出1990年到2019年元旦为星期一的年份
printf("1990年到2019年元旦为星期一的年份有:
");
printMondays();
// 3.从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几
printWeekday();
return 0;
}


代码解析:

1.计算1990年元旦到2019年元旦中有几个元旦是星期一

按照题意,我们需要计算出从1990年元旦到2019年元旦的总天数,并逐一判断每年的1月1日是否为星期一。为了方便计算星期几,我们可以用一个变量记录当前日期是星期几,0代表星期日,1代表星期一,以此类推,到6代表星期六。可以用余数来算出每年1月1日是星期几,例如1990年元旦是星期一,那么从1991年开始每多一年就会多365或366天,加上上一年的余数再对7取余就得到了新一年1月1日的星期。

2.输出1990年到2019年元旦为星期一的年份

同样是计算每一年的1月1日是星期几,但是不需要记录星期几的具体值,而是直接输出满足条件的年份。如果某年1月1日是星期一,那么这一年就符合条件,直接输出即可。

3.从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几

根据输入的年月日计算出该日期到1990年元旦的天数,再对7取余就可以得到该日期是星期几。注意闰年的判断及二月份的天数需要特别处理。最后输出星期几需要将对应的数字转化为中文字符。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
以下是用C语言编写日期与星期的计算的代码:

#include <stdio.h>

// 计算某个年份的元旦是星期几
int getDayOfWeek(int year) {
    int days = 0;
    for (int i = 1990; i < year; i++) {
        if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)) {
            days += 366;
        } else {
            days += 365;
        }
    }
    return (days + 1) % 7;
}

// 计算某个年份中星期一的个数
int getMondayCount(int year) {
    int dayOfWeek = getDayOfWeek(year);
    int days = 0;
    if (dayOfWeek == 1) {
        days++;
    }
    for (int i = year + 1; i <= 2019; i++) {
        if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)) {
            days += 366;
        } else {
            days += 365;
        }
    }
    int mondayCount = (days + dayOfWeek) / 7;
    return mondayCount;
}

// 输出某个年份中元旦是星期一的年份
void printMondayYears() {
    for (int year = 1990; year <= 2019; year++) {
        int dayOfWeek = getDayOfWeek(year);
        if (dayOfWeek == 1) {
            printf("%d\n", year);
        }
    }
}

// 计算某个日期是星期几
void getDayOfWeekByDate(int year, int month, int day) {
    int days = 0;
    for (int i = 1990; i < year; i++) {
        if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)) {
            days += 366;
        } else {
            days += 365;
        }
    }
    for (int i = 1; i < month; i++) {
        if (i == 2) {
            if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
                days += 29;
            } else {
                days += 28;
            }
        } else if (i == 4 || i == 6 || i == 9 || i == 11) {
            days += 30;
        } else {
            days += 31;
        }
    }
    days += day - 1;
    int dayOfWeek = (getDayOfWeek(year) + days) % 7;
    switch (dayOfWeek) {
        case 0:
            printf("星期日\n");
            break;
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
    }
}

int main() {
    // 求1990年元旦到2019年元旦中有几个元旦是星期一(包含1990年元旦星期一)
    int mondayCount = getMondayCount(1990);
    printf("1990年到2019年元旦中有%d个元旦是星期一\n", mondayCount);

    // 输出1990年到2019年元旦为星期一的年份
    printf("1990年到2019年元旦为星期一的年份有:\n");
    printMondayYears();

    // 从键盘输入一个日期(1990年元旦之后的日期),计算并输出该日期是星期几
    int year, month, day;
    printf("请输入一个日期(格式:年 月 日,例如:2019 5 11):\n");
    scanf("%d %d %d", &year, &month, &day);
    getDayOfWeekByDate(year, month, day);

    return 0;
}

在这个代码中,我们使用了一些基本的日期计算方法来计算日期与星期。使用getDayOfWeek函数来计算某个年份中元旦是星期几,使用getMondayCount函数来计算某个年份中星期一的个数,使用printMondayYears函数来输出某个年份中元旦是星期一的年份,使用getDayOfWeekByDate函数来计算某个日期是星期几。在main函数中,我们调用这些函数来完成题目要求的计算。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

思路:

  1. 首先,我们需要知道1990年1月1日是星期一,因此我们可以将星期一表示为0,星期二表示为1,以此类推。然后我们可以用一个变量来表示当前日期与1990年1月1日相差的天数,即偏移量。
  2. 对于第一个问题,我们可以从1990年1月1日开始,每隔7天判断一下这一天是否是元旦,如果是,且是星期一,就将计数器加1。
  3. 对于第二个问题,我们可以从1990年1月1日开始,每隔一年判断一下这一年的元旦是否是星期一,如果是,就输出这一年。
  4. 对于第三个问题,我们需要先输入年月日,然后计算该日期与1990年1月1日相差的天数,最后将偏移量对7取余即可知道该日期是星期几。

代码示例:

#include <stdio.h>

int main()
{
    int year, month, day;
    printf("请输入年月日(格式为yyyy-mm-dd):");
    scanf("%d-%d-%d", &year, &month, &day);

    // 计算该日期与199011日相差的天数
    int offset = 0;
    for (int i = 1990; i < year; i++)
    {
        // 判断该年是否是闰年
        if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
        {
            offset += 366;
        }
        else
        {
            offset += 365;
        }
    }

    // 计算该月之前的天数
    int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    {
        days_in_month[1] = 29;
    }
    for (int i = 0; i < month - 1; i++)
    {
        offset += days_in_month[i];
    }

    // 加上该月的天数
    offset += day - 1;

    // 计算星期几,0表示星期一,1表示星期二,以此类推
    int weekday = (offset + 1) % 7;

    printf("该日期是星期%d\n", weekday);

    // 计算1990年到2019年元旦中有几个元旦是星期一
    int count = 0;
    for (int i = 1990; i <= 2019; i++)
    {
        int days = 0;
        for (int j = 1990; j < i; j++)
        {
            // 判断该年是否是闰年
            if ((j % 4 == 0 && j % 100 != 0) || j % 400 == 0)
            {
                days += 366;
            }
            else
            {
                days += 365;
            }
        }
        if ((days + 1) % 7 == 0)
        {
            count++;
        }
    }
    printf("1990年到2019年元旦中有%d个元旦是星期一\n", count);

    // 输出1990年到2019年元旦为星期一的年份
    printf("1990年到2019年元旦为星期一的年份为:\n");
    for (int i = 1990; i <= 2019; i++)
    {
        int days = 0;
        for (int j = 1990; j < i; j++)
        {
            // 判断该年是否是闰年
            if ((j % 4 == 0 && j % 100 != 0) || j % 400 == 0)
            {
                days += 366;
            }
            else
            {
                days += 365;
            }
        }
        if ((days + 1) % 7 == 0)
        {
            printf("%d\n", i);
        }
    }

    return 0;
}