通讯录是利用文件来执行的,存储无上限

每个人的信息包括名字,电话号码(最多可以存五个),以及地址,如果还想添加其他信息,只要在头文件中的结构体部分修改添加就行了,当然,后面你也要相应的添加一部分东西,

1. 添加联系人信息 

2. 删除指定联系人信息 

3. 查找指定联系人信息 

4. 修改指定联系人信息 

5. 显示所有联系人信息 

思路分析:

  1. 首先我们可以分三个模块来解决这个问题,第一个模块我们需要一个头文件,这个头文件里可以包含一些相应信息,当实现文件和测试文件包含自己定义的头文件时便可以获得一些相关的信息。所以头文件里应该包括一个结构体,这个结构体里应包含姓名,电话,住址。2
  2. 第二个模块便是我们的测试函数,测试函数便可以实现我们的菜单打印,同时由我们接收不同的值便可以实现不同的操作,就是相应的方法的实现,这里很明显可以通过一个switch语句来进行控制。
  3. 第三个模块便是我们的方法实现的函数,将模块2里定义的类型为通讯录的地址传到各个方法里,这样便可以实现对通讯录的操作。
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
typedef struct contact
{
    char name[21];//姓名
    char tel[5][12];//电话
    int n;
    char addr[51];
    int age;

} CONTACT;

void stringInput(char *str,int n)
{
    scanf("%s",str);
    getchar();
    while(strlen(str)>n)
    {
        printf("长度超过 %d, 重新输入\n",n);
        scanf("%s",str);
        getchar();
    }

}

void addContact()//新建联系人
{
    FILE *fp;
    int i,n;
    char ch;
    char str[60];
    fp=fopen("contacts.txt","ab");
    if(fp==NULL)

        printf("文件没打开\n");

    CONTACT one;

    printf("请输入名字:\n");

    stringInput(str,20);
    strcpy(one.name,str);
    printf("请输入电话号码:\n");
    stringInput(str,11);
    strcpy(one.tel[0],str);
    one.n=1;
    for(i=1; i<5; i++)
    {
        printf("是否继续输入号码(Y/N)\n");
        ch=getchar();
        if(ch=='Y' || ch == 'y')
        {
            printf("请输入电话号码:\n");
            stringInput(str,11);
            strcpy(one.tel[i],str);
            one.n++;
        }
        else if (ch=='N' || ch == 'n')
            break;
    }
    printf("请输入年龄:\n");
    scanf("%d",&n);
    one.age=n;
    printf("请输入地址:\n");
    stringInput(str,50);
    strcpy(one.addr,str);
    fwrite(&one,sizeof(CONTACT),1,fp);
    fclose(fp);
    printf("联系人新建成功\n");
}

void display() //展示有哪些联系人
{
    FILE *fp;
    int i;
    fp=fopen("contacts.txt","rb");
    if(fp==NULL)
        printf("文件没打开!\n");
    CONTACT one;
    while( fread(&one,sizeof(CONTACT),1,fp)==1)
    {
        printf("------------------------\n");
        printf("%s\n",one.name);
    }
    fclose(fp);
    printf("------------------------\n");
}


