c语言小项目(静态通讯录)

简介: 1. 前言虽然自己当前不咋滴,但把这句话送给自己和你们!成功=一个习惯(做好开头做好结尾)+三个能力(学会反省+学会独立+总结收获)+伟大理想

1. 前言

虽然自己当前不咋滴,但把这句话送给自己和你们!

成功=一个习惯(做好开头做好结尾)+三个能力(学会反省+学会独立+总结收获)+伟大理想

2. 框架

deb523cd2d9e0a588ca04e215b239131.png

这里采用多文件实现,文件包括:main.c(整体逻辑)、Adress_list.c(功能实现)、Adress_list.h(包含函数声明以及类型声明)、HiddenFunction.c(函数中的嵌套函数功能),下面来看看各功能的实现操作。

3. 具体实现

3.1 初始化通讯录

初始化通讯录就是对整体通讯录实现初始化以及对通讯录中每个人的信息进行初始化。

3.2 打印菜单

让用户知道怎么完成操作

3.3 添加联系人信息

将相应的内容添加到通讯录中,在此过程中,通讯录的大小也随之增大。

3.4 展示通讯录

就是相应的展示出你的通讯录的每个人的信息情况

3.5 删除通讯录

具体实现是通过遍历找到你想要删除的练习人的姓名来进行删除,删除的实现是让后面的依次对前面一个联系人进行覆盖

3.6 查找联系人

通过名字比较遍历来找到联系人是否存在,存在就显示个人信息,不存在就说明

3.7 修改联系人信息

通过比较名字来遍历找到该联系人,对其信息进行覆盖

3.8 按照年龄进行排序

这里使用库函数qsort来对年龄进行排序

3.9 删除所有联系人信息

我的具体实现是通过创建另外一个个人信息的数组,把通讯录中所有人的信息放进这个数组进行存储。(缺点:空间占用太多)

另外的方法:是把第二个联系人及之后的联系人的信息先对其覆盖,全部覆盖到第一个联系人的内容上,覆盖完后再把第一个联系人的信息放进一个创建了一个大小的个人信息数组中(优化了空间),(当然还有更多的方法,这里我只想出来这两个比较简单的方法)

介绍完毕!

4. 代码展示

4.1 main.c文件

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Adress_list.h"
//主逻辑
int main()
{
  //创建通讯录
  struct Adress_List List;
  //初始化通讯录
  Init_Adress_List(&List);//传地址节省了空间同时也对其原变量进行修改
  int input = 0;
  //选择并操作
  //增加联系人信息,删除联系人信息,查找联系人信息,修改联系人信息,对通讯录进行按年龄排序,展示通讯录
  do
  {
    menu();
    printf("请输出操作前的提示数字,可完成此操作:>");
    scanf("%d",&input);
    switch (input)
    {
    case 1:
      //添加联系人信息
      Add_Linkman(&List);
      system("cls");
      break;
    case 2:
      //删除联系人信息
      Delete_Linkman(&List);
      system("cls");
      break;
    case 3:
      //查找联系人
      Find_Linkman(&List);
      system("cls");
      break;
    case 4:
      //修改联系人信息
      Modify_Linkman_Information(&List);
      system("cls");
      break;
    case 5:
      //按照年龄进行排序
      SortList_By_age(&List);
      system("cls");
      break;
    case 6:
      //展示通讯录
        Show_Adress_List(&List);
      system("cls");
      break;
    case 7:
      //删除所有联系人信息
      Delete_AllLinkman(&List);
      system("cls");
      break;
    case 0:
      printf("------------------退出程序!------------------\n");
      break;
    default:
      printf("------------------输入错误!------------------\n");
      break;
    }
  } while (input);
  system("pause");
  return 0;
}

4.2 Adress_list.h文件

#pragma once
//包含头文件、函数声明、变量定义
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
#define MAX 100
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_PONE 15
#define MAX_ADRESS 20
//个人信息
struct Person_Information
{
  //名字、性别、电话、年龄、家庭住址
  //名字一般都是最长的就是5个字
  char name[MAX_NAME];
  //男,女,保密
  char sex[MAX_SEX];
  //电话号码有11位
  char phone[MAX_PONE];
  int age;
  char adress[MAX_ADRESS];
};
//通讯录
struct Adress_List
{
  //包含个人信息
  struct Person_Information data[MAX];
  //记录通讯录大小
  int size;
};
//初始化通讯录
void Init_Adress_List(struct Adress_List* List);
//打印菜单
void menu();
//添加联系人信息
void Add_Linkman(struct Adress_List* List);
//展示通讯录
void Show_Adress_List(const struct Adress_List* List);
//删除联系人信息
void Delete_Linkman(struct Adress_List* List);
//通过名字找到联系人存储的位置
int Find_By_Name(const struct Adress_List* List, char name[]);
//展示个人信息
void Show_Person_Information(struct Adress_List* List, int ret);
//查找联系人
void Find_Linkman(struct Adress_List* List);
//修改联系人信息
void Modify_Linkman_Information(struct Adress_List* List);
//按照年龄对通讯录进行排序
void SortList_By_age(const struct Adress_List* List);
//qsort库函数中比较函数
int compare(const void* e1, const void* e2);
//删除所有联系人信息
void Delete_AllLinkman(struct Adress_List* List);

