zoukankan      html  css  js  c++  java
  • 实现一个简易的通讯录

    我们先可以简单的写出一个整体的大纲

    //首先是创建一个联系人的信息,用一个结构体表示出来
    typedef struct PersonInfo
    {
     //一个联系人的信息
     char name[1024];
     char sex[1024];
     char age[1024];
     char phone[1024];
     char addrss[1024];
     char company[1024];
    }PersonInfo;
     
    其次是在创建一个结构体,将每个联系人都存放在里面
    typedef struct Book
    {
     //可以容纳联系人的个数
     PersonInfo book[MAX_PERSONINFO];//这里MAX_PERSONINFO是指想要创建一个存放多少人的通讯录
     int size;//通讯录的有效区间
    }Book;
    Book g_person_book;
     
    在制作一个简易的菜单,实现显示功能
    int Menu()
    {
     printf("通讯录! ");
     printf("================================ ");
     printf("1.新增联系人 ");
     printf("2.查找联系人 ");
     printf("3.删除联系人 ");
     printf("4.修改联系人 ");
     printf("5.排序联系人 ");
     printf("6.查看全部联系人 ");
     printf("7.清空全部联系人 ");
     printf("0.退出 ");
     printf("================================ ");
     int choice = 0;
     printf("请输入您的选择:");
     scanf("%d",&choice);
     return choice;
    }
     
    接下来就完成具体的通讯录功能的实现
     
    //所有的函数在传入的参数为指针的时候都需要进行非空的判定
    void Init(Book* person_book)
    {
     assert(person_book != NULL);
    }
    void Add_PersonInfo(Book* person_book)
    {
     assert(Add_PersonInfo != NULL);
    }
    void Find_PersonInfo(Book* person_book)
    {
     assert(person_book != NULL);
    }
    void Del_PersonInfo(Book* person_book)
    {
     assert(person_book != NULL);
    }
    void Modify_PersonInfo(Book* person_book)
    {
     assert(person_book != NULL); 
    }
    void Sort_PersonInfo(Book* person_book)
    {
     assert(person_book != NULL);
    }
    void PrintAll_PersonInfo(Book* person_book)
    {
     assert(person_book != NULL);
    }
    void ClearAll_PersonInfo(Book* person_book)
    {
     assert(person_book != NULL);
    }
     
    在就是main函数的实现
    在这里要注意一点就是,在通讯录的功能选择上,如果选择用 if 来实现,那么就会嵌套太多的 if,else,这里使用的是转移表的方式来实现
     
    int main()
    {
     //这里使用转移表的形式实现选项功能
     typedef void(*function)(Book*);
     function function_book[] = {
      Add_PersonInfo,
      Find_PersonInfo,
      Del_PersonInfo,
      Modify_PersonInfo,
      Sort_PersonInfo,
      PrintAll_PersonInfo,
      ClearAll_PersonInfo,
     };
     //初始化结构体
     Init(&g_person_book);
     
     while (1)
     {
      int choice = Menu();
      if (choice == 0)
      {
       printf("Goodbye! ");
       break;
      }
      if (choice < 0 || choice>7)
      {
       printf("您的输入不合法!请重新输入!");
       continue;
      }
      function_book[choice-1](&g_person_book);
     }
     return 0;
    }
     
    下面是完整的代码:
      1 #define _CRT_SECURE_NO_WARNINGS
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include<assert.h>
      5 #include<string.h>
      6 #define MAX_PERSONINFO 200
      7 
      8 typedef struct PersonInfo
      9 {
     10     //每个联系人的信息
     11     char name[1024];
     12     char sex[1024];
     13     char age[1024];
     14     char phone[1024];
     15     char addrss[1024];
     16     char company[1024];
     17 }PersonInfo;
     18 
     19 typedef struct Book
     20 {
     21     //可以容纳联系人的个数
     22     PersonInfo book[MAX_PERSONINFO];
     23     int size;//通讯录的有效区间
     24 }Book;
     25 
     26 Book g_person_book;
     27 
     28 int Menu()
     29 {
     30     printf("通讯录!
    ");
     31     printf("================================
    ");
     32     printf("1.新增联系人
    ");
     33     printf("2.查找联系人
    ");
     34     printf("3.删除联系人
    ");
     35     printf("4.修改联系人
    ");
     36     printf("5.排序联系人
    ");
     37     printf("6.查看全部联系人
    ");
     38     printf("7.清空全部联系人
    ");
     39     printf("0.退出
    ");
     40     printf("================================
    ");
     41     int choice = 0;
     42     printf("请输入您的选择:");
     43     scanf("%d", &choice);
     44     return choice;
     45 }
     46 
     47 void Init(Book* person_book)
     48 {
     49     assert(person_book != NULL);
     50     memset(person_book, 0, sizeof(Book));
     51 }
     52 
     53 void Add_PersonInfo(Book* person_book)
     54 {
     55     assert(Add_PersonInfo != NULL);
     56 
     57     //查看是否达到最大储存量
     58     if (person_book->size >= MAX_PERSONINFO)
     59     {
     60         printf("添加失败!联系人已满!");
     61         return;
     62     }
     63     printf("新增联系人:
    ");
     64     printf("请输入联系人姓名:");
     65     //***********************scanf("%s", &((person_book->book[person_book->size]).name));
     66     PersonInfo* p = &person_book->book[person_book->size];
     67     scanf("%s", &p->name);
     68     printf("请输入联系人性别:");
     69     scanf("%s", &p->sex);
     70     printf("请输入联系人年龄:");
     71     scanf("%s", &p->age);
     72     printf("请输入联系人电话:");
     73     scanf("%s", &p->phone);
     74     printf("请输入联系人地址:");
     75     scanf("%s", &p->addrss);
     76     printf("请输入联系人公司:");
     77     scanf("%s", &p->company);
     78 
     79     printf("添加成功!
    ");
     80     ++person_book->size;
     81 }
     82 
     83 void Find_PersonInfo(Book* person_book)
     84 {
     85     assert(person_book != NULL);
     86     printf("请输入您要查找的姓名:");
     87     char find_name[1024] = { 0 };
     88     scanf("%s", &find_name);
     89     for (int i = 0; i < person_book->size; ++i)
     90     {
     91         PersonInfo* p = &person_book->book[i];
     92         if (strcmp(find_name, person_book->book[i].name) == 0)
     93         {
     94             printf("查找成功!
    ");
     95             printf("[%d]    %s	%s	%s	%s	%s	%s
    ",
     96                 i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
     97         }
     98         else
     99         {
    100             printf("查找失败!n");
    101         }
    102     }
    103 }
    104 
    105 void Del_PersonInfo(Book* person_book)
    106 {
    107     assert(person_book != NULL);
    108     printf("删除联系人!
    ");
    109 
    110     for (int i = 0; i < person_book->size; ++i)
    111     {
    112         PersonInfo* p = &person_book->book[i];
    113         printf("[%d]    %s	%s	%s	%s	%s	%s
    ",
    114             i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
    115     }
    116     printf("请输入您要删除的序号:");
    117     int num = 0;
    118     scanf("%d", &num);
    119     if (num < person_book->size || num >= person_book->size)
    120     {
    121         printf("您的输入不合理,删除失败!
    ");
    122         return;
    123     }
    124     printf("您确定要删除联系人:
    ");
    125     PersonInfo* p = &person_book->book[num];
    126     printf("[%d]    %s	%s	%s	%s	%s	%s
    ",
    127         num, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
    128     printf("输入Y确定删除!
    ");
    129     char yes[1024] = { 0 };
    130     scanf("%s", &yes);
    131     if (strcmp(yes, "Y") != 0)
    132     {
    133         printf("删除失败!
    ");
    134         return;
    135     }
    136     //执行删除操作
    137     //1.用最后一个元素覆盖要删除的元素
    138     PersonInfo* p1 = &person_book->book[person_book->size];
    139     PersonInfo* p2 = &person_book->book[num];
    140     *p1 = *p2;
    141 
    142     //2.在 size ++ 改变有效区间
    143     --person_book->size;
    144     printf("删除成功!
    ");
    145 
    146 }
    147 
    148 void Modify_PersonInfo(Book* person_book)
    149 {
    150     assert(person_book != NULL);
    151 
    152     //按姓名修改
    153     printf("请输入您要修改的联系人的姓名:
    ");
    154     char name[1024] = { 0 };
    155     scanf("%s", &name);
    156     int i = 0;
    157     for (; i < person_book->size; ++i)
    158     {
    159         if (strcmp(name, person_book->book[i].name) == 0)
    160         {
    161             break;
    162         }
    163     }
    164     if (strcmp(name, person_book->book[i].name) != 0)
    165     {
    166         printf("修改失败!没有相应的联系人!
    ");
    167         return;
    168     }
    169 
    170     printf("您要修改的联系人是否为:
    ");
    171     PersonInfo* p = &person_book->book[i];
    172     printf("[%d]    %s	%s	%s	%s	%s	%s
    ",
    173         i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
    174     printf("输入Y确定:");
    175     char str[1024] = { 0 };
    176     scanf("%s", &str);
    177     if (strcmp(str, "Y") != 0)
    178     {
    179         printf("修改失败!
    ");
    180     }
    181 
    182     //开始修改
    183     printf("请输入联系人名字:");
    184     scanf("%s", &p->name);
    185     printf("请输入联系人性别:");
    186     scanf("%s", &p->sex);
    187     printf("请输入联系人年龄:");
    188     scanf("%s", &p->age);
    189     printf("请输入联系人电话:");
    190     scanf("%s", &p->phone);
    191     printf("请输入联系人地址:");
    192     scanf("%s", &p->addrss);
    193     printf("请输入联系人公司:");
    194     scanf("%s", &p->company);
    195 
    196     printf("修改成功!
    ");
    197 
    198 }
    199 
    200 void Sort_PersonInfo(Book* person_book)
    201 {
    202     assert(person_book != NULL);
    203 
    204     //按姓名排序,应用冒泡排序的方式写
    205     PersonInfo temp = { 0 };
    206     int num = 0;//[0,num]表示未排序区间,[num,size]表示已经排序的区间
    207     int i = (person_book->size) - 1;
    208     for (; num < person_book->size; ++num)
    209     {
    210         for (; i > num; --i)
    211         {
    212             //升序排序
    213             if (strcmp((person_book->book[i].name), (person_book->book[i - 1].name)) < 0)
    214             {
    215                 //person_book->book[i + 1].name = person_book->book[i].name;
    216                 temp = person_book->book[i - 1];
    217                 person_book->book[i - 1] = person_book->book[i];
    218                 person_book->book[i] = temp;
    219             }
    220         }
    221     }
    222 
    223     //打印出联系人
    224     for (; i < person_book->size; ++i)
    225     {
    226         PersonInfo* p = &person_book->book[i];
    227         printf("[%d]    %s	%s	%s	%s	%s	%s
    ",
    228             i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
    229     }
    230 
    231 }
    232 
    233 void PrintAll_PersonInfo(Book* person_book)
    234 {
    235     assert(person_book != NULL);
    236     printf("打印成功!共打印%d条信息!
    ", person_book->size);
    237     for (int i = 0; i < person_book->size; ++i)
    238     {
    239         PersonInfo* p = &person_book->book[i];
    240         printf("[%d]    %s	%s	%s	%s	%s	%s
    ",
    241             i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
    242     }
    243 }
    244 
    245 void ClearAll_PersonInfo(Book* person_book)
    246 {
    247     assert(person_book != NULL);
    248 
    249     //可以直接将有效区间size设置为0
    250     printf("是否确定要删除所有联系人!
    ");
    251     printf("输入Y表示确定:");
    252     char str[1024] = { 0 };
    253     scanf("%s", &str);
    254 
    255     if (strcmp(str, "Y") != 0)
    256     {
    257         printf("删除失败!
    ");
    258     }
    259 
    260     person_book->size = 0;
    261 }
    262 
    263 int main()
    264 {
    265     //这里使用转移表的形式实现选项功能
    266     typedef void(*function)(Book*);
    267     function function_book[] = {
    268         Add_PersonInfo,
    269         Find_PersonInfo,
    270         Del_PersonInfo,
    271         Modify_PersonInfo,
    272         Sort_PersonInfo,
    273         PrintAll_PersonInfo,
    274         ClearAll_PersonInfo,
    275     };
    276 
    277     //初始化结构体
    278     Init(&g_person_book);
    279 
    280     while (1)
    281     {
    282         int choice = Menu();
    283         if (choice == 0)
    284         {
    285             printf("Goodbye!
    ");
    286             break;
    287         }
    288         if (choice < 0 || choice>7)
    289         {
    290             printf("您的输入不合法!请重新输入!");
    291             continue;
    292         }
    293         function_book[choice - 1](&g_person_book);
    294 
    295     }
    296     return 0;
    297 }
     
  • 相关阅读:
    【MySQL】(三)文件
    【MySQL】(二)InnoDB存储引擎
    Linux Shell脚本编程-信号捕获
    Linux Shell脚本编程-数组和字符串处理
    Linux Shell脚本编程-函数
    Linux Shell脚本编程-语句控制
    Linux Shell脚本编程-基础2
    Linux Shell脚本编程-基础1
    Awk
    Sed
  • 原文地址:https://www.cnblogs.com/cuckoo-/p/10533732.html
Copyright © 2011-2022 走看看