摘要:因此,我们可以将联系人信息和通讯录中已有联系人信息保存在一个结构体中,这样后面操作我们就不用每次传入两个变量,即联系人信息和当前有效信息个数。
目录
经过一段c语言的学习,我们可以尝试着写一个简单的通讯录,并实现简单的功能。
首先我们需要初始化一个通讯录,因为每个通讯录的联系人都会包括姓名、年龄、性别、电话、地址这五个,因此我们构建一个联合体:
//描述人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};
但是在增加联系人的时候,我们必须知道通讯录中的联系人是否数量已经达到上限,如果达到上限,则无法添加联系人。
因此,我们可以将联系人信息和通讯录中已有联系人信息保存在一个结构体中,这样后面操作我们就不用每次传入两个变量,即联系人信息和当前有效信息个数。
//通讯录struct Contact { struct PeoInfo data[MAX];//1000个人信息放在data数组中 int sz;//记录当前通讯录有效信息个数};
定义好变量之后,我们要将通讯录初始化,即将里面起始人个数设置为0
void InitContact(struct Contact* pc){ pc->sz = 0;//默认没有信息 memset(pc->data, 0, sizeof(pc->data));}
这里我们用到了memset函数,而这里需要引用的库函数的头文件我们在后面指出。
在增加联系人之前,我们必须先判断通讯录中联系人数量是否已满,如果满了,达到上限,我们则无法添加,最后我们一定要sz+1.
void AddContact(struct Contact* pc){ //增加一个人的联系信息 if (pc->sz == MAX) { printf("通讯录满了/n"); } else { printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); printf("添加成功/n"); pc->sz++; }}
首先,我们要先输入被删联系人的名字,并在通讯录中查找是否存在此人的名字。因为后面我们还要使用查找联系人这个功能,因此我们在这里构建一个函数:
如果找到了此人,我们删除此联系人的方法有两种
方法一:我们用待删除联系人后面的联系人的信息对其前面的信息进行逐一覆盖
方法二:我们找到要删除的联系人之后,用最后一个人的信息覆盖要删除的联系人信息。
上面两种方法中,第二种方法显然移动次数更少,但我们还是选择第一种方法,因为第二种方法会改变联系人的先后顺序,最后记得要sz-1
int Fidname(char name[NAME_MAX], const struct Contact * pc){ //查找要删除的联系人名字的下标 int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i;//找到了返回下标 } else return -1;//找不到的情况 }}void DelContact(struct Contact* pc){ //删除一个联系人的信息 char name[NAME_MAX]; printf("请输入要删除联系人的姓名:>"); scanf("%s", name); //查找名字 int pos = Findname(name, pc);//找到了返回下标 if (pos == -1) { printf("查无此人/n"); } else { int j = 0; for (j = pos; j < pc->sz - 1; j++) { pc->data[j] = pc->data[j+1]; } printf("删除成功/n"); pc->sz - 1;//通讯录中联系人信息-1 }}
我们先输入要查找的联系人名字,找到之后将其打印
void SearchContact(const struct Contact *pc){ //查找联系人并打印信息 char name[NAME_MAX]; printf("请输入要查找的联系人姓名/n"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("查无此人/n"); } else { //打印该联系人的全部内容 printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); printf("%15s/t%5d/t%8s/t%15s/t%30s/n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }}
先输入要修改的联系人名字,找到之后将其修改就行
void ModifyContact(struct Contact* pc){ //修改指定的联系人信息 char name[NAME_MAX]; printf("请输入要查找的联系人姓名/n"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("查无此人/n"); } else { printf("请输入姓名/n"); scanf("%s", pc->data[pos].name); printf("请输入年龄/n"); scanf("%d", pc->data[pos].age); printf("请输入性别/n"); scanf("%s", pc->data[pos].sex); printf("请输入电话/n"); scanf("%s", pc->data[pos].tele); printf("请输入地址/n"); scanf("%s", pc->data[pos].addr); printf("修改成功/n"); }//就是将该联系人信息重新录入}
首先我们遍历数组data[1000]中的所有元素,之后循环sz次,打印数组所有信息
void ShowContact(struct Contact* pc){ //显示所有的联系人 printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%15s/t%5d/t%8s/t%15s/t%30s/n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); }}
使用qsort函数进行排序
//先实现一个冒泡排序函数int Comname(const void* e1, const void* e2){ return strcmp((const char*)e1, (const char*)e2);}void SortContact(struct Contact* pc){ //通过名字排序通讯录中联系人的先后顺序 qsort(pc->data, pc->sz, sizeof(struct PeoInfo), Comname);}
void Empty(struct Contact *pc){ pc->sz=0; return;}
首先我们创建一个test.c文件,实现简单的通讯录框架
#define _CRT_SECURE_NO_WARNINGS 1#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("***** 7. empty 0. exit **/n"); printf("*******************************/n");}enum Option{ EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT, Empty};int main(){ int input = 0; //创建一个通讯录 struct Contact con; //初始化通讯录 InitContact(&con); 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 SORT: SortContact(&con); break; case EMPTY: EmptyContact(&con) break; case EXIT: printf("退出通讯录/n"); default: printf("选择错误/n"); break; } } while (input); return 0;}
其次我们创建一个contact.h来存放函数的声明和一些库函数的头文件,以及结构体的定义
#pragma once#define NAME_MAX 30#define SEX_MAX 5#define TELE_MAX 12#define ADDR_MAX 30#define MAX 1000#include #include #include //描述人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};//通讯录struct Contact { struct PeoInfo data[MAX];//1000个人信息放在data数组中 int sz;//记录当前通讯录有效信息个数};//初始化通讯录void InitContact(struct Contact* pc);//增加联系人void AddContact(struct Contact*pc);//删除一个联系人的信息void DelContact(const struct Contact* pc);//查找联系人并打印信息void SearchContact(const struct Contact *pc);//修改指定联系人信息void ModifyContact(struct Contact* pc);//显示所有的联系人void ShowContact(struct Contact* pc);//通过名字排序通讯录中联系人的先后顺序void SortContact(struct Contact* pc);//清空所有联系人void Empty(struct Contact *pc)
最后我们创建一个contact.c文件来写出对头文件中函数的具体实现
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void InitContact(struct Contact* pc){ pc->sz = 0;//默认没有信息 memset(pc->data, 0, sizeof(pc->data));}void AddContact(struct Contact* pc){ //增加一个人的联系信息 if (pc->sz == MAX) { printf("通讯录满了/n"); } else { printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); printf("添加成功/n"); pc->sz++; }}int Fidname(char name[NAME_MAX], const struct Contact * pc){ //查找要删除的联系人名字的下标 int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i;//找到了返回下标 } else return -1;//找不到的情况 }}void DelContact(struct Contact* pc){ //删除一个联系人的信息 char name[NAME_MAX]; printf("请输入要删除联系人的姓名:>"); scanf("%s", name); //查找名字 int pos = Findname(name, pc);//找到了返回下标 if (pos == -1) { printf("查无此人/n"); } else { int j = 0; for (j = pos; j < pc->sz - 1; j++) { pc->data[j] = pc->data[j+1]; } printf("删除成功/n"); pc->sz - 1;//通讯录中联系人信息-1 }}void SearchContact(const struct Contact *pc){ //查找联系人并打印信息 char name[NAME_MAX]; printf("请输入要查找的联系人姓名/n"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("查无此人/n"); } else { //打印该联系人的全部内容 printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); printf("%15s/t%5d/t%8s/t%15s/t%30s/n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }}void ModifyContact(struct Contact* pc){ //修改指定的联系人信息 char name[NAME_MAX]; printf("请输入要查找的联系人姓名/n"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("查无此人/n"); } else { printf("请输入姓名/n"); scanf("%s", pc->data[pos].name); printf("请输入年龄/n"); scanf("%d", pc->data[pos].age); printf("请输入性别/n"); scanf("%s", pc->data[pos].sex); printf("请输入电话/n"); scanf("%s", pc->data[pos].tele); printf("请输入地址/n"); scanf("%s", pc->data[pos].addr); printf("修改成功/n"); }//就是将该联系人信息重新录入}void ShowContact(struct Contact* pc){ //显示所有的联系人 printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%15s/t%5d/t%8s/t%15s/t%30s/n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); }}//先实现一个冒泡排序函数int Comname(const void* e1, const void* e2){ return strcmp((const char*)e1, (const char*)e2);}void SortContact(struct Contact* pc){ //通过名字排序通讯录中联系人的先后顺序 qsort(pc->data, pc->sz, sizeof(struct PeoInfo), Comname);}void Empty(struct Contact *pc){ pc->sz=0; return;}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/120807.html
摘要:准备数据结构这个以对一个简单的通讯录进行插入查询更新删除记录为例,中包含和两个字段下载还没出官方的驱动包,是现在比较流行的第三方包,能找到的相关资料也比较多。准备实现对的增删改查操作,先想了下怎么写测试案例。查找,通过查找该条记录。 环境声明:go version go1.11MongoDB server version 4.0.3 背景 这是我第一次接触golang和MongoDB,...
摘要:本篇文章将用语言代码实现一个通讯录管理系统,本片文章博主将会运用到架构提,枚举,动态内存开辟和文件操作等。这里存放数据的结构是线性表。这个指针就可以通过动态开辟内存来调整存放信息的大小。扩容成功这样就实现了检查通讯录是否需要扩容的函数。 ...
摘要:文章目录前言前言一建立文件二编写函数三调试运行四成果展示五代码汇总总结前言通讯录是我们日常手机中常见的功能之一,综合语言中结构体,循环,条件语句,动态内存分配等等知识点,我们对手机通讯录进行一个简单的实现,下面我们开始讲解准备工作利用语 文章目录 前言一、建立文件二、编写函数三、调试运...
❤️C语言通讯录管理系统(简易版)❤️ ?一、通讯录?二、菜单实现和用户交互?三、主函数⭐️⭐️1.enum选项⭐️⭐️2.switch判断 ?四、定义联系人和通讯录⭐️⭐️1.定义联系人结构体⭐️⭐️2.定义通讯录结构体⭐️⭐️3.定义结构体变量 ?五、通讯录初始化?六、新增联系人?七、查找联系人?八、删除联系人?九、修改联系人?十、查看所有联系人?十一、清空所有联系人?十二、以名字排序所有...
摘要:前言我们需要用语言模拟一个通讯录可以用来存储个人的信息每个人的信息包括姓名电话性别住址年龄功能包括新增联系人查找联系人删除联系人修改联系人查看所有联系人以名字排序所有联系人注此版本不包含其他内容,后续会出更加全面的升级版本通讯录语言简易版 前言: 我们需要用C语言模拟一个通讯录可以用来存...
阅读 3061·2021-10-27 14:16
阅读 2875·2021-09-24 10:33
阅读 2283·2021-09-23 11:21
阅读 3226·2021-09-22 15:14
阅读 810·2019-08-30 15:55
阅读 1672·2019-08-30 15:53
阅读 1739·2019-08-29 11:14
阅读 2188·2019-08-28 18:11