4.3 Adress_list.c文件

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Adress_list.h"
//封装通讯录函数
//初始化通讯录
void Init_Adress_List(struct Adress_List* List)
{
  assert(List);
  //对所有人的信息初始化
  memset(List->data, 0, MAX * sizeof(struct Person_Information));
  //对通讯录大小初始化
  List->size = 0;
}
//打印菜单
void menu()
{
  printf("\n");
  printf("************************************************\n");
  printf("*****    1.AddLinkman    2.DeleteLinkman  ******\n");
  printf("*****    3.FindLinkman   4.ModifyLinkman  ******\n");
  printf("*****    5.SortByAge     6.ShowList       ******\n");
  printf("*****    7.DeleteAll     0.exit           ******\n");
  printf("************************************************\n");
  printf("\n");
}
//添加联系人信息
void Add_Linkman(struct Adress_List* List)
{
  assert(List);
  //一直添加的话这个顺序存储的通讯录会满
  if (List->size == MAX)
  {
    printf("通讯录已满,无法继续添加\n");
    return;
  }
  //直接添加
  //名字、性别、电话、年龄、家庭住址
  printf("请输入名字:>");
  scanf("%s", List->data[List->size].name);
  printf("请输入性别:>");
  scanf("%s", List->data[List->size].sex);
  printf("请输入电话:>");
  scanf("%s", List->data[List->size].phone);
  printf("请输入年龄:>");
  scanf("%d", &List->data[List->size].age);
  printf("请输入家庭住址:>");
  scanf("%s", List->data[List->size].adress);
  List->size++;
  printf("添加联系人成功!\n");
  Sleep(800);
}
//展示通讯录
void Show_Adress_List(const struct Adress_List* List)
{
  printf("\n");
  printf("-------------------------------------------------------------------------------\n");
  printf("暂时的通讯录的所有信息:>\n");
  printf("%-5s\t%-5s\t%-15s\t%-20s\t%-20s\n", "姓名", "性别", "电话", "年龄", "家庭住址");
  int i = 0;
  for (i = 0; i < List->size; i++)
  {
    printf("%-5s\t%-5s\t%-15s\t%-20d\t%-20s\n",
      List->data[i].name,
      List->data[i].sex, 
      List->data[i].phone,
      List->data[i].age,
      List->data[i].adress);
  }
  printf("-------------------------------------------------------------------------------\n");
  printf("\n");
  printf("请等上5秒,再次操作!\n");
  Sleep(5000);
}
//删除联系人
void Delete_Linkman(struct Adress_List* List)
{
  char name[MAX_NAME];
  printf("请输入你想删除的联系人的姓名:>");
  scanf("%s", name);
  //删除操作,若找到删除的联系人返回下标进行删除,没有找到进行标注
  int ret = Find_By_Name(List,name);
  if (-1 == ret)
  {
    printf("该联系人不存在!\n");
    Sleep(800);
  }
  else
  {
    //进行删除操作(这里是使用覆盖的的方式)
    int i = 0;
    for (i = ret; i < List->size; i++)
    {
      List->data[i] = List->data[i + 1];
    }
    //通讯录大小改变
    List->size--;
    printf("成功删除该联系人!\n");
    Sleep(800);
  }
}
//查找联系人
void Find_Linkman(struct Adress_List* List)
{
  printf("请输入你想查找的联系人的姓名:>");
  char name[MAX_NAME];
  scanf("%s", name);
  int ret = Find_By_Name(List, name);
  if (ret == -1)
  {
    printf("此联系人不存在!\n");
    Sleep(800);
  }
  else
  {
    printf("\n");
    printf("你的通讯录里面有此联系人,它的信息是:>\n");
    Show_Person_Information(List,ret);
    Sleep(800);
  }
}
//修改联系人信息
void Modify_Linkman_Information(struct Adress_List* List)
{
  //找到联系人,如果有此联系人就对其进行修改
  printf("请输入你想修改信息的联系人的姓名:>");
  char name[MAX_NAME];
  scanf("%s", name);
  int ret = Find_By_Name(List, name);
  if (-1 == ret)
  {
    printf("此联系人不存在!\n");
    Sleep(800);
  }
  else
  {
    //拿到下标
    printf("请输入名字:>");
    scanf("%s", List->data[ret].name);
    printf("请输入性别:>");
    scanf("%s", List->data[ret].sex);
    printf("请输入电话:>");
    scanf("%s", List->data[ret].phone);
    printf("请输入年龄:>");
    scanf("%d", &List->data[ret].age);
    printf("请输入家庭住址:>");
    scanf("%s", List->data[ret].adress);
    printf("修改成功!\n");
    printf("\n");
    Sleep(800);
  }
}
//按照年龄进行排序
void SortList_By_age(const struct Adress_List* List)
{
  assert(List);
  //通讯录里面没有信息或者只有一个信息排序也是没必要的
  if (List->size <= 1)
  {
    printf("\n");
    printf("通讯录里面联系人个数小于两个没有必要对其进行排序!\n");
    Sleep(800);
    return;
  }
  //排序用到qsort库函数
  qsort(List->data, List->size, sizeof(struct Person_Information), compare);
  printf("排序完成!\n");
  Sleep(800);
}
//删除通讯录所有联系人信息
void Delete_AllLinkman(struct Adress_List* List)
{
  //拿到的一个通讯录里面没有信息就标注
  if (List->size == 0)
  {
    printf("通讯录为空,无法操作!\n");
    Sleep(800);
  }
  else
  { 
    //动态的内存用free释放空间(这里没有用到动态存储)
    //删除的方法:用一个临时的空间去保存
    struct Person_Information Delete[MAX];
    int i = 0;
    //删除一次通讯录空间变小一次
    //Lisr->size会改变,所有把初值保存下来
    int k = List->size;
    for (i = 0; i < k; i++)
    {
      Delete[i] = List->data[i];
      List->size--;
    }
    printf("删除成功!\n");
    Sleep(800);
  }
}

