【C++】B2076 球弹跳高度的计算

文章目录
- 💯前言
- 💯题目描述
- 输入格式
- 输出格式
- 输入输出示例
- 💯两种代码实现及其对比
- 我的代码实现
- 代码分析
- 优点与不足
- 老师的代码实现
- 代码分析
- 优点与不足
- 💯两种实现的对比总结
- 💯优化与拓展
- 优化后的代码
- 优化点
- 💯小结

💯前言
- 在学习C++编程的过程中,实践题目往往是提高编程思维和熟悉语法的有效方法。本次我们讨论了一道关于球弹跳高度和总路程的计算题目,分析了题目要求以及两种不同的解法。通过对比代码设计和逻辑实现,我们总结出优化方法,并进一步拓展相关编程知识。本文将以完整的结构带领读者梳理这道题目的思路、实现和优化方向。
C++ 参考手册

💯题目描述
B2076 球弹跳高度的计算

题目要求如下:
一球从一定高度(整数,高度单位为米)自由下落,每次落地后反弹回原高度的一半。经过 10 次落地后,计算:
- 球在第 10 次落地时,共经过多少米的总路程?
- 第 10 次反弹的高度是多少?
输入格式
输入一个整数:表示球的初始高度。
输出格式
输出包含两行:
- 第 10 次落地时,共经过的米数(保留小数)。
- 第 10 次反弹的高度(保留小数)。
输入输出示例
输入:
20
输出:
59.9219
0.0195313
💯两种代码实现及其对比
在本次学习中,我们首先通过学生的代码完成了对题目逻辑的实现。随后,又参考了老师的代码。两种解法都满足了题目需求,但在变量使用、循环设计等细节上有所差异。下面,我们分别分析两种代码的逻辑,并总结其优缺点。
我的代码实现
以下是我的代码实现:
#include <iostream>
using namespace std;int main() {int h;cin >> h; // 输入初始高度double s = h, h2 = h * 1.0 / 2; // 初始化总路程和第一次反弹高度int i = 0; // 循环计数器do {s += h2 * 2; // 每次反弹产生的路程h2 /= 2; // 反弹高度减半i++; // 计数器递增} while (i < 9); // 循环 9 次(第 1 次下落已单独处理)cout << s << endl; // 输出总路程cout << h2 << endl; // 输出第 10 次反弹高度return 0;
}

代码分析
-
变量定义:
h:表示球的初始高度,输入后赋值给变量。s:记录总路程,初始值为第一次下落的高度。h2:记录当前反弹高度,初始值为第一次反弹高度,即h / 2。
-
逻辑结构:
- 使用
do-while循环,确保至少执行一次循环。 - 在每次循环中:
- 累加当前反弹的路程
h2 * 2(下落一次、反弹一次)。 - 更新
h2为下一次反弹高度(减半)。
- 累加当前反弹的路程
- 循环 9 次,配合初始的第 1 次下落,共计 10 次。
- 使用
-
输出:
- 总路程保存在
s中。 - 第 10 次反弹的高度保存在
h2中。
- 总路程保存在
优点与不足
-
优点:
- 程序逻辑清晰,分步骤计算。
- 使用浮点类型
double,能够处理小数精度问题。
-
不足:
- 使用了额外变量
h2,略显冗余。 do-while循环的计数逻辑不够直观(计数从 0 开始,循环 9 次)。- 缺乏对输出精度的控制。
- 使用了额外变量
老师的代码实现
以下是老师提供的代码实现:
#include <iostream>
using namespace std;int main() {double h = 0; // 初始化 h 为 0,接收输入的高度cin >> h;int i = 1; // 循环计数器,从第 1 次开始double total = h; // 总路程,先加上第一次下落的高度do {h /= 2; // 反弹高度减半total += h * 2; // 加上反弹两次的路程i++; // 次数 +1} while (i <= 9); // 循环到第 9 次为止(共 10 次落地)cout << total << endl; // 输出总路程cout << h / 2 << endl; // 输出第 10 次反弹高度return 0;
}

