资源描述
郑 州 大 学
课程汇报
课 程 名 称: C语言程序设计
专 业 班 级 : (15)班
学 生 姓 名 : 谢*
学 号 : 7611***
任 课 教 师 : 赵**
学 期 : --2
课程汇报任务书
题 目
通讯录管理系统
关键
内容
开发一个通讯录管理系统,基础信息包含:编号、姓名、性别、出生年月、固定电话、手机号、电子邮件等基础信息(也能够依据自己情况进行扩充)。使之能提供以下基础功效:
(1)通讯录等信息录入功效 (注:数据等要求用文件保留)--输入v
(2)通讯录信息浏览功效--输出
(3)查询功效(最少一个查询方法)、排序功效(最少一个排序方法):
l ①按电话号码进行查询 ②按姓名查询 等 ③ 根据年纪排序 ④按姓名排序等
(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,判定是否是0~6
开始
显示一系列功效选项
N
依据n值调用各功效模块函数
结束
Y
【程序】
Person pe[80];
int menu_select()
{
char c;
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)显示模块
此模块为显示全部统计,步骤图以下:
选择显示功效
显示全部数据
回主菜单
void Display(Person per[],int n)
{
Inti;
printf("----------------------------------------------------------------------\n"); //格式
printf("编号\t姓名\t年纪\t电话号码\t通讯地址\t电子邮箱\n");
printf("----------------------------------------------------------------------\n");
for(i=1;i<n+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)修改模块
此模块先调用查找函数查找到所要修改信息,然后用户依据需要修改信息。步骤图以下:
开始
输入要修改统计姓名
是否找到信息
提醒未找到信息
显示要修改信息
修改需要修改条目,并保留
结束
N
Y
void xiugai(Person per[],int n)
{
char s[20];
int i=0;
printf("\t请输入想修改统计中名字:");
scanf("%s",s); //输入修改人名字
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(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)插入模块
此模块为插入信息模块,插入后再调用保留函数来保留所插入数据,支持多条信息插入。
步骤图
开始
输入要插入统计个数n
i从0到n-1调用Input函数
i!=0吗?
返回主菜单
保留调用baocun函数
结束
N
YY
int Input(Person per[],int n)
{
int i=0;
char sign,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函数。其步骤图以下:
开始
输入要删除信息名字
是否找到信息
提醒没有找到信息
N
Y
显示找到信息
提醒是否删除
N
Y
提醒未删除
提醒删除成功
结束
int shanchu(Person per[],int n)
{
char s[20];
int i=0,j;
printf("\t请输入想删除统计中名字:");
scanf("%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return(n);
}
for(j=i;j<n-1;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) 查询模块
void chaxun(Person per[],int n)
{
int m;
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)
{
char s[20];
int i=0;
printf("\t请输入想查询姓名:");
scanf("\t%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(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)
{
char s[20];
int i=0;
printf("\t请输入想查询电话:"); scanf("\t%s",s);
while(strcmp(per[i].num,s)!=0&&i<n) i++;
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].adds);
printf("\t电子邮箱: %s\n",per[i].email);
} ;
if(m==3)
{
char s[20];
int i=0;
printf("\t请输入想查询地址:");
scanf("\t%s",s);
while(strcmp(per[i].adds,s)!=0&&i<n)
i++;
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)排序模块
void paixu(Person per[],int n)
{
int i,j;
// printf("\t\按编号排序:\n");
for(i=1;i<n+1;i++)
{
for(j=1;j<n-1;j++)
if((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<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct
{
char score; /*编号*/
char name[10]; /*姓名*/
char num[15]; /*号码*/
char email[20]; /*邮箱*/
char age[8]; /*年纪*/
char adds[20]; /*地址*/
}Person;
Person pe[80];
int menu_select()
{
char c;
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');
}
void paixu(Person per[],int n)
{
int i,j;
// printf("\t\按编号排序:\n");
for(i=1;i<n+1;i++)
{
for(j=1;j<n-1;j++)
if((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");
}
int Input(Person per[],int n)
{
int i=0;
char sign,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);
}
void Scan(Person per[],int n)
{
int i;
FILE *fp;
if((fp=fopen("record.txt","rb"))==NULL)//打开文件
{
printf("不能打开文件!\n");
exit(1);
}
fscanf(fp,"%d",&n);//读入统计数
//fseek(fp,0,1);
for(i=0;i<n;i++) fscanf(fp,"%-5d%-8s%-6s%-13s%-15s%-15s\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);
fclose(fp);
printf("\t\t************* 文件数据读入成功 !*************\n");
}
void Display(Person per[],int n)
{
int i;
printf("----------------------------------------------------------------------\n"); /*格式*/
printf("编号\t姓名\t年纪\t电话号码\t通讯地址\t电子邮箱\n");
printf("----------------------------------------------------------------------\n");
for(i=1;i<n+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");
} int shanchu(Person per[],int n)
{
char s[20];
int i=0,j;
printf("\t请输入想删除统计中名字:");
scanf("%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return(n);
}
for(j=i;j<n-1;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);
}
void chaxun(Person per[],int n)
{
int m;
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)
{
char s[20];
int i=0;
printf("\t请输入想查询姓名:");
scanf("\t%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(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)
{
char s[20];
int i=0;
printf("\t请输入想查询电话:"); scanf("\t%s",s);
while(strcmp(per[i].num,s)!=0&&i<n) i++;
if(i==n)
{
printf("
展开阅读全文