栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

利用C语言简单实现通讯录(没有自动扩容的功能)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用C语言简单实现通讯录(没有自动扩容的功能)

一、通讯录

通讯录可以用来存储1024个人的信息,每个人的信息包括:姓名丶性别丶年龄丶电话丶地址。

功能:

  1. 添加一个联系人信息     
  2. 删除指定联系人信息        
  3. 修改指定联系人信息     
  4. 查看指定联系人信息     
  5. 显示所有联系人信息
  6. 清空所有联系人信息    
  7. 以名字排序所有联系人  

这是一个简单的通讯录,实现方案是初级版。
只能在程序运行期间存在(没有写入文件)。

二、菜单实现和用户交互

菜单实现和用户的交互

  1. 添加一个联系人信息     
  2. 删除指定联系人信息        
  3. 修改指定联系人信息     
  4. 查看指定联系人信息     
  5. 显示所有联系人信息
  6. 清空所有联系人信息    
  7. 以名字排序所有联系人  
  8. 0.退出
int menu() {
	 printf("+--------------------------------------+ n");
	 printf("|            欢迎使用通讯录!           |n");
	 printf("+--------------------------------------+ n");
	 printf("|          1.添加一个联系人信息        |n");
	 printf("|          2.删除指定联系人信息        |n");
	 printf("|          3.修改指定联系人信息        |n");
	 printf("|          4.查看指定联系人信息        |n");
	 printf("|          5.显示所有联系人信息        |n");
	 printf("|          6.清空所有联系人信息        |n");
	 printf("|          7.以名字排序所有联系人      |n");
	 printf("|          0.退出                      |n");
	 printf("+--------------------------------------+n");
	 printf("请输入你要进行的操作:");
	 int choice = 0;
	 (void)scanf("%d", &choice);
	 return choice;
}
三、主函数 1.转移表

使用转移表的方式来简化代码。
定义函数指针Func,参数类型是结构体指针。

typedef void(*Func)(AddressBook*addressBook);

2.choice判断

选择为0,打印GoodBye!!!。
选择不在0-7范围内时,提示输入错误,重新输入选择。
选择在0-7范围内时,使用转移表调用函数。

int main() {
	//1.进行初始化
	init(&addressBook);
	//2.与用户进行交互
	Func funcs[] = {
		NULL,//纯属为了占位
		insert,
		drop,
		update,
		search,
		show,
		empty,
		nameSort
	};
	while (1) {
		
		int choice = menu();
		if (choice < 0 || choice > sizeof(funcs) / sizeof(funcs[0])) {
			printf("您的输入有误!n");
			continue;
		}
		if (choice == 0) {
			printf("GOODBYE!n");
			break;
		}
		funcs[choice](&addressBook);
		system("pause");
		system("cls");
	}

	return 0;
}

 

四、定义联系人和通讯录 1.定义联系人结构体

表示一个联系人,包含联系人姓名,性别,年龄,电话,地址.

typedef struct personInfo {
	char name[1024];
	char sex[5];
	char age[100];
	char telphone[1024];
	char address[100];
}personInfo;

2.定义通讯录结构体

表示整个通讯录,管理所有联系人,包含联系人。

通讯录刚开始是空着的,每次新增联系人,才会增加一个元素。
定义size用来控制当前通讯录中有多少个人。

typedef struct AddressBook {
	personInfo persons[1024];
	int size;
}AddressBook;
3.定义结构体变量

全局变量addressBook,因为addressBook是整个程序都要用到的

AddressBook addressBook;
五、通讯录初始化
void init(AddressBook* addressBook) {
	 addressBook -> size = 0;
//可以不用加这个memset
	 memset(addressBook->persons, 0, sizeof(addressBook->persons));
}
六、新增联系人

首先,判断通讯录是不是满了,满了给出提示,没满让用户输入联系人的信息。

