通讯录
实现功能:
1.添加通讯录成员 2.删除通讯录成员 3.查找通讯录成员
4.修改通讯录成员信息 5.显示通讯录成员信息 6.清空所有联系人
7.以名字排序所有联系人
基本思想:
1.建立一个结构体数组存储通讯录中每个人的信息。
2.使用静态数组来对通讯录进行操作
这里们使用多文件编程,将各种声明和头文件放在test.h文件中,将函数的定义,主函数的框架放在test.c文件中
源码如下:
test.h
#ifndef __TEST_H__ #define __TEST_H__ #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<windows.h> #include<string.h> #include<assert.h> typedef struct LINKMAN//每个人的信息 { char name[20]; char sex[10]; int age; int tel[12]; char add[50]; }LINKMAN; typedef struct stu //把通讯录和人员统计放在结构体内 { LINKMAN num[1000]; int count; }stu; void menu();//菜单 void init_stu(stu *p);//初始化数组 void Add_stu(stu *p);// 添加联系人信息 void Dele_stu(stu *p);//删除指定联系人信息 void Find_stu(stu *p);//查找指定联系人信息 void Mod_stu(stu *p);//修改指定联系人信息 void Print_stu(stu *p);//显示所有联系人信息 void Empty_stu(stu *p);//清空所有联系人 void sort_stu(stu *p);//以名字排序所有联系人 #endif
test.c
#include"test.h" stu sta; //声明结构体 void menu()//菜单 { printf("***********************************\n"); printf("********1.添加联系人信息***********\n"); printf("********2.删除指定联系人信息*******\n"); printf("********3.查找指定联系人信息*******\n"); printf("********4.修改指定联系人信息*******\n"); printf("********5.显示所有联系人信息*******\n"); printf("********6.清空所有联系人***********\n"); printf("********7.以名字排序所有联系人*****\n"); printf("********0.退出程序*****************\n"); printf("***********************************\n"); } int Find(stu *p, char *name)//查找人员编号 { assert(p); int i = 0; for (i = 0; i < p->count; i++) { if (strcmp(p->num[i].name, name) == 0) { return i; } } return -1; } void init_stu(stu *p)//初始化信息 { assert(p); int count = sizeof(p->num); memset(p->num, 0, count); } void Add_stu(stu *p)//添加联系人 { assert(p); printf("请输入你要添加的联系人姓名:\n"); scanf("%s", p->num[p->count].name); printf("请输入你要添加的联系人性别:\n"); scanf("%s", p->num[p->count].sex); printf("请输入你要添加的联系人年龄:\n"); scanf("%d", &(p->num[p->count].age)); printf("请输入你要添加的联系人电话:\n"); scanf("%s", p->num[p->count].tel); printf("请输入你要添加的联系人地址:\n"); scanf("%s", p->num[p->count].add); if ((p->count) > 1000) { printf("通讯录已满!\n"); } else { printf("添加成功\n"); p->count++; } } void Dele_stu(stu *p)//删除联系人 { assert(p); int i = 0; char name[20] = { 0 }; printf("请输入要删除的姓名!\n"); scanf("%s", name); int num = Find(p, name); if (num == -1) { printf("没有找到!\n"); return; } for (i = num; i < p->count - 1; i++) { p->num[i] = p->num[i + 1];//采用直接循环覆盖的方式删除 } p->count--;//人员总数减一 printf("输出成功!\n"); } void Find_stu(stu *p)//查找联系人 { assert(p); printf("请输入你想查找的姓名!\n"); char name[20] = { 0 }; scanf("%s", name); int Num = Find(p, name); if (Num == -1) { printf("没有找到!\n"); return; } printf("%s\t", p->num[Num].sex); printf("%d\t", p->num[Num].age); printf("%s\t", p->num[Num].tel); printf("%s\t", p->num[Num].add); printf("\n"); } void Mod_stu(stu *p)//修改通讯录 { assert(p); int input = 0; printf("请输入要修改的联系人姓名!\n"); char name[20] = { 0 }; scanf("%s", name); int num = Find(p, name);//得到联系人姓名对应的数组编号 if (num == -1) { printf("没有找到!\n"); return; } printf("请输入修改信息!\n"); while (1) { printf("****1.sex 2.age ***\n"); printf("****3.tel 4.add ***\n"); printf("****5.Mod_OK*********\n"); scanf("%d", &input); switch (input) { case 1:printf("请输入修改后的性别!\n"); scanf("%s", p->num[num].sex); break; case 2:printf("请输入修改后的年龄!\n"); scanf("%d", &(p->num[num].age)); break; case 3:printf("请输入修改后的电话!\n"); scanf("%s", p->num[num].tel); break; case 4:printf("请输入修改后的地址!\n"); scanf("%s", p->num[num].add); case 5:return; break; default:printf("输入错误! 重新输入!\n"); break; } } } void Print_stu(stu *p)//打印通讯录 { assert(p); int i = 0; for (i = 0; i < p->count; i++) { printf("%s %s %d %s %s\n", p->num[i].name, \ p->num[i].sex, p->num[i].age, \ p->num[i].tel, p->num[i].add); } } void Empty_stu(stu *p)//清空通讯录 { assert(p); p->count = 0; } void sort_stu(stu *p) { assert(p); int i = 0, j = 0; LINKMAN temp; for (int i = 0; i < p->count - 1; i++) { for (int j = 0; j < p->count - i - 1; j++) { if (strcmp(p->num[j].name,p->num[j+1].name)>0) { temp = p->num[j]; p->num[j] = p->num[j + 1]; p->num[j + 1] = temp; } } } } int main() { int input = 0; init_stu(&sta);//初始化 while (1) { menu(); printf("请输入你的操作!\n"); scanf("%d", &input); switch (input) { case 1:Add_stu(&sta); break; case 2:Dele_stu(&sta); break; case 3:Find_stu(&sta); break; case 4:Mod_stu(&sta); break; case 5:Print_stu(&sta); break; case 6:Empty_stu(&sta); break; case 7:sort_stu(&sta); break; case 0:exit(1); break; default:printf("输入错误! 重新输入!\n"); break; } } system("pause"); return 0; }
以上就是实现通讯录的源码,方法十分简单,基本上没有采用什么难的知识点,但值得注意的是这里结构体传参时要传地址,以便节约空间,而且使用assrert断言会使代码变得更严谨一些。