1、昆明理工大学 程序设计语言课程设计课 程 设 计课程名称: 程序设计语言课程设计 设计题目: 万年历的设计 成绩记录薄 学 院: 信息工程与自动化学院 专 业: 计算机科学与技术 年 级: 2012 级 学生姓名: 邹华宇(201210405204) 指导教师: 王翊 日 期: 2013年7月5日 教 务 处 制1、课程设计目的和要求 11.1 课程设计的目的 11.2 课程设计的要求 12、课程设计的内容 22.1 基础程序设计 22.2 综合程序设计 22.2.1 万年历的设计 22.2.2 成绩记录簿的设计 23、解决问题的思路和方法 32.1 基础程序设计思路 33.2 综合程序设计思
2、路 33.2.1 万年历的设计思路 33.2.2 成绩记录薄的设计思路 74、程序实现 94.1 基础程序设计的源代码 94.2 综合程序设计的源代码 174.2.1 万年历的程序源代码 174.2.2 成绩记录薄的程序源代码 365、结果展示和程序分析535.1 基础程序设计的运行结果及分析 535.2 综合程序设计的运行结果及分析 545.2.1 万年历的运行结果及分析 545.2.2 成绩记录薄的运行结果及分析 566、总结与体会591、课程设计目的和要求1.1 课程设计的目的(1)复习、巩固C语言的基础知识,掌握C语言的编程技巧和上机调试程序的方法,进一步加深对C语言的理解和掌握。(2
3、)为学生提供了一个既动手又动脑,独立实践的机会,掌握通过程序设计语言解决实际问题的方法、步骤,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。(3)培养学生在项目开发中团队合作精神、创新意识及能力。1.2 课程设计的要求(1)对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;(2)系统设计要实用,编程简练,可用,功能全面(3)说明书、流程图要清楚(4)记录设计情况(备查,也为编写设计说明书作好准备);(5)要求采用模块化程序设计方法,及锯齿型书写格式,要求上机调试通过和
4、按设计报告格式。(6)设计上交内容:设计报告一份(按格式书写);源程序盘一张(能编译成可执行文件并能正常运行,可一个班交一张光盘)。2、课程设计的内容2.1 基础程序设计:本设计部分主要完成与链表操作相关的基本运算,其中包含:链表的建立、链表的输出、链表的插入、链表的删除等运算。2.2 综合程序设计:2.2.1万年历的设计:要求:模仿现实生活中的挂历,能够显示年历、月历、日历,并具备退出功能。当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几)。当系统日期变到下一月时,系统自动翻页到下一月。2.2.2 成绩记录簿:编制一个C语言成绩记录簿,每个学生信息包括:学号、姓名、C
5、语言成绩。具体功能:(1)创建信息,并保存(可选);(2)读取数据并显示输出所有学生的成绩;(3)按学号或姓名查询成绩;(4)添加成绩记录;(5)修改指定姓名或学号的学生的成绩;(6)显示输出60分以下、6079、8089、90分以上各分数段的学生信息。3、解决问题的思路和方法3.1 基础程序设计思路:用尾插法完成新建链表,先查找再修改、删除。建立菜单,完成调用各功能函数。3.2 综合程序设计思路3.2.1 万年历的设计思路:1.由于要以系统当前日期的月份为准显示当前月的每一天,所以用如下获取系统当前日期”并分别赋值给变量 year,month,day:time_t today;struct
6、tm *p;time(&today);p=localtime(&today);year=p-tm_year+1900;month=p-tm_mon+1;day=p-tm_mday;注意1,由于返回的是1900到现在的秒数,所以year后面要加上1900,又起始是1月,所以mon要加1;注意2,头文件 #include 不能忘了.2.对得到的系统日期进行处理,算出当天是星期几if(year=0) /由于已知公元元年1月1日为星期一,所以以改日为基准计算 for(i=0;iyear;i+) if(i%4=0 & i%100!=0)|i%400=0)/判断是否为闰年 days=days+366; e
7、lse days=days+365;if(year%4=0 & year%100!=0)|year%400=0)/判断是否为闰年for(j=0;jmonth-1;j+) days=days+m2j; m=m2month; /算出当月天数else for(j=0;j1)k=(7-(day-n+6)%7)%7; /此月第一天是星期几else if(day=1) k=n;流程图: 4.打印输出本月当前月历:printf( sun mon tue wen thu fri satn);for(o=0;ok;o+)printf( );for(o=k;ok+m;o+) printf(%4d,o-k+1);
8、if(o%7=6) printf(n);流程图3.2.2 成绩管理薄的设计流程图:流程逻辑:4、程序实现:4.1 基础程序设计的程序源代码:(创建.c格式文件)/*-时间:2013年7月02日 By ZouHuaYu文件功能:实现了动态建立一个学生信息的链表包括链表的创建、插入、删除、和打印输出学生信息包括姓名和分数本链表是带有头结点的,头结点的内容为空内容-*/*-包含头文件-*/#include#include#include#include/*-结构体定义部分-*/struct Node char name10; int score; struct Node *next;typedef
9、struct Node ListNode;/*-函数声明部分-*/*-函数实现部分-*/*-创建链表-*/*在链表的末端插入新的节点,建立链表*/ListNode *CreateList(int n) ListNode *head;/指向头结点指针 ListNode *p,*pre; int i; head=(ListNode *)malloc(sizeof(ListNode);/为头节点分配内存空间 head-next=NULL;/将头结点的指针域清空 pre=head;/先将头结点首地址赋给中间变量pre for(i=1;iname);/输入姓名 printf(input score of
10、 the %d student:,i); scanf(%d,&p-score);/输入分数 pre-next=p;/将p指向新结点插入链表也就是头结点指针域指向 /下个结点 /第一个结点就是p指向的,因为头结点内容为空 pre=p;/这个起着指向下一个结点的作用 p-next=NULL;/最后将最后一个结点的指针域清空了 return head;/返回这个链表的首地址/*-输出链表-*/void PrintList(ListNode *h) ListNode *p; p=h-next; while(p) printf(%s,%d,p-name,p-score); p=p-next; print
11、f(n); /*-插入链表结点-*/*-函数名称:InsertList(ListNode *h,int i,char name,int e,int n)函数功能:插入链表结点入口参数: h: 头结点地址 i:插入到第几个结点 name:插入结点的姓名 e:插入结点的分数 n:链表中结点的个数除下头结点外的个数出口参数:-*/void InsertList(ListNode *h,int i,char name,int e,int n) ListNode *q,*p;/先定义2个指向一个结点的指针 int j; if(in+1) printf(Error! Please input again.
12、n); else j=0; p=h;/将指针p指向要链表的头结点 while(jnext; j+; q=(ListNode *)malloc(sizeof(ListNode);/*为要插入的结点分配内存空间*/-赋值操作- strcpy(q-name,name); /将名字拷到要插入的节点内 q-score=e; /将要插入的节点中分数赋值/-调整指针域- q-next = p-next; /这个是将新插入的结点指针域指向上一个结点指针域指向的结点地址即为p-next p-next=q;/将要插入结点位置前面的结点指针域指向现在插入的结点首地址 /*-函数名称:DeleteList(ListN
13、ode *h,int i,int n)函数功能:删除链表结点入口参数: h: 头结点地址 i:要删除的结点所在位置n:链表中结点的个数除下头结点外的个数出口参数:-*/void DeleteList(ListNode *h,int i,int n) ListNode *p,*q;/首先定义2个指向结点型结构体的指针 int j; char name10; int score; if(in)/如果位置超出了1和n的范围的话则打印出错误信息 printf(Error! Please input again.n); else/没有超出除头结点外的1到n的范围的话那么执行删除操作 j=0; p=h;/
14、将指针指向链表的头结点首地址 while(jnext; j+; q=p-next; /*q指向要删除的位置之前的那个结点指针域指向的地址q指向的结点就是要删除的结点*/ p-next=q-next;/*这个就是将要删除的结点的前面那个结点的指针域指向要删除的结点指针域中存放的下个结点的首地址从而实现了删除第i个结点的作用*/ strcpy(name,q-name); score=q-score; free(q);/释放q指向的结点 printf(name=%s,score=%dn,name,score); /*-主函数-*/void main() ListNode *h;/h指向结构体NODE
15、 int i=1,n,score; char name 10; while (i) /*输入提示信息*/ printf(1-建立新的链表n); printf(2-添加元素n); printf(3-删除元素n); printf(4-输出当前表中的元素n); printf(0-退出n); scanf(%d,&i); switch(i) case 1: printf(n=);/*输入创建链表结点的个数*/ scanf(%d,&n); h=CreateList(n);/*创建链表*/ printf(list elements is: n); PrintList(h); break; case 2: p
16、rintf(input the position. of insert element:); scanf(%d,&i); printf(input name of the student:); scanf(%s,name); printf(input score of the student:); scanf(%d,&score); InsertList(h,i,name,score,n); printf(list elements is:n); PrintList(h); break; case 3: printf(input the position of delete element:)
17、; scanf(%d,&i); DeleteList(h,i,name,score,n); printf(list elements in : n); PrintList(h); break; case 4: printf(list element is : n); PrintList(h); break; case 0: return; break; default: printf(ERROR!Try again!n); 4.2 综合程序设计的源代码4.2.1 万年历的设计的程序源代码:(创建.c格式文件)#include #include #include #include #includ
18、e #define KEYNUMUp 0x48/*宏定义*/#define KEYNUMDown 0x50 #define KEYNUMLeft 0x4b #define KEYNUMRight 0x4d#define KEYNUMPageUp 0x49 #define KEYNUMPageDown 0x51 int eachyeartotal(int year,int month,int day);/*函数声明*/int counterdays(int year,int month,int day);int nowtime(int year,int month,int day);int we
19、ek(int year,int month,int day);int maxDay(int year,int month);int isleap(int year);void whatweek(int year,int month,int day);void display(int year ,int month);void display2(int year,int month);void display3(int year,int month,int day) ;void setDay1(int year,int month,int day);void setDay2(int year,i
20、nt month,int day);void setDay3(int year,int month,int day);void jieri(int month,int day);void display1(int year);void getmenu();void main()/*主函数*/ int year,month,day,select; while(1) getmenu(); printf(请输入相应数字:);/*菜单选择*/ scanf(%d,&select); system(cls); switch(select) case 1:/*当选择为1时显示年历*/ printf(年历显示
21、:输入年(如2011):); scanf(%d,&year); if(year0&year0&year=1&month0&year=1&month=1&day=maxDay(year,month) display3(year,month,day); printf( 提示 按PageUp:前一天 按PageDown:后一天 按其他键:返回菜单nn); setDay3( year,month, day); else system(cls); printf( 输入无效,重新输入!n);break; case 4: exit(0); default:/*当输入其他数字时,输入无效,重新输入*/ system(cls); printf( 输入无效,重新输入!n);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1