目录
原型:int strcmp(const char *s1, const char *s2);
一、框架建设
1.模板
首先打开我们的手机通讯录,可以看到一系列的操作,简单的必备的如增加联系人、修改联系人、查找联系人啥的,那我们就可以用c语言模拟实现一下这些小功能(练练手)
<此处是一张通讯录界面图片,请自行脑补>
2.思路
首先我们打开软件是不是该有个图形化主界面呀,
然后在里面会有增加联系人、删除联系人之类的功能供用户选择使用
逻辑很简单,我就不阐述了,直接敲代码~
二、具体函数实现方法
提一句,为什么要分块封装函数呢?
原因是我们在开发程序的时候,某一个功能或是某一段代码需要重复使用,为了提高编写的效率以及代码的复用性和便于阅读代码查错等。
1.主逻辑
打开软件就要显示菜单界面,并且有相应的选项,而且是重复返回主菜单操作的,直接do~while
do~while语句是先执行一次循环后在判断后续是否继续执行
我们在里面调用了主界面menu()函数
然后switch判断用户输入的选项再跳转到子功能
void menu()
{
printf(“********************************************************\n”);
printf(“**************** 通讯录 ****************\n”);
printf(“********************************************************\n”);
printf(“******** 1.添加 2.删除 ********\n”);
printf(“******** 3.查找 4.修改 ********\n”);
printf(“******** 5.显示 6.清空 ********\n”);
printf(“******** 7.排序 0.退出 ********\n”);
printf(“********************************************************\n”);}
int main()
{
int input = 0;
Contact my_con;
InitContact(&my_con);
do
{
menu();//菜单显示界面
printf(“请选择:\n”);
scanf(“%d”, &input);
switch (input)
{
case 1://添加
AddContact(&my_con);
break;
case 2://删除
DelContact(&my_con);
break;
case 3://查找
SearchContact(&my_con);
break;
case 4://修改
ModifyContact(&my_con);
break;
case 5://显示
ShowContact(&my_con);
break;
case 6://清空
InitContact(&my_con);
break;
case 7://排序
SortContact(&my_con);
break;
case 0://退出
break;
default:
printf(“请重新输入!\n”);
break;
}
} while (input);return 0;
}
函数主逻辑很简单,我就不讲了,实在看不懂打开手机通讯录自己琢磨去
2.初始化通讯录
memset()函数原型是extern void* memset(void* buffer, int c, int count)
// buffer:为指针或是数组,
//c:是赋给buffer的值,
//count:是buffer的长度.
memset(pc->data, 0, sizeof(pc->data));//将所有初始化为0.
}
//初始化通讯录
void InitContact(pContact pc)
{
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));//将所有初始化为0.
}
3.查找联系人
首先,我们也需要用户输入待查找联系人的名字,如果存在此人我们就将其信息打印出来
void SearchContact(pContact pc)
{
char name[20];
char num[20];
int input = 0;
int ret = 0;do
{
printf(“1.按照名字查找 2.按照号码查找 0.******返回\n”);
printf(“请选择:”);
scanf(“%d”, &input);
switch (input)
{
case 1:
printf(“请输入要查找的名字:”);
scanf(“%s”, &name);
ret = FindName(pc, name);
if (ret != -1)
{
printf(“姓名:%s\n”, pc->data[ret].name);
printf(“性别:%s\n”, pc->data[ret].sex);
printf(“年龄:%s\n”, pc->data[ret].age);
printf(“电话:%s\n”, pc->data[ret].telnum);
printf(“住址:%s\n”, pc->data[ret].address);
}
else
{
printf(“没找到,请确认是否输入正确!”);
}
break;
case 2:
printf(“请输入你要查找的号码:”);
scanf(“%s”, &num);
ret = FindName(pc, num);
if (ret != -1)
{
printf(“姓名:%s\n”, pc->data[ret].name);
printf(“性别:%s\n”, pc->data[ret].sex);
printf(“年龄:%s\n”, pc->data[ret].age);
printf(“电话:%s\n”, pc->data[ret].telnum);
printf(“住址:%s\n”, pc->data[ret].address);
}
else
{
printf(“没找到,请确认是否输入正确!”);
}
break;
case 0:break;
default:
printf(“输入错误!\n”);
}} while (input);
}
1.按名字查找联系人
遍历整个通讯录,判断通讯录里是否存在相同字符串,找到就返回位置坐标,没找到返回-1
int FindName(pContact pc ,char* name)
{
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (strcmp(pc->data[i].name, name) == 0)//查找名字,有返回下标,无返回-1
{
return i;
}
}
return-1;
}
2.按号码查找联系人
遍历整个通讯录,判断通讯录里是否存在相同字符串,找到就返回位置坐标,没找到返回-1
int FindNum(pContact pc, char* num)
{
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (strcmp(pc->data[i].telnum, num))//查找号码,有返回下标,无返回-1
{
return i;
}
}
return -1;
}
4.添加联系人
先判断通讯录是否已满,满了给出提示
没满让用户输入姓名、电话号码等
先用结构体指针访问结构体数组再定位到count处,录入数据后count自增1,指向下一坐标处
(也不知道我这么理解对不对,哈哈)
void AddContact(pContact pc)
{
if (pc->count == MAX)//判断通讯录是否已满
{
printf(“通讯录已满!\n”);
return;
}
else
{
printf(“姓名:”);
scanf(” %s”,pc->data[pc->count].name);
printf(“性别:”);
scanf(” %s”,pc->data[pc->count].sex);
printf(“年龄:”);
scanf(” %d”,&(pc->data[pc->count].age));
printf(“电话:”);
scanf(” %s”,pc->data[pc->count].telnum);
printf(“住址:”);
scanf(” %s”,pc->data[pc->count].address);
pc->count++;
}
}
5.显示全部联系人
如果通讯录为空提示为空,就没必要打印;反之遍历打印出结构体数组中不为0的元素(结构体)
void ShowContact(pContact pc)
{
int i = 0;
if (pc->count == 0)
{
printf(“通讯录为空!\n”);
}
for (i = 0; i < pc->count; i++)
{
printf(“姓名:%s\n”, pc->data[i].name);
printf(“性别:%s\n”, pc->data[i].sex);
printf(“年龄:%d\n”, pc->data[i].age);
printf(“电话:%s\n”, pc->data[i].telnum);
printf(“家庭住址:%s\n”, pc->data[i].address);
}
printf(“\n”);
}
6.删除联系人
思路一样先看通讯录里是否有数据,没有的话删什么呢(0 :)
然后嵌套使用上边的,查找联系人函数
如果没找到,提示用户没找到
找到提示用户是否要删除该联系人
然后执行如下操作,用后面一个元素覆盖前一个元素,循环执行操作直到最后一个元素往前覆盖完成后,将联系人个数减一。
实现代码 :
void DelContact(pContact pc)
{
char name[20] = { 0 };
int ret = 0;
int n = 0;
int i = 0;
if (pc->count == 0)
printf(“通讯录为空\n”);
else
{
printf(“输入要删除人的姓名:”);
scanf(“%s”, name);
ret = FindName(pc, name);
if (ret != -1)
{
printf(“是否要删除该联系人?\n”);
printf(“确定选择1,取消请选择0\n”);
scanf(“%d”, &n);
if (n == 1)
{
for (i = ret; i < pc->count – 1; i++)
{
pc->data[i] = pc->data[i + 1];//朝前覆盖,完成删除。
}
pc->count–;
printf(“删除成功\n”);
}
else
{
printf(“删除失败\n”);
}
}
else
{
printf(“你要删除的联系人不存在\n”);
}
}
}
7.联系人排序
使用字符串比较函数实现排序功能(升序判断条件大于0;降序反过来小于0)
原型:int strcmp(const char *s1, const char *s2);
参数:s1、s2为两个进行比较的字符串
返回值:若s1、s2字符串相等,则返回零;若s1大于s2,则返回大于零的数;否则,则返回小于零的数。
说明:strcmp()函数是根据ACSII码的值来比较两个字符串的;strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值。
void SortContact(pContact pc)
{
int i = 0;
for (i = 0; i < (pc->count) – 1; i++)
{
if (strcmp(pc->data[i].name, pc->data[i + 1].name) > 0)
{
peoinfor tmp;
tmp = pc->data[i];
pc->data[i] = pc->data[i + 1];
pc->data[i + 1] = tmp;
}
}
}
8. 修改联系人
要修改联系人只要先在通讯录中找到该联系人
然后重新录入一遍就🆗啦
void ModifyContact(pContact pc)
{
char name[20] = { 0 };
int ret = 0;
int input = 0;
printf(“请输入你要修改联系人的姓名:”);
scanf(“%s”, name);
ret = FindName(pc, name);
if (ret != -1)
{
do
{
printf(“*************************\n”);
printf(“*** 1.姓名 2.性别 ***\n”);
printf(“*** 3.年龄 4.电话 ***\n”);
printf(“*** 5.家庭住址 0.返回 ***\n”);
printf(“*************************\n”);
printf(“请输入你要修改的选项”);
scanf(“%d”, &input);
switch (input)
{
case 1:
printf(“名字:”);
scanf(“%s”, pc->data[ret].name);
break;
case 2:
printf(“性别:”);
scanf(“%s”, pc->data[ret].sex);
break;
case 3:
printf(“年龄:”);
scanf(“%d”, &(pc->data[ret].age));
break;
case 4:
printf(“电话:”);
scanf(“%s”, pc->data[ret].telnum);
break;
case 5:
printf(“住址:”);
scanf(“%s”, pc->data[ret].address);
break;
case 0:
break;
default:
printf(“输入有误请重新输入\n”);
break;
}
} while (input);
}
else
printf(“联系人不存在\n”);
}
三、代码部分
1.头文件、宏定义、结构体和函数声明
#pragma once
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define _CRT_SECURE_NO_WARNINGS
//声明c库函数的头文件
# include <stdio.h>
# include <stdlib.h>
//定义相关量的宏
#define MAX_NAME 20
#define MAX 1000
#define MAX_SEX 5
#define MAX_ADDRESS 40
#define MAX_TELNUM 20
//函数声明
enum condition//枚举
{
//枚举数据表
EXIT,//退出
ADD,//添加
DEL,//删除
SERACH,//查找
MODIFY,//修改
SHOW,//显示
EMPTY,//清空
SORT//排序
};
typedef struct PeoInfor//声明一个结构体
{
char name[MAX_NAME];//姓名
char sex[MAX_SEX];//性别
int age;//年龄
char telnum[MAX_TELNUM];//手机号码
char address[MAX_ADDRESS];//住址
}peoinfor;//用这个结构体类型创建了一个全局结构体变量peoinfor
typedef struct Contact//
{
peoinfor data[MAX];
int count;
}Contact,*pContact;
//初始化通讯录
void InitContact(pContact pc);
//查找
int FindName(pContact pc, char* name);
int FindNum(pContact pc, int num);
//添加联系人
void AddContact(pContact pc);
//删除联系人
void DelContact(pContact pc);
//查找联系人
void SearchContact(pContact pc);
//按名字排序
void SortContact(pContact pc);
//修改联系人
void ModifyContact(pContact pc);
#endif
2.具体函数实现
#include"contact.h"
void InitContact(pContact pc)
{
//初始化通讯录
pc->count = 0;
//memset()函数原型是extern void* memset(void* buffer, int c, int count)
// buffer:为指针或是数组,
//c:是赋给buffer的值,
//count:是buffer的长度.
memset(pc->data, 0, sizeof(pc->data));//将所有初始化为0.
}
//名字查找
int FindName(pContact pc ,char* name)
{
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (strcmp(pc->data[i].name, name) == 0)//查找名字,有返回下标,无返回-1
{
return i;
}
}
return-1;
}
//号码查找
int FindNum(pContact pc, char* num)
{
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (strcmp(pc->data[i].telnum, num))//查找号码,有返回下标,无返回-1
{
return i;
}
}
return -1;
}
//添加联系人
void AddContact(pContact pc)
{
if (pc->count == MAX)//判断通讯录是否已满
{
printf("通讯录已满!\n");
return;
}
else
{
printf("姓名:");
scanf(" %s",pc->data[pc->count].name);
printf("性别:");
scanf(" %s",pc->data[pc->count].sex);
printf("年龄:");
scanf(" %d",&(pc->data[pc->count].age));
printf("电话:");
scanf(" %s",pc->data[pc->count].telnum);
printf("住址:");
scanf(" %s",pc->data[pc->count].address);
pc->count++;
}
}
//显示全部联系人
void ShowContact(pContact pc)
{
int i = 0;
if (pc->count == 0)
{
printf("通讯录为空!\n");
}
for (i = 0; i < pc->count; i++)
{
printf("姓名:%s\n", pc->data[i].name);
printf("性别:%s\n", pc->data[i].sex);
printf("年龄:%d\n", pc->data[i].age);
printf("电话:%s\n", pc->data[i].telnum);
printf("家庭住址:%s\n", pc->data[i].address);
}
printf("\n");
}
//删除联系人
void DelContact(pContact pc)
{
char name[20] = { 0 };
int ret = 0;
int n = 0;
int i = 0;
if (pc->count == 0)
printf("通讯录为空\n");
else
{
printf("输入要删除人的姓名:");
scanf("%s", name);
ret = FindName(pc, name);
if (ret != -1)
{
printf("是否要删除该联系人?\n");
printf("确定选择1,取消请选择0\n");
scanf("%d", &n);
if (n == 1)
{
for (i = ret; i < pc->count - 1; i++)
{
pc->data[i] = pc->data[i + 1];//朝前覆盖,完成删除。
}
pc->count--;
printf("删除成功\n");
}
else
{
printf("删除失败\n");
}
}
else
{
printf("你要删除的联系人不存在\n");
}
}
}
//查找联系人
void SearchContact(pContact pc)
{
char name[20];
char num[20];
int input = 0;
int ret = 0;
do
{
printf("1.按照名字查找 2.按照号码查找 0.******返回\n");
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入要查找的名字:");
scanf("%s", &name);
ret = FindName(pc, name);
if (ret != -1)
{
printf("姓名:%s\n", pc->data[ret].name);
printf("性别:%s\n", pc->data[ret].sex);
printf("年龄:%s\n", pc->data[ret].age);
printf("电话:%s\n", pc->data[ret].telnum);
printf("住址:%s\n", pc->data[ret].address);
}
else
{
printf("没找到,请确认是否输入正确!");
}
break;
case 2:
printf("请输入你要查找的号码:");
scanf("%s", &num);
ret = FindName(pc, num);
if (ret != -1)
{
printf("姓名:%s\n", pc->data[ret].name);
printf("性别:%s\n", pc->data[ret].sex);
printf("年龄:%s\n", pc->data[ret].age);
printf("电话:%s\n", pc->data[ret].telnum);
printf("住址:%s\n", pc->data[ret].address);
}
else
{
printf("没找到,请确认是否输入正确!");
}
break;
case 0:
break;
default:
printf("输入错误!\n");
}
} while (input);
}
//联系人排序
void SortContact(pContact pc)
{
int i = 0;
for (i = 0; i < (pc->count) - 1; i++)
{
if (strcmp(pc->data[i].name, pc->data[i + 1].name) > 0)
{
peoinfor tmp;
tmp = pc->data[i];
pc->data[i] = pc->data[i + 1];
pc->data[i + 1] = tmp;
}
}
}
//修改联系人
void ModifyContact(pContact pc)
{
char name[20] = { 0 };
int ret = 0;
int input = 0;
printf("请输入你要修改联系人的姓名:");
scanf("%s", name);
ret = FindName(pc, name);
if (ret != -1)
{
do
{
printf("*************************\n");
printf("*** 1.姓名 2.性别 ***\n");
printf("*** 3.年龄 4.电话 ***\n");
printf("*** 5.家庭住址 0.返回 ***\n");
printf("*************************\n");
printf("请输入你要修改的选项");
scanf("%d", &input);
switch (input)
{
case 1:
printf("名字:");
scanf("%s", pc->data[ret].name);
break;
case 2:
printf("性别:");
scanf("%s", pc->data[ret].sex);
break;
case 3:
printf("年龄:");
scanf("%d", &(pc->data[ret].age));
break;
case 4:
printf("电话:");
scanf("%s", pc->data[ret].telnum);
break;
case 5:
printf("住址:");
scanf("%s", pc->data[ret].address);
break;
case 0:
break;
default:
printf("输入有误请重新输入\n");
break;
}
} while (input);
}
else
printf("联系人不存在\n");
}
3.主函数入口
#include"contact.h"
void menu()
{
printf("********************************************************\n");
printf("**************** 通讯录 ****************\n");
printf("********************************************************\n");
printf("******** 1.添加 2.删除 ********\n");
printf("******** 3.查找 4.修改 ********\n");
printf("******** 5.显示 6.清空 ********\n");
printf("******** 7.排序 0.退出 ********\n");
printf("********************************************************\n");
}
int main()
{
int input = 0;
Contact my_con;
InitContact(&my_con);
do
{
menu();//菜单显示界面
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case 1://添加
AddContact(&my_con);
break;
case 2://删除
DelContact(&my_con);
break;
case 3://查找
SearchContact(&my_con);
break;
case 4://修改
ModifyContact(&my_con);
break;
case 5://显示
ShowContact(&my_con);
break;
case 6://清空
InitContact(&my_con);
break;
case 7://排序
SortContact(&my_con);
break;
case 0://退出
break;
default:
printf("请重新输入!\n");
break;
}
} while (input);
return 0;
}
四、运行截图
1.录入联系人信息
2.删除联系人
3.查找联系人
4.修改联系人信息
5.显示所有联系人
6.清空所有联系人
7.排序
本来是不想写博客的,朋友跟我说:码完代码不写博客等于没码~