学习

C语言课程设计:关于简单通讯录的设计!

越权(0x3E5) · 6月27日 · 2017年

身为大学狗的我在学本文来自:1024s.cn完了C语言这门课程之后老师要求做一个课程设计并且上交。
于是我选Powered by 0x3E5择了 简单通讯录 这个题目&#Powered by 0x3E58230;

先来说一下功能跟根Powered by 0x3E5要求吧!

一.功能选择可以用菜单实现本文来自:1024s.cn
  1. 显示联系人:显示所添加联系人的编号、姓名、1024s.cn籍贯、电话号码及电子邮箱;
  2. 添加联系人:添加联系人的姓名、籍贯、电话号码Powered by 0x3E5及电子邮箱;
  3. 查询联系人:通过0到3四个数字分别按照姓名、电话、邮箱查找和返回主菜单;
  4. 修改联系人:通过输入联系人的姓名进行修改联系人的信息,确认信息的修改后选择数字1到5修改联系人的信息;
  5. 删除联系人:通过输入联系人的姓名删除联系人;
  6. 退出程序:退出通讯录。
二.电话号码薄结构:编号、姓名、籍贯、电话号码及电子邮箱

添加用户的信息后,数据保存后,若显示联系人的信息则数据以表格的形式显示,数据的添加同样要分别本文来自:1024s.cn添加联系人的编号、姓名、籍贯、电话号码及电子邮箱。

三.设计思路
  1. 创建person_info结构体类型用来存放联系人信息。
  2. 创建menu()函数用来建立一个程序主菜单。
  3. 创建input_info()函数,判断用户输入的编号选择相应的功能。
  4. 创建display_info()函数,显示出文件中存放的所有联系人。
  5. 创建import_info()函数,用户输入联系人信息并存放到文件中。
  6. 创建search_info()函数,显示查询菜单根据需求选择相应查询方式。
  7. 创建search_info_byname()函数,根据姓名查找联系人。
  8. 本文来自:1024s.cn
  9. 创建search_info_bycele()函数,根据电话号码查找联系人。
  10. 创建search_info_bymail()函数,根据邮箱查找联系人。
  11. 创建edit_info()函数,输入联系人姓名根据需求选择需要修改联系人的信息项。
  12. 创建delete_info()函数,输入联系人姓名删除文件中存在的相应联系人的信息。
  13. 创建一个主函数main(),调用menu()函数即可。
四.主菜单效果图

C语言简单通讯录主菜单示意图

根据输入不同编号进行实现相应功能本文来自:1024s.cn模块的调用。

五.程序代码(附注释)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


struct person_info//定义个人信息结构体
{
    char name[20];//姓名
    char province[20];//籍贯
    char celephone[20];//电话号码
    char mail[20];//电子邮箱
}person[50];//定义数组最多存放五十个联系人


void menu();//程序主菜单
void input_info();//输入功能编号
void display_info();//显示所有联系人功能
void import_info();//添加联系人功能
void search_info();//查询联系人功能
void search_info_byname();//按姓名查找模块
void search_info_bycele();//按电话查找模块
void search_info_bymail();//按邮箱查找模块
void edit_info();//修改信息模块
void delete_info();//删除联系人模块


void main()
{
    while(1)
    {
        menu();
    }
}


void menu()//程序主菜单
{
    system("cls");//调用DOS命令cls清空显示窗口信息
    system ("color 0A");//调用DOS环境的背景颜色和字体颜色第一位表示背景颜色第二位表示字体颜色
    puts("\n\n\t********欢迎使用通讯录********");
    puts("\t*                            *");
    puts("\t*                            *");
    puts("\t*        1.显示联系人        *");
    puts("\t*        2.添加联系人        *");
    puts("\t*        3.查询联系人        *");
    puts("\t*        4.修改联系人        *");
    puts("\t*        5.删除联系人        *");
    puts("\t*                            *");
    puts("\t*        0.退出通讯录        *");
    puts("\t*                            *");
    puts("\t******************************");
    printf("\n\t请输入编号(0~5)使用功能:");
    input_info();
}


