C语言课程设计大作业.docx
《C语言课程设计大作业.docx》由会员分享,可在线阅读,更多相关《C语言课程设计大作业.docx(29页珍藏版)》请在冰豆网上搜索。
C语言课程设计大作业
郑州大学
课程报告
课程名称:
C语言程序设计
专业班级:
(15)班
学生姓名:
谢*
学号:
***
任课教师:
赵**
学期:
2012-2013-2
课程报告任务书
题目
通讯录管理系统
主要
内容
开发一个通讯录管理系统,基本信息包括:
编号、姓名、性别、出生年月、固定电话、手机号、电子邮件等基本信息(也可以根据自己情况进行扩充)。
使之能提供以下基本功能:
(1)通讯录等信息录入功能(注:
数据等要求用文件保存)--输入?
(2)通讯录信息的浏览功能--输出
(3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式):
?
①按电话号码进行查询②按姓名查询等
按照年龄排序
按姓名排序等
(4)通讯录条目的删除与修改等
扩展功能:
可以按照自己的程度进行扩展。
比如
(1)简单的权限处理
(2)报表打印功能(3)模糊查询,如姓张的人员等;或者给定电子邮件的部分进行查询等(4)给定指定年龄范围之内的查询等等。
总之,可以根据自己需求进行分析功能,成绩评定按照难度进行区分。
任务
要求
一、提交材料应包括:
(1)系统源代码
(2)课程报告
二、整个设计过程具体要求
(1)需求分析要求学生对案例系统进行分析,设计出需要完成的功能,完善各个模块的调用关系;
(2)设计过程要求学生进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等)
(3)实现过程要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试;
(4)总结阶段按照要求完成系统设计和实现报告,并进行总结、答辩。
成绩
评定
报告撰写情况(30分)
系统完成情况(30分)
答辩情况(40分)
总分
内容
20分
规范程度
5分
程序测试
5分
基本功能20分
扩展功能10分
自述情况10分
答辩情况
30分
成绩评定教师:
一.需求分析
1,具有数据的插入、修改、删除、显示和查询功能的电话簿管理程序。
2,数据包括:
人名、工作单位、电话号码和E-MAIL地址。
3,可对记录中的姓名和电话号码进行修改。
4,可增加和删除记录。
5,可显示所有的保存记录。
6,可按人名或电话号码进行查询。
分析
建议采用结构体数组和文件系统实现。
结构体成员包括人名、工作单位、电话号码和E-MAIL地址。
根据题目的要求程序应该采用结构体数组和文件系统实现。
应该有文件的操作功能;在程序中应该包括输入、显示、删除、查询、添加、修改、保存、加载和退出的功能。
二、概要设计
(1).程序的模块组成及各个函数的功能:
程序的模块组成:
主函数:
main();
输出数据函数:
printf();
读取数据函数:
scanf();
显示记录函数:
Display();
删除记录函数:
shanchu();
查找记录函数:
chaxun();
自定义清屏函数:
system(“cls”);
自定义输入函数:
input();
字符输入函数:
getchar();
修改数据函数:
xiugai();
保存数据函数:
baocun();
排序数据函数:
paixu();
各函数的主要功能:
输出数据函数:
随时输出数据;
读取数据函数:
读取输入的数据信息;
显示菜单函数:
显示可供选择的主菜单;
显示记录函数:
显示通讯录所有输入的信息;
删除记录函数:
显示要删除的通讯录所有输入的信息;
查找记录函数:
显示要查询的通讯录所有输入的信息;
自定义清屏函数:
清除前面运行留下的信息;
自定义输入函数:
输入通讯录的成员;;
字符输入函数:
从终端输入一个字符,遇回车键返回;
修改数据函数:
修改通讯录的成员信息;
保存数据函数:
保存通讯录的成员信息;
排序数据函数:
排序通讯录的成员信息;
(2)程序中的抽象数据类型的定义:
用户的状态结构
用户
{
编号:
姓名:
电话;
年龄;
邮箱:
地址;
(3)总体流程图
根据上面的分析,可以将程序系统的设计分为如下几个模块:
插入、显示、删除、查询、修改、保存和退出。
}
三.详细设计
(1).主菜单;
主菜单一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。
其中各功能模块用菜单方式选择。
流程图
N
Y
【程序】
Personpe[80];
intmenu_select()
{
charc;
do{
system("cls");//清屏
printf("\t\t\t**********************************************\n");//窗口初始化
printf("\t\t\t**********欢迎使用通讯录管理系统!
***********\n");
printf("\t\t\t*************┌───────┐***************\n");
printf("\t\t\t**************1.添加记录***************\n");
printf("\t\t\t**************│2.显示记录│****************\n");
printf("\t\t\t**************│3.删除记录│****************\n");
printf("\t\t\t**************│4.查询记录│****************\n");
printf("\t\t\t**************│5.修改记录│****************\n");
printf("\t\t\t**************│6.保存记录│*****************\n");
printf("\t\t\t**************│7.排序记录│*****************\n");
printf("\t\t\t**************│0.退出程序│*****************\n");
printf("\t\t\t**************└──────┘****************\n");
printf("\t\t请您选择(0-7):
");
c=getchar();
}while(c<'0'||c>'7');
return(c-'0');
}
(2)显示模块
此模块为显示所有记录,流程图如下:
voidDisplay(Personper[],intn)
{
Inti;
printf("----------------------------------------------------------------------\n");//格式
printf("编号\t姓名\t年龄\t电话号码\t通讯地址\t电子邮箱\n");
printf("----------------------------------------------------------------------\n");
for(i=1;i{
printf("%-8d%-8s%-8s%-18s%-18s%-8s\n",per[i-1].score,per[i-1].name,per[i-1].age,per[i-1].num,per[i-1].adds,per[i-1].email);
if(i>1&&i%10==0)
{printf("\t-----------------------------------\n");
printf("\t");
system("pause");
printf("\t-----------------------------------\n");
}}
printf("----------------------------------------------------------------------\n");
system("pause");
(3)修改模块
此模块先调用查找函数查找到所要修改的信息,然后用户根据需要修改信息。
流程图如下:
voidxiugai(Personper[],intn)
{
chars[20];
inti=0;
printf("\t请输入想修改的记录中的名字:
");
scanf("%s",s);//输入修改人的名字
while(strcmp(per[i].name,s)!
=0&&iif(i==n)
{
printf("\t通讯录中没有此人!
\n");
return;
}
printf("\t编号:
");
scanf("\t%d",&per[i].score);
printf("\t姓名:
");
scanf("\t%s",per[i].name);
printf("\t年龄:
");
scanf("\t%s",per[i].age);
printf("\t电话号码:
");
scanf("\t%s",per[i].num);
printf("\t通讯住址:
");
scanf("\t%s",per[i].adds);
printf("\t电子邮箱:
");
scanf("\t%s",per[i].email);
printf("\t修改成功");}
(4)插入模块
此模块为插入信息模块,插入后再调用保存函数来保存所插入的数据,支持多条信息的插入。
流程图
intInput(Personper[],intn)
{
inti=0;
charsign,x[10];
while(sign!
='n'&&sign!
='N')
{
printf("\t编号:
");
scanf("\t%d",&per[n+i].score);
printf("\t姓名:
");
scanf("\t%s",per[n+i].name);
printf("\t年龄:
");
scanf("\t%s",per[n+i].age);
printf("\t电话号码:
");
scanf("\t%s",per[n+i].num);
printf("\t通讯住址:
");
scanf("\t%s",per[n+i].adds);
printf("\t电子邮箱:
");
scanf("\t%s",per[n+i].email);
gets(x);
printf("\n\t是否继续添加?
(Y/N)");
scanf("\t%c",&sign);
i++;
}
return(n+i);
}(5)删除模块
此模块先利用查找模块找到所要删除的信息,然后根据用户的选择来确定是否删除信息,此种调用到Save函数。
其流程图如下:
intshanchu(Personper[],intn)
{
chars[20];
inti=0,j;
printf("\t请输入想删除记录中的名字:
");
scanf("%s",s);
while(strcmp(per[i].name,s)!
=0&&iif(i==n)
{
printf("\t通讯录中没有此人!
\n");
return(n);
}
for(j=i;j{
strcpy(per[j].num,per[j+1].num);
strcpy(per[j].name,per[j+1].name);
strcpy(per[j].age,per[j+1].age);
strcpy(per[j].adds,per[j+1].adds);
strcpy(per[j].email,per[j+1].email);
}
printf("\t\t\t已经成功删除!
\n");
return(n-1);
}
(6)查询模块
voidchaxun(Personper[],intn)
{
intm;
printf("\t\n请选择查询方式:
\n");
printf("\t┌──────---┐\n");
printf("\t│1------姓名查询│\n");
printf("\t│2------电话查询│\n");
printf("\t│3------地址查询│\n");
printf("\t│4------返回│\n");
printf("\t└──────---┘\n");
printf("请选择:
");
scanf("%d",&m);
while(m!
=1&&m!
=2&&m!
=3&&m!
=4)
{
printf("输入错误请重新选择:
");
scanf("%d",&m);
}
if(m==1)
{
chars[20];
inti=0;
printf("\t请输入想查询的姓名:
");
scanf("\t%s",s);
while(strcmp(per[i].name,s)!
=0&&iif(i==n)
{
printf("\t通讯录中没有此人!
\n");
return;
}
printf("\t此人编号:
%d\n",per[i].score);//输出查询结果
printf("\t此人年龄:
%s\n",per[i].age);
printf("\t电话号码:
%s\n",per[i].num);
printf("\t通讯地址:
%s\n",per[i].adds);
printf("\t电子邮箱:
%s\n",per[i].email);
};
if(m==2)
{
chars[20];
inti=0;
printf("\t请输入想查询的电话:
");scanf("\t%s",s);
while(strcmp(per[i].num,s)!
=0&&iif(i==n)
{
printf("\t通讯录中没有此人!
\n");
return;
}
printf("\t此人编号:
%d\n",per[i].score);//输出查询结果
printf("\t此人姓名:
%s\n",per[i].name);
printf("\t此人年龄:
%s\n",per[i].age);
printf("\t通讯地址:
%s\n",per[i].adds);
printf("\t电子邮箱:
%s\n",per[i].email);
};
if(m==3)
{
chars[20];
inti=0;
printf("\t请输入想查询的地址:
");
scanf("\t%s",s);
while(strcmp(per[i].adds,s)!
=0&&ii++;
if(i==n)
{
printf("\t通讯录中没有此人!
\n");
return;
}
printf("\t此人编号:
%d\n",per[i].score);//输出查询结果
printf("\t此人姓名:
%s\n",per[i].name);
printf("\t此人年龄:
%s\n",per[i].age);
printf("\t电话号码:
%s\n",per[i].num);
printf("\t电子邮箱:
%s\n",per[i].email);
};
}
(7)排序模块
voidpaixu(Personper[],intn)
{
inti,j;
//printf("\t\按编号排序:
\n");
for(i=1;i{
for(j=1;jif((strcmp(per[j].num,per[j+1].num))>0)
{
strcpy(per->num,per[j].num);
strcpy(per->name,per[j].name);
strcpy(per->age,per[j].age);
strcpy(per->adds,per[j].adds);
strcpy(per->email,per[j].email);
strcpy(per[j+1].num,per->num);
strcpy(per[j+1].name,per->name);
strcpy(per[j+1].age,per->age);
strcpy(per[j+1].adds,per->adds);
strcpy(per[j+1].email,per->email);
}
}
printf("排序成功!
\n");
}
五.测试结果
1.主菜单
2.显示所有信息
3.插入信息
4.查找模块
第一步:
第二步:
第三步:
第四步:
5.删除模块
6.修改模块
第一步
第二步
六.课程心得总结
刚开始学习C语言,总觉得很难理解,也很难学。
在这之前,我们已经学习了一个学期,对C语言有了一定的了解,但是也仅仅是停留在学习了解的范围,对里面的好多东西还是很陌生,并不是很熟练,有着许多欠缺,更多的在运用起来的时候还是感到很不好动手。
这次的程序设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。
自己动手发现和解决问题。
通过这,我发现了自己的许多不足,平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行解决其中大部分问题。
当然,还存在一些问题没有解决。
我相信在以后的学习能够解决好它们。
课堂上许多关于C语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。
然而要使用C语言这个工具解决实际问题,又必须掌握它。
通过上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握C语言的语法规定。
对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,更加巩固了学过的知识,而且在设计的时候学要系统的知识,也是一个较大的挑战,某一方面知识的欠缺都将影响到整个程序的设计。
这次的大作业让我学到了很多有用的东西,巩固了之前的学习,通过这个程序的学习,使我进一步理解和运用结构化程序设计的思想和方法。
相信对以后初步掌握开发一个小型实用系统的基本方法,学会调试一个比较长程序的基本方法,学会利用流程图表示算法,进一步掌握和提高利用C语言进行程序设计的能力。
我认为,这次实习对于我是非常有意义的,对我个人的影响比较大,对我的动手能力有了很大的提高。
通过这次课程设计,我对很多的函数有了新的认识,也学会了运用多种函数。
最后感谢完成大作业过程中帮助过我的老师和同学。
源代码:
#include
#include
#include
typedefstruct
{
charscore;/*编号*/
charname[10];/*姓名*/
charnum[15];/*号码*/
charemail[20];/*邮箱*/
charage[8];/*年龄*/
charadds[20];/*地址*/
}Person;
Personpe[80];
intmenu_select()
{
charc;
do{
system("cls");
printf("\t\t\t**********************************************\n");//窗口初始化
printf("\t\t\t**********欢迎使用通讯录管理系统!
***********\n");
printf("\t\t\t*************┌───────┐***************\n");
printf("\t\t\t**************1.添加记录***************\n");
printf("\t\t\t**************│2.显示记录│****************\n");
printf("\t\t\t**************│3.删除记录│****************\n");
printf("\t\t\t**************│4.查询记录│****************\n");
printf("\t\t\t**************│5.修改记录│****************\n");
printf("\t\t\t**************│6.保存记录│****************\n");
printf("\t\t\t**************│7.排序记录│****************\n");
printf("\t\t\t**************│0.退出程序│****************\n");
printf("\t\t\t**************└──────┘****************\n");
printf("\t\t请您选择(0-7):
");
c=getchar();
}while(c<'0'||c>'7');
return(c-'0');
}
voidpaixu(Personper[],intn)
{
inti,j;
//printf("\t\按编号排序:
\n");
for(i=1;i{
for(j=1;jif((strcmp(per[j].num,per[j+1].num))>0)
{
strcpy(per->num,per[j].num);
strcpy(per->name,per[j].name);
strcpy(per->age,per[j].age);
strcpy(per->adds,per[j].adds);
strcpy(per->email,per[j].email);
strcpy(per[j+1].num,per->num);
strcpy(per[j+1].name,per->name);
strcpy(per[j+1].age,p