c语言通讯录管理系统课程设计.docx
《c语言通讯录管理系统课程设计.docx》由会员分享,可在线阅读,更多相关《c语言通讯录管理系统课程设计.docx(71页珍藏版)》请在冰豆网上搜索。
![c语言通讯录管理系统课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/8/d0a161fa-6de2-4ac5-936a-c9e130a6e054/d0a161fa-6de2-4ac5-936a-c9e130a6e0541.gif)
c语言通讯录管理系统课程设计
(此文档为word格式,下载后您可任意编辑修改!
)
计算机科学与技术学院课程设计成绩单
C+:
72~74分C:
68~71分C-:
64~67分D:
60~63分F:
<60分
一、基本要求
3、能实现多条件查询。
4、最后把系统中的数据保存回相应的文件中。
2、解题思路
根据题目要求,
1、键盘式选择菜单实现功能选择。
2、通讯录数据以文本文件存储,故应提供文件的输入输出等操作。
将保存在txt文件中的数据读取出来并设计合适的链表(有头结点的单链表)用来存储数据。
3、利用链表进行通讯录记录的插入,查找,修改,删除等操作。
4、修改和删除均建立在查找的基础之上。
5、实现多条件查找。
6、通讯录分组信息同理。
利用单链表存储,从而进行显示、查找、删除等操作。
7、退出:
即将通讯录及分组信息保存到文件之后,再退出到管理系统。
3、算法描述
尾插法建带头结点的通讯录链表createF();
根据文本文件中数据的存储结构用fscanf()一条一条的读取数据;
并将读取出来的数据赋给链表的结点;
使Flag=1,即表示通讯录已经建立;
通讯录成员分组信息表createG()同理;
1、显示通讯录已有成员信息
从链表中读取并按照一定结构输出outputF();
2、添加通讯录成员信息
向通讯录中添加某人通讯信息的子函数insertF();
链表结点的插入,按编号次序有序插入
使用两个指针变量p1和p2分别指向当前访问过的结点和下一结点。
循环顺序查找插入结点的位置,其中p1指向待插入位置的前一个结点。
3、查找通讯录成员信息
查找模块search():
在通讯录中查找某人通讯信息的子函数
如果查找成功,则输出查找到的通讯者信息,返回p。
若查找失败,则输出查找失败,返回p。
4、修改通讯录成员信息
利用查找函数查找到需要修改的结点,进行修改。
5、删除通讯录成员信息
利用查找函数查找到需要修改的结点,进行删除。
6、多条件查询通讯录成员信息
选择第一个关键词类型之后,进行相关查询;
之后第二个关键词,不需要输入相应类型,而是根据输入数据之间的差别进行匹配,从而进行相关的查询操作;
7、显示已有通讯录成员分组信息
原理同outputF();
8、添加通讯录成员分组信息
原理同insertF();
9、删除通讯录成员分组信息
原理同DeleteF();
11、退出通讯录管理系统
4、程序设计
1、本程序中所有用到的数据结构定义
Group的单链表存储结构
structGroupInfo
{
intGnum;
charGname[20];
};
structGroup
{
structGroupInfoGInfo;
Group*next;
};
typedefGroup*GInfoList;
Friend的单链表存储结构
structFriendInfo
{
charFnum[5];
charFname[8];
charsex[3];
charbirthday[11];
charaddr[20];
structGroupInfoFGInfo;
};
structFriend
{
structFriendInfoFInfo;
Friend*next;
};
typedefFriend*FInfoList;
2、基本操作
*尾插法建带头结点的通讯录链表createF()*
FInfoListcreateF()
{
FILE*pRead,*pWrite;
intnCount=0;
FInfoList(Ffilename,"r");
if(NULL==pRead)exit(0);
pWrite=fopen("friend_bin.txt","wb");
if(NULL==pWrite)
{
fclose(pRead);
exit(0);
}
while(!
feof(pRead))
{
p=(Friend*)malloc(sizeof(Friend));
fwrite(p,sizeof(structFriend),1,pWrite);
rear->next=p;
rear=p;
}
fclose(pRead);
fclose(pWrite);
Fflag=1;
rear->next=NULL;
return(Gfilename,"r");
if(NULL==gRead)exit(0);
gWrite=fopen("group_bin.txt","wb");
if(NULL==gWrite)
{
fclose(gRead);
exit(0);
}
while(!
feof(gRead))
{
p=(Group*)malloc(sizeof(Group));
fscanf(gRead,"%d%s\n",&p->GInfo.Gnum,p->GInfo.Gname);
fwrite(p,sizeof(structGroup),1,gWrite);
rear->next=p;
rear=p;
}
fclose(gRead);
fclose(gWrite);
Gflag=1;
rear->next=NULL;
return\n%20s\n","通讯录");
while(p!
=NULL)
{
p=p->next;
}
}
③添加通讯录成员信息
*添加模块insertF():
向通讯录中添加某人通讯信息的子函数*
链表结点的插入,按编号次序有序插入
使用两个指针变量p1和p2分别指向当前访问过的结点和下一结点。
循环顺序查找插入结点的位置,其中p1指向待插入位置的前一个结点。
voidinsertF(FInfoListFhead,Friend*Fp)
{
Friend*p1,*p2;
p1=Fhead;
p2=p1->next;
while(p2!
=NULL&&strcmp(p2->FInfo.Fnum,Fp->FInfo.Fnum)<0)
{
p1=p2;p1指向刚访问过的结点
p2=p2->next;p2指向下一个结点
}
p1->next=Fp;插入p所指向的结点
Fp->next=p2;
}
④查找通讯录成员信息
*查找模块search():
在通讯录中查找某人通讯信息的子函数*
如果查找成功,则输出查找到的通讯者信息,返回p。
若查找失败,则输出查找失败,返回p。
把汉字转化为拼音缩写的函数,如李勇->ly
boolIn(wchar_tstart,wchar_tend,wchar_tcode)
{
if(code>=start&&code<=end)
{
returntrue;
}
returnfalse;
}
charconvert(wchar_tn)
{
if(In(0xB0A1,0xB0C4,n))return'a';
if(In(0XB0C5,0XB2C0,n))return'b';
if(In(0xB2C1,0xB4ED,n))return'c';
if(In(0xB4EE,0xB6E9,n))return'd';
if(In(0xB6EA,0xB7A1,n))return'e';
if(In(0xB7A2,0xB8c0,n))return'f';
if(In(0xB8C1,0xB9FD,n))return'g';
if(In(0xB9FE,0xBBF6,n))return'h';
if(In(0xBBF7,0xBFA5,n))return'j';
if(In(0xBFA6,0xC0AB,n))return'k';
if(In(0xC0AC,0xC2E7,n))return'l';
if(In(0xC2E8,0xC4C2,n))return'm';
if(In(0xC4C3,0xC5B5,n))return'n';
if(In(0xC5B6,0xC5BD,n))return'o';
if(In(0xC5BE,0xC6D9,n))return'p';
if(In(0xC6DA,0xC8BA,n))return'q';
if(In(0xC8BB,0xC8F5,n))return'r';
if(In(0xC8F6,0xCBF0,n))return's';
if(In(0xCBFA,0xCDD9,n))return't';
if(In(0xCDDA,0xCEF3,n))return'w';
if(In(0xCEF4,0xD188,n))return'x';
if(In(0xD1B9,0xD4D0,n))return'y';
if(In(0xD4D1,0xD7F9,n))return'z';
return'\0';
}
char*TransformToSpell(charname[]){
charchr[3];
wchar_twchr=0;
char*Spell=newchar[strlen(name)2];
memset(Spell,0x00,sizeof(char)*strlen(name)2+1);
for(unsignedinti=0,j=0;i<(strlen(name)2);++i)
{
memset(chr,0x00,sizeof(chr));
chr[0]=name[j++];
chr[1]=name[j++];
chr[2]='\0';
wchr=0;
wchr=(chr[0]&0xff)<<8;
wchr|=(chr[1]&0xff);
Spell[i]=convert(wchr);
}
returnSpell;
}
voidsearch(FInfoListFhead)
{
Friend*p;
charnamekey[8];
charnamespell[5];
intm;
p=Fhead->next;
scanf("%d",&m);
if(m==1)
{
scanf("%s",namekey);
intflag=0;判断是否找到
inti=0,count=0;
charnum[20][5];
while(p)
{
if(strcmp(namekey,p->FInfo.Fname)==0)
{
flag=1;
strcpy(num[i],p->FInfo.Fnum);
i++;
count++;
}
p=p->next;
}
if(flag==0)printf("\n对不起,通讯簿中没有此人的记录。
\n");
if(flag==1)
{
printf("\n已查到%d条记录,分别为:
\n\n",count);
p=Fhead->next;
i=0;
while(p)
{
if(strcmp(num[i],p->FInfo.Fnum)==0)
{
i++;
}
p=p->next;
}
}
}
elseif(m==3)
{
printf("\n请输入要查找的电话号码:
");
{
}
{
}
if((p==NULL))printf("\n对不起,通讯簿中没有此人的记录。
\n");
if((p!
=NULL))
{
printf("\n已查到,记录为:
\n\n");
}
}
elseif(m==2)
{
scanf("%s",namespell);
intflag=0;判断是否找到
inti=0,count=0;
charnum[20][5];
while(p)
{
if(strcmp(namespell,TransformToSpell(p->FInfo.Fname))==0)
{
flag=1;
strcpy(num[i],p->FInfo.Fnum);
i++;
count++;
}
p=p->next;
}
if(flag==0)printf("\n对不起,通讯簿中没有此人的记录。
\n");
if(flag==1)
{
printf("\n已查到%d条记录,分别为:
\n\n",count);
p=Fhead->next;
i=0;
while(p)
{
if(strcmp(num[i],p->FInfo.Fnum)==0)
{
i++;
}
p=p->next;
}
}
}
}
⑤修改通讯录成员信息
*修改模块modify():
在通讯录中修改某人通讯信息的子函数*
voidmodify(FInfoListFhead)
{
charch;
charkind[10],NewInfo[15];
Friend*p;
charnamekey[8];
charnamespell[5];
intm;
p=Fhead->next;
scanf("%d",&m);
if(m==1)
{
scanf("%s",namekey);
intflag=0;判断是否找到
inti=0,count=0;
charnum[20][5];
while(p)
{
if(strcmp(namekey,p->FInfo.Fname)==0)
{
flag=1;
strcpy(num[i],p->FInfo.Fnum);
i++;
count++;
}
p=p->next;
}
if(flag==0)printf("\n没有找到要修改的通讯者!
\n");
if(flag==1)
{
printf("\n已查到%d条记录,分别为:
\n\n",count);
p=Fhead->next;
i=0;
while(p)
{
if(strcmp(num[i],p->FInfo.Fnum)==0)
{
i++;
}
p=p->next;
}
charnum2[5];
p=Fhead->next;
printf("\n请输入所要修改的通讯者的编号:
");
scanf("%s",num2);
while(p)
{
if(strcmp(num2,p->FInfo.Fnum)==0)
{
printf("\n真的要修改该结点吗?
(是:
y否:
n):
");
scanf("%s",&ch);
while(ch=='y')
{
inti=0,n;
intflag=0;
printf("\n请输入所需修改的信息类别:
");
scanf("%s",kind);
if(strcmp(kind,"编号")==0)
{
printf("\n请输入所需修改的通讯信息:
");杨颖性别男
scanf("%s",NewInfo);
while(flag==0)
{
n=strlen(NewInfo);
while(NewInfo[i]!
='\0')
{
if(NewInfo[i]>='0'&&NewInfo[i]<='9')
i++;
else
break;
}
if(i!
=n)
{
printf("输入的编号格式错误!
\n");
printf("请重新输入:
");
scanf("%s",NewInfo);
}
elseflag=1;
}
strcpy(p->FInfo.Fnum,NewInfo);
printf("修改成功!
\n");
return;
}
{
printf("\n请输入所需修改的通讯信息:
");
scanf("%s",NewInfo);
while(flag==0)
{
n=strlen(NewInfo);
if(n>8)
{
printf("请重新输入:
");
scanf("%s",NewInfo);
}
elseflag=1;
}
strcpy(p->FInfo.Fname,NewInfo);
printf("修改成功!
\n");
return;
}
elseif(strcmp(kind,"性别")==0)
{
printf("\n请输入所需修改的通讯信息:
");
scanf("%s",NewInfo);
while(flag==0)
{
n=strlen(NewInfo);
if(n>2)
{
printf("输入的性别格式错误!
\n");
printf("请重新输入:
");
scanf("%s",NewInfo);
}
elseflag=1;
}
strcpy(p->FInfo.sex,NewInfo);
printf("修改成功!
\n");
return;
}
elseif(strcmp(kind,"生日")==0)
{
printf("\n请输入所需修改的通讯信息:
");
scanf("%s",NewInfo);
while(flag==0)
{
n=strlen(NewInfo);
while(NewInfo[i]!
='\0')
{
if(NewInfo[i]>='0'&&NewInfo[i]<='9'||NewInfo[i]=='-')
i++;
else
break;
}
if(i!
=n||n!
=10)
{
printf("输入的生日格式错误!
\n");
printf("请重新输入:
");
scanf("%s",NewInfo);
}
elseflag=1;
}
strcpy(p->FInfo.birthday,NewInfo);
printf("修改成功!
\n");
return;
}
elseif(strcmp(kind,"电话号码1")==0)
{
printf("\n请输入所需修改的通讯信息:
");
scanf("%s",NewInfo);
while(flag==0)
{
n=strlen(NewInfo);
if(n<11&&n>1)
{
printf("\n输入的电话号码尾数不足或者格式错误!
\n");
printf("请重新输入:
");
scanf("%s",NewInfo);
}
elseflag=1;
}
printf("修改成功!
\n");
return;
}
elseif(strcmp(kind,"电话号码2")==0)
{
printf("\n请输入所需修改的通讯信息:
");
scanf("%s",NewInfo);
while(flag==0)
{
n=strlen(NewInfo);
if(n<11&&n>1)
{
printf("输入的电话号码尾数不足或者格式错误!
\n");
printf("请重新输入:
");
scanf("%s",NewInfo);
}
elseflag=1;
}
printf("修改成功!
\n");
return;
}
elseif(strcmp(kind,"电话号码3")==0)
{
printf("\n请输入所需修改的通讯信息:
");
scanf("%s",NewInfo);
while(flag==0)
{
n=strlen(NewInfo);
if(n<8&&n>1)
{
printf("输入的电话号码尾数不足或者格式错误!
\n");