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语言刚刚学完的同学,在学习C语言的过程中,我们都应该深刻地明白:实践敲代码对学习的重要性
大家刚刚学完C语言,急迫需要一些综合性强的题目,来供大家对这些知识初步做到“融会贯通”。

如何使用这篇文章?

这里笔者给出一些建议,大家酌情采用

1、首先,本篇文章的内容结构,将在目录中展示,建议先浏览目录,对将要做的事情可以有一个大概印象;

2、建议大家先浏览“题目”,然后打开编译器,根据需求自己先编写、调试,如果可以直接做出来,那自然是最好的;

3、不管最后有没有做出来,都可以浏览笔者在 做这个的时候 写的代码,这个是对大家都开放的,
没有做出来的同学,或许可以从笔者的代码中找到一些灵感,尽量不要 Ctrl + c,
做出来的同学,或许可以从笔者的代码中找到一些相同与不同,这些不同说不定能带给读者一些感悟。

4、在读者自主完成题目后,可以将笔者的代码运行一遍,尝试感受一下不同,取其精华,去其糟粕,实现更好的自己!

题目:通讯录(版本一)

实现一个通讯录;

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

提供方法:

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

代码及思路

为了方便起见,思路将以 注释 的形式在代码块里出现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

// 定义宏 MAX 是 300,我们要存300个人的信息
#define MAX 300

// 创建性别枚举
enum sex {
	MALE = 1,
	FEMALE = 2
};

// 创建“人”结构体,存放一个人的信息
// 其中,名字给了64(足够大)的空间,
// 电话给了12位,因为号码是11位,最后一位存放'\0'
// 地址同理给一个较大空间
typedef struct one {
	char name[64];
	enum sex sex;
	int age;
	char tel[12];
	char address[128];
}one;

// 创建“通讯录”结构体
// 这里我们除了定义一个数组外,定义了一个 sz ,代表通讯录目前存放的人的数量
// 我们在使用通讯录的时候,只认为前 sz 个人是有效的,这样就不需要对足够数组进行初始化了
// 从这个角度来看,sz 还有一个意义:可访问的联系人数量
typedef struct address_book {
	one person[MAX];
	int sz;
}address_book;

// 添加联系人信息,先检测联系人数量sz,那么在数组下标为 sz 的位置输入新的联系人,然后 sz++,即可实现添加
void Add(address_book*p) {
	printf("请输入新增联系人的  姓名\n");
	scanf("%s", &(p->person[p->sz].name));
	printf("请输入新增联系人的  性别\n1、男性\n2、女性\n");
	int s;
	scanf("%d", &s);
	if (s == 1) {
		p->person[p->sz].sex = MALE;
	}
	else {
		p->person[p->sz].sex = FEMALE;
	}
	printf("请输入新增联系人的  年龄\n");
	scanf("%d", &(p->person[p->sz].age));
	printf("请输入新增联系人的  电话\n");
	scanf("%s", &(p->person[p->sz].tel));
	printf("请输入新增联系人的  地址\n");
	scanf("%s", &(p->person[p->sz].address));
	p->sz++;
}

// 删除指定联系人信息
// 这里思路如下:
// 1、我们通过输入,确定删除的联系人的序号
// 2、找到那个联系人,把他后面的联系人向前移动一个单位,然后让sz--,这样就实现了删除联系人的操作
void Delete(address_book*p) {
	printf("请输入要删除联系人的  序号\n");
	int a;
	scanf("%d", &a);
	if (a >= p->sz) {
		return;
	}
	printf("[%d]  %s  %s\n", a, p->person[a].name, p->person[a].tel);
	printf("确认删除该联系人?\n1、确认\n2、取消\n");
	int c = 0;
	scanf("%d", &c);
	if (c == 1) {
		for (; a+1 < p->sz; a++) {
			p->person[a].age = p->person[a + 1].age;
			p->person[a].sex = p->person[a + 1].sex;
			int i = 0;
			while (1) {
				if (p->person[a + 1].address[i] == '\0') {
					break;
				}
				p->person[a].address[i] = p->person[a + 1].address[i];
				i++;
			}
			p->person[a].address[i] = p->person[a + 1].address[i];
			i = 0;
			while (1) {
				if (p->person[a + 1].name[i] == '\0') {
					break;
				}
				p->person[a].name[i] = p->person[a + 1].name[i];
				i++;
			}
			p->person[a].name[i] = p->person[a + 1].name[i];
			i = 0;
			while (1) {
				if (p->person[a + 1].tel[i] == '\0') {
					break;
				}
				p->person[a].tel[i] = p->person[a + 1].tel[i];
				i++;
			}
			p->person[a].tel[i] = p->person[a + 1].tel[i];


		}
		p->sz--;
		printf("删除完成!");
	}


}