代码分析
-
变量定义:
h:表示当前高度,初始为输入高度。total:记录总路程,初始为第一次下落的高度。
-
逻辑结构:
- 使用
do-while循环计算剩余的 9 次落地。 - 每次循环:
- 高度减半。
- 累加当前反弹的路程
h * 2。
- 循环计数从 1 开始,直到第 9 次。
- 使用
-
输出:
- 第 10 次反弹高度直接通过
h / 2计算,无需额外变量。
- 第 10 次反弹高度直接通过
优点与不足
-
优点:
- 变量定义更简洁,直接使用
h表示当前高度。 - 计数逻辑更符合人类直觉(从 1 开始计数)。
- 避免了不必要的变量。
- 变量定义更简洁,直接使用
-
不足:
- 缺少对输出精度的设置。
💯两种实现的对比总结
| 比较维度 | 我的代码 | 老师的代码 |
|---|---|---|
| 变量使用 | 使用额外变量 h2 表示反弹高度 | 直接复用 h 表示当前高度 |
| 计数逻辑 | 从 0 开始计数,循环 9 次 | 从 1 开始计数,循环 9 次 |
| 输出精度 | 未控制输出精度 | 未控制输出精度 |
| 代码简洁性 | 变量定义较多,逻辑稍显冗余 | 变量少,逻辑更清晰 |
💯优化与拓展
结合两种实现的优点,可以进一步优化代码:
优化后的代码
#include <iostream>
#include <iomanip> // 引入格式化输出库
using namespace std;int main() {double h; // 球的初始高度cin >> h;double total = h; // 总路程,先加上第一次落地的高度int i = 1; // 计数器,从第 1 次开始do {h /= 2; // 当前反弹高度为上一高度的一半total += h * 2; // 累加上下两次路程i++; // 次数 +1} while (i <= 9); // 循环至第 9 次结束// 设置输出精度cout << fixed << setprecision(6);cout << total << endl; // 总路程cout << h / 2 << endl; // 第 10 次反弹高度return 0;
}


优化点
- 使用
fixed和setprecision控制输出精度,保证小数点后一致位数。 - 避免了冗余变量,直接使用
h表示当前高度。 - 计数逻辑更直观,从 1 开始计数。
💯小结

本次讨论中,我们通过一道关于球弹跳高度的计算题目,探讨了如何用 C++ 编程实现数学逻辑。通过分析和优化,我们发现:
- 代码的简洁性和可读性很重要: 减少冗余变量、优化计数逻辑能让代码更清晰。
- 输出精度控制: 使用
setprecision是处理小数输出的重要技巧。 - 逻辑设计与数学结合: 通过循环和递归更新变量,实现题目中数学模型的计算。

