【C++】B2099 矩阵交换行


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目描述
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
      • 输入 #1
      • 输出 #1
  • 💯题目分析
  • 💯不同解法分析
    • 我的做法
      • 实现步骤:
      • 优点:
      • 不足:
    • 老师的做法
      • 实现步骤:
      • 优点:
      • 不足:
    • 优化与改进
      • 优化点:
  • 💯小结


在这里插入图片描述


💯前言

  • 在学习 C++ 的过程中,二维数组操作是一个重要的知识点,而矩阵的行交换问题则是一个经典案例。本文将围绕一道涉及矩阵行交换的题目展开,从题目描述到代码实现,再到优化与拓展,逐步解析这道题的核心思想与实现方式。通过分析不同实现方法的优缺点,本文旨在帮助读者更加全面地理解二维数组操作的精髓。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

题目编号为 B2099 矩阵交换行,具体内容如下:
B2099 矩阵交换行
在这里插入图片描述

题目描述

给定一个 5 × 5 的矩阵(数学上,一个 r × c r × c r×c 的矩阵是一个由 r r r c c c 列元素排列成的矩形数组),将第 n n n 行和第 m m m 行交换,输出交换后的结果。

输入格式

输入共 6 行,前 5 行为矩阵的每一行元素,元素与元素之间以一个空格分开。

第 6 行包含两个整数 m , n m, n m,n,以一个空格分开( 1 ≤ m , n ≤ 5 1 \leq m, n \leq 5 1m,n5)。

输出格式

输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。

输入输出样例

输入 #1

1 2 3 4 5
6 7 8 9 0
9 0 3 0 3
4 5 6 7 8
1 2 3 4 5
1 3

输出 #1

9 0 3 0 3
6 7 8 9 0
1 2 3 4 5
4 5 6 7 8
1 2 3 4 5

💯题目分析

这道题的核心是实现对矩阵的行交换操作,其解题关键点包括:

  1. 矩阵的存储:

    • 使用二维数组存储 5 × 5 的矩阵。
    • 每个元素通过两层循环读取并存入数组。
  2. 行交换逻辑:

    • 根据用户输入的行号 m m m n n n,将第 m m m 行和第 n n n 行的元素逐列交换。
    • 使用一个临时变量(tmp)作为中转,逐列交换两个行的元素。
  3. 矩阵的输出:

    • 交换完成后,按题目要求的格式输出矩阵。
  4. 输入校验(可选):

    • 检查用户输入的行号是否在合法范围内(1 – 5)。
    • 若输入非法,给出提示信息并终止程序。

💯不同解法分析

我的做法

以下是我的实现代码:

#include <iostream>
using namespace std;int main()
{int arr[5][5];for(int i = 0; i < 5; i++){for(int j = 0; j < 5; j++){cin >> arr[i][j];}}int m, n;cin >> m >> n;for(int j = 0; j < 5; j++){int temp = arr[m - 1][j];arr[m - 1][j] = arr[n - 1][j];arr[n - 1][j] = temp;}for(int i = 0; i < 5; i++){for(int j = 0; j < 5; j++){cout << arr[i][j] << " ";}cout << endl;}    return 0;    
}

在这里插入图片描述

实现步骤:

  1. 矩阵输入:

    • 定义一个大小为 5×5 的二维数组 arr
    • 使用嵌套 for 循环将输入的矩阵数据存入数组中。
  2. 行交换:

    • 使用 for 循环遍历矩阵的每一列,逐列交换第 m-1 行和第 n-1 行的元素。
    • 使用中间变量 temp 进行临时存储,确保数据不被覆盖。
  3. 矩阵输出:

    • 再次使用嵌套 for 循环按题目要求的格式输出矩阵。

优点:

  • 代码清晰简洁,符合题目要求。
  • 行交换逻辑直观明了,适合初学者理解。

不足:

  1. 缺少输入校验:未对用户输入的行号 m , n m, n m,n 进行有效性检查。
  2. 硬编码矩阵大小:矩阵大小固定为 5×5,缺乏通用性。
  3. 优化空间有限:行交换逻辑虽然简单,但仍可进一步封装为函数,提高代码的可读性与复用性。

老师的做法

以下是老师的实现代码:

#include <iostream>
using namespace std;int arr[5][5];
int r1, r2;int main()
{int i = 0;int j = 0;// 输入for (i = 0; i < 5; i++){for (j = 0; j < 5; j++){cin >> arr[i][j];}}cin >> r1 >> r2;// 交换for (i = 0; i < 5; i++){int tmp = arr[r1 - 1][i];arr[r1 - 1][i] = arr[r2 - 1][i];arr[r2 - 1][i] = tmp;}// 输出for (i = 0; i < 5; i++){for (j = 0; j < 5; j++){cout << arr[i][j] << " ";}cout << endl;}return 0;
}

在这里插入图片描述