void insert(AddressBook* addressBook) {

	 printf("新增联系人!n");
	 assert(addressBook != NULL);

	 //数组的最大元素为1024,如果超过这个范围,就提示新增联系人失败.

	 if (addressBook->size >= 1024) {
		 printf("新增联系人失败!");
		 return;
	 }
	 personInfo person = { 0 };
	 printf("请输入新增联系人的姓名:");
	 scanf("%s", person.name);
	 printf("请输入新增联系人的性别:");
	 scanf("%s", person.sex);
	 printf("请输入新增联系人的年龄:");
	 scanf("%s", person.age);
	 printf("请输入新增联系人的电话:");
	 scanf("%s", person.telphone);
	 printf("请输入新增联系人的地址:");
	 scanf("%s", person.address);

	 //把 person 结构体放到 addressBookzhong!
	 //例如.当数组位空的时候,size就是0.此时新增的元素就放到下标位0的位置即可.
	 //插入完毕之后,就可以把size++ => 1
	 //下一次再插入的时候,此时size为1,就可以把新的元素放到size的位置.

	 addressBook->persons[addressBook->size] = person;
	 addressBook->size++;
	 printf("新增联系人成功!n");
 }
七、删除指定联系人 

用户输入联系人的编号来进行删除(数组下标),删除下标为 id 的元素。

首先判断用户的输入是否合法.

如果 id 对应的元素就是最后一个,直接 size--。
如果 id 对应的元素是中间元素,和最后一个元素替换,然后再size--。

void drop(AddressBook* addressBook) {
	 printf("删除联系人!n");

	 printf("请输入要删除的联系人序号:n");
	 int id = 0;
	 scanf("%d", &id);
	 if (id < 0 || id > addressBook-> size) {
		 printf("您的输入有误!删除失败!n");
		 return;
	 }
	 if (id = addressBook->size - 1) {
		 addressBook->size--;
		 printf("删除成功!");
		 return;
	}
	 if (0 < id && id < addressBook->size) {
		 personInfo* lastperson = addressBook->size - 1;
		 addressBook->persons[id] = *lastperson;
		 addressBook->size--;
		 printf("删除成功!n");
	 }
 }
 八、修改指定联系人 

用户输入联系人的编号来进行修改,更改下标为 id 的元素。

void update(AddressBook* addressBook) {
	 printf("修改联系人!n");
	 printf("请输入你要修改的联系人的序号:");
	 int id = 0;
	 scanf("%d", &id);
	 if (id < 0 || id > addressBook->size) {
		 printf("您的输入有误!修改失败!n");
		 return;
	 }
	 personInfo* p = &addressBook->persons[id];
	 char name[1024] = { 0 };
	 char sex[5] = {0};
	 char age[100] = { 0 };
	 char telphone[1024] = { 0 };
	 char address[100] = { 0 };
	 printf("输入 * 表示该选项不修改!n");
	 printf("请输入新的用户名字(旧的用户名字为 %s):", p->name);
	 scanf("%s", name);
	 if (strcmp(name,"*") != 0) {
		 strcpy(p->name, name);
	 }
	 printf("请输入新的用户性别(旧的用户性别为 %s):", p->sex);
	 scanf("%s", sex);
	 if (strcmp(sex, "*") != 0) {
		 strcpy(p->sex, sex);
	 }
	 printf("请输入新的用户年龄(旧的用户年龄为 %s):", p->age);
	 scanf("%s", age);
	 if (strcmp(age, "*") != 0) {
		 strcpy(p->age, age);
	 }
	 printf("请输入新的用户电话(旧的用户电话为 %s):", p->telphone);
	 scanf("%s", telphone);
	 if (strcmp(telphone, "*") != 0) {
		 strcpy(p->telphone,telphone);
	 }
	 printf("请输入新的用户地址(旧的用户地址为 %s):", p->address);
	 scanf("%s", address);
	 if (strcmp(address, "*") != 0) {
		 strcpy(p->address, address);
	 }
 }
 九、查看指定联系人 

采用按照序号查找的方法。
用户输入序号后查找,输出联系人信息。

void search(AddressBook* addressBook) {
	 printf("查找指定联系人!");
	 printf("请输入你要查找的联系人的序号:");
	 int id = 0;
	 scanf("%d", &id);
	 if (id < 0 || id > addressBook->size) {
		 printf("您的输入有误!查找失败!n");
		 return;
	 }
	 personInfo* p = &addressBook->persons[id];
	 printf(" %st%st%st%st%sn",p->name, p->sex, p->age, p->telphone, p->address);
	 printf("查找联系人成功n");
 }
十、显示所有联系人 
 void show(AddressBook* addressBook) {
	 printf("查看联系人!n");
	 //遍历数组
	 for (int i = 0; i < addressBook->size; i++) {
		 personInfo* p = &addressBook->persons[i];
		 printf("[%d] %st%st%st%st%sn", i, p->name,p->sex,p->age,p->telphone,p->address);
	 }
	 printf("查看联系人完毕!一共有%d个联系人n",addressBook->size);
 }
