【C语言】通讯录—静态版

前言:

                        刚学完结构体和枚举,在网上找了个通讯录的项目,用来练手

                        目标:该通讯录可存储千人个人信息

                        包括:姓名,年龄,性别,电话,地址

                        实现功能:

                                1.添加联系人
                                2.删除联系人
                                3.查找联系人
                                4.修改联系人
                                5.打印通讯录
                                6.按姓名排序
                                0.退出通讯录

                       注:当前版本只是最初阶段,后续会持续更新

模块化(为了养成较好的编程习惯)

                将调试内容放入test.c中

                功能实现放入Contact.c中

                定义内容,头文件的引用放入到Contact.h中


准备工作:

1.创建联系人结构体               

typedef struct People//存储相关信息
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char telephone[TELEPHONE_MAX];
	char address[ADDRESS_MAX];
}People;

typedef struct Contact 
{
	People data[MAX];//存储自定义个数联系人的信息
	int sz;//相当于一个计数器
}Contact;

定义全局变量

//define定义常量以便后续进行修改时,过于繁琐,直接修改define内容即可
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELEPHONE_MAX 12
#define ADDRESS_MAX 30

定义枚举类型

        注:将switch,case后面的数字,替换成枚举类型,方便程序员修改,同时枚举类型,变量默认从上到下,从0开始依次递增

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	PRINT,
	SORT
};

调试代码

 思想:   利用do-while()循环功能,input接收选择的数字,switch包含想要实现代码函数,case后面的数字替换成,枚举类型,以便后续修改时,程序员能更好的修改程序

void test()
{
	int input = 0;
	Contact con;
	Init_Contact(&con);//初始化通讯录,因为contact里面的变量未初始化,当前为随机值
	
	do 
	{
		menu();
		printf("请输入功能:>");
		scanf("%d", &input);
		switch (input)
		{
		case EXIT:
			printf("退出通讯录\n");
			return;
		 case ADD:
			 AddContact(&con);
			 break;
		 case DEL:
			 DelContact(&con);
			 break;
		 case SEARCH:
			 SearContact(&con);
			 break;
		 case MODIFY:
			 ModContact(&con);
			 break;
		 case PRINT:
			 PrintContact(&con);
			 break;
		 case SORT:
			 SortContact(&con);
			 break;
		 default:
			 printf("输入错误,暂无该选项\n");
			 break;
		}
	} while (input);
}

一、通讯录菜单

演示效果:

相关代码:

void menu()
{
	printf("**************************\n");
	printf("**** 欢迎!进入通讯录 ****\n");
	printf("*******1.添加联系人*******\n");
	printf("*******2.删除联系人*******\n");
	printf("*******3.查找联系人*******\n");
	printf("*******4.修改联系人*******\n");
	printf("*******5.打印通讯录*******\n");
	printf("*******6.按姓名排序*******\n");
	printf("*******0.退出通讯录*******\n");
	printf("**************************\n");
}


功能实现

        1.添加联系人

            演示效果

                

相关代码 :     

该步骤用到函数assert,确保PC不为空指针,确保参数有效

void AddContact(Contact* pc)
{
	assert(pc);//断言,确保pc不为空指针
	if (pc->sz == MAX)
	{
		printf("通讯录已满无法存储,请即时更新后台程序");
		return;
	}
	printf("请输入姓名:>");
	scanf("%s",(pc->data[pc->sz].name));
	printf("请输入年龄:>");
	scanf("%d",&(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s",(pc->data[pc->sz].sex));
	printf("请输入电话:>");
	scanf("%s",(pc->data[pc->sz].telephone));
	printf("请输入地址:>");
	scanf("%s",(pc->data[pc->sz].address));
	pc->sz++;
	printf("添加成功\n");
}

         2.删除联系人

            演示效果

相关代码: 

        代码思想:通过下标找到该联系人,直接将后面的存储信息,向前挪动一位

void DelContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	printf("请输入想要删除的联系人:>");
	char name[NAME_MAX] = {0};
	scanf("%s",name);
	int pos = FindName(pc,name);
	if (pos == -1)
	{
		printf("未查询到该联系人\n");
		return;
	}
	int j = 0;
	for (j=pos; j<pc->sz-1; j++)
	{
		pc->data[j] = pc->data[j + 1];
	}
	pc->sz--;
	printf("删除成功");
}

3.查找联系人

        演示效果:
        

        注:实现该功能,我们需要确定,查找联系人的下标从而找到该联系人

int FindName(Contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i=0; i<pc->sz; i++)
	{
		if (strcmp(name,pc->data[i].name) == 0)
		{		
			return i;//利用strcmp函数,判断输入变量值是否与数组内容相匹配
                     //匹配返回当前变量下标
		}
	}
	if (strcmp(name, pc->data[i].name) != 0)
	{
		return -1;
	}

}

        相关代码:

void SearContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	printf("请输入想要查找的联系人:>");
	char name[NAME_MAX] = { 0 };
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("未查询到该联系人\n");
		return;
	}
	printf("%-20s %-3s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址\n");
	printf("%-20s %-3d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].telephone, pc->data[pos].address);
	
}

        4.修改联系人

          演示效果:

                

          相关代码:

        代码思想:找到该联系人下标,数组中找到下标,在其基础上直接进行修改

void ModContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	printf("请输入想要修改的联系人:>");
	char name[NAME_MAX] = { 0 };
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("未查询到该联系人\n");
		return;
	}
	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].telephone));
	printf("请输入修改地址:>");
	scanf("%s", (pc->data[pos].address));
	printf("修改成功\n");
}