void input_info()//输入功能编号
{
    int number;//定义一个变量用来判断用户输入的编号
    scanf("%d",&number);//输入功能编号赋值给number
    switch(number)//判断编号调用相应功能
    {
        case 0:exit(0);
        case 1:display_info();break;
        case 2:import_info();break;;//调用添加联系人函数
        case 3:search_info();break;
        case 4:edit_info();break;
        case 5:delete_info();break;
        default:printf("\n\t输入错误请按任意键重新输入!\n");getch();menu();break;
    }
}


void display_info()//显示所有联系人
{
    system("cls");//调用DOS命令cls清空显示窗口信息
    system ("color 0A");//调用DOS环境的背景颜色和字体颜色第一位表示背景颜色第二位表示字体颜色
    FILE *data;
    data=fopen("data.txt","r");
    //判断文件是否存在
    if(data==NULL)
    {
        puts("\n\n\t********文件打开失败********");
        puts("\t*                          *");
        puts("\t*    请确认是否存在文件    *");
        puts("\t*                          *");
        puts("\t*   或者添加联系人后再试   *");
        puts("\t*                          *");
        puts("\t*    按任意键返回主菜单    *");
        puts("\t*                          *");
        puts("\t****************************\n\n");
        getch();
        menu();
    }
    else
    {
        puts("\n\n\t****************************");
        puts("\t*                          *");
        puts("\t*       文件打开成功       *");
        puts("\t*                          *");
        puts("\t*    按任意键显示联系人    *");
        puts("\t*                          *");
        puts("\t****************************\n\n");
        getch();
    }
    system("cls");//调用DOS命令cls清空显示窗口信息
    //读取文件中的信息条数
    int i=0;
    do
    {
       fscanf(data,"%s%s%s%s",&person[i].name,&person[i].province,&person[i].celephone,&person[i].mail);
        i++;
    }while(!feof(data));
    //显示联系人信息部分
    puts("\n\t|编号\t|姓名\t|籍贯    \t|电话号码\t|电子邮箱");
    int j;
    for(j=0;j<(i-1);j++)
    {
        puts("\t-----------------------------------------------------------------------");
        fscanf(data,"%s%s%s%s",&person[j].name,&person[j].province,&person[j].celephone,&person[j].mail);
        printf("\t|%d\t|%s\t|%s\t|%s\t|%s\n",j+1,person[j].name,person[j].province,person[j].celephone,person[j].mail);
    }
    puts("\t-----------------------------------------------------------------------");
    fclose(data);
    printf("\n\t-----------------------\n");
    printf("\t  按任意键返回主菜单!   ");
    getch();
    menu();
}


void import_info()//添加联系人
{
    system("cls");//调用DOS命令cls清空显示窗口信息
    system ("color 0A");//调用DOS环境的背景颜色和字体颜色第一位表示背景颜色第二位表示字体颜色
    int a=0;
    FILE *data;
    data=fopen("data.txt","a");
    //判断是否成功打开文件如果失败自动创建
    if(data==NULL)
    {
        puts("\n\n\t********文件打开失败********");
        puts("\t*                          *");
        puts("\t*     正在尝试创建文件     *");
        data=fopen("data.txt","w");
        if(data==NULL)
        {
            puts("\t*                          *");
            puts("\t*       文件创建失败!     *");
            puts("\t*   请重新打开软件再尝试!  *");
            puts("\t*                          *");
            puts("\t****************************\n\n");
        }else
        {
            puts("\t*                          *");
            puts("\t*       文件创建成功       *");
            puts("\t*                          *");
            puts("\t****************************\n\n");
            fclose(data);
        }
    }else
    {
        puts("\n\n\t****************************");
        puts("\t*                          *");
        puts("\t*                          *");
        puts("\t*       文件打开成功       *");
        puts("\t*                          *");
        puts("\t*                          *");
        puts("\t****************************\n\n");
        fclose(data);
    }
    fclose(data);
    //开始添加信息
    data=fopen("data.txt","a");
    do
    {
        puts("\n\t********请输入详细信息*********\n");
        printf("\t请输入联系人姓名:");
        scanf("%s",&person[0].name);
        printf("\n\t请输入籍贯:");
        scanf("%s",&person[0].province);
        printf("\n\t请输入电话号码:");
        scanf("%s",person[0].celephone);
        printf("\n\t请输入电子邮箱:");
        scanf("%s",&person[0].mail);
        fprintf(data,"%s\t%s\t%s\t%s\n",person[0].name,person[0].province,person[0].celephone,person[0].mail);
        printf("\n\t********恭喜您添加完成!********\n");
        printf("\n\n\t请按1继续添加或输入其他数字返回主界面:");
        scanf("%d",&a);
        system("cls");//调用DOS命令cls清空显示窗口信息
    }while(a==1);
    fclose(data);//关闭文件
    menu();
}