实现步骤:

与我的做法类似,但存在以下不同之处:

  1. 将数组 arr 和行号变量 r1, r2 定义为全局变量。

    • 优点:全局变量的定义使得主函数更简洁。
    • 缺点:全局变量的使用可能影响代码的模块化和可维护性。
  2. 对于矩阵输入和输出,老师使用了固定的循环变量 ij

  3. 行交换逻辑与我的实现方式基本一致,采用中间变量 tmp 完成逐列交换。

优点:

  • 与我的实现类似,逻辑清晰简洁。
  • 更贴近 C++ 的传统写法。

不足:

  1. 全局变量的使用:全局变量虽然简化了代码,但可能导致后续维护问题,尤其在多函数代码中。
  2. 缺少输入校验:未验证用户输入的行号是否在合法范围内。

优化与改进

结合上述分析,可以对代码进行以下优化:

  1. 输入校验:确保用户输入的行号合法。若输入非法,输出错误信息并终止程序。
  2. 封装行交换逻辑:将行交换封装为函数,提升代码的可读性与复用性。
  3. 避免硬编码:使用常量定义矩阵大小,提高代码的通用性。
  4. 避免全局变量:将全局变量改为局部变量,提升代码的模块化。

以下是优化后的代码:

#include <iostream>
using namespace std;const int SIZE = 5; // 定义常量矩阵大小void swapRows(int arr[SIZE][SIZE], int r1, int r2) {for (int i = 0; i < SIZE; i++) {int tmp = arr[r1][i];arr[r1][i] = arr[r2][i];arr[r2][i] = tmp;}
}int main() {int arr[SIZE][SIZE]; // 定义局部变量int r1, r2;// 输入矩阵for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {cin >> arr[i][j];}}// 输入行号并校验cin >> r1 >> r2;if (r1 < 1 || r1 > SIZE || r2 < 1 || r2 > SIZE) {cout << "Invalid row numbers" << endl;return 1; // 错误退出}// 如果两行相同,无需交换if (r1 != r2) {swapRows(arr, r1 - 1, r2 - 1);}// 输出矩阵for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {if (j > 0) cout << " "; // 控制空格输出cout << arr[i][j];}cout << endl;}return 0;
}

在这里插入图片描述

优化点:

  1. 输入校验逻辑确保程序健壮性。
  2. 行交换逻辑封装为独立函数,提高代码复用性。
  3. 使用常量定义矩阵大小,避免硬编码。
  4. 仅使用局部变量,减少全局变量的使用。

💯小结

通过对这道题的详细分析和代码实现的对比,可以看到,每一种实现方式都有其优点与不足。优化后的代码在逻辑清晰性、代码复用性和程序健壮性上得到了显著提升。

二维数组操作是 C++ 学习中的重要部分,理解其核心逻辑并掌握优化技巧,对于提升编程能力至关重要。希望本文能够帮助读者更好地理解和运用这些知识。


在这里插入图片描述


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

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

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

相关文章

Tableau数据可视化与仪表盘搭建-数据连接

目录 连接本地文件 课程操作 连接方式&#xff08;实时/数据提取&#xff09; 保存工作簿 筛选器 数据处理 连接数据有三种类型 第一种&#xff0c;连接到本地文件&#xff0c;例如Excel&#xff0c;csv&#xff0c;JSON等 第二种&#xff0c;连接到数据库&#xff0c;例…

系统日志优化---自定义springboot-starter日志组件供各个服务使用

在优化项目时发现各个微服务都有各自的接口调用日志逻辑&#xff0c;比如每个服务都定义一个aop类拦截&#xff0c;十分冗余&#xff0c;其实是可以做成starter被各个服务引用使用&#xff0c;前提要先了解一下springboot自动装配原理 创建springboot工程&#xff0c;如果是jdk…

Android V QCOM GPS | APN for LocationService

问题 在高通平台上验证 GPS 功能流程时候,block 在 APN 数据库的查询。经查,发现高通有内部实现的 LocationService(aosp源码和mtk都没有的类) 包含查询 TelephonyProvider 数据库的逻辑,直接原因是查询到 APN Protocol 不符合预期,直接fail。 关于 Android APN 数据列的…

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化 1. 输出关键信息的代码示例 日志记录方法 使用以下代码记录连接池的关键信息&#xff0c;帮助分析连接池的状态和性能瓶颈&#xff1a; import org.apache.commons.pool2.impl.GenericO…

小程序开发-页面事件之上拉触底实战案例

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

STM32-笔记38-I2C-oled实验

一、什么是I2C&#xff1f; I2C总线&#xff0c;全称Inter-Integrated Circuit&#xff08;互连集成电路&#xff09;&#xff0c;是一种由Philips&#xff08;现NXP半导体&#xff09;公司在1980年代初开发的同步 串行 半双工通信总线。 二、有了串口通信为什么要使用I2C&…

《C++11》右值引用深度解析:性能优化的秘密武器

C11引入了一个新的概念——右值引用&#xff0c;这是一个相当深奥且重要的概念。为了理解右值引用&#xff0c;我们需要先理解左值和右值的概念&#xff0c;然后再理解左值引用和右值引用。本文将详细解析这些概念&#xff0c;并通过实例进行说明&#xff0c;以揭示右值引用如何…

libevent定时器的性能测试(与rte_timer对比)

前言 接着上篇文章&#xff0c;rte_timer的性能测试https://blog.csdn.net/jacicson1987/article/details/144997298 进行常用的libevent的定时器测试&#xff0c;看看有什么区别&#xff0c;测试方法还是一样&#xff0c;代码放在下面。 测试方法 100万个定时器&#xff0…

C# 事件

目录 1、事件模型的5个组成部分2、使用内置委托类型声明事件2.1 EventHandler2.1.1 &#xff1f;2.1.2 this2.1.3 使用匿名函数和lamda表达式2.1.3.1 匿名函数2.1.3.2 lamda表达式 2.1.4 异常处理 2.2 EventHandler<TEventArgs> 3、使用自定义委托类型声明事件3.1 事件的…

英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望

一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时&#xff0c;核心架构与制程工艺无疑是最为关键的基础要素&#xff0c;它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…

爬虫学习记录

1.概念 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程 通用爬虫:抓取的是一整张页面数据聚焦爬虫:抓取的是页面中的特定局部内容增量式爬虫:监测网站中数据更新的情况,只会抓取网站中最新更新出来的数据 robots.txt协议: 君子协议,网站后面添加robotx.txt…

玩机搞机基本常识-------列举安卓机型一些不常用的adb联机命令

前面分享过很多 常用的adb命令&#xff0c;今天分享一些不经常使用的adb指令。以作备用 1---查看当前手机所有app包名 adb shell pm list package 2--查看当前机型所有apk包安装位置 adb shell pm list package -f 3--- 清除指定应用程序数据【例如清除浏览器应用的数据】 …

【25考研】川大计算机复试情况,重点是啥?怎么准备?

24年进入复试的同学中&#xff0c;有10位同学的复试成绩为0分。具体是个人原因还是校方原因&#xff0c;还尚不明确。但是C哥提醒&#xff0c;一定要认真复习&#xff01;复试完后不要跟任何人讨论有关复试的题目及细节&#xff01; 一、复试内容 四川大学复试内容较多&#xf…

计算机的错误计算(二百零五)

摘要 基于一位读者的问题&#xff0c;提出题目&#xff1a;能用数值计算证明 吗&#xff1f;请选用不同的点&#xff08;即差别大的数&#xff09;与不同的精度。实验表明&#xff0c;大模型理解了题意。但是&#xff0c;其推理能力值得商榷。 例1. 就摘要中问题&#xff0…

回归预测 | MATLAB实GRU多输入单输出回归预测

回归预测 | MATLAB实GRU多输入单输出回归预测 目录 回归预测 | MATLAB实GRU多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实GRU多输入单输出回归预测。使用GRU作为RNN的一种变体来处理时间序列数据。GRU相比传统的RNN有较好的记…

unity学习12:地图相关的一些基础2, 增加layer种草种树

目录 参考学习 1 地图设置 1.1 上次制作的地图&#xff0c;稍微加点地形完善下. 1.2 调整下camera 1.3 摄像机camera的移动速度 1.4 地图属性&#xff0c;terrain settings 1.5 但是&#xff0c;地图看起来像沙漠一样&#xff0c;很单调 2 paint terrain / paint textu…

数据挖掘——数据预处理

数据挖掘——数据预处理 数据预处理数据预处理 ——主要任务数据清洗如何处理丢失的数据如何处理噪声数据如何处理不一致数据 数据集成相关分析相关系数(也成为皮尔逊相关系数)协方差 数据规约降维法&#xff1a;PCA主成分分析降数据——抽样法数据压缩 数据预处理 数据预处理…

Python入门教程 —— 网络编程

1.网络通信概念 简单来说,网络是用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的。 使用网络的目的,就是为了联通多方然后进行通信,即把数据从一方传递给另外一方。 前面的学习编写的程序都是单机的,即不能和其他电脑上的程…

鸿蒙APP之从开发到发布的一点心得

引言&#xff1a; 做鸿蒙开发大概有1年左右时间了&#xff0c;从最开始的看官方文档、看B站视频&#xff0c;到后来成功发布两款个人APP&#xff08;房贷计算极简版、时简时钟 轻喷&#xff0c;谢谢&#xff09;。简单描述一下里边遇到的坑以及一些经历吧。 学习鸿蒙开发 个…

力扣刷题:数组OJ篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 1.消失的数字&#xff08;1&#xff09;题目描…