【头歌实训】kafka-入门篇

文章目录

  • 第1关:kafka - 初体验
    • 任务描述
    • 相关知识
      • Kafka 简述
      • Kafka 应用场景
      • Kafka 架构组件
      • kafka 常用命令
    • 编程要求
    • 测试说明
    • 答案代码
  • 第2关:生产者 (Producer ) - 简单模式
    • 任务描述
    • 相关知识
      • Producer 简单模式
      • Producer 的开发步骤
      • Kafka 常用配置参数
    • 编程要求
    • 测试说明
    • 答案代码
  • 第3关:消费者( Consumer)- 自动提交偏移量
    • 任务描述
    • 相关知识
      • Kafka 消费者开发步骤
      • 自动提交偏移量的优劣
    • 编程要求
    • 测试说明
    • 答案代码
  • 第4关:消费者( Consumer )- 手动提交偏移量
    • 任务描述
    • 相关知识
      • Kafka 两种手动提交方式
    • 编程要求
    • 测试说明
    • 答案代码

第1关:kafka - 初体验

任务描述

本关任务:使用 Kafka 命令创建一个副本数量为1、分区数量为3的 Topic 。

相关知识

为了完成本关任务,你需要掌握:1.如何使用 Kafka 的常用命令。

课程视频《Kafka简介》

Kafka 简述

类 JMS 消息队列,结合 JMS 中的两种模式,可以有多个消费者主动拉取数据,在 JMS 中只有点对点模式才有消费者主动拉取数据。

Kafka 是一个生产-消费模型。

Producer :消息生产者,就是向 Kafka Broker 发消息的客户端。

Consumer :消息消费者,向 Kafka Broker 取消息的客户端。

Topic :我们可以理解为一个队列。

Consumer Group (CG):这是 Kafka 用来实现一个 Topic 消息的广播(发给所有的 Consumer )和单播(发给任意一个 Consumer )的手段。一个 Topic 可以有多个CG。Topic 的消息会复制(不是真的复制,是概念上的)到所有的 CG ,但每个 Partion 只会把消息发给该 CG 中的一个 Consumer 。如果需要实现广播,只要每个 Consumer 有一个独立的 CG 就可以了。要实现单播只要所有的 Consumer 在同一个 CG。用CG 还可以将 Consumer 进行自由的分组而不需要多次发送消息到不同的 Topic。

Broker :一台 Kafka 服务器就是一个 Broker 。一个集群由多个Broker组成。一个 Broker 可以容纳多个 Topic。

Partition :为了实现扩展性,一个非常大的 Topic 可以分布到多个Broker(即服务器)上,一个 Topic 可以分为多个 Partition ,每个 Partition 是一个有序的队列。Partition 中的每条消息都会被分配一个有序的 Id( Offset )。Kafka 只保证按一个 Partition 中的顺序将消息发给 Consumer ,不保证一个 Topic 的整体(多个 Partition间)的顺序。

Offset :Kafka 的存储文件都是按照 Offset . index 来命名,用Offset 做名字的好处是方便查找。例如你想找位于2049的位置,只要找到 2048 . index 的文件即可。当然 the first offset 就是 00000000000 . index。

Kafka 应用场景

  • 日志收集:一个公司可以用 Kafka 可以收集各种服务的 Log ,通过Kafka 以统一接口服务的方式开放给各种 Consumer ,例如 Hadoop 、Hbase 、Solr 等。
  • 消息系统:解耦和生产者和消费者、缓存消息等。
  • 用户活动跟踪:Kafka 经常被用来记录 Web 用户或者 App 用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到 Kafka 的Topic 中,然后订阅者通过订阅这些 Topic 来做实时的监控分析,或者装载到 Hadoop 、数据仓库中做离线分析和挖掘。
  • 运营指标:Kafka 也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
  • 流式处理:比如 Spark streaming 和 Storm、Flink。
  • 事件源。

Kafka 架构组件

