通讯录(文本版)

xiaoxiao2021-02-28  18

与之前三子棋和扫雷一样,将实现函数先封装到头文件contact.h中,之后有两个源文件,test.c程序运行和contact.c的函数实现

Contact.h

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #ifndef _CONTACT_H__ #define _CONTACT_H__ #define DEFAULT_SZ 3 #define DEFAULT_INC 2 #define Max_name 20 #define Max_sex 10 #define Max_tel 12 #define Max_addr 20 #define FILENAME "contact.dat" typedef struct PeoInfo { char name[Max_name]; int age; char sex[Max_sex]; char tel[Max_tel]; char addr[Max_addr]; }PeoInfo; typedef struct Contact { PeoInfo *contact; //数据存放的位置 int capacity; //容量 int sz; }Contact,*pContact; void InitContact(pContact pcontact); void AddContact(pContact pcontact); void ShowContact(const pContact pcontact); void SearchContact(pContact pcontact); int FindContact(pContact pcontact,char name[]); void DelContact(pContact pcontact); void ModifyContact(pContact pcontact); void EmptyContact(pContact pcontact); void SortContact(pContact pcontact); void DistoryContact(pContact pcontact); int CheckContact(pContact pcontact); void LoadContact(pContact pcontact); void SaveContact(pContact pcontact); #endif //_CONTACT_H__

test.c

#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" enum SEL { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, EMPTY, SORT }; void menu() { printf("**********************************\n"); printf("***** 1.add 2.del ***\n"); printf("***** 3.search 4.modify ***\n"); printf("***** 5.show 6.empty ***\n"); printf("***** 7.sort 0.exit ***\n"); printf("**********************************\n"); } void test() { int i = 0; Contact my_contact; InitContact(&my_contact); do { menu(); printf("请输入:>"); scanf("%d",&i); switch(i) { case ADD: AddContact(&my_contact);break; case DEL: DelContact(&my_contact);break; case SEARCH: SearchContact(&my_contact);break; case MODIFY: ModifyContact(&my_contact);break; case SHOW: ShowContact(&my_contact);break; case EMPTY: EmptyContact(&my_contact);break; case SORT: SortContact(&my_contact);break; case EXIT: SaveContact(&my_contact); DistoryContact(&my_contact);break; default:printf("选择错误\n"); break; } } while (i); } int main() { test(); return 0; }

contact.c