void search_info()//查询联系人菜单模块
{
    system("cls");//调用DOS命令cls清空显示窗口信息
    system ("color 0A");//调用DOS环境的背景颜色和字体颜色第一位表示背景颜色第二位表示字体颜色
    FILE *data;
    data=fopen("data.txt","r");
    //判断文件是否存在
    if(data==NULL)
    {
        puts("\n\n\t********文件打开失败********");
        puts("\t*                          *");
        puts("\t*    请确认是否存在文件    *");
        puts("\t*                          *");
        puts("\t*   或者添加联系人后再试   *");
        puts("\t*                          *");
        puts("\t*    按任意键返回主菜单    *");
        puts("\t*                          *");
        puts("\t****************************\n\n");
        getch();
        menu();
    }
    fclose(data);
    //选择查找方式
    int i;
    puts("\n\n\t*******请选择查找方式*******");
    puts("\t*                          *");
    puts("\t*       1.按姓名查找       *");
    puts("\t*       2.按电话查找       *");
    puts("\t*       3.按邮箱查找       *");
    puts("\t*       0.返回主菜单       *");
    puts("\t*                          *");
    puts("\t****************************");
    printf("\n\n\t请输入编号:");
    scanf ("%d",&i);
    switch(i)
    {
        case 1:search_info_byname();break;
        case 2:search_info_bycele();break;
        case 3:search_info_bymail();break;
        case 0:menu();break;
        default:puts("\n\n\t输入错误按任意键重新输入!!!");getch();search_info();break;
    }
}


void search_info_byname()//按姓名查找模块
{
    system("cls");//调用DOS命令cls清空显示窗口信息
    system ("color 0A");//调用DOS环境的背景颜色和字体颜色第一位表示背景颜色第二位表示字体颜色
    int i=0,n,x=0;
    //读取文件中的信息到结构体数组中
    FILE *data;
    data=fopen("data.txt","r");
    char name[20];
    printf ("\n\n\t请输入姓名:");
    scanf ("%s",&name);
    do
    {
        fscanf(data,"%s%s%s%s",&person[i].name,&person[i].province,&person[i].celephone,&person[i].mail);
        if (strcmp(person[i].name,name)==0)//进行判断是否与输入的值相等如果相等则输出
        {
            printf ("\n\t姓名:%s\n",person[i].name);
            printf ("\n\t籍贯:%s\n",person[i].province);
            printf ("\n\t电话:%s\n",person[i].celephone);
            printf ("\n\t邮箱:%s\n",person[i].mail);
            printf("\t--------------------");
            x=1;
        }
        i++;
    }while(!feof(data));
    if(x==0)//如果联系人不存在则输出错误信息
    {
        puts("\n\n\t对不起您查询的联系人不存在!");
        puts("\n\t请检查您输入的内容是否正确!");
    }
    fclose(data);
    printf ("\n\n\t是否继续查找(1是0否):");
    scanf ("%d",&n);
    //判断是否要继续查找如果不返回主菜单
    if (n==1)
        search_info_byname();
    else
    {
        menu();
    }
}