Kafka 中发布订阅的对象是 Topic。我们可以为每类数据创建一个 Topic ,把向 Topic 发布消息的客户端称作 Producer ,从 Topic 订阅消息的客户端称作 Consumer 。Producers 和 Consumers 可以同时从多个 Topic 读写数据。一个 Kafka 集群由一个或多个 Broker 服务器组成,它负责持久化和备份具体的 Kafka 消息。

img

kafka 常用命令

  • 查看当前服务器中的所有 Topic bin/kafka-topics.sh --list --zookeeper zk01:2181
  • 创建 Topic ./kafka-topics.sh --create --zookeeper zk01:2181 --replication-factor 1 --partitions 3 --topic first

说明:replication-factor 是指副本数量,partitions 是指分区数量

  • 删除 Topic bin/kafka-topics.sh --delete --zookeeper zk01:2181 --topic test 需要 server.properties 中设置 delete.topic.enable = true 否则只是标记删除或者直接重启。
  • 通过 Shell 命令发送消息 kafka-console-producer.sh --broker-list kafka01:9092 --topic demo
  • 通过 Shell 消费消息 bin/kafka-console-consumer.sh --zookeeper zk01:2181 --from-beginning --topic test1
  • 查看消费位置 kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper zk01:2181 --group testGroup
  • 查看某个 Topic 的详情 kafka-topics.sh --topic test --describe --zookeeper zk01:2181

说明 :此处的 zk01 是 Zookeeper 的 IP 地址, kafka01 是 Broker 的 IP 地址

编程要求

根据提示,在右侧编辑器补充代码完成以下任务。

  • 创建一个副本数量为1、分区数量为3、名为 demo 的 Topic
  • 查看所有 Topic
  • 查看名为 demo 的 Topic 的详情信息

注意:Broker 的 IP 为127.0.0.1,Zookeeper 的 IP 为127.0.0.1

扩展任务:

  • 使用一个命令行开启 Kafka Producer Shell 窗口并对名为 demo 的 Topic 进行数据生产
  • 使用另一个命令行开启 Kafka Customer Shell 窗口并对名为 demo 的 Topic进行消费

说明:扩展任务没有进行评测,此任务目的是为了让用户体验下 Kafka 的数据生产与数据消费的两个环节,更好理解 Kafka

测试说明

平台会对你的命令进行检验并运行,你只需要按照任务需求,补充右侧编辑器的代码,然后点击评测就ok了。 - -

特别注意:为了确保运行拥有一个正常的运行环境,请在评测之前,重置下运行环境

img

答案代码

命令行代码

kafka-server-start.sh  /opt/kafka_2.11-1.1.0/config/server.properties

shell 文件

#!/bin/bash#1.创建一个副本数量为1、分区数量为3、名为 demo 的 Topic
kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 1 --partitions 3 --topic demo#2.查看所有Topic
kafka-topics.sh --list --zookeeper  127.0.0.1:2181#3.查看名为demo的Topic的详情信息
kafka-topics.sh --topic demo --describe --zookeeper 127.0.0.1:2181

第2关:生产者 (Producer ) - 简单模式

任务描述

本关任务:编写一个 Kafka 的 Producer 进行数据生产。

相关知识

为了完成本关任务,你需要掌握:1.如何使用 Kafka 的 Producer API 进行数据生产。

课程视频《使用Python生产消费kafka的数据》

Producer 简单模式

Producer 采用默认分区方式将消息散列的发送到各个分区当中。

Producer 的开发步骤

  1. 创建配置文件对象 Properties props = new Properties();

  2. 设置连接 Kakfa 的基本参数,如下:

    props.put("bootstrap.servers", "kafka-01:9092,kafka-02:9092,kafka-03:9092");
    props.put("acks", "1");
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    
  3. 创建 Kafka 生产者对象Producer<String, String> producer = new KafkaProducer<>(props);

  4. 发送消息producer.send(new ProducerRecord<String, String>("Topic", "key", "value"));

Kafka 常用配置参数

