资源描述
C语言课程设计汇报
课题名称 通讯录管理系统
姓 名 × × ×
系 别
班 级
指导老师
日 期
江 海 职 业 技 术 学 院
目 录
一、 需求分析…………………………………………………………
二、 概要设计…………………………………………………………
1.系统功效组成框图………………………………………………………………
2.模块功效说明……………………………………………………………………
三、 具体设计…………………………………………………………
1. 数据结构设计 …………………………………………………………………
2.主函数设计 …………………………………………………………………
3.输入模块设计 ………………………………………………………………
4.浏览模块设计…………………………………………………………………
5.查询模块设计…………………………………………………………………
6. 插入模块设计…………………………………………………………………
7. 删除模块设计…………………………………………………………………
8、排序模块设计…………………………………………………………………
9、修改模块设计…………………………………………………………………
四、 设计及调试分析…………………………………………………
五、 用户手册…………………………………………………………
六、 测试数据…………………………………………………………
七、 心得体会…………………………………………………………
八、 附录
附录1:程序代码
附录2:参考文件
通讯录管理系统
一、 需求分析
1. 操作对象有多个属性,故其类型为结构体类型
2. 多个对象数据录入采取循环实现
3. 通讯录信息保留到文件中,包含到文件读写操作。
4. 排序操作可采取冒泡排序和选择法排序
5. 主函数中依据用户不一样选择实施不一样操作可经过“多分支选择语句switch”实现
二、 概要设计
1.系统功效组成框图
通讯录管理系统
录入
显示
查询
删除
修改
排序
姓名升序
姓名降序
电话号码升序
电话号码降序
按姓名查询
按电话号码查询
2.数据结构设计
通讯录为结构体,组员包含姓名、电话号码、住址
struct 结构体名
{
姓名类型定义;
电话号码类型定义;
住址类型定义;
};
3.模块功效说明
本程序包含七个组要模块
3.1主程序模块
main()
{
清屏并显示主菜单提醒用户选择所要实施操作
依据用户选择实施对应模块
}
3.2录入模块——实现通讯信息录入
3.3显示模块——实现通讯录信息显示
3.4查询模块——按用户指定要求(姓名或电话号码)查询指定对象通讯信息
3.5删除模块——删除对应对象通讯信息
3.6修改模块——修改对应对象通讯信息
3.7排序模块——按用户指定要求(姓名或电话号码)将通讯信息进行排序
三、 具体设计
1、通讯录类型定义
typedef struct person
{
char name[10]; /* 姓名 */
char tel[20]; /* 电话号码 */
char addr[50]; /* 住址 */
} PERSON;
2、通讯录基础操作实现
void showTitle(); /* 显示标题行 */
void sortSubMenu(); /* 排序菜单 */
void inputFileName(); /* 输入通讯录文件名 */
void createBook(); /* 新建通信录 */
void displayBook(); /* 显示通信录信息 */
void searchBook(); /* 按姓名查找统计 */
void appendBook(); /* 添加统计 */
void modifyBook(); /* 依据姓名修改统计 */
void deleteBook(); /* 按姓名删除统计 */
void saveBook(PERSON *, int); /* 保留通信录 */
int loadBook(PERSON *); /* 装载通信录 */
void swap(PERSON *, PERSON *); /* 交换统计 */
void sDescByName(); /* 按姓名降序排序 */
void sAscByName(); /* 按姓名升序排序 */
void sDescByTelephone(); /* 按电话号码降序排序 */
void sAscByTelephone(); /* 按电话号码升序排序 */
3、程序具体代码
/*
源程序名: myfile.C
程序功效: 编程建立一通讯簿,存放有姓名、电话号码、住址,完成新建、查找、添加、
修改、删除及排序等功效。
*/
#include<stdio.h> /* 标准I/O函数 */
#include "conio.h" /* 屏幕操作函数 */
typedef struct person
{
char name[10]; /* 姓名 */
char tel[20]; /* 电话号码 */
char addr[50]; /* 住址 */
} PERSON;
char filename[20];
FILE *fp;
void showTitle(); /* 显示标题行 */
void sortSubMenu(); /* 排序菜单 */
void inputFileName(); /* 输入通讯录文件名 */
void createBook(); /* 新建通信录 */
void displayBook(); /* 显示通信录信息 V1 */
void dispBook(); /* 显示通信录信息 V2 */
void searchBook(); /* 按姓名查找统计 */
void appendBook(); /* 添加统计 */
void modifyBook(); /* 依据姓名修改统计 */
void deleteBook(); /* 按姓名删除统计 */
void saveBook(PERSON *, int); /* 保留通信录 */
int loadBook(PERSON *); /* 装载通信录 */
void swap(PERSON *, PERSON *); /* 交换统计 */
void sDescByName(); /* 按姓名降序排序 */
void sAscByName(); /* 按姓名升序排序 */
void sDescByTelephone(); /* 按电话号码降序排序 */
void sAscByTelephone(); /* 按电话号码升序排序 */
/* 输入通讯录文件名 */
void inputFileName()
{
printf("\nInput FileName(请输入通讯录文件名):");
scanf("%s",filename);
}
/* 新建通信录 */
void createBook()
{
PERSON one;
fp = fopen(filename, "wb");
if(fp= = NULL)
{
printf("\n不能建立通讯簿!");
exit(0);
}
clrscr();
printf("\nInput Name, Telephone, Address(0-End)请输入姓名、电话号码及住址
(以0结束): \n");
scanf("%s", one.name);
while(strcmp(one.name, "0")!=0)
{
scanf("%s%s", one.tel, one.addr);
fprintf(fp, "%-10s %-20s %-50s", one.name, one.tel, one.addr);
scanf("%s", one.name);
}
fclose(fp);
}
/* 显示表头 */
void showTitle()
{
clrscr();
gotoxy(20, 5);
printf("%s\n","TXL(通 讯 簿)");
printf("%50s\n","==================================================");
printf("%-10s%-20s%-50s\n", "Name", "Telephone", "Address");
}
/* 交换统计*/
void swap(PERSON *pi, PERSON *pj)
{
PERSON temp; /* 临时变量做交换数据用 */
strcpy(temp.name, pi->name);
strcpy(temp.tel, pi->tel);
strcpy(temp.addr, pi->addr);
strcpy(pi->name, pj->name);
strcpy(pi->tel, pj->tel);
strcpy(pi->addr, pj->addr);
strcpy(pj->name, temp.name);
strcpy(pj->tel, temp.tel);
strcpy(pj->addr, temp.addr);
}
/* 保留函数,参数为指向结构体数组指针和统计数 */
void saveBook(PERSON *p, int recordNum)
{
int i;
FILE *fp; /*指向文件指针*/
fp = fopen(filename, "wb");
if(fp= = NULL) /*打开文件,并判定打开是否正常*/
{
printf("can not open file\n");/* 打开文件犯错 */
exit(1); /*退出*/
}
/* 保留文件信息 */
for(i = 0; i < recordNum; i++)
{
fprintf(fp, "%-10s%-20s%-50s\n",p->name, p->tel, p->addr);
p++;
}
fclose(fp);/*关闭文件*/
}
/* 读入函数,参数为指向结构体数组指针,返回统计数 */
int loadBook(PERSON *p)
{
int recordNum; /* 统计统计数 */
FILE *fp; /* 指向文件指针 */
fp = fopen(filename, "rb")
if(fp= = NULL) /* 打开文件 */
{
printf("can not open file\n"); /*不能打开*/
exit(0); /*退出*/
}
recordNum = 0;
while(feof(fp)!=1)/*未到文件末尾*/
{
fscanf(fp, "%s%s%s\n", p->name, p->tel, p->addr);/*从文件读入统计*/
p++;
recordNum++;
}
fclose(fp);
return recordNum; /*返回统计数*/
}
/* 显示通信录信息,一次性读入后再显示,适适用于小文件 */
void displayBook()
{
PERSON ones[50];
int count = 0;
int recordNum;
recordNum = loadBook(ones); /* 装载整个文件统计 */
showTitle();
while(count < recordNum)
{
printf("%-10s%-20s%-50s", ones[count].name, ones[count].tel,
ones[count].addr);
count++;
if (!(count % 10))
{
printf("\nPress any key to continue.\n\n");
getch();
showTitle();
}
}
getch();
}
/* 按姓名查找统计 */
void searchBook()
{
int k=0;
char namekey[10];
PERSON one;
printf("\n请输入姓名:");
scanf("%s",namekey);
fp=fopen(filename, "rb");
if(fp= =NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
while(!feof(fp))/*未到文件末尾*/
{
fscanf(fp, "%s%s%s\n", one.name, one.tel, one.addr);
if(strcmp(namekey,one.name)= =0)
{
printf("\n\n已查到,统计为:");
printf("\n%-10s%-18s%-50s", one.name, one.tel, one.addr);
k=1;
}
}
if(k==0)
printf("\n\n对不起,通讯簿中没有此人统计。");
fclose(fp);
getch();
}
/* 添加统计 */
void appendBook()
{
}
/* 按姓名修改统计 */
void modifyBook()
{
}
/* 按姓名删除统计 */
void deleteBook()
{
}
/****************************** 选择排序 *****************************/
/* 按姓名进行降序排序 */
void sDescByName()
{
int i, j, k;
int recordNum; /* 统计数 */
PERSON ones[50];
recordNum = loadBook(ones); /* 装载整个文件统计 */
for(i = 0; i < recordNum - 1; i++)
{
k = i;
for(j = i+1; j < recordNum; j++)
{
if((strcmp(ones[k].name, ones[j].name)) < 0) /*比较大小*/
{
k = j;
}
}
if(k != i)
{
swap(&ones[i], &ones[k]);
}
}
saveBook(ones, recordNum); /* 保留排序结果到数据文件 */
printf("\nSort completed!");
getch();
}
/* 按电话号码进行降序排序 */
void sDescByTelephone()
{
}
/****************************** 冒泡排序 *****************************/
/* 按姓名进行升序排序 */
void sAscByName()
{
}
/* 按电话号码进行升序排序 */
void sAscByTelephone()
{
}
void sortSubMenu()/*排序方法选择菜单*/
{
/* 1> AscByName 2> DescByName
3> AscByTelephone 4> DescByTelephone
*/
}
void main()/*主程序*/
{ clrscr();
inputFileName();
char temp[20],ch;
while(1)
{
clrscr(); /*清屏幕*/
gotoxy(1, 1); /*移动光标*/
textcolor(WHITE); /*设置文本显示颜色为白色*/
textbackground(BLUE); /*设置背景颜色为蓝色*/
window(1, 1, 99, 99); /* 制作显示菜单窗口,大小依据菜单条数设计*/
clrscr();
printf("\n\n\n\n\n");
printf("\t*********** welcome to use TXL manage *******************\n");
printf("\t* *\n");
printf("\t* ========================================================= *\n");
printf("\t* *\n");
printf("\t* 1> createBook 2> appendBook *\n");
printf("\t* 3> searchBook 4> modifyBook *\n");
printf("\t* 5> deleteBook 6> sortBook *\n");
printf("\t* 7> displayBook 0> exit *\n");
printf("\t* --------------------------------------------------------- *\n");
printf("\t Please input which you want(0-7):");
ch = getch();
switch(ch)
{
case '1': createBook();
break;
case '2': appendBook();
break;
case '3': searchBook();
break;
case '4': modifyBook();
break;
case '5': deleteBook();
break;
case '6': sortSubMenu();
break;
case '7': displayBook();
break;
case '0': exit(0);
default: continue;
}
}
}
SDescByName SDescByTelephone sAscByName sAscByTelephone
Creat
Book
Display
Book
Search
Book
Append
Book
Modify
Book
sortSubMenu
Delete
Book
main
4、函数调用
五、设计和调试分析
1、因为每个通讯统计包含三个组员,所以其类型为自定义结构体类型
2、为方便调试及扩充程序功效,采取了模块化程序设计方法
(每个同学依据自己设计和调试情况进行充实)
六、用户手册
1. 本程序运行环境为DOS操作系统,实施文件为myfile.exe。
2. 进入程序myfile.exe后进入界面,提醒输入结果文件名:
3. 进入系统主菜单,依据需要实施操作输入对应数字:
1:创建通讯录 2:添加统计 3:按姓名查找统计 4:修改统计
5:删除统计 6:排序 7:显示全部 8:退出
当输入数字6进行排序操作时,会出现子菜单提醒选择排序方法:
1:按姓名升序排列 2:按电话号码升序排列
3:按姓名降序排列 4:按电话号码降序排列
七、测试数据
姓名 电话号码 住址
hyh 7799000 JG-1-203
zhangsan 5566435 XS-10-405
liwen 4 XS-5-304
八、附件
myfile.c /*源程序*/
readme.txt /*程序说明*/
九、心得体会
汇报不许可雷同,不然无法给成绩!
展开阅读全文