我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

C语言小项目动态通讯录-创新互联

项目思路

我们要创建一个通讯录,总体来说他是动态增长的,可以节约空间,能够存储数据在文件中

墨玉ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!

从小点来分一个通讯录中每个人的各项信息大致包括
1.姓名
2.年龄
3.性别
4.电话号码
5.地址
当然如果需要额外的信息也可以多额外设置函数实现
然后通讯录的功能应该包括:增删查改显示保存这几项基本的功能
大体思路是这样,然后开始实现项目

1.我们创建3个文件 test.c 用来测试,显示整个功能 contact.c 主要用来实现所需函数
contact.h头文件来声明函数

//这个主要是大致的流程和用来测试
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//总体思路
// 1.创建的每个人信息包括
//       姓名
//       性别
//       年龄
//       电话号码
//       地址
//     
//2.可以增删查改
enum
{EXIT, //0
	ADD, //1  设置枚举只是为了让代码可读性更高
    DEL,
	SEA,
	MOD,
	SHO,
	SOR,

};
void menu()
{//打印一个菜单供选择
	printf("***************1.增添联系人**************************\n");
	printf("***************2.删除联系人**************************\n");
	printf("***************3.查找联系人**************************\n");
	printf("***************4.修改联系人信息**********************\n");
	printf("***************5.查看当前联系人列表******************\n");
	printf("***************6.排列联系人列表**********************\n");
	printf("***************0.保存当前信息并退出通讯录************\n");


}
void test()
{menu();
	int input = 0;
	do
	{printf("请输入你的选择\n");
		scanf("%d", &input);
		switch (input)
		{//实现各个函数
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEA:
			SearchContact(&con);
			break;
		case MOD:
			ModifyContact(&con);
			break;
		case SHO:
			ShowContact(&con);
			break;
		case SOR:
			SortContact(&con);
			break;
		case EXIT:
			SaveContact(&con);
			break;
		}
	} while (input);
}
int main()
{//1.要初始化通讯录
	InitContact(&con);
	test();
	return 0;

}



contact.h     //这个主要是声明函数
#define MAX_NAME 15
#define MAX_SEX 8
#define MAX_TELE 15
#define MAX_ARRD 10
#include#include#include#includetypedef struct PeoInfo
{char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ARRD];
}Peoinfo;

//只创建一个存放学生信息的还不够 我们在应用时还需要知道当前学生的数量
//并且我们创作的这个通讯录应该是动态增长(能够节省空间)的,所以需要设定容量
typedef struct Contact
{Peoinfo* data;//利用指针再去开辟动态空间 也可以利用柔性数组
	int size;
	int capacity;
}Contact;
Contact con;   
void InitContact(Contact* ps);
void AddContact(Contact* ps);
void DelContact(Contact* ps);
void SearchContact(Contact* ps);
void ShowContact(Contact* ps);
void SortContact(Contact* ps);
void SaveContact(Contact* ps);
void Checkfull(Contact* ps);
void ModifyContact(Contact* ps);




contact.c    //主要来实现函数功能
#include "contact.h"    //包含头文件
void InitContact(Contact* ps)
{ps->size = 0;
	ps->capacity = 3;
	ps->data = (Peoinfo*)malloc(sizeof(Peoinfo) * 3);    //初始化
	//读入存在文件中的数据
	FILE* pf = fopen("contact.txt", "rb");
	if (!pf)
	{perror("InitContact");
		return;
	}
	//开始读入   利用fread的返回值 能判断是否读取完整数据
	//需要创建一个变量
	Peoinfo tmp = {0 };
	while (fread(&tmp, sizeof(Peoinfo), 1, pf) != 0)
	{Checkfull(&con);   //每次都要判断读入时容量是否满了
		ps->data[ps->size] = tmp;
		(ps->size)++;
	}
	fclose(pf);
	pf = NULL;
	
}
void  Checkfull(Contact* ps)
{if (ps->size == ps->capacity)
	{//需要扩容
		Peoinfo* ptr = (Peoinfo*)realloc(ps->data,sizeof(Peoinfo) * (ps->size + 2));//扩充两个人
		if (ptr)
		{	ps->data = ptr;
			(ps->capacity) += 2;
		}
	}
	//如果没有满员,则不需要做任何事
}
void AddContact(Contact* ps)
{//添加之前要检查当前容量是否已经满了
	Checkfull(&con);
	//增加联系人的各项信息
	printf("请输入联系人的姓名\n");
	scanf("%s", ps->data[ps->size].name);
	printf("请输入联系人的年龄\n");
	scanf("%d", &(ps->data[ps->size].age));
	printf("请输入联系人的性别\n");
	scanf("%s", ps->data[ps->size].sex);
	printf("请输入联系人的电话号码\n");
	scanf("%s", ps->data[ps->size].tele);
	printf("请输入联系人的地址\n");
	scanf("%s", ps->data[ps->size].addr);
	printf("添加成功\n");
	(ps->size)++;
}
int Search(char* names)
{int i = 0;     //遍历
	for (i = 0; i< con.size; i++)
	{if (strcmp(con.data[i].name, names) == 0)

		{	return i;
		}
	}
	return -1;
}
void SearchContact(Contact* ps)
{//再设置一个函数查找
	//如果找到了就返回下标,如果没有找到就返回-1
	printf("请输入你要查找的联系人的姓名\n");
	char names[MAX_NAME];
	scanf("%s", names);
	int ret = Search(names);
	if (ret == -1)
	{printf("找不到此人\n");
	}
	else
	{//要把这个人的信息全部都打印出来所以我们先实现show函数
		printf("%-15s\t%-5s\t%-5d\t%-15s\t%-10s\n",
			ps->data[ret].name,
			ps->data[ret].sex,
			ps->data[ret].age,
			ps->data[ret].tele,
			ps->data[ret].addr);
	}

}






