C语言实现简易通讯录完整流程

目标:通讯录可以存放1000个人信息,人的信息:性别名字年龄电话住址 菜单打印

1.增加联系人

2.删除联系人

3.查找联系人(修改)

4.名字排序联系人

5.展示

6.清空

分析:

首先通讯录存放联系人信息,还需知晓联系人个数,因此是个结构体类型

其次人的信息类型多,因此每个联系人也应为结构体类型

说明:

每个标题下展示的代码顺序:test.c (主函数测试运行)  ->  contact.h  (功能函数声明) ->  contact.c  (功能函数实现)

菜单打印:

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

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			//增加信息
			break;
		case 2:
			//删除
			break;
		case 3:
			//查找(修改)
			break;
		case 4:
            //按名字排序
			break;
		case 5:
			//显示联系人信息
			break;
		case 6:
			//清空联系人
			break;
		case 0:
			//退出通讯录
			break;
		dafault:
			break;
		}
	} while (input);
}

枚举优化:

上述菜单可以用枚举对代码可读性进行优化,改进如下:

enum Oprion
{
	Exit,
	Add,
	Del,
	Serch,
	Sort,
	Show,
	Clear
};

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

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d",&input);
		switch (input)
		{
		case Add:
			//增加信息
			break;
		case Del:
			//删除
			break;
		case Serch:
			//查找(修改)
			break;
		case Sort:
            //按名字排序
			break;
		case Show:
			//显示联系人信息
			break;
		case Clear:
			//清空联系人
			break;
		case Exit:
			//退出通讯录
			break;
		dafault:
			break;
		}
	} while (input);
}

定义结构体 

#define Max 1000
#define name_Max 20
#define sex_Max 5
#define addr_Max 30
#define phone_Max 12

//结构体人的信息
typedef struct Peoinfo
{
	char name[name_Max];
	int age;
	char sex[sex_Max];
	char addr[addr_Max];
	char phone[phone_Max];
}Peoinfo;

//结构体通讯录的信息
typedef struct Contact
{
	Peoinfo data[1000]; //存放数据
	int sz;  //通讯录中有效信息的个数(里面有几个人)
}Contact;

初始化

//完善菜单主函数部分
int main()
{
	int input = 0;
	Contact con;//通讯录
	InitContact(&con);//初始化通讯录
	do
//初始化通讯录
void InitContact(Contact* pc);

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data,0,sizeof(pc->data));   //将数组初始化为0
}

增加信息 

	case Add:
		//增加信息
		AddContact(&con);
		break;

//增加信息到通讯录
void AddContact(Contact* pc);

//增加信息
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz==Max)
	{
		printf("通讯录满了,无法添加\n");
		return 0;
	}
	//输入信息
	printf("请输入名字:");
	scanf("%s",pc->data[pc->sz].name);  //增加的信息应该在原有效信息位置后,用pc->sz指向对应位置
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age)); //age是个变量,注意需要取地址
	printf("请输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[pc->sz].phone);

	pc->sz++;    //元素个数加一
	printf("添加成功\n");
}

这里要注意通讯录已满的情况,并且添加信息时要注意是在原有效信息后得地址开始添加,防止重复。

删除信息 

	case Del:
		//删除
		DeletContact(&con);
		break;

//删除
void DeletContact(Contact* pc);

int FindByname(Contact*pc, char name[])
{
	int i = 0;
	for (i = 0;i<pc->sz;i++)
	{
		if (strcmp(pc->data[i].name, name)==0)
		{

			return i;
		}
	}
	printf("没找到\n");
	return -1;
}

//删除信息
void DeletContact(Contact* pc)
{
	char name[name_Max];
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
	}
	printf("请输入要删除人的名字:");
	scanf("%s",name);
	//实现查找函数
	int pos=FindByname(pc,name); //若找到返回下标,找不到则返回-1
	if (pos==-1)
	{
		printf("无此人\n");
	}
	else
	{
		//删除--要删除元素后面的元素依次向前覆盖
		int j = 0;
		for (j = pos;j<pc->sz-1;j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
}

这里要注意一个查找函数,输入名字来查找联系人,找到才能删除。

查找(修改) 

	case Serch:
		printf("请输入要查找人的名字:");
		scanf("%s", name);
		FindByname(&con,name);
		break;

//查找
int FindByname(const Contact*pc, char name[]);

int FindByname(Contact*pc, char name[])
{
	int i = 0;
	for (i = 0;i<pc->sz;i++)
	{
		if (strcmp(pc->data[i].name, name)==0)
		{
			int put = 0;
			printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone);
            //找到后可以将内容展现出来
			printf("找着了\n请选择是否修改:1.是   0.否\n");
			scanf("%d",&put);
			if (1 == put)
			{
				Modify(pc->data,i);
			}
			return i;
		}
	}
	printf("没找到\n");
	return -1;
}

