用c语言实现静态通讯录

思路:

将代码分成三个模块,头文件contact.h:声明函数,定义结构体

                                    test.c测试类,contact.c用来实现通讯录中的函数功能

1.打印菜单,让用户进行选择

2.定义一个结构体PeoInfo,其中包含联系人的信息,如姓名等。将PeoInfo定义一个100大小的数组data,与count封装再同一结构体Contact中,可以这个count来记录data数组的增删查改,因为初始化为0后可以作为数组data的下标

3.用Contact创建一个con成员,并初始化。但结构体数组,要想全部成员都进行初始化,需要用到

void * memset ( void * ptr, int value, size_t num ) 函数。

4.功能实现:添加成员后count++,删除成员后count--,访问成员时则以下循环就行for i in range(0,pc->count),当然,查找,删除,修改都需要用到查找函数。排序可以用库函数qsort来实现。

5.代码如下:

头文件:contact.h

#pragma once

#include 
#include 
#include 
#include 

#define MAX_CONTACTS 100

//定义联系人
typedef struct PenInfo {
	char name[20];
	int age;
	char sex[10];
	char tele[12];
	char addr[30];
}PenInfo;


//通讯录所包含内容
typedef struct Contact {
	PenInfo data[MAX_CONTACTS];
	int count;
}Contact;

//初始化联系人列表
void Initcontact(Contact *pc);

//添加联系人
void Addcontact(Contact *pc);

//删除练习人
void Delcontact(Contact* pc);

//显示联系人
void Showcontact(const Contact* pc); 

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

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

//排序
void Sortcontact(Contact* pc);

 contact.c:

#define _CRT_SECURE_NO_WARNINGS

#include "contact.h"

void Initcontact(Contact* pc) {
	memset(pc->data, 0, sizeof(pc->data));
	pc->count = 0;
}


void Addcontact(Contact* pc){
	assert(pc);
	
	if (pc->count == 100) {
		printf("联系人已满,无法添加\n");
		return;
	}
	printf("请输入联系人名字:>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入联系人年龄:>");
	scanf("%d", &(pc->data[pc->count].age));
	printf("请输入联系人性别:>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入联系人电话:>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入联系人地址:>");
	scanf("%s", pc->data[pc->count].addr);

	pc->count++;

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

void Showcontact(const Contact* pc) {
	assert(pc);
	if (pc->count == 0) {
		printf("还没添加联系人\n");
		return;
	}
	printf("%-20s\t%-3s\t%-10s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	printf("-----------------------------------------------------------------------------\n");
	for (int i = 0; i < pc->count; i++) {
		
		printf("%-20s\t%-5d\t%-10s\t%-12s\t%-30s", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
		printf("\n");
		printf("-----------------------------------------------------------------------------\n");
	}
}

//查找联系人
static int Findcontact(Contact* pc, char* name) {
	assert(pc);
	for (int i = 0; i < pc->count; i++) {
		if (strcmp(name, pc->data[i].name) == 0) {
			return i;
		}
	}
	return -1;
}
void Delcontact(Contact* pc) {
	assert(pc);
	char name[20] = { 0 };
	printf("请输入要删除的联系人名字:>");
	scanf("%s", name);
	//查找
	int pos = Findcontact(pc, name);
	//删除
	if (pos == -1) {
		printf("没有该联系人\n");
		return;
	}
	for (int i = pos; i < pc->count + 1; i++) {
		pc->data[i] = pc->data[i + 1];
	}
	pc->count--;
	printf("删除成功\n");

}


void Searchcontact(Contact* pc) {
	assert(pc);
	char name[20] = { 0 };
	printf("请输入要查找的联系人名字:>");
	scanf("%s", name);
	//查找
	int pos = Findcontact(pc, name);
	//删除
	if (pos == -1) {
		printf("没有该联系人\n");
		return;
	}
	else {
		printf("找到了\n");
		printf("%-20s\t%-3s\t%-10s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("-----------------------------------------------------------------------------\n");

		printf("%-20s\t%-5d\t%-10s\t%-12s\t%-30s", pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
		printf("\n");
		printf("-----------------------------------------------------------------------------\n");
	}

}

void Modifycontact(Contact* pc) {
	assert(pc);
	char name[20] = { 0 };
	printf("请输入要修改的联系人的名字:>");
	scanf("%s", name);
	//查找
	int pos = Findcontact(pc, name);
	//删除
	if (pos == -1) {
		printf("没有该联系人\n");
		return;
	}else {
		printf("修改后联系人名字:>");
		scanf("%s", pc->data[pos].name);
		printf("修改后联系人年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("修改后联系人性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("修改后联系人电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("修改后联系人地址:>");
		scanf("%s", pc->data[pos].addr);
		printf("\n");
		printf("修改成功\n");
		}
}

//按姓名排序函数
int Sort_by_name(const void* e1, const void* e2) {
	return strcmp(((PenInfo*)e1)->name, ((PenInfo*)e2)->name);
}
//按年龄排序
int Sort_by_age(const void* e1, const void* e2) {
	if (((PenInfo*)e1)->age< ((PenInfo*)e2)->age){
		return -1;
	}
	if (((PenInfo*)e1)->age > ((PenInfo*)e2)->age) {
		return 1;
	}
	if (((PenInfo*)e1)->age == ((PenInfo*)e2)->age) {
		return 0;
	}
}
void Sortcontact(Contact* pc) {
	assert(pc);
	int chiose;
	printf("(1.按姓名排序 2.按年龄排序):>");
	scanf("%d", &chiose);
	if (chiose == 1) {
		qsort(pc->data,pc->count,sizeof(PenInfo), Sort_by_name);
		printf("排序成功\n");
	}
	else if (chiose == 2) {
		qsort(pc->data, pc->count, sizeof(PenInfo), Sort_by_age);
		printf("排序成功\n");
	}
	else {
		printf("无效输入\n");
		return;
	}
}

test.c:

#define _CRT_SECURE_NO_WARNINGS

#include "contact.h"

//创建菜单
void menu() {
	printf("------------My ContactBook------------\n");
	printf("-----------1.Add linkman  ------------\n");
	printf("-----------2.Del linkman  ------------\n");
	printf("-----------3.Show linkman ------------\n");
	printf("-----------4.Search linkman ----------\n");
	printf("-----------5.Modify linkman ----------\n");
	printf("-----------6.Sort linkman -----------\n");
	printf("-----------0.Exit menu  -------------\n");

}
int main() {    
	int input = 0;
	//创建联系人
	Contact con;
	Initcontact(&con);
	do {
		menu();
		printf("请选择对应功能的编号:>");
		scanf("%d", &input);
		switch (input) {
		case 1:         
			Addcontact(&con);
			break;
		case 2:
			Delcontact(&con);
			break;
		case 3:
			Showcontact(&con);
			break;
		case 4:
			Searchcontact(&con);
			break;
		case 5:
			Modifycontact(&con);
			break;
		case 6:
			Sortcontact(&con);
			break;
		case 0:
			printf("退出成功\n");
			break;
		default :
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

这是一个静态版本,还有许多功能尚未完善,等待后续开发。

你可能感兴趣的:(C语言,c语言,开发语言)