【C++】九九乘法表编程题详解与多角度对比分析


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目概述
    • 题目描述
  • 💯老师的实现方法
    • 代码解析
    • 优点
    • 不足
  • 💯我的实现方法
    • 代码解析
    • 优点
    • 不足
  • 💯实现方法对比
  • 💯优化与扩展
    • 代码优化建议
    • 扩展思路
  • 💯小结


在这里插入图片描述


💯前言

  • 九九乘法表是编程入门过程中一项经典题目,它以简单的数学规律为基础,考察程序的基本控制流、输出格式化以及循环嵌套的应用。本文围绕一道九九乘法表的编程题,结合多种实现方法展开详细解析,包括代码的思路、老师的实现方式、我的实现方式以及两者的详细对比。最后,本文还将通过优化建议与扩展思路,进一步拓展代码的应用场景。通过阅读本文,希望你能全面掌握九九乘法表编程的核心要点,并体会不同实现方式的优劣。
    C++ 参考手册
    在这里插入图片描述

💯题目概述

乘法表
在这里插入图片描述

题目要求:
输出标准的九九乘法表,具体的输出格式遵循以下规则:

  • 每项的结果需要占据 2 个字符宽度,对齐输出。
  • 每行的不同乘法结果之间用一个空格分隔。
  • 每行输出完毕后换行,直至完整输出九九乘法表。

以下是题目完整内容和示例:

题目描述

输出九九乘法表。

具体的输出格式见下例,其中每一项乘法的结果需要占据 2 个字符宽度,不同的乘法结果之间用 1 个空格间隔:

1*1= 1
1*2= 2  2*2= 4
1*3= 3  2*3= 6  3*3= 9
1*4= 4  2*4= 8  3*4=12  4*4=16
1*5= 5  2*5=10  3*5=15  4*5=20  5*5=25
1*6= 6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7= 7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8= 8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9= 9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

输入描述:
无输入。

输出描述:
按上述格式输出九九乘法表。


💯老师的实现方法

以下是老师提供的代码实现,基于 C 语言的经典 printf 方法:

#include <cstdio>

int main() {
    for (int i = 1; i < 10; i++) {
        for (int j = 1; j <= i; j++) {
            printf("%d*%d=%2d ", j, i, i * j);
        }
        printf("\n");
    }
    return 0;
}

在这里插入图片描述

代码解析

  1. 头文件部分

    • #include <cstdio>:这是 C 语言中标准 I/O 库的头文件,提供了 printfscanf 等函数。
  2. 外层循环

    for (int i = 1; i < 10; i++) {
    
    • 外层循环控制行号,从 19
    • i 行打印 i 项。
  3. 内层循环

    for (int j = 1; j <= i; j++) {
    
    • 内层循环控制列号,从 1 到当前行号 i
    • 每次迭代输出当前行中的一项乘法。
  4. 输出格式化

    printf("%d*%d=%2d ", j, i, i * j);
    
    • 使用 printf 格式化输出:
      • %d:输出整数。
      • %2d:输出占 2 个字符宽度的整数,不足时用空格补齐。
      • 每个结果后追加一个空格。
  5. 换行

    printf("\n");
    
    • 每行末尾输出换行符,开始打印下一行。

优点

  • 高效性:printf 是 C 标准库的一部分,执行效率高。
  • 代码简洁:格式化输出功能强大,适合实现类似本题的格式要求。
  • 学习价值:体现了 C 语言的基本编程思想,适合初学者深入理解。

不足

  • 可读性一般:格式化字符串中符号较多,对初学者来说可能稍显复杂。
  • 扩展性有限:如果要修改输出格式(如宽度),需要仔细调整格式字符串。

💯我的实现方法

以下是我基于 C++ 的实现,使用了流式输出和 <iomanip> 提供的格式化工具:

#include <iostream>
#include <iomanip> 
using namespace std;

int main() {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            cout << setw(2) << j << "*" << i << "=" << setw(2) << j * i << " ";
        }
        cout << endl;
    }
    return 0;
}

在这里插入图片描述

代码解析

  1. 头文件部分

    • #include <iostream>:提供 cincout 等流式 I/O 操作。
    • #include <iomanip>:提供格式化工具 setw,用于控制输出宽度。
  2. 流式输出

    cout << setw(2) << j << "*" << i << "=" << setw(2) << j * i << " ";
    
    • setw(2):设置输出字段宽度为 2,保证对齐。
    • 使用流式输出操作符 <<,语法接近自然语言,易于理解。
  3. 换行

    cout << endl;
    
    • 使用 endl 输出换行符,同时刷新输出缓冲区。