#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" void _ADD(PeoInfo *tmp,pContact pcontact) { CheckContact(pcontact); pcontact->contact[pcontact->sz] = *tmp; pcontact->sz++; } void LoadContact(pContact pcontact) { PeoInfo tmp = {0}; int i = 0; FILE* pfin = fopen(FILENAME,"r"); if (pfin == NULL) { perror("open the file for read"); exit(EXIT_FAILURE); } while (fread(&tmp,sizeof(PeoInfo),1,pfin)) { _ADD(&tmp,pcontact); } fclose(pfin); } void SaveContact(pContact pcontact) { FILE* pfout = fopen(FILENAME,"w"); int i = 0; if (pfout == NULL) { perror("open the file for write"); exit(EXIT_FAILURE); } for (i=0; i<pcontact->sz; i++) { fwrite(pcontact->contact+i,sizeof(PeoInfo),1,pfout); } fclose(pfout); } void InitContact(pContact pcontact) { pcontact->sz = 0; pcontact->contact = (PeoInfo*)malloc(DEFAULT_SZ*sizeof(PeoInfo)); if (NULL == pcontact->contact) { perror("InitContact::malloc"); exit(EXIT_FAILURE); } memset(pcontact->contact,0,DEFAULT_SZ*sizeof(PeoInfo)); pcontact->capacity = DEFAULT_SZ; LoadContact(pcontact); } void DistoryContact(pContact pcontact) { free(pcontact->contact); pcontact->contact = NULL; pcontact->sz = 0; pcontact->capacity = 0; } int CheckContact(pContact pcontact) { if (pcontact->sz == pcontact->capacity) { PeoInfo* tmp = realloc(pcontact->contact, (pcontact->capacity+DEFAULT_INC)*sizeof(PeoInfo)); if (tmp!=NULL) { pcontact->contact = tmp; pcontact->capacity += DEFAULT_INC; printf("增容成功"); return 1; } else { return 0; } } return 1; } void AddContact(pContact pcontact) { CheckContact(pcontact); if (CheckContact(pcontact)==0) { return; } printf("请输入名字:>"); scanf("%s",pcontact->contact[pcontact->sz].name); printf("请输入年龄:>"); scanf("%d",&(pcontact->contact[pcontact->sz].age)); printf("请输入性别:>"); scanf("%s",pcontact->contact[pcontact->sz].sex); printf("请输入电话:>"); scanf("%s",pcontact->contact[pcontact->sz].tel); printf("请输入地址:>"); scanf("%s",pcontact->contact[pcontact->sz].addr); pcontact->sz++; printf("添加成功\n"); } void ShowContact(const pContact pcontact) { int i = 0; printf("%5s\t%5s\t%5s\ts\t s\t\n","Name","Age","Sex","Tel","Addr"); for (i=0;i<pcontact->sz;i++) { printf("%5s\t]\t%5s\ts\t s\t\n",pcontact->contact[i].name, pcontact->contact[i].age , pcontact->contact[i].sex , pcontact->contact[i].tel , pcontact->contact[i].addr); } } int FindContact(pContact pcontact,char name[]) { int i = 0; for (i=0;i<pcontact->sz;i++) { if (strcmp(name,pcontact->contact[i].name)==0) { return i; } } return -1; } void SearchContact(pContact pcontact) { int ret = 0; char name[Max_name] = {0}; printf("请输入需要查找的姓名:>"); scanf("%s",name); ret = FindContact(pcontact,name); if (ret == -1) { printf("不存在该联系人\n"); return; } printf("%5s\t%5s\t%5s\ts\t s\t\n","Name","Age","Sex","Tel","Addr"); printf("%5s\t]\t%5s\ts\t s\t\n",pcontact->contact[ret].name, pcontact->contact[ret].age , pcontact->contact[ret].sex , pcontact->contact[ret].tel , pcontact->contact[ret].addr); return ; } void DelContact(pContact pcontact) { int ret = 0; char name[Max_name] = {0}; printf("请输入需要删除人的姓名:>"); scanf("%s",name); ret = FindContact(pcontact,name); if (ret == -1) { printf("不存在该联系人\n"); return; } memmove(pcontact->contact+ret, pcontact->contact+ret+1, (pcontact->sz-ret-1)*sizeof(PeoInfo)); pcontact->sz--; printf("删除成功\n"); return ; } void ModifyContact(pContact pcontact) { int ret = 0; char name[Max_name] = {0}; printf("请输入需要修改人的姓名:>"); scanf("%s",name); ret = FindContact(pcontact,name); if (ret == -1) { printf("不存在该联系人\n"); return; } printf("请重新输入该联系人的信息:>"); printf("请输入名字:>"); scanf("%s",pcontact->contact[ret].name); printf("请输入年龄:>"); scanf("%d",&(pcontact->contact[ret].age)); printf("请输入性别:>"); scanf("%s",pcontact->contact[ret].sex); printf("请输入电话:>"); scanf("%s",pcontact->contact[ret].tel); printf("请输入地址:>"); scanf("%s",pcontact->contact[ret].addr); printf("修改成功\n"); printf("%5s\t%5s\t%5s\ts\t s\t\n","Name","Age","Sex","Tel","Addr"); printf("%5s\t]\t%5s\ts\t s\t\n",pcontact->contact[ret].name, pcontact->contact[ret].age , pcontact->contact[ret].sex , pcontact->contact[ret].tel , pcontact->contact[ret].addr); return; } void EmptyContact(pContact pcontact) { InitContact(pcontact); } void SortContact(pContact pcontact) { int i = 0; int j = 0; int count = 0; for (i=0; i<pcontact->sz-1; i++) { for (j=0; j<pcontact->sz-i-1; j++) { if (strcmp(pcontact->contact[j].name,pcontact->contact[j+1].name)==1) { PeoInfo tmp = pcontact->contact[j]; pcontact->contact[j] = pcontact->contact[j+1]; pcontact->contact[j+1] = tmp; count++; } } if (count!=0) { continue; } else return; } ShowContact(pcontact); }

转载请注明原文地址: https://www.6miu.com/read-1150107.html

最新回复(0)