通讯录(C语言实现)

//多文件实现

//test.h
#ifndef _TEST_H_
#define _TEST_H_

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

#pragma warning(disable:4996)

#define MAX 100

typedef struct People//人的信息,这里只写了两个,如有需要,可自行添加
{
	char name[20];//姓名
	char telephone[20];//电话
}People;

typedef struct Contact//通讯录
{
	People data[MAX];//通讯录的成员
	int sz;//记录信息的个数
}Contact;

void menu();
void InitContact(Contact* con);
void Add(Contact* con);
void Delete(Contact* con);
void Serch(Contact* con);
void Alter(Contact* con);
void Show(Contact* con);
void Clear(Contact* con);
void OrderByName(Contact* con);

#endif _TEST_H_

//test.c
#include "test.h"

void menu()//目录
{
	printf("################################\n");
	printf("#### 1.ADD         2.DELETE ####\n");
	printf("#### 3.SERCH       4.ALTER  ####\n");
	printf("#### 5.SHOW        6.CLEAR  ####\n");
	printf("#### 7.ORDER       0.EXIT   ####\n");
	printf("################################\n");
}

void InitContact(Contact* con)//初始化通讯录
{
	assert(con);
	con->sz = 0;
	memset(con->data, 0, sizeof(con->data));
}

void Add(Contact* con)//添加成员
{
	assert(con);//断言,防止指针为空
	printf("请输入姓名:>");
	scanf("%s", con->data[con->sz].name);
	printf("请输入电话:>");
	scanf("%s", con->data[con->sz].telephone);
	con->sz++;
}

static int FindByName(Contact* con, char str[])//通过名字查找成员
{
	int i = 0;
	assert(con);
	for (; i < con->sz; i++){
		if (0 == strcmp(con->data[i].name, str)){
			return i;
		}
	}
	return -1;
}

void Delete(Contact* con)//删除成员
{
	int i = 0;
	char str[20] = { 0 };
	int num = 0;
	assert(con);
	if (0 == con->sz){
		printf("通讯录已空!\n");
		return;
	}
	printf("请输入你要删除的人的名字:>");
	scanf("%s", str);
	num = FindByName(con, str);
	if (-1 == num){
		printf("你要删除的人不存在!\n");
	}
	for (i = num; i < con->sz - 1; i++){
		con->data[i] = con->data[i + 1];
	}
	con->sz--;
	printf("删除成功!\n");
}

void Serch(Contact* con)//查找成员
{
	char str[20] = { 0 };
	int num = 0;
	assert(con);
	printf("请输入你要查找的人的名字:>");
	scanf("%s", str);
	num = FindByName(con, str);
	if (-1 == num){
		printf("查无此人!\n");
		return;
	}
	printf("%-3s %s\n", con->data[num].name, con->data[num].telephone);
}

void Alter(Contact* con)//修改成员信息
{
	int num = 0;
	int input = 0;
	char str[20] = { 0 };
	assert(con);
	printf("请输入要修改的人的姓名:>");
	scanf("%s", str);
	num = FindByName(con, str);
	if (-1 == num){
		printf("查无此人!\n");
		return;
	}
	printf("请选择你要修改的内容(1.姓名 2.电话):>");
	scanf("%d", &input);
	switch (input){
	case 1:
		printf("请输入修改后的姓名:>");
		scanf("%s", con->data[num].name);
		printf("修改成功!\n");
		break;
	case 2:
		printf("请输入修改后的电话:>");
		scanf("%s", con->data[num].telephone);
		printf("修改成功!\n");
		break;
	default:
		printf("输入错误,修改失败!\n");
		return;
	}
}

void Show(Contact* con)//显示通讯录
{
	int i = 0;
	assert(con);
	if (0 == con->sz){
		printf("通讯录为空!\n");
		return;
	}
	printf("姓  名|电  话\n");
	for (; i < con->sz; i++){
		printf("%-6s %s\n", con->data[i].name, con->data[i].telephone);
	}
}

void Clear(Contact* con)//1清空通讯录
{
	InitContact(con);
}

void OrderByName(Contact* con)//使通讯录通过名字排序
{
	int i, j;
	People tmp;
	for (i = 0; i < con->sz - 1; i++)
	{
		for (j = 0; j < con->sz - 1 - i; j++)
		{
			if (0 < strcmp(con->data[j].name, con->data[j + 1].name))
			{
				tmp = con->data[j];
				con->data[j] = con->data[j + 1];
				con->data[j + 1] = tmp;
			}
		}
	}
}

//main.c
#include "test.h"

int main()
{
	int input = 0;
	Contact con;
	InitContact(&con);//初始化通讯录
	do{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input){
		case 1:
			Add(&con);//添加
			break;
		case 2:
			Delete(&con);//删除
			break;
		case 3:
			Serch(&con);//查找
			break;
		case 4:
			Alter(&con);//修改
			break;
		case 5:
			Show(&con);//显示
			break;
		case 6:
			Clear(&con);//清空
			break;
		case 7:
			OrderByName(&con);//按名字排序
			break;
		case 0:
			printf("退出\n");
			return 0;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	system("pause");
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值