********************************************************************/
#include"ccx.h"
void choose();//主菜单
void searchmenu();//查询菜单
void add();//添加新纪录 添加新用户
void searchna();//按条件(姓名)搜索记录
void display();//显示全部记录
void load();//载入文件内容
void save();//写入文件
void del();//删除记录
void listinsert();//插入结点函数
void bianji();//编辑
void dial();//拨号
/***********************主函数************************************/
/***********************************************************
*功能描述: 主函数
*输入参数: 无
*输出参数: 无
*返回值: 无
*************************************************************/
int main() //主函数
{
load();
listinsert();
while (1)
choose(); //进入主菜单,有非法输入仍停留在主菜单
return 0;
}
/***********************主函数************************************/
/***********************load函数*****************************/
/***********************************************************
*功能描述: 装载导入文件
*输入参数: 无
*输出参数: 无
*返回值: 无
*************************************************************/
void load()//装载已有文件信息
{
if((fp=fopen("txl.txt","rb"))==NULL)
{
printf("\n\t\t通讯录文件不存在");
if ((fp=fopen("txl.txt","wb"))==NULL)
{
printf("\n\t\t建立失败");
exit(0);
{
printf("\n\t\t通讯录文件已建立");
printf("\n\t\t按任意键进入主菜单");
getch();
}
}else
return;
exit(0);
}
//导入文件功能部分
fseek(fp,0,2);
if (ftell(fp)>0)
{
rewind(fp);
for(len=0;!feof(fp)&&fread(&yong[len],sizeof(struct yonghu),1,fp);len++);
printf("\n\t\t文件导入成功");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
printf("\n\t\t文件导入成功");
printf("\n\t\t通讯录文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
void listinsert()//增加新结点
{
linklist s,p=l;
for(int i=0;idata.name,yong[i].name);
strcpy(s->data.fm,yong[i].fm);
strcpy(s->data.addr,yong[i].addr);
strcpy(s->data.tel,yong[i].tel);
strcpy(s->data.group,yong[i].group);
strcpy(s->data.kuaijie,yong[i].kuaijie);
s->data.tms=yong[i].tms;
if(head==NULL) //若为空,则建立新节点//////////////////////////////////////////////////
{
head=s;
r=head;
head->next=NULL;
}
else //否则,插入节点////////////////////////尾插法
{
r->next=s;
r=s;
r->next=NULL;
}///////////////////////////////////
}
}
/*********************主菜单界面********************************/
/***********************************************************
*功能描述: 提供选择界面
*输入参数: 选择键
*输出参数: 无
*返回值: 无
*************************************************************/
void choose()//主菜单
{
char ch;
system("cls");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
printf("\n\t\t***************欢迎进入通讯录系统***************");
printf("\n\t\t******************1-新添纪录 ***************");
printf("\n\t\t******************2-查找联系人 ***************");
printf("\n\t\t******************3-删除联系人 ***************");
printf("\n\t\t******************4-保存 ***************");
printf("\n\t\t******************5-退出 ***************");
printf("\n\t\t******************6-编辑 ***************");
printf("\n\t\t******************7-拨号 ***************");
printf("\n\t\t******************7-发送信息 ***************");
printf("\n\t\t************************************************");
printf("\n★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
printf("\n\t\t请选择:");
printf("%c ",ch=getch());
switch (ch)
{
case '1':add();break;
case '2':searchmenu();break;
case '3':del();break;
case '4':save();break;
case '5':exit(0);
case '6':bianji();break;
case '7':dial();break;
default:choose();
}
}
/*********************主菜单界面********************************/
/***********************************************************
*功能描述: 添加新用户
*输入参数: 新用户信息
*输出参数: 无
*返回值: 无
*************************************************************/
void add()//添加新纪录
{
int x;
int a=0,i,findmark;
l=(linklist)malloc(sizeof(pnode)); //建立头节点
printf("\n\t\t**************** 请输入用户信息 ****************\n");
printf("\n\t\t姓名:");
scanf("%s",&yong[len].name);
printf("\n\t\t性别:");
scanf("%s",&yong[len].fm);
printf("\n\t\t地址:");
scanf("%s",&yong[len].addr);
printf("\n\t\t联系方式:");
scanf("%s",&yong[len].tel);
printf("\n\t\t分组:");
scanf("%s",&yong[len].group);
printf("\n\t\t快捷键:");
scanf("%s",&yong[len].kuaijie);
len++;
printf("\n\t\t==============新用户添加成功=============================\n");
printf("\n\t\t=============是否继续添加新用户==========================\n");
printf("\n\t\t======继续添加请选1 返回主界面请选2=============\n");
scanf("%d",&x);
if(x==1)
{
add();
}
if(x==2)
{
choose();
}
}
/***********************************************************
*功能描述: 查询选择菜单
*输入参数: 选择键
*输出参数: 无
*返回值: 无
*************************************************************/
void searchmenu()//查询菜单
{
char ch;
system("cls");
printf("\n\t\t=================查询菜单 =======================");
printf("\n\t\t================1-显示所有记录===================");
printf("\n\t\t================2-按姓名查询=====================");
printf("\n\t\t================3-返回主菜单=====================");
printf("\n\t\t=================================================");
printf("\n\t\t请选择:");
printf("%c",ch=getch());
switch (ch)
{
case '1':display();break;
case '2':searchna();break;
case '3':choose();break;
}
}
/***********************************************************
*功能描述: 按照输入的用户姓名进行查找
*输入参数: 用户姓名
*输出参数: 用户所有信息
*返回值: 无
*************************************************************/
void searchna()////查找按姓名
{
printf("\n\t\t======================按姓名查找 =============================");
char name[20];
printf("\n\t\t请输入姓名:");
scanf("%s",name);
printf(" \n\t\t查询到的信息:\n");
printf(" %-10s%-10s%-10s%-10s%-10s%-s\n","姓名","地址","联系方式","分组","快捷键","性别");//格式控制输出
printf(" -----------------------------------------------------------------------------\n");
for (int i=0;idata.name);
strcpy(yong[i].name,s->data.name);
}
if(xuan==2)
{
printf("请输入新用户地址\n");
scanf("%s",&s->data.addr);
strcpy(yong[i].addr,s->data.addr);
}
if(xuan==3)
{
printf("请输入新联系方式\n");
scanf("%s",&s->data.tel);
strcpy(yong[i].tel,s->data.tel);
}
if(xuan==4)
{
printf("请输入新用户分组\n");
scanf("%s",&s->data.group);
strcpy(yong[i].group,s->data.group);
}
if(xuan==5)
{
printf("请输入新用户快捷键\n");
scanf("%s",&s->data.kuaijie);
strcpy(yong[i].kuaijie,s->data.kuaijie);
}
printf("\n\t\t编辑成功");
} //endif
} //endif
else
continue;
} //endfor
if(!findmark)//没有找到任何符合条件的记录 输入为注册过的用户时
printf("\n\t\t没有其他符合条件的记录!");
printf("\n\t\t继续编辑请按1 返回主界面请按2 \n"); //无同名纪录,是否继续删除其他纪录
scanf("%d",&ch);
if (ch==1)
bianji();
if(ch==2)
Sleep(3000);
choose();//继续删除其他纪录
}
/***********************************************************
*功能描述: 拨号或者发送信息
*输入参数: 选择键,姓名,快捷键
*输出参数: tms
*返回值: 无
*************************************************************/
void dial() //拨号功能
{
int c,choic;
int ch,xuan;
int r;
pnode *p;
pnode *s;
int a=0,i,j,findmark; //findmark为查找结果标志
char name[20];
char b[20];
printf(" \n");
printf("+------------------------------------------------+\n");
printf("\n\t\t 请按要求输入您的选择\n");
printf("+ 使用用户姓名联系请按(1) 使用快捷键联系请按(2) +\n"); //两种拨号方式
printf("+----------------------------------------------+\n");
scanf("%d",&r);
p=head;
if(r==1)
{
printf(" 请输入联系用户的姓名:\n");
scanf("%s",name);
for (i=a;idata.name)!=0&&p!=NULL)//进行查找 查找用户名为name的用户
p=p->next;
if(p==NULL)//用户不存在
{
printf("+----------------------------------------------+\n");
printf(" 您选择的用户不存在!\n");
printf("+----------------------------------------------+\n");
printf("+ 重新输入请按(1) 返回主菜单(2) +\n");
printf("+----------------------------------------------+\n");
scanf("%d",&choic);
if(choic==1)
{
system("cls");
dial();
}
if(choic==2)
{
system("cls");
choose();
}
}
else//找到此用户 名为name
{
printf("呼叫此用户请按1,发送信息到此用户请按2");
int v;
scanf("%d",&v);
if(v==1)
{
printf("+----------------------------------------------+\n");
printf(" loding------ \n");
for(int j=0; j<20; j++) //运用时间函数,实现拨号界面
{
Sleep(100);
printf("■■");
}
printf(" \n");
printf(" \n");
Sleep(2000);
printf("%s\n",&p->data.tel);
p->data.tms=p->data.tms+1;
printf("+----------------------------------------------+\n");
printf("拨打次数: %d",p->data.tms);
printf("+----------------------------------------------+\n");
printf("\n\t\t稍后返回主界面\n");
Sleep(5000);
}
if(v==2)
{
printf("\n\t\t\=========\n");
char neirong[200];
printf("\n\t\t请输入要发送的内容\n");
scanf("%s",neirong);
printf("\n\t\t发送中......\n");
for(int j=0; j<20; j++) //运用时间函数,实现拨号界面
{
Sleep(100);
printf("■■");
}
printf("\n\t\t发送成功\n");
Sleep(2000);
printf("\n\t\t稍后返回主界面\n");
Sleep(5000);
}
}
}
else
{
printf("\n\t\t请输入快捷键号码:\n");
scanf("%s",&b);
while(p!=NULL&&strcmp(b,p->data.kuaijie)!=0) //遍历链表比较查询 遍历查询 利用快捷键
p=p->next;
if(p==NULL)
{
printf("\n\t\t 您输入的单键号码不存在!\n");
printf("\n\t\t+----------------------------------------------+\n");
printf("\n\t\t+ 重新输入请按(1) 返回主菜单(2) +\n");
printf("\n\t\t+----------------------------------------------+\n");
scanf("%d",&choic);
if(choic==1)
{
dial();
}
if(choic==2)
{
Sleep(2000);
system("cls");
choose();
}
}
else
{
printf("呼叫此用户请按1,发送信息到此用户请按2");
int v;
scanf("%d",&v);
if(v==1)
{
printf(" \n");
printf(" loding------ \n");
for(int j=0; j<20; j++)
{
Sleep(100);
printf("■■");
}
printf(" \n");
printf(" \n");
Sleep(5000);
printf("%s\n",p->data.name);
printf("%s\n",p->data.tel);
p->data.tms=p->data.tms+1;
printf("\n\t\t+----------------------------------------------+\n");
printf("拨打次数: %d",p->data.tms); //显示拨打次数
printf("\n\t\t+----------------------------------------------+\n");
printf("\n\t\t稍后回到主界面\n");
Sleep(5000);
}
if(v==2)
{
printf("\n\t\t=============\n");
char neirong[200];
printf("\n\t\t请输入要发送的内容\n");
scanf("%s",neirong);
printf("\n\t\t发送中......\n");
for(int j=0; j<20; j++) //运用时间函数,实现拨号界面
{
Sleep(100);
printf("■■");
}
printf("\n\t\t发送成功\n");
Sleep(2000);
printf("\n\t\t稍后返回主界面\n");
Sleep(5000);
}
}
}
}*/
头文件
ccx.h
#ifndef CCX_H_INCLUDED #define CCX_H_INCLUDED #include
#include #include #include #include #include #define maxl 1000 struct yonghu { char name[20];//姓名 char fm[20];//性别 char addr[20];//地址 char tel[20];//联系方式 char group[20]; //分组 char kuaijie[20];//快捷键 int tms;//拨打次数 }yong[maxl];//1000个记录,可修改 struct pnode { yonghu data; struct pnode *next/*, *prior*/;//双循环链表 }; typedef pnode * linklist; linklist head=NULL,r=NULL; //初始化链表 单链表 linklist l; int len=0;//链表长度 FILE *fp; //文件指针 #endif // CCX_H_INCLUDED
运行结果
主界面
新添记录
查询
删除
编辑
拨号/发送信息
设计心得:
利用了单链表,将每个独立的用户已一个个节点的形式连到一起,在基本的“增删改查”中加入了退出、保存以及拨号和发送信息界面
讲头文件与cpp文件链接运行,实现以上功能