void search_info_bycele()//按电话查找模块
{
    system("cls");//调用DOS命令cls清空显示窗口信息
    system ("color 0A");//调用DOS环境的背景颜色和字体颜色第一位表示背景颜色第二位表示字体颜色
    int i=0,n,x=0;
    //读取文件中的信息到结构体数组中
    FILE *data;
    data=fopen("data.txt","r");
    char cele[20];
    printf ("\n\n\t请输入电话:");
    scanf ("%s",&cele);
    do
    {
        fscanf(data,"%s%s%s%s",&person[i].name,&person[i].province,&person[i].celephone,&person[i].mail);
        if (strcmp(person[i].celephone,cele)==0)//进行判断是否与输入的值相等如果相等则输出
        {
            printf ("\n\t姓名:%s\n",person[i].name);
            printf ("\n\t籍贯:%s\n",person[i].province);
            printf ("\n\t电话:%s\n",person[i].celephone);
            printf ("\n\t邮箱:%s\n",person[i].mail);
            printf("\t--------------------");
            x=1;
        }
        i++;
    }while(!feof(data));
    if(x==0)//如果联系人不存在则输出错误信息
    {
        puts("\n\n\t对不起您查询的联系人不存在!");
        puts("\n\t请检查您输入的内容是否正确!");
    }
    fclose(data);
    printf ("\n\n\t是否继续查找(1是0否):");
    scanf ("%d",&n);
    //判断是否要继续查找如果不返回主菜单
    if (n==1)
        search_info_bycele();
    else
    {
        menu();
    }
}


void search_info_bymail()//按邮箱查找模块
{
    system("cls");//调用DOS命令cls清空显示窗口信息
    system ("color 0A");//调用DOS环境的背景颜色和字体颜色第一位表示背景颜色第二位表示字体颜色
    int i=0,n,x=0;
    //读取文件中的信息到结构体数组中
    FILE *data;
    data=fopen("data.txt","r");
    char mail[20];
    printf ("\n\n\t请输入邮箱:");
    scanf ("%s",&mail);
    do
    {
        fscanf(data,"%s%s%s%s",&person[i].name,&person[i].province,&person[i].celephone,&person[i].mail);
        if (strcmp(person[i].mail,mail)==0)//进行判断是否与输入的值相等如果相等则输出
        {
            printf ("\n\t姓名:%s\n",person[i].name);
            printf ("\n\t籍贯:%s\n",person[i].province);
            printf ("\n\t电话:%s\n",person[i].celephone);
            printf ("\n\t邮箱:%s\n",person[i].mail);
            printf("\t--------------------");
            x=1;
        }
        i++;
    }while(!feof(data));
    if(x==0)//如果联系人不存在则输出错误信息
    {
        puts("\n\n\t对不起您查询的联系人不存在!");
        puts("\n\t请检查您输入的内容是否正确!");
    }
    fclose(data);
    //判断是否要继续查找如果不返回主菜单
    printf ("\n\n\t是否继续查找(1是0否):");
    scanf ("%d",&n);
    if (n==1)
        search_info_bymail();
    else
    {
        menu();
    }
}