void DelContact(Contact* ps)
{printf("请输入你需要删除的联系人的名字\n");
	char names[MAX_NAME];
	scanf("%s", names);
	//首先需要查找到联系人,那我们优先完成查找函数
	int ret = Search(names);
	if (ret == -1)
	{printf("找不到你要删除的这个联系人\n");
	}
	else
	{//删除思路:把删除人之后的每一位联系人向前移一位,最后再把size减一即可
		int i = 0;
		for (i = ret; i< ps->size-1; i++)
		{	ps->data[i] = ps->data[i + 1];
		}
		(ps->size)--;
		printf("删除成功\n");
		
	}
}

void ShowContact(Contact* ps)
{//开始时需要判断一下 是否有人
	if (ps->size == 0)
	{printf("目前还没有联系人\n");
	}
	//左对齐
	else
	{printf("%-15s\t%-5s\t%-5s\t%-15s\t%-10s\n", "姓名", "年龄", "性别", "电话", "地址");
		for (int i = 0; i< ps->size; i++)
		{	//打印每个人的各项信息
			printf("%-15s\t%-5s\t%-5d\t%-15s\t%-10s\n",
				ps->data[i].name,
				ps->data[i].sex,
				ps->data[i].age,
				ps->data[i].tele,
				ps->data[i].addr);
		}
	}
}
int com_by_name(void* e1, void* e2)
{return strcmp((char*)e1, (char*)e2);
}
void SortContact(Contact* ps)
{//利用qsort函数来排序   我上一篇文章有详细的讲解
	//我们这里就按姓名分类,其他也是同理可以得到
	qsort(ps->data, ps->size, sizeof(Peoinfo), com_by_name);
	printf("排序成功\n");
	ShowContact(ps);
}
void SaveContact(Contact* ps)
{int i = 0;
	//写入一个文件中
	FILE* pf = fopen("contact.txt", "wb");//以二进制的形式写入 
	if (!pf)
	{perror("SaveContact");//错误时,能够打印错误的信息
		return;
	}
	else
	{for (i = 0; i< ps->size; i++)
		{	fwrite(&(ps->data[i]), sizeof(Peoinfo), 1, pf);
		}
	}
	fclose(pf);
	pf = NULL;

}
void ModifyContact(Contact* ps)
{printf("请输入你要修改的联系人姓名\n");
	char names[MAX_NAME];
	scanf("%s", names);
	int ret = Search(names);
	if (ret == -1)
	{printf("找不到你要修改的联系人\n");
	}
	else
	{printf("请输入联系人的姓名\n");
		scanf("%s", ps->data[ret].name);
		printf("请输入联系人的年龄\n");
		scanf("%d", &(ps->data[ret].age));
		printf("请输入联系人的性别\n");
		scanf("%s", ps->data[ret].sex);
		printf("请输入联系人的电话号码\n");
		scanf("%s", ps->data[ret].tele);
		printf("请输入联系人的地址\n");
		scanf("%s", ps->data[ret].addr);
		printf("修改成功\n");
}

到这里项目就完成了,虽然看起来有很多行,但是找清楚思路后很好写

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章题目:C语言小项目动态通讯录-创新互联
链接分享:http://mswzjz.cn/article/dojidd.html

其他资讯