资源描述
电话簿管理系统课程设计
精品文档
课程设计
电话簿管理系统VER1.0
系 别 :
计算机科学与技术系
专业(班级):
电子信息科学与技术2班
姓名
徐楚奇
学号
51202022022
指导教师:
赵翔
完成日期:
2014年11月7日
目 录
摘要 3
第一章 前言 4
第二章 电话簿管理系统介绍 5
2.1 流程图 5
2.2 程序编写概要 6
第三章 主要功能实现 7
3.1 删除功能设计 7
3.2 添加功能设计 7
第四章 源程序 9
第五章 总结心得 23
致谢 24
参考文献 24
摘要
本次课程设计的题目是个人通讯录管理系统,要求将程序中所输人的联系人姓名、电话、QQ、MSN和地址信息这些数据以文本的方式保存,并且能够对所储存的联系人信息进行显示、查询、修改、删除等功能。
本文通过利用模块化程序设计思想,使用单链表和结构体等编写出的可以实现存储、打印、删除等功能的电话簿管理系统。通过完成这个课程设计让我们熟悉并掌握在c语言中使用结构体、单链表,指针,函数,和模块化设计思想。
关键词 结构体,链表,指针,函数
第一章 前言
在前面我们学习了c语言的一些基础知识对c语言有了初步的认识和了解,为了让我们更加全面地了解c语言程序设计的步骤和方法,在老师的指导下 我们进行了一次综合实训。设计一个简单的电话簿管理系统,可以存储,删除等电话号码。为了方便使用DEV-C++来编写程序,可以添加汉字备注方便理解程序。根据前面所学的单链表、指针、函数、结构体等知识在使用模块化设计思想去编写。设计“通讯录管理系统”使其具有数据插入、修改、删除、显示和查询等功能。使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
其功能包括以下各项:
1)数据包括:人名、电话号码。
2)可对记录中的姓名和电话号码进行修改。
3)可增加或删除记录。
4)可显示所有保存的记录。
第二章 电话簿管理系统介绍
2.1 流程图
电话簿管理系统因具备以下功能有流程图表示,如下图2.10
电话簿管理系统
新建一个电话簿
插入新的记录
打印所有记录
读取文件
保存当前输入的内容
退出系统
查找功能
添加新记录
图2.10
2.2程序编写概要
1 主函数 main()
主函数使用户进入电话簿管理系统主界面——用户选择界面,用户可以选择要使用的功能并选择相应的选项进入该功能。使用printf函数和switch case结构来编写主函数。
2 creat()函数
creat函数用来建立新的电话号码簿,用户可以通过它来向系统输入数据。为下面的操作提供数据。
3 delete函数
delete函数用来删除不需要的数据,可以用单链表来实现,并要记住用free函数来释放被删除链表的空间,避免浪费空间。
4 save函数
当需要保存已输入的数据时就需要用到save函数,该函数可以将数据存储到指定的地方为以后使用。
5 load函数
顾名思义load函数是将所存的数据从文件所在位置读取出来以便做打印等处理。
6 search函数
当存入很多文件时候,再用普通的方法打印输出所有数据再查找文件中的目标文件就会很麻烦,这时你需要从已存文件中快速找出你所想要的用户的电话号码就要选择此功能,他可以快速找出你所输入用户名的电话号码,简单方便。
7 append函数
Append函数用来像已有的文件中添加新的电话号码文件。
8 modify函数
在你无意中或心急的时候很有可能将数据输入错误,所以你还需要具有修改数据的功能,将错误的数据重新输入在进行保存工作,确保数据的正确性,modify函数具有该功能。
第三章 主要功能实现
3.1 删除功能设计
单链表中的元素是可以删除的,要想删除指定的元素逻辑上是把它从单链表中分离出来,并调用free函数释放其储存空间。
算法如下:
删除链表中的第i个结点,就是要让其前驱的指针绕过该结点,指向该结点的后续结点。假设指针P已经指向链表中的第i-1个结点,如图3.10所示。则删除a[i]结点最基本的操作可以用一条语句实现:p->next=p->next->next。
a[i+1]
NULL
a[1]
a[i]
a[i-1]
head p
…
图3.10
这样操作会浪费掉所有删除的结点空间。如果被删除的结点不再使用了,则释放其存储空间,因此需要按如下方式实现:
temp=p->next;
p->next=temp->next;
free(temp);
3.2 添加功能设计
链表的插入是指将一个结点插入到一个已有的链表中去。
算法如下:
首先产生新结点,并放入数据,然后搜索要插入的位置,再将结点连入到已有链表中。设指针p已经指向了a[i-1]结点,且要插入结点(值为data)由s指向,如图3.20所示,则插入的操作由下面两个语句来实现。
s->next=p->next;
p->next=s;
上面的两条插入语句顺序不可颠倒。
P
a[i-1]
a[i]
X
data
S
图3.20
第四章 源程 序
#include<stdio.h>
#include<malloc.h>
typedef struct contacts
{
char name[20]; //your friend's name
char tele[20]; //your friend's telephone
char QQ[15] ; //your friend's QQ (0- 4294967295)
char e_mail[30];//your friend's E-mail
struct contacts *pre;
struct contacts *next;
}CON;
void Dis_menu(void)
{
printf("\n****************MENU***************\n \n ");
printf(" 1. New Contact. \n");
printf(" 2. Edit Contact. \n");
printf(" 3. Search Contact. \n ");
printf(" 4. Delete Contact. \n");
printf(" 5. Show All Contact. \n");
printf(" 6. Exit The System. \n");
printf("**********************************\n ");
}
int Menu_chose(void)
{
int chose;
Dis_menu();
Lp:
printf("Please Input you choice (1 ~ 6):");
scanf("%d",&chose);
if(chose < 10&&chose > 0)
{
return chose;
}
else
{
printf("Warning!!! ");
goto Lp;
}
}
void Con_input(CON *load)
{
if(load == NULL)
{
printf("Failded In malloc for new node! \n");
return ;
}
printf("\n Please Input Friend's Name:\n");
scanf("%s",load->name);
printf(" Please Input Friend's Mobile:\n");
scanf("%s",load->tele);
printf(" Please Input Friend's QQ:\n");
scanf("%s",load->QQ);
printf(" Please Input Friend's E-mail:\n");
scanf("%s",load->e_mail);
printf("\n");
}
CON *Insert_contact(CON *head,CON *load)
{
if(head==NULL) //The fist friend
{
load->pre=NULL;
load->next=NULL;
head=load;
printf("Check_1");
}
else
{
head->pre=load;
load->next=head;
load->pre=NULL;
head=load;
printf("Check_2");
}
return head;
}
//chose 1 New Contact
CON *Add_contact(CON *head)
{
CON *load=(CON *)malloc(sizeof(CON));
Con_input(load);
head=Insert_contact(head,load);
return head;
}
CON *read_file(CON *head)
{
FILE *fp=fopen("/home/kuye/phone","rb+");
int ret=0;
while(feof(fp)==0)
{
CON *load=(CON *)malloc(sizeof(CON));
if(load==NULL)
{
printf("[%s][%d]:failed in malloc\n",__FUNCTION__,__LINE__);
fclose(fp);
return NULL;
}
ret=fread(load,sizeof(CON),1,fp);
printf("ret = %d\n",ret);
if(ret==1)
{
head=Insert_contact(head,load);
}
else
{
free(load);
}
}
return head;
}
//chose 2 Edit Contact
void Edit_name(CON *load)
{
if(load==NULL)
{
printf(" Please Check You Input ");
return ;
}
Con_input(load);
}
//chose 3 Search Contact
CON *find_name(CON *head)
{
CON *load = head;
char Found_name[20];
printf("Please Enter To Your Contact Name :\n");
scanf("%s",Found_name);
while(load != NULL)
{
if(strcmp(load->name ,Found_name)==0)
{
return load;
}
load = load->next;
}
printf(" It's not Find !!! \n");
return NULL;
}
//chose 4 Delete Contact.
CON* Delete_name(CON *head)
{
CON*load = head;
load = find_name(head);
if(head->pre==NULL&&head->next==NULL)
{
free(head);
return NULL;
}
if(head->pre==NULL)
{
head->next->pre=NULL;
head=head->next;
free(head);
return head;
}
else if(load->next==NULL)
{
load->pre->next=NULL;
free(load);
return head;
}
else
{
load->next->pre=load->pre;
load->pre->next=load->next;
free(load);
return head;
}
}
//chose 5 Show All Contact.
void show_all_nodes(CON *head)
{
CON *load = NULL;
load = head;
printf("\n----------------ALL CONTACT-------------------\n");
if(load == NULL)
{
printf(" NULL.You Can choce Menu 1 To ADD Contact");
printf("\n----------------------------------------------\n");
}
while(load != NULL)
{
printf(" Name : %s \n Tele : %s \n Q Q : %s \n E-mail: %s \n",load->name,load->tele,load->QQ,load->e_mail);
printf("\n----------------------------------------------\n");
load=load->next;
}
}
void delete_all_nodes(CONT *head)
{
CON *load=head;
CON *pNext=NULL;
int ret;
FILE *fp=fopen("/home/kuye/phone","wb+");
if(fp==NULL)
{
printf("failed in open written file\n");
return ;
}
while(load!=NULL)
{
head=load->next;
ret=fwrite(load,sizeof(CONT),1,fp);
printf("ret= %d\n",ret);
free(load);
load=head;
}
fclose(fp);
}
int main()
{
int chose;
char Sure;
CON *pst=NULL;
CON *fd=NULL;
pst=read_file(pst);
while(1)
{
chose = Menu_chose();
switch(chose)
{
case 1://New
printf("\n--------------NEW CONTACT--------------");
pst=Add_contact(pst);
break;
case 2://Edit
printf("\n--------------EDIT CONTACT--------------\n");
fd =find_name(pst);
Edit_name(fd);
break;
case 3://Search
fd = find_name(pst);
if(fd != NULL)
{
printf("\n-------------SEARCH CONTACT-------------\n");
printf(" Name : %s \n Tele : %s \n Q Q : %s \n E-mail: %s \n",fd->name,fd->tele,fd->QQ,fd->e_mail);
printf("-----------------------------------------\n");
}
break;
case 4://Delete
pst = Delete_name(pst);
break;
case 5://Show
show_all_nodes(pst);
break;
case 6://Exit
printf(" Are you Sure Exit? (Y/N) \n ");
LOOP:
scanf("%s",&Sure);
if(Sure == 'Y'||Sure == 'y')
{
delete_all_nodes(pst);
return 1;
}
else if(Sure == 'N'||Sure == 'n')
{
;
}
else
{
printf(" Warning !!! Please Input Y/N.. \n ");
goto LOOP;
}
break;
}
}
return 1;
}
第五章 总结心得
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,而在学期末我们也进行了一次C语言程序设计,对我们来说也是进入大学的第一次,很有难度,也很有挑战性,刚开始可以说是充满了恐惧心理的。但我们不能后退,所以同学们就大家一起合作,相信团结就能解决问题。因为我们的知识都是不完整所以得互补,相信互补的力量强大。
通过为期一周的课程设计,我们对《C语言》这门课程有了更深一步的了解。它是计算机程序设计的重要理论技术基础,在我们信息与计算科学专业的学习中占据着十分重要的地位。同时也使我们知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。因为我们学习知识就是为了实践。而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。
致谢
在整个程序设计的过程中,赵老师给了我们很大的帮助,从论文的排版到程序的设计在到上机得调试老师不怕麻烦一一为我们指导,感谢赵老师的重要帮助。
参考文献
[1]郭有强,《C语言程序设计》,清华大学出版社
[2]谭浩强,《C程序设计》,清华大学出版社
[3]刘振安,孙忱,刘燕君,《C程序设计课程设计》,机械工业出版社
[4]汪诗林,《数据结构算法与应用》,机械工业出版社
[5]李云清,杨庆红,揭安全.数据结构(C语言版)[M]. 北京:人民邮电出版社
[6]李春葆. 数据结构(C语言版)习题与解析[M].北京:清华大学出版社
收集于网络,如有侵权请联系管理员删除
展开阅读全文