其他分享
首页 > 其他分享> > 用C语言实现一个通讯录

用C语言实现一个通讯录

作者:互联网

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
//通过结构体描述一个人的练习情况
typedef struct PersonInfo {
	char name[1024];
	char phone[1024];
}PersonInfo;
//这个结构体描述了一个通信录
//通信录的长度是1024
//还有一个size,表示当前有多少联系人
typedef struct AddressBook {
	PersonInfo persons[1024];
	int size;
}AddressBook;

//此处全局变量,当前为了实现通讯录
//围绕Address
AddressBook addressBook;

void init(AddressBook* addressBook) {
	//把有效元素个数设置为0
	addressBook->size = 0;
	//可有可无
	/*memset(addressBook->persons, 0, sizeof(addressBook->persons));*/
}
int menu() {
	printf("****************************\n");
	printf("*******欢迎使用通讯录*******\n");
	printf("****************************\n");
	printf("                            \n");
	printf("****************************\n");
	printf("********1. 新增联系人*******\n");
	printf("********2. 删除联系人*******\n");
	printf("********3. 查看联系人*******\n");
	printf("********4. 修改联系人*******\n");
	printf("********0. 退出通讯录*******\n");
	printf("****************************\n");
	printf("请输入选项: ");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}
void insert(AddressBook* addressBook) {
	printf("新增\n");
	assert(addressBook != NULL);
	//最大为1024满了的话提示失败
	if (addressBook->size >= 1024) {
		printf("失败\n");
		return;
	}
	PersonInfo person = { 0 };
	printf("输入姓名: \n");
	scanf("%s", person.name);
	printf("输入电话: \n");
	scanf("%s", person.phone);
	//把person结构体放到AdderssBook中
	//当数组为空的时候,size就是0,把新增的元素放到下标为0的位置
	//插入完毕后,把size++ ==> 1
	//下次再插入的时候,size为1,就是把心得元素放到size下标为1的位置
	addressBook->persons[addressBook->size] = person;
	addressBook->size++;
	printf("完成\n\n");
}
void drop(AddressBook* addressBook) {
	printf("删除\n");
	//让用户输入一个序号(数组下标)根据序号删除
	printf("输入序号: \n");
	int id = 0;
	scanf("%d", &id);
	if (id < 0 || id >= addressBook->size) {
		printf("错误\n");
		return;
	}
	//思路
	//如果是尾删就size--
	//如果中间,就把最后一个元素粘过去,再sie--
	if (id == addressBook->size - 1) {
		addressBook->size--;
		printf("成功\n");
		return;
	}
	PersonInfo* lastPerson = &addressBook->persons[addressBook->size - 1];
	addressBook->persons[id] = *lastPerson;
	addressBook->size--;
	printf("成功\n");
}
void show(AddressBook* addressBook) {
	printf("查看");
	//直接遍历数组
	for (int i = 0; i < addressBook->size; i++) {
		//最好用指针变量表示这个元素
		//不用指针会涉及到元素的拷贝,把PersonInfo的结构体拷贝了一遍
		PersonInfo* p = &addressBook->persons[i];
		printf("[%d] %s\t%s\n", i, p->name, p->phone);
	}
	printf("查看联系人完毕\n一共有 %d 个联系人\n\n", addressBook->size);
}
void update(AddressBook* addressBook) {
	printf("修改\n");
	printf("输入序号: \n");
	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 phone[1024] = { 0 };
	printf("输入 * 表示该选项不修改\n");
	printf("输入新用户名(旧: %s): \n", p->name);
	scanf("%s", name);
	if (strcmp(name, "*") != 0) {
		strcpy(p->name, name);
	}
	printf("输入新电话(旧: %s): \n", p->phone);
	scanf("%s", phone);
	if (strcmp(phone, "*") != 0) {
		strcpy(p->phone, phone);
	}
	printf("成功\n");

}
typedef void(*Func)(AddressBook*);
int main() {
	//进行初始化
	init(&addressBook);
	Func funcs[] = {
		 NULL,//为了能让insert和choice对应上
		 insert,
		 drop,
		 show,
		 update
	};
	//和用户进行交互
	while (1) {
		int choice = menu();
		//if (choice == 1) {
		新增
		//}else if (choice == 2) {
		删除
		//}else if (choice == 3) {
		查看
		//}else if (choice == 4) {
		修改
		//}else if (choice == 0) {
		退出
		//}else {
		错误输入
		//}
		if (choice < 0 || choice >= sizeof(funcs) / sizeof(funcs[0])) {
			printf("输入有误");
			continue;
		}
		if (choice == 0) {
			printf("再见");
			break;
		}
		funcs[choice](&addressBook);
		//Func func = funcs[choice];
		// func(addressBook);
		
		//Sleep(2000);
		system("pause");
		system("cls");
	}
	return 0;
}

标签:name,实现,addressBook,C语言,通讯录,printf,choice,id,size
来源: https://blog.csdn.net/qeqe1212/article/details/121177503