名称说明默认值有效值重要性
bootstrap.serverskafka集群的broker-list,如: hadoop01:9092,hadoop02:9092必选
key.serializerkey的序列化器ByteArraySerializer StringSerializer必选
value.serializervalue的序列化器ByteArraySerializer StringSerializer必选
acks确保生产者可靠性设置,有三个选项: acks=0:不等待成功返回 acks=1:等Leader写成功返回 acks=all:等Leader和所有ISR中的Follower写成功返回,all也可以用-1代替-10,1,-1,all建议必选
buffer.memoryProducer总体内存大小33554432不要超过物理内存,根据实际情况调整建议必选
batch.size每个partition的未发送消息大小16384根据实际情况调整建议必选

编程要求

根据提示,在右侧编辑器补充代码,使用 Kafka Producer API 对名为 demo 的 Topic 进行数据生产。

测试说明

平台会对你的命令进行检验并运行,你只需要按照任务需求,补充右侧编辑器的代码,然后点击评测就ok了。 - -

答案代码

conf/server.properties ,如果用 config/server.properties 的话需要把 log.dirsnum.partitions 这两个配置改了

cd $KAFKA_HOME/
vim config/server.properties# 使用 :/log.dirs 找到位置,或者直接 :$ 在最后一行加 
log.dirs=/export/servers/logs/kafka/
num.partitions=2

命令行执行代码

# kafka 依赖 zookeeper,所以需要先启动 zookeeper 服务
cd $ZOOKEEPER_HOME/
bin/zkServer.sh start conf/zoo.cfg
# 启动 Kafka 服务
cd $KAFKA_HOME/
bin/kafka-server-start.sh -daemon conf/server.properties

Java 代码

package net.educoder;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
/*** kafka producer 简单模式*/
public class App {public static void main(String[] args) {/*** 1.创建配置文件对象,一般采用 Properties*//**----------------begin-----------------------*/Properties props = new Properties();/**-----------------end-------------------------*//*** 2.设置kafka的一些参数*          bootstrap.servers --> kafka的连接地址 127.0.0.1:9092*          key、value的序列化类 -->org.apache.kafka.common.serialization.StringSerializer*          acks:1,-1,0*//**-----------------begin-----------------------*/props.put("bootstrap.servers", "127.0.0.1:9092");props.put("acks", "1");props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");/**-----------------end-------------------------*//*** 3.构建kafkaProducer对象*//**-----------------begin-----------------------*/Producer<String, String> producer = new KafkaProducer<>(props);/**-----------------end-------------------------*/for (int i = 0; i < 100; i++) {ProducerRecord<String, String> record = new ProducerRecord<>("demo", i + "", i + "");/*** 4.发送消息*//**-----------------begin-----------------------*/producer.send(record);/**-----------------end-------------------------*/}producer.close();}
}

第3关:消费者( Consumer)- 自动提交偏移量

任务描述

本关任务:编写一个 Kafka 消费者并设置自动提交偏移量进行数据消费。

相关知识

为了完成本关任务,你需要掌握:1.如何编写 Kafka 消费者,2.如何使用自动提交偏移量。

Kafka 消费者开发步骤

  1. 创建配置文件对象 Properties props = new Properties();

  2. 设置连接 Kakfa 的基本参数,如下:

    //设置kafka集群的地址
    props.put("bootstrap.servers", 127.0.0.1:9092");
    //设置消费者组,组名字自定义,组名字相同的消费者在一个组
    props.put("group.id", "g1");
    //开启offset自动提交
    props.put("enable.auto.commit", "true");
    //自动提交时间间隔
    props.put("auto.commit.interval.ms", "1000");
    //序列化器
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    
  3. 创建 Kafka 消费者对象 KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);

  4. 订阅主题 Topic consumer.subscribe(Arrays.asList("demo"));

  5. 消费 Topic 的数据

    while (true) {ConsumerRecords<String, String> records = consumer.poll(100);for (ConsumerRecord<String, String> record : records)System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());}
    

自动提交偏移量的优劣

