闲来无事,看到梁老师博客里有C课程设计的题,于是就选了一道试着做了下。

(今年课程设计给出的题目中最简单的一道)

代码里面有比较详细的注释,实现起来也很简单,额,,用到的技术有:单链表(存储节日设置),格式化读文件,time.h库应用。。大概就这些吧。

哦对了,为了做这个,特地去研究了下天干地支,,之前我可是连生肖都背不全呢(-_-! 丢人。。)

一个festivals.txt文件,放到程序(.exe)同文件夹下(比如debug文件夹下),格式如下:

10/1 国庆节 1/1 元旦节 5/1 劳动节 6/1 儿童节 7/1 建军节 8/1 建党节 9/10 教师节 11/11 光棍节

共有calendar.h和main.c两个文件,源代码是:

/******************************************************************** created: 2010/11/27 created: 27:11:2010 20:40 filename: F:/C&C++/Calendar/calendar.h file path: F:/C&C++/Calendar file base: calendar file ext: h author: ijse purpose: the calendar supports *********************************************************************/ #include <time.h> #include <string.h> #include <stdlib.h> struct stFestival{ /*定义结构体类型*/ int fMonth; int fDay; char *intro[3]; struct stFestival *next; } *ftls; /* * 从外部文件中读取节日信息 */ void readFestivalOpts() { FILE *fs; struct stFestival *head,*p; if((fs=fopen("festivals.txt","r"))==NULL) { printf("cannot open file"); exit(0); } p = (struct stFestival*)malloc(sizeof(struct stFestival)); //将读取出的数据存放到链表中 while(fscanf(fs,"%d/%d %s/n",&(p->fMonth),&(p->fDay),p->intro)!=EOF) { p->next=NULL; if(ftls==NULL) { ftls=p; head=ftls; } else { ftls->next=p; ftls=ftls->next; } p = (struct stFestival*)malloc(sizeof(struct stFestival)); } ftls=head; fclose(fs); } /* * 查询节日 */ char *getFestival(int iMonth,int iDay) { static char* rslt[3]; while(ftls!=NULL) { if(ftls->fMonth==iMonth&&ftls->fDay==iDay) { if(strlen(rslt)==0) strcpy(rslt,ftls->intro); else strcat(strcat(rslt,","),ftls->intro); } ftls=ftls->next; } return rslt; } /* * 中英文数字转换函数 */ char *albToZHnum(int i) { static char albZHNums[13][6]={"七","一","二","三","四","五","六","七","八","九","十","十一","十二"}; return albZHNums[i]; } /* * 判断是否为闰年 */ int isLeapYear(int iYear) { if((iYear%4==0 && iYear%100!=0) || (iYear%400==0)) return 1; else return 0; } /* * 获得生肖 */ char *getLunarName(int iYear) { static char rslt[3]; int t; static char animal[12][3]={"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"}; t=(iYear+8)%12; strcpy(rslt,animal[t]); return rslt; } /* * 获得天干地支 */ char *getZhYearName(int iYear) { static char rslt[6]; /*用来表示干支的字符变量*/ int a,b; static char tg[10][3]={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"}; static char dz[12][3]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戍","亥"}; a=(iYear-1804)%10; /*以1804年为参考年份,1804年是甲子年*/ b=(iYear-1804)%12; strcpy(rslt,tg[a]); strcat(rslt,dz[b]); return rslt; } /* * 得到一年中某月的天数 */ int getMonthDays(int imonth,int isLpYear) { int monthDay; switch(imonth) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: monthDay =31; break; case 2: if(isLpYear=1) monthDay =29; else monthDay =28; break; default: monthDay =30; break; } return monthDay; } /* * 得到星期数 */ int getDayOfWeek(int iDay,int iMonth, int iYear) { struct tm *ptr; time_t lt; lt=time(NULL); ptr=localtime(<); ptr->tm_year=iYear-1900; ptr->tm_mon=iMonth-1; ptr->tm_mday=iDay; lt=mktime(ptr); ptr=localtime(<); return ptr->tm_wday; } /* * 打印一个月份 */ int printMonth(int iYear,int iMonth) { int islpYear,monthDay,i,x,sum,a; islpYear=isLeapYear(iYear); //是否闰年 monthDay=getMonthDays(iMonth,islpYear);//得到当月天数 sum=0; //下面的循环是计算从公元一年到该年的上一年的所有天数 //公元一年第一天为星期一 for(i=1;i<iYear;i++) { if(isLeapYear(i)) { sum=sum+366; } else sum=sum+365; } //接下来要计算从该年1月到用户输入月份的上一个月的天数 for(x=1; x<iMonth; x++) { sum += getMonthDays(x,islpYear); } a=sum % 7; printf("/n===%s月============================================",albToZHnum(iMonth)); printf("/nSun/tMon/tTue/tWed/tThu/tFri/tSat/n"); for(x=1;x<=monthDay+a;x++) { if(x<=a) printf("/t"); else printf("%d/t",x-a); if(x%7==0) printf("/n"); } printf("/n"); return 0; }

