验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

C语言静态版通讯录怎么实现

阅读:1974 来源:乙速云 作者:代码code

C语言静态版通讯录怎么实现

      1. 配置运行环境

      本通讯录运用到了三个文件

      test.c //测试通讯录的相关功能

      contact.h //声明

      contact.c //通讯录的实现模块

      2. 通讯录的实现

      想要做通讯录,首要任务就是要把模块想好。

      先打印一个通讯录的界面菜单

      void menu()
      {
      	printf("********************************n");
      	printf("*****    1. add     2. del   ***n");
      	printf("*****    3. search  4. modify***n");
      	printf("*****    5. show    6. sort  ***n");
      	printf("*****    0. exit             ***n");
      	printf("********************************n");
      }

      2.1 通讯录的功能目录

      通讯录的功能有7种:

      • 增加联系人

      • 删除指定联系人

      • 查找联系人

      • 修改联系人的信息

      • 对联系人的排序

      • 显示联系人的信息

      • 退出通讯录

      创建人的信息的结构体类型

      第一步是封装一个人的信息的结构体类型

      由于封装的结构体类型的名字太长,总是写的话感觉太麻烦了

      对 struct PeoInfo进行了typdef类型重命名

      struct PeoInfp 改成 PeoInfp

      //表示一个人的信息
      typedef struct PeoInfo
      {
      	char name[20];
      	int age;
      	char sex[5];
      	char tele[12];
      	char addr[30];
      }PeoInfo;

      以上的数值如果以后会经常用到的话,可以用#define 来定义,方便以后修改

      #define MAX 100
      #define MAX_NAME 20
      #define MAX_SEX 5
      #define MAX_TELE 12
      #define MAX_ADDR 30

      2.2 增加信息功能代码的实现

      //增加通讯录信息
      void AddContact(Contact* pc)
      {
      	if (DATA_MAX == pc->sz)
      	{
      		printf("通讯录信息存储空间已满!n");
      		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].tele);
      	printf("请输入住址:> ");
      	scanf("%s", pc->data[pc->sz].addr);
      	printf("信息添加成功!n");
      	pc->sz++;
      }

      2.3 显示信息功能代码的实现

      void ShowContact(const Contact* pc)
      {
      	int i = 0;
      	//姓名      年龄      性别     电话      地址
      	//zhangsan 20        男      123456    北京
      	//
      	//打印标题
      	printf("%-10s %-4s %-5s %-12s %-30sn", "姓名", "年龄", "性别", "电话", "地址");
      	//打印数据
      	for (i = 0; i < pc->sz; i++)
      	{
      		printf("%-10s %-4d %-5s %-12s %-30sn", 
      			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
      	}
      }

      2.4 删除信息功能代码的实现

      void DelContact(pContact pc)
      {
      	char name[MAX_NAME] = { 0 };
      	if (pc->sz == 0)
      	{
      		printf("通讯录为空,无法删除n");
      		return;
      	}
      	//删除
      	//1. 找到要删除的人 - 位置(下标)
      	printf("输入要删除人的名字:>");
      	scanf("%s", name);
      	int pos = FindByName(pc, name);
      	if (pos == -1)
      	{
      		printf("要删除的人不存在n");
      		return;
      	}
      	int i = 0;
      	//2. 删除 - 删除pos位置上的数据
      	for (i = pos; isz-1; i++)
      	{
      		pc->data[i] = pc->data[i + 1];
      	}
      	pc->sz--;
      	printf("删除成功n");
      }

      2.5 查询信息功能代码的实现

      void SearchContact(const Contact* pc)
      {
      	char name[MAX_NAME] = {0};
      	printf("请输入要查找人的名字:>");
      	scanf("%s", name);
      	//查找
      	int pos = FindByName(pc, name);
      	if (pos == -1)
      	{
      		printf("要查找的人不存在n");
      		return;
      	}
      	//打印
      	printf("%-10s %-4s %-5s %-12s %-30sn", "姓名", "年龄", "性别", "电话", "地址");
      	//打印数据
      	printf("%-10s %-4d %-5s %-12s %-30sn",
      		pc->data[pos].name,
      		pc->data[pos].age,
      		pc->data[pos].sex,
      		pc->data[pos].tele,
      		pc->data[pos].addr);
      }

      2.6 修改信息功能代码的实现

      void ModifyContact(Contact* pc)
      {
      	char name[MAX_NAME] = {0};
      	printf("请输入要修改人的名字:>");
      	scanf("%s", name);
      	int pos = FindByName(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].tele);
      	printf("请输入地址:>");
      	scanf("%s", pc->data[pos].addr);
      	printf("修改成功n");
      }

      2.7 按名字排序信息功能代码的实现

      //按照名字来排序
      int cmp_by_name(const void* e1, const void* e2)
      {
      	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
      }
      void SortContact(Contact* pc)
      {
      	qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
      	printf("排序成功n");
      }

      3. 完整静态版本通讯录的全部源码

      3.1 contact.c

      #define _CRT_SECURE_NO_WARNINGS 1
      #include "contact.h"
      void InitContact(Contact* pc)
      {
      	pc->sz = 0;
      	memset(pc->data, 0, sizeof(pc->data));
      }
      void AddContact(Contact* pc)
      {
      	if (pc->sz == MAX)
      	{
      		printf("通讯录已满,无法增加n");
      		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].tele);
      	printf("请输入地址:>");
      	scanf("%s", pc->data[pc->sz].addr);
      	pc->sz++;
      	printf("添加成功n");
      }
      void ShowContact(const Contact* pc)
      {
      	int i = 0;
      	//姓名      年龄      性别     电话      地址
      	//hengchuan 20        男      123456    北京
      	//
      	//打印标题
      	printf("%-10s %-4s %-5s %-12s %-30sn", "姓名", "年龄", "性别", "电话", "地址");
      	//打印数据
      	for (i = 0; i < pc->sz; i++)
      	{
      		printf("%-10s %-4d %-5s %-12s %-30sn",
      			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
      	}
      }
      static int FindByName(const Contact* pc, char name[])
      {
      	int i = 0;
      	for (i = 0; i < pc->sz; i++)
      	{
      		if (0 == strcmp(pc->data[i].name, name))
      		{
      			return i;
      		}
      	}
      	return -1;
      }
      void DelContact(pContact pc)
      {
      	char name[MAX_NAME] = { 0 };
      	if (pc->sz == 0)
      	{
      		printf("通讯录为空,无法删除n");
      		return;
      	}
      	//删除
      	//1. 找到要删除的人 - 位置(下标)
      	printf("输入要删除人的名字:>");
      	scanf("%s", name);
      	int pos = FindByName(pc, name);
      	if (pos == -1)
      	{
      		printf("要删除的人不存在n");
      		return;
      	}
      	int i = 0;
      	//2. 删除 - 删除pos位置上的数据
      	for (i = pos; i < pc->sz - 1; i++)
      	{
      		pc->data[i] = pc->data[i + 1];
      	}
      	pc->sz--;
      	printf("删除成功n");
      }
      void SearchContact(const Contact* pc)
      {
      	char name[MAX_NAME] = { 0 };
      	printf("请输入要查找人的名字:>");
      	scanf("%s", name);
      	//查找
      	int pos = FindByName(pc, name);
      	if (pos == -1)
      	{
      		printf("要查找的人不存在n");
      		return;
      	}
      	//打印
      	printf("%-10s %-4s %-5s %-12s %-30sn", "姓名", "年龄", "性别", "电话", "地址");
      	//打印数据
      	printf("%-10s %-4d %-5s %-12s %-30sn",
      		pc->data[pos].name,
      		pc->data[pos].age,
      		pc->data[pos].sex,
      		pc->data[pos].tele,
      		pc->data[pos].addr);
      }
      void ModifyContact(Contact* pc)
      {
      	char name[MAX_NAME] = { 0 };
      	printf("请输入要修改人的名字:>");
      	scanf("%s", name);
      	int pos = FindByName(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].tele);
      	printf("请输入地址:>");
      	scanf("%s", pc->data[pos].addr);
      	printf("修改成功n");
      }
      //按照名字来排序
      int cmp_by_name(const void* e1, const void* e2)
      {
      	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
      }
      void SortContact(Contact* pc)
      {
      	qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
      	printf("排序成功n");
      }

      3.2 contact.h

      #pragma once
      #include 
      #include 
      #include 
      #include 
      #define MAX 100
      #define MAX_NAME 20
      #define MAX_SEX 5
      #define MAX_TELE 12
      #define MAX_ADDR 30
      //表示一个人的信息
      typedef struct PeoInfo
      {
      	char name[MAX_NAME];
      	int age;
      	char sex[MAX_SEX];
      	char tele[MAX_TELE];
      	char addr[MAX_ADDR];
      }PeoInfo;
      //静态版本的设计
      typedef struct Contact
      {
      	PeoInfo data[MAX];//存放数据
      	int sz;//记录通讯录中的有效信息个数
      }Contact, *pContact;
      //初始化通讯录
      void InitContact(Contact* pc);
      //增加指定联系人
      void AddContact(Contact* pc);
      //显示联系人信息
      void ShowContact(const Contact* pc);
      //删除指定联系人
      //void DelContact(Contact* pc);
      void DelContact(pContact pc);
      //查找指定联系人
      void SearchContact(const Contact* pc);
      //修改通讯录
      void ModifyContact(Contact* pc);
      //排序通讯录元素
      void SortContact(Contact* pc);

      3.3 test.c

      #define _CRT_SECURE_NO_WARNINGS 1
      #include "contact.h"
      void menu()
      {
      	printf("********************************n");
      	printf("*****    1. add     2. del   ***n");
      	printf("*****    3. search  4. modify***n");
      	printf("*****    5. show    6. sort  ***n");
      	printf("*****    0. exit             ***n");
      	printf("********************************n");
      }
      enum Option
      {
      	EXIT,
      	ADD,
      	DEL,
      	SEARCH,
      	MODIFY,
      	SHOW,
      	SORT
      };
      int main()
      {
      	int input = 0;
      	Contact con;//通讯录
      	//初始化通讯录
      	//加载文件的信息到通讯录中
      	InitContact(&con);
      	do
      	{
      		menu();
      		printf("请选择:>");
      		scanf("%d", &input);
      		switch (input)
      		{
      		case ADD:
      			AddContact(&con);
      			break;
      		case DEL:
      			DelContact(&con);
      			break;
      		case SEARCH:
      			SearchContact(&con);
      			break;
      		case MODIFY:
      			ModifyContact(&con);
      			break;
      		case SHOW:
      			ShowContact(&con);
      			break;
      		case SORT:
      			SortContact(&con);
      			break;
      		case EXIT:
      			printf("退出通讯录n");
      			break;
      		default:
      			printf("选择错误n");
      			break;
      		}
      	} while (input);
      	return 0;
      }

      4. 静态版本通讯录的缺点

      缺点:

      通讯录的大小是固定的 - 100个元素当通讯录退出后,重新运行,之前的信息都丢了

      当前通讯录中的信息都是保存在内存中的,程序退出,内存就回收了,下一次重新运行程序,内存重新分配,之前的数据就不见了

    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>