这里我将第二项删除功能的查找函数进行声明使用,并且将修改函数加入到查找函数中,两个功能联合到一起,但是在使用删除功能的时候会出现重复,这里要注意。

修改函数如下:

//修改
void Modify(Contact* pc,int i)
{
	int bud = 0;
	do
	{
		printf("请选择需要修改的内容\n1.名字     2.年龄     3.性别     4.地址     5.电话     0.取消\n请输入:");
		scanf("%d", &bud);
		switch (bud)
		{
			char chars[30] = { 0 };
		case 1:
		{
				  printf("请输入内容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].name , chars);
		}
			break;
		case 2:
		{
				  int num = 0;
				  printf("请输入内容->");
				  scanf("%d", &num);
				  pc->data[i].age = num;
		}
			break;
		case 3:
		{
				  printf("请输入内容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].sex , chars);
		}
			break;
		case 4:
				  printf("请输入内容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].addr , chars);
			break;
		case 5:
		{
				  printf("请输入内容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].phone , chars);
		}
			break;
		dafault:
			break;
		}
	} while (bud);
}

修改用到了字符串函数strcpy

名字排序 

	case Sort:
		Sortname(&con);
		break;

//名字排序
void Sortname(Contact* pc);

//name排序
int cmp_int(const void*e1,const void*e2)
{
	return (strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name));
}

void Sortname(Contact* pc)
{
	qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_int);
	ShowContact(pc);
}

按名字排序这里,我用到了快速排序qsort函数来进行。排序后调用展示函数进行打印,来观察排序效果。

展示信息 

	case Show:
		//显示
		ShowContact(&con);
		break;

//展示信息
void ShowContact(const Contact* pc);

//展示信息
void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	for (i = 0;i < pc->sz;i++)
	{
		printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone);
		//加负号左对齐,加/t统一每个元素间的距离
	}
}

清空联系人 

	case Clear:
	    ClearContact(&con);
		break;

//清空所有联系人
void ClearContact(Contact* pc);

//清空所有联系人
void ClearContact(Contact* pc)
{
	InitContact(pc);
}

清空联系人,相当于再进行一遍初始化通讯录。

头文件统一在contact.h里面包含:

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>

 test.c 和 contact.c 统一引用头文件 contact.h

#include "contact.h"

总程序如下

test.c

#include "contact.h"

enum Oprion
{
	Exit,
	Add,
	Del,
	Serch,
	Sort,
	Show,
	Clear
};

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

int main()
{
	int input = 0;
	Contact con;//通讯录
	InitContact(&con);//初始化通讯录
	do
	{
		char name[name_Max];
		menu();
		printf("请选择->");
		scanf("%d",&input);
		switch (input)
		{
		case Add:
			//增加信息
			AddContact(&con);
			break;
		case Del:
			//删除
			DeletContact(&con);
			break;
		case Serch:
			printf("请输入要查找人的名字:");
			scanf("%s", name);
			FindByname(&con,name);
			break;
		//case 4:
		//	//修改
		//	Modify(&con);
		//	break;
		case Sort:
			Sortname(&con);
			break;
		case Show:
			//显示
			ShowContact(&con);
			break;
		case Clear:
			ClearContact(&con);
			break;
		case Exit:
			printf("退出通讯录\n");
			break;
		dafault:
			break;
		}
	} while (input);
}

contact.h

//声明
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>

#define Max 1000
#define name_Max 20
#define sex_Max 5
#define addr_Max 30
#define phone_Max 12

//结构体人的信息
typedef struct Peoinfo
{
	char name[name_Max];
	int age;
	char sex[sex_Max];
	char addr[addr_Max];
	char phone[phone_Max];
}Peoinfo;

//结构体通讯录的信息
typedef struct Contact
{
	Peoinfo data[1000]; //存放数据
	int sz;  //通讯录中有效信息的个数(里面有几个人)
}Contact;

//初始化通讯录
void InitContact(Contact* pc);

//增加信息到通讯录
void AddContact(Contact* pc);

//展示信息
void ShowContact(const Contact* pc);

//删除
void DeletContact(Contact* pc);

//查找
int FindByname(const Contact*pc, char name[]);

//名字排序
void Sortname(Contact* pc);

//修改
void Modify(Contact* pc, int i);

//清空所有联系人
void ClearContact(Contact* pc);

contact.c

#include "contact.h"

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data,0,sizeof(pc->data));   //将数组初始化为0
}

