C语言实现静态版通讯录的代码分享
博客小梦 人气:0前言
哈喽各位友友们,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!我仅已此文,手把手带领大家在学习C语言知识的同时,并实现一个静态版的通讯录!主要运用了结构体,一维数组,函数,分支与循环语句等等知识,以及分文件书写项目思想。都是精华内容,可不要错过哟!!!
通讯录设计的关键思想点分析
首先根据我们通讯录的业务需求设计好我们的个人信息结构体(PeoInfor)。这里设计的每一个人的信息包括:姓名,年龄,性别,电话,地址。然后就可以设计出我们具体的结构体啦!
为了方便后面代码的设计传参,这里再设计一个结构体(Contact),包括能够存放1000个通讯信息的空间和sz记录通讯录中信息的条数。
先设计好通讯录需要完成什么功能,这里是设计出增加信息、删除信息、查询信息、修改信息、按年龄排序信息、显示信息、退出通讯录这几大功能。
这里使用到了memset,memmove内存函数,大家可以先去查找学习一下。这里利用menmset函数,给通讯录进行初始化操作。用menmove实现通讯录的删除功能。
增加功能设计时,需要考虑特殊情况,如果通讯录满了就不能再添加啦。删除功能设计时也要考虑特殊情况,如果通讯录为空(sz为0),则就不能删除了。这里的排序功能用的是冒泡排序实现。
整体的编写风格采用的是分文件编写的方式:Contact.h文件,负责函数、结构体声明、define常量的定义、枚举的定义、头文件的包含。Contact.c文件,负责通讯录各个功能函数体的实现。test.c文件,负责测试通讯录的功能。
通讯录界面(meun)设计
通讯录菜单界面(meun)设计的代码编写:
void meun() { printf("**************************************\n"); printf("****** 1.Add 2.Del *******\n"); printf("****** 3.Search 4.Modify *******\n"); printf("****** 5.Sort 6.Print *******\n"); printf("****** 0.Exit *******\n"); printf("**************************************\n"); }
界面成果图展示:
增加信息功能实现代码
//增加通讯录信息 void AddContact(Contact* pc) { if (DATA_MAX == pc->sz) { printf("通讯录信息存储空间已满!\n"); return; } 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++; }
删除信息功能实现代码
void DelContact(Contact* pc) { char name[NAME_MAX]; printf("请输入要删除的人的名字:> "); scanf("%s", name); if (pc->sz == 0) { printf("通讯录已空!\n"); return; } int pos = FindByName(pc, name); if (pos == -1) { printf("通讯录中无此要删除的人的信息\n"); return; } memmove(pc->data + pos, pc->data + pos + 1, (pc->sz - 1 - pos) * sizeof(pc->data[0])); pc->sz--; printf("删除成功!\n"); }
查询信息功能实现代码
//查询通讯录信息 void SearchContact(Contact* pc) { char name[NAME_MAX]; printf("请输入要查询的人的名字:> "); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("通讯录中无此查询人的信息\n"); return 0; } printf("%-20s %-10s %-15s %-30s %-30s\n", "姓名", "年龄", "性别", "电话", "地址"); printf("%-20s %-10d %-15s %-30s %-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }
修改信息功能实现代码
//修改通讯录信息 void ModifyContact(Contact* pc) { char name[NAME_MAX]; printf("请输入要修改的人的名字:> "); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("通讯录中无此人的信息\n"); return 0; } 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("信息修改成功!\n"); }
按年龄升序排序信息功能实现代码
//年龄排序 void SortContact(Contact* pc) { for (int i = 0; i < pc->sz; i++) { for (int j = 0; j < pc->sz - 1 - i; j++) { if (pc->data[j].age > pc->data[j + 1].age) { PeoInfor tmp = pc->data[j]; pc->data[j] = pc->data[j + 1]; pc->data[j + 1] = tmp; } } } printf("排序成功!\n"); }
显示信息功能实现代码
//打印通讯录信息 void PrintContact(Contact* pc) { assert(pc); printf("%-20s %-10s %-15s %-30s %-30s\n","姓名","年龄","性别","电话","地址"); for (int i = 0; i < pc->sz; i++) { printf("%-20s %-10d %-15s %-30s %-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } }
通讯录完整代码
通讯录头文件代码编写:
#pragma once #include<stdio.h> #include<assert.h> #include<string.h> #define NAME_MAX 20 #define SEX_MAX 3 #define TELE_MAX 20 #define ADDR_MAX 30 #define DATA_MAX 1000 enum { EXIT, ADD, DEL, SEARCH, MODIFY, SORT, PRINT }; typedef struct PeoInfor { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX]; }PeoInfor; typedef struct Contact { PeoInfor data[DATA_MAX]; int sz; }Contact; //初始化通讯录 void InitContact(Contact* pc); //增加通讯录信息 void AddContact(Contact* pc); //删除通讯录信息 void DelContact(Contact* pc); //查询通讯录信息 void SearchContact(Contact* pc); //修改通讯录信息 void ModifyContact(Contact* pc); //排序 void SortContact(Contact* pc); //打印通讯录信息 void PrintContact(Contact* pc);
通讯录功能文件代码编写:
#define _CRT_SECURE_NO_WARNINGS 1 #include"Contact.h" //初始化通讯录 void InitContact(Contact* pc) { assert(pc); memset(pc->data, 0, sizeof(pc->data)); pc->sz = 0; } //增加通讯录信息 void AddContact(Contact* pc) { if (DATA_MAX == pc->sz) { printf("通讯录信息存储空间已满!\n"); return; } 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 FindByName(Contact* pc, char name[]) { for (int i = 0; i < pc->sz; i++) { if (strcmp((pc->data[i].name), name) == 0) { return i; } } return -1; } void DelContact(Contact* pc) { char name[NAME_MAX]; printf("请输入要删除的人的名字:> "); scanf("%s", name); if (pc->sz == 0) { printf("通讯录已空!\n"); return; } int pos = FindByName(pc, name); if (pos == -1) { printf("通讯录中无此要删除的人的信息\n"); return; } memmove(pc->data + pos, pc->data + pos + 1, (pc->sz - 1 - pos) * sizeof(pc->data[0])); pc->sz--; printf("删除成功!\n"); } //查询通讯录信息 void SearchContact(Contact* pc) { char name[NAME_MAX]; printf("请输入要查询的人的名字:> "); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("通讯录中无此查询人的信息\n"); return 0; } printf("%-20s %-10s %-15s %-30s %-30s\n", "姓名", "年龄", "性别", "电话", "地址"); printf("%-20s %-10d %-15s %-30s %-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } //修改通讯录信息 void ModifyContact(Contact* pc) { char name[NAME_MAX]; printf("请输入要修改的人的名字:> "); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("通讯录中无此人的信息\n"); return 0; } 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("信息修改成功!\n"); } //年龄排序 void SortContact(Contact* pc) { for (int i = 0; i < pc->sz; i++) { for (int j = 0; j < pc->sz - 1 - i; j++) { if (pc->data[j].age > pc->data[j + 1].age) { PeoInfor tmp = pc->data[j]; pc->data[j] = pc->data[j + 1]; pc->data[j + 1] = tmp; } } } printf("排序成功!\n"); } //打印通讯录信息 void PrintContact(Contact* pc) { assert(pc); printf("%-20s %-10s %-15s %-30s %-30s\n","姓名","年龄","性别","电话","地址"); for (int i = 0; i < pc->sz; i++) { printf("%-20s %-10d %-15s %-30s %-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } }
通讯录测试文件代码编写:
#define _CRT_SECURE_NO_WARNINGS 1 #include"Contact.h" void meun() { printf("**************************************\n"); printf("****** 1.Add 2.Del *******\n"); printf("****** 3.Search 4.Modify *******\n"); printf("****** 5.Sort 6.Print *******\n"); printf("****** 0.Exit *******\n"); printf("**************************************\n"); } void test() { Contact p; int input = 0; InitContact(&p); do { meun(); printf("请输入功能选项:>\n"); scanf("%d", &input); switch (input) { case EXIT: printf("已退出通讯录!\n"); break; case ADD: AddContact(&p); break; case DEL: DelContact(&p); break; case SEARCH: SearchContact(&p); break; case MODIFY: ModifyContact(&p); break; case SORT: SortContact(&p); break; case PRINT: PrintContact(&p); break; default: printf("输入错误,请重新输入!\n"); break; } } while (input); } int main() { test(); return 0; }
测试过程展示
加载全部内容