首页 > 其他分享 >【C语言】实现一个通讯录,一步一步详细讲解,小白也能看!!!

【C语言】实现一个通讯录,一步一步详细讲解,小白也能看!!!

时间:2024-07-19 22:26:16浏览次数:15  
标签:index cont 一步 scanf C语言 通讯录 printf t% data

目录

设计思路

代码实现 

代码仓库 


设计思路

1. 通讯录存放的信息

这个通讯录保存的信息包括:名字,年龄,性别,电话,住址。

2. 通讯录的功能

1. 通讯录可以存放100个人的信息。

2. 增加联系人

3. 删除联系人

4. 修改联系人

5. 查询联系人

6. 显示所有人

3. 文件规划

我们准备三个文件完成这个项目。

test.c —— 负责测试

contact.h —— 负责函数和类型声明

contact.c —— 负责函数实现

4. 设计思路 

1. 通讯录保存的信息有很多,我们可以设计一个结构体来存放这些信息。

2. 通讯录要存放100个人的信息,那我们可以创建一个存放这个结构体的数组。


代码实现 

1. 设计存放信息的结构体

1. 我们先设计存放信息的结构体,因为这个结构体可能有多个文件会用到,所以我们统一放在头文件。

2. 名字,性别,电话,住址都是字符串所以用char数组,年龄用int。

3. 为了方便使用,用typedef重命名一下。

//通讯录保存的个人信息
typedef struct Info
{
	char name[10]; //名字
	char sex[5];   //性别
	int age;       //年龄
	char tele[12]; //电话
	char addr[20]; //住址
}Info;

4. 不同人有不同的个人信息,我们要把这些信息管理起来,所以我们要创建一个存放结构体的数组。

5. 我们还需要创建一个变量去记录数组元素的数量,以便于我们对数组信息的掌控。

6. 为了方便后续传参,我们再设计一个结构体把这两个变量作为结构体的成员。

//将Cont类型变量作为通讯录的基本单位
typedef struct Cont
{
	Info data[100]; //存放个人信息结构体的数组
	int cout;       //记录数组元素个数
}Cont;

2. 菜单实现 

1. 设计一个菜单,利用do while 和 switch case配合,根据不同的功能选择不同的数字。

//菜单
void menu()
{
	printf("-----------------------------\n");
	printf("--- 0.退出 --- 1.增加 -------\n");
	printf("-----------------------------\n");
	printf("--- 2.删除 --- 3.修改 -------\n");
	printf("-----------------------------\n");
	printf("--- 4.查询 --- 5.显示 -------\n");
	printf("-----------------------------\n");
}

int main()
{
	int input;
	do
	{
		menu();
		printf("请输入要执行的操作->");
		scanf("%d", &input);

		switch (input)
		{
		case 0:
			printf("退出成功\n");
			break;
		case 1:
			//增加
			break;
		case 2:
			//删除
			break;
		case 3:
			//修改
			break;
		case 4:
			//查询
			break;
		case 5:
			//显示
			break;
		default:
			printf("输入无效\n");
			break;
		}
	} while (input);
	return 0;
}

3. 初始化通讯录

1. 初始化通讯录。利用memset将存放结构体的数组置0,计数也置为0。

void InitCont(Cont* cont)
{
	//将数组置为0
	memset(cont, 0, sizeof(cont->data));
	//将计数置为0
	cont->cout = 0;

	return;
}

4. 增加联系人 

1. 先判断是否满了,满了就不能增加了。

2. 如果没满,输入信息,将计数作为数组下标存放,计数加1。

void AddInfo(Cont* cont)
{
	if (cont->cout == DATA_MAX)
	{
		printf("通讯录已满,不能新增\n");
		return;
	}

	//利用计数作为数组下标
	printf("姓名:");
	scanf("%s", cont->data[cont->cout].name);
	printf("性别:");
	scanf("%s", cont->data[cont->cout].sex);
	printf("年龄:");
	scanf("%d", &(cont->data[cont->cout].age));
	printf("电话:");
	scanf("%s", cont->data[cont->cout].tele);
	printf("住址:");
	scanf("%s", cont->data[cont->cout].addr);

	//增加一个元素,计数+1
	cont->cout++;
}

5. 显示所有联系人

1. 不用修改数据所以参数可以加const。

2. 根据计数得到元素个数然后遍历打印信息。

3. %10s 表示输出宽度为10并且右对齐,%-10s 加个负号表示左对齐。

void ShowInfo(const Cont* cont)
{
	printf("%-10s\t%-5s\t%-4s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "住址");
	for (int i = 0; i < cont->cout; i++)
	{
		printf("%-10s\t%-5s\t%-4d\t%-12s\t%-20s\n",
			cont->data[i].name,
			cont->data[i].sex,
			cont->data[i].age,
			cont->data[i].tele,
			cont->data[i].addr);
	}
}

6. 删除联系人

1. 在实现删除之前我们先写一个另外的函数,这个函数是根据输入的姓名,返回它所对应的数组下标。

2. 将最后一个元素覆盖到要删除的地方,然后计数减减。

void DelInfo(Cont* cont)
{
	printf("输入你要删除的名字->");
	char name[10];
	scanf("%s", name);
	//根据名字返回下标
	int index = FindByName(cont, name);
	//找不到
	if (index == -1)
	{
		printf("没有这个人\n");
		return;
	}
	//找到了
	//将最后一个元素覆盖到要删除的地方,然后计数减减
	cont->data[index] = cont->data[cont->cout - 1];
	cont->cout--;
}

7. 查询联系人

1. 查询不会修改数据所以参数可以加const。

2. 复用前面写的FindByName函数,通过名字返回下标,根据下标打印数据。

void SeleInfo(const Cont* cont)
{
	printf("输入你要查询的名字->");
	char name[10];
	scanf("%s", name);
	
	int index = FindByName(cont, name);
	if (index == -1)
	{
		printf("没有这个人\n");
		return;
	}
	printf("%-10s\t%-5s\t%-4s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "住址");
	printf("%-10s\t%-5s\t%-4d\t%-12s\t%-20s\n",
		cont->data[index].name,
		cont->data[index].sex,
		cont->data[index].age,
		cont->data[index].tele,
		cont->data[index].addr);
}

7. 修改联系人

1. 输入名字找到下标。

2. 利用scanf修改信息。

void ModInfo(Cont* cont)
{
	printf("输入你要修改的名字->");
	char name[10];
	scanf("%s", name);

	int index = FindByName(cont, name);
	if (index == -1)
	{
		printf("没有这个人\n");
		return;
	}
	//利用scanf修改信息
	printf("姓名:");
	scanf("%s", cont->data[index].name);
	printf("性别:");
	scanf("%s", cont->data[index].sex);
	printf("年龄:");
	scanf("%d", &(cont->data[index].age));
	printf("电话:");
	scanf("%s", cont->data[index].tele);
	printf("住址:");
	scanf("%s", cont->data[index].addr);
}

代码仓库 

完整代码

Contact/Contact · 林宇恒/code_c - 码云 - 开源中国 (gitee.com)

标签:index,cont,一步,scanf,C语言,通讯录,printf,t%,data
From: https://blog.csdn.net/m0_71164215/article/details/140542073

相关文章

  • C语言典型例题7
    本系列博客针对于《C程序设计教程(第四版)——谭浩强编著》这本书中的所有例题和习题进行了详细的解释和学习,希望可以对你学习C语言可以有所帮助。有些代码可能会在前面详细解释,后面会一笔带过,希望大家可以多多翻阅,谢谢大家啦!!!嘻嘻!!!例题:求5!。//《C程序设计教程(第4版)——谭浩强......
  • 洛谷P1012 拼数 C语言
    这个题可以用字符串去做,接受字符来去计算大小,这里可以用到strcmp函数str1="123"str2="124"strcmp(str1,str2)如果说str1比str2大就会返回大于0的数,一般是1;如果相等返回0,小于返回-1.它是比较这两个字符串的ascll值来比较的,比方说3的ascll值就比4小,那么前面的都相同,那......
  • C语言_数组(1)
    一、一维数组1、数组的创建方式:数组是有限个相同类型数据元素的集合。type_t arr_name [const_n];//type_t是指数组的元素类型//const_n是一个常量表达式,用来指定数组的大小创建例子:注意:数组在创建时,[]里的必须是常量。但是如果编译器支持C99标准的话可以使用......
  • 顺序表实现队列(c语言)
    队列概念篇图示代码篇1.队列的声明2.队列的创建3.队列的销毁4.队列扩容5.入列6.出列6.队首元素7.队列的元素个数完整代码运行结果建议你在看这篇文章先看一下顺序表知识。我在这里通过顺序表的写法实现先进先出的特征来实现队列。当然顺序表也可以实现栈,感......
  • 线性表——链表(c语言)
    链表概念篇示意图1.单向链表2.双向链表3.循环链表4.链表的元素插入5.链表的元素删除代码篇1.链表的定义2.链表的创建3.链表的销毁4.链表的元素插入5.链表的元素删除6.链表的元素查找7.链表下标对应的结点8.链表元素的修改9.链表的打印10.完整代码代码运行效果概......
  • 【c语言】日日练-通讯录
    通讯录题目解析(实现过程+要点)代码test.c(测试功能)contact.c(通讯录相关的实现)contact.h(通讯录相关的声明)题目实现一个通讯录,人的信息包括(姓名、年龄、性别、电话、地址)实现功能:1、存放100个人的信息2、增加联系人3、删除指定联系人4、查找联系人5、修改联系......
  • C语言运算符
    1.算术运算符+加法-减法*乘法/除法%取余 计算时,数据类型不一样的不能直接运算,需要转换成一样的才能运算,有两种转换方式。1.1隐式转换把一个取值范围小的,转换为取值范围大的,隐式转换是计算机自己就可以完成的,不会产生错误的。数据类型从大的到小的顺序为:double>float>lon......
  • C语言函数详解
    函数的概念不同于数学上的函数,在C语言中,函数(function)就是一个完成某项特定任务的一段代码,所以函数也叫子程序。函数的分类库函数为了提高写代码的效率,C语言的国际标准ANSIC规定了一些常用的函数的标准,被称为标准库。不同的编译器厂商根据ANSI提供的标准就给出了一系列函数......
  • C语言基础(二)
    数据类型    数据类型介绍:            整型类型来描述整数,字符类型来描述字符,浮点型类型来描述小数;    字符型:char//character[signed]char//有符号的unsignedchar//⽆符号的    整型://短整型short[int][signed]s......
  • C语言基础(四)
    printf库函数基本用法:printf()的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的f代表format(格式化),表⽰可以定制输出⽂本的格式。#include<stdio.h>intmain(){printf("Hello,world");return0;}printf()不会在行尾自动添加换行符,运行结束后,光标就停留在输......