课程设计题目2:万年历

1、设计2目的

选用C语言或Java语言作为编程工具。于C语言而言,领会结构化的程序设计思想,深入掌握选择控制结构、循环控制结构的应用,掌握函数的调用。于Java而言,通过查阅API,深入了解swing的相关概念及容器的使用,了解GUI中的布局管理器,掌握GUI中的事件处理机制,实现可以交互的万年历设计。

2、设计2正文

2.1 实验内容

运用C语言或Java语言编程实现一款简单万年历。要求输出的界面尽可能整齐、美观,符合万年历显示规范。具体功能如下:

  1. 输入年月日,计算相应日期是星期几。
  2. 输入年月,输出相应月份的日历。
  3. 输入年份,输出该年所有日历。
  4. 具有退出功能。

2.2 实验分析

本设计采用C语言进行编写。

根据设计要求将程序分为四个模块,分别是计算星期几、打印月历、打印年历和退出功能,并且因为年份分为闰年和平年,因此还设计了一个函数用来判断闰年和平年。

流程图

2.3 实验结果与测试

计算星期几

打印月份

打印年份

代码展示:

#include <stdio.h>
int days_of_month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

// 计算某一天是星期几
int dayOfWeek(int year, int month, int day) {
    if(year>=1900&&year<=2024&&month>=1&&month<=12&&day>=1&&day<=days_of_month[month]){   //判断日期是否合法
    if (month == 1 || month == 2) {
        month += 12;
        year--;
    }
    int c = year / 100;
    year %= 100;
    int week = year + year / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
    week = (week % 7 + 7) % 7;
    return week;
    }
    else{
    printf("日期错误,请重新输入\n");
    return 0; //函数有返回值
    }
}

// 输出某年某月的日历
void printMonth(int year, int month) {
   if(year>=1900&&year<=2024&&month>=1&&month<=12){         //判断日期是否合法
    if ((year%4==0&&year%100!=0)||year%400==0) //判断是否为闰年
        {
            days_of_month[2] = 29;
         }
    int week = dayOfWeek(year, month, 1);//一号是星期几
    printf("     %d年%d月\n", year, month);
    printf(" 日  一  二  三  四  五  六\n");
    for (int i = 0; i < week; i++)
     {
         printf("    ");//一号前面都是空格
      }
    for (int i = 1; i <= days_of_month[month]; i++)//月份天数
    {
        printf("%3d ", i);
        if ((i + week) % 7 == 0)
        {
            printf("\n");
        }
    }
    printf("\n");
        }
    else
    printf("日期错误,请重新输入\n");
}
// 输出某年的日历
void printYear(int year) {
if(year>=1900&&year<=2024){          //判断日期是否合法
    for (int i = 1; i <= 12; i ++)
        {
            printf("\n");
            printMonth(year, i );

        }
    }
    else
    printf("日期错误,请重新输入\n");
}

int main() {
    int year, month, day, week;
    while (1) {
        printf("1. 输入年月日,计算星期几\n");
        printf("2. 输入年月,输出月份日历\n");
        printf("3. 输入年份,输出该年所有日历\n");
        printf("4. 退出\n");
        int x;
        scanf("%d", &x);
        if (x==1)
            {
                printf("请输入年月日,用空格分隔:");
                scanf("%d%d%d", &year, &month, &day);
                week = dayOfWeek(year, month, day);
                switch (week)
                {
                    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;
                    case 6:
                        printf("%d年%d月%d日是星期六\n",year,month,day);
                        break;
                }
        }
        else if (x==2)
            {
                printf("请输入年月,用空格分隔:");
                scanf("%d %d", &year, &month);
                printMonth(year, month);
        }
        else if (x==3)
            {
                printf("请输入年份:");
                scanf("%d", &year);
                printYear(year);
        }
        else if (x==4)
            {
                printf("谢谢使用!");
                break;
        }
        else
        {
           printf("请输入正确的数字\n");
        }
        printf("\n");
    }

    return 0;
}

初版代码:

#include <stdio.h>

// 计算某一天是星期几
int dayOfWeek(int year, int month, int day) {
    if (month == 1 || month == 2) {
        month += 12;
        year--;
    }
    int c = year / 100;
    year %= 100;
    int week = year + year / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
    week = (week % 7 + 7) % 7;
    return week;
}
 
// 判断是否为闰年
int isLeap(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);//是则返回true
}
 
// 输出某年某月的日历
void printMonth(int year, int month) {
    int days_of_month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    if (isLeap(year)) {
        days_of_month[2] = 29;
    }
    int week = dayOfWeek(year, month, 1);
    printf("     %d年%d月\n", year, month);
    printf("Sun Mon Tue Wed Thu Fri Sat\n");
    for (int i = 0; i < week; i++) {
        printf("    ");
    }
    for (int i = 1; i <= days_of_month[month]; i++) {
            printf("%3d ", i);
        if ((i + week) % 7 == 0) {
            printf("\n");
        }
    }
    printf("\n");
}
 
// 输出某年的日历
void printYear(int year) {
    for (int i = 1; i <= 12; i ++) {
        printf("\n");
            printMonth(year, i );//调用月份
 
    }
}
 
int main() {
 
    int year, month, day, week;
    while (1) {
        printf("请选择功能:\n");
        printf("1. 输入年月日,计算星期几\n");
        printf("2. 输入年月,输出月份日历\n");
        printf("3. 输入年份,输出该年所有日历\n");
        printf("4. 退出\n");
        int choice;
        scanf("%d", &choice);
        if (choice == 1) {
            printf("请输入年月日,用空格分隔:");
            scanf("%d%d%d", &year, &month, &day);
            week = dayOfWeek(year, month, day);
            printf("%d年%d月%d日是%s\n", year, month, day,
                week == 0 ? "星期日" : week == 1 ? "星期一" : week == 2 ? "星期二" :
                week == 3 ? "星期三" : week == 4 ? "星期四" : week == 5 ? "星期五" : "星期六");
        } else if (choice == 2) {
            printf("请输入年月,用空格分隔:");
            scanf("%d%d", &year, &month);
            printMonth(year, month);
        } else if (choice == 3) {
            printf("请输入年份:");
            scanf("%d", &year);
            printYear(year);
        } else if (choice == 4) {
            break;
        } else {
            printf("输入无效,请重试\n");
        }
    }
 
    return 0;
}

 

八、心得体会 1. 目前流行的计算机日历程序,比较典型的是Windows各版本中的日历程序以及基础于该程序所开发的各种应用程序中的日历程序。然而,这些程序都千篇一律的局限在一个很短的时间范围内。(Windows各个版本一般都局限在1980年至2099年这一范围内),但是,在很多情况下,特别是在众多的科学研究领域中,一个时间跨度较大的日历程序是很有参考价值的。C程序设计语言充分发挥了其自身无与伦比的优越性,用极短的程序文本填补了这一领域的空白,同时用铁的事实强有力的告诉世人:C程序设计语言作为计算机语言家族的新生事物,其发展前景是极为广阔的。 2. 经过上一个学期对《C程序设计》的学习,我们学习了理论知识,了解了C语言程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。通过课程设计,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。 3. 通过对c语言万年历的设计进一步的巩固了用c语言编写程序,并且有利于更好的掌握c语言! 4. 在万年历的编写过程中也体会到了做事情一顶要细心、认真。更加知道了要掌握好基础知识。还有体会到了成功的感觉!在万年历的设计过程中更加体会到了团队合作的重要性,“一个诸葛亮比不上三个臭皮匠。”知道了只有团队合作才会更好的完成设计!也体会到以后在工作中团队合作的必要性和重要性! 5. 通过本项课程设计也培养了我独立思考、 综合运用所学有关相应知识的能力,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关! 6. 由于C语言是近年在国内外得到迅速推广应用的一种语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。通过这次的c语言程序设计更加了解了c语言的好处和其可用性! 7. 在这次课程设计中也知道了自己的动手能力不强有待进一部的提高!在设计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好该程序的想法!在设计过程中的一次次设计错误增加了我放弃的想法!不过经过大家的努力终于完成了课程设计!完成该程序后想起自己以前的每一次对自己失去信心,就觉得并不是在知识掌握上打败了,而是自己对自己缺乏信心!只要自己对自己不失去信心相信就可以完成那些以前认为完成不了的事情!也让我懂得了要想成功首先就必须有很强的自信心!懂得了自己以后要在做任何事情时都要自信!当自己都不相信自己能够成功时还可能会获得成功吗?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还没有名字哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值