优点

  • 语法清晰:流式输出的语法直观,便于初学者理解。
  • 扩展性强:通过调整 setw 的参数,可以轻松修改输出格式。
  • 可维护性好:代码结构化程度高,便于后期修改和扩展。

不足

  • 执行效率稍低:相比 printf,流式输出需要额外的缓冲区操作。
  • 依赖更多头文件:需要引入 <iomanip>,增加了学习成本。

💯实现方法对比

以下是两种实现方式的详细对比:

比较维度我的实现(C++)老师的实现(C)
语言风格面向对象,语法现代程序结构简单,接近底层
输出方式使用 setw 格式化输出,直观灵活使用 printf 格式化输出,高效但符号复杂
代码简洁性更加可读,语义清晰紧凑高效,但对初学者不够直观
性能执行效率略低(流式 I/O)执行效率高
扩展性方便调整输出格式修改格式较为麻烦
适用场景适合学习现代 C++ 编程,注重语法清晰和可维护性适合学习 C 基础编程,注重性能和效率

💯优化与扩展

代码优化建议

  1. 结合灵活性与高效性

    • 在 C++ 中,也可以使用 printf 实现格式化输出,兼顾高效性和现代语法。
    printf("%d*%d=%2d ", j, i, j * i);
    
  2. 用户自定义范围

    • 修改代码,让用户输入范围,从而生成任意范围的乘法表。
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            cout << setw(2) << j << "*" << i << "=" << setw(2) << j * i << " ";
        }
        cout << endl;
    }
    
  3. 国际化支持

    • 添加多语言支持,将输出语言设为中文(如“一个乙= 一个甲”)或其他语言。

扩展思路

  1. 打印其他进制乘法表
    • 修改代码生成二进制或十六进制的乘法表。
  2. 输出到文件
    • 将结果写入文件而不是控制台。
    ofstream file("output.txt");
    file << ...;
    
  3. 图形化显示
    • 使用库(如 OpenGL 或 GUI 工具包)将乘法表可视化。

💯小结

本文围绕九九乘法表编程题,从题目要求、实现方法到代码优化和扩展思路进行了详细解析。通过对比老师的 C 实现与我的 C++ 实现,我们看到了不同编程风格的优劣,并通过优化与扩展展示了代码的更多可能性。希望本文能帮助你加深对编程基础的理解,并在学习中灵活选择适合自己的实现方式。


在这里插入图片描述


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

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

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

相关文章

RK3568 bsp 9 - USB调试记录

文章目录 1、环境介绍2、RK3568 USB资源介绍3、配置目标4、dts配置4.1、USB3.0 OTG4.2、USB2.0 Host 2 和 USB2.0 Host 3 5、kernel配置5.1、USB PHY CONFIG5.2、USB Host CONFIG5.3、USB OTG CONFIG5.4、USB外设CONFIG5.4.1、Mass Storage Class CONFIG5.4.2、USB HID CONFIG …

图像描述/字幕开源模型与数据集全览

图像描述/字幕&#xff08;Image Captioning&#xff09;是用文字描述图像内容的任务&#xff0c;属于计算机视觉和自然语言处理的交叉领域。大多数图像描述系统采用编码器-解码器&#xff08;encoder-decoder&#xff09;框架&#xff0c;其中输入图像被编码为中间表示形式&am…

mongodb(6.0.15)安装注意事项,重装系统后数据恢复

window10系统 上周重装了系统&#xff0c;环境变量之类的都没有了。现在要恢复。 我电脑里之前的安装包没有删除&#xff08;虽然之前也没在C盘安装&#xff0c;但是找不到了&#xff0c;所以需要重新下载安装&#xff09;&#xff0c;长下图这样。这个不是最新版本&#xff0…

Redis单线程快的原因

基于内存操作&#xff1a;Redis将数据存储在内存中&#xff0c;使得数据的读写速度极快&#xff0c;这是其性能优势的主要原因。单线程避免上下文切换&#xff1a;在多线程环境下&#xff0c;CPU核数有限&#xff0c;线程上下文切换会带来性能损耗。Redis采用单线程&#xff0c…

IOS safari 播放 mp4 遇到的坎儿

起因 事情的起因是调试 IOS 手机下播放服务器接口返回的 mp4 文件流失败。对于没调试过移动端和 Safari 的我来说着实费了些功夫&#xff0c;网上和AI也没有讲明白。好在最终大概理清楚了&#xff0c;在这里整理出来供有缘人参考。 问题 因为直接用 IOS 手机的浏览器打开页面…

