C语言通讯录
一零 柒 人气:0相信大家都见识过通讯录,通讯录里面一般有的内容为姓名,联系方式,年龄等信息。通讯录的主要功能有:增加、删除、查找、排序、修改、展示等操作。
那么具体应该用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); } } } }
以上就是通讯录的大概步骤了,希望可以帮到大家!
加载全部内容