4.4 HiddenFunction.c文件

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Adress_list.h"
//通过名字找到联系人存储的位置
int Find_By_Name(const struct Adress_List* List, char name[])
{
  int i = 0;
  for (i = 0; i < List->size; i++)
  {
    if (0 == strcmp(List->data[i].name, name))
    {
      return i;
    }
  }
  return -1;
}
//qsort库函数中比较函数
int compare(const void* e1, const void* e2)
{
  return ((struct Person_Information*)e1)->age - ((struct Person_Information*)e2)->age;
}
//展示个人信息
void Show_Person_Information(struct Adress_List* List, int ret)
{
  printf("-------------------------------------------------------------------------------\n");
  printf("%-5s\t%-5s\t%-15s\t%-20s\t%-20s\n", "姓名", "性别", "电话", "年龄", "家庭住址");
  printf("%-5s\t%-5s\t%-15s\t%-20d\t%-20s\n",
    List->data[ret].name,
    List->data[ret].sex,
    List->data[ret].phone,
    List->data[ret].age,
    List->data[ret].adress);
  printf("-------------------------------------------------------------------------------\n");
  printf("\n");
}

缺点:

1.因为使用的是数组所以大小是固定的,不能存储太多。

2.读取信息不够准确(没有对信息录入进行优化)

3.查找和排序太单调,没有优化查找,暂时只能对名字进行查找和排序(需求没有完善,初步认识够用)

介绍完毕,感谢浏览,继续加油!












相关文章
|
1月前
|
存储 搜索推荐 算法
【C语言】C语言—通讯录管理系统(源码)【独一无二】
【C语言】C语言—通讯录管理系统(源码)【独一无二】
|
1月前
|
存储 数据可视化 C语言
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
|
3月前
|
C语言
C语言实战项目——学生试卷分数统计
C语言实战项目——学生试卷分数统计
|
3月前
|
机器学习/深度学习 搜索推荐 程序员
C语言实现个人通讯录(功能优化)-2
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-2
|
3月前
|
存储 C语言 索引
C语言实现个人通讯录(功能优化)-1
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-1
|
3月前
|
存储 人机交互 C语言
【C语言项目实战】使用单链表实现通讯录
【C语言项目实战】使用单链表实现通讯录
|
3月前
|
存储 C语言
C语言学习记录——通讯录(动态内存)
C语言学习记录——通讯录(动态内存)
24 0
|
2天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
2天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
8天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。