//增加信息
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz==Max)
	{
		printf("通讯录满了,无法添加\n");
		return 0;
	}
	//输入信息
	printf("请输入名字:");
	scanf("%s",pc->data[pc->sz].name);  //增加的信息应该在原有效信息位置后,用pc->sz指向对应位置
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age)); //age是个变量,注意需要取地址
	printf("请输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[pc->sz].phone);

	pc->sz++;    //元素个数加一
	printf("添加成功\n");
}

//展示信息
void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;
	for (i = 0;i < pc->sz;i++)
	{
		printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone);
		//加负号左对齐,加/t统一每个元素间的距离
	}
}

int FindByname(Contact*pc, char name[])
{
	int i = 0;
	for (i = 0;i<pc->sz;i++)
	{
		if (strcmp(pc->data[i].name, name)==0)
		{
			int put = 0;
			printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone);
			printf("找着了\n请选择是否修改:1.是   0.否\n");
			scanf("%d",&put);
			if (1 == put)
			{
				Modify(pc->data,i);
			}
			return i;
		}
	}
	printf("没找到\n");
	return -1;
}

//删除信息
void DeletContact(Contact* pc)
{
	char name[name_Max];
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
	}
	printf("请输入要删除人的名字:");
	scanf("%s",name);
	//实现查找函数
	int pos=FindByname(pc,name); //若找到返回下标,找不到则返回-1
	if (pos==-1)
	{
		printf("无此人\n");
	}
	else
	{
		//删除--要删除元素后面的元素依次向前覆盖
		int j = 0;
		for (j = pos;j<pc->sz-1;j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
}

//name排序
int cmp_int(const void*e1,const void*e2)
{
	return (strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name));
}

void Sortname(Contact* pc)
{
	qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_int);
	ShowContact(pc);
}

