【C语言教程】如何制作通讯录详解

所需工具:

C++

聪明的大脑

勤劳的双手

 

注意:本站只提供教程,不提供任何成品+工具+软件链接,仅限用于学习和研究,禁止商业用途,未经允许禁止转载/分享等

 

教程如下

相信大家都见识过通讯录,通讯录里面一般有的内容为姓名,联系方式,年龄等信息。通讯录的主要功能有:增加、删除、查找、排序、修改、展示等操作。

那么具体应该用C语言怎么实现这个呢?接下来我们大家一起来看一下,一起用前一段时间所学习的C语言相关知识来看看!

1. 先定义主函数

Contact.h

里面声明通讯录所要实现的功能,第一次的功能可能考虑不全。没关系,可以在想要某个功能时再添加即可。

 	#define _CRT_SECURE_NO_WARNINGS 1
 	#ifndef __CONTACT_H_
 	#define __CONTACT_H_
 	 
 	#include<stdio.h>
 	#include<stdlib.h>
 	#include<string.h>
 	 
 	#define DEFAULT_SZ 3//初始通讯录大小
 	 
 	enum CHOOSE//选择功能
 	{
 	     EXIT,
 	     ADD,
 	     DEL,
 	     SHOW,
 	     FIND,
 	     SORT,
 	     MODIFY,
 	};
 	typedef struct CONTACT//结构体:每个成员的信息
 	{
 	     char name[20];
 	     int age;
 	     char phone[12];
 	}PeoInfo;
 	 
 	typedef struct Contact//结构体:将成员信息封装
 	{
 	     PeoInfo* data; //柔性指针
 	     int count; //当前个数
 	     int capacity;//最大容量
 	}Contact, *pContact;
 	 
 	//通讯录的主要功能
 	void AddCintact(pContact pc);//增加信息
 	void InitContact(pContact pc);//初始化通讯录
 	void ShowContact(pContact pc);//展示通讯录
 	void DelContact(pContact pc);//删除通讯录
 	void FindContact(pContact pc);//查找
 	void DestroyContact(pContact pc);//销毁通讯录
 	void ModifyContact(pContact pc);//修改通讯录信息
 	void SortContact(pContact pc);//排序通讯录
 	 
 	#endif //CONTACT

2.接下来就是通讯录的选择界面

main.c

里面主要是该通讯录的选择界面。

 	#include"Contact.h"
 	#include"bubble_sort.h"
 	 
 	void menu()
 	{
 	     int choose = 0;
 	     printf("+-------------------------------+\n");
 	     printf("| 1.Add 2.Del |\n");
 	     printf("| 3.Show 4.Find |\n");
 	     printf("| 5.Sort 6.Modify |\n");
 	     printf("| 0.Exit |\n");
 	     printf("+-------------------------------+\n");
 	}
 	 
 	int main()
 	{
 	     int choose = 0;
 	     Contact my_con;
 	     InitContact(& my_con);
 	     do
 	     {
 	     menu();
 	     printf("请选择要进行的操作:\n");
 	     scanf_s("%d", & choose);
 	     switch (choose)
 	     {
 	     case ADD:
 	         AddContact(& my_con);
 	         break;
 	     case DEL:
 	         DelContact(& my_con);
 	         break;
 	     case SHOW:
 	         ShowContact(& my_con);
 	         break;
 	     case FIND:
 	         FindContact(& my_con);
 	         break;
 	     case SORT:
 	         SortContact(& my_con);
 	         break;
 	     case MODIFY:
 	         ModifyContact(& my_con);
 	         break;
 	     case EXIT:
 	         DestroyContact(& my_con);
 	         break;
 	     default:
 	         printf("请重新选择!\n");
 	         break;
 	     }
 	 
 	     } while (choose);
 	 
 	     system("pause");
 	     return 0;
 	}

3.剩下的就是通讯录主要函数的具体实现

