【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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、题目:通讯录管理 二、目的与要求 1. 目的: (1)基本掌握面向过程程序设计的基本思路和方法; (2)达到熟练掌握C语言的基本知识和技能; (3)能够利用所学的基本知识和技能,解决简单的程序设计问题 2. 要求 基本要求: 1. 要求利用C语言面向过程的编程思想来完成系统的设计; 2. 突出C语言的函数特征,以多个函数实现每一个子功能; 3. 画出功能模块图; 4. 具有清晰的程序流程图和数据结构的详细定义; 5. 熟练掌握C语言对文件的各种操作。 创新要求: 在基本要求达到后,可进行创新设计,如系统用户功能控制,对管理员级和一般级别的用户系统功能操作不同 三、信息描述 有关该系统基本信息的描述,如:姓名、电话、城市和邮编等。 四、功能描述 1. 名单基本信息(姓名,城市,电话,邮编等)的录入,并存放在文件当中。 2. 基本信息的查询与修改。 3. 记录的添加和删除。 4. 对同一类型记录的查找:如查找同一城市的记录或同一省份的记录。 五、解决方案 1. 分析程序的功能要求,划分程序功能模块。 2. 画出系统流程图。 3. 代码的编写。定义数据结构和各个功能子函数。 4. 程序的功能调试。 5. 完成系统总结报告以及使用说明书 六、进度安排 此次课程设计时间为一周或两周,分四个阶段完成: 1. 分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。 2. 编码调试阶段:根据设计分析方案编写C代码,然后调试该代码,实现课题要求的功能。 3. 总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编码、测试的步骤和内容。 4. 考核阶段。 七、撰写课程设计报告或课程设计总结 课程设计报告要求: 总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值