//修改
void Modify(Contact* pc,int i)
{
	int bud = 0;
	do
	{
		printf("请选择需要修改的内容\n1.名字     2.年龄     3.性别     4.地址     5.电话     0.取消\n请输入:");
		scanf("%d", &bud);
		switch (bud)
		{
			char chars[30] = { 0 };
		case 1:
		{
				  printf("请输入内容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].name , chars);
		}
			break;
		case 2:
		{
				  int num = 0;
				  printf("请输入内容->");
				  scanf("%d", &num);
				  pc->data[i].age = num;
		}
			break;
		case 3:
		{
				  printf("请输入内容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].sex , chars);
		}
			break;
		case 4:
				  printf("请输入内容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].addr , chars);
			break;
		case 5:
		{
				  printf("请输入内容->");
				  scanf("%s", chars);
				  strcpy(pc->data[i].phone , chars);
		}
			break;
		dafault:
			break;
		}
	} while (bud);
}

//清空所有联系人
void ClearContact(Contact* pc)
{
	InitContact(pc);
}

到此这篇关于C语言实现简易通讯录完整流程的文章就介绍到这了,更多相关C语言 简易通讯录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言实现一个简易通讯录

    本文实现一个通讯录,是基于c语言的IO文件操作.数据结构里面的顺序表实现. 具体功能 实现了 1.信息的添加 2.信息的显示 3.信息的修改(修改单一属性) 4.将内存中的信息保存到文件中去 5.将文件中的信息加载到内存中(每次程序运行数据就会丢失) 6.信息的删除 7.信息的查找(按照各自的属性查找) 8.给每一条信息设置了唯一的标识id 9.通讯录的销毁 头文件中的声明 在c语言中我们采用结构体来记录每一个人的具体信息 用顺序表的数据结构来来对数据的操作 #ifndef __ADDRESSB

  • C语言实现简易通讯录

    本文实例为大家分享了C语言实现简易通讯录的具体代码,供大家参考,具体内容如下 功能描述: 1.存储联系人的相关信息,包括姓名.性别.电话号码.备注 2.可输出通讯录全部信息 3.清空通讯录的 4.用户交互界面 5.插入新联系人信息 6.查找联系人,包括"按姓名查找"和"按电话号查找"两种 7.删除联系人,包括"按姓名删除"和"按电话号删除"两种 8.按性别筛选联系人信息 在本次通讯录的编写代码中,涉及到了C高级和数据结构的一些

  • C语言实现简易通讯录功能

    本文实例为大家分享了C语言实现简易通讯录的具体代码,供大家参考,具体内容如下 这两天用C语言编写了一个简易版通讯录(学生信息管理) ,大致功能有添加信息,查看信息(自动按姓名排序,printf输出带颜色字体),查找信息(按姓名查找),删除信息(输入姓名删除相关信息),修改信息(输入修改人的名字,可选择修改其任意信息)和退出 . #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE

  • C语言链表实现简易通讯录

    本文实例为大家分享了C语言链表实现简易通讯录的具体代码,供大家参考,具体内容如下 链表实现通讯录功能: 1.添加–(输入 姓名,电话) 2.删除-- (输入人名,删除该人) 3.查询-- (直接打印所有联系人) 4.修改-- (输入人名,修改电话) 运行效果: 代码分主函数块 和 链表块: Linklist.h #ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDED //链表节点 typedef struct Node { char nam

  • C语言简易通讯录的实现代码

    本文实例为大家分享了C语言简易通讯录的具体代码,供大家参考,具体内容如下 通讯录的实现: 一.介绍: 运用C语言的数组.指针.结构体等相关知识:实现一个简易的通讯录: 此通讯录的大概内容为: 通讯录可存储1000个人的信息: 每个人的基本信息有:名字+ 年龄+性别 +  电话+ QQ + 地址 此通讯录所具有的功能:增加+ 删除 +  查询 + 修改 +  排序 + 退出 此通讯录在设计时:总共设计了三个文件: contact.h: 类型的声明和函数的声明 contact.c:函数功能的具体实现

  • 用C语言实现简易通讯录

    C语言实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 **提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人** 思路分析: 首先我们可以分三个模块来解决这个问题,第一个模块我们需要一个头文件,这个头文件里可以包含一些相应信息,当实现文件和测试文件包含自己定义的头文件时便可以获得一些相关的信息.所以头文件里

  • C语言实现简易通讯录完整流程

    目标:通讯录可以存放1000个人信息,人的信息:性别名字年龄电话住址 菜单打印 1.增加联系人 2.删除联系人 3.查找联系人(修改) 4.名字排序联系人 5.展示 6.清空 分析: 首先通讯录存放联系人信息,还需知晓联系人个数,因此是个结构体类型 其次人的信息类型多,因此每个联系人也应为结构体类型 说明: 每个标题下展示的代码顺序:test.c (主函数测试运行)  ->  contact.h  (功能函数声明) ->  contact.c  (功能函数实现) 菜单打印: void menu

  • C语言实现简易通讯录实例

    目录 一.问题描述 二.功能介绍 二.实现流程 1.创建通讯录 2.创建源文件test.c 3.创建源文件contact.c 4.删除通讯录联系人信息 (DelContact函数实现) 5.查找通讯录联系人信息( SearchContact函数实现) 6.修改联系人信息(ModifyContact函数实现) 总结: 一.问题描述 用C语言来写一个简易的通讯录 二.功能介绍 通讯录1.通讯录中能够存放1000个人的信息每个人的信息:名字,年龄,性别,电话,地址2.增加人的信息3.删除人的信息4.修

  • C语言实现简易通讯录(静态版本)的代码分享

    目录 一.通讯录 1.演示效果 2.完整代码 二.代码解析 1.宏定义及结构体声明 2.主菜单函数 3.主函数 4.查找函数 5.初始化联系人信息 6.添加联系人信息 7.显示所有联系人信息 8.删除指定联系人信息 9.修改联系人信息 10.查找指定联系人 11.按照姓氏对联系人信息排序 12.清空所有联系人信息 一.通讯录 1.演示效果 2.完整代码 #define _CRT_SECURE_NO_WARNINGS 1 //#include "ConTacts.h" #include

  • C语言实现简单通讯录

    本文实例为大家分享了C语言实现简易通讯录的具体代码,供大家参考,具体内容如下 一.概述 通讯录的实现其中包括了指针.结构体.动态内存管理.文件的读写操作等知识点,是对这些知识点应用巩固的非常好的例子: 通讯录功能如下: 添加联系人 删除联系人 查找联系人 修改联系人 显示所有联系人 加载联系人 保存联系人 联系人排序 二.代码如下 contact.h #ifndef CONTACT_H #define CONTACT_H #define NAME_MAX 20 #define SEX_MAX 1

  • C语言实现简易版扫雷的完整过程

    一.问题描述 用C语言实现简易版扫雷. 二.基本流程 1.菜单界面. 2.创建地图 (两个地图). 3.初始化地图. 4.打印地图. 5.程序读取玩家输入的要翻开位置的坐标,并校验. 6.如果不是地雷,统计当前位置周围雷的个数, 并显示到地图上.. 7.判定游戏是否胜利. 三.步骤 1.菜单界面 1.开始游戏 0.退出游戏 int menu(){ printf("----------------------\n"); printf("------1.开始游戏------\n&

随机推荐