通讯录的动态实现

文章目录

  • 通讯录的动态实现
    • 模块化编程
    • 通讯录的框架构建
    • 功能的具体实现
        • 初始化通讯录
        • 添加联系人
        • 删除联系人
        • 查找联系人
        • 修改联系人
        • 打印通讯录
        • 排序通讯录
        • 检查容量并扩容
        • 加载通讯录
        • 保留通讯录
        • 销毁通讯录
    • 完整代码
    • 总结

通讯录的动态实现

模块化编程

分文件
不同模块放在不同的文件下
优点
可维护性:不同模块便于调试某个功能和修改
重用性:常用的功能封装成模块,减少重复利用,提高开发效率
可扩展性:需要增删改现有功能时,模块化编程能够提供更好的扩展性
并行开发:允许多个开发人员并行工作,降低开发过程中的冲突和合并的风险
可测试性:每个模块都是独立的,便于测试功能和性能

通讯录的框架构建

录入联系人信息
由于录入人员一般比较多,需要用创建结构体来创建通讯录结构体和成员信息结构体
录入的信息一般有联系人的姓名、性别、年龄、联系方式、家庭住址

typedef struct peoinfo
{char name[MAX_NAME];char sex[MAX_SEX];int age;char tele[MAX_TELE];char addr[MAX_ADDR];
}peoinfo;
typedef struct Contact
{peoinfo* data;int count;//用于记录data对应的下标int capacity;}Contact;

宏定义

#define MAX_NAME 20
#define MAX_SEX 3
#define MAX_TELE 12
#define MAX_ADDR 30#define MAX_PEONUM 2
#define MAX_COUNT 3

菜单实现

void menu()
{printf("******************************\n");printf("*****  1.add     2.del   *****\n");printf("*****  3.find    4.sort  *****\n");printf("*****  5.modify  6.print *****\n");printf("*****      0.exit    *********\n");printf("******************************\n");
}

通讯录功能声明

void InitContact(Contact* pc);//初始化
void Addpeoinfo(Contact* pc);//增加联系人
void PrintContact(Contact* pc);//打印通讯录
void Delpeoinfo(Contact* pc);//删除联系人
void Findpeoinfo(Contact* pc);//查找联系人
void Modifypeoinfo(Contact* pc);//修改联系人
void SortContact(Contact* pc);//排序通讯录
void DestroyContact(Contact* pc);//销毁通讯录
void SaveContact(Contact* pc);//保留通讯录
void LoadContact(Contact* pc);//加载通讯录
void Check_Capacity(Contact* pc);//检查容量

声明都放在Contact.h头文件里

功能的具体实现

初始化通讯录
void InitContact(Contact* pc)
{pc->count = 0;pc->data = (peoinfo*)calloc(MAX_PEONUM ,sizeof(peoinfo));//动态内存管理,在堆区分配一块peoinfo*MAX_PEONUM的内存,并且每个字节初始化为0// memset(pc->data, 0, sizeof(pc->data));pc->capacity = MAX_PEONUM;//LoadContact(pc);
}
添加联系人
void Addpeoinfo(Contact* pc)
{/*assert(pc);if (pc->count = MAX_PEONUM){printf("通讯录已满\n");}else{printf("请输入名字;>");scanf("%s", pc->data[pc->count].name);printf("请输入性别;>");scanf("%s", pc->data[pc->count].sex);printf("请输入年龄;>");scanf("%s", pc->data[pc->count].age);printf("请输入电话;>");scanf("%s", pc->data[pc->count].tele);printf("请输入地址;>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("添加成功\n");}*/assert(pc);//确定不是空指针Check_Capacity(pc);printf("请输入名字:>");scanf("%s", pc->data[pc->count].name);printf("请输入性别:>");scanf("%s", pc->data[pc->count].sex);printf("请输入年龄:>");scanf("%d", &pc->data[pc->count].age);printf("请输入电话:>");scanf("%s", pc->data[pc->count].tele);printf("请输入地址:>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("添加成功\n");}
删除联系人
void Delpeoinfo(Contact* pc)
{assert(pc);char name[MAX_NAME];printf("请输入要删除的联系人的名字;>");scanf("%s", name);int pos = FindName(pc, name);if (pos == -1){printf("通讯录中没有这个人\n");return;}else{int i = 0;for (int i = pos; i < pc->count - 1; i++){pc->data[i] = pc->data[i + 1];}printf("删除成功\n");pc->count--;}
减容,如果容量减去录入的联系人大于3,减少为两个空间if ((pc->capacity - pc->count) > 3){peoinfo* ptr = (peoinfo*)realloc(pc->data, (pc->count + 2) * sizeof(peoinfo));if (ptr != NULL){pc->data = ptr;pc->capacity = pc->count + 2;printf("通讯录空闲内存大于三个人,减为两个空间,减容成功\n");}else{perror("Delpeoinfo");//perror是打印错误信息}}
}
查找联系人

查找联系人可以通过找到联系人对应名字,并返回下标记录是否找到
需要再封装一个函数

查找名字

static int FindName(const Contact* pc,const char *name)
{assert(pc && name);for (int pos = 0; pos < pc->count; pos++){if (strcmp(pc->data[pos].name, name) == 0){return pos;//返回下标}elsereturn -1;}
}
void Findpeoinfo(const Contact* pc)
{assert(pc);char name[MAX_NAME];printf("请输入你要查找的联系人的名字:>");scanf("%s", name);int pos = FindName(pc, name);if (pos == -1){printf("查无此人\n");}else{printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",pc->data[pos].name,pc->data[pos].sex,pc->data[pos].age,pc->data[pos].tele,pc->data[pos].addr);}}
修改联系人
void Modifypeoinfo(Contact* pc) 
{assert(pc);char name[MAX_NAME];printf("请输入你要修改的联系人:>");scanf("%s", name);int pos = FindName(pc, name);if (pos == -1){printf("查无此人\n");return ;}else{printf("请输入修改后的名字:>");scanf("%s", pc->data[pos].name);printf("请输入修改后的性别:>");scanf("%s", pc->data[pos].sex);printf("请输入修改后的年龄:>");scanf("%d", &pc->data[pos].age);printf("请输入修改后的电话:>");scanf("%s", pc->data[pos].tele);printf("请输入修改后的地址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n");}
}
打印通讯录
void PrintContact(const Contact* pc)
{printf("---------------------\n");printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");for (int i = 0; i < pc->count; i++){printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr);}printf("---------------------\n");
}

打印int类型要用%d

排序通讯录
int cmp1(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name);
}
int cmp2(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->sex, ((peoinfo*)p2)->sex);
}
int cmp3(const void* p1, const void* p2)
{return ((peoinfo*)p1)->age-((peoinfo*)p2)->age;
}
int cmp4(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->tele, ((peoinfo*)p2)->tele);
}
int cmp5(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr);
}
void sort_by_name(Contact* pc)
{qsort(pc->data, pc->count, sizeof(peoinfo),cmp1);
}
void sort_by_sex(Contact* pc)
{qsort(pc->data, pc->count, sizeof(peoinfo), cmp2);
}
void sort_by_age(Contact* pc)
{qsort(pc->data, pc->count, sizeof(peoinfo), cmp3);
}
void sort_by_tele(Contact* pc)
{qsort(pc->data, pc->count, sizeof(peoinfo), cmp4);
}
void sort_by_addr(Contact* pc)
{qsort(pc->data, pc->count, sizeof(peoinfo), cmp4);
}
void Sortmenu()
{printf("*******************************\n");printf("*****  1.name     2.sex   *****\n");printf("*****  3.age      4.tele  *****\n");printf("*****        5.addr       *****\n");printf("*******************************\n");
}
void SortContact(Contact* pc)
{assert(pc);Sortmenu();printf("请选择如何排序;>");int num = 0;scanf("%d", &num);if (num==1){sort_by_name(pc);}else if (num==2){sort_by_sex(pc);}else if (num==3){sort_by_age(pc);}else if (num==4){sort_by_tele(pc);}else if (num==5){sort_by_addr(pc);}else{printf("输入非法,请重新输入\n");}printf("排序后\n");printf("---------------------\n");printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");for (int i = 0; i < pc->count; i++){printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr);}printf("---------------------\n");}
检查容量并扩容
void Check_Capacity(Contact* pc){if (pc->count == pc->capacity){peoinfo* ptr = (peoinfo*)realloc(pc->data, (pc->capacity + MAX_COUNT) * sizeof(peoinfo));if (ptr != NULL){pc->data= ptr;pc->capacity += MAX_COUNT;printf("增容成功\n");}else {perror("peoinfo");printf("通讯录已满,增容失败无法添加\n");return;}}
}
加载通讯录
void LoadContact(Contact* pc)
{FILE* pf = fopen("Contact.txt", "r");if (pf == NULL){perror("LoadContact");return;}peoinfo temp = { 0 };while (fread(&temp, sizeof(peoinfo), 1, pf)){Check_Capacity(pc);pc->data[pc->count] = temp;pc->count++;}fclose(pf);pf = NULL;
}
保留通讯录
void SaveContact(Contact* pc) 
{FILE* pf = fopen("Contact.txt", "w");//以写的方式打开文件if (pf == NULL){perror("SaveContact");return;}fwrite(pc->data, sizeof(peoinfo),pc->count,pf);fclose(pf);//关闭文件pf = NULL;}

在这里插入图片描述

这里是引用

销毁通讯录

不占用多余的内存空间,养成好习惯

void DestroyContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->count = 0;pc->capacity = 0;
}

完整代码

Contact.h

#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 3
#define MAX_TELE 12
#define MAX_ADDR 30#define MAX_PEONUM 2
#define MAX_COUNT 3
typedef struct peoinfo
{char name[MAX_NAME];char sex[MAX_SEX];int age;char tele[MAX_TELE];char addr[MAX_ADDR];
}peoinfo;
typedef struct Contact
{peoinfo* data;int count;int capacity;}Contact;
void InitContact(Contact* pc);
void Addpeoinfo(Contact* pc);
void PrintContact(Contact* pc);
void Delpeoinfo(Contact* pc);
void Findpeoinfo(Contact* pc);
void Modifypeoinfo(Contact* pc);
void SortContact(Contact* pc);
void DestroyContact(Contact* pc);
void SaveContact(Contact* pc);
void LoadContact(Contact* pc);
void Check_Capacity(Contact* pc);

test.c

#define  _CRT_SECURE_NO_WARNINGS
#include"contact.h"
//1.添加联系人
//2.删除联系人
//3.查找联系人
//排序
//修改联系人
//打印通讯录void menu()
{printf("******************************\n");printf("*****  1.add     2.del   *****\n");printf("*****  3.find    4.sort  *****\n");printf("*****  5.modify  6.print *****\n");printf("*****      0.exit    *********\n");printf("******************************\n");
}
enum option
{EXIT,//无指定默认从0开始ADD,DEL,FIND,SORT,MODIFY,PRINT
};
void test()
{Contact con;InitContact(&con);printf("Welcome to use contact!\n");int input = 0;do{menu();printf("请选择>");scanf("%d", &input);switch (input){case ADD:Addpeoinfo(&con);break;case DEL:Delpeoinfo(&con);break;case FIND:Findpeoinfo(&con);break;case SORT:SortContact(&con);break;case MODIFY:Modifypeoinfo(&con);break;case PRINT:PrintContact(&con);break;case EXIT:SaveContact(&con);LoadContact(&con);printf("退出程序\n");break;default:printf("非法输入,请重`在这里插入代码片`新输入\n");break;}} while (input);
}
int main()
{test();return 0;
}

Contact.c

#define  _CRT_SECURE_NO_WARNINGS
#include"contact.h"void InitContact(Contact* pc)
{pc->count = 0;pc->data = (peoinfo*)calloc(MAX_PEONUM ,sizeof(peoinfo));//动态内存管理,在堆区分配一块peoinfo*MAX_PEONUM的内存,并且每个字节初始化为0// memset(pc->data, 0, sizeof(pc->data));pc->capacity = MAX_PEONUM;LoadContact(pc);
}
void Addpeoinfo(Contact* pc)
{assert(pc);Check_Capacity(pc);printf("请输入名字:>");scanf("%s", pc->data[pc->count].name);printf("请输入性别:>");scanf("%s", pc->data[pc->count].sex);printf("请输入年龄:>");scanf("%d", &pc->data[pc->count].age);printf("请输入电话:>");scanf("%s", pc->data[pc->count].tele);printf("请输入地址:>");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("添加成功\n");}void PrintContact(const Contact* pc)
{printf("---------------------\n");printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");for (int i = 0; i < pc->count; i++){printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr);}printf("---------------------\n");
}
static int FindName(const Contact* pc,const char *name)
{assert(pc && name);for (int pos = 0; pos < pc->count; pos++){if (strcmp(pc->data[pos].name, name) == 0){return pos;//返回下标}elsereturn -1;}
}
void Delpeoinfo(Contact* pc)
{assert(pc);char name[MAX_NAME];printf("请输入要删除的联系人的名字;>");scanf("%s", name);int pos = FindName(pc, name);if (pos == -1){printf("通讯录中没有这个人\n");return;}else{int i = 0;for (int i = pos; i < pc->count - 1; i++){pc->data[i] = pc->data[i + 1];}printf("删除成功\n");pc->count--;}if ((pc->capacity - pc->count) > 3){peoinfo* ptr = (peoinfo*)realloc(pc->data, (pc->count + 2) * sizeof(peoinfo));if (ptr != NULL){pc->data = ptr;pc->capacity = pc->count + 2;printf("通讯录空闲内存大于三个人,减为两个空间,减容成功\n");}else{perror("Delpeoinfo");}}
}
void Findpeoinfo(const Contact* pc)
{assert(pc);char name[MAX_NAME];printf("请输入你要查找的联系人的名字:>");scanf("%s", name);int pos = FindName(pc, name);if (pos == -1){printf("查无此人\n");}else{printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",pc->data[pos].name,pc->data[pos].sex,pc->data[pos].age,pc->data[pos].tele,pc->data[pos].addr);}}
void Modifypeoinfo(Contact* pc) 
{assert(pc);char name[MAX_NAME];printf("请输入你要修改的联系人:>");scanf("%s", name);int pos = FindName(pc, name);if (pos == -1){printf("查无此人\n");return ;}else{printf("请输入修改后的名字:>");scanf("%s", pc->data[pos].name);printf("请输入修改后的性别:>");scanf("%s", pc->data[pos].sex);printf("请输入修改后的年龄:>");scanf("%d", &pc->data[pos].age);printf("请输入修改后的电话:>");scanf("%s", pc->data[pos].tele);printf("请输入修改后的地址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n");}
}
int cmp1(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name);
}
int cmp2(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->sex, ((peoinfo*)p2)->sex);
}
int cmp3(const void* p1, const void* p2)
{return ((peoinfo*)p1)->age-((peoinfo*)p2)->age;
}
int cmp4(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->tele, ((peoinfo*)p2)->tele);
}
int cmp5(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr);
}
void sort_by_name(Contact* pc)
{qsort(pc->data, pc->count, sizeof(peoinfo),cmp1);
}
void sort_by_sex(Contact* pc)
{qsort(pc->data, pc->count, sizeof(peoinfo), cmp2);
}
void sort_by_age(Contact* pc)
{qsort(pc->data, pc->count, sizeof(peoinfo), cmp3);
}
void sort_by_tele(Contact* pc)
{qsort(pc->data, pc->count, sizeof(peoinfo), cmp4);
}
void sort_by_addr(Contact* pc)
{qsort(pc->data, pc->count, sizeof(peoinfo), cmp4);
}
void Sortmenu()
{printf("*******************************\n");printf("*****  1.name     2.sex   *****\n");printf("*****  3.age      4.tele  *****\n");printf("*****        5.addr       *****\n");printf("*******************************\n");
}
void SortContact(Contact* pc)
{assert(pc);Sortmenu();printf("请选择如何排序;>");int num = 0;scanf("%d", &num);if (num==1){sort_by_name(pc);}else if (num==2){sort_by_sex(pc);}else if (num==3){sort_by_age(pc);}else if (num==4){sort_by_tele(pc);}else if (num==5){sort_by_addr(pc);}else{printf("输入非法,请重新输入\n");}printf("排序后\n");printf("---------------------\n");printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");for (int i = 0; i < pc->count; i++){printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr);}printf("---------------------\n");}
void DestroyContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->count = 0;pc->capacity = 0;
}
void SaveContact(Contact* pc) 
{FILE* pf = fopen("Contact.txt", "w");if (pf == NULL){perror("SaveContact");return;}fwrite(pc->data, sizeof(peoinfo),pc->count,pf);fclose(pf);pf = NULL;}
void LoadContact(Contact* pc)
{FILE* pf = fopen("Contact.txt", "r");if (pf == NULL){perror("LoadContact");return;}peoinfo temp = { 0 };while (fread(&temp, sizeof(peoinfo), 1, pf)){Check_Capacity(pc);pc->data[pc->count] = temp;pc->count++;}fclose(pf);pf = NULL;
}
void Check_Capacity(Contact* pc){if (pc->count == pc->capacity){peoinfo* ptr = (peoinfo*)realloc(pc->data, (pc->capacity + MAX_COUNT) * sizeof(peoinfo));if (ptr != NULL){pc->data= ptr;pc->capacity += MAX_COUNT;printf("增容成功\n");}else {perror("peoinfo");printf("通讯录已满,增容失败无法添加\n");return;}}
}

总结

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XSKY 智能存储,助力“数据要素 X”先进制造

3 月 21-22 日&#xff0c;主题为“突破 智行”的 IMC2024 第七届中国智造数字科技峰会在重庆召开。作为在先进制造领域拥有领先存储解决方案以及众多应用实践的企业&#xff0c;星辰天合受邀参加了此次峰会并荣获大会颁发的“最佳存储解决方案奖”。同时&#xff0c;星辰天合先…

CISP 4.2备考之《安全支撑技术》知识点总结

文章目录 第一节 密码技术第二节 标识和身份鉴别技术第三节 访问控制技术 第一节 密码技术 密码学发展阶段&#xff1a;古典、近代、现代和公钥密码学及特点。 密码系统组成&#xff1a;明文、加密、密钥、解密、密文。 柯克霍夫原则&#xff1a;密钥保密&#xff0c;算法公开…

手撕算法-删除链表的倒数第 N 个结点

描述 思路 快慢指针&#xff0c;快指针先走N步&#xff0c;走不够N步返回空。慢指针和快指针一起走&#xff0c;当快指针到达终点&#xff0c;即快指针为null时&#xff0c;慢指针到达倒数第N个节点。因为要删除倒数第N个&#xff0c;所以要记录之前的节点pre&#xff0c;假设…

思科网络中DHCP中继的配置

一、什么是DHCP中继&#xff1f;DHCP中继有什么用? &#xff08;1&#xff09;DHCP中继是指一种网络设备或服务&#xff0c;用于在不同的子网之间传递DHCP&#xff08;动态主机配置协议&#xff09;消息。DHCP中继的作用是帮助客户端设备获取IP地址和其他网络配置信息&#x…

开源项目ChatGPT-Next-Web的容器化部署(三)-- k8s deployment.yaml部署

一、说在前面的话 有了docker镜像&#xff0c;要把一个项目部署到K8S里&#xff0c;主要就是编写deployment.yaml。 你需要考虑的是&#xff1a; 环境变量服务的健康检测持久化启动命令程序使用的数据源程序使用的配置文件 因为本前端项目比较简单&#xff0c;这里只做一个…

基于springboot+vue+Mysql的“智慧食堂”设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Vue响应式原理全解析

前言 大家好&#xff0c;我是程序员蒿里行。浅浅记录一下面试中的高频问题&#xff0c;请你谈一下Vue响应式原理。 必备前置知识&#xff0c;​​Vue2​​官方文档中​​深入响应式原理​​​及​​Vue3​​官方文档中​​深入响应式系统​​。 什么是响应式 响应式本质是当…

Redis 不再“开源”,对中国的影响及应对方案

Redis 不再“开源”&#xff0c;使用双许可证 3 月 20 号&#xff0c;Redis 的 CEO Rowan Trollope 在官网上宣布了《Redis 采用双源许可证》的消息。他表示&#xff0c;今后 Redis 的所有新版本都将使用开源代码可用的许可证&#xff0c;不再使用 BSD 协议&#xff0c;而是采用…

基于SpringBoot实现WebSocket实时通讯的服务端和客户端

实现功能 服务端注册的客户端的列表&#xff1b;服务端向客户端发送广播消息&#xff1b;服务端向指定客户端发送消息&#xff1b;服务端向多个客户端发送消息&#xff1b;客户端给服务端发送消息&#xff1b; 效果&#xff1a; 环境 jdk&#xff1a;1.8 SpringBoot&#x…

如何确保多人游戏的配对体验快速而顺利

开发人员知道,游戏玩家在玩游戏时最快乐,他们等待进入多人游戏的时间越长,你失去他们的速度就越快。玩家不喜欢在大厅里等待;他们想马上参与行动。这就是为什么优化匹配是关键。 谷歌(Google)和Unity的Open Match等系统正在加速使用自定义逻辑构建匹配器的能力,使开发人…

跳过mysql权限验证来修改密码-GPT纯享版

建议重新配置一遍&#xff0c;弄成功好多次了&#xff0c;每次都出bug&#xff0c;又要重新弄&#xff0c;不是过期就是又登不进去了&#xff0c;我服了 电脑配置MySQL环境&#xff08;详细&#xff09;这个哥们的10min配完&#xff0c;轻轻松松&#xff0c; 旧方法&#xff…

Python-VBA编程500例-015-03(入门级)

飞行棋(Flying Chess)算法是一种搜索算法&#xff0c;主要用于解决图搜索和路径规划问题。它的主要特点是可以“飞跃”到棋盘上任何位置&#xff0c;从而大大减少了搜索的时间和空间复杂度。以下是一些飞行棋算法的实际应用场景&#xff1a; 1、路径规划&#xff1a;在机器人领…

利用Scala与Apache HttpClient实现网络音频流的抓取

概述 在当今数字化时代&#xff0c;网络数据的抓取和处理已成为许多应用程序和服务的重要组成部分。本文将介绍如何利用Scala编程语言结合Apache HttpClient工具库实现网络音频流的抓取。通过本文&#xff0c;读者将学习如何利用强大的Scala语言和Apache HttpClient库来抓取网…

1.6 学Python能干什么,Python的应用领域有哪些

Python能干什么&#xff0c;Python的应用领域 Python 作为一种功能强大的编程语言&#xff0c;因其简单易学而受到很多开发者的青睐。那么&#xff0c;Python 的应用领域有哪些呢&#xff1f; Python 有着非广泛的应用&#xff0c;几乎所有大中型互联网公司都在使用 Python&a…

java数据结构与算法刷题-----LeetCode215. 数组中的第K个最大元素

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路&#xff1a;时间复杂度O( n n n)&#xff0c;空间复杂度…

SQL Server 2008R2 日志文件大小设置及查询

SQL Server 2008R2 建立数据库存在日志无限增长问题&#xff0c;造成磁盘内存不足。本文解决这个问题&#xff0c;如下&#xff1a; 1.设置日志文件的最大大小 USE master; GO ALTER DATABASE [D_total] MODIFY FILE (NAME D_total_log, -- 日志文件的逻辑名称MAXSIZE 200…

精准防灾新篇章:GIS与Python机器学习技术在地质灾害风险评价与信息化建库中的前沿应用

结合项目实践案例和科研论文成果进行讲解。入门篇&#xff0c;ArcGIS软件的快速入门与GIS数据源的获取与理解&#xff1b;方法篇&#xff0c;致灾因子提取方法、灾害危险性因子分析指标体系的建立方法和灾害危险性评价模型构建方法&#xff1b;拓展篇&#xff0c;GIS在灾害重建…

idea 开发serlvet篮球秩序册管理系统idea开发mysql数据库web结构计算机java编程layUI框架开发

一、源码特点 idea开发 java servlet 篮球秩序册管理系统是一套完善的web设计系统mysql数据库 系统采用serlvetdaobean mvc 模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 servlet 篮…

机器学习-06-无监督算法-01-划分聚类Kmeans算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中无监督算法&#xff0c;包括划分聚类等。 参考 数据分析实战 | K-means算法——蛋白质消费特征分析 欧洲48国英文名称的来龙去脉及其国旗动画 Kmeans在线动态演示 本门课程的目标 完成一个特定行业的…

java算法第32天 | ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

122.买卖股票的最佳时机II 本题中理解利润拆分是关键点&#xff01; 不要整块的去看&#xff0c;而是把整体利润拆为每天的利润。假如第 0 天买入&#xff0c;第 3 天卖出&#xff0c;那么利润为&#xff1a;prices[3] - prices[0]。 相当于(prices[3] - prices[2]) (prices[…