- contact.h头文件
- contact.c 源文件
- main.c源文件
#pragma once #includecontact.c 源文件#include #include #include #define DEFAULT_SZ 3 #define NAME_MAX 20 #define SEX_MAX 2 #define TEL_MAX 12 #define ADDR_MAX 50 #define MAX 1000 typedef struct PersonInfo { //个人信息 char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tel[TEL_MAX]; char addr[ADDR_MAX]; }Per; typedef struct Contatc { //通信录 Per *data; //动态数组 int size; //通信录中含有的具体的有效元素 int capacity; //通信录的最大空间容量 }Con; void CheckCapacity(Con* pc); //扩容 void InitContact(Con *pc); //初始化通信录 void DestoryContact(Con *pc); //销毁通信录 void AddContact(Con *pc); //往通信录里添加个人信息 void SubContact(Con *pc); //删除通信录中某个人的个人信息 void ShowContact(Con *pc); //显示通信录中的所有个人的信息 void DelContact(Con* pc); //删除指定的练习人 void SearchContact(const Con *pc);//查找指定联系人 void ModifyContact(Con* pc); //修改指定联系人 void SaveContact(Con* pc); //保存信息到通信录中 void LoadContact(Con* pc); //加载文件中的信息到通讯录中
#include "contact.h" void CheckCapacity(Con *pc) { if (pc->size == pc->capacity) { //增加容量 Per* ptr = (Per*)realloc(pc->data, (pc->capacity + 2) * sizeof(Per)); if (ptr != NULL) { pc->data = ptr; pc->capacity += 2; printf("增容成功n"); } else { perror("通讯录增容失败"); exit(-1); } } } void LoadContact(Con* pc) { //打开文件 FILE* pf = fopen("E:contact.txt", "rb"); if (NULL == pf) { perror("LoadContact::fopen"); return; } //读文件 Per tmp = { 0 }; while (fread(&tmp, sizeof(Per), 1, pf)) { //空间如果不够的话,得增加空间 CheckCapacity(pc); pc->data[pc->size] = tmp; pc->size++; } //关闭文件 fclose(pf); pf = NULL; } void InitContact(Con* pc) { pc->size = 0; pc->data = (Per*)malloc(DEFAULT_SZ * sizeof(Per)); pc->capacity = DEFAULT_SZ;//3 //加载文件信息到通讯录中 LoadContact(pc); } //动态增长的版本 void AddContact(Con* pc) { CheckCapacity(pc); //录入新增人的信息 printf("请输入名字:>"); scanf("%s", pc->data[pc->size].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->size].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->size].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->size].tel); printf("请输入地址:>"); scanf("%s", pc->data[pc->size].addr); pc->size++; printf("增加成功n"); } void DestroyContact(Con* pc) { free(pc->data); pc->data = NULL; pc->capacity = 0; pc->size = 0; } void ShowContact(Con* pc) { int i = 0; printf("%15st%5st%8st%15st%30snn", "name", "age", "sex", "tele", "addr"); for (i = 0; i < pc->size; i++) { //打印每一个数据 printf("%15st%5dt%8st%15st%30sn", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tel, pc->data[i].addr); } } int FindContactByName(const Con* pc, const char*name) { int i = 0; for (i = 0; i < pc->size; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } //找不到了 return -1; } void DelContact(Con* pc) { if (pc->size == 0) { printf("通讯录为空,无法删除n"); return; } char name[NAME_MAX] = { 0 }; printf("请输入要删除人的名字:>"); scanf("%s", name); //查找 int pos = FindContactByName(pc, name); if (pos == -1) { printf("指定的联系人不存在n"); } else { //删除 int j = 0; for (j = pos; j < pc->size - 1; j++) { pc->data[j] = pc->data[j + 1]; } pc->size--; // printf("删除成功n"); } } void SearchContact(const Con* pc) { char name[NAME_MAX] = { 0 }; printf("输入要查找人的名字:>"); scanf("%s", name); int pos = FindContactByName(pc, name); if (-1 == pos) { printf("查无此人n"); } else { printf("%15st%5st%8st%15st%30snn", "name", "age", "sex", "tele", "addr"); printf("%15st%5dt%8st%15st%30sn", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tel, pc->data[pos].addr); } } void ModifyContact(Con* pc) { char name[NAME_MAX] = { 0 }; printf("输入要修改人的名字:>"); scanf("%s", name); int pos = FindContactByName(pc, name); if (-1 == pos) { printf("要修改的人不存在n"); } else { 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].tel); printf("请输入新的地址:>"); scanf("%s", pc->data[pos].addr); } } void SaveContact( Con* pc) { //打开文件 FILE* pf = fopen("contact.txt", "wb"); if (NULL == pf) { perror("SaveContact::fopen"); return; } //写数据 int i = 0; for (i = 0; i < pc->size; i++) { //fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf); fwrite(pc->data + i, sizeof(Per), 1, pf); } //关闭文件 fclose(pf); pf = NULL; }main.c源文件
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:4996)//禁止此类警告,警告代码为4996 #include "contact.h" void menu() { printf("******************************n"); printf("**** 1. add 2. del *****n"); printf("**** 3. search 4. modify****n"); printf("**** 5. show 6. sort ***n"); printf("**** 0. exit **n"); printf("******************************n"); } enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT }; int main() { int input = 0; //创建一个通讯录 Con con; //初始化通讯录 InitContact(&con); //最多可以放3个人的信息了 //空间不够可以增容 do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case ADD: AddContact(&con); break; case DEL: DelContact(&con); break; case SEARCH: SearchContact(&con); break; case MODIFY: ModifyContact(&con); break; case SHOW: ShowContact(&con); break; case EXIT: //保存信息 SaveContact(&con); //销毁通讯录 DestroyContact(&con); printf("退出通讯录n"); break; default: printf("选择错误n"); break; } } while (input); return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)