void xiugai(char *name)//修改联系人
{
    FILE *fp;
    int i,j;
    char str[50];
    char name1[21];
    char tel1[5][12];
    int n,age1;
    char addr1[51];
    fp=fopen("contacts.txt","rb");
    if(fp==NULL)
        printf("文件没打开!\n");
    CONTACT one;
    int flag=0;
    int count=0;
    while( fread(&one,sizeof(CONTACT),1,fp)==1)//找到联系人,并复制联系人信息
    {
        if (strcmp(one.name,name)==0)
        {
            printf("------------------------\n");
            printf("名字  %s\n",one.name);
            strcpy(name1,one.name);
            for(i=0; i<one.n; i++)
            {
                if(one.tel[i][0]>='0'&&one.tel[i][0]<='9')
                    printf("号码  %s\n",one.tel[i]);
                strcpy(tel1[i],one.tel[i]);
            }
            printf("地址  %s\n",one.addr);
            strcpy(addr1,one.addr);
            printf("年龄  %d\n",one.age);
            age1=one.age;
            printf("------------------------\n");
            flag=1;
        }
    }
    if(flag==0)
    {
        printf("联系人不存在\n");
        return 0;
    }
    fclose(fp);


    delcontact(name1);//删除修改前的联系人
    printf("t1:修改姓名\n");
    printf("t2:修改号码\n");
    printf("t3:修改地址\n");
    printf("t4:修改年龄\n");
    scanf("%d",&j);
    if(j==1)
    {
        printf("输入新名字为:\n");
        stringInput(str,20);
        memset(name1,'\0',sizeof(name1));//将字符串清空
        strcpy(name1,str);//将修改后的信息替换原信息
    }
    if(j==2)
    {
        printf("修改的号码为第几个");
        scanf("%d",&n);
       printf("输入新号码为:\n");
        stringInput(str,12);
        memset(tel1[n-1],'\0',sizeof(tel1[n-1]));
        strcpy(tel1[n-1],str);
    }
    if(j==3)
    {
        printf("输入新地址为:\n");
        stringInput(str,50);
        memset(addr1,'\0',sizeof(addr1));
        strcpy(addr1,str);
    }
    if(j==4)
    {
        printf("输入新年龄\n");
        scanf("%d",&n);
        age1=n;
    }
    fp=fopen("contacts.txt","ab");
    if(fp==NULL)
        printf("文件没打开\n");
    strcpy(one.name,name1);//将修改完成后的信息复制到新联系人信息中
    one.age=age1;
    one.n=0;
    for(i=0; i<5; i++)
    {
        strcpy(one.tel[i],tel1[i]);
        one.n++;
    }
    strcpy(one.addr,addr1);
   fwrite(&one,sizeof(CONTACT),1,fp);
    fclose(fp);
    searchName(name1);
}
void searchName(char *name)//输出联系人详情
{
    FILE *fp;
    int i,flag=0;
    fp=fopen("contacts.txt","rb");
    if(fp==NULL)
        printf("文件没打开!\n");
    CONTACT one;
    while( fread(&one,sizeof(CONTACT),1,fp)==1)
    {
        if (strcmp(one.name,name)==0)
        {
            printf("------------------------\n");
            printf("名字  %s\n",one.name);
            for(i=0; i<one.n; i++)
                if(one.tel[i][0]>='0'&&one.tel[i][0]<='9')
                    printf("号码%d:  %s\n",i+1,one.tel[i]);
            printf("年龄  %d\n",one.age);
            printf("地址  %s\n",one.addr);
            printf("------------------------\n");
            flag=1;
        }
    }
    if(flag==0)
        printf("联系人不存在\n");


    fclose(fp);
}