消费者拉取数据之后自动提交偏移量,不关心后续对消息的处理是否正确。

  • 优点:消费快,适用于数据一致性弱的业务场景
  • 缺点:消息很容易丢失

编程要求

使用 Kafka Consumer API 对名为 demoTopic 进行消费,并设置自动提交偏移量。

测试说明

平台会对你的命令进行检验并运行,你只需要按照任务需求,补充右侧编辑器的代码,然后点击评测就 ok 了。 - -

答案代码

package net.educoder;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
public class App {public static void main(String[] args) {Properties props = new Properties();/**--------------begin----------------*///1.设置kafka集群的地址props.put("bootstrap.servers", "127.0.0.1:9092");//2.设置消费者组,组名字自定义,组名字相同的消费者在一个组props.put("group.id", "g1");//3.开启offset自动提交props.put("enable.auto.commit", "true");//4.自动提交时间间隔props.put("auto.commit.interval.ms", "1000");//5.序列化器props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");/**---------------end---------------*//**--------------begin----------------*///6.创建kafka消费者KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);//7.订阅kafka的topicconsumer.subscribe(Arrays.asList("demo"));/**---------------end---------------*/int i = 1;while (true) {/**----------------------begin--------------------------------*///8.poll消息数据,返回的变量为crsConsumerRecords<String, String> crs = consumer.poll(100);for (ConsumerRecord<String, String> cr : crs) {System.out.println("consume data:" + i);i++;}/**----------------------end--------------------------------*/if (i > 10) {return;}}}
}

第4关:消费者( Consumer )- 手动提交偏移量

任务描述

本关任务:编写一个 Kafka 消费者并使用手动提交偏移量进行数据消费。

相关知识

为了完成本关任务,你需要掌握:1.如何编写 Kafka 消费者,2.如何手动提交偏移量。

Kafka 两种手动提交方式

  1. 异步提交( CommitAsync ):

异步模式下,提交失败也不会尝试提交。消费者线程不会被阻塞,因为异步操作,可能在提交偏移量操作结果未返回时就开始下一次拉取操作。

