0
点赞
收藏
分享

微信扫一扫

【C语言】通讯录

酷子腿长一米八 2022-03-31 阅读 75
c语言

目录

一、思路阶段

二、代码实现

1.game.h

2.game.c

3.test.c

总结


前言

学习了这么长时间的C语言,越来越让我有想写一些项目的冲动,今天我就带了通讯录的模拟及实现


一、思路阶段

既然要写一个通讯录,我们就要想一个通讯录应该有对联系人的增删查改的基本功能,同时通讯录是没有大小限制的,所以我们想到了动态开辟一个通讯录数组。

通讯录中的基本元素一个人,我们希望储存他的姓名,年龄,性别,年龄,地址等基本信息,我们就想到了可以通过创建一个·结构体,将一个人的基本元素打包在一起。同时往大了看,一个通讯录有很多个人,通讯录需要记录每一个人和当前的人数,我们就想到了,和描述一个人同样的原理,用一个结构体来解决它,但是前面我们想到要使用动态开辟,所以通讯录结构体中存放的是一个指针,然后在main函数中创建通讯录结构体,既然是一个不限容量的通讯录,所以后面必定会出现要给通讯录扩容的情况,所以要单独写一个函数来判断通讯录需不需要扩容。

然就要分模块来实现各个功能

首先是增加联系人的功能,我们需要预先开辟能够容纳2~3人的空间,然后找到那个人,将当前联系人的信息分别输入进去,使通讯录中记录联系人个数的变量自增。

其次是实现查找联系人的功能,因为它他重要了,这个功能是删查改联系人的基础,你必须先能够找到那个人,才能进行下一步操作,查找联系人,我们先让他能够按联系人姓名来查找,并且需要写一个循环来能够使用户反复查找,并留出出口然后用户自己选择是否继续查找

查找完,我们就想到了,查找完,我们用户需要知道它的信息,所以就需要打印出通讯录成员,而打印十分简单我们只需要遍历一遍通讯录就可以了,这个是没有什么简便方法。然后就到了,删除联系人了,删除:我们先打印出所有的联系人,然后让用户自己输入想要删除联系人的姓名,已被删除的下标为起点,我们让后面的通讯录成员向前移动1位,然后使记录通讯录联系人多少的变量减一。最复杂的是修改联系人,我们可以修改联系人的姓名,年龄,地址,电话号。因此我们还需要一个菜单供用户选择,修改,还是要让用户输入联系人姓名,我们遍历通讯录寻找这个联系人,区分找到了和找不到两种情况,这时就需用循环,让用户自己决定是否退出修改,因为修改可能要修改不只一个信息。最后是退出程序,退出我们需要主动释放前面动态内存开辟的空间。

二、代码实现

1.game.h

#pragma once

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



typedef struct People//定义一个人
{
	char name[10];
	char sex[3];
	int age;
	char addr[20];
	int tele[12];

}People;

typedef struct Contact//创建通讯录by动态开辟
{
	People* data;//动态开辟联系人
	int capacity;//联系人最大容量
	int sz;//当前通讯录的人数

}Contact;


//通讯录菜单选项

enum choce
{
	Exit,
	Add,
	Del,
	Find,
	Print,
	Modification
};

//修改联系人菜单选项

enum Del
{
	EXIT,
	name,
	age,
	addr,
	sex,
	tele,
};



//函数声明

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

//增加联系人
void AddContact(Contact* pc);

//查找联系人
void SearchContact(Contact* pc);

//打印联系人
void PrintContact(Contact* pc);

//修改联系人
void ModificationContact(Contact* pc);

//退出通讯录
void ExitContact(Contact* pc);

//找到联系人返回联系袭人下标
int FindPeople(const Contact* pc, char *name);

//删除联系人
void DelContact(Contact* pc);

//修改联系人菜单
void menu2();

//检查通讯录是否已满
void checkcapacity(Contact* pc);

2.game.c


#include"game.h"

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	
	pc->data = (People*)malloc(sizeof(Contact)*3);
	if (pc->data == NULL)
	{
		perror("malloc");
		return;
	}
	pc->capacity = 3;
	pc->sz = 0;
	memset(pc->data, 0, sizeof(People)*(pc->capacity));
}

//增加联系人
void AddContact(Contact* pc)
{
	assert(pc);
	
	checkcapacity(pc);

	printf("请输入联系人的姓名\n");
	scanf("%s", pc->data[pc->sz].name);

	printf("请输入联系人的年龄\n");
	scanf("%d", &(pc->data[pc->sz].age));

	printf("请输入联系人的性别\n");
	scanf("%s", pc->data[pc->sz].sex);

	printf("请输入联系人的电话号码\n");
	scanf("%s", pc->data[pc->sz].tele);

	printf("请输入联系人的地址\n");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;

	printf("添加成功\n");
	
}

//查找联系人

void SearchContact(Contact* pc)
{
	assert(pc);

	printf("请输入要查找的联系人姓名\n");
	char name[12] = { 0 };
	scanf("%s", name);
	int i = FindPeople(pc, name);
	if (i!=-1)
	{
		printf("%-5s%-2c%-2d%-5s%-5s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
	}
	else
	{
		printf("无法找到该联系人\n");
	}
}


//检查通讯录是否已满
void checkcapacity(Contact*pc)
{
	
	assert(pc);

	if (pc->capacity == pc->sz)
	{
		Contact* ptr = (Contact*)realloc(pc->data, sizeof(Contact) * (pc->capacity + 2));
		if (ptr == NULL)
		{
			perror("checkcapacity recalloc");
			return;
		}
		pc = ptr;
		pc->capacity += 2;
	}
}

//退出程序,并销毁通讯录,释放内存

void ExitContact(Contact* pc)
{
	assert(pc);

	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
	printf("退出成功\n");

}

3.test.c

#include"game.h"

void menu1()
{
	printf("\n");
	printf("*************************\n");
	printf("***  1.add    2.del   ***\n");
	printf("***  3.find  4.print  ***\n");
	printf("***  5.modification   ***\n");
	printf("***  0. exit          ***\n");
	printf("*************************\n");
	printf("\n");
}


int main()
{
	int input = 0;
	
	//创建联系人
	Contact con;
	
	//通讯录初始化
	InitContact(&con);


	do
	{
		menu1();
		printf("请选择:> \n");
		scanf("%d", &input);

		switch (input)
		{
		case Add:
			AddContact(&con);
			break;
		case Del:
			DelContact(&con);
			break;
		case Find:
			SearchContact(&con);
			break;
		case Print:
			PrintContact(&con);
			break;
		case Modification:
			ModificationContact(&con);
			break;
		case Exit:
			ExitContact(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("操作无效,请重新选择\n");
			break;
		}

	} while (input);

	return 0;
}


总结


以上就是通讯录的思路及其代码的实现

举报

相关推荐

0 条评论