南京工程学院
通信工程学院
课程设计说明书(论文)
题 目 学生管理系统设计
课 程 名 称 高级语言程序设计课程设计
专 业 通信工程
班 级
学 生 姓 名
学 号
设 计 地 点 信息楼C205
指 导 教 师 沙爱军
设计起止时间:2013 年 12 月23 日至20##年 12 月27日
通讯录管理系统
摘要
在通讯管理当中,人工统计的速度慢,且容易出现差错。本通讯录管理系统的自动化加速了统计工作,提高管理效率。本程序主要采用对零散的纸条进行自动读取,然后按组分类将数据保存到数组,这样的结构化非常便于程序后续的统计工作。统计具体过程涉及到通讯录的保存和加载等问题,将于正文中详细介绍。本程序实现了所有设计要求。
目录
中文摘要…………………………………………………………………..2
1 题目要求………………………………………………………………………..4
2 需求分析………………………………………………………………………..4
3 总体设计………………………………………………………………………..4
4 详细设计………………………………………………………………………..5
4.1主函数………………………………………………………………………7
4.2各功能模块设计……………………………………………………………9
5.运行结果(附带抓图)………………………………………………………..19
6、程序调试过程…………………………………………………………………23
7.总结……………………………………………………………………………24
参考文献…………………………………………………………………………..24
附录 源程序代码…………………………………………………………………24
1、题目要求
◆ 建立通讯录信息,信息至少包含编号、姓名、年龄、电话、居住街道、省份、城市、电子邮箱等;
◆ 能够提供添加、删除和修改通讯录信息的功能;
◆ 能够提供安不同方式查询的功能;如按姓名或年龄、电话等查询;
◆ 将通讯录保存在文件中;
◆ 能够按表格方式输出通讯录信息。
2、需求分析
本程序将用到文件系统,其中单行内容代表一张纸条。程序运行后首先将文件系统的原始数据读取并保存到程序的结构体数组当中,所以应提供文件输入的操作;由于纸条数据零散,所以要对原始数据进行分类操作并提供一个数组用于保存分类信息;在程序中要进行统计工作,所以要提供显示、排序等操作;另外应提供键盘式选择菜单实现功能选择。
3、总体设计
根据项目的任务要求及以上分析,在设计方法上,采用模块化的程序设计思想,即将通讯录管理系统划分为数据输入模块,数据查询模块,数据修改模块,数据插入模块,数据删除模块,,并对每个模块按照其功能分别独立完成对应的程序设计。在数据处理上,各模块中的数据处理(如数据读/写操作)均用文件形式来实施,并在主程序中完成操作界面的设计功能,设计思路如下:
1、采用模块设计思想;
2、将通讯录信息定义成结构体类型,并通过文件实施数据操作;
3、通过设计一菜单界面完成具体操作。
4、详细设计
【数据结构】:
原始数据有人员编号、姓名、号码、邮箱、年龄、住址,所以要定义一个全局结构体数组person[ ],保存原始数据。然后为接下来的文件读写,文件转入内存,再保存至磁盘文件中做准备。
【数据结构代码】:
typedef struct
{
char score;
char name[10];
char num[15];
char email[20];
char age[8];
char street[20];
char city[20];
char postcode[16];
}Person;
【程序】:
void main()
int n=0;
for( ; ; )
{
switch(menu_select())
{
case 1:
printf("\n\t添加记录到通讯录\n");
n=Input(pe,n);
break;
case 2:
printf("\n\t\t\t 通讯录记录表\n");
Display(pe,n);
break;case 3:
printf("\n\t从通讯录中删除记录\n");
n=Delete_a_record(pe,n);
printf("\t");
system("pause");
break;
case 4:
printf("\n\t在通讯录中查找记录\n");
Query_a_record(pe,n);
printf("\t");
system("pause");
break;
case 5:
printf("\n\t修改通讯录中的记录\n");
Change(pe,n);
printf("\t");
system("pause");
break;
case 6:
printf("\n\t保存功能\n");
WritetoText(pe,n);
printf("\t");
system("pause");
break;
case 0:
printf("\n\t\t谢谢使用,再见!\n");
printf("\n\t\t");
system("pause");
exit(0);
}
}
}
4.1-1 主要模块及主函数模块设计及流程图:
#include<stdio.h>
void main()
{
int menu_select();
{
char c;
do
{
system("cls");
printf("\t\t *****通讯录***** \n");
printf("\t\t┌───────┐\n");
printf("\t\t│ 1. 添加记录 │\n");
printf("\t\t│ 2. 显示记录 │\n");
printf("\t\t│ 3. 删除记录 │\n");
printf("\t\t│ 4. 查询记录 │\n");
printf("\t\t│ 5. 修改记录 │\n");
printf("\t\t│ 6. 保存记录 │\n");
printf("\t\t│ 0. 退出程序 │\n");
printf("\t\t└───────┘\n");
printf("\t\t请您选择(0-6):");
c=getchar();
}
while(c<'0'||c>'6');
return(c-'0');
}
}
4.2各功能模块设计及流程图:
A、添加模块
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].street);
printf("\t居住城市:");
scanf("\t%s",per[n+i].city);
printf("\t电子邮箱:");
scanf("\t%s",per[n+i].email);
printf("\t邮编:");
scanf("\t%s",per[n+i].postcode);
gets(x);
printf("\n\t是否继续添加?(Y/N)");
scanf("\t%c",&sign);
i++;
}
return(n+i);
}
B、显示通讯记录:
void Display(Person per[],int n)
{
int i;
printf("---------------------------------------------------------------------------------------\n");
printf("编号 姓名 年龄 电话号码 居住街道 居住城市 电子邮箱 邮编\n");
printf("---------------------------------------------------------------------------------------\n");
for(i=1;i<n+1;i++)
{
printf("%-5d%-8s%-6s%-13s%-15s%-15s%-15s%-15s\n",per[i-1].score,per[i-1].name,per[i-1].age,per[i-1].num,per[i-1].street,per[i-1].city,per[i-1].email,per[i-1].postcode);
if(i>1&&i%10==0)
{
printf("\t-----------------------------------\n");
printf("\t"); system("pause");
printf("\t-----------------------------------\n");
}
}
printf("---------------------------------------------------------------------------------------\n");
system("pause");
}
C、删除通讯记录:
int Delete_a_record(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].street,per[j+1].street);
strcpy(per[j].city,per[j+1].city);
strcpy(per[j].email,per[j+1].email);
strcpy(per[j].postcode,per[j+1].postcode);
per[j].score=per[j+1].score;
}
printf("\t\t\t已经成功删除!\n");
return(n-1);
}
D、查询通讯记录
void Query_a_record(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].street);
printf("\t居住城市: %s\n",per[i].city);
printf("\t电子邮箱: %s\n",per[i].email);
printf("\t邮编: %s\n",per[i].postcode);
}
{
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].street);
printf("\t居住城市: %s\n",per[i].city);
printf("\t电子邮箱: %s\n",per[i].email);
printf("\t邮编: %s\n",per[i].postcode);
}
if(m==3)
{
char s[20];
int i=0;
printf("\t请输入想查询的地址:");
scanf("\t%s",s);
while(strcmp(per[i].street,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].city);
printf("\t电子邮箱: %s\n",per[i].email);
printf("\t邮编: %s\n",per[i].postcode);
}
}
E、修改通讯记录
void Change(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].street);
printf("\t居住城市:");
scanf("\t%s",per[i].city);
printf("\t电子邮箱:");
scanf("\t%s",per[i].email);
printf("\t邮编:");
scanf("\t%s",per[i].postcode);
printf("\t修改成功!");
}
5、运行结果(附带抓图)
显示的主菜单界面
添加界面
显示界面
删除界面
查询界面
修改界面
保存界面
6、程序调试过程:
1.当我在进行删除、查询、修改、保存等功能时,以查询为例,输入名字按回车后,虽然会显示该人的所有记录,但是显示后,它马上自动消失了,还没来得及等我看内容。因此,向别人请教后,在一些地方加入了system("pause");这个语言,用来对某项操作完成后进行暂停。
2. 现在这个程序的界面个人感觉很清爽。但在最初,每次进行一项操作,运行窗口里的内容会一直保留着,感觉很杂乱,之后,我去网上寻求解决办法,知道可以使用system("cls");这一语句可以解决这个问题,最后,修改成功。
3、在int Input (Person per[],int n)中,丢失了return,通过单步调试加上;
4、刚开始时不会编写保存模块,后通过百度和查阅资料完成。
参考文献
[1] 谭浩强.《C程序设计》[M].北京:清华大学出版社,1991年第一版.
[2] 廖雷 罗代忠《C语言程序设计基础实验教程》 高等教育出版社
[3] 张引 《C程序设计基础 课程设计》 浙江大学出版社
7、总结
这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。自己动手,自己发现和解决问题。发现了自己的许多不足。平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。我相信在以后的学习能够解决好它们。但是,收获还是不小的,我不仅对C的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。
当我选择通讯录这个题目时,一开始想运用大量链表及指针来完成,但是在慢慢琢磨之后,觉得这个不一定要用链表,于是改变了编程思路。当然还有不少文件的读写问题,不过还是通过不断测试之后顺利解决了。另外一点要说的就是这个程序用了很多的循环,因此对于循环的控制要十分小心,有时while和do-while的区别也是十分重要的。
还有一点体会就是,书上和老师教的内容是有限的,我们需要不断地靠自己去学习,向他人请教,了解和掌握更多的知识,这样我们才能编出更好的C程序。
总体来说,这次C语言程序设计实验还是比较成功的,虽然最终程序还存在一些不足,但能取得这样的成绩我还是比较高兴的。
最后,要感谢学校为我们提供这次实验机会,也要感谢老师的教导和好心人对我的帮助与支持。
附录 源程序代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
char score;
char name[10];
char num[15];
char email[20];
char age[8];
char street[20];
char city[20];
char postcode[16];
}Person;
Person pe[80];
int menu_select()
{
char c;
do
{
system("cls");
printf("\t\t ********通讯录******* \n");
printf("\t\t ┌───────┐\n");
printf("\t\t │ 1. 添加记录 │\n");
printf("\t\t │ 2. 显示记录 │\n");
printf("\t\t │ 3. 删除记录 │\n");
printf("\t\t │ 4. 查询记录 │\n");
printf("\t\t │ 5. 修改记录 │\n");
printf("\t\t │ 6. 保存记录 │\n");
printf("\t\t │ 0. 退出程序 │\n");
printf("\t\t └───────┘\n");
printf("\t\t请您选择(0-6):");
c=getchar();
}
while(c<'0'||c>'6');
return(c-'0');
}
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].street);
printf("\t居住城市:");
scanf("\t%s",per[n+i].city);
printf("\t电子邮箱:");
scanf("\t%s",per[n+i].email);
printf("\t邮编:");
scanf("\t%s",per[n+i].postcode);
gets(x);
printf("\n\t是否继续添加?(Y/N)");
scanf("\t%c",&sign);
i++;
}
return(n+i);
}
void Display(Person per[],int n)
{
int i;
printf("---------------------------------------------------------------------------------------\n");
printf("编号 姓名 年龄 电话号码 居住街道 居住城市 电子邮箱 邮编\n");
printf("---------------------------------------------------------------------------------------\n");
for(i=1;i<n+1;i++)
{
printf("%-5d%-8s%-6s%-13s%-15s%-15s%-15s%-15s\n",per[i-1].score,per[i-1].name,per[i-1].age,per[i-1].num,per[i-1].street,per[i-1].city,per[i-1].email,per[i-1].postcode);
if(i>1&&i%10==0)
{
printf("\t-----------------------------------\n");
printf("\t"); system("pause");
printf("\t-----------------------------------\n");
}
}
printf("---------------------------------------------------------------------------------------\n");
system("pause");
}
int Delete_a_record(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].street,per[j+1].street);
strcpy(per[j].city,per[j+1].city);
strcpy(per[j].email,per[j+1].email);
strcpy(per[j].postcode,per[j+1].postcode);
per[j].score=per[j+1].score;
}
printf("\t\t\t已经成功删除!\n");
return(n-1);
}
void Query_a_record(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].street);
printf("\t居住城市: %s\n",per[i].city);
printf("\t电子邮箱: %s\n",per[i].email);
printf("\t邮编: %s\n",per[i].postcode);
}
{
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].street);
printf("\t居住城市: %s\n",per[i].city);
printf("\t电子邮箱: %s\n",per[i].email);
printf("\t邮编: %s\n",per[i].postcode);
}
if(m==3)
{
char s[20];
int i=0;
printf("\t请输入想查询的地址:");
scanf("\t%s",s);
while(strcmp(per[i].street,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].city);
printf("\t电子邮箱: %s\n",per[i].email);
printf("\t邮编: %s\n",per[i].postcode);
}
}
void Change(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].street);
printf("\t居住城市:");
scanf("\t%s",per[i].city);
printf("\t电子邮箱:");
scanf("\t%s",per[i].email);
printf("\t邮编:");
scanf("\t%s",per[i].postcode);
printf("\t修改成功!");
}
void WritetoText(Person per[],int n)
{
int i=0;
FILE *fp;
char filename[20];
printf("\t保存到文件\n");
printf("\t请输入所保存的文件名:");
scanf("\t%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("\t无法打开文件\n");
system("pause");
return;
}
fprintf(fp,"******************************************通讯录****************************************************\n");
fprintf(fp,"编号 姓名 年龄 电话号码 居住街道 居住城市 电子邮箱 邮编\n");
fprintf(fp,"----------------------------------------------------------------------------------------------------\n");
while(i<n)
{
fprintf(fp,"%-3d\t%-6s\t%-3s\t%-13s\t%-20s\t%-20s\t%-20s\t%-20s\n",per[i].score,per[i].name,per[i].age,per[i].num,per[i].street,per[i].city,per[i].email,per[i].postcode);
i++;
}
fprintf(fp,"---------------------------------------------------------------------------------------------------------\n");
fprintf(fp,"***************************************共有%d条记录******************************************************\n",n);
fclose(fp);
printf("保存成功!\n");
}
void main()
{
int n=0;
for( ; ; )
{
switch(menu_select())
{
case 1:
printf("\n\t添加记录到通讯录\n");
n=Input(pe,n);
break;
case 2:
printf("\n\t\t\t 通讯录记录表\n");
Display(pe,n);
break;
case 3:
printf("\n\t从通讯录中删除记录\n");
n=Delete_a_record(pe,n);
printf("\t");
system("pause");
break;
case 4:
printf("\n\t在通讯录中查找记录\n");
Query_a_record(pe,n);
printf("\t");
system("pause");
Break;
case 5:
printf("\n\t修改通讯录中的记录\n");
Change(pe,n);
printf("\t");
system("pause");
break;
case 6:
printf("\n\t保存功能\n");
WritetoText(pe,n);
printf("\t");
system("pause");
break;
case 0:
printf("\n\t\t谢谢使用,再见!\n");
printf("\n\t\t");
system("pause");
exit(0);
}
}
}