简单通讯录的实现
来源:互联网 发布:巴基斯坦 知乎 编辑:程序博客网 时间: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退出便生成一个文件,打开:
读者可以试一下其他功能。
阅读全文
0 0
- 通讯录的简单实现
- 通讯录的简单实现
- 通讯录的简单实现
- 简单通讯录的实现
- 简单通讯录的实现
- 手机通讯录的简单实现
- Python 实现简单的通讯录
- 实现简单功能的通讯录
- Android简单通讯录的实现
- 二叉排序树实现简单的通讯录
- 实现一个简单的通讯录
- c++实现简单的通讯录
- 简单的通讯录实现方法
- 简单静态通讯录的实现
- 简单的静态通讯录的实现。
- C语言实现的简单通讯录例子
- C语言实现简单的通讯录
- UI开发----简单通讯录的实现
- java泛型 泛型的内部原理:类型擦除以及类型擦除带来的问题
- C语言_标准I/O库
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(一)NOIP1998-NOIP1999
- LeetCode Weekly Contest 41解题思路
- HDU Today (最短路径+map)
- 简单通讯录的实现
- n-queens-ii
- “模板文件不存在,无法解析文档”的几种解决办法
- 计算时间函数使用(AddDays)与隐藏域
- 带有修饰词的内部类
- 乐曲创作
- Python安装jieba包,进行分词
- HBase是什么?
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(二)NOIP2000-NOIP2001