一、需求分析
(1) 建立一个新的通讯录查询系统 (2)对已存在的通讯簿进行增加,删除操作 (3)屏幕显示通讯簿内容 (4)可以按姓名,电话等信息进行查询 (5) 系统接口采用菜单方式对应各个功能模块
二、系统设计
??整个设计要求要有显示,输入,修改,查找,删除等几个主要的功能。并且在每个功能使用前读取文件中保存的数据和在结束后自动保存操作后的数据。查找功能要满足按姓名和按城市排序的功能要编写两种按不同方式查找的子函数,在查找时因为要用到折半查找法,因此要编写能完成相应的排序功能的子函数,系统接口应采用菜单方式从而对应各个功能,在选择相应的功能时可以调用相关的子函数完成其功能,并在之后可以重新回到主菜单并继续其它操作,直到使用者想要退出通讯簿。
三、完整代码
通讯录查询系统完整代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#define HASHSIZE 53
#define MAXSIZE 200
#define N 3
typedef struct
{
char num[20];
char name[20];
char add[20];
} Person;
typedef struct
{
Person *elem[HASHSIZE];
int c;
int m;
}HashTable;
typedef char T[MAXSIZE];
typedef char W[MAXSIZE];
typedef char U[MAXSIZE];
HashTable* H;
int size=0;
Person a[MAXSIZE];
int NUM;
void delay();
void Create();
void List();
void Creat_hash();
void Find();
void Alter();
void Append();
void Delete();
void Save();
void Load();
void Quit();
void Menu();
void land();
void input_ma();
void land()
{
int i;
char zh[20]={0};
delay();
for(i=0;i<3;i++)
{
printf("账号:");
scanf("%s",zh);
if(strcmp("123456",zh)==0)
{
input_ma();
}
else
{
printf("账号错误\n");
}
if(3==i)
{
exit(0);
}
}
}
void input_ma()
{
int i;
char mm[20]={0};
for(i=0;i<3;i++)
{
printf("密码:");
scanf("%s",mm);
if(strcmp("888888",mm)==0)
{
system("cls");
printf("\t\t\t\t______________________________________\n");
printf("\t\t\t\t|****************提示*****************|\n");
printf("\t\t\t\t|*******按4,5,6键之前,需按3键******|\n");
printf("\t\t\t\t|***********欢迎进入主菜单************|\n");
printf("\t\t\t\t|_____________________________________|\n");
Menu();
}
else
{
printf("密码错误\n");
}
if(3==i)
{
exit(0);
}
}
}
void delay()
{
long int b1;
int b2;
for(b1=600000;b1>0;b1--)
{
for(b2=500;b2>0;b2--);
}
}
void Create()
{
system("cls");
FILE *fp1,*fp2;
if((fp1=fopen("p.txt","r"))!=NULL)
{
fclose(fp1);
printf("已有文件,请按9键直接读取\n");
}
else
{
fp2=fopen("p.txt","w");
fclose(fp2);
printf("创建成功");
printf("输入添加人数:");
scanf("%d",&NUM);
for(size=0;size<NUM;size++)
{
printf("输入第%d个用户名:\n",size+1);
scanf("%s",a[size].name);
printf("输入第%d个电话号码:\n",size+1);
scanf("%s",a[size].num);
printf("输入第%d个地址:\n",size+1);
scanf("%s",a[size].add);
}
printf("添加成功");
}
printf("\n");
}
void List()
{
system("cls");
printf("\n");
int i;
delay();
printf("姓名 号码 地址\n");
for(i=0;i<size;i++)
{
printf("%s %s %s\n",a[i].name,a[i].num,a[i].add);
}
}
int Hash(T str)
{
unsigned int n;
int m;
n=atoi(str);
m=n%HASHSIZE;
return m;
}
void Creat_hash()
{
system("cls");
float w;
float ave;
float sum=0;
int q;
int i;
int p=-1;
for(i=0;i<size;i++)
{
q=0;
w=1;
p=Hash(a[i].num);
while(H->elem[p]!=NULL)
{
p=(++p)%HASHSIZE;
q++;
w++;
}
H->elem[p]=&(a[i]);
H->c++;
sum=sum+w;
printf("第%d个解决冲突次数:",i+1);
printf(" %d\n",q);
}
printf("\n");
ave=sum/size;
printf("平均查找长度为:");
printf("%f",ave);
printf("\n");
printf("建表成功,容量为%d",HASHSIZE);
printf("\n");
printf("表中元素个数是:");
printf("%d",H->c);
printf("\n");
}
void Find()
{
system("cls");
T tel;
int p;
int q=0;
printf("输入查询的号码:");
scanf("%s",tel);
p=Hash(tel);
while((H->elem[p]!=NULL)&&(strcmp(tel,H->elem[p]->num)!=0))
{
p=(++p)%HASHSIZE;
}
if( H->elem[p]!=NULL&&strcmp(tel,H->elem[p]->num)==0)
{
printf("姓名 地址\n");
printf("%s %s\n",H->elem[p]->name ,H->elem[p]->add);
}
else
{
printf("没有此人信息");
printf("\n");
}
}
void Alter()
{
system("cls");
T tel;
int p;
printf("输入修改的号码的信息:");
scanf("%s",tel);
p=Hash(tel);
while((H->elem[p]!=NULL)&&(strcmp(tel,H->elem[p]->num)!=0))
{
p=(++p)%HASHSIZE;
}
if( H->elem[p]!=NULL&&strcmp(tel,H->elem[p]->num)==0)
{
printf("姓名 地址\n");
printf("%s %s\n",H->elem[p]->name ,H->elem[p]->add);
(H->elem)[p]->num[0]='\0';
(H->elem)[p]->name[0]='\0';
(H->elem)[p]->add[0]='\0';
printf("输入新姓名:\n");
scanf("%s",&H->elem[p]->name);
printf("输入新号码:\n");
scanf("%s",&H->elem[p]->num);
printf("输入新地址:\n");
scanf("%s",&H->elem[p]->add);
printf("修改成功\n");
}
else
{
printf("没有此人信息");
printf("\n");
}
getchar();
printf("\n");
}
void Delete()
{
system("cls");
T tel;
int i,j;
printf("请输入第%d人删除");
scanf("%d",&j);
j=j-1;
printf("输入要删除的号码:");
scanf("%s",tel);
int p;
p=Hash(tel);
while((H->elem[p]!=NULL)&&(strcmp(tel,H->elem[p]->num)!=0))
{
p=(++p)%HASHSIZE;
}
if(H->elem[p]!=NULL&&strcmp(tel,H->elem[p]->num)==0)
{
printf("删除的信息\n");
printf("姓名 号码 地址\n");
printf("%s %s %s\n",H->elem[p]->name,H->elem[p]->num,H->elem[p]->add);
(H->elem)[p]->num[0]='\0';
(H->elem)[p]->name[0]='\0';
(H->elem)[p]->add[0]='\0';
H->c--;
printf("删除成功!\n");
for(i=j+1; i<size; i++)
{
strcpy(a[i-1].name,a[i].name);
strcpy(a[i-1].num,a[i].num);
strcpy(a[i-1].add,a[i].add);
}
size--;
}
else
{
printf("没有此信息!");
printf("\n");
}
}
void Append()
{
system("cls");
int j=size;
int num;
printf("输入插入的个数:");
scanf("%d",&num);
for(size;size<j+num;size++)
{
printf("输入第%d个姓名\n",size+1);
scanf("%s",a[size].name);
printf("输入第%d个号码\n",size+1);
scanf("%s",a[size].num);
printf("输入第%d个地址\n",size+1);
scanf("%s",a[size].add);
}
printf("插入成功!");
printf("\n");
}
void Save()
{
system("cls");
int i;
FILE *fp;
fp=fopen("p.txt","w");
if((fp=fopen("p.txt","w"))!=NULL)
{
fprintf(fp,"姓名 号码 地址\n");
for(i=0;i<size;i++)
{
fprintf(fp,"%s\t%s\t%s\n",a[i].name,a[i].num,a[i].add );
}
fclose(fp);
delay();
printf("保存成功,请在p.txt找文件\n");
}
else
{
printf("保存失败\n");
}
}
void Load()
{
system("cls");
int i;
int ch;
char m;
FILE *fp1;
fp1=fopen("p.txt","r");
if((fp1=fopen("p.txt","r"))==NULL)
{
printf("没此文件,请去创建!\n");
}
else
{
printf("输入读取的个数:\n");
scanf("%d",&size);
do
{
ch=fgetc(fp1);
}while(ch!='\n');
for(i=0;i<size;i++)
{
fscanf(fp1,"%s\t%s\t%s\n",a[i].name,a[i].num,a[i].add);
}
fclose(fp1);
printf("读取成功");
printf("\n");}
}
void Quit()
{
system("cls");
printf("请按任意键退出!");
exit(0);
}
void Menu()
{
delay();
int i;
for(;;)
{
do{
printf("\t\t\t\t_________________________________________\n");
printf("\t\t\t\t|******1.Create(创建通讯录)**************|\n");
printf("\t\t\t\t|******2.Append(添加信息)****************|\n");
printf("\t\t\t\t|******3.Creat_hash(构建散列表)**********|\n");
printf("\t\t\t\t|******4.Find(查询信息)****************|\n");
printf("\t\t\t\t|******5.Delete(删除信息)**************|\n");
printf("\t\t\t\t|******6.Alter(修改信息)***************|\n");
printf("\t\t\t\t|******7.List(显示信息)****************|\n");
printf("\t\t\t\t|******8.Save(保存信息)****************|\n");
printf("\t\t\t\t|******9.Load(读取信息)****************|\n");
printf("\t\t\t\t|******10.Quit(退出)*******************|\n");
printf("\t\t\t\t|________________________________________|\n");
scanf("%d",&i);
switch(i){
case 1:
Create();
break;
case 2:
Append();
break;
case 3:
Creat_hash();
break;
case 4:
Find();
break;
case 5:
Delete();
break;
case 6:
Alter();
break;
case 7:
List();
break;
case 8:
Save();
break;
case 9:
Load();
break;
case 10:
Quit();
break;
}
}while(i>0);
}}
int main()
{
int i;
H=(HashTable*)malloc(sizeof(HashTable));
for(i=0;i<HASHSIZE;i++)
{
H->elem[i]=NULL;
}
H->m=HASHSIZE;
H->c=0;
printf("\t\t*****欢迎进入登录系统*****\n");
land();
return 0;
}
|