void edit_info()//修改信息模块
{
    system("cls");//调用DOS命令cls清空显示窗口信息
    system ("color 0A");//调用DOS环境的背景颜色和字体颜色第一位表示背景颜色第二位表示字体颜色
    FILE *data,*tmp;//tmp作为缓存文件
    data=fopen("data.txt","r");
    tmp=fopen("tmpf.txt","w");
    //判断文件是否存在
    if(data==NULL)
    {
        puts("\n\n\t********文件打开失败********");
        puts("\t*                          *");
        puts("\t*    请确认是否存在文件    *");
        puts("\t*                          *");
        puts("\t*   或者添加联系人后再试   *");
        puts("\t*                          *");
        puts("\t*    按任意键返回主菜单    *");
        puts("\t*                          *");
        puts("\t****************************\n\n");
        getch();
        menu();
    }
    int i=0,k=0,temp,check=1;
    char name[20];
    //输入姓名循环读取文件内容到数组中进行判断是否有与输入的值相同的
    printf("\n\n\t请输入要修改的联系人姓名:");
    scanf("%s",&name);
    do
    {
        fscanf(data,"%s%s%s%s",&person[i].name,&person[i].province,&person[i].celephone,&person[i].mail);
        if(strcmp(person[i].name,name)==0)//判断如果相同则执行修改数组中的内容
        {
            printf("\n\n\t姓名:%s\n\t籍贯:%s\n\t电话:%s\n\t邮箱:%s\n",person[i].name,person[i].province,person[i].celephone,person[i].mail);
            printf("\n\n\t是否确认修改请按(1是2否):");
            scanf("%d",&k);
            if(k==1)
            {
                system("cls");//调用DOS命令cls清空显示窗口信息
                puts("\n\n\t*********选择修改项*********");
                puts("\t*                          *");
                puts("\t*        1.修改姓名        *");
                puts("\t*        2.修改籍贯        *");
                puts("\t*        3.修改电话        *");
                puts("\t*        4.修改邮箱        *");
                puts("\t*        5.全部修改        *");
                puts("\t*                          *");
                puts("\t****************************\n\n");
                printf("\n\n\t请输入要修改的选项:");
                scanf("%d",&k);
                switch(k)
                {
                    case 1:
                        printf("\n\n\t请输入修改后的姓名:");
                        scanf("%s",&person[i].name);
                        check=0;
                        break;
                    case 2:
                        printf("\n\n\t请输入修改后的籍贯:");
                        scanf("%s",&person[i].province);
                        break;
                    case 3:
                        printf("\n\n\t请输入修改后的电话:");
                        scanf("%s",&person[i].celephone);
                        break;
                    case 4:
                        printf("\n\n\t请输入修改后的邮箱:");
                        scanf("%s",&person[i].mail);
                        break;
                    case 5:
                        printf("\n\n\t请输入修改后的姓名:");
                        scanf("%s",&person[i].name);
                        printf("\n\n\t请输入修改后的籍贯:");
                        scanf("%s",&person[i].province);
                        printf("\n\n\t请输入修改后的电话:");
                        scanf("%s",&person[i].celephone);
                        printf("\n\n\t请输入修改后的邮箱:");
                        scanf("%s",&person[i].mail);
                        break;
                    default:
                        printf("\n\n\t抱歉输入错误按任意键返回主界面!");
                        getch();
                        menu();
                        break;
                }
                check=0;
            }
        }
        i++;
    }while(!feof(data));
    //将数组中的信息存到新的文件中除了要删除的那一条信息
    for(k=0;k<(i-1);k++)
    {
        fprintf(tmp,"%s\t%s\t%s\t%s\n",person[k].name,person[k].province,person[k].celephone,person[k].mail);
    }
    fclose(data);
    fclose(tmp);
    //判断输出是否修改成功
    if(check==0)
    {
        system("cls");//调用DOS命令cls清空显示窗口信息
        puts("\n\n\t******************");
        puts("\t*                *");
        puts("\t*                *");
        puts("\t* 联系人修改成功 *");
        puts("\t*                *");
        puts("\t*                *");
        puts("\t******************\n\n");
    }else
    {
        puts("\n\n\t 您要修改的联系人不存在!");
        puts("\n\t请确认输入的内容是否正确!");
        puts("\n\t   按任意键返回主菜单!");
        getch();
        menu();
    }
    remove("data.txt");//移除原来的data文件
    rename("tmpf.txt","data.txt");//将tmpf缓存文件重命名为data
    //是否继续删除如果不则返回主菜单
    printf("\n\n\t是否继续修改联系人(1.是2.否):");
    scanf("%d",&temp);
    switch(temp)
    {
        case 1:edit_info();break;
        default:menu();break;
    }
}