test.c

 	#include"Contact.h"
 	#include"bubble_sort.h"
 	 
 	void InitContact(pContact pc)//初始化通讯录
 	{
 	     pc->count = 0;
 	     pc->capacity = DEFAULT_SZ;
 	     pc->data =(PeoInfo *) calloc(sizeof(PeoInfo),pc->capacity);
 	}
 	 
 	void check_capacity(pContact pc)//检查通讯录空间
 	{
 	 
 	     PeoInfo* p = (PeoInfo *)realloc(pc->data, (pc->capacity + 2)*sizeof(PeoInfo));
 	     if (p != NULL)
 	     {
 	     pc->data = p;
 	     p = NULL;
 	     }
 	     pc->capacity += 2;
 	     printf("增容成功!\n");
 	}
 	 
 	void AddContact(pContact pc)//增加信息
 	{
 	     char c = 0;
 	     if (pc->count == pc->capacity)
 	     {
 	     printf("通讯录已满!\n");
 	     printf("请问是否增容:(Y \\ N)\n");
 	     getchar();
 	     scanf("%c", & c);
 	     if (c == 'Y')
 	     {
 	         check_capacity(pc);
 	     }
 	     else
 	     {
 	         return;
 	     }
 	     }
 	     printf("请输入名字:");
 	     scanf("%s", pc->data[pc->count].name);
 	     printf("请输入年龄:");
 	     scanf("%d", & (pc->data[pc->count].age));
 	     printf("请输入电话:");
 	     scanf("%s", pc->data[pc->count].phone);
 	     pc->count++;
 	     printf("添加成功!\n");
 	}
 	 
 	void ShowContact(pContact pc)//展示通讯录
 	{
 	     int i = 0;
 	     if (pc->count == 0)
 	     {
 	     printf("通讯录为空!\n");
 	     return;
 	     }
 	     printf("%7s %5s %10s\n","姓名","年龄","电话");
 	     for (i = 0; i < pc->count; i++)
 	     {
 	     printf("%7s %5d %10s\n", pc->data[i].name, pc->data[i].age, pc->data[i].phone);
 	     }
 	     printf("--------------------------\n");
 	}
 	 
 	int FindEntry(char name[],pContact pc)//查找
 	{
 	     int i = 0;
 	     for (i = 0; i < pc->count; i++)
 	     {
 	     if (strcmp(pc->data[i].name, name) == 0)
 	     {
 	         return i;
 	     }
 	     }
 	     return -1;
 	}
 	 
 	void DelContact(pContact pc)//删除通讯录
 	{
 	     char name[20] = { 0 };
 	     int pos = 0;
 	     int i = 0;
 	     if (pc->count == 0)
 	     {
 	     printf("通讯录为空!\n");
 	     return ;
 	     }
 	     //1.查找
 	     printf("要查找的人的名字:");
 	     scanf("%s", name);
 	     pos = FindEntry(name,pc);
 	     if (pos == -1)
 	     {
 	     printf("要删除的人不存在!\n");
 	     return ;
 	     }
 	     //2.删除
 	     for (i = pos; i < pc->count-1;i++)
 	     {
 	     pc->data[i] = pc->data[i + 1];
 	     }
 	     pc->count--;
 	     printf("删除成功!\n");
 	}
 	 
 	void FindContact(pContact pc)//查找
 	{
 	     int n = 0;
 	     char name[20] = { 0 };
 	     printf("请输入要查找的人名:\n");
 	     scanf("%s", name);
 	     n = FindEntry(name,pc);
 	     if (n >= 0)
 	     {
 	     printf("%s %d %s\n", pc->data[n].name, pc->data[n].age, pc->data[n].phone);
 	     }
 	     else if (n = -1)
 	     {
 	     printf("查无此人!\n");
 	     }
 	}
 	 
 	void DestroyContact(pContact pc)//销毁通讯录
 	{
 	     free(pc->data);
 	     pc->data = NULL;
 	     pc->count = 0;
 	     pc->capacity = 0;
 	     printf("成功销毁!\n");
 	}
 	 
 	void ModifyContact(pContact pc)//修改通讯录信息
 	{
 	     char name[20] = { 0 };
 	     int n = 0;
 	     printf("请输入要修改的人名:\n");
 	     scanf("%s", name);
 	     if (n >= 0)
 	     {
 	     n = FindEntry(name, pc);
 	     printf("请输入名字:");
 	     scanf("%s", pc->data[n].name);
 	     printf("请输入年龄:");
 	     scanf("%d", & (pc->data[n].age));
 	     printf("请输入电话:");
 	     scanf("%s", pc->data[n].phone);
 	     }
 	     else
 	     {
 	     printf("查无此人!\n");
 	     }
 	     printf("修改成功!\n");
 	}
 	 
 	//通讯录的排序
 	void Menu()
 	{
 	     printf("请选择按照何种方式排序:\n");
 	     printf("1.姓名 2.年龄 \n");
 	     printf(" 0.exit \n");
 	}
 	void SortContact(pContact pc)
 	{
 	     int input = 0;
 	     Menu();
 	     scanf("%d", & input);
 	     switch (input)
 	     {
 	     case 1:
 	         bubble_sort(pc->data,pc->count, sizeof(PeoInfo),cmp_name);
 	         break;
 	     case 2:
 	         bubble_sort(pc->data, pc->count, sizeof(PeoInfo), cmp_age);
 	         break;
 	     case 0:
 	         break;
 	     default:
 	         printf("请重新选择!\n");
 	     }
 	     printf("排序成功!\n");
 	}

4.可以发现,上面我们的通讯录的排序函数还没有具体实现。这里用冒泡排序实现。

bubble_sort.h

 	#ifndef __BUBBLESORT_H_
 	#define __BUBBLESORT_H_
 	 
 	#include<stdlib.h>
 	#include<stdio.h>
 	 
 	void bubble_sort(void * base, int sz, int width, int(*cmp)(const void* e1, const void *e2));
 	void swap(char *buf1, char *buf2, int width);
 	int cmp_name(const void *e1, const void *e2);
 	int cmp_age(const void *e1, const void *e2);
 	 
 	#endif //__BUBBLESORT_H__

bubble.c

 	#include"bubble_sort.h"
 	#include"Contact.h"
 	 
 	void swap(char *buf1, char *buf2, int width)
 	{
 	     int i = 0;
 	     for (i = 0; i < width; i++)
 	     {
 	     char tmp = *buf1;
 	     *buf1 = *buf2;
 	     *buf2 = tmp;
 	     buf1++;
 	     buf2++;
 	     }
 	 
 	}
 	 
 	int cmp_name(const void *e1, const void *e2)
 	{
 	     return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
 	}
 	 
 	int cmp_age(const void *e1, const void *e2)
 	{
 	     return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
 	}
 	 
 	void bubble_sort(void * base, int sz, int width, int(*cmp)(const void* e1, const void *e2))
 	{
 	     int i = 0;
 	     int j = 0;
 	     for (i = 0; i < sz - 1; i++)
 	     {
 	     for (j = 0; j < sz - 1 - i; j++)
 	     {
 	         if (cmp((char*)base+width*j, (char*)base+width*(j+1))>0)
 	         {
 	         //交换
 	         swap((char *)base + width*j, (char*)base + width*(j + 1),width);
 	         }
 	     }
 	     }
 	 
 	}

以上就是通讯录的大概步骤了,希望可以帮到大家!

标签

发表评论