十一、清空所有联系人 
 void empty(AddressBook* addressBook) {
	 printf("清空所有联系人!n");
	 for (int i = 0; i <= addressBook->size; i++) {
		 addressBook->size=0;
	 }
	 printf("已清空所有联系人n");
 }
十二、按名字排序联系人

使用strcmp比较姓名,然后进行交换排序。

void nameSort(AddressBook* addressBook) {
	 printf("按名字排序!n");
	 int ret = 0;
	 for ( int i = 0; i < addressBook->size - 1; i++) {
		 for (int j = 0; j < addressBook->size - 1-i; j++) {
			 ret = strcmp(addressBook->persons[j].name, addressBook->persons[j + 1].name);
			 if (ret == 1) {
				 personInfo temp = addressBook->persons[j];
				 addressBook->persons[j] = addressBook->persons[j + 1];
				 addressBook->persons[j + 1] = temp;
			 }
		 }
	 }
	 for (int i = 0; i < addressBook->size; i++) {
		 printf("%sn", addressBook->persons[i].name);
	 }
	 printf("排序成功!n");
 }
十三、运行结果演示

1.新增联系人

 

2.删除联系人

3.修改联系人

 

 4.查看联系人

 5.显示联系人

 6.清空联系人

 

 

 7.按名字排序

 十四、完整代码
#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#include 
#include 

typedef struct personInfo {
	char name[1024];
	char sex[5];
	char age[100];
	char telphone[1024];
	char address[100];
}personInfo;

typedef struct AddressBook {
	personInfo persons[1024];
	int size;
}AddressBook;

