IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言制作通讯录(新手练习推荐) -> 正文阅读

[C++知识库]C语言制作通讯录(新手练习推荐)

本博客推荐给C语言学习到结构体的新手们,供其练习。建议新手读者在阅读之后,仔细分析原码,再独立完成程序编写。

一、本通讯录要实现的功能:

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

通讯录可执行的操作如下:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

二、通讯录初步准备:

?? ? 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++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:38:18  更:2022-09-24 20:40:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 13:17:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码