【C语言】通讯录—静态版

简介: 【C语言】通讯录—静态版

前言:


                       刚学完结构体和枚举,在网上找了个通讯录的项目,用来练手


                       目标:该通讯录可存储千人个人信息


                       包括:姓名,年龄,性别,电话,地址


                       实现功能:


                               1.添加联系人

                               2.删除联系人

                               3.查找联系人

                               4.修改联系人

                               5.打印通讯录

                               6.按姓名排序

                               0.退出通讯录


                      注:当前版本只是最初阶段,后续会持续更新



c157bb3748634831811f565ea4147fd4.png


模块化(为了养成较好的编程习惯)

              将调试内容放入test.c中

               功能实现放入Contact.c中

               定义内容,头文件的引用放入到Contact.h中


准备工作:


 1.创建联系人结构体            

typedef struct People//存储相关信息
{
  char name[NAME_MAX];
  int age;
  char sex[SEX_MAX];
  char telephone[TELEPHONE_MAX];
  char address[ADDRESS_MAX];
}People;
typedef struct Contact 
{
  People data[MAX];//存储自定义个数联系人的信息
  int sz;//相当于一个计数器
}Contact;

定义全局变量

//define定义常量以便后续进行修改时,过于繁琐,直接修改define内容即可
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELEPHONE_MAX 12
#define ADDRESS_MAX 30


定义枚举类型

       注:将switch,case后面的数字,替换成枚举类型,方便程序员修改,同时枚举类型,变量默认从上到下,从0开始依次递增

enum Option
{
  EXIT,
  ADD,
  DEL,
  SEARCH,
  MODIFY,
  PRINT,
  SORT
};


调试代码

思想:   利用do-while()循环功能,input接收选择的数字,switch包含想要实现代码函数,case后面的数字替换成,枚举类型,以便后续修改时,程序员能更好的修改程序

void test()
{
  int input = 0;
  Contact con;
  Init_Contact(&con);//初始化通讯录,因为contact里面的变量未初始化,当前为随机值
  do 
  {
    menu();
    printf("请输入功能:>");
    scanf("%d", &input);
    switch (input)
    {
    case EXIT:
      printf("退出通讯录\n");
      return;
     case ADD:
       AddContact(&con);
       break;
     case DEL:
       DelContact(&con);
       break;
     case SEARCH:
       SearContact(&con);
       break;
     case MODIFY:
       ModContact(&con);
       break;
     case PRINT:
       PrintContact(&con);
       break;
     case SORT:
       SortContact(&con);
       break;
     default:
       printf("输入错误,暂无该选项\n");
       break;
    }
  } while (input);
}


一、通讯录菜单

演示效果:

7fad0ef4840442919af6056f31153f38.png

相关代码:

void menu()
{
  printf("**************************\n");
  printf("**** 欢迎!进入通讯录 ****\n");
  printf("*******1.添加联系人*******\n");
  printf("*******2.删除联系人*******\n");
  printf("*******3.查找联系人*******\n");
  printf("*******4.修改联系人*******\n");
  printf("*******5.打印通讯录*******\n");
  printf("*******6.按姓名排序*******\n");
  printf("*******0.退出通讯录*******\n");
  printf("**************************\n");
}


功能实现

       1.添加联系人

           演示效果



c9978c617f604abf9db818dd6e562c08.png


相关代码 :    

该步骤用到函数assert,确保PC不为空指针,确保参数有效


f87bcf0ecc4b4ed3b24497b271949756.png


void AddContact(Contact* pc)
{
  assert(pc);//断言,确保pc不为空指针
  if (pc->sz == MAX)
  {
    printf("通讯录已满无法存储,请即时更新后台程序");
    return;
  }
  printf("请输入姓名:>");
  scanf("%s",(pc->data[pc->sz].name));
  printf("请输入年龄:>");
  scanf("%d",&(pc->data[pc->sz].age));
  printf("请输入性别:>");
  scanf("%s",(pc->data[pc->sz].sex));
  printf("请输入电话:>");
  scanf("%s",(pc->data[pc->sz].telephone));
  printf("请输入地址:>");
  scanf("%s",(pc->data[pc->sz].address));
  pc->sz++;
  printf("添加成功\n");
}


 2.删除联系人

           演示效果


98fe73b60ac5438fb31342c49aa41f4c.png

相关代码:

       代码思想:通过下标找到该联系人,直接将后面的存储信息,向前挪动一位

void DelContact(Contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空,无法删除\n");
    return;
  }
  printf("请输入想要删除的联系人:>");
  char name[NAME_MAX] = {0};
  scanf("%s",name);
  int pos = FindName(pc,name);
  if (pos == -1)
  {
    printf("未查询到该联系人\n");
    return;
  }
  int j = 0;
  for (j=pos; j<pc->sz-1; j++)
  {
    pc->data[j] = pc->data[j + 1];
  }
  pc->sz--;
  printf("删除成功");
}


3.查找联系人

       演示效果:


7dc95e01341346328e6642132838fe68.png


  注:实现该功能,我们需要确定,查找联系人的下标从而找到该联系人

