用C实现通讯录(详细讲解+源码)

 前言

📚作者简介:爱编程的小马,正在学习C/C++,Linux及MySQL..

📚以后会将数据结构收录为一个系列,敬请期待

● 本期内容会给大家带来通讯录的讲解,主要是利用结构体来实现通讯录,该通讯录可以存储几百人甚至是几千人的信息,每个信息包括:姓名,年龄,性别,电话以及地址。准备好了就跟着小马出发吧。


通讯录

 前言

1.通讯录环境及文件配置

2.通讯录的实现

2.1 通讯录的功能

2.2 通讯录的定义

2.3 录入人员信息的函数实现

2.4 定义检查人员是否存在函数

 2.5 删除通讯录中已经存在的信息函数实现

 2.6 查找通讯录成员函数

2.7 修改通讯录成员函数

2.8 显示通讯录

2.9 给通讯录排序

3.通讯录全部源码

3.1 test.c

3.2 contact.h

3.3 contact.c

总结


 

1. 通讯录环境及文件配置

本通讯录是在VS2019的环境下,需要创建三个文件,test.c ,contact.c ,contact.h

test.c //主函数,调用通讯录相关功能

contact.c //函数功能的实现

contact.h //函数头文件的包含及函数的声明

2. 通讯录的实现

2.1 通讯录的功能

2.2 通讯录的定义

首先需要一个菜单,可以提供给玩家选择:

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");
}

 通讯录的定义:

1、封装一个结构体信息用来存储人员信息

2、再需要一个结构体数组来管理这个人员信息(暂时能存储100个人)


#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 20
#define ADDR_MAX 30
#define ADD_ONCE 2
#define MAX 100
typedef struct peoinfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}peoinfo;
typedef struct contact
{
	peoinfo data [MAX];
	int sz;
}contact;

2.3 录入人员信息的函数实现

1、判断:如果人员信息录入满了就不再录入了

2、挨个录入姓名,年龄,性别,电话以及住址,录入完成后打印增加成功,然后记录人员信息的sz往后走一步(sz++)

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

2.4 定义检查人员是否存在函数

为什么要定义这个函数呢?因为两点原因:1、后面的删除,查找,修改人员信息是不是都要先确定这个人是否存在我们再进行下一步操作。2、在前面定义,后面直接引用即可,不用反复定义


int FindName(contact* pc,char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
			return i;
	}
	return -1;
}

 2.5 删除通讯录中已经存在的信息函数实现

1、判断:如果通讯录为空,就不要删除了,直接返回

2、如果不为空,我们就调用检查人员是否存在这个函数,如果存在,则继续,如果不存在,就返回

3、如果有这个人,那应该从这个人的地址往后,依次向前覆盖,最后总数sz-1是不是就完成了删除

void DelContact(contact* pc)
{
	char name[NAME_MAX];
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	int ret = FindName(pc, name);
	if (ret == -1)
	{
		printf("查无此人,无法删除请重试\n");
		return;
	}
	int i = 0;
	for (i = ret; i < ret - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

 2.6 查找通讯录成员函数

1、判断:如果通讯录为空,不要查找了直接返回

2、调用检查人员存在函数,如果没有就直接返回,如果存在就直接打印人员信息

void SearchContact(contact* pc)
{
	char name[NAME_MAX];
	int i = 0;
	printf("请输入被查找人的名字:>");
	scanf("%s", name);
	int ret = FindName(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
	}
	else
	{
		printf("%-20s%-5s%-5s%-12s%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%-20s%-5d%-5s%-12s%-20s\n", pc->data[ret].name,
			pc->data[ret].age,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].addr);
	}
}

2.7 修改通讯录成员函数

1、判断:如果通讯录为空就不要修改了,直接返回

2、调用检查人员存在函数,如果没有就直接返回,如果存在就直接修改人员信息

void ModifyContact(contact* pc)
{
	char name[NAME_MAX];
	int i = 0;
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int ret = FindName(pc, name);
	if (ret == -1)
		printf("要修改的人不存在\n");
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[ret].name);
		printf("请输入年龄:>");
		scanf("%d", &pc->data[ret].age);
		printf("请输入性别:>");
		scanf("%s", pc->data[ret].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[ret].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[ret].addr);
		printf("修改成功\n");
	}
	
}

2.8 显示通讯录

void ShowContact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
		printf("通讯录为空,无需打印\n");
	else
	{
		int i = 0;
		for (i = 0; i < pc->sz; i++)
		{
			printf("%-20s%-5s%-5s%-12s%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
			printf("%-20s%-5d%-5s%-12s%-20s\n", pc->data[i].name,
										 pc->data[i].age,
										 pc->data[i].sex,
										 pc->data[i].tele,
										 pc->data[i].addr);
		}
	}
}

2.9 给通讯录排序

1、首先需要确定按什么排序

2、实现的思想是使用qsort函数

void menun()
{
	printf("******************************\n");
	printf("**** 1.按名字    2.按年龄 ****\n");
	printf("**** 3.按性别    4.按电话 ****\n");
	printf("**** 5.按地址             ****\n");
	printf("******************************\n");
}
int NAME(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name);
}

int AGE(const void* p1, const void* p2)
{
	return (((peoinfo*)p1)->age- ((peoinfo*)p2)->age);
}
int SEX(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->sex, ((peoinfo*)p2)->sex);
}
int TELE(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->tele, ((peoinfo*)p2)->tele);
}
int ADDR(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr);
}
void SortContact(contact* pc)
{
	menun();
	int input = 0;
	printf("请输入排序的方式:>");
	scanf("%d", &input);
	int (*cmp[6])(const void* p1, const void* p2) = { NULL,NAME,AGE,SEX,TELE,ADDR};
	switch (input)
	{
	case 1:
		qsort(pc->data, pc->sz, sizeof(peoinfo), cmp[input]);
		break;
	case 2:
		qsort(pc->data, pc->sz, sizeof(peoinfo), cmp[input]);
		break;
	case 3:
		qsort(pc->data, pc->sz, sizeof(peoinfo), cmp[input]);
		break;
	case 4:
		qsort(pc->data, pc->sz, sizeof(peoinfo), cmp[input]);
		break;
	case 5:
		qsort(pc->data, pc->sz, sizeof(peoinfo), cmp[input]);
		break;
	default:
		printf("输入非法\n");
	}
	printf("排序成功\n");
}

3. 通讯录全部源码

3.1 test.c

#define  _CRT_SECURE_NO_WARNINGS 1
#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");


}
enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};
int main()
{
	int input = 0;
	contact con;
	Init(&con);
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case EXIT:
			{
			printf("退出程序\n");
			break;
			}
			
		default:
			printf("非法输入,请重新输入\n");
		}
	} while (input);
	return 0;
}

3.2 contact.h

#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 20
#define ADDR_MAX 30
#define ADD_ONCE 2
#define MAX 100
typedef struct peoinfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}peoinfo;
typedef struct contact
{
	peoinfo data [MAX];
	int sz;
}contact;

void Init(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);

void free_contact(contact *pc);

3.3 contact.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void Init(contact* pc)
{
	//静态版
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}
void AddContact(contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)
	{
		printf("通讯录已满,请删除后重试\n");
		return;
	}
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加成功\n");
}

void ShowContact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
		printf("通讯录为空,无需打印\n");
	else
	{
		int i = 0;
		for (i = 0; i < pc->sz; i++)
		{
			printf("%-20s%-5s%-5s%-12s%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
			printf("%-20s%-5d%-5s%-12s%-20s\n", pc->data[i].name,
										 pc->data[i].age,
										 pc->data[i].sex,
										 pc->data[i].tele,
										 pc->data[i].addr);
		}
	}
}

//从后往前覆盖就好了,总数删除完毕之后再减一个


int FindName(contact* pc,char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
			return i;
	}
	return -1;
}
void DelContact(contact* pc)
{
	char name[NAME_MAX];
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	int ret = FindName(pc, name);
	if (ret == -1)
	{
		printf("查无此人,无法删除请重试\n");
		return;
	}
	int i = 0;
	for (i = ret; i < ret - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}


void SearchContact(contact* pc)
{
	char name[NAME_MAX];
	int i = 0;
	printf("请输入被查找人的名字:>");
	scanf("%s", name);
	int ret = FindName(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
	}
	else
	{
		printf("%-20s%-5s%-5s%-12s%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%-20s%-5d%-5s%-12s%-20s\n", pc->data[ret].name,
			pc->data[ret].age,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].addr);
	}
}


void ModifyContact(contact* pc)
{
	char name[NAME_MAX];
	int i = 0;
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int ret = FindName(pc, name);
	if (ret == -1)
		printf("要修改的人不存在\n");
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[ret].name);
		printf("请输入年龄:>");
		scanf("%d", &pc->data[ret].age);
		printf("请输入性别:>");
		scanf("%s", pc->data[ret].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[ret].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[ret].addr);
		printf("修改成功\n");
	}
	
}

void menun()
{
	printf("******************************\n");
	printf("**** 1.按名字    2.按年龄 ****\n");
	printf("**** 3.按性别    4.按电话 ****\n");
	printf("**** 5.按地址             ****\n");
	printf("******************************\n");
}
int NAME(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name);
}

int AGE(const void* p1, const void* p2)
{
	return (((peoinfo*)p1)->age- ((peoinfo*)p2)->age);
}
int SEX(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->sex, ((peoinfo*)p2)->sex);
}
int TELE(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->tele, ((peoinfo*)p2)->tele);
}
int ADDR(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr);
}
void SortContact(contact* pc)
{
	menun();
	int input = 0;
	printf("请输入排序的方式:>");
	scanf("%d", &input);
	int (*cmp[6])(const void* p1, const void* p2) = { NULL,NAME,AGE,SEX,TELE,ADDR};
	switch (input)
	{
	case 1:
		qsort(pc->data, pc->sz, sizeof(peoinfo), cmp[input]);
		break;
	case 2:
		qsort(pc->data, pc->sz, sizeof(peoinfo), cmp[input]);
		break;
	case 3:
		qsort(pc->data, pc->sz, sizeof(peoinfo), cmp[input]);
		break;
	case 4:
		qsort(pc->data, pc->sz, sizeof(peoinfo), cmp[input]);
		break;
	case 5:
		qsort(pc->data, pc->sz, sizeof(peoinfo), cmp[input]);
		break;
	default:
		printf("输入非法\n");
	}
	printf("排序成功\n");
}

总结

上文就是通讯录的详细讲解和全部源码,下一节会给大家更新动态内存存储相关的知识。

如果这份博客对大家有帮助,希望各位给小马一个大大的点赞鼓励一下,如果喜欢,请收藏一下,谢谢大家!!!
制作不易,如果大家有什么疑问或给小马的意见,欢迎评论区留言。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一周学会Django5 Python Web开发 - Django5 ORM数据库事务

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计50条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

如何给MP3添加专辑封面

MP3的专辑封面可以直接显示在音频播放器上&#xff0c;但如果我们的音乐文件没有专辑封面怎么办&#xff1f;下面来给大家介绍如何添加mp3封面 打开智游剪辑&#xff08;官网&#xff1a;zyjj.cc&#xff09;&#xff0c;搜索音乐封面添加 我们上传一下音乐文件和专辑封面&…

8 聚类算法

目录 0 背景 1 Kmeans 1.1 聚类数量k的确定 2 DBSCAN 2.1 三个点 2.2 算法流程 3 层次聚类 3.1 过程 4 基于分布的聚类:高斯混合模型 0 背景 聚类算法是一种无监督学习技术&#xff0c;用于将数据集中的数据点划分为不同的组或簇&#xff0c;使得同一组内的数据点彼此相…

【微信公众平台】扫码登陆

文章目录 前置准备测试号接口配置 带参数二维码登陆获取access token获取Ticket拼装二维码Url编写接口返回二维码接收扫描带参数二维码事件编写登陆轮训接口测试页面 网页授权二维码登陆生成ticket生成授权地址获取QR码静态文件支持编写获取QR码的接口 接收重定向参数轮训登陆接…

Linux的vim下制作进度条

目录 前言&#xff1a; 回车和换行有区别吗&#xff1f; 回车和换行的区别展示&#xff08;这个我在Linux下演示&#xff09; 为什么会消失呢? 回车和换行的区别 为什么\r和\n产生的效果不同&#xff1f; 打印进度条&#xff1a; &#xff08;1&#xff09;打印字符串 …

【再探】设计模式—抽象工厂及建造者模式

抽象工厂模式和建造者模式都属于创建型模式。两者都能创建对应的对象&#xff0c;而创建者模式更侧重于创建复杂对象&#xff0c;将对象的创建过程封装起来&#xff0c;让客户端不需要知道对象的内部细节。 1 抽象工厂模式 需求&#xff1a; 在使用工厂方法模式时&#xff0…

TCP协议关于速率的优化机制-滑动窗口详解

在上一章中&#xff0c;我们讲述了TCP协议在传输过程中的可靠性http://t.csdnimg.cn/BsImO&#xff0c;这里衔接上一篇文章继续讲&#xff0c;TCP协议的特性&#xff0c;TCP协议写完之后就写&#xff0c;Http和Https等内容吧 1. 滑动窗口 这里的滑动窗口不是指算法里面的双指…

品牌百度百科词条需要什么资料?

品牌百度百科词条是一个品牌的数字化名片&#xff0c;更是品牌历史、文化、实力的全面展现。 作为一个相当拿得出手的镀金名片&#xff0c;品牌百度百科词条创建需要什么资料&#xff0c;今天伯乐网络传媒就来给大家讲解一下。 一、品牌基本信息&#xff1a;品牌身份的明确 品…

用 PyTorch 构建液态神经网络(LNN)

用 PyTorch 构建液态神经网络&#xff08;LNN&#xff09; 文章目录 什么是液态神经网络为什么需要液态神经网络LNN 与 RNN 的区别用 PyTorch 实现 LNNStep 1. 导入必要的库Step 2. 定义网络架构Step 3. 实现 ODE 求解器Step 4. 定义训练逻辑 LNN 的缺陷总结 什么是液态神经网络…

C语言-嵌入式-STM32:FreeRTOS说明和详解

Free即免费的&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统。 注意&#xff1a;RTOS不是指某一个确定的系统&#xff0c;而是指一类操作系统。比如&#xff1a;uc/OS&#xff0c;FreeRTOS&#xff0c;RTX&#xff0c;RT-Thread 等这些都…

docker自定义java运行环境镜像

一、下载jre/jdk 压缩包&#xff0c;centos:7基础镜像 1、 下载jdk/dre 下载jdk或jre 官网下载 根据需求下载 jdk:SE Development Kit(开发环境) jre: SE Runtime Environment (运行环境)2、下载centos:7 # 下载centos7 docker镜像 docker pull centos:7#centos查看系统时间 …

面试经典算法题之双指针专题

力扣经典面试题之双指针 ( 每天更新, 每天一题 ) 文章目录 力扣经典面试题之双指针 ( 每天更新, 每天一题 )验证回文串收获 392. 判断子序列 验证回文串 思路 一: 筛选 双指针验证 class Solution { public:bool isPalindrome(string s) {// 所有大写字母 > 小写 去除非字母…

对比mongodb查询的执行计划,说一说组合索引的优化方案(上)

一、背景 Mongodb数据库&#xff0c;有个160w数据量规模的集合&#xff0c;字段多达几十个&#xff0c;随着需求的迭代&#xff0c;查询条件也是五花八门。 为了提高某个查询的效率&#xff0c;结果都以新增索引解决问题&#xff0c;最后多达16个索引。 这里仅贴出本文会提及…

引领农业新质生产力,鸿道(Intewell®)操作系统助力农业机器人创新发展

4月27日至29日&#xff0c;2024耒耜国际会议在江苏大学召开。科东软件作为特邀嘉宾出席此次盛会&#xff0c;并为江苏大学-科东软件“农业机器人操作系统”联合实验室揭牌。 校企联合实验室揭牌 在开幕式上&#xff0c;江苏大学、科东软件、上交碳中和动力研究院、遨博智能研究…

Spring Boot Admin

概述 Spirng Boot Admin 登录页面 Spring Boot Admin是一个用于管理Spring Boot应用的监控工具,它允许你查看和管理多个Spring Boot应用实例。用于应用信息进行界面化的展示&#xff0c;常常辅助我们开发人员快速查看服务运行状态在微服务架构中&#xff0c;Spring Boot Admin通…

中科院突破:TalkingGaussian技术实现3D人脸动态无失真,高效同步嘴唇运动!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;探索高质量3D对话头像的新方法 在数字媒体和虚拟互动领域&#xff0c;高质量的3D对话头像技术正变得日益重要。这种技术能够在虚拟现实、电影…

谷粒商城实战(020 RabbitMQ-消息确认)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第258p-第p261的内容 消息确认 生产者 publishers 消费者 consumers 设置配置类 调用api 控制台 抵达brocker 代理 新版本ReturnCallbac…

【webrtc】MessageHandler 8: 基于线程的消息处理:处理音频输入输出断开

m98代码,看起来m114 去掉了MessageHandler :音频的录制和播放 都使用了on message,但只是用来通知并处理流的断开的。AAudioRecorder AAudioRecorder 处理流断开 OnErrorCallback :有可能 错误回调是别处来的,是其他线程, 但是这个错误的处理要再自己的线程执行: 音频播…

北京大学肖臻老师《区块链技术与应用》P14(ETH概述)和P15(ETH账户)

1️⃣ 参考 北京大学肖臻老师《区块链技术与应用》 P14 - ETH概述篇P15 - ETH账户篇 1️⃣4️⃣ETH概述 ① 比特币与以太坊的对比 比特币&#xff08;区块链 1.0&#xff09;以太坊&#xff08;区块链 2.0&#xff09;出块时间大约10 min十几秒mining puzzle计算密集型Memo…

【计算智能】基本遗传算法在优化问题中的应用与实验【理论到程序】

文章目录 1. 引言&#xff1a;遗传算法简介2. 基本遗传算法&#xff08;SGA&#xff09;2.1 基本遗传算法的构成要素1. 染色体编码2. 适应度函数3. 遗传算子 2.2 实验设计与方法1. 算法流程2. 伪代码3. python实现1. 导入模块2. 目标函数 f(x)3 初始化种群4. 计算适应度5. 选择…