Windows vc++6.0环境下可用代码。
结构体数组实现。
已知问题:排序只能排序一次。
#include <windows.h>
#include <stdlib.h>
#include <string.h>
//////////////////////////////////////////////全局变量////////////////////////////////////////////////////////////////
int n=0; //表示正在使用或修改哪一组数据
struct Sign{ //定义一个结构体
char name[8]; //姓名
char sex[4]; //性别
char birthday[12]; //生日
char phone[11]; //电话
char addr[30]; //地址
} *pe;
/////////////////////////////////////////函数声明///////////////////////////////////////////////////////////////////
void input();
void CheckFace();
void Selelctname();
void Selelctphone();
void Selelctaddr();
void Selelcbir();
void Change();
void ShowMenu();
void Sortname();
void Sortphone();
void sortface();
void Sortbir();
int cmp_name();
int cmp_phone();
int cmp_addr();
int cmp_bir();
//////////////////////////////////////////////排序函数/////////////////////////////////////////////////////////////////
void Sortphone()//按电话排序
{
qsort(pe,n,sizeof(pe[0]),cmp_phone);
system("cls");
ShowMenu();
}
void Sortaddr()//按地址排序
{
qsort(pe,n,sizeof(pe[0]),cmp_addr);
system("cls");
ShowMenu();
}
void Sortbir()//按生日排序
{
qsort(pe,n,sizeof(pe[0]),cmp_bir);
system("cls");
ShowMenu();
}
void Sortname()//按姓名排序
{
qsort(pe,n,sizeof(pe[0]),cmp_name);
system("cls");
ShowMenu();
}
// int cmp(const void *p1, const void *p2) //这种是对数据排序
//{
//return(( *(const struct Sign *)p1).name - (*(const struct Sign *)p2).name;
//}
int cmp_name(const void *p1, const void *p2) //对结构体里的数组排序
{
struct Sign *sp1 = *(struct Sign * const *)p1;
struct Sign *sp2 = *(struct Sign * const *)p2;
return sp1->name - sp2->name;
}
int cmp_phone(const void *p1, const void *p2) //对结构体里的数组排序
{
struct Sign *sp1 = *(struct Sign * const *)p1;
struct Sign *sp2 = *(struct Sign * const *)p2;
return sp1->phone - sp2->phone;
}
int cmp_addr(const void *p1, const void *p2) //对结构体里的数组排序
{
struct Sign *sp1 = *(struct Sign * const *)p1;
struct Sign *sp2 = *(struct Sign * const *)p2;
return sp1->addr - sp2->addr;
}
int cmp_bir(const void *p1, const void *p2) //对结构体里的数组排序
{
struct Sign *sp1 = *(struct Sign * const *)p1;
struct Sign *sp2 = *(struct Sign * const *)p2;
return sp1->birthday - sp2->birthday;
}
void sortface()//排序界面
{
int Check_key; //决定进入什么功能
system("color 0C");
printf("########### 通讯录 v1.0 ################\n");
printf("############################################################\n");
printf("# #\n");
printf("# 1------按姓名排序 #\n");
printf("# #\n");
printf("# 2------按电话号码排序 #\n");
printf("# #\n");
printf("# 3------按地址排序 #\n");
printf("# #\n");
printf("# 4------按生日排序 #\n");
printf("# #\n");
printf("############################################################\n");
printf("# 201807 #\n");
printf("############################################################\n");
scanf("%d",&Check_key);
switch(Check_key)
{
case 1:
system("cls");
Sortname();
break;
case 2:
system("cls");
Sortphone();
break;
case 3:
system("cls");
Sortaddr();
break;
case 4:
system("cls");
Sortbir();
break;
}
}
//////////////////////////////////////修改函数/////////////////////////////////////////////////
void Change()
{ char ChangeName[8];
int changekey;
int n_name=0;
int i;
system("color 01");
printf("请输入你要修改的条目的姓名:");
scanf("%s",&ChangeName);
for(;n_name<=n;n_name++)
{
if(strcmp(pe[n_name].name,ChangeName)==0)
{ printf("%10.8s %6.6s %10.12s %11.11s %16.16s\n",pe[n_name].name,pe[n_name].sex,pe[n_name].birthday,pe[n_name].phone,pe[n_name].addr);
printf("您要修改的是这条记录吗?1---是|2---否\n");
scanf("%d",&i);
if(i==1)
{
printf("你要修改的通讯录为:\n");
printf("%10.8s %6.6s %10.12s %11.11s %16.16s\n",pe[n_name].name,pe[n_name].sex,pe[n_name].birthday,pe[n_name].phone,pe[n_name].addr);
printf("请选择您的操作 1---删除|2---修改\n");
scanf("%d",&changekey);
if(changekey==1) //信息删除
{
int num=0;
for(;num<=n;num++)
{
strcpy(pe[n_name].name,pe[n_name+1].name);
strcpy( pe[n_name].sex, pe[n_name+1].sex);
strcpy( pe[n_name].birthday,pe[n_name+1].birthday);
strcpy( pe[n_name].phone,pe[n_name+1].phone);
strcpy( pe[n_name].addr,pe[n_name+1].addr);
n_name++;
}
}
system("cls");
}
if(changekey==2)//信息修改
{
printf("姓名:");scanf("%s",pe[n_name].name);
printf("性别:");scanf("%s",pe[n_name].sex);
printf("生日:");scanf("%s",pe[n_name].birthday);
printf("电话号码:");scanf("%s",pe[n_name].phone);
printf("地址:");scanf("%s",pe[n_name].addr);
printf("\n OK! \n");
system("cls");
}
}
}
ShowMenu() ;
}
///////////////////////查找函数////////////////////////////////////////////
void Selelcbir()//按生日查找
{
char Findbir[30]; //保存输入的查询生日
int i=0;
int n_bir=0; //在生日查询中的循环变量
printf("%10.8s %6.6s %10.10s %11.4s %16.6s \n","姓名","性别","生日","电话","地址");
printf("---------------------------------------------------------------------\n");
printf("请输入要查询的生日:");
scanf("%s",&Findbir);
for(;n_bir<=n;n_bir++)
{
if(strcmp(pe[n_bir].name,Findbir)==0 )
{
printf("%10.8s %6.6s %10.12s %11.11s %16.16s\n",pe[n_bir].name,pe[n_bir].sex,pe[n_bir].birthday,pe[n_bir].phone,pe[n_bir].addr);
i++;
}
}
printf("共 %d 条\n",i);
}
void Selelctaddr()//按地址查找
{
char Findaddr[30]; //保存输入的查询地址
int i=0;
int n_addr=0; //在地址查询中的循环变量
printf("%10.8s %6.6s %10.10s %11.4s %16.6s \n","姓名","性别","生日","电话","地址");
printf("---------------------------------------------------------------------\n");
printf("请输入要查询的地址:");
scanf("%s",&Findaddr);
for(;n_addr<=n;n_addr++)
{
if(strcmp(pe[n_addr].name,Findaddr)==0 )
{
printf("%10.8s %6.6s %10.12s %11.11s %16.16s\n",pe[n_addr].name,pe[n_addr].sex,pe[n_addr].birthday,pe[n_addr].phone,pe[n_addr].addr);
i++;
}
}
printf("共 %d 条\n",i);
}
void Selelctphone()//按电话查找
{
char phone[11]; //保存输入的电话
int i=0;
int n_phone=0; //在姓名查询中的循环变量
printf("%10.8s %6.6s %10.10s %11.4s %16.6s \n","姓名","性别","生日","电话","地址");
printf("---------------------------------------------------------------------\n");
printf("请输入要查询的电话:");
scanf("%s",&phone);
for(;n_phone<=n;n_phone++)
{
if(strcmp(pe[n_phone].name,phone)==0 )
{
printf("%10.8s %6.6s %10.12s %11.11s %16.16s\n",pe[n_phone].name,pe[n_phone].sex,pe[n_phone].birthday,pe[n_phone].phone,pe[n_phone].addr);
i++;
}
}
printf("共 %d 条\n",i);
}
void Selelctname()//按名字查找
{
char FindName[8]; //保存输入的查询姓名
int i=0;
int n_name=0; //在姓名查询中的循环变量
printf("%10.8s %6.6s %10.10s %11.4s %16.6s \n","姓名","性别","生日","电话","地址");
printf("---------------------------------------------------------------------\n");
printf("请输入要查询的姓名:");
scanf("%s",&FindName);
for(;n_name<=n;n_name++)
{
if(strcmp(pe[n_name].name,FindName)==0 )
{
printf("%10.8s %6.6s %10.12s %11.11s %16.16s\n",pe[n_name].name,pe[n_name].sex,pe[n_name].birthday,pe[n_name].phone,pe[n_name].addr);
i++;
}
}
printf("共 %d 条\n",i);
}
/////////////////////////////////////////菜单界面//////////////////////////////////////////////////////////
void ShowMenu() //菜单界面
{
system("color 0A");
printf("################# 通讯录 v1.0 ###################\n");
printf("#####################################################################\n");
printf("# #\n");
printf("# 1-----------------信息录入------------------- #\n");
printf("# #\n");
printf("# 2-----------------信息查询------------------- #\n");
printf("# #\n");
printf("# 3-----------------信息查看------------------- #\n");
printf("# #\n");
printf("# 4-----------------信息修改------------------- #\n");
printf("# #\n");
printf("# 5-----------------信息排序------------------- #\n");
printf("#####################################################################\n");
printf("# 201807 #\n");
printf("#####################################################################\n");
input();
}
/////////////////////////////////添加数据//////////////////////////////////////////////////////////////////
void add() //添加一个成员
{
// char ch;
system("cls");
printf("请输入__\n");
printf("姓名:");scanf("%s",pe[n].name);
printf("性别:");scanf("%s",pe[n].sex);
printf("生日:");scanf("%s",pe[n].birthday);
printf("电话号码:");scanf("%s",pe[n].phone);
printf("地址:");scanf("%s",pe[n].addr);
n++;
system("cls");
ShowMenu() ;
// printf("输入E或e来结束输入?");
// getchar();
// ch=getchar();
// if(ch=='e'||ch=='E')
}
/////////////////////////////////显示函数//////////////////////////////////////////////////
void show()
{ int i;
char *a;//放按的任意按键值
system("color 06");
system("cls");
printf("%10.8s %6.6s %10.10s %11.4s %16.6s \n","姓名","性别","生日","电话","地址");
printf("---------------------------------------------------------------------\n");
for(i=0;i<n;i++)
{
printf("%10.8s %6.6s %10.12s %11.11s %16.16s\n",pe[i].name,pe[i].sex,pe[i].birthday,pe[i].phone,pe[i].addr);
}
printf("按任意键+回车返回主界面");
scanf("%s",&a);
system("cls");
ShowMenu();
}
///////////////////////////////////按键输入函数////////////////////////////////////////////////////////////////////////////
void input()//负责检测输入和控制使用什么功能
{
char num;//判断输入的那个数字的容器
scanf("%s",&num);
switch(num)
{
case '1':
add();//增添数据
break;
case '2':
CheckFace();//查找数据
break;
case '3':
show();//显示所有数据
break;
case '4':
Change();//修改或删除数据
break;
case '5':
system("cls");
sortface();//排序界面
break;
default:
system("cls");
printf("输入错误!请重新输入。\n");
break;
}
}
//////////////////////////////////////////查询界面///////////////////////////////////////////////////////////
void CheckFace()
{ int Check_key; //决定进入什么功能
system("color 03");
system("cls");
printf("########### 通讯录 v1.0 ################\n");
printf("############################################################\n");
printf("# #\n");
printf("# 1------按姓名查询 #\n");
printf("# #\n");
printf("# 2------按电话号码查询 #\n");
printf("# #\n");
printf("# 3------按地址查询 #\n");
printf("# #\n");
printf("# 4------按生日查询 #\n");
printf("# #\n");
printf("############################################################\n");
printf("# 201807 #\n");
printf("############################################################\n");
scanf("%d",&Check_key);
switch(Check_key)
{
char ch;
case 1:
system("cls");
Selelctname();
printf("输入任意键结束");
getchar();
ch=getchar();
system("cls");
break;
case 2:
system("cls");
Selelctphone();
printf("输入任意键结束");
getchar();
ch=getchar();
system("cls");
break;
case 3:
system("cls");
Selelctaddr();
printf("输入任意键结束");
getchar();
ch=getchar();
system("cls");
break;
case 4:
system("cls");
Selelcbir();
printf("输入任意键结束");
getchar();
ch=getchar();
system("cls");
break;
}
}
////////////////////////////////////主函数//////////////////////////////////////////////////////////////
void main()//主函数
{
while(1)
{
ShowMenu() ;
}
}