第一步当然是先创建对应的头文件,函数实现文件,测试文件。
主函数
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"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");}int main(){ int input = 0; Contact con;//创建通讯录 //存放1000人的信息 //包含计数用的size //初始化通讯录 InitContact(&con); int sz = sizeof(con.date) / sizeof(con.date[0]); do { menu(); printf("请选择:>\n"); 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 SORT: SortContact(&con); break; case EXIT: printf("退出通讯录\n"); break; default: printf("非法输入,请重新输入\n"); break; } } while (input); return 0;}
这个通讯录里包含增删查改以及排序的功能,主要用到了结构体,因为我们在通讯录里存进一个人的信息要有,姓名,年龄,电话,住址,性别。所以创建一个结构体类型,叫联系人信息,里面包含以上信息
头文件
typedef struct PeoInfo{ int age; char name[MAX_NAME]; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR];}PeoInfo;
然后我们再创建一个结构体,里面包含若干联系人信息,并且有一个数字能够记录联系人的个数,如下
typedef struct Contact{ PeoInfo date[MAX];//能够存储1000个好友信息 int size;}Contact;
这些都在头文件中,当然还定义了各种细节的东西,其中会有注释
头文件如下
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAX 1000#define MAX_NAME 20#define MAX_SEX 5#define MAX_TELE 12#define MAX_ADDR 30typedef struct PeoInfo{ int age; char name[MAX_NAME]; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR];}PeoInfo;typedef struct Contact{ PeoInfo date[MAX];//能够存储1000个好友信息 int size;}Contact;enum Option{ EXIT, //0 ADD, //1 DEL, //2 SEARCH, //3 MODIFY, //4 SHOW, //5 SORT //6};void InitContact (Contact*);//初始化通讯录void AddContact (Contact*);//添加一位联系人void ShowContact (const Contact*);//打印通讯录void DelContact (Contact*);//删除一位联系人void SearchContact (const Contact*);//查找一位联系人void ModifyContact (Contact*);//修改一位联系人void SortContact (Contact*);//对联系人排序
包含了全局变量的声明,还有函数的声明,还有一个比较有意思的点,运用了枚举法,将主函数中的switch中的选项代替,这样就能更清晰的看到每一个选择对应的意思了,不用再阅读的时候还要上去看菜单
函数实现部分
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"/*查找功能找到了返回下标,没找到返回-1计入static使得该函数只能在这个源文件内部使用,避免与其他源文件内部产生冲突*/ static int find_by_name(Contact* ps, char name[MAX_NAME]){ int i = 0; for (i = 0; i < ps->size; i++) { if (0 == strcmp(name, ps->date->name)) { return i; } } return -1;}//通讯录的初始化void InitContact (Contact* ps){ //使用内存修改函数 memset(ps->date, 0, sizeof(ps->date)); ps->size = 0;}//增加一位好友信息void AddContact(Contact* ps){ if (ps->size>=MAX) { printf("通讯录已满\n"); } else { printf("请输入姓名:"); scanf("%s", ps->date[ps->size].name); printf("请输入性别:"); scanf("%s", ps->date[ps->size].sex); printf("请输入年龄:"); scanf("%d", &(ps->date[ps->size].age)); printf("请输入电话:"); scanf("%s", ps->date[ps->size].tele); printf("请输入住址:"); scanf("%s", ps->date[ps->size].addr); ps->size++; } printf("添加成功\n\a");}//打印通讯录中的信息void ShowContact(const Contact* ps){ if (ps->size == 0) { printf("通讯录为空\n"); } else { printf("%-20s\t%-10s\t%-5s\t%-20s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址"); int i = 0; for (i = 0; i < ps->size; i++) { printf("%-20s\t%-10s\t%-5d\t%-20s\t%-20s\n", ps->date[i].name, ps->date[i].sex, ps->date[i].age, ps->date[i].tele, ps->date[i].addr); } }}//删除一位制定联系人void DelContact(Contact* ps){ char name[MAX_NAME]; printf("请输入需要删除的联系人:\n"); scanf("%s", name); //先要找到需要删除的联系人 int pos = find_by_name(ps, name); if (pos==-1) { printf("不存在该联系人\n"); } else { //删除数据 int j = 0; for (j = pos; j < ps->size - 1; j++) { ps->date[j] = ps->date[j + 1]; } ps->size--; printf("删除成功\n\a"); }}//查找一位联系人void SearchContact(const Contact* ps){ printf("请输入一位联系人信息进行查找:"); char name[MAX_NAME]; scanf("%s", name); int pos = find_by_name(ps, name); if (-1 == pos) { printf("不存在该联系人\n\a"); } else { printf("%-20s\t%-10s\t%-5s\t%-20s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址"); printf("%-20s\t%-10s\t%-5d\t%-20s\t%-20s\n", ps->date[pos].name, ps->date[pos].sex, ps->date[pos].age, ps->date[pos].tele, ps->date[pos].addr); }}//修改一位联系人的信息void ModifyContact(Contact* ps){ char name[MAX_NAME]; printf("请输入想要修改的联系人:"); scanf("%s", name); int pos = find_by_name(ps, name); if (-1 == pos) { printf("不存在该联系人\a\n"); } else { printf("请输入姓名:"); scanf("%s", ps->date[pos].name); printf("请输入性别:"); scanf("%s", ps->date[pos].sex); printf("请输入年龄:"); scanf("%d", &(ps->date[pos].age)); printf("请输入电话:"); scanf("%s", ps->date[pos].tele); printf("请输入住址:"); scanf("%s", ps->date[pos].addr); } printf("修改成功\a\n");}//对联系人进行排序static int cmp_by_name(const void* e1, const void* e2){ return strcmp(((Contact*)e1)->date->name, ((Contact*)e2)->date->name);}void SortContact(Contact* ps){ qsort(ps, ps->size,sizeof(ps->date[0]) , cmp_by_name); ShowContact(ps);}
其中排序的函数全部由本人独立完成,其余的都是在老师的指导下,理解,完成的,然后对于qsort函数有了更深的理解,对于参数也有了更深的理解,其实自己写的时候还是试探了好几遍,参数改来改去,按照姓名首字母排序,最终完成。
目前的不足就是在程序退出之后,信息就会丢失,就像是一个一次性的通讯录,并不具备实用性,目前还没有相关的知识能够支撑我做出一个能存储在电脑上信息的通讯录,不过后期应该会学到。