宁立
楼主
发布于 2023-4-19 21:26:26
阅读 2004
查看全部
目录
一、前言二、正文
1.大致框架2.界面显示3. 创建通讯录4.初始化通讯录5.增加联络人6.显示联络人7. 删除联络人8.查找联络人9.修改联络人10. 排序联络人
一、前言
在上一章的构造体的学习中,相信小伙伴们或多或少都有所收获,但是有的小伙伴可能会问,构造体到底能用来做什么呢?今天,我们就借助构造体和之前所学的知识来实现通讯录。
二、正文
1.大致框架
相信在座的小伙伴们一定有人做过类似的小游戏或项目,编程的大忌就是将所有的代码都放在同一个文件里,写的时候有多好爽快,后期对代码停止修改和维护的时候就有痛苦。这期通讯录的实现我们大致分为三个模块,一个用于测试通讯录,即对各种函数的调用【text.c】;另一个用于通讯录的实现,其中放置着通讯录功能的详细实现【contact.c】;最后一个就是函数的声明了[contact.h].
2.界面显示
就像之前的扫雷与三子棋游戏一样,这个通讯录的第一步一定是要让使用者看到通讯录的页面,继而在使用者选择之后停止下一步的操作。因而我们仍旧采取do while 循环,先将页面显示,再根据使用者的输入停止相应的操作。详细实现代码如下:
void bubble_sort(int arr[], int sz)
{
//趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
//一趟冒泡排序的过程
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
在以上代码的逻辑下,使用者刚开端就可以看到我们设置好的界面,并停止功能的输入,假设输入为0就退出通讯录,通讯录为功能相应的数字就停止相应的功能【还未填写完好】,若为其他数字,则重新输入。
3. 创建通讯录
为了实现我们菜单中的各个功能,首先我们要有这些功能的受体——通讯录,只要创建好通讯录 ,才干停止功能的操作。在生活中,我们手机上的通讯录都存有联络人的相关信息,例如姓名,年龄,性别,手机号码等等 ,其次在后面的功能中我们还需要晓得这个通讯录中联络人的数量是多少。显然,我们需要一个自定义构造变量来定义通讯录,在这个构造体中有两个变量,一个是寄存联络人信息的变量,另一个是寄存联络人数量的变量。而寄存联络人的信息显然需要一个数组,数组的大小即对应着能寄存多少联络人,而数组中的元素就是联络人的信息,这也无法用一个单一类型变量来定义,所以我们还需要额外定义一个构造体变量来代表联络人的各种信息。详细代码如下:
//构造体——联络人的信息
struct peo
{
char name[20]; //姓名
char sex[10]; //性别
int age; //年龄
char addr[40]; //地址
char tel[20]; //电话
};
//构造体——通讯录
typedef struct contact
{
struct peo Peo[contact_num]; //通讯录中联络人的信息
int sz; //当前寄存联络人的个数
}contact;
4.初始化通讯录
在通讯录的创建之后,就是对其的初始化了,为了方便,我们就都置成0就好了。
//Init_Contact——初始化通讯录
void Init_Contact(contact* pc)
{
pc->sz = 0;
memset(pc, 0, sizeof(pc->Peo));
}
5.增加联络人
在通讯录的创建和初始化完成之后,就是通讯录功能的实现了。首先是“增加联络人”这一功能。我们先是定义一个函数,这个函数的参数就是我们的通讯录,采用传送通讯录地址的方式,返回值为空,因为我们只是对通讯录的内容停止改变,并不需要返回任何东西。然后是函数的详细实现,我们要做的是在联络人信息这一数组中添加一个联络人,并在添加之后将通讯录当前存储的联络人数量+1。此外假设通讯录已满,我们需要提醒使用者无法再添加联络人。详细代码如下:
//Add——增加联络人
void Add(contact* Contact)
{
assert(Contact);
if (Contact->sz < contact_num)
{
printf("请输入联络人的姓名:>\n");
scanf("%s", (Contact->Peo[Contact->sz]).name);
printf("请输入联络人的性别:>\n");
scanf("%s", Contact->Peo[Contact->sz].sex);
printf("请输入联络人的年龄:>\n");
scanf("%d", &(Contact->Peo[Contact->sz].age));
printf("请输入联络人的地址:>\n");
scanf("%s", Contact->Peo[Contact->sz].addr);
printf("请输入联络人的电话:>\n");
scanf("%s", Contact->Peo[Contact->sz].tel);
Contact->sz++;
}
else
printf("通讯录已满无法添加\n");
}
6.显示联络人
为了观察我们在执行增加联络人这个函数是否胜利,我们接下来停止“显示联络人”这一功能的实现。同样的先是定义显示联络人这一函数,函数参数是通讯录,采取传址调用的方式,无需返回任何参数。函数的实现就是根据通讯录中所存储的联络人数量,来调用存储联络人信息的数组,并将其显示在屏幕上,为了数据显示的整齐和美观,笔者对打印的数据类型停止了小小的改善,对数据所占空间停止了设置,并将数据左对齐并在数据后输出一个水平制表符。
//Show——展示联络人
void Show( const contact* Contact)
{
assert(Contact);
int pos = 0; //联络人对应下标
printf("%-20s\t%-10s\t%-4s\t%-40s\t%-20s\n","姓名", "性别", "年龄", "地址", "电话");
for (pos = 0; pos < Contact->sz; pos++)
{
printf("%-20s\t%-10s\t%-4d%\t%-40s\t%-20s\n", Contact->Peo[pos].name,
Contact->Peo[pos].sex,
Contact->Peo[pos].age,
Contact->Peo[pos].addr,
Contact->Peo[pos].tel);
}
}
7. 删除联络人
首先是“删除联络人”这一函数的定义,参数为通讯录这一构造体,采取传址调用的方式,返回参数无。继而是函数详细的实现,笔者是根据使用者所输入的所要删除联络人的姓名来找到联络人在数组中对应的下标,从而停止各项信息的删除。这里有个小技巧,无论是删除联络人,修改联络人,搜索联络人都需要在根据输入的姓名对联络人停止查找,因而我们可以将这个功能封装成一个函数,在使用这一功能的时候只需要调用就行了。详细代码实现如下:
//Find_by_name——通过姓名,找到联络人所对应的下标
int Find_by_name( const contact* Contact, char *name)
{
int i = 0;
for (i = 0; i < Contact->sz; i++)
{
if (strcmp(&(Contact->Peo.name),name)==0)
return i;
}
return -1;
}
//Del——删除联络人
void Del(contact* Contact)
{
char name[20] = { 0 };
int i = 0;
printf("请输入要删除的联络人:>");
scanf("%s", name);
int pos = Find_by_name(Contact, &name);
if (-1 == pos)
{
printf("该联络人不存在\n");
return;
}
else
{
for (i = pos; i < Contact->sz-1; i++)
{
Contact->Peo = Contact->Peo[i + 1];
}
Contact->sz--;
}
}
8.查找联络人
首先是对“查找联络人”函数的定义,函数参数为通讯录,采取传址调用的方式,返回参数为0。然后是详细功能的实现,先是根据输入的姓名查找到对应的下标,再将其显示在屏幕上。详细代码如下:
//Search——搜索联络人
void Search(const contact* Contact)
{
char name[20] = {0};
printf("请输入要寻找的联络人:>");
scanf("%s", name);
int pos= Find_by_name(Contact, &name);
if (-1==pos)
{
printf("该联络人不存在\n");
return;
}
else
{
printf("%-10s\t%-6s\t%-4s\t%-40s\t%-20s\n", "姓名", "性别", "年龄", "地址", "电话");
printf("%-10s\t%-6s\t%-4d%\t%-40s\t%-20s\n", Contact->Peo[pos].name,
Contact->Peo[pos].sex,
Contact->Peo[pos].age,
Contact->Peo[pos].addr,
Contact->Peo[pos].tel);
}
}
9.修改联络人
首先是对“修改联络人”函数的定义,函数参数为通讯录,采取传址调用的方式,返回参数为0。然后是详细功能的实现,先是根据输入的姓名查找到对应的下标,再根据添加联络人的代码实现联络人信息的修改。详细代码如下:
//Modify——修改联络人
void Modify(contact* Contact)
{
assert(Contact);
char name[20] = { 0 };
printf("请输入要修改的联络人\n");
scanf("%s", name);
int pos = Find_by_name(Contact, &name);
if (-1 == pos)
{
printf("该联络人不存在\n");
return;
}
else
{
printf("请输入联络人的姓名:>\n");
scanf("%s", (Contact->Peo[pos]).name);
printf("请输入联络人的性别:>\n");
scanf("%s", Contact->Peo[pos].sex);
printf("请输入联络人的年龄:>\n");
scanf("%d", &(Contact->Peo[pos].age));
printf("请输入联络人的地址:>\n");
scanf("%s", Contact->Peo[pos].addr);
printf("请输入联络人的电话:>\n");
scanf("%s", Contact->Peo[pos].tel);
}
}
10. 排序联络人
对联络人排序根据有很多,这里仅对联络人的年龄停止排序。采取冒泡排序的方式,冒泡排序的实如今前面的推文已经介绍过了,有兴趣的小伙伴可以康一康。https://www.jb51.net/article/275286.htm
//sort——依照年龄对联络人停止排序
void sort(contact* Contact,contact* tmp)
{
//执行冒泡排序的趟数
int i = 0;
for (i = 0; i < Contact->sz - 1; i++)
{
//一趟冒泡排序中交换的次数
int j = 0;
for (j = 0; j < Contact->sz - 1-i; j++)
{
if (Contact->Peo[j].age > Contact->Peo[j + 1].age)
{
tmp->Peo[0] = Contact->Peo[j];
Contact->Peo[j] = Contact->Peo[j + 1];
Contact->Peo[j + 1] = tmp->Peo[0];
}
}
}
}
到这里,整个通讯录就写完了,整体的代码如下:
//main.c
#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("*** 0.Exit *****\n");
printf("******************************\n");
}
int main()
{
contact Contact; //创建通讯录
contact tmp;
Init_Contact(&Contact); //初始化通讯录
Init_Contact(&tmp);
int input = 0;
do
{
menu(); //打印菜单
printf("请选择你所需的功能:");
scanf("%d", &input);
switch (input)
{
case 1:
Add(&Contact);
break;
case 2:
Del(&Contact);
break;
case 3:
Search(&Contact);
break;
case 4:
Modify(&Contact);
break;
case 5:
Show(&Contact);
break;
case 6:
sort(&Contact,&tmp);
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("输入错误,请重新输入\n");
}
}
while (input);
return 0;
}
//contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#define contact_num 100
#include <stdio.h>
#include <string.h>
#include <assert.h>
//构造体——联络人的信息
struct peo
{
char name[20]; //姓名
char sex[10]; //性别
int age; //年龄
char addr[40]; //地址
char tel[20]; //电话
};
//构造体——通讯录
typedef struct contact
{
struct peo Peo[contact_num]; //通讯录中联络人的信息
int sz; //当前寄存联络人的个数
}contact;
void Init_Contact(contact* pc); //初始化通讯录
void Add(contact* Contact); //添加联络人
void Show(const contact* Contact); //展示联络人
void Search(const contact* Contact); //搜索联络人
void Del(contact* Contact); //删除联络人
void Modify(contact* Contact); //修改联络人
void sort(contact* Contact,contact* tmp); //排序联络人——年龄
//contact.c
#include "contact.h"
//Init_Contact——初始化通讯录
void Init_Contact(contact* pc)
{
pc->sz = 0;
memset(pc, 0, sizeof(pc->Peo));
}
//Add——增加联络人
void Add(contact* Contact)
{
assert(Contact);
if (Contact->sz < contact_num)
{
printf("请输入联络人的姓名:>\n");
scanf("%s", (Contact->Peo[Contact->sz]).name);
printf("请输入联络人的性别:>\n");
scanf("%s", Contact->Peo[Contact->sz].sex);
printf("请输入联络人的年龄:>\n");
scanf("%d", &(Contact->Peo[Contact->sz].age));
printf("请输入联络人的地址:>\n");
scanf("%s", Contact->Peo[Contact->sz].addr);
printf("请输入联络人的电话:>\n");
scanf("%s", Contact->Peo[Contact->sz].tel);
Contact->sz++;
}
else
printf("通讯录已满无法添加\n");
}
//Show——展示联络人
void Show( const contact* Contact)
{
assert(Contact);
int pos = 0;
printf("%-10s\t%-6s\t%-4s\t%-40s\t%-20s\n","姓名", "性别", "年龄", "地址", "电话");
for (pos = 0; pos < Contact->sz; pos++)
{
printf("%-10s\t%-6s\t%-4d%\t%-40s\t%-20s\n", Contact->Peo[pos].name,
Contact->Peo[pos].sex,
Contact->Peo[pos].age,
Contact->Peo[pos].addr,
Contact->Peo[pos].tel);
}
}
//Find_by_name——通过姓名,找到联络人所对应的下标
int Find_by_name( const contact* Contact, char *name)
{
int i = 0;
for (i = 0; i < Contact->sz; i++)
{
if (strcmp(&(Contact->Peo.name),name)==0)
return i;
}
return -1;
}
//Search——搜索联络人
void Search(const contact* Contact)
{
char name[20] = {0};
printf("请输入要寻找的联络人:>");
scanf("%s", name);
int pos= Find_by_name(Contact, &name);
if (-1==pos)
{
printf("该联络人不存在\n");
return;
}
else
{
printf("%-10s\t%-6s\t%-4s\t%-40s\t%-20s\n", "姓名", "性别", "年龄", "地址", "电话");
printf("%-10s\t%-6s\t%-4d%\t%-40s\t%-20s\n", Contact->Peo[pos].name,
Contact->Peo[pos].sex,
Contact->Peo[pos].age,
Contact->Peo[pos].addr,
Contact->Peo[pos].tel);
}
}
//Del——删除联络人
void Del(contact* Contact)
{
char name[20] = { 0 };
int i = 0;
printf("请输入要删除的联络人:>");
scanf("%s", name);
int pos = Find_by_name(Contact, &name);
if (-1 == pos)
{
printf("该联络人不存在\n");
return;
}
else
{
for (i = pos; i < Contact->sz-1; i++)
{
Contact->Peo = Contact->Peo[i + 1];
}
Contact->sz--;
}
}
//Modify——修改联络人
void Modify(contact* Contact)
{
assert(Contact);
char name[20] = { 0 };
printf("请输入要修改的联络人\n");
scanf("%s", name);
int pos = Find_by_name(Contact, &name);
if (-1 == pos)
{
printf("该联络人不存在\n");
return;
}
else
{
printf("请输入联络人的姓名:>\n");
scanf("%s", (Contact->Peo[pos]).name);
printf("请输入联络人的性别:>\n");
scanf("%s", Contact->Peo[pos].sex);
printf("请输入联络人的年龄:>\n");
scanf("%d", &(Contact->Peo[pos].age));
printf("请输入联络人的地址:>\n");
scanf("%s", Contact->Peo[pos].addr);
printf("请输入联络人的电话:>\n");
scanf("%s", Contact->Peo[pos].tel);
}
}
//sort——依照年龄对联络人停止排序
void sort(contact* Contact,contact* tmp)
{
//执行冒泡排序的趟数
int i = 0;
for (i = 0; i < Contact->sz - 1; i++)
{
//一趟冒泡排序中交换的次数
int j = 0;
for (j = 0; j < Contact->sz - 1-i; j++)
{
if (Contact->Peo[j].age > Contact->Peo[j + 1].age)
{
tmp->Peo[0] = Contact->Peo[j];
Contact->Peo[j] = Contact->Peo[j + 1];
Contact->Peo[j + 1] = tmp->Peo[0];
}
}
}
}到此这篇关于C语言模仿实现通讯录程序过程的文章就介绍到这了,更多相关C语言通讯录内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站! |
|