目录
- 一、本通讯录要实现的功能
- 三、程序编写
- 四、完整程序
一、本通讯录要实现的功能
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
通讯录可执行的操作如下:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
二、通讯录初步准备:
1.创建一个.c文件,编写主函数main;
2.再创建一个.c文件,用于集中存放1中的.c文件所使用到的自定义函数;
3.创建一个.h头文件,用于申明1中的.c文件所使用到的函数。
如下图:
三、程序编写
下文将介绍程序的编写思路:
步骤1、首先根据通讯录所包含的信息要求,在头文件中构造结构体PeoIfo,即通讯录要求包含的信息;再构造结构体contact用于储存多个联系人。(注:本段代码使用#define是因为整个程序中会多次用到这些数值,通过#define的方式若后期要修改值,不需要通篇去修改。)
#define MAX 100 #define nameMAX 20 #define sexMAX 10 #define telMAX 20 #define adrMAX 20 struct PeoIfo { char name[nameMAX]; char sex[sexMAX]; int age; char tel[telMAX]; char adr[adrMAX]; }; struct contact { struct PeoIfo data[MAX]; int sz; };
步骤2、在第一个.c文件中写主函数main(),对步骤1中所构造的结构体进行初始化,初始化函数次数命名为InitContact(&con)。(注:此处段代码需要引用头文件“contact.h”)
#include"contact.h" int main() { int input = 0; struct contact con; //初始化 InitContact(&con); return 0; }
步骤3、在头文件中申明初始化函数
//初始化 void InitContact(struct contact* pc);
步骤4、再另外一个.c文件中编写该初始化函数,使其实现初始化功能。
//初始化 void InitContact(struct contact* pc) { pc->sz = 0; memset(pc->data, 0, MAX * sizeof(struct PeoIfo)); }
步骤5、回到主函数main()中。编写程序菜单menu(),再编写Switch语句,对应菜单中的选项。此处以1.add为例,1.add选项为增加联系人。
#include"contact.h" void menu() { printf("*****************************\n"); printf("****1.add 2.del ****\n"); printf("****3.search 4.modify ****\n"); printf("****5.show 6.empty ****\n"); printf("****7.sort 0.exit ****\n"); printf("*****************************\n"); } int main() { int input = 0; struct contact con; //初始化 InitContact(&con); do { menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: add(&con); break; case 2: del(&con); break; case 3: search(&con); break; case 4: modify(&con); break; case 5: show(&con); break; case 6: InitContact(&con);//直接给他初始化不就清空了。 break; case 7: Sort(&con); break; case 0: printf("已退出通讯录。\n"); break; default: printf("输入错误,请重新输入:\n"); break; } } while (input); return 0; }
步骤6、在.h头文件中申明函数
//添加联系人 void add(struct contact* pc);
步骤7、在另外一个.c文件中,对add函数编写,使其达到添加联系人的功能。此处介绍一下
pc->data[pc->sz].name的含义,pc->data[i],对data中的第i个联系人的结构体PeoIfo进行解引用,.name便是指该联系人的姓名。该段代码末尾pc->sz++,是指联系人+1。
//添加联系人 void add(struct contact* pc) { if (pc->sz >= MAX) { printf("通讯录已满。\n"); return; } printf("请输入姓名\n"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别\n"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄\n"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入电话\n"); scanf("%s", pc->data[pc->sz].tel); printf("请输入住址\n"); scanf("%s", pc->data[pc->sz].adr); pc->sz++; }
步骤8、同理重复步骤6、7,实现剩余的删除、查找等功能。此处不一一赘述,读者在学会add的编写之后,建议独自进行其他功能的函数实现思考。
四、完整程序
1、主函数所在的.c文件原码
#include"contact.h" void menu() { printf("*****************************\n"); printf("****1.add 2.del ****\n"); printf("****3.search 4.modify ****\n"); printf("****5.show 6.empty ****\n"); printf("****7.sort 0.exit ****\n"); printf("*****************************\n"); } int main() { int input = 0; struct contact con; //初始化 InitContact(&con); do { menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: add(&con); break; case 2: del(&con); break; case 3: search(&con); break; case 4: modify(&con); break; case 5: show(&con); break; case 6: InitContact(&con);//直接给他初始化不就清空了。 break; case 7: Sort(&con); break; case 0: printf("已退出通讯录。\n"); break; default: printf("输入错误,请重新输入:\n"); break; } } while (input); return 0; }
2、.h头文件原码
#define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h> #define MAX 100 #define nameMAX 20 #define sexMAX 10 #define telMAX 20 #define adrMAX 20 struct PeoIfo { char name[nameMAX]; char sex[sexMAX]; int age; char tel[telMAX]; char adr[adrMAX]; }; struct contact { struct PeoIfo data[MAX]; int sz; }; //初始化 void InitContact(struct contact* pc); //添加联系人 void add(struct contact* pc); //删除联系人 void del(struct contact* pc); //查找联系人 void search(struct contact* pc); //修改联系人 void modify(struct contact* pc); //展示通讯录 void show(struct contact* pc); //清空通讯录 void empty(struct contact* pc); //按姓名排序 void Sort(struct contact* pc);
3、自定义函数所在的.c文件原码
#include"contact.h" //打印项目 void pri() { printf("%-15s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址"); } //查找联系人的位置 int FindPOS(const struct contact* pc,char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (0==strcmp(pc->data[i].name, name) ) { return i; } } return -1; } //初始化 void InitContact(struct contact* pc) { pc->sz = 0; memset(pc->data, 0, MAX * sizeof(struct PeoIfo)); } //添加联系人 void add(struct contact* pc) { if (pc->sz >= MAX) { printf("通讯录已满。\n"); return; } printf("请输入姓名\n"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别\n"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄\n"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入电话\n"); scanf("%s", pc->data[pc->sz].tel); printf("请输入住址\n"); scanf("%s", pc->data[pc->sz].adr); pc->sz++; } //删除联系人 void del(struct contact* pc) { printf("请输入要删除的联系人姓名:\n"); char delname[nameMAX]; scanf("%s", &delname); int ret=FindPOS(pc, delname); if (-1 == ret) { printf("要删除的联系人不存在\n"); } else { int i = 0; for (i = ret; i < pc->sz - 1; i++) { pc->data[ret] = pc->data[ret + 1]; } pc->sz--; printf("删除成功\n"); } } //查找联系人 void search(struct contact* pc) { char sechname[nameMAX]; printf("请输入要找的联系人:\n"); scanf("%s", &sechname); int ret = FindPOS(pc, sechname); if (-1 == ret) { printf("找不到联系人\n"); return; } pri(); printf("%-15s\t%-10s\t%-10d\t%-10s\t%-20s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].tel, pc->data[ret].adr); } //修改联系人 void modify(struct contact* pc) { printf("请输入要修改的联系人姓名:\n"); char moname[nameMAX]; scanf("%s", &moname); int ret = FindPOS(pc, moname); if (-1 == ret) { printf("没有找到联系人\n"); } else { printf("请输入姓名\n"); scanf("%s", pc->data[ret].name); printf("请输入性别\n"); scanf("%s", pc->data[ret].sex); printf("请输入年龄\n"); scanf("%d", &(pc->data[ret].age)); printf("请输入电话\n"); scanf("%s", pc->data[ret].tel); printf("请输入住址\n"); scanf("%s", pc->data[ret].adr); } } //展示通讯录 void show(struct contact* pc) { pri(); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-15s\t%-10s\t%-10d\t%-10s\t%-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tel, pc->data[i].adr); } } //按姓名排序 int compare(void* s1, void* s2) { return strcmp(((struct PeoIfo*)s1)->name, ((struct PeoIfo*)s2)->name); } void Sort(struct contact* pc) { qsort(pc->data, pc->sz, sizeof(struct PeoIfo), compare); }
以上就是C语言实现制作通讯录(新手推荐)的详细内容,更多关于C语言通讯录的资料请关注自由互联其它相关文章!