int FindName(Contact* pc,char name[])
{
  assert(pc);
  int i = 0;
  for (i=0; i<pc->sz; i++)
  {
    if (strcmp(name,pc->data[i].name) == 0)
    {   
      return i;//利用strcmp函数,判断输入变量值是否与数组内容相匹配
                     //匹配返回当前变量下标
    }
  }
  if (strcmp(name, pc->data[i].name) != 0)
  {
    return -1;
  }
}


      相关代码:

void SearContact(Contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
  printf("请输入想要查找的联系人:>");
  char name[NAME_MAX] = { 0 };
  scanf("%s", name);
  int pos = FindName(pc, name);
  if (pos == -1)
  {
    printf("未查询到该联系人\n");
    return;
  }
  printf("%-20s %-3s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址\n");
  printf("%-20s %-3d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].telephone, pc->data[pos].address);
}



4.修改联系人

         演示效果:

               

9f0641ea9f4746b4a904f45b2fb09bd5.png


相关代码:

       代码思想:找到该联系人下标,数组中找到下标,在其基础上直接进行修改

void ModContact(Contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
  printf("请输入想要修改的联系人:>");
  char name[NAME_MAX] = { 0 };
  scanf("%s", name);
  int pos = FindName(pc, name);
  if (pos == -1)
  {
    printf("未查询到该联系人\n");
    return;
  }
  printf("请输入修改姓名:>");
  scanf("%s", (pc->data[pos].name));
  printf("请输入修改年龄:>");
  scanf("%d", &(pc->data[pos].age));
  printf("请输入修改性别:>");
  scanf("%s", (pc->data[pos].sex));
  printf("请输入修改电话:>");
  scanf("%s", (pc->data[pos].telephone));
  printf("请输入修改地址:>");
  scanf("%s", (pc->data[pos].address));
  printf("修改成功\n");
}


5.打印通讯录

       演示效果:

               


f38d9214dced4699ab1eee8f2b2294e2.png


相关代码:

       代码思想:确定数组大小,定义一个变量,使其小于数组的大小,进行循环打印

void PrintContact(Contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
  printf("%-20s %-3s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址\n");
  int i = 0;
  for(i=0; i<pc->sz; i++)
  {
    printf("%-20s %-3d %-5s %-12s %-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].telephone,pc->data[i].address);
  }
}


6.按姓名排序

       演示效果:


2d6af1c2d0c74f6bb4234c785439f62e.png

      相关代码:

void SortContact(Contact* pc)
{
  //按照姓名排序
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
  int i = 0;
  int j = 0;
  for (i = 0; i < pc->sz - 1; i++)
  {
    for (j = 0; j < pc->sz - i - 1; j++)
    {
      if (strcmp(pc->data[j].name, (pc->data[j + 1]).name) > 0)
      {
        People tmp;
        tmp = pc->data[j];
        pc->data[j] = pc->data[j + 1];
        pc->data[j + 1] = tmp;
      }
    }
  }
  printf("排序成功!\n");
}


完整代码:

       Contact.h

#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<assert.h>
//define定义常量以便后续进行修改时,过于繁琐,直接修改define内容即可
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 10
#define TELEPHONE_MAX 12
#define ADDRESS_MAX 30
typedef struct People
{
  char name[NAME_MAX];
  int age;
  char sex[SEX_MAX];
  char telephone[TELEPHONE_MAX];
  char address[ADDRESS_MAX];
}People;
typedef struct Contact 
{
  People data[MAX];//存储联系人的信息
  int sz;//相当于一个计数器
}Contact;
enum Option
{
  EXIT,
  ADD,
  DEL,
  SEARCH,
  MODIFY,
  PRINT,
  SORT
};
//初始化通讯录
void Init_Contact(Contact* pc);
//增加联系人
void AddContact(Contact* pc);
//删除联系人
void DelContact(Contact* pc);
//修改联系人
void ModContact(Contact* pc);
//查找联系人
void SearContact(Contact* pc);
//排序通讯录
void SortContact(Contact* pc);
//打印通讯录
void PrintContact(Contact* pc);


Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void Init_Contact(Contact* pc)
{
  pc->sz = 0;
  memset(pc->data,0,sizeof(pc->data));
}
void AddContact(Contact* pc)
{
  assert(pc);//断言,确保pc不为空指针
  if (pc->sz == MAX)
  {
    printf("通讯录已满无法存储,请即时更新后台程序");
    return;
  }
  printf("请输入姓名:>");
  scanf("%s",(pc->data[pc->sz].name));
  printf("请输入年龄:>");
  scanf("%d",&(pc->data[pc->sz].age));
  printf("请输入性别:>");
  scanf("%s",(pc->data[pc->sz].sex));
  printf("请输入电话:>");
  scanf("%s",(pc->data[pc->sz].telephone));
  printf("请输入地址:>");
  scanf("%s",(pc->data[pc->sz].address));
  pc->sz++;
  printf("添加成功\n");
}
void PrintContact(Contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
  printf("%-20s %-3s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址\n");
  int i = 0;
  for(i=0; i<pc->sz; i++)
  {
    printf("%-20s %-3d %-5s %-12s %-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].telephone,pc->data[i].address);
  }
}
//查找指定联系人的下标
int FindName(Contact* pc,char name[])
{
  assert(pc);
  int i = 0;
  for (i=0; i<pc->sz; i++)
  {
    if (strcmp(name,pc->data[i].name) == 0)
    {   
      return i;
    }
  }
  if (strcmp(name, pc->data[i].name) != 0)
  {
    return -1;
  }
}
void DelContact(Contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空,无法删除\n");
    return;
  }
  printf("请输入想要删除的联系人:>");
  char name[NAME_MAX] = {0};
  scanf("%s",name);
  int pos = FindName(pc,name);
  if (pos == -1)
  {
    printf("未查询到该联系人\n");
    return;
  }
  int j = 0;
  for (j=pos; j<pc->sz-1; j++)
  {
    pc->data[j] = pc->data[j + 1];
  }
  pc->sz--;
  printf("删除成功");
}
void SearContact(Contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
  printf("请输入想要查找的联系人:>");
  char name[NAME_MAX] = { 0 };
  scanf("%s", name);
  int pos = FindName(pc, name);
  if (pos == -1)
  {
    printf("未查询到该联系人\n");
    return;
  }
  printf("%-20s %-3s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址\n");
  printf("%-20s %-3d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].telephone, pc->data[pos].address);
}
void ModContact(Contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
  printf("请输入想要修改的联系人:>");
  char name[NAME_MAX] = { 0 };
  scanf("%s", name);
  int pos = FindName(pc, name);
  if (pos == -1)
  {
    printf("未查询到该联系人\n");
    return;
  }
  printf("请输入修改姓名:>");
  scanf("%s", (pc->data[pos].name));
  printf("请输入修改年龄:>");
  scanf("%d", &(pc->data[pos].age));
  printf("请输入修改性别:>");
  scanf("%s", (pc->data[pos].sex));
  printf("请输入修改电话:>");
  scanf("%s", (pc->data[pos].telephone));
  printf("请输入修改地址:>");
  scanf("%s", (pc->data[pos].address));
  printf("修改成功\n");
}
void SortContact(Contact* pc)
{
  //按照姓名排序
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
  int i = 0;
  int j = 0;
  for (i = 0; i < pc->sz - 1; i++)
  {
    for (j = 0; j < pc->sz - i - 1; j++)
    {
      if (strcmp(pc->data[j].name, (pc->data[j + 1]).name) > 0)
      {
        People tmp;
        tmp = pc->data[j];
        pc->data[j] = pc->data[j + 1];
        pc->data[j + 1] = tmp;
      }
    }
  }
  printf("排序成功!\n");
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void menu()
{
  printf("**************************\n");
  printf("**** 欢迎!进入通讯录 ****\n");
  printf("*******1.添加联系人*******\n");
  printf("*******2.删除联系人*******\n");
  printf("*******3.查找联系人*******\n");
  printf("*******4.修改联系人*******\n");
  printf("*******5.打印通讯录*******\n");
  printf("*******6.按姓名排序*******\n");
  printf("*******0.退出通讯录*******\n");
  printf("**************************\n");
}
void test()
{
  int input = 0;
  Contact con;
  Init_Contact(&con);//初始化通讯录,因为contact里面的变量未初始化,当前为随机值
  do 
  {
    menu();
    printf("请输入功能:>");
    scanf("%d", &input);
    switch (input)
    {
    case EXIT:
      printf("退出通讯录\n");
      return;
     case ADD:
       AddContact(&con);
       break;
     case DEL:
       DelContact(&con);
       break;
     case SEARCH:
       SearContact(&con);
       break;
     case MODIFY:
       ModContact(&con);
       break;
     case PRINT:
       PrintContact(&con);
       break;
     case SORT:
       SortContact(&con);
       break;
     default:
       printf("输入错误,暂无该选项\n");
       break;
    }
  } while (input);
}
int main()
{
  test();
  return 0;
}


目录
相关文章
|
4月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
60 2
|
9月前
|
C语言
C语言——通讯录系统—基于 VS2022
C语言——通讯录系统—基于 VS2022
|
4月前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统
|
6月前
|
存储 搜索推荐 算法
【C语言】C语言—通讯录管理系统(源码)【独一无二】
【C语言】C语言—通讯录管理系统(源码)【独一无二】
121 2
|
6月前
|
存储 数据可视化 C语言
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
108 1
|
8月前
|
机器学习/深度学习 搜索推荐 程序员
C语言实现个人通讯录(功能优化)-2
C语言实现个人通讯录(功能优化)
|
8月前
|
存储 C语言 索引
C语言实现个人通讯录(功能优化)-1
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-1
|
8月前
|
C语言
C语言学习记录——通讯录(静态内存)
C语言学习记录——通讯录(静态内存)
45 2
|
9月前
|
存储 C语言
C语言实现通讯录
C语言实现通讯录
50 2
|
9月前
|
存储 C语言
C语言实验-动态顺序表实现简易通讯录(二)
在这个C语言实验中,你将实现一个简单的通讯录,它使用动态顺序表来存储联系人信息。
75 2