学习C++是一段既充满挑战又令人收获颇丰的旅程。作为一门历史悠久且广泛应用的编程语言,C++不仅提供了强大的功能,还以其复杂性闻名。因此,在学习这门语言的过程中,我深刻体会到了它的深度和广度,同时也总结了一些心得,希望对未来的学习者有所帮助。
初识C++:从基础开始
在接触C++之前,我对编程的了解仅限于一些基础的概念,例如变量、循环和条件语句。C++的学习从这些最基本的部分开始,帮助我夯实了编程的基础。C++的语法严格,这在一开始可能会让人感到不适应,但也正是因为这种严格性,它迫使我养成了良好的编程习惯。例如,必须明确变量的类型,让我更注重程序的逻辑性和可读性。
掌握面向对象编程思想
C++最具特色的部分之一就是面向对象编程(OOP)。初次接触类和对象时,我对这种编程范式感到新奇而又困惑。OOP的核心思想是将现实世界中的事物抽象为类,通过类的实例化生成对象,从而以更直观的方式管理程序的复杂性。
我记得刚开始学习类时,写了一个关于"学生管理系统"的小程序。通过定义"学生"类,设置姓名、学号和成绩等属性,再为类添加一些方法,如打印信息和计算平均分,我逐渐理解了OOP的实际应用价值。这种封装、继承和多态的思想让我感受到C++的强大,也让我认识到软件设计中的灵活性。
理解指针与内存管理
如果说C++中有什么让我印象最深刻且花费最多时间去理解的内容,那一定是指针和内存管理。指针是C++的一大特色,同时也是许多初学者的难点。我在学习过程中经常因为指针的误用导致程序崩溃,甚至遇到一些难以调试的问题。
为了更好地理解指针,我专门阅读了一些资料,并亲手编写了许多练习程序。例如,我通过编写动态数组、链表和二叉树等数据结构,深刻体会到了指针在动态内存分配中的重要性。通过这些实践,我不仅掌握了指针的使用,还学会了如何使用new和delete进行内存管理,以及如何避免内存泄漏。
学习STL的便利性
C++的标准模板库(STL)是学习过程中的一个亮点。STL提供了许多现成的数据结构和算法,例如向量(vector)、队列(queue)、栈(stack)以及哈希表(unordered_map)等。在学习STL之前,我花了大量时间自己实现这些数据结构,而STL的出现大大简化了我的开发过程。
通过学习STL,我认识到了高效代码的重要性,也学会了如何快速解决问题。例如,在一次编程竞赛中,我需要快速实现一个排序功能,而STL中的sort函数帮助我节省了大量时间。与此同时,我还了解了STL背后的一些实现原理,例如迭代器的使用和时间复杂度的分析。
错误与调试:不可避免的成长
在学习C++的过程中,错误和调试是不可避免的。无论是编译错误还是运行时错误,几乎每次编写代码时都要面对各种各样的问题。这让我一开始感到沮丧,但随着经验的积累,我学会了如何分析错误信息并快速定位问题。
调试工具是我的好帮手。例如,使用gdb调试器让我能够逐行检查代码的执行过程,而现代的集成开发环境(IDE)如Visual Studio则提供了更直观的调试界面。此外,我还养成了在代码中添加日志和断点的习惯,这些技巧帮助我在处理复杂问题时更加得心应手。
提升编程效率的技巧
随着对C++的深入学习,我也总结了一些提升编程效率的技巧:
- 模块化编程:将代码分成多个文件,使得每个模块专注于完成特定的任务,从而提高代码的可读性和可维护性。
- 注重代码规范:遵循一致的命名规则和缩进风格,让代码更易于理解。
- 利用C++11/14/17的新特性:例如,
auto关键字简化了变量类型的声明,智能指针(std::shared_ptr和std::unique_ptr)帮助更安全地管理内存。 - 多阅读优秀代码:通过阅读开源项目中的代码,我学到了很多实用的编程技巧和设计模式。
总结与展望
学习C++不仅让我掌握了一门编程语言,更让我养成了严谨的思维方式。在这个过程中,我学会了如何从问题中总结经验,如何不断优化自己的代码,以及如何以更高效的方式解决实际问题。
未来,我希望能够继续深入学习C++的高级特性,例如模板编程和多线程开发,同时也希望能够将C++应用于更多实际项目中,如游戏开发、嵌入式系统和高性能计算。我相信,通过不断的实践和学习,我将在C++的世界中发现更多的乐趣和可能性。
总之,C++是一门值得花时间深入学习的语言。尽管它的学习曲线较陡,但正是这种挑战让我更加热爱编程,也让我在每次克服困难后获得了巨大的成就感。
相关文章:
【C++】B2076 球弹跳高度的计算
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式输入输出示例 💯两种代码实现及其对比我的代码实现代码分析优点与不足 老师的代码实现代码分析优点与不足 💯两种实现的对…...
【Python】selenium结合js模拟鼠标点击、拦截弹窗、鼠标悬停方法汇总(使用 execute_script 执行点击的方法)
我们在写selenium获取网络信息的时候,有时候我们会受到对方浏览器的监控,对方通过分析用户行为模式,如点击、滚动、停留时间等,网站可以识别出异常行为,进而对Selenium爬虫进行限制。 这里我们可以加入JavaScript的使…...
CatBoost算法详解与PyTorch实现
CatBoost算法详解与PyTorch实现 目录 CatBoost算法详解与PyTorch实现@[TOC](目录)1. CatBoost算法概述1.1 梯度提升树(GBDT)1.2 CatBoost的优势2. CatBoost的核心技术2.1 类别特征处理2.2 对称树结构2.3 有序提升技术2.4 正则化技术3. PyTorch实现CatBoost3.1 环境准备3.2 Py…...
“TypeScript版:数据结构与算法-初识算法“
引言 在算法与编程的广阔世界里,总有一些作品以其独特的魅力和卓越的设计脱颖而出,成为我们学习和研究的典范。今天,我非常荣幸地向大家分享一个令人印象深刻的算法——Hello算法。 Hello算法不仅展现了作者深厚的编程功底,更以…...
mysql中递归的使用 WITH RECURSIVE
MySQL递归查询的基本语法和用法 MySQL 8.0及以上版本支持使用WITH RECURSIVE来进行递归查询。WITH RECURSIVE定义了一个递归的公用表表达式(CTE),它包含两个部分:递归的基础部分(非递归部分)和递归部分。 …...
点击取消按钮,console出来数据更改了,页面视图没有更新
点击取消按钮,console出来数据更改了,页面视图没有更新 前言 实现效果:点击取消按钮,页面视图全部为空, 遇到的问题: 点击取消按钮,console出来数据更改了,SchemaJson 都是默认值啦…...
web框架在什么程度上受限 ?
Web框架提供了开发网站和Web应用的基础结构和工具,但它们也有一些限制。了解这些限制有助于选择合适的框架或决定何时可能需要寻找或开发替代方案。 1、问题背景 提问者计划构建一个 RESTful web 服务,该服务将只使用 JSON/XML 接口,不包含 …...
实践:事件循环
实践:事件循环 代码示例 console.log(1); setTimeout(() > console.log(2), 0); Promise.resolve(3).then(res > console.log(res)); console.log(4);上述的代码的输出结果是什么 1和4肯定优先输出,因为他们会立即方式堆栈的执行上下文中执行&am…...
C++ 设计模式:建造者模式(Builder Pattern)
链接:C 设计模式 链接:C 设计模式 - 工厂方法 链接:C 设计模式 - 抽象工厂 链接:C 设计模式 - 原型模式 建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象。与其他…...
SQL偏移类窗口函数—— LAG()、LEAD()用法详解
SQL偏移类窗口函数:LAG() 和 LEAD() 用法详解 在 SQL 中,偏移类窗口函数 LAG() 和 LEAD() 用于访问当前行的前几行或后几行的值。 1. LAG() 函数 LAG() 函数返回当前行的前几行的数据。 LAG(Expression, OffSetValue, DefaultVar) OVER (PARTITION BY …...
基于Pytorch和yolov8n手搓安全帽目标检测的全过程
一.背景 还是之前的主题,使用开源软件为公司搭建安全管理平台,从视觉模型识别安全帽开始。主要参考学习了开源项目 https://github.com/jomarkow/Safety-Helmet-Detection,我是从运行、训练、标注倒过来学习的。由于工作原因,抽空…...
[CTF/网络安全] 攻防世界 upload1 解题详析
姿势 在txt中写入一句话木马<?php eval($_POST[qiu]);?> 回显如下: 查看源代码: Array.prototype.contains function (obj) { var i this.length; while (i--) { if (this[i] obj) { return true; } } return false; } function …...
03-其他
我们学校的教授们都还是很温柔,很有趣的,所以只要大家好好发挥,拿到90没问题的。 你以后打算研究什么? 你研究生的打算是什么?你计算机的前沿技术了解多少?(这个问题我真没了解过。。拉了&…...
EasyExcel自定义动态下拉框(附加业务对象转换功能)
全文直接复制粘贴即可,测试无误 一、注解类 1、ExcelSelected.java 设置下拉框 Documented Target({ElementType.FIELD})//用此注解用在属性上。 Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中,jvm加载class文件之后,…...
2025.1.2
练习: 1> 创建一个工人信息库,包含工号(主键)、姓名、年龄、薪资。 2> 添加三条工人信息(可以完整信息,也可以非完整信息) 3> 修改某一个工人的薪资(确定的一个…...
重庆大学软件工程复试怎么准备?
重大软件复试相对来说不算刁钻,关键是对自己的竞赛和项目足够了解,能应对老师的提问。专业课范围广,英文文献看个人水平,难度不算大,整体只要表现得得体从容,以及充分的准备,老师不会为难你。 …...
Ant Design Pro搭建react项目
1、使用pro-cli 来快速的初始化脚手架,先全局安装 npm i ant-design/pro-cli -g pro create myapp 2、选择模板类型 pro 是基础模板,只提供了框架运行的基本内容,complete 包含所有区块,不太适合当基础模板来进行二次开发。&a…...
mysql连接时报错1130-Host ‘hostname‘ is not allowed to connect to this MySQL server
不在mysql服务器上通过ip连接服务提示1130错误怎么回事呢。这个错误是因为在数据库服务器中的mysql数据库中的user的表中没有权限。 解决方案 查询mysql库的user表指定账户的连接方式 SELECT user, host FROM mysql.user;修改指定账户的host连接方式 update mysql.user se…...
办公 三之 Excel 数据限定录入与格式变换
开始-----条件格式------管理规则 IF($A4"永久",1,0) //如果A4包含永久,条件格式如下: OR($D5<60,$E5<60,$F5<60) 求取任意科目不及格数据 AND($D5<60,$E5<60,$F5<60) 若所有科目都不及格 显示为红色 IF($H4<EDATE…...
Ubuntu执行sudo apt-get update失败的解决方法
Ubuntu版本:24.04.1 报错信息: Clearsigned file isnt valid, got NOSPLIT (does the network require authentication?) 如果你在执行以上命令的时候也出现了上面这样的错误提示,先检查一下是不是网络问题,如果确定不是&…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