  1. 同步提交( CommitSync ):

同步模式下,提交失败时一直尝试提交,直到遇到无法重试才结束。同步方式下,消费者线程在拉取消息时会被阻塞,直到偏移量提交操作成功或者在提交过程中发生错误。

注意:实现手动提交前需要在创建消费者时关闭自动提交,设置enable.auto.commit=false

编程要求

根据提示,在右侧编辑器补充代码,使用 Kafka Producer API 对名为 demo 的 Topic 进行数据生产

测试说明

平台会对你的命令进行检验并运行,你只需要按照任务需求,补充右侧编辑器的代码,然后点击评测就ok了。 - -

答案代码

命令行代码

# kafka 依赖 zookeeper,所以需要先启动 zookeeper 服务
cd $ZOOKEEPER_HOME/
bin/zkServer.sh start conf/zoo.cfg
# 启动 Kafka 服务
cd $KAFKA_HOME/
bin/kafka-server-start.sh -daemon conf/server.properties

Java 代码

package net.educoder;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
public class App {public static void main(String[] args){Properties props = new Properties();/**-----------------begin------------------------*///1.设置kafka集群的地址props.put("bootstrap.servers", "127.0.0.1:9092");//2.设置消费者组,组名字自定义,组名字相同的消费者在一个组props.put("group.id", "g1");//3.关闭offset自动提交props.put("enable.auto.commit", "false");//4.序列化器props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");/**-----------------end------------------------*//**-----------------begin------------------------*///5.实例化一个消费者KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);//6.消费者订阅主题,订阅名为demo的主题consumer.subscribe(Arrays.asList("demo"));/**-----------------end------------------------*/final int minBatchSize = 10;List<ConsumerRecord<String, String>> buffer = new ArrayList<>();while (true) {ConsumerRecords<String, String> records = consumer.poll(100);for (ConsumerRecord<String, String> record : records) {buffer.add(record);}if (buffer.size() >= minBatchSize) {for (ConsumerRecord bf : buffer) {System.out.printf("offset = %d, key = %s, value = %s%n", bf.offset(), bf.key(), bf.value());}/**-----------------begin------------------------*///7.手动提交偏移量consumer.commitSync();/**-----------------end------------------------*/buffer.clear();return;}}}
}

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

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

相关文章

VS Code 运行 Python

介绍 Python&#xff1a; 是一种强大的编程语言&#xff0c;具有广泛的应用领域&#xff0c;可以用于开发 Web 应用、数据分析、人工智能、科学计算等多种领域。 VS Code&#xff1a; 是由微软开发的免费开源代码编辑器&#xff0c;可以在多个平台上运行。具有丰富的扩展功能…

每日一题--------求数字的每⼀位之和

大家好今天的每日一题又来了&#xff0c;有啥不对的请在评论区留言哦 文章目录 目录 文章目录 求数字的每⼀位之和 题⽬描述&#xff1a; 输⼊⼀个整数m&#xff0c;求这个整数m的每⼀位之和&#xff0c;并打印。 一、解题思路 我们可以通过不断获取该整数的个位数&#xff0c…

Python+OpenCV 零基础学习笔记(4-5):计算机图形基础+Python相对文件路径+OpenCV图像+OpenCV视频

文章目录 相关链接运行环境前言计算机图形OpenCV简单使用图形读取文件读取可能会出现的问题&#xff1a;路径不对解决方案其它路径问题解决方案 图像显示保存OpenCV视频视频素材如何获取&#xff1f;简单视频读取 相关链接 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 …

python抽象基类之_subclasshook_方法

Python的鸭子特性&#xff08;duck typing&#xff09; Python中自定义的类只要实现了某种特殊的协议&#xff0c;就能赋予那种行为&#xff0c;举一个简单的例子&#xff1a; class A:def __len__(self):return 0 a A() print(len(a)) 如上所示&#xff0c;自己定义了一个类…

如何购买腾讯云的服务器(详解腾讯云服务器购买流程)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

YOLOv5-Lite 树莓派4B 15帧教程

【前言】 由于v5Lite仓库遗漏了不少历史问题&#xff0c;最大的问题是毕业后卷起来了&#xff0c;找不到时间更新。 上面是这篇博客的背景&#xff0c;那么先说下结论&#xff0c;使用 v5lite-e 模型&#xff0c;在 树莓派4B&#xff08;4G内存&#xff09; 上&#xff0c;有三…

PyTorch 进阶指南,10个必须知道的原则

PyTorch 是一种流行的深度学习框架&#xff0c;它提供了强大的工具和灵活的接口&#xff0c;使得开发者能够搭建和训练各种神经网络模型。这份指南旨在为开发者提供一些有用的原则&#xff0c;以帮助他们在PyTorch中编写高效、可维护和可扩展的代码。 如果你对 Pytorch 还处于…

树莓派界面改成中文

安装完树莓派系统(Raspberry Pi OS with Desktop)&#xff0c;第一次启动时&#xff0c;时会有如下面二个图所示&#xff0c;让你选择区域时区和语言。 树莓派默认的语言为英文&#xff0c;如果你在安装时没有选择的话&#xff0c;默认的区域为英国&#xff0c;语言为英国英文&…

Python新手上路:“用Python和Pygame创造你的流星雨”

文章目录 一、前言二、下载安装过程1.官网下载安装包2.安装python过程第一步第二步第三步第四步第五步安装完成 3.简单测试Python3.1 检查 Python 版本号3.2 打开 Python 解释器3.3 输入你的第一个代码3.4 运行 Python 脚本 4.安装Pygame4.1 cmd命令安装Pygame4.2 pip升级4.3 安…

【C语言】程序练习(二)

大家好&#xff0c;这里是争做图书馆扫地僧的小白。 个人主页&#xff1a;争做图书馆扫地僧的小白_-CSDN博客 目标&#xff1a;希望通过学习技术&#xff0c;期待着改变世界。 目录 前言 一、运算符练习 1 算术运算符 1.1 练习题&#xff1a; 2 自加自减运算符 3 关系运…

Python列表数据处理全攻略(三):常用内置方法轻松掌握

文章目录 引言Python列表常用内置方法count()功能介绍语法示例注意事项 index()功能介绍语法示例注意事项&#xff1a; insert()功能介绍语法示例注意事项总结 结束语 引言 亲爱的读者&#xff0c;你好&#xff01;Python的列表在数据结构中占据着核心地位&#xff0c;对于学习…

机器学习——损失函数

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、简介 损失函数(loss function)又称为误差函数(error function)&#xff0c;是衡量模型好坏的标准&#xff0c;用于估量模型的预测值与真实值的不一致程度&#xff0c;是一个…

java itext5 生成PDF并填充数据导出

java itext5 生成PDF并填充数据导出 依赖**文本勾选框****页眉**&#xff0c;**页脚****图片**实际图 主要功能有文本勾选框&#xff0c;页眉&#xff0c;页脚&#xff0c;图片等功能。肯定没有专业软件画的好看&#xff0c;只是一点儿方法。仅供参考。 依赖 <!--pdf-->&…

12.18构建哈夫曼树(优先队列),图的存储方式,一些细节(auto,pair用法,结构体指针)

为结构体自身时&#xff0c;用.调用成员变量&#xff1b;为结构体指针时&#xff0c;用->调用成员变量 所以存在结构体数组时&#xff0c;调用数组元素里的成员变量&#xff0c;就是要用. 结构体自身只有在new时才会创建出来&#xff0c;而其指针可以随意创建 在用new时&…

Android Security PIN 相关代码

开发项目遇到一个问题&#xff0c;具体描述及复制步骤如下&#xff1a; 就是开启"Enhanced PIN privacy"(增强的PIN隐私)的时候输入秘密的时候还是会显示数字 如下图&#xff0c;应该是直接是“.” 不应该出现PIN 密码 想要的效果如下图&#xff1a; 设置的步骤如下图…

RabbitMQ 和 Kafka 对比

本文对RabbitMQ 和 Kafka 进行下比较 文章目录 前言RabbitMQ架构队列消费队列生产 Kafka本文小结 前言 开源社区有好多优秀的队列中间件&#xff0c;比如RabbitMQ和Kafka&#xff0c;每个队列都貌似有其特性&#xff0c;在进行工程选择时&#xff0c;往往眼花缭乱&#xff0c;不…

多态-多态的基本概念-类和对象

多态的基本 #include<iostream> using namespace std; //动物类 class Animal { public:virtual void Speak(){cout << " 动物在噢噢叫" << endl;} }; //猫类 class Cat :public Animal { public:void Speak(){cout << "小猫在噢噢叫&…

C++系列-第3章循环结构-26-认识do-while语句

C系列-第3章循环结构-26-认识do-while语句 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 对于 while 语句而言&#xff0c;如果不满足条件&#xff0c;则不能进入循环。但有时候我们需要即使不满足条件&#xff0c;也至少执行一次。 do-while循环…

购买腾讯云服务器需要多少钱?购买腾讯云服务器方法教程

腾讯云轻量应用服务器购买指南&#xff0c;有两个入口&#xff0c;一个是在特价活动上购买&#xff0c;一个是在轻量应用服务器官方页面购买&#xff0c;特价活动上购买价格更便宜&#xff0c;轻量2核2G3M带宽服务器62元一年起&#xff0c;阿腾云atengyun.com分享腾讯云轻量应用…

算法导论复习纲要

函数 1. 上界下界&#xff0c;紧确界的定义 2. 求解递推式&#xff0c;代入法&#xff0c;递归树法&#xff0c;主方法 分治算法 动态规划 1. 切割钢条&#xff1a;递归方法&#xff0c;动态的自上而下&#xff0c; 2. 矩阵乘法&#xff1a;最优子结构性的证明&#xff0c…