AddressBook addressBook;

 void init(AddressBook* addressBook) {
	 addressBook -> size = 0;
	 memset(addressBook->persons, 0, sizeof(addressBook->persons));
}

 int menu() {
	 printf("+--------------------------------------+ n");
	 printf("|            欢迎使用通讯录!           |n");
	 printf("+--------------------------------------+ n");
	 printf("|          1.添加一个联系人信息        |n");
	 printf("|          2.删除指定联系人信息        |n");
	 printf("|          3.修改指定联系人信息        |n");
	 printf("|          4.查看指定联系人信息        |n");
	 printf("|          5.显示所有联系人信息        |n");
	 printf("|          6.清空所有联系人信息        |n");
	 printf("|          7.以名字排序所有联系人      |n");
	 printf("|          0.退出                      |n");
	 printf("+--------------------------------------+n");
	 printf("请输入你要进行的操作:");
	 int choice = 0;
	 (void)scanf("%d", &choice);
	 return choice;
}

 void insert(AddressBook* addressBook) {

	 printf("新增联系人!n");
	 assert(addressBook != NULL);

	 //数组的最大元素为1024,如果超过这个范围,就提示新增联系人失败.

	 if (addressBook->size >= 1024) {
		 printf("新增联系人失败!");
		 return;
	 }
	 personInfo person = { 0 };
	 printf("请输入新增联系人的姓名:");
	 scanf("%s", person.name);
	 printf("请输入新增联系人的性别:");
	 scanf("%s", person.sex);
	 printf("请输入新增联系人的年龄:");
	 scanf("%s", person.age);
	 printf("请输入新增联系人的电话:");
	 scanf("%s", person.telphone);
	 printf("请输入新增联系人的地址:");
	 scanf("%s", person.address);

	 //把 person 结构体放到 addressBookzhong!
	 //例如.当数组位空的时候,size就是0.此时新增的元素就放到下标位0的位置即可.
	 //插入完毕之后,就可以把size++ => 1
	 //下一次再插入的时候,此时size为1,就可以把新的元素放到size的位置.

	 addressBook->persons[addressBook->size] = person;
	 addressBook->size++;
	 printf("新增联系人成功!n");
 }

 void drop(AddressBook* addressBook) {
	 printf("删除联系人!n");

	 printf("请输入要删除的联系人序号:n");
	 int id = 0;
	 scanf("%d", &id);
	 if (id < 0 || id > addressBook-> size) {
		 printf("您的输入有误!删除失败!n");
		 return;
	 }
	 if (id = addressBook->size - 1) {
		 addressBook->size--;
		 printf("删除成功!");
		 return;
	}
	 if (0 < id && id < addressBook->size) {
		 personInfo* lastperson = addressBook->size - 1;
		 addressBook->persons[id] = *lastperson;
		 addressBook->size--;
		 printf("删除成功!n");
	 }
 }
 void search(AddressBook* addressBook) {
	 printf("查找指定联系人!");
	 printf("请输入你要查找的联系人的序号:");
	 int id = 0;
	 scanf("%d", &id);
	 if (id < 0 || id > addressBook->size) {
		 printf("您的输入有误!查找失败!n");
		 return;
	 }
	 personInfo* p = &addressBook->persons[id];
	 printf(" %st%st%st%st%sn",p->name, p->sex, p->age, p->telphone, p->address);
	 printf("查找联系人成功n");
 }
 void update(AddressBook* addressBook) {
	 printf("修改联系人!n");
	 printf("请输入你要修改的联系人的序号:");
	 int id = 0;
	 scanf("%d", &id);
	 if (id < 0 || id > addressBook->size) {
		 printf("您的输入有误!修改失败!n");
		 return;
	 }
	 personInfo* p = &addressBook->persons[id];
	 char name[1024] = { 0 };
	 char sex[5] = {0};
	 char age[100] = { 0 };
	 char telphone[1024] = { 0 };
	 char address[100] = { 0 };
	 printf("输入 * 表示该选项不修改!n");
	 printf("请输入新的用户名字(旧的用户名字为 %s):", p->name);
	 scanf("%s", name);
	 if (strcmp(name,"*") != 0) {
		 strcpy(p->name, name);
	 }
	 printf("请输入新的用户性别(旧的用户性别为 %s):", p->sex);
	 scanf("%s", sex);
	 if (strcmp(sex, "*") != 0) {
		 strcpy(p->sex, sex);
	 }
	 printf("请输入新的用户年龄(旧的用户年龄为 %s):", p->age);
	 scanf("%s", age);
	 if (strcmp(age, "*") != 0) {
		 strcpy(p->age, age);
	 }
	 printf("请输入新的用户电话(旧的用户电话为 %s):", p->telphone);
	 scanf("%s", telphone);
	 if (strcmp(telphone, "*") != 0) {
		 strcpy(p->telphone,telphone);
	 }
	 printf("请输入新的用户地址(旧的用户地址为 %s):", p->address);
	 scanf("%s", address);
	 if (strcmp(address, "*") != 0) {
		 strcpy(p->address, address);
	 }
 }

 void show(AddressBook* addressBook) {
	 printf("查看联系人!n");
	 //遍历数组
	 for (int i = 0; i < addressBook->size; i++) {
		 personInfo* p = &addressBook->persons[i];
		 printf("[%d] %st%st%st%st%sn", i, p->name,p->sex,p->age,p->telphone,p->address);
	 }
	 printf("查看联系人完毕!一共有%d个联系人n",addressBook->size);
 }

 void empty(AddressBook* addressBook) {
	 printf("清空所有联系人!n");
	 for (int i = 0; i <= addressBook->size; i++) {
		 addressBook->size=0;
	 }
	 printf("已清空所有联系人n");
 }
 void nameSort(AddressBook* addressBook) {
	 printf("按名字排序!n");
	 int ret = 0;
	 for ( int i = 0; i < addressBook->size - 1; i++) {
		 for (int j = 0; j < addressBook->size - 1-i; j++) {
			 ret = strcmp(addressBook->persons[j].name, addressBook->persons[j + 1].name);
			 if (ret == 1) {
				 personInfo temp = addressBook->persons[j];
				 addressBook->persons[j] = addressBook->persons[j + 1];
				 addressBook->persons[j + 1] = temp;
			 }
		 }
	 }
	 for (int i = 0; i < addressBook->size; i++) {
		 printf("%sn", addressBook->persons[i].name);
	 }
	 printf("排序成功!n");
 }
 typedef void(*Func)(AddressBook*addressBook);
 
int main() {
	//1.进行初始化
	init(&addressBook);
	//2.与用户进行交互
	Func funcs[] = {
		NULL,//纯属为了占位
		insert,
		drop,
		update,
		search,
		show,
		empty,
		nameSort
	};
	while (1) {
		
		int choice = menu();
		if (choice < 0 || choice > sizeof(funcs) / sizeof(funcs[0])) {
			printf("您的输入有误!n");
			continue;
		}
		if (choice == 0) {
			printf("GOODBYE!n");
			break;
		}
		funcs[choice](&addressBook);
		system("pause");
		system("cls");
	}

	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429903.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号