// 查找指定联系人信息,通过数组访问联系人结构体,打印所有数据即可
void Found(address_book*p) {
	int a;
	while (1) {
		printf("请输入要查找联系人的  序号\n");
		scanf("%d", &a);
		if (a < p->sz) {
			break;
		}
		else{
			printf("请重新输入!\n");
		}
	}
	printf("姓名:%s\n", p->person[a].name);
	if (p->person[a].sex == 1) {
		printf("性别:男\n");
	}
	else if (p->person[a].sex == 2) {
		printf("性别:女\n");
	}
	printf("年龄:%d\n", p->person[a].age);
	printf("地址:%s\n", p->person[a].address);
	printf("号码:%s\n", p->person[a].tel);

}


// 修改指定联系人信息,通过数组找到那个联系人,重新输入数据即可
void Revise(address_book* p) {
	int a;
	while (1) {
		printf("请输入要修改联系人的  序号\n");
		scanf("%d", &a);
		if (a < p->sz) {
			break;
		}
		else {
			printf("请重新输入!\n");
		}
	}
	printf("[%d]  %s  %s\n", a, p->person[a].name, p->person[a].tel);
	printf("确认修改该联系人?\n1、确认\n2、取消\n");
	int c = 0;
	scanf("%d", &c);
	if (c == 1) {
		printf("输入新的姓名:\n");
		scanf("%s", p->person[a].name);
		printf("输入新的年龄:\n");
		scanf("%d", &(p->person[a].age));
		printf("输入新的性别:\n1、男\2、女\n");
		int s;
		scanf("%d", &s);
		if (s == 1) {
			p->person[a].sex = MALE;
		}
		else{
			p->person[a].sex = FEMALE;
		}
		printf("请输入新的地址:\n");
		scanf("%s", p->person[a].address);
		printf("请输入新的电话:\n");
		scanf("%s", p->person[a].tel);
	}


}

//清空所有联系人,让sz为0,那么可访问的联系人数量就是0
void Clean(address_book* p) {
	p->sz = 0;
}

//以名字排序所有联系人,这里考察一个str系列函数的使用
void Sort(address_book* p) {
	system("cls");
	for (int i = (int)'A'; i <=(int) 'z'; i++) {
		for (int j = 0; j < p->sz; j++) {
			if (p->person[j].name[0] == (char)i) {
				if (p->person[j].sex == MALE)
					printf("[%d]  %s  男  %d\n", j, &(p->person[j].name[0]), p->person[j].age);
				else
					printf("[%d]  %s  女  %d\n", j, &(p->person[j].name[0]), p->person[j].age);
			}
		}
	}
}


typedef void(*FUNC)(address_book*);
// 这个是为了方便,改个名字,笔者为了练习这一块的内容而加上




//显示所有联系人信息,并调用其他功能
void Print(address_book*p) {
	while (1) {
		system("cls");
		printf("序号 姓名 性别 年龄\n");
		for (int i = 0; i < p->sz; i++) {
			if (p->person[i].sex == MALE)
				printf("[%d]   %s   男    %d\n", i, p->person[i].name, p->person[i].age);
			else
				printf("[%d]   %s   女    %d\n", i, p->person[i].name, p->person[i].age);
		}
		printf("\n1、查找联系人\n2、添加联系人\n3、删除联系人\n4、修改指定联系人信息\n5、清空通讯录中所有的联系人\n6、以名字排序\n0、关闭通讯录\n");
		int c = 0;
		scanf("%d", &c);
		// 这里笔者使用函数指针数组来调用函数,读者随意
		FUNC f[7] = {
			NULL,
			Found,
			Add,
			Delete,
			Revise,
			Clean,
			Sort
		};
		if (c == 0) {
			system("cls");
			break;
		}
		assert(c <= 5 || c >= 0);
		f[c](p);
		system("pause");
	}


}


// 总菜单
void menu(address_book*p) {
	int c = 0;
	printf("1、打开通讯录\n0、退出\n");
	scanf("%d", &c);
	if (c == 1) {
		Print(p);
	}
}


// 通过主函数调用测试
int main() {
	address_book book1;
	book1.sz = 0;
	menu(&book1);


	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:25:18  更:2021-08-12 16:25:31 
 
开发: 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/20 20:39:49-

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