import org.springframework.data.jpa.repository.JpaRepository<T, ID>;

org.springframework.data.jpa.repository.JpaRepository<T, ID> 接口中的 ID 类型参数。 理解 JpaRepository<T, ID> 中的 T 和 ID&#xff1a; T (Type): T 代表的是你想要操作的 实体类 的类型。例如&#xff0c;如果你有一个名为 User 的实体类&#xff0c;那…

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机&#xff0c; vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式&#xff1b;nat模式&#xff1b;host模式 一、桥接模式 所谓桥接模式&#xff0c;也就是虚拟机与宿主机处于同一个网段&#xff0c; 宿主机…

RT-DETR融合[CVPR2020]EfficientDet中的BiFPN结构

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《EfficientDet: Scalable and Efficient Object Detection》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/1911.09070 代码链接&#xff1a;https://github.com/…

Unity 实现Canvas显示3D物体

新建一个UI相机&#xff0c;选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体&#xff0c;并将3D物体的层级设置为UI层 适当的放缩3DObjParent&#xff0c;让3D物体能显示出来…

RabbitMQ基础篇之Java客户端快速入门

文章目录 需求 项目设置与依赖管理 配置RabbitMQ的连接信息创建队列与消息发送创建消费者&#xff08;消息接收&#xff09;环境准备与操作 需求 利用控制台创建队列 simple.queue在 publisher 服务中&#xff0c;利用 SpringAMQP 直接向 simple.queue 发送消息在 consumer 服…

解决SecureCRT登录后无法用Tab键补齐命令

解决SecureCRT登录后无法用Tab键补齐命令 打开SecureCRT软件&#xff0c;选项—全局选项—常规—默认的会话设置—编辑默认的设置—连接—-右侧的协议选择为Telnet &#xff1b;在左侧&#xff0c;选择telnet&#xff0c;在右侧的高级框里“强制每次一个字符模式”勾上&#x…

音视频入门基础:MPEG2-TS专题(23)——通过FFprobe显示TS流每个packet的信息

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…

运行python程序报错 undefined symbol: ffi_type_uint32 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 ROS-Noetic 一、问题描述 运行 python 程序出现如下问题&#xff1a; Traceback (most recent call last):File "<string>", line 1, in <module&…

go 模拟TCP粘包和拆包,及解决方法

1. 什么是 TCP 粘包与拆包&#xff1f; 粘包&#xff08;Sticky Packet&#xff09; 粘包是指在发送多个小的数据包时&#xff0c;接收端会将这些数据包合并成一个数据包接收。由于 TCP 是面向流的协议&#xff0c;它并不会在每次数据发送时附加边界信息。所以当多个数据包按顺…

Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项

栈和队列理论基础 抽象认识 栈是先进后出(FIFO)&#xff0c;队列是先进先出(LIFO) 队首(先进))队尾(后进)栈顶(后进)栈底(先进) 栈(Stack) 只在一端进行进出操作(只在一端进一端出)像个篮球框&#xff0c;取用篮球从一端进出。 /进栈 int a[1000];//足够大的栈空间 int top-1…

Gemma2 2B 模型的model.safetensors.index.json文件解析

Gemma2 2B 模型的 model.safetensors.index.json 文件解析 在使用 Gemma2 2B 模型或其他大型预训练模型时&#xff0c;model.safetensors.index.json 文件起到了索引的作用&#xff0c;它帮助我们了解模型的结构、参数存储方式以及如何加载模型的具体权重。本博客将深入解析该…

大模型系列——旋转位置编码和长度外推

绝对位置编码 旋转位置编码 论文中有个很直观的图片展示了旋转变换的过程&#xff1a; 对于“我”对应的d维向量&#xff0c; 拆分成d/2组以后&#xff0c;每组对应一个角度&#xff0c;若1对应的向量为(x1,x2)&#xff0c;应用旋转位置编码&#xff0c;相当于这个分量旋转了m…

网络安全威胁2024年中报告

下载地址&#xff1a; 网络安全威胁2024年中报告-奇安信

Momentum Contrast for Unsupervised Visual Representation Learning论文笔记

文章目录 论文地址动量队列对比学习的infoNCE loss为什么需要动量编码器对比学习moco方法中的动量Encoder为什么不能与梯度Encoder完全相同为什么动量编码器和梯度编码器不能完全相同&#xff1f;总结&#xff1a; 我理解&#xff0c;正负样本应该经过同一个encoder&#xff0c…

Unity 使用UGUI制作卷轴开启关闭效果

视频效果 代码 using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options;public class JuanZhou : MonoBehaviour {[SerializeField]private …