void delete_info()//删除联系人模块
{
    system("cls");//调用DOS命令cls清空显示窗口信息
    system ("color 0A");//调用DOS环境的背景颜色和字体颜色第一位表示背景颜色第二位表示字体颜色
    FILE *data,*tmp;//tmp作为缓存文件
    data=fopen("data.txt","r");
    tmp=fopen("tmpf.txt","w");
    //判断文件是否存在
    if(data==NULL)
    {
        puts("\n\n\t********文件打开失败********");
        puts("\t*                          *");
        puts("\t*    请确认是否存在文件    *");
        puts("\t*                          *");
        puts("\t*   或者添加联系人后再试   *");
        puts("\t*                          *");
        puts("\t*    按任意键返回主菜单    *");
        puts("\t*                          *");
        puts("\t****************************\n\n");
        getch();
        menu();
    }
    int i=0,k,x,temp,return_value;
    char name[20];
    //输入姓名循环读取文件内容到数组中进行判断是否有与输入的值相同的
    printf("\n\n\t请输入要删除的联系人姓名:");
    scanf("%s",&name);
    do
    {
        fscanf(data,"%s%s%s%s",&person[i].name,&person[i].province,&person[i].celephone,&person[i].mail);
        i++;
    }while(!feof(data));
    //将数组中的信息存到新的文件中除了要删除的那一条信息
    for(x=0;x<(i-1);x++)
    {
        if(strcmp(person[x].name,name)==0)
        {
            printf("\n\n\t姓名:%s\n\t籍贯:%s\n\t电话:%s\n\t邮箱:%s\n",person[x].name,person[x].province,person[x].celephone,person[x].mail);
            printf("\n\n\t是否确认删除请按(1是2否):");
            scanf("%d",&k);
            if(k==1)
            {
                temp=x;
                continue;

            }else
            {
                puts("\n\t\t按任意键返回主菜单!");
                getch();
                menu();
            }
        }
    }
    for(k=0;k<(i-1);k++)
    {
        if(temp==k)
        {
            continue;
        }else
        {
            fprintf(tmp,"%s\t%s\t%s\t%s\n",person[k].name,person[k].province,person[k].celephone,person[k].mail);
        }

    }
    fclose(data);
    return_value=fclose(tmp);
    //判断缓存文件是否关闭成功
    if(return_value!=0)
    {
        puts("\n\n\t****************");
        puts("\t*              *");
        puts("\t*              *");
        puts("\t* 文件删除失败 *");
        puts("\t*              *");
        puts("\t*              *");
        puts("\t****************\n\n");
    }else
    {
        puts("\n\n\t****************");
        puts("\t*              *");
        puts("\t*              *");
        puts("\t* 文件删除成功 *");
        puts("\t*              *");
        puts("\t*              *");
        puts("\t****************\n\n");
    }
    remove("data.txt");//移除原来的data文件
    rename("tmpf.txt","data.txt");//将tmpf缓存文件重命名为data
    //是否继续删除如果不则返回主菜单
    printf("\n\n\t是否继续删除联系人(1.是2.否):");
    scanf("%d",&temp);
    switch(temp)
    {
        case 1:delete_info();break;
        default:menu();break;
    }
}
六.总结

由于时间仓促本人写的代码可能不是很完善所以仅供大家拿来参考。希望大家能够通过自己的努力真正地写出一份属于自己的代码。
2017-06-27 星期二 By:Yo.权!
如果需要转载请附上本文链接。请尊重原创,谢谢合作!

1 条回应
  1. zz2020-12-31 · 0:27

    请问在修改联系人和删除联系人的函数中,最后将数组用fwrite写入文件时为什么循环条件是x<(i-1)