昆明理工大学程序设计语言课程设计.docx
《昆明理工大学程序设计语言课程设计.docx》由会员分享,可在线阅读,更多相关《昆明理工大学程序设计语言课程设计.docx(47页珍藏版)》请在冰豆网上搜索。
昆明理工大学程序设计语言课程设计
昆明理工大学-程序设计语言课程设计
课程设计
课程名称:
程序设计语言课程设计
设计题目:
万年历的设计
通讯录的设计
学院:
信息工程与自动化学院
专业:
计算机科学与技术
年级:
2012级
学生姓名:
邹华宇(201210405204)
指导教师:
王翊
日期:
2013年7月9日
教务处制
1、课程设计目的和要求………………………………………………1
1.1课程设计的目的………………………………………………1
1.2课程设计的要求………………………………………………1
2、课程设计的内容……………………………………………………2
2.1基础程序设计…………………………………………………2
2.2万年历的设计…………………………………………………2
2.3通讯录的设计…………………………………………………2
3、解决问题的思路和方法……………………………………………4
3.1基础程序设计思路……………………………………………4
3.2万年历的设计思路……………………………………………4
3.3通讯录的设计思路……………………………………………7
4、程序实现………………………………………………………………9
4.1基础程序设计源代码…………………………………………9
4.2万年历的程序源代码………………………………………12
4.3通讯录的程序源代码………………………………………16
5、结果展示和程序分析………………………………………………23
5.1基础程序的运行结果及分析………………………………23
5.2万年历的运行结果及分析…………………………………25
5.3通讯录的运行结果及分析…………………………………29
6、总结与体会…………………………………………………………34
1、课程设计目的和要求
1.1课程设计的目的:
(1)复习、巩固C语言的基础知识,掌握C语言的编程技巧和上机调试程序的方法,进一步加深对C语言的理解和掌握。
(2)为学生提供了一个既动手又动脑,独立实践的机会,掌握通过程序设计语言解决实际问题的方法、步骤,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力。
(3)培养学生在项目开发中团队合作精神、创新意识及能力。
1.2课程设计的要求:
(1)对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;
(2)系统设计要实用,编程简练,可用,功能全面
(3)说明书、流程图要清楚
(4)记录设计情况(备查,也为编写设计说明书作好准备);
(5)要求采用模块化程序设计方法,及锯齿型书写格式,要求上机调试通过和按设计报告格式。
(6)设计上交内容:
设计报告一份(按格式书写);源程序盘一张(能编译成可执行文件并能正常运行,可一个班交一张光盘)。
2、课程设计的内容
2.1基础程序设计
本设计部分主要完成与链表操作相关的基本运算,其中包含:
链表的建立、链表的输出、链表的插入、链表的删除等运算。
2.2万年历的设计:
要求:
模仿现实生活中的挂历,能够显示年历、月历、日历,并具备退出功能。
当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几)。
当系统日期变到下一月时,系统自动翻页到下一月。
2.3通讯录设计
制作一个通讯录程序,该程序具有查找、添加、修改、删除功能。
通讯录包括:
姓名,电话,街道,城市,省,邮编等。
模块设计参考:
第一个模块——主函数main()的功能是:
根据选单的选项调用各函数,并完成相应的功能。
第二个模块——Menu()的功能是:
显示英文提示选单。
第三个模块——Quit()的功能是:
退出选单。
⌝
第四个模块——Create()的功能是:
创建新的通讯录。
第五个模块——Add()的功能是:
在通讯录的末尾,写入新的信息,并返回选单。
第六个模块——Find()的功能是:
查询某人的信息,如果找到了,则显示该人的信息,如果未找到,则提示通讯录中没有此人的信息,并返回选单。
第七个模块——Alter()的功能是:
修改某人的信息,如果未找到要修改的人,则提示通讯录中没有此人的信息,并返回选单。
第八个模块——Delete()的功能是:
删除某人的信息,如果未找到要删除的人,则提示通讯录中没有此人的信息,并返回选单。
第九个模块——List()的功能是:
显示通讯录中的所有记录。
3、解决问题的思路和方法
3.1基础程序设计思路
用尾插法完成新建链表,反复调用menu()函数使用菜单,调用各个子函数实现对链表的初始化,删除,输出等操作。
3.2万年历的程序流程图:
主要程序流程图:
Memu-slect()=1
Printf(“输入年月日计算星期”)
开始
Memu-slect()=2
Memu-slect()=3
Memu-slect()=4
Printf(“输入年月日计算星期”)
Printf(“输入年月日计算星期”)
Printf(“输入年月日计算星期”)
结束
具体对于月份和年份的程序图如下:
上图为计算星期方法上图为打印日历程序图
3.3通讯录的设计流程图:
程序结构:
通讯录菜单
初始化信息
查找通讯人
更新通讯人
添加通讯人
删除通讯人
打印通讯录
退出
通讯录
在尾部添加此人信息
开始
添加人信息
添加结束
调用print函数显示通讯录
开始
选择6
显示结束
4、程序实现:
4.1基础程序设计的源代码:
#include
#include
typedefstructnode
{
chardata;
structnode*next;
}Node,*linklist;
linklistH;
voidprint(linklistL)
{
Node*a;
a=L->next;
while(a!
=NULL)
{
printf("%c->",a->data);
a=a->next;}
printf("\n");
}
linklistCreateFromTail()
{
linklistL;
Node*s,*r;
charc;
intflag=1;
L=(linklist)malloc(sizeof(Node));
L->next=NULL;
r=L;
while(flag)
{
c=getchar();
if(c!
='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
returnL;
}
intDelList(linklistL,inti)
{
Node*p,*r;
intk;
p=L;
k=0;
printf("未删除时的链表");
print(L);
while(p->next!
=NULL&&k{
p=p->next;
k=k+1;
}
if(k!
=i-1)
{
printf("删除节点的位置i不合理!
");
return0;
}
r=p->next;
p->next=p->next->next;
free(r);
return1;
}
intInsList(linklistL,inti,chare)
{
Node*p,*s;
intk;
p=L;
k=0;
printf("未插入时的链表:
");
print(L);
printf("\n");
while(p!
=NULL&&k{
p=p->next;
k=k+1;
}
if(k!
=i-1)
{
printf("插入节点的位置i不合理!
");
return0;
}
s=(Node*)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
return1;
}
voidmenu()
{
charch,e;
inti,j;
do
{
printf("\t\t######################\n");
printf("\t\t1.初始化链表\n");
printf("\t\t2.插入链表\n");
printf("\t\t3.删除链表\n");
printf("\t\t4.输出链表\n");
printf("\t\t5.退出系统\n");
printf("\t\t######################\n");
printf("请输入1-5的数据\n");
scanf("\n%2c",&ch);}
while(ch>'5'||ch<'1');
switch(ch)
{
case'1':
H=CreateFromTail();
print(H);
break;
case'2':
scanf("%d_%c",&i,&e);
InsList(H,i,e);
printf("插入后的链表:
");
print(H);
break;
case'3':
scanf("%d",&j);
DelList(H,j);
printf("删除后的链表");
print(H);
break;
case'4':
printf("输出链表为");
print(H);
break;
case'5':
exit(0);
}
}
voidmain()
{
do
{
menu();
}
while
(1);
}
4.2万年历的设计的程序源代码:
#include
#include
#include
voidf()
{
intday,month,year,sum,leap,S;
printf("\n请输入年月日\n");
scanf("%d%d%d",&year,&month,&day);
while
(1)
{
if((month>12||month<1)||(day>31||day<1))
{
printf("输入错误,重新输入");
scanf("%d%d%d",&year,&month,&day);
}
elsebreak;
}
switch(month)
{
case1:
sum=0;break;
case2:
sum=31;break;
case3:
sum=59;break;
case4:
sum=90;break;
case5:
sum=120;break;
case6:
sum=151;break;
case7:
sum=181;break;
case8:
sum=212;break;
case9:
sum=243;break;
case10:
sum=273;break;
case11:
sum=304;break;
case12:
sum=334;break;
default:
printf("dataerror");break;
}
sum=sum+day;
if(year%400==0||(year%4==0&&year%100!
=0))
leap=1;
elseleap=0;
if(leap==1&&month>2)
sum++;
S=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+sum)%7;
switch(S)
{
case1:
printf("星期一\n");break;
case2:
printf("星期二\n");break;
case3:
printf("星期三\n");break;
case4:
printf("星期四\n");break;
case5:
printf("星期五\n");break;
case6:
printf("星期六\n");break;
case0:
printf("星期日\n");break;
}
}
voidg()
{inti,j=1,k=1,a,b,month,year;
printf("\n输入年月:
\n");
scanf("%d%d",&year,&month);
while
(1)
{
if(month>12||month<1)
{
printf("输入错误,重新输入");
scanf("%d%d",&year,&month);
}
elsebreak;
}
b=days_month(month,year);
a=firstday(month,year);
printf("*************************************\n");
printf("SunMonTueWedThuFriSat\n");
if(a==7)
{for(i=1;i<=b;i++)
{printf("%4d",i);
if(i%7==0)
{printf("\n");
}
}
}
if(a!
=7)
{while(j<=4*a)
{printf("");
j++;
}
for(i=1;i<=b;i++)
{printf("%4d",i);
if(i==7*k-a)
{printf("\n");
k++;
}
}
}
printf("\n*************************************\n");
printf("\n");}
intleap(intyear)
{if(year%4==0&&year%100!
=0||year%400==0)
return1;
elsereturn0;
}
intdays_month(intmonth,intyear)
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return31;
if(month==4||month==6||month==9||month==11)
return30;
if(month==2&&leap(year)==1)return29;
elsereturn28;
}
intfirstday(intmonth,intyear)
{intW;
W=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1;
returnW;
}
voidh()
{inti,j=1,k=1,a,b,month,year,g;
printf("\n输入任意年:
\n");
scanf("%d",&year);
for(g=0;g<=11;g++)
{
month=g+1;
b=days_month(month,year);
a=firstday(month,year);
printf("%d月\n",month);
printf("*************************************\n");
printf("SunMonTueWedThuFriSat\n");
if(a==7)
{for(i=1;i<=b;i++)
{printf("%4d",i);
if(i%7==0)
{printf("\n");
}
}
}
j=1;
k=1;
if(a!
=7)
{while(j<=4*a)
{printf("");
j++;
}
for(i=1;i<=b;i++)
{printf("%4d",i);
if(i==7*k-a)
{printf("\n");
k++;
}
}
}
printf("\n*************************************\n");
printf("\n");
}
}
voidmain()
{
for(;;){
switch(menu_select()){
case1:
printf("输入年月日计算星期几\n");f();
break;
case2:
printf("打印任意日历\n");g();
break;
case3:
printf("打印任意年历\n");h();
break;
case4:
printf("谢谢使用!
\n");
exit(0);
}
}
}
intmenu_select()
{
charS;
intcn;
printf("1.输入年月日计算星期几\n");
printf("2.打印任意月历\n");
printf("3.打印任意年历\n");
printf("4.谢谢使用!
\n");
printf("input1-4:
\n");
do{
S=getchar();
cn=(int)S-48;
}while(cn<0||cn>6);
returncn;
}
4.3通讯录的程序源代码:
#include
#include
#include
typedefstructnode
{
charname[20];
chartelephone[20];
charstreet[20];
charcity[20];
charprovince[20];
charpostnumber[20];
structnode*next;
}Node,*linklist;
linklistH;
voidprint(linklistL)
{
Node*a;
a=L->next;
while(a!
=NULL)
{
printf("----------------------------------------------------------------------\n");/*格式*/
printf("姓名电话街道城市省邮政编码\n");
printf("----------------------------------------------------------------------\n");
printf("%-12s%-12s%-12s%-12s%-12s%-12s\n",a->name,a->telephone,a->street,a->city,a->province,a->postnumber);
printf("----------------------------------------------------------------------\n");
a=a->next;}
printf("\n");
}
linklistCreate()
{
linklistL;
Node*s,*r;
charname[20],telephone[20],street[20],city[20],province[20],postnumber[20];
inti;
intflag=1;
L=(linklist)malloc(sizeof(Node));
L->next=NULL;
r=L;
while(flag)
{
loop:
printf("请按格式输入通讯人信息,例如:
姓名电话街道城市省邮编");
printf("\n");
scanf("%s%s%s%s%s%s",&name,&telephone,&street,&city,&province,&postnumber);
if(name[0]!
='$')
{
s=(Node*)malloc(sizeof(Node));
strcpy(s->name,name);
strcpy(s->telephone,telephone);
strcpy(s->street,street);
strcpy(s->city,city);
strcpy(s->province,province);
strcpy(s->postnumber,postnumber);
for(i=0;i<=19;i++)
{
if(telephone[i]=='\0')
break;
if((48<=telephone[i]&&telephone[i]<=57)!
=1)
{
printf("电话号码输入格式出错请重新输入\n");
gotoloop;
}
}
for(i=0;i<=19;i++)
{
if(postnumber[i]=='\0')
break;
if((48<=postnumber[i]&&postnumber[i]<=57)!
=1)
{
printf("邮编输入格式出错请重新输入\n");
gotoloop;
}
}
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
returnL;
}
voidDelete(linklistL)
{
Node*p,*s;
intk;
chara[20];
p=L;
k=0;
printf("请输入你要更改的通讯人姓名");
printf("\n");
scanf("%s",&a);
while
(1)
{
if(strcmp(p->name,a)==0)
{
printf("%s-%s-%s-%s-%s-%s",p->name,p->telephone,p->street,p->city,p->province,p->postnumber);
s->next=s->next->next;
fre