5.打印通讯录

        演示效果:

                

        相关代码:

        代码思想:确定数组大小,定义一个变量,使其小于数组的大小,进行循环打印

void PrintContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	printf("%-20s %-3s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址\n");
	int i = 0;
	for(i=0; i<pc->sz; i++)
	{
		printf("%-20s %-3d %-5s %-12s %-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].telephone,pc->data[i].address);
	}
}

6.按姓名排序

        演示效果:

        相关代码:

void SortContact(Contact* pc)
{
	//按照姓名排序
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	int i = 0;
	int j = 0;
	for (i = 0; i < pc->sz - 1; i++)
	{
		for (j = 0; j < pc->sz - i - 1; j++)
		{
			if (strcmp(pc->data[j].name, (pc->data[j + 1]).name) > 0)
			{
				People tmp;
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功!\n");
}

        


完整代码:

        Contact.h

#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<assert.h>
//define定义常量以便后续进行修改时,过于繁琐,直接修改define内容即可
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 10
#define TELEPHONE_MAX 12
#define ADDRESS_MAX 30
typedef struct People
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char telephone[TELEPHONE_MAX];
	char address[ADDRESS_MAX];
}People;

typedef struct Contact 
{
	People data[MAX];//存储联系人的信息
	int sz;//相当于一个计数器
}Contact;

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	PRINT,
	SORT
};
//初始化通讯录
void Init_Contact(Contact* pc);

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

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

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

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

//排序通讯录
void SortContact(Contact* pc);

//打印通讯录
void PrintContact(Contact* pc);


Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void Init_Contact(Contact* pc)
{
	pc->sz = 0;
	memset(pc->data,0,sizeof(pc->data));
}
void AddContact(Contact* pc)
{
	assert(pc);//断言,确保pc不为空指针
	if (pc->sz == MAX)
	{
		printf("通讯录已满无法存储,请即时更新后台程序");
		return;
	}
	printf("请输入姓名:>");
	scanf("%s",(pc->data[pc->sz].name));
	printf("请输入年龄:>");
	scanf("%d",&(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s",(pc->data[pc->sz].sex));
	printf("请输入电话:>");
	scanf("%s",(pc->data[pc->sz].telephone));
	printf("请输入地址:>");
	scanf("%s",(pc->data[pc->sz].address));
	pc->sz++;
	printf("添加成功\n");
}
void PrintContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	printf("%-20s %-3s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址\n");
	int i = 0;
	for(i=0; i<pc->sz; i++)
	{
		printf("%-20s %-3d %-5s %-12s %-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].telephone,pc->data[i].address);
	}
}
//查找指定联系人的下标
int FindName(Contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i=0; i<pc->sz; i++)
	{
		if (strcmp(name,pc->data[i].name) == 0)
		{		
			return i;
		}
	}
	if (strcmp(name, pc->data[i].name) != 0)
	{
		return -1;
	}

}
void DelContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	printf("请输入想要删除的联系人:>");
	char name[NAME_MAX] = {0};
	scanf("%s",name);
	int pos = FindName(pc,name);
	if (pos == -1)
	{
		printf("未查询到该联系人\n");
		return;
	}
	int j = 0;
	for (j=pos; j<pc->sz-1; j++)
	{
		pc->data[j] = pc->data[j + 1];
	}
	pc->sz--;
	printf("删除成功");
}

void SearContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	printf("请输入想要查找的联系人:>");
	char name[NAME_MAX] = { 0 };
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("未查询到该联系人\n");
		return;
	}
	printf("%-20s %-3s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址\n");
	printf("%-20s %-3d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].telephone, pc->data[pos].address);
	
}
void ModContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	printf("请输入想要修改的联系人:>");
	char name[NAME_MAX] = { 0 };
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("未查询到该联系人\n");
		return;
	}
	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].telephone));
	printf("请输入修改地址:>");
	scanf("%s", (pc->data[pos].address));
	printf("修改成功\n");
}

void SortContact(Contact* pc)
{
	//按照姓名排序
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	int i = 0;
	int j = 0;
	for (i = 0; i < pc->sz - 1; i++)
	{
		for (j = 0; j < pc->sz - i - 1; j++)
		{
			if (strcmp(pc->data[j].name, (pc->data[j + 1]).name) > 0)
			{
				People tmp;
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功!\n");
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void menu()
{
	printf("**************************\n");
	printf("**** 欢迎!进入通讯录 ****\n");
	printf("*******1.添加联系人*******\n");
	printf("*******2.删除联系人*******\n");
	printf("*******3.查找联系人*******\n");
	printf("*******4.修改联系人*******\n");
	printf("*******5.打印通讯录*******\n");
	printf("*******6.按姓名排序*******\n");
	printf("*******0.退出通讯录*******\n");
	printf("**************************\n");
}
void test()
{
	int input = 0;
	Contact con;
	Init_Contact(&con);//初始化通讯录,因为contact里面的变量未初始化,当前为随机值
	
	do 
	{
		menu();
		printf("请输入功能:>");
		scanf("%d", &input);
		switch (input)
		{
		case EXIT:
			printf("退出通讯录\n");
			return;
		 case ADD:
			 AddContact(&con);
			 break;
		 case DEL:
			 DelContact(&con);
			 break;
		 case SEARCH:
			 SearContact(&con);
			 break;
		 case MODIFY:
			 ModContact(&con);
			 break;
		 case PRINT:
			 PrintContact(&con);
			 break;
		 case SORT:
			 SortContact(&con);
			 break;
		 default:
			 printf("输入错误,暂无该选项\n");
			 break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_73367097/article/details/128696078