void delContact(char *name)//删除联系人
{
    //以读的方式打开文件
    FILE *fp;
    int i,flag=0;
    fp=fopen("contacts.txt","rb");
    if(fp==NULL)
        printf("文件没打开!\n");
    //统计文件中联系人的个数
    CONTACT one,*temp;
    int count=0;
    while( fread(&one,sizeof(CONTACT),1,fp)==1)
    {
        count++;
    }
    //向堆区申请空间
    temp=(CONTACT *)malloc(count*sizeof(CONTACT));
    if(temp==NULL)
        printf("is not allocated!\n");
    //将文件中的数据全部读入内存
    rewind(fp);
    fread(temp,sizeof(CONTACT),count,fp);
    //关闭文件
    fclose(fp);
    //以写的方式打开文件
    fp=fopen("contacts.txt","wb");
    if(fp==NULL)
        printf("文件没打开!\n");
    //将内存中的数据一次写入文件(过滤)
    for(i=0; i<count; i++)
    {
        if(strcmp(temp[i].name,name)==0)
        {
            printf("------------------------\n");
            printf("%s 已被删除!\n",name);
            flag=1;
        }
        else
            fwrite(&temp[i],sizeof(CONTACT),1,fp);//不是要删除的人则重新录入到通讯录中
    }
    if(flag==0)
        printf("联系人不存在\n");
    //关闭文件
    fclose(fp);
}
void delcontact(char *name)//删除联系人
{
    //以读的方式打开文件
    FILE *fp;
    int i,flag=0;
    fp=fopen("contacts.txt","rb");
    if(fp==NULL)
        printf("文件没打开!\n");


    //统计文件中联系人的个数
    CONTACT one,*temp;
    int count=0;
    while( fread(&one,sizeof(CONTACT),1,fp)==1)
    {
        count++;
    }
    //向堆区申请空间
    temp=(CONTACT *)malloc(count*sizeof(CONTACT));
    if(temp==NULL)
        printf("is not allocated!\n");
    //将文件中的数据全部读入内存
    rewind(fp);
    fread(temp,sizeof(CONTACT),count,fp);
    //关闭文件
    fclose(fp);
    //以写的方式打开文件
    fp=fopen("contacts.txt","wb");
    if(fp==NULL)
        printf("文件没打开!\n");
    //将内存中的数据一次写入文件(过滤)
    for(i=0; i<count; i++)
    {
        if(strcmp(temp[i].name,name)==0)
        {
            printf("\n" );
        }
        else
            fwrite(&temp[i],sizeof(CONTACT),1,fp);
    }
    //关闭文件
    fclose(fp);
}
void qingkong()//清空联系人
{
    //以读的方式打开文件
    FILE *fp;
    int i,flag=0;
    fp=fopen("contacts.txt","rb");
    if(fp==NULL)
        printf("文件没打开!\n");
    //统计文件中联系人的个数
    CONTACT one,*temp;
    int count=0;
    while( fread(&one,sizeof(CONTACT),1,fp)==1)
    {
        count++;
    }
    //向堆区申请空间
    temp=(CONTACT *)malloc(count*sizeof(CONTACT));
    if(temp==NULL)
        printf("is not allocated!\n");
    //将文件中的数据全部读入内存
    rewind(fp);
    fread(temp,sizeof(CONTACT),count,fp);
    //关闭文件
    fclose(fp);
    //以写的方式打开文件
    fp=fopen("contacts.txt","wb");
    if(fp==NULL)
        printf("文件没打开!\n");
    //将内存中的数据一次写入文件(过滤)
    for(i=0; i<count; i++)
    {
        if(strcmp(temp[i].name,temp[i].name)==0)
        {
            printf("" );
        }
        else
            fwrite(&temp[i],sizeof(CONTACT),1,fp);
    }
    printf("通讯录已清空\n");
    //关闭文件
    fclose(fp);
}
void sortContact()//联系人排序
{
    //以读的方式打开文件
    FILE *fp;
    int i,j,flag=0;
    fp=fopen("contacts.txt","rb");
    if(fp==NULL)
        printf("文件没打开!\n");
    //统计文件中联系人的个数
    CONTACT one,a,*temp;
    int count=0;
    while( fread(&one,sizeof(CONTACT),1,fp)==1)
    {
        count++;
    }
    rewind(fp);
    //向堆区申请空间
    temp=(CONTACT *)malloc(count*sizeof(CONTACT));
    if(temp==NULL)
        printf("申请失败!\n");
    //将文件中的数据全部读入内存
    fread(temp,sizeof(CONTACT),count,fp);
    //关闭文件
    fclose(fp);
    //以写的方式打开文件
    fp=fopen("contacts.txt","wb");
    if(fp==NULL)
        printf("文件没打开!\n");
    //对内存中数据进行排序
    for(i=0; i<count; i++)
        for(j=0; j<count-i-1; j++)
        {
            if(strcmp(temp[j].name,temp[j+1].name)>0)
            {
                a=temp[j];
                temp[j]=temp[j+1];
                temp[j+1]=a;
            }
        }
    //将排序后的数据写入文件
    fwrite(temp,sizeof(CONTACT),count,fp);
    //关闭文件
    fclose(fp);
}
void jixu()
{
    char ch;
    printf("是否继续操作(Y/N)\n");
    ch=getchar();
    if(ch=='Y' || ch == 'y')
    {
        mainInterface();
    }
    else
        return 0;
}

void mainInterface()
{
    int j=0;
    char str[60];
    do
    {
        printf("    ************************************************************************\n");
        printf("    ||                                                                    ||\n");
        printf("    ||        1. 添加联系人        2. 删除联系人        3.查找联系人      ||\n");
        printf("    ||        4. 修改联系人        5. 显示联系人        6.清空联系人      ||\n");
        printf("    ||        7. 联系人排序                             0.退出            ||\n");
        printf("    ||                                                                    ||\n");
        printf("    ************************************************************************\n");
        printf("请选择操作:  ");
        scanf("%d",&j);
        switch (j)
        {
        case 1:
            addContact();
            break;
        case 2:
            printf("删除人姓名\n");
            stringInput(str,60);
            delContact(str);
            break;
        case 3:
            printf("查询人姓名\n");
            stringInput(str,60);
            searchName(str);
            break;
        case 4:
            printf("修改人姓名\n");
            stringInput(str,20);
            xiugai(str);
            break;
        case 5:
            display();
            break;
        case 6:
            qingkong();
        default:
            break;
        }
    }
    while(j);
}
//addContact()新建联系人
//sortContact()联系人排序
//delContact(char *name)删除联系人
//display() 展示有哪些联系人
//searchName(char *name)输出联系人详情
int main()
{
    system("color f0");
    int i;
    char name[20];
    mainInterface();
    return 0;

}

                                        运行结果

     简易通讯录(文件版)

相关文章: