当前位置: 首页 > news >正文

【黑马程序员】STL实战--演讲比赛管理系统

文章目录

  • 演讲比赛管理系统
    • 需求说明
      • 比赛规则
      • 程序功能
    • 创建管理类
      • 功能描述
      • 创建演讲比赛管理类
    • 菜单功能
      • 添加菜单成员函数声明
      • 菜单成员函数实现
      • 菜单功能测试
    • 退出功能
      • 添加退出功能声明
      • 退出成员函数实现
      • 退出功能测试
    • 演讲比赛功能
      • 功能分析
      • 创建选手类
      • 比赛
        • 成员属性添加
        • 初始化属性
        • 创建选手
        • 开始比赛成员函数
        • 抽签
        • 比赛过程
        • 显示晋级选手信息
        • 第二轮比赛
        • 保存分数
      • 查看记录
        • 从文件中加载记录
        • 将加载的记录进行展示
        • 功能实现
      • 清空记录

演讲比赛管理系统

需求说明

比赛规则

在这里插入图片描述

程序功能

在这里插入图片描述

创建管理类

功能描述

  • 提供菜单界面与用户交互

  • 对演讲比赛流程进行控制

  • 与文件的读写交互

创建演讲比赛管理类

  • 新建speechManager.hpp
#pragma once#include <iostream>using namespace std;// 设计演讲比赛类
class SpeechManager {
public:// 构造函数    SpeechManager();// 析构函数   ~SpeechManager();
};
  • 新建speechManager.cpp
#include "speechManager.h"// 构造函数
SpeechManager::SpeechManager() {}// 析构函数
SpeechManager::~SpeechManager() {}

菜单功能

  • 功能描述:与用户的交互界面

添加菜单成员函数声明

  • speechManager.hpp中添加展示菜单成员函数声明
    // 菜单功能void showMenu();

菜单成员函数实现

  • speechManager.cpp中实现成员函数
// 菜单功能
void SpeechManager::showMenu() {cout << "*************************************" << endl;cout << "*******欢迎使用演讲比赛管理系统******" << endl;cout << "************1.开始演讲比较***********" << endl;cout << "************2.查看往届记录***********" << endl;cout << "************3.情况比赛记录***********" << endl;cout << "************4.退出比赛程序***********" << endl;cout << "*************************************" << endl;
}

菜单功能测试

  • 菜单功能测试,新建main.cpp
#include "speechManager.hpp"int main() {SpeechManager sm;sm.showMenu();
}
  • 运行结果

在这里插入图片描述

退出功能

添加退出功能声明

  • speechManager.hpp中添加退出成员函数声明
    // 退出功能void Logout();

退出成员函数实现

  • speechManager.cpp中实现退出成员函数
// 退出功能
void SpeechManager::Logout() {cout << "即将退出系统,再见" << endl;exit(0);
}

退出功能测试

  • 退出功能测试,在main.cpp
#include "speechManager.hpp"int main() {int choice;SpeechManager sm;while (true) {sm.showMenu();cout << "请输入你要使用的功能" << endl;cin >> choice;switch (choice) {case 1: //1.开始演讲比较break;case 2: //2.查看往届记录break;case 3: //3.清空比赛记录break;case 4: //4.退出比赛程序sm.Logout();break;}}
}
  • 运行结果

在这里插入图片描述

演讲比赛功能

功能分析

  • 比赛流程分析

    • 抽签–>开始演讲比赛–>显示第一轮比赛结果

    • 抽签–>开始演讲比赛–>显示前三名结果–>保存分数

创建选手类

  • 选手类中包括属性:选手姓名、分数

  • 新建speaker.hpp

#pragma once#include <iostream>
#include <string>using namespace std;// 选手类
class Speaker {
public:string name;        // 姓名double score[2];    // 最多有两轮分数
};

比赛

成员属性添加
  • speechManager.hpp中添加
#include <vector>
#include <map>
#include "speaker.hpp"// 类成员属性添加// 比赛选手容器 12人vector<int> v1;// 第一轮晋级选手容器 6人vector<int> v2;// 前三名容器 3人vector<int> v3;// 存放编号,以及队形的具体选手容器map<int, Speaker> mSpeaker;// 记录比赛轮数int mIndex;
初始化属性
  • speechManager.hpp中添加初始化属性成员函数声明
    // 初始化成员属性void initSpeech();
  • speechManager.cpp中实现初始化属性成员函数,并在构造函数中调用
// 初始化成员属性
void SpeechManager::initSpeech() {// 初始确保容器为空this->v1.clear();this->v2.clear();this->v3.clear();this->mSpeaker.clear();// 初始比赛轮数this->mIndex = 1;
}
创建选手
  • speechManager.hpp中添加创建选手成员函数声明
    // 创建选手void createSpeaker();
  • speechManager.cpp中实现创建选手成员函数,并在构造函数中调用
// 创建选手
void SpeechManager::createSpeaker() {string nameSeed = "ABCDEFGHIJKL";for (int i = 0; i < nameSeed.size(); i++) {string name = "选手";name += nameSeed[i];Speaker sp;sp.name = name;for (int i = 0; i < 2; i++) {sp.score[i] = 0;}// 12名选手编号this->v1.push_back(i + 10001);// 将选手放入到map中this->mSpeaker.insert(make_pair(i + 10001, sp));}
}
  • 创建成员测试
#include "speechManager.hpp"
#include "speaker.hpp"int main() {SpeechManager sm;for (map<int, Speaker>::iterator it = sm.mSpeaker.begin(); it != sm.mSpeaker.end(); it++) {cout << it->first << "\t" << (it->second).name << "\t" << (it->second).score[0] << "\t" << (it->second).score[1]<< endl;}
}
  • 运行结果

在这里插入图片描述

开始比赛成员函数
  • speechManager.hpp中添加开始比赛函数声明
    // 开始比赛void startSpeech();
  • speechManager.cpp中实现初始化属性成员函数,在开始比赛实现中先定义整体比赛的流程在慢慢实现,开始比赛功能在菜单中用户选择开始比赛时调用
// 开始比赛
void SpeechManager::startSpeech() {// 第一轮比赛// 1.抽签// 2.比赛// 3.显示晋级结果// 第二轮比赛// 1.抽签// 2.比赛// 3.显示最终结果// 4.保存分数
}
抽签
  • 抽签的本质就是打乱参赛者

  • speechManager.hpp中添加抽签函数声明

    // 抽签void drawLots();
  • speechManager.cpp中实现抽签函数,并在开始比赛的相应抽签流程位置调用
// 抽签
void SpeechManager::drawLots() {cout << "第" << this->mIndex << "轮比赛选手正在抽签" << endl;cout << "抽签后演讲顺序如下:" << endl;if (this->mIndex == 1) {// 第一轮抽签random_shuffle(this->v1.begin(), this->v1.end());printVector(this->v1);} else {// 第二轮抽签random_shuffle(this->v2.begin(), this->v2.end());printVector(this->v2);}cout << "------------------" << endl;
}
  • 运行结果

在这里插入图片描述

比赛过程
  • 比赛过程为最重要部分,需要好好理解消化

  • 比赛流程梳理

    • 准备临时容器存放小组成绩,每处理完一组

    • 判断是第几轮比赛,选择对应的比赛选手

    • 遍历当前比赛选手,让10个评委调用随机函数去给每个选手打分

    • 得到分数后放到双端队列deque中进行降序排列,然后弹出头尾实现,去掉最高分和去掉最低分操作

    • 计算每个比赛者的总分和平均分,将打分数据放在降序排列的临时map容器中,每6个人为一组取前3名

    • 将取得的前3名放到下一轮要比赛的选手容器中,清空临时存放成绩的容器s

  • speechManager.hpp中添加比赛函数声明

    // 比赛void game();
  • speechManager.cpp中实现比赛函数,并在开始比赛的相应比赛流程位置调用
// 比赛
void SpeechManager::game() {cout << "------------第" << this->mIndex << "轮比赛开始了------------" << endl;// 准备临时容器存放小组成绩multimap<double, int, greater<double> > groupScore;// 记录人员个数,6人一组int num = 0;// vSrc 当前比赛选手容器vector<int> vSrc;if (this->mIndex == 1) {// 给v1容器的人打分vSrc = v1;} else {// 给v2容器的人打分vSrc = v2;}// 遍历所有选手进行比赛for (vector<int>::const_iterator it = vSrc.begin(); it != vSrc.end(); it++) {num++;// 10个评委打分deque<double> d;for (int i = 0; i < 10; i++) {// 随机一个600~1000的数,然后在除10// .f表示是一个小数double score = (rand() % 401 + 600) / 10.f;// cout << score << " ";d.push_back(score);}// 对分数进行降序排列sort(d.begin(), d.end(), greater<double>());// 去掉一个最高分d.pop_front();// 去掉一个最低分d.pop_back();// 累加总分double sum = accumulate(d.begin(), d.end(), 0.0f);// 计算平均分double avg = sum / (double) d.size();// 打印平均分// cout << "编号:" << *it << " 姓名:" << this->mSpeaker[*it].name << " 平均分:" << avg << endl;// 将平均分放到map容器中this->mSpeaker[*it].score[this->mIndex - 1] = avg;// 将打分数据放入到临时小组容器中groupScore.insert(make_pair(avg, *it));// 每6人取前三名if (num % 6 == 0) {cout << "第" << num / 6 << "小组比赛名次:" << endl;for (multimap < double, int, greater < double > > ::iterator it = groupScore.begin();it != groupScore.end();it++) {cout << "编号:" << it->second << " 姓名:" << this->mSpeaker[it->second].name << " 分数:" << it->first<< endl;}// 获取前三名,放入下一轮容器中int count = 0;for (multimap < double, int, greater < double > > ::iterator it = groupScore.begin();it != groupScore.end() && count < 3;it++, count++) {if (this->mIndex == 1) {v2.push_back(it->second);} else {v3.push_back(it->second);}}// 取完一次需要清空一次小组容器groupScore.clear();}}cout << "----------第" << this->mIndex << "轮比赛完毕------------" << endl;
}
显示晋级选手信息
  • speechManager.hpp中添加显示晋级选手函数声明
    // 显示晋级结果void showScore();
  • speechManager.cpp中实现显示晋级选手函数,并在开始比赛的相应比赛流程位置调用
// 显示晋级结果
void SpeechManager::showScore() {cout << "第" << this->mIndex << "轮晋级选手信息如下: " << endl;vector<int> v;if (this->mIndex == 1) {v = v2;} else {v = v3;}for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << "编号:" << *it << " 姓名:" << this->mSpeaker[*it].name << " 分数:"<< this->mSpeaker[*it].score[this->mIndex - 1] << endl;}
}
第二轮比赛
  • 第二轮比赛只需要将index++,然后在开始比赛函数的第二轮调用对应的封装好的函数即可

  • 开始比赛整体调用代码如下

// 开始比赛
void SpeechManager::startSpeech() {// 第一轮比赛// 1.抽签this->drawLots();// 2.比赛this->game();// 3.显示晋级结果this->showScore();this->mIndex++;// 第二轮比赛// 1.抽签this->drawLots();// 2.比赛this->game();// 3.显示最终结果this->showScore();// 4.保存分数
}
  • 运行结果

在这里插入图片描述
在这里插入图片描述

保存分数
  • speechManager.hpp中添加保存分数函数声明
    // 保存分数void saveScore();
  • speechManager.cpp中实现保存分数函数,并在开始比赛流程最后位置调用
void SpeechManager::saveScore() {ofstream ofs;// 以追加输出的方式打开文件, csv中内容需要以,号分割ofs.open("speech.csv", ios::out | ios::app);// 将每个人的数据保存到文件for (vector<int>::iterator it = v3.begin(); it != v3.end(); it++) {ofs << *it << ","<< mSpeaker[*it].score[1] << ",";}ofs << endl;// 关闭文件ofs.close();cout << "记录已保存" << endl;
}

查看记录

从文件中加载记录
  • 文件不存在:提示直接返回

  • 文件存在但为空:先读一个字符看看是否读到了EOF

  • 文件存在不为空:

    • 先将读出的一个字符回写到文件中

    • 按行读取

    • 每读完一行按照逗号分割的方式将每一个编号和成绩的子字符串拿出来放入到临时vector中

    • 将一行vector中的内容放入往届成绩记录record容器中

将加载的记录进行展示
  • 遍历记录容器,将加载的内容一行一行的进行展示
功能实现
  • speechManager.hpp中添加对应的成员声明
    // 加载往届记录void loadRecord();// 查看往届记录void showRecord();// 记录比赛轮数int mIndex;// 文件是否为空标志bool fileIsEmpty;// 往届记录map<int, vector<string> > mRecord;
  • speechManager.cpp中实现相应的功能,在构造函数部分调用加载历史记录,在用户交互位置提供查看历史记录功能
// 查看分数
void SpeechManager::loadRecord() {ifstream ifs;ifs.open("speech.csv", ios::in);if (!ifs.is_open()) {// cout << "文件不存在" << endl;ifs.close();return;}// 文件存在// 文件被清空过的情况先读一个字符判断文件是否为空char ch;ifs >> ch;if (ifs.eof()) {cout << "文件为空" << endl;this->fileIsEmpty = true;ifs.close();return;}// 文件存在且不为空this->fileIsEmpty = false;// 将读取的字符放回ifs.putback(ch);string data;// index用来记录是第几届的数据,默认是第0届int index = 0;// 一行一行读while (ifs >> data) {// cout << data << endl;// 10005,83.6125,10007,82.7375,10008,80.725,// 存放每一届记录的前三编号和分数值vector <string> v;// pos查找逗号位置,默认为没有查到int pos = -1;// 从哪开始查找int start = 0;while (true) {// 从头开始查,pos = data.find(",", start);if (pos == -1) {break;}string tmp = data.substr(start, pos - start);v.push_back(tmp);// 下一次开始位置从上一个找到的逗号的下一个位置开始start = pos + 1;}// 将数据塞入往届成绩记录容器中this->mRecord.insert(make_pair(index, v));index++;}ifs.close();
}// 查看往届记录
void SpeechManager::showRecord() {cout << " this->fileIsEmpty" << this->fileIsEmpty << endl;if (this->fileIsEmpty) {cout << "文件不存在或记录为空" << endl;return;}this->loadRecord();for (map < int, vector < string > > ::iterator it = this->mRecord.begin(); it != this->mRecord.end();it++) {cout << "第" << it->first + 1 << "届:" << endl;cout << "冠军编号:" << it->second[0] << " 分数:" << it->second[1] << endl;cout << "亚军编号:" << it->second[2] << " 分数:" << it->second[3] << endl;cout << "季军编号:" << it->second[4] << " 分数:" << it->second[5] << endl;}
}

清空记录

  • speechManager.hpp中添加清空记录函数成员声明
    // 清空记录void clearRecord();
  • speechManager.hpp中实现清空记录的功能,并在用户交互界面提供清空记录的功能调用
// 清空记录
void SpeechManager::clearRecord() {cout << "确认清空?" << endl;cout << "1.确认" << endl;cout << "2.返回" << endl;int select;cin >> select;if (select == 1) {// 清空文件:trunc模式,如果文件存在,则删除文件并重新创建ofstream ofs("speech.csv", ios::trunc);ofs.close();// 初始化属性this->initSpeech();// 创建选手this->createSpeaker();// 加载往届成绩this->loadRecord();cout << "清空成功" << endl;}
}

完整项目位置

相关文章:

【黑马程序员】STL实战--演讲比赛管理系统

文章目录 演讲比赛管理系统需求说明比赛规则程序功能 创建管理类功能描述创建演讲比赛管理类 菜单功能添加菜单成员函数声明菜单成员函数实现菜单功能测试 退出功能添加退出功能声明退出成员函数实现退出功能测试 演讲比赛功能功能分析创建选手类比赛成员属性添加初始化属性创建…...

一文帮助快速入门Django

文章目录 创建django项目应用app配置pycharm虚拟环境打包依赖 路由传统路由include路由分发namenamespace 视图中间件orm关系对象映射操作表数据库配置model常见字段及参数orm基本操作 cookie和sessiondemo类视图 创建django项目 指定版本安装django&#xff1a;pip install dj…...

基于springboot实现图书推荐系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现图书馆推荐系统演示 摘要 时代的变化速度实在超出人类的所料&#xff0c;21世纪&#xff0c;计算机已经发展到各行各业&#xff0c;各个地区&#xff0c;它的载体媒介-计算机&#xff0c;大众称之为的电脑&#xff0c;是一种特高速的科学仪器&#xff0c;比…...

微信小程序实现上拉加载更多

一、前情提要 微信小程序中实现上拉加载更多&#xff0c;其实就是pc端项目的分页。使用的是scroll-view&#xff0c;scroll-view详情在微信开发文档/开发/组件/视图容器中。每次上拉&#xff0c;就是在原有数据基础上&#xff0c;拼接/合并上本次上拉请求得到的数据。这里采用…...

计算机网络——概述

计算机网络——概述 计算机网络的定义互连网&#xff08;internet&#xff09;互联网&#xff08;Internet&#xff09;互联网基础结构发展的三个阶段第一个阶段——APPANET第二阶段——商业化和三级架构第三阶段——全球范围多层次的ISP结构 ISP的作用终端互联网的组成边缘部分…...

kafka Interceptors and Listeners

Interceptors ProducerInterceptor https://www.cnblogs.com/huxi2b/p/7072447.html Producer拦截器(interceptor)是个相当新的功能&#xff0c;它和consumer端interceptor是在Kafka 0.10版本被引入的&#xff0c;主要用于实现clients端的定制化控制逻辑。 对于producer而言&…...

【面试题】mysql常见面试题及答案总结

事务中的ACID原则是什么? Mysql是如何实现或者保障ACID的? ACID原则是数据库事务管理中必须满足的四个基本属性&#xff0c;确保了数据库事务的可靠性和数据完整性。 简写全称解释实现A原子性&#xff08;Atomicity&#xff09;一个事务被视为一个不可分割的操作序列&#…...

C++ 类的前向声明的用法

我们知道C的类应当是先定义&#xff0c;然后使用。但在处理相对复杂的问题、考虑类的组合时&#xff0c;很可能遇到俩个类相互引用的情况&#xff0c;这种情况称为循环依赖。 例如&#xff1a; class A { public:void f(B b);//以B类对象b为形参的成员函数//这里编译错位&…...

二分查找(c语言)

二分查找 一.什么是二分查找二.代码实现 一.什么是二分查找 在⼀个升序的数组中查找制定的数字n&#xff0c;很容易想到的⽅法就是遍历数组&#xff0c;但是这种⽅法效率⽐较低&#xff0c; ⽐如我买了⼀双鞋&#xff0c;你好奇问我多少钱&#xff0c;我说不超过300元。你还是好…...

【记录31】elementUI el-tree 虚线、右键、拖拽

父组件 <eltree :treeData"treeData"></eltree>import eltree from "../../components/tree.vue"; export default {name: ,components: { // org_tree ,eltree},watch: {},data() {return {orgFormchoose: {},orgForm: { type: 0, limits: 1…...

【C++】函数重载

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;函数重载的定义 &#x1f4cc;函数重载的三种类型 &#x1f38f;参数个数不同 &#x1f38f;参数类型不同 &#x1f38f;参数类型顺序不同 &#x1f4cc;重载…...

【深度学习模型】6_3 语言模型数据集

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.3 语言模型数据集&#xff08;周杰伦专辑歌词&#xff09; 本节将介绍如何预处理一个语言模型数据集&#xff0c;并将其转换成字符级…...

技术选型思考:分库分表和分布式DB(TiDB/OceanBase) 的权衡与抉择

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在当今数据爆炸的时代&#xff0c;数据库作为存储和管理数据的核心组件&#xff0c;其性能和扩展性成为了企业关注的重点。随着业…...

React改变数据【案例】

State传统方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>React Demo</title> <!--…...

ChatGPT Plus 自动扣费失败,如何续订

ChatGPT Plus 自动扣费失败&#xff0c;如何续订 如果您的 ChatGPT Plus 订阅过期或扣费失败&#xff0c;本教程将指导您如何重新订阅。 本周更新 ChatGPT Plus 是一种每月20美元的订阅服务。扣费会自动进行&#xff0c;如果您的账户余额不足&#xff0c;OpenAI 将在一次扣费…...

Rust: Channel 代码示例

在 Rust 中&#xff0c;通道&#xff08;Channel&#xff09;通常使用 std::sync::mpsc&#xff08;多生产者单消费者&#xff09;或 tokio::sync::mpsc&#xff08;在异步编程中&#xff0c;特别是使用 Tokio 运行时&#xff09;来创建。下面是一个使用 std::sync::mpsc 的简单…...

基于华为atlas的unet分割模型探索

Unet模型使用官方基于kaggle Carvana Image Masking Challenge数据集训练的模型。 模型输入为572*572*3&#xff0c;输出为572*572*2。分割目标分别为&#xff0c;0&#xff1a;背景&#xff0c;1&#xff1a;汽车。 Pytorch的pth模型转化onnx模型&#xff1a; import torchf…...

机器学习--循环神经网络(RNN)1

一、简介 循环神经网络&#xff08;Recurrent Neural Network&#xff09;是深度学习领域中一种非常经典的网络结构&#xff0c;在现实生活中有着广泛的应用。以槽填充&#xff08;slot filling&#xff09;为例&#xff0c;如下图所示&#xff0c;假设订票系统听到用户说&…...

基于java+springboot+vue实现的学生信息管理系统(文末源码+Lw+ppt)23-54

摘 要 人类现已进入21世纪&#xff0c;科技日新月异&#xff0c;经济、信息等方面都取得了长足的进步&#xff0c;特别是信息网络技术的飞速发展&#xff0c;对政治、经济、军事、文化等方面都产生了很大的影响。 利用计算机网络的便利&#xff0c;开发一套基于java的大学生…...

【漏洞复现】Linksys E2000 position.js 身份验证绕过漏洞(CVE-2024-27497)

0x01 产品简介 Linksys E2000是一款由思科&#xff08;Cisco&#xff09;品牌推出的无线路由器&#xff0c;它是一款支持2.4GHz和5GHz双频段的无线路由器&#xff0c;用户可以避开拥挤的2.4GHz频段&#xff0c;独自享受5GHz频段的高速无线生活。 0x02 漏洞概述 Linksys E200…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...