#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct list //建立结构体list用来存放一个联系人的信息
{
char name[20];
char sex[20];
char year[5];
char phone[12];
char home[20];
}info[100]; //并定义了一个结构体数组info(information的缩写),一共可以存放100个联系人的信息,如果不够用可以再加。
//设置函数声明,便于调用相关函数。
void f1(); //添加联系人信息 //
void f2(); //删除指定联系人信息 //
void f3(); //查找指定联系人信息 //
void f4(); //修改指定联系人信息 //
void f5(); //显示所有联系人信息 //
void f6(); //清空所有联系人 //
void f7(); //以名字排序所有联系人(按字典顺序) //
void menu()
{
system("cls");
printf("\n\n\n\n\t\t\t\t\t 通讯录\n");
printf(" \t\t\t\t\t\t\t\t\t\t\t作者:待写");
printf("\n\t\t\t*--*--*--*--*--*--||菜单||--*--*--*--*--*--*--*\n\t\t\t|\t\t\t\t\t |");
printf("\n\t\t\t* \t1.添加联系人信息\t\t *\n\t\t\t|\t\t\t\t\t |");
printf("\n\t\t\t* \t2.删除指定联系人信息\t\t *\n\t\t\t|\t\t\t\t\t |");
printf("\n\t\t\t* \t3.查找指定联系人信息\t\t *\n\t\t\t|\t\t\t\t\t |");
printf("\n\t\t\t* \t4.修改指定联系人信息\t\t *\n\t\t\t|\t\t\t\t\t |");
printf("\n\t\t\t* \t5.显示所有联系人信息\t\t *\n\t\t\t|\t\t\t\t\t |");
printf("\n\t\t\t* \t6.清空所有联系人\t\t *\n\t\t\t|\t\t\t\t\t |");
printf("\n\t\t\t* \t7.以名字排序所有联系人(按字典顺序) *\n\t\t\t|\t\t\t\t\t |");
printf("\n\t\t\t* \t8.退出\t\t\t\t *\n\t\t\t|\t\t\t\t\t |");
printf("\n\t\t\t*--*--*--*--*--*--*------*--*--*--*--*--*--*--*");
printf("\n\n\t\t\t\t 请输入选项:");
}
void f1() //f1函数用来添加联系人信息。相关文件函数作用说明可参考红皮书第10章
{ int i,count=0; //定义一个循环变量以及记录通讯录中联系人个数的变量
char ch[2]; //字符数组用来记录用户的输入
FILE *fp; //定义指向文件的指针变量
if((fp=fopen("data.txt","a+"))==NULL) //调用fopen函数创建一个新的文本来保存联系人信息,具体作用说明可参考红皮书335页
{
printf("不能打开!\a\n");
exit(0);
}
while (!feof(fp)) //判断文件是否结束
{
if (fread(&info[count], sizeof(struct list), 1, fp)==1)//使用fread函数将文件中的记录逐条读取到结构体数组
count++;
}
fclose(fp); //关闭文件
if (count==0) //判断当前通讯录是否为空
printf("当前通讯录中无联系人!\n");
else
{
system("cls"); //清屏
f5(); //显示联系人的所有信息
}
if ((fp=fopen("data.txt", "wb"))==NULL) //如果打开文件失败
{
printf("打开文件失败!\n");
exit(0);
}
//将之前已经保存的联系人信息重写入磁盘
for (i = 0; i < count; i++)
fwrite(&info[i], sizeof(struct list), 1, fp);
printf("是否要添加新联系人的信息:(y—是,n—否)");//提示用户输入
scanf("%s", ch);
system("cls");
while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)//判断用户是否需要输入
{
printf("姓名:");
scanf("%s", &info[count].name);
//判断用户输入姓名在通讯录中是否存在
for(i=0;i<count;i++)
if (strcmp(info[i].name, info[count].name) == 0)
{
printf("该联系人已存在,按任意键退出");
getch(); //输入一个字符但不显示在屏幕上,其函数声明在头文件conio中。
fclose(fp);
return;
}
printf("性别:");
scanf("%s", &info[count].sex);
printf("年龄:");
scanf("%s", &info[count].year);
printf("电话:");
scanf("%s", &info[count].phone);
printf("地址:");
scanf("%s", &info[count].home);
if (fwrite(&info[count],sizeof(struct list) , 1, fp) != 1)//将新建联系人信息保存到磁盘
{
printf("保存失败");
getch();
}
else
{
printf("%s 已保存!\n", info[count].name);
count++;
}
printf("是否要继续添加新联系人的信息:(y—是,n—否):");
scanf("%s", ch);
}
fclose(fp);
printf("完成!\n");
}
void f2()
{
int count = 0,i,j,sign=0;
char Del_name[20];
FILE* ptr = fopen("data.txt", "r");
if (!ptr) {
printf("文件打开失败,按任意键以继续\n");
getch();
return;
}
while (!feof(ptr)) {
if (fread(info, sizeof(struct list), 1, ptr) == 1)
count++;
}
fclose(ptr);
printf("请输入要删除人的姓名:\n");
scanf("%s", Del_name);
for (i = 0; i < count; i++) {
if (strcmp(info[i].name, Del_name) == 0) {
sign = 1; break;
}
}
if (!sign) {
printf("对不起,没有找到所删除联系人,按任意键以继续...\n");
}
else {
for (j = i; j < count&&j<100; j++) {
strcpy(info[j].name, info[j + 1].name);
strcpy(info[j].sex, info[j + 1].sex);
strcpy(info[j].year, info[j + 1].year);
strcpy(info[j].phone, info[j + 1].phone);
strcpy(info[j].home, info[j + 1].home);
}
printf("已删除%s的信息,按任意键以继续...\n", Del_name);
}
getch();
system("cls");
}
void f3()
{
FILE *p;//读取已有文件
int count=0;
if((p=fopen("data.txt","a+"))==NULL)
{
printf("打开文件失败!\a\n");
}
while(!feof(p))
if(fread(&info[count],sizeof(struct list),1,p)==1)
count++;//计算已有联系人数量
fclose(p);
if(count==0)
printf("当前通讯录为空!\n");
else
system("cls");//清空初始界面
char name[20]={0};//开始查找联系人
printf("请输入要查找的联系人姓名\n");
scanf("%s",name);
int i,x=0;//利用变量x判断输入的联系人是否存在
for(i=0;i<=count;i++)
{
if(strcmp(info[i].name,name)==0)
x=i;
}
if(x==0)//输出查找结果
{
printf("此联系人不存在\n");
}
else
{
printf("以下为查找结果\n");
printf("姓名: %s\n",info[x].name);
printf("性别: %s\n",info[x].sex);
printf("年龄: %s\n",info[x].year);
printf("电话: %s\n",info[x].phone);
printf("住址: %s\n",info[x].home);
}
printf("按任意键退出 ");
getch();
fclose(p);//关闭文件
}
void f4()
{
}
void f5()
{
}
void f6()
{struct list t[100];
int i,j,sign=0; int count=0;
char Del_name[20];
FILE* ptr = fopen("data.txt", "r"); //读取已有文件
if (!ptr) { printf("文件打开失败,按任意键以继续\n");
getch();
return; }//判断文件是否正确
while (!feof(ptr))
if (fread(info, sizeof(struct list), 1, ptr) == 1)
count++; //计算已有联系人数量
fclose(ptr); //关闭文件
int n=0;
for(i=0;i<count;i++)
{
for (j = i; j < count; j++) {
strcpy(info[j].name, info[j + 1].name);
strcpy(info[j].sex, info[j + 1].sex);
strcpy(info[j].year, info[j + 1].year);
strcpy(info[j].phone, info[j + 1].phone);
strcpy(info[j].home, info[j + 1].home);}
}
printf("all contacts have been deleted!\n"); getch();
system("cls");
}
void f7()
{
struct list t; //排序时的结构体类型的交换变量
int count=0;
FILE *f; //读文件
if((f=fopen("data.txt","a+"))==NULL)
{
printf("无法打开文件!\n\a");
}
while(!feof(f))
if(fread(&info[count],sizeof(struct list),1,f)==1)
count++ ;
fclose(f);
if(count==0)
printf("\n通讯录中暂无联系人.");
for(int i=0;i<count-1;i++) //排序
for(int j=i+1;j<count;j++)
{
if(strcmp(info[i].name,info[j].name)>0)
{
t=info[j];
info[j]=info[i];
info[i]=t;
}
}
if((f=fopen("data.text","wb"))==NULL) //写文件
{
printf("无法打开文件!\n\a");
}
system("cls"); //清屏
printf("\n\n\n\n\t\t\t以下为排序结果:\n\n");
for(int i=0;i<count;i++)
if(fwrite(&info[i],sizeof(struct list),1,f)==1)
{
printf("\t第%d位:%s\t%s\t%s\t%s\t%s",i+1,info[i].name,info[i].sex,info[i].year,info[i].phone,info[i].home);
printf("\n\n");
}
else printf("\n无法保存!");
fclose(f);
printf("\n\t\t\t已成功保存!");
printf("\n\n\t\t\t按任意键退出!\n");
getch();
}
int main()
{
int type;
menu();
int n;
scanf("%d",&n);
if(n==8) n=0;
while(n)
{
switch(n)
{
type=0;
case 1:f1();break;
case 2:f2();break;
case 3:f3();break;
case 4:f4();break;
case 5:f5();break;
case 6:f6();break;
case 7:f7();break;
case 8:type=1;break;
default :break;
}
if(type==1) break;
menu();
scanf("%d",&n);
}
}