简单C语言通讯录的制作

1.通讯录的功能

1.创建联系人

2.创建群组

3.对联系人进行增删减改

4.对联系人进行查找

5.对联系人进行排序

2.代码展示

/*
    通讯录管理程序
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define N 1000
//结构体的定义
struct record
{
    char name[20];  //联系人姓名
    char phone[20]; //联系人电话
    char adress[40];   //联系人地址
    char qunming[25];   //联系人所在群组(默认位置在其他)


} contact[N];






int NO=0;       //用于记录联系人的总个数


FILE *fp;


//函数声明
void mainmenu();         //主菜单
void newrecord();        //新建联系人函数
void showmenu();    //浏览菜单
void showgroup();   //按群显示
void showall();     //显示全部
void searchmenu();     // 查找菜单
void searchname();     // 按名字查找
void searchphone();    //按电话号码查找
void modifymenu();     // 修改菜单
void deletemenu();      //删除菜单
void newrecordmenu();   //创建菜单


void deleteall();           //删除所有联系人
void deletesingle();     //删除一个联系人
void deletename();    //删除联系人名字
void deletephone();   //删除联系人电话号码
void paixu();       //排序函数(按名字从小到大)
int loadfile();                 //建立文件
void savefile();               //保存文件
void savegroupfile(char *filename);//更新群里的内容
void deletegroupOne();  //联系人退群函数


//主函数
int main()
{
    printf("\n\t\t      欢迎使用通讯录管理系统");
    loadfile();


    while (1)
    {
        mainmenu();
    }
}


//主菜单
void mainmenu()
{
    char choice;
    system("cls");
    system("color f4");
    printf("\n\t\t***********************************************************");
    printf("\n                              通讯录管理系统主菜单     \n");
    printf("                         |-------------------------------|\n");
    printf("                         |   选择[1]:创建功能菜单        |\n");
    printf("                         |   选择[2]:显示功能菜单        |\n");
    printf("                         |   选择[3]:查找功能菜单        |\n");
    printf("                         |   选择[4]:修改功能菜单        |\n");
    printf("                         |   选择[5]:删除功能菜单        |\n");
    printf("                         |   选择[6]:退出                |\n");
    printf("                         |-------------------------------|\n");
    printf("\n");
    printf("\n\t\t***********************************************************");
    choice=getche();
    switch (choice)
    {
    case '1':
        newrecordmenu();
        break;
    case '2':
        showmenu();
        break;
    case '3':
        searchmenu();;
        break;
    case '4':
        modifymenu();
        break;
    case '5':
        deletemenu();
        break;
    case '6':
        printf("\n\n\t\t\t感谢你的使用,bye bye!\n");
        exit(0);
    default:
        mainmenu();
    }
}
// 创建模块
void newrecordmenu()
{
    char choice;
    system("cls");
    system("color f4");
    printf("\n\t\t********************************************************");
    printf("\n\t\t                      创建功能菜单           ");
    printf("\n\t\t            |-------------------------------|");
    printf("\n\t\t            |         1-创建联系人          |");
    printf("\n\t\t            |         2-返回主菜单          |");
    printf("\n\t\t            |-------------------------------|");
    printf("\n\t\t********************************************************");
    printf("\n\t\t***********************************************************");
    choice=getche();
    switch (choice)
    {
    case '1':
        newrecord();
        break;
    case '2':
        mainmenu();
        break;
   default :
        mainmenu();


    }




}


void newrecord()
{
    int number;
    printf("\n\t\t***********请输入你想添加的联系人的个数");
    scanf("%d",&number);
    printf("\n\t\t***************请依次输入%d个联系人信息 ****************\n",number);
    while(number--)
    {


        printf("\n\t\t输入姓名:");
        scanf("%s",contact[NO].name);
        printf("\n\t\t输入电话号码:");
        scanf("%s",contact[NO].phone);
        printf("\n\t\t输入家庭住址:");
        scanf("%s",contact[NO].adress);
        strcpy(contact[NO].qunming,"其他");
        printf("\n\t\t***********************************************************");
        NO++;
        savefile();
    }
    return;
}


//浏览模块
void showmenu()
{
    char choice;
    system("cls");
    system("color f4");
    printf("\n\t\t********************************************************");
    printf("\n\t\t                      显示功能菜单           ");
    printf("\n\t\t            |-------------------------------|");
    printf("\n\t\t            |         1-按群显示            |");
    printf("\n\t\t            |         2-显示全部            |");
    printf("\n\t\t            |         3-返回主菜单          |");
    printf("\n\t\t            |-------------------------------|");
    printf("\n\t\t********************************************************");
    printf("\n\t\t***********************************************************\n");
    choice=getche();
    switch (choice)
    {
    case '1':
        showgroup();
        break;
    case '2':
        showall();
        break;
    case '3':
        mainmenu();
        break;
    default :
        showmenu();


    }


}
void showall()
{
    int i;
    system("cls");
    system("color f4");
    paixu();
    if(NO!=0)
    {
        printf("\n\t\t*************** 以下为通讯录所有信息************\n");
        for (i=0; i<NO; i++)
        {
            printf("\n\t\t---------------------------------------------");
            printf("\n\t\t姓    名: %s",contact[i].name);
            printf("\n\t\t联系电话: %s",contact[i].phone);
            printf("\n\t\t家庭住址: %s",contact[i].adress);
            printf("\n\t\t所在群位置:%s",contact[i].qunming);
            printf("\n\t\t---------------------------------------------");


        }
        printf("\n\t\t*****************************************************");
    }
    else
        printf("\n\t\t+_+通讯录中无任何纪录");
    printf("\n\t\t按任意键返回主菜单:");
    getch();
    return;
}
void showgroup()
{
    FILE *fp1;
    char qunflag[30];
    char qunfile[30];
    printf("\n\t\t请输入你要显示的群名(例如:亲人,朋友):");
    scanf("%s",qunflag);


    printf("\n\t\t*************** 以下为(%s群)中所有信息************\n",qunflag);
    for(int i=0;i<NO;i++)
    {
        if(strcmp(contact[i].qunming,qunflag)==0)
        {


                printf("\n\t\t---------------------------------------------");
                printf("\n\t\t姓    名: %s",contact[i].name);
                printf("\n\t\t联系电话: %s",contact[i].phone);
                printf("\n\t\t家庭住址: %s",contact[i].adress);
                printf("\n\t\t---------------------------------------------");
                printf("\n");
                printf("\n\t\t***********************************************************");


        }




    }
    savegroupfile(qunflag);
    printf("\n\t\t是否继续查看群组?(1/0)");
    if (getch()=='1')
        showgroup();
    return;
}


//查找模块
void searchmenu()
{
    char choice;
    system("cls");
    system("color f4");
    printf("\n\t\t********************************************************");
    printf("\n\t\t            -----------------------------");
    printf("\n\t\t            |           查找菜单        |");
    printf("\n\t\t            |         1-按姓名查找      |");
    printf("\n\t\t            |         2-按电话查找      |");
    printf("\n\t\t            |         3-返回主菜单      |");
    printf("\n\t\t            |---------------------------|");
    printf("\n\t\t********************************************************\n");
    //printf("\n\t\t你选择了:");
    choice=getche();
    switch (choice)
    {
    case '1':
        searchname();
        break;
    case '2':
        searchphone();
        break;
    case '3':
        mainmenu();
        break;
    }
}


void searchname()
{
    int flag=0;
    int i;


    char name[20];
    printf("\n\t\t***************** 按姓名查找 *******************");
    printf("\n\t\t请输入姓名:");
    scanf("%s",name);
    for(i=0; i<NO; i++)
    {
        if (strcmp(contact[i].name,name)==0)
        {
            printf("\n\t\t************ 以下是您查找的联系人信息 **********");
            printf("\n\t\t姓    名: %s",contact[i].name);
            printf("\n\t\t联系电话: %s",contact[i].phone);
            printf("\n\t\t家庭住址: %s",contact[i].adress);
            printf("\n\t\t所在群位置:%s",contact[i].qunming);
            printf("\n\t\t************************************************");
            printf("\n\t\t按任意键返回主菜单:");
            flag=1;
            getch();
            return;


        }
    }
    if(flag==0)
    {
        printf("\n\t\t没有该姓名的联系人纪录");
        printf("\n\t\t按任意键返回主菜单");
        getch();
        return;
    }
}


void searchphone()
{
    int flag=0;// 判断是否查到联系人的标志
    int i;


    char phone[20];
    printf("\n\t\t****************** 按电话查找 ******************");
    printf("\n\t\t请输入电话:");
    scanf("%s",phone);
    for(i=0; i<NO; i++)
    {
        if (strcmp(contact[i].phone,phone)==0)
        {
            printf("\n\t\t************* 以下是您查找的联系人信息 *********");
            printf("\n\t\t姓    名: %s",contact[i].name);
            printf("\n\t\t联系电话: %s",contact[i].phone);
            printf("\n\t\t家庭住址: %s",contact[i].adress);
            printf("\n\t\t所在群位置:%s",contact[i].qunming);
            printf("\n\t\t************************************************");
            printf("\n\t\t按任意键返回主菜单:");
            flag++;
            getch();
            return;
        }
    }
    if (flag==0)
    {
        printf("\n\t\t没有该联系人信息");
        printf("\n\t\t按任意键返回主菜单");
        getch();
        return;
    }
}


void modifymenu()
{
    int flag=0; //判断是否找到联系人的标志
    int i,k;


    char choice;
    char name[20];
    struct record modify;                   //新建一个联系人结构体
    system("cls");
    printf("\n\t\t请输入您要修改的姓名:");
    scanf("%s",name);
    for(i=0; i<NO; i++)
    {
        if (strcmp(contact[i].name,name)==0)
        {
            k=i;
            flag=1;
            modify=contact[i];              //保存当前要修改的联系人的信息
            printf("\n\t\t********** 以下是您将修改的联系人信息 **********");
            printf("\n\t\t姓    名: %s",contact[i].name);
            printf("\n\t\t联系电话: %s",contact[i].phone);
            printf("\n\t\t家庭住址: %s",contact[i].adress);
            printf("\n\t\t所在群位置:%s",contact[i].qunming);
            printf("\n\t\t是否继续?(1/0)");
            if(getch()=='0')
                modifymenu();
            else
            {
                printf("\n\t\t选择您要修改的选项:");
                printf("\n\t\t\t(1).姓  名");
                printf("\n\t\t\t(2).联系电话");
                printf("\n\t\t\t(3).家庭住址");
                printf("\n\t\t\t(4).存放群组的位置");
                printf("\n\t\t\t(5).返   回");
                choice=getch();


                switch(choice)
                {




                case '1':
                    printf("\n更改后的姓名:");
                    //strcpy(contact[i].name,"");
                    //savefile();
                    //char nametemp[20];
                    scanf("%s",contact[i].name);
                    strcat(contact[i].name,"\0");
                    //strcpy(contact[i].name,nametemp);
                    break;
                case '2':
                    printf("\n更改后的联系电话:");
                    scanf("%s",contact[i].phone);
                    break;
                case '3':
                    printf("\n更改后的家庭住址:");
                    scanf("%s",contact[i].adress);
                    break;
                case '4':
                    printf("\n更改后的群组名(例如:亲人,同事):");
                    scanf("%s",contact[i].qunming);
                    savegroupfile(contact[i].qunming);
                    break;


                case '5':
                    mainmenu();
                    break;
                default:
                    modifymenu();
                }


                printf("\n\t\t您的修改结果为:");
                printf("\n\t\t姓    名: %s",contact[i].name);
                printf("\n\t\t联系电话: %s",contact[i].phone);
                printf("\n\t\t家庭住址: %s",contact[i].adress);
                printf("\n\t\t所在群位置:%s",contact[i].qunming);
                printf("\n\t\t确认修改?1/0");
                if(getch()=='0')
                {
                    contact[i]=modify;       //重新将原来的联系人信息拷贝到当前节点
                    printf("\n\t\t修改未保存!");
                }
                else
                {
                    printf("\n\t\t 修改成功!");


                }
                savefile();                 //保存联系人信息


                printf("\n\t\t是否继续修改?(1/0)");


                if (getch()=='1')
                    modifymenu();
                return;
            }
        }
    }
    if (flag==0)
    {
        printf("\n\t\t+_+没有该联系人的纪录");
        printf("\n\t\t是否继续修改?(1/0)");
        if (getch()=='1')
            modifymenu();
    }
    return;
}


//删除模块
void deletemenu()
{
    char choice;
    if(NO==0)
    {
        printf("\n\t\t对不起,文件中无任何纪录");
        printf("\n\t\t按任意键返回主菜单");
        getch();
        return;
    }
    system("cls");
    printf("\n\t\t******************* 删除菜单 *******************");
    printf("\n\t\t****************** 1-删除所有 ******************");
    printf("\n\t\t****************** 2-删除单个 ******************");
    printf("\n\t\t***************** 3-将某个联系人退群 ***********");
    printf("\n\t\t***************** 4-返回主菜单 *****************");
    printf("\n\t\t************************************************");
    printf("\n\t\t你选择了:");
    choice=getchar();
    switch(choice)
    {
    case '1':
        deleteall();
        break;
    case '2':
        deletesingle();
        break;
    case '4':
        mainmenu();
        break;
    case '3':
        deletegroupOne();
        break;
    default:
        deletemenu();
    }
}


void deleteall()
{
    printf("\n\t\t确认删除?(1/0)");
    if (getche()=='1')
    {
        if ((fp=fopen("联系人.txt","a+"))==0)
        {
            printf("\n\t\t+_+不能打开文件,删除失败");
            mainmenu();


        }
        NO=0;
        savefile();
        printf("\n\t\t所有联系人纪录已删除,按任意键返回主菜单");
        getch();
        fclose(fp);
        return;
    }
    else
        return;
}
void deletesingle()
{
    char choice;
    printf("\n\t\t\t1-按姓名删除");
    printf("\n\t\t\t2-按号码删除");
    printf("\n\t\t\t3-返回删除菜单");
    printf("\n\t\t请选择:");
    choice=getche();
    switch (choice)
    {
    case '1':
        deletename();
        break;
    case '2':
        deletephone();
        break;
    case '3':
        deletemenu();
        break;
    }
}
void deletename()
{
    int i,j;
    int flag=0;         //用于判断是否找到联系人的标志
    char name[20];
    printf("\n\t\t请输入要删除联系人姓名:");
    scanf("%s",name);
    if(NO==0)
    {
        printf("\n\t\t对不起,文件中无任何纪录");
        printf("\n\t\t按任意键返回主菜单");
        getch();
        return;
    }
    for (i=0; i<NO; i++)
    {
        if (strcmp(contact[i].name,name)==0)
        {
            printf("\n\t\t以下是您要删除的联系人纪录:");
            printf("\n\t\t姓    名: %s",contact[i].name);
            printf("\n\t\t联系电话: %s",contact[i].phone);
            printf("\n\t\t家庭住址: %s",contact[i].adress);
            printf("\n\t\t所在群位置:%s",contact[i].qunming);
            printf("\n\t\t是否删除?(1/0)");
            if (getch()=='1')
            {
                for (j=i; j<NO-1; j++)
                    contact[j]=contact[j+1];  //用后一个联系人的信息将前一个联系人的信息覆盖
                NO--;
                flag=1;
                printf("\n\t\t^_^删除成功");
                savefile();
                savegroupfile(contact[i].qunming);
                printf("\n\t\t是否继续删除?(1/0)");
                if (getch()=='1')
                    deletename();
                return;
            }
            else
                return;
        }
        continue;
    }
    if (flag==0)
    {
        printf("\n\t\t没有该联系人的纪录");
        printf("\n\t\t是否继续删除?(1/0)");
        if (getch()=='1')
            deletename();
        return;
    }
}


void deletephone()
{
    int i,j;
    int flag=0;                  //用于判断是否找到联系人的标志
    char phone[20];
    printf("\n\t\t请输入要删除联系电话:");
    scanf("%s",phone);
    if(NO==0)
    {
        printf("\n\t\t+_+对不起,文件中无任何纪录");
        printf("\n\t\t按任意键返回主菜单");
        getch();
        return;
    }
    for (i=0; i<NO; i++)
    {
        if (strcmp(contact[i].phone,phone)==0)
        {
            printf("\n\t\t以下是您要删除的联系人纪录:");
            printf("\n\t\t姓    名: %s",contact[i].name);
            printf("\n\t\t联系电话: %s",contact[i].phone);
            printf("\n\t\t家庭住址: %s",contact[i].adress);
            printf("\n\t\t所在群位置:%s",contact[i].qunming);
            printf("\n\t\t是否删除?(1/0)");
            if (getch()=='1')
            {
                for (j=i; j<NO-1; j++)
                    contact[j]=contact[j+1];
                NO--;
                flag=1;
                printf("\n\t\t^_^删除成功");
                savefile();
                savegroupfile(contact[i].qunming);
                printf("\n\t\t是否继续删除?(1/0)");
                if (getch()=='1')
                    deletephone();
                return;
            }
            else
                return;
        }
        continue;
    }
    if (flag==0)
    {


        printf("\n\t\t+_+没有该联系人的纪录");
        printf("\n\t\t是否继续删除?(1/0)");
        if (getch()=='1')
            deletephone();
        return;
    }
}
void deletegroupOne()
{


    int i,j;
    int flag=0;
    char name[20];
    printf("\n\t\t请输入要退群联系人姓名:");
    scanf("%s",name);
    if(NO==0)
    {
        printf("\n\t\t对不起,文件中无任何纪录");
        printf("\n\t\t按任意键返回主菜单");
        getch();
        return;
    }
    for (i=0; i<NO;i++)
    {
        if (strcmp(contact[i].name,name)==0)
        {
            printf("\n\t\t以下是您要删除的联系人纪录:");
            printf("\n\t\t姓    名: %s",contact[i].name);
            printf("\n\t\t联系电话: %s",contact[i].phone);
            printf("\n\t\t家庭住址: %s",contact[i].adress);
            printf("\n\t\t所在群位置:%s",contact[i].qunming);
            printf("\n\t\t是否退群?(1/0)");
            if (getch()=='1')
            {
                char namefileflag[25];
                strcpy(namefileflag,contact[i].qunming);
                strcpy(contact[i].qunming,"其他");
                savefile();
                savegroupfile(contact[i].qunming);
                savegroupfile(namefileflag);
                printf("\n\t\t^_^退群成功");
                flag=1;
                printf("\n\t\t是否继续退群?(1/0)");
                if (getch()=='1')
                    deletegroupOne();
                return;
            }
            else
                return;
        }
        continue;
    }
     if (flag==0)
    {
        printf("\n\t\t没有该联系人的纪录");
        printf("\n\t\t是否继续删除?(1/0)");
        if (getch()=='1')
            deletegroupOne();
        return;
    }




}




//排序模块
void paixu()
{
    int i,j;
    struct record temp;     //交换变量
    for(i=0; i<NO-1; i++)
        for(j=0; j<NO-i-1; j++)
        {
            if(strcmp(contact[j].name,contact[j+1].name)>0)
            {
                temp=contact[j];
                contact[j]=contact[j+1];
                contact[j+1]=temp;
            }
        }


}


// 写入文件预读取文件模块
int loadfile()
{


    FILE *fp;


    if ((fp=fopen("联系人.txt","at+"))==0)
    {
        printf("\n\t\t\t\t建立失败");
        exit(0);
    }
    else
    {
        printf("\n\n\t\t\t   电话簿建立成功!");


    }
    while(!feof(fp) && fread(&contact[NO],sizeof(struct record),1,fp))
    {
        char c=fgetc(fp);       // 用于将文件中的换行符吸收
        NO++;
    }
    fclose(fp);
    printf("\n\t\t\t   按任意键进入主菜单");
    getch();
    return 0;
}
void savegroupfile(char *filename)
{
    FILE *fp1;
    char filename1[30];
    strcpy(filename1,filename);
    strcat(filename1,".txt");
    if ((fp1=fopen(filename1,"w+"))==0)
    {
        printf("\n\t\t+_+文件打开失败!\n");
    }
    for(int i=0;i<NO;i++)
    {
        if(strcmp(contact[i].qunming,filename)==0)
        {


            if (fwrite(&contact[i],sizeof(struct record),1,fp1)!=1)
            {
                    printf("\n\t\t写入文件错误!\n");
            }
            else
            {
                fputc(10,fp1); // 往文件中写入换行符,让文件中保存的内容更方便查询
            }
        }
    }
    fclose(fp1);




}
void savefile()
{
    int i;
    if ((fp=fopen("联系人.txt","w+"))==0)
    {
        printf("\n\t\t+_+文件打开失败!\n");
    }
    for (i=0; i<NO; i++)
    {
        if (fwrite(&contact[i],sizeof(struct record),1,fp)!=1)
        {
            printf("\n\t\t写入文件错误!\n");
        }
        else
        {
            fputc(10,fp);    // 往文件中写入换行符,让文件中保存的内容更方便查询
        }
    }
    printf("\n\t\t   已更新文件!\n");
    fclose(fp);
}



3.未解决问题

1.查找不能进行模糊查找

2.群的创建有点乱

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏代有工的玉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值