/******************************************************************** created: 2010/11/27 created: 27:11:2010 20:32 filename: F:/C&C++/Calendar/main.c file path: F:/C&C++/Calendar file base: main file ext: c author: ijse WebSite: http://www.ijser.cn statement: 1. warnings是因为中文的原因,没有做转码处理,不影响运行。 2. 节日设定存放在外部文件中,与程序同文件夹. 3. 节日设定文件格式为:月/日 节日名字 4. 节日可重复设定,输出时用,隔开。 *********************************************************************/ #include <stdio.h> #include "calendar.h" int main() { int iYear,iMonth,iDay; int i; //Section 1 printf("Input the Year:"); scanf("%d",&iYear); printf("The calendar of the Year %d.",iYear); printf("/n %s%s年",getZhYearName(iYear),getLunarName(iYear)); for(i=1;i<=12;++i) printMonth(iYear,i); //Section 2 printf("Input the Month:"); scanf("%d",&iMonth); printf("The calendar of the Year %d and the month %d",iYear,iMonth); printMonth(iYear,iMonth); //Section 3 readFestivalOpts(); printf("Input the Day:"); scanf("%d",&iDay); printf("%d年%d月%d号是星期%s %s/n",iYear,iMonth,iDay,albToZHnum(getDayOfWeek(iDay,iMonth,iYear)),getFestival(iMonth,iDay)); return 0; }

有不懂的可以一起来讨论,希望学弟学妹们认真学习C,认真做课程设计哈~~!

PS: 运行中截图:

。。。。。。。

C语言课程设计日历题目相关推荐

  1. c语言课程设计 日历显示,c语言课程设计_电子日历.doc

    c语言课程设计_电子日历 第 PAGE \* Arabic \* MERGEFORMAT 14 页第 PAGE \* Arabic \* MERGEFORMAT 14 页 课 程 设 计( 论 文 ) ...

  2. c语言课程设计的题目有哪些,C语言课程设计题目

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 18.学生管理系统(限最多2人完成) 使用下面的数据,用C设计一个简单的学籍管理系统,实现出最基本的功能. 学生基本信息文件(A.TXT)及其内容:A.T ...

  3. c 语言课程设计日历,C++课程设计(日历的实现)

    万年历的C++实现 1.课程设计目的 编写具有以下功能的C++程序: (1).输入一个年份,输出是在屏幕上显示该年的日历. 假定输入的年份在1940-2040年之间. (2).输入年月,输出该月的日历 ...

  4. 计算器软件C语言课程设计实验报告,c简单计算器实验报告_相关文章专题_写写帮文库...

    时间:2019-05-15 12:55:15 作者:admin 计算器实验报告 班级: 07计本(1)班 姓名: 王林 学号: 20706031047 指导老师: 韩静 一. 需求分析 (1)制作一个 ...

  5. 计算机专业课程设计报告c语言,计算机程序设计(C语言)课程设计报告.doc

    计算机程序设计(C语言)课程设计报告.doc 计算机程序设计C语言课程设计报告题目电子动画时钟 学院 机电工程学院专业 班级090109班学号 姓名 指导教师 设计日期 一.概述选题背景 随着社会的进 ...

  6. c语言大作业书店图书管理系统,c语言课程设计 书店管理系统.pdf

    c语言课程设计 书店管理系统 计算机程序设计(C语言) 课程设计报告 题目:图书管理系统 学院: 专业: 班级: 学号: 姓名: 指导教师: 设计日期:2013年06月24 日 一.选题背景: 设计一 ...

  7. c语言大作业书店图书管理系统,C语言课程设计书店管理系统.pdf

    计算机程序设计(C语言) 课程设计报告 题目:图书管理系统 学院: 专业: 班级: 学号: 姓名: 指导教师: 设计日期:2013年06月24 日 一.选题背景: 设计一个图书管理系统,管理员通过登陆 ...

  8. c语言编辑机器人行走,c语言课程设计报告-步行机器人.doc

    c语言课程设计报告-步行机器人 PAGE 第 PAGE \* Arabic \* MERGEFORMAT 17 页第 PAGE \* Arabic \* MERGEFORMAT 17 页第 PAGE ...

  9. c语言程序游戏玩家管理系统,c语言程序课程设计--游戏玩家管理系统及C语言课程设计_简易计算器.doc...

    湖南涉外经济学院 课程设计报告 课程名称: C语言课程设计 报告题目: 游戏玩家管理系统 学生姓名: ** ** 所在学院: 信息科学与工程学院 专业班级: 电科 学生学号: **** ****** ...

最新文章

  1. python格式化输出的三种形式
  2. 埃夫特机器人回零偏差太大_新松、华中数控、埃斯顿、埃夫特国内主流机器人厂商近年最新动态...
  3. CF 295A - Greg and Array 差分數列
  4. mysql迁移到mariadb_项目从MYSQL迁移至MARIADB教程
  5. 机器学习算法数学基础之 —— 线性代数篇(2)
  6. 中国的码农们,沉睡了20年,该醒醒了
  7. Uncaught RangeError: Maximum call stack size exceeded 超出最大调用值(个人解释)
  8. 使用ResourceHacker以命令行方式更新应用程序图标
  9. ElasticHD Windows环境下安装
  10. 熊猫学猿--sql查询
  11. 基于SSM+Layui图书借阅管理系统设计
  12. matlab 求股票斜率,股票线性回归斜率公式
  13. 我的世界java版骨头指令_我的世界:如何调出“啃骨头”隐藏皮肤?1个没人知道的mc彩蛋...
  14. 36氪独家|「秦汉胡同」完成1亿元A轮融资,将发力线上内容产品和女性生活学习服务社群...
  15. 记录一次利用pn532进行学校水卡改余额过程
  16. 技术杂谈-再谈软硬SDN(1)
  17. 再见2022,你好2023:八年程序媛老兵的践行、思考与展望
  18. 简记_ LDO基础知识
  19. E-R图【一个萝卜一个坑】
  20. PHP 支付PC端扫码支付、APP接口调起支付宝支付、微信公众号接入支付宝支付

热门文章

  1. githug通关部分黏贴(git代码练习)
  2. xshell中黏贴时,出现vi乱行问题
  3. 安全好用的快充头,iPhone 13的好搭档,RAVPOWER 20W充电器上手
  4. 常见的防御DDoS攻击的方式有哪些?
  5. No.04 色散补偿 O-FDE算法 交叠频域均衡算法 MATLAB Python 代码实现
  6. matlab 三分之一倍频程,三分之一倍频程谱
  7. 图灵、冯诺依曼谁更牛?
  8. Cadence orcad 导出网表(.asc文件)
  9. Linux ping命令
  10. Visual Studio Code 安装Vim插件后,复制(Ctrl C)等快捷键变成Insert 模式的问题