c语言实现通讯录(静态)
本人第一次写博客,如有不好的地方,请见谅
目录
实现通讯录,
1.存放1000人的信息
2, 每个人的信息包含(名字,年龄,性别,电话,地址),结构体
3,增加人的信息
4,删除人的信息
5,修改人的信息
6,查找指定人的信息
7,排序人的信息
后续会发布动态版的通讯录
typedef struct peoinfo//一个人的信息 { char name[max_name];//[]里面的改麻烦,所以在上面定义 char sex[max_sex]; int age; char tele[max_tele]; char addr[max_addr]; }peoinfo;//重新起个名字就叫peoinfo
同时在上方定义一些变量,以便后续修改
#define max_name 20 #define max_sex 10 #define max_tele 12 #define max_addr 30 #define max 1000
void menu() { printf("******************************\n"); printf("***1,add 2,dele***********\n"); printf("***3,search 4,modify*********\n"); printf("***5,sort 6,print**********\n"); printf("************0,exit************\n"); }
enum option//使用枚举让case中更加显而易见 { exit, add, dele, search, modify, sort, print };
int main() { //使用增删查改,多样化实现,可以使用菜单 int input; //创建通讯录 //peoinfo data[max];//每次使用peoinfo都要加struct比较麻烦 //int sz = 0;可以将两者结合,使用一个结构体变量 contact con; //初始化通讯录的函数 initcontact(&con);//会改变应该要传递地址 do { menu(); printf("请选择"); scanf("%d", &input); switch (input) { case add: //增加人的信息,总得知道当前通讯录有几个信息,要知道通讯录中当前总共有几个元素 addcontact(&con);//会改变con用传地址 break; case dele: delcontact(&con);//也会改变通讯录,因此传地址 break; case search: searchcontact(&con); break; case modify: modifycontact(&con); break; case sort: break; case print: printcontact(&con);//把通讯录里面相关信息打印出来不会改变,但是传地址效率更高 break; case exit: printf("退出通讯录"); break; default: printf("选择错误"); break; } } while (input); return 0; }
对其中进行实现
1.实现通讯录多个人的信息,放在contact.h里面
typedef struct contact//再重新定义一下,多个人的信息 { peoinfo data[max];//可以存放添加进来的人的信息 int sz;//记录当前通讯录中有多少人的信息,即有效信息的个数 }contact;
contact.c
均在这里面对函数进行实现
2.初始化通讯录
void initcontact(contact* pc) { pc->sz = 0; //memset()内存设置,把data数组中每一个字节初始化为0 memset(pc->data, 0, sizeof(pc->data));//data数组名计算的是整个数组的大小 }
3.增加通讯录人的信息
void addcontact(contact* pc) { if (pc->sz == max) { printf("通讯录已满,无法添加"); return;//void无返回值,但是又要结束这个函数,写个return即可 } //增加一个人的信息 //把新的元素放到数组下表为sz的位置上去,只是一个元素 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); pc->sz++; printf("添加成功"); }
3.打印人的信息
void printcontact(const contact* pc) { //有sz个元素 int i = 0; //打印标题,再打应数据 printf("%-20s %-5s %-5s %-12s %-20s\n", "名字","年龄","性别","电话","地址");//左对齐,打印字 for (i = 0; i < pc->sz; i++) { printf("%-20s %-5d %-5s %-12s %-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } }
4.删除人的信息
static int findbyname(contact*pc, char name[])//不想给别人看到,用来修饰函数,其他源文件用不到 { //遍历数组 int i = 0; for (i = 0; i < pc->sz; i++) { if(strcmp(pc->data[i].name,name)==0)//说明两个名字相等,即找到了 return i; } return -1;//找不到的情况 } void delcontact(contact*pc) { char name[max_name]; //通讯录为空不能删除 if (pc->sz == 0) { printf("通讯录为空,无需删除\n"); return;//直接返回 } printf("请输入要删除人的名字"); scanf("%s", name); //删除的第一步是查找要删除的人,因此要把查找的功能独立的拎出来写 int pos=findbyname(pc, name);//通过名字查找,sz对应的数大于0,因此当pos=-1时,就没找到 //告诉有或没有 if (pos == -1) { printf("要删除的人不存在"); return;//不能继续往下走 } //存在即删除123456 //若要把3的位置删掉,只要把后面的每个元素都往前挪一个位置即可,3便不见了成12456,把下表为i+1的元素赋给i,后面变依次i++; int i; for (i = pos; i < pc->sz-1; i++) { pc->data[i] = pc->data[i + 1];//把i的位置变成i+1,但到sz时,后面是被一个空白所覆盖,因此没有必要,sz-1即可 } pc->sz--;//删除前几个元素,也剪掉也没有了 printf("删除成功"); }
5.查找人的信息
void searchcontact(contact*pc) { char name[max_name]; printf("请输入要查找人的名字"); scanf("%s", name); int pos = findbyname(pc, name);//通过名字查找,sz对应的数大于0,因此当pos=-1时,就没找到 //告诉有或没有 if (pos == -1) { printf("要查找的人不存在"); return; } else { printf("%-20s %-5d %-5s %-12s %-20s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } }
6.修改人的信息
void modifycontact(contact*pc) { //首先是查找 char name[max_name]; printf("请输入要修改人的名字"); scanf("%s", name); int pos = findbyname(pc, name);//通过名字查找,sz对应的数大于0,因此当pos=-1时,就没找到 //告诉有或没有 if (pos == -1) { printf("要修改的人不存在"); return; } 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].tele); printf("请输入地址"); scanf("%s", pc->data[pos].addr); printf("修改成功"); } }