简单通讯录的实现

来源:互联网 发布:巴基斯坦 知乎 编辑:程序博客网 时间:2024/06/05 15:26

                                简单通讯录的实现

首先我们需要考虑通讯录要实现什么功能,大概就需要添加,修改,显示,删除,排序和清除联系人信息,还有退出。也可以实现一下文件版的通讯录,只需要加入一些函数,以下为文件版的通讯录,读者可以根据需要自行删改一些函数。

文件版:

据此构建函数,头文件如下:

#ifndef __CONTACT_H__ #define __CONTACT_H__ #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <string.h>#include <stdlib.h>#include <assert.h>#define MAX 1000 #define NAME_MAX 20 #define SEX_MAX 5 #define ADDR_MAX 30 #define TELE_MAX 12 #define DEFAULT_SZ 3#define DEFAULT_INC 2#define FILENAME "contact.dat"enum{EXIT,ADD,SHOW,DEL,SEARCH,MODIFY,SORT,CLEAR};typedef struct PeoInfo{char name[NAME_MAX];int  age;char sex[SEX_MAX];char addr[ADDR_MAX];char tele[TELE_MAX];}PeoInfo;typedef struct Contact{PeoInfo *data;      //数据存储区域int sz;   int capacity;//联系人的个数}Contact, *pContact;//int find(pContact pcon);void Initcontact(pContact pcon);//初始化通讯录void Addcontact(pContact pcon);//添加void Showcontact(const pContact pcon);//显示void Delcontact(pContact pcon);//删除 void Searchcontact(pContact pcon);//查找void Modifycontact(pContact pcon);//修改void Sortcontact(pContact pcon);//排序void Clearcontact(pContact pcon);//清空void Destroycontact(pContact pcon);void Loadcontactdata(pContact pcon);void Savecontactdata(pContact pcon);void swap(PeoInfo* p1, PeoInfo* p2);void free_space(pContact pcon);#endif 

如何实现这些函数呢?为了增加可读性,将这些函数与主函数分别放在不同的目录下。(Contact.c)

#include "contact.h"void Checkcapacity(pContact pcon);void _Add(pContact pcon, PeoInfo *p){Checkcapacity(pcon);pcon->data[pcon->sz] = *p;pcon->sz++;}void Loadcontactdata(pContact pcon){FILE *pfin = fopen(FILENAME, "r");PeoInfo tmp = { 0 };while (fread(&tmp, sizeof(PeoInfo), 1, pfin)){_Add(pcon, &tmp);}}void Savecontactdata(pContact pcon){FILE *pfout = fopen(FILENAME, "w");int i = 0;if (pfout == NULL){perror("Savecontactdata::fopen");exit(1);}for (i = 0; i < pcon->sz; i++){fwrite(pcon->data + i, sizeof(PeoInfo), 1, pfout);}fclose(pfout);}void Initcontact(pContact pcon)                      {pcon->sz = 0;//memset(pcon->data, 0, MAX*sizeof(PeoInfo));pcon->data = malloc(DEFAULT_SZ*sizeof(PeoInfo));if (pcon->data == NULL){perror("use malloc");exit(EXIT_FAILURE);}memset(pcon->data, 0, DEFAULT_SZ*sizeof(PeoInfo));pcon->capacity = DEFAULT_SZ;}void Checkcapacity(pContact pcon){if (pcon->sz == pcon->capacity){PeoInfo *ptr = realloc(pcon->data, sizeof(PeoInfo)*(pcon->capacity + DEFAULT_INC));if (ptr == NULL){perror("use realloc");exit(EXIT_FAILURE);}else{pcon->data = ptr;}pcon->capacity += DEFAULT_INC;printf("增容成功\n");}}void Addcontact(pContact pcon)                      //增加联系人{assert(pcon);if (pcon->sz == MAX){printf("通讯录满了\n");return;}printf("请输入名字:>");scanf("%s", pcon->data[pcon->sz].name);printf("请输入年龄:>");scanf("%d", &(pcon->data[pcon->sz].age));printf("请输入性别:>");scanf("%s", pcon->data[pcon->sz].sex);printf("请输入地址:>");scanf("%s", pcon->data[pcon->sz].addr);printf("请输入电话:>");scanf("%s", pcon->data[pcon->sz].tele);pcon->sz++;printf("添加成功\n");}void Showcontact(const pContact pcon)  //显示联系人{//name age sex addr teleint i = 0;printf("%10s\t%5s\t%5s\t%20s\t%15s\n", "name", "age", "sex", "addr", "tele");for (i = 0; i < pcon->sz; i++){printf("%10s\t%2d\t%5s\t%20s\t%15s\n", pcon->data[i].name, pcon->data[i].age, pcon->data[i].sex, pcon->data[i].addr, pcon->data[i].tele);}}static int find(char *c, pContact pcon)                   //寻找需要人的信息{int i = 0;for (i = 0; i < pcon->sz; i++){if (strcmp(c, pcon->data[i].name) == 0){return i;}}return -1;}void Delcontact(pContact pcon)         //删除指定联系人的信息 {int i = 0;char name[NAME_MAX] = { 0 };printf("请输入需要删除的联系人姓名:");scanf("%s", name);int m = find(name, pcon);if (m != -1){for (; m < pcon->sz - 1; m++){pcon->data[m] = pcon->data[m + 1];}pcon->sz--;printf("删除成功\n");}elseprintf("对不起,没有你要删除的联系人\n");}void Searchcontact(pContact pcon)            //请输入你要查找的联系人姓名{int t = 0;char name[NAME_MAX];printf("请输入你要查找的联系人姓名:");scanf("%s", name);t = find(name, pcon);if (t != -1){printf("%s\t%2d\t%s\t%s\t%s\n", pcon->data[t].name,pcon->data[t].age, pcon->data[t].sex, pcon->data[t].addr, pcon->data[t].tele);}elseprintf("没有你要查找的联系人\n");}void Modifycontact(pContact pcon)                       //修改某联系人信息{int k = 0;char name[NAME_MAX];printf("请输入要修改的联系人姓名:\n");scanf("%s", name);k = find(name, pcon);if (k != -1){printf("姓名:");scanf("%s", pcon->data[k].name);printf("年龄:");scanf("%d", &pcon->data[k].age);printf("性别:");scanf("%s", pcon->data[k].sex);printf("地址:");scanf("%s", pcon->data[k].addr);printf("电话:");scanf("%s", pcon->data[k].tele);}elseprintf("你要修改的联系人不存在\n");}void Sortcontact(pContact pcon)                 //按姓名排序{int i = 0;int j = 0;for (i = 0; i < pcon->sz-1; i++){for (j = 0; j < pcon->sz - 1 - i; j++){if (strcmp(pcon->data[j].name, pcon->data[j + 1].name)>0){swap(&pcon->data[j],& pcon->data[j + 1]);}}}printf("排序成功\n");}void swap(PeoInfo *p, PeoInfo*q)        //交换两个联系人信息{PeoInfo temp =*p;*p = *q;*q = temp;}void Destroycontact(pContact pcon){free(pcon->data);pcon->data = NULL;pcon->capacity = 0;pcon->sz = 0;}void Clearcontact(pContact pcon) //清空联系人{pcon->sz = 0;}void free_space(pContact pcon){free(pcon->data);pcon->data = NULL;}

测试模块如下:
#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"void menu(){printf("*****************************\n");printf("***1.add          2.show*****\n");printf("***3.del          4.search***\n");printf("***5.modify       6.sort*****\n");printf("***7.clear        0.exit*****\n");printf("*****************************\n");}void test(){int input = 0;Contact pcon;//通讯录结构体数组  Initcontact(&pcon);do{menu();printf("请选择:");scanf("%d", &input);switch (input){case EXIT:Savecontactdata(&pcon);Destroycontact(&pcon);break;case ADD:Checkcapacity(&pcon);Addcontact(&pcon);//Checkcapacity(&pcon);            break;case SHOW:Showcontact(&pcon);break;case DEL:Delcontact(&pcon);break;case SEARCH:Searchcontact(&pcon);break;case MODIFY:Modifycontact(&pcon);break;case SORT:Sortcontact(&pcon);break;case CLEAR:Clearcontact(&pcon);break;default:break;}} while (input);}int main(){test();system("pause");return 0;}

运如界面如下:

按0退出便生成一个文件,打开:


读者可以试一下其他功能。


原创粉丝点击