C语言:通讯录(纯代码)

news2025/2/26 14:15:04

目录

背景:VS2019编译器

创建文件:

contact.h代码:

test.c代码:

contact.c代码:


背景:VS2019编译器

创建文件:

contact.h代码:

#pragma once

#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <windows.h>

//类型声明
typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[10];
	char tele[12];
	char addr[30];
}PeoInfo;

//通讯录
typedef struct Contact
{
	PeoInfo data[100];//存放人的信息
	int count;		//记录当前通讯录中实际存储人的信息个数。
}Contact;


//初始化通讯录
void InitContact(Contact* pc);

//增加通讯录信息
void AddContact(Contact* pc);

//显示通讯录信息
void ShowContact(Contact* pc);

//删除通讯录信息
void DelContact(Contact* pc);

//查找通讯录信息
void SearchContact(Contact* pc);

//修改通讯录信息
void ModifyContact(Contact* pc);

//排序通讯录信息
void SortContact(Contact* pc);

test.c代码:

#define _CRT_SECURE_NO_WARNINGS
//实现通讯录
//测试文件
#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()
{
	int input = 0;
	Contact con;		//通讯录
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:		//增加
			AddContact(&con);
			break;
		case 2:		//删除
			DelContact(&con);
			break;
		case 3:		//查找
			SearchContact(&con);
			break;	
		case 4:		//修改
			ModifyContact(&con);
			break;
		case 5:		//显示
			ShowContact(&con);
			break;
		case 6:		//排序
			SortContact(&con);
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新输入\n");
			break;
		}
	} while(input);

	return 0;
}

contact.c代码:

#define _CRT_SECURE_NO_WARNINGS
//通讯录模块文件
#include "contact.h"

#define MAX 100

void InitContact(Contact* pc)
{
	assert(pc);
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));
}


void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->count == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pc->count].age);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->count].addr);
	pc->count++;
	printf("增加成功\n");
}

void ShowContact(Contact* pc)
{
	assert(pc);
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	int i = 0;
	for (i = 0;i < pc->count;i++)
	{
		printf("%-20s\t", pc->data[i].name);
		printf("%-5d\t", pc->data[i].age);
		printf("%-5s\t", pc->data[i].sex);
		printf("%-12s\t", pc->data[i].tele);
		printf("%-30s\n", pc->data[i].addr);
	}
}

static int FindName(Contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0;i < pc->count;i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}

	return -1;
}

void DelContact(Contact* pc)
{
	assert(pc);
	printf("请输入要删除的人名:>");
	char name[20] = { 0 };
	scanf("%s", name);
	int flag = FindName(pc, name);
	if (flag == -1)
	{
		printf("要删除的信息不存在\n");
		return;
	}
	else
	{
		int i = 0;
		for (i = flag;i < pc->count - 1;i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->count--;
		printf("删除成功。\n");
	}

}

void SearchContact(Contact* pc)
{
	assert(pc);
	printf("请输入要查找人的名字:");
	char name[20] = { 0 };
	scanf("%s", name);
	//查找
	int flag = FindName(pc, name);
	if (flag == -1)
	{
		printf("找不到该信息。\n");
		return;
	}
	else
	{
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",pc->data[flag].name,pc->data[flag].age, pc->data[flag].sex, pc->data[flag].tele, pc->data[flag].addr);
	}
}

void ModifyContact(Contact* pc)
{
	assert(pc);
	printf("请输入要修改的人名:");
	char name[20] = { 0 };
	scanf("%s", name);
	//查找
	int flag = FindName(pc, name);
	if (flag == -1)
	{
		printf("找不到该信息。\n");
		return;
	}
	else
	{
		printf("请输入修改后的名字:>");
		scanf("%s", pc->data[flag].name);
		printf("请输入修改后的年龄:>");
		scanf("%d", &pc->data[flag].age);
		printf("请输入修改后的性别:>");
		scanf("%s", pc->data[flag].sex);
		printf("请输入修改后的电话:>");
		scanf("%s", pc->data[flag].tele);
		printf("请输入修改后的地址:>");
		scanf("%s", pc->data[flag].addr);
		printf("修改成功\n");
	}
}

void SortContact(Contact* pc)
{
	assert(pc);
	//冒泡排序,按名字升序
	int i = 0;
	int j = 0;
	PeoInfo C = { 0 };
	for (i = 0;i < pc->count;i++)
	{
		for (j = 1;j < pc->count - i;j++)
		{
			if (strcmp(pc->data[j - 1].name, pc->data[j].name) > 0)
			{
				C = pc->data[j - 1];
				pc->data[j - 1] = pc->data[j];
				pc->data[j] = C;
			}
		}
	}
	printf("排序成功。");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1504813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二课 情感认知模型

一、学习目标 1.学习各种思想的情感模型 2.了解通过情感诱发方法所建立的情感模型 二、情感模型 想要进行情感计算&#xff0c;首先步骤就是对情感建模&#xff0c;要分析理解情感的产生&#xff0c;从而才能让计算机理解情感。由于情感是感性的&#xff0c;所以现有的情感模…

设计模式 代理模式

代理模式主要使用了 Java 的多态&#xff0c;主要是接口 干活的是被代理类&#xff0c;代理类主要是接活&#xff0c; 你让我干活&#xff0c;好&#xff0c;我交给幕后的类去干&#xff0c;你满意就成&#xff0c;那怎么知道被代理类能不能干呢&#xff1f; 同根就成&#xff…

ai学习前瞻-python环境搭建

python环境搭建 Python环境搭建1. python的安装环境2. MiniConda安装3. pycharm安装4. Jupyter 工具安装5. conda搭建虚拟环境6. 安装python模块pip安装conda安装 7. 关联虚拟环境运行项目 Python环境搭建 1. python的安装环境 ​ python环境安装有4中方式。 从上图可以了解…

BulingBuling - 《金钱心理学》 [ The Psychology of Money ]

金钱心理学 摩根-豪泽尔 关于财富、贪婪和幸福的永恒课程 The Psychology of Money Morgan Housel Timeless Lessons on Wealth, Greed, and Happiness 内容简介 [ 心理学 ] [ 金钱与投资 ] Whats it about? [ Psychology ] [ Money & Investments ] 《金钱心理学》&…

Jmeter---非GUI命令行的执行生成报告、使用ant插件执行接口测试脚本生成报告

非GUI命令行的执行 1. 在jmx后缀的文件目录下打开命令行 2. 运行&#xff1a; jmeter -n -t filename.jmx&#xff08;-n : 非GUI的方式 -t: 指定需要执行的脚本&#xff09; 生成jtl报告 运行&#xff1a; jmeter -n -t filename.jmx -l result_filename.jtl 生成html报…

【解读】OWASP大语言模型应用程序十大风险

OWASP大型语言模型应用程序前十名项目旨在教育开发人员、设计师、架构师、经理和组织在部署和管理大型语言模型&#xff08;LLM&#xff09;时的潜在安全风险。该项目提供了LLM应用程序中常见的十大最关键漏洞的列表&#xff0c;强调了它们的潜在影响、易利用性和在现实应用程序…

剑指offer经典题目整理(二)

一、斐波那契数列&#xff08;fib&#xff09; 1.链接 斐波那契数列_牛客题霸_牛客网 (nowcoder.com) 2.描述 斐波那契数列就是数列中任意一项数字&#xff0c;都会等于前两项之和&#xff0c;满足f(n) f(n-1) f(n-2) 的一个数列&#xff0c;例如&#xff1a;1 1 2 3 5 8…

类与对象-对象特性

师从黑马程序员 对象的初始化和清理 构造函数和析构函数 用于完成对象的初始化和清理工作 如果我们不提供构造和析构&#xff0c;编译器会提供编译器提供的构造函数和析构函数是空实现 构造函数&#xff1a;主要用于创建对象时为对象的成员属性赋值&#xff0c;构造函数由编…

CSS伪类与常用标签属性整理与块级、行级、行级块标签(文本,背景,列表,透明,display)

目录 文本 color&#xff1a;字体颜色 font-size&#xff1a;字体大小​编辑 front-family&#xff1a;字体 text-align&#xff1a;文本对齐 text-decoration:line-through&#xff1a;定义穿过文本下的一条线 text-decoration:underline&#xff1a;定义文本下的一条线…

7-15 2.2 译密码

输入5个字母&#xff0c;将其译成密码&#xff0c;密码规律是&#xff1a;用原来的字母后面第4个字母代替原来的字母。例如&#xff1a;A被E代替&#xff0c;C被G代替。 输入格式: 输入一行5个字符 输出格式: 输出一行5个字符 输入样例: China输出样例: Glmre #include …

前端框架的发展历程

文章目录 前言 一、静态页面时代 二、JavaScript的兴起 三、jQuery的出现 四、前端框架的崛起 1.AngularJS 2.React 3.Vue.js 五、面向组件化的发展趋势 总结 前言 前端框架的发展史就是一个不断进化的过程&#xff0c;它的发展和进化一定程度…

消息服务--Kafka的简介和使用

消息服务--Kafka的简介和使用 前言异步解耦削峰缓存1、消息队列2、kafka工作原理3、springBoot KafKa整合3.1 添加插件3.2 kafKa的自动配置类3.21 配置kafka地址3.22 如果需要发送对象配置kafka值的序列化器3.3 测试发送消息3.31 在发送测试消息的时候由于是开发环境中会遇到的…

flask-sqlalchemy库

彩笔激流勇退。 1. 简介 ORM&#xff0c;对象关系映射。简单来说&#xff0c;ORM将数据库中的表与面向对象中的类建立了一种对应关系。这样&#xff0c;我们要操作数据库&#xff0c;表&#xff0c;记录就可以直接通过操作类或者类实例来完成。 SQLAlchemy 是目前python中最…

连接时序分类 Connectionist Temporal Classification (CTC)

CTC全称Connectionist temporal classification&#xff0c;是一种常用在语音识别、文本识别等领域的算法&#xff0c;用来解决输入和输出序列长度不一、无法对齐的问题。在CRNN中&#xff0c;它实际上就是模型对应的损失函数(CTC loss)。 一、背景 字母和语音的对齐(align)非…

Redis 内存的优化

目录 前言 Redis 的内存碎片问题 判断Redis 内存碎片 如何清理内存碎片&#xff1f; 前言 我想讲一下怎么提高Redis 内存的利用率&#xff0c;redis 的数据是保存在内存中。对内存的利用率低&#xff0c;意味着存的数据很少&#xff0c;并不意味着就没有内存了&#xff0c…

React-路由导航

1.声明式路由导航 1.1概念 说明&#xff1a;声明式导航是指通过在模版中通过<Link/>组件描述出要跳转到哪里去&#xff0c;比如后台管理系统的左侧菜单通常使用这种方式进行。 import {Link} from "react-router-dom" const Login()>{return (<div>…

[nlp入门论文精读] | Transformer

写在前面 最近工作从CV转向了NLP&#xff0c;于是空余时间便跟着哔哩哔哩李沐老师的视频学习。其实研一NLP课程讲论文的时候&#xff0c;我们小组就选择了经典的Attention和Bert&#xff0c;但还有很多细节并不完全理解&#xff0c;实际使用时也很困惑。 因此这个系列就来记…

Spring学习 基础(三)MVC

5、Spring MVC 传统Web模式&#xff1a; Model:系统涉及的数据&#xff0c;也就是 dao 和 bean。View&#xff1a;展示模型中的数据&#xff0c;只是用来展示。Controller&#xff1a;处理用户请求都发送给 &#xff0c;返回数据给 JSP 并展示给用户。 随着 Spring 轻量级开发…

【python】time库知识整理

简介 python的time库是python内置库&#xff0c;主要负责处理与时间相关的事务。 获取当前时间 函数作用time()获取当前时间戳ctime()获取字符串形式的时间gmtime()调用内部方法&#xff0c;赋予属性&#xff0c;能够被程序调用执行 time返回的是时间戳 ctime是返回的我们…

智慧安防视频远程监控平台EasyCVR集成后播放只有一帧画面是什么原因?

智慧安防视频监控平台EasyCVR能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台可支持的接入协议包括&#xff1a;国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议…