C++输出螺旋数组

2023-11-03


作业题目:
输出以下内容(5X5的螺旋数组):
 1     2     3     4    5
16   17   18   19   6
15   24   25   20   7
14   23   22   21   8
13   12   11   10   9

思路:

  1. 使用二维数组,为使其不局限于5X5,二维数组是一个动态的二维数组,两个下标分别为x、y,数组 arr[x][y]。
  2. 使用for循环,循环初始值temp为1,结束条件为temp小于数组两个下标相乘得到的积,缺省循环后置表达式,for循环内还有4个for循环
  3. 循环开始:如下图:
    在这里插入图片描述
    第一圈:从第一排第一个开始
    3.1 第一个循环:数组从左到右赋值
    3.2 第二个循环:数组从上到下赋值
    3.3 第三个循环:数组从右到左赋值
    3.4 第四个循环:数组从下到上赋值,
    第一次,循环结束。
    第二圈:数组下标进行自增,定位到第二排第二个,再执行上面的循环。
    第三圈:数组下标进行自增,定位到第三排第三个,再执行上面的循环
    ……
    循环结束。

4.使用两个循环,输出数组。
5. 删除动态数组

具体实现代码如下:

1、建立二维数组

在这里插入图片描述

2、声明变量

在这里插入图片描述

3、循环开始:

以下解说以 5 X 5 为例:

3.1 第一个循环:数组从左到右赋值

K = 25,temp = 1
第一圈:arr[0][0] = 1  , arr[0][1] = 2 , arr[0][2] = 3,arr[0][3] = 4
第二圈:arr[1][1] = 17, arr[1][2] = 18
在这里插入图片描述

3.2 第二个循环:数组从上到下赋值

第一圈:arr[0][4] = 5 , arr[1][4] = 6 , arr[2][4] = 7,arr[3][4] = 8
第二圈:arr[1][3] = 19,arr[2][3] = 20
在这里插入图片描述

3.3 第三个循环:数组从右到左赋值

第一圈:arr[4][4] = 9 , arr[4][3] = 10 , arr[4][2] = 11,arr[4][1] = 12
第二圈:arr[3][3] = 21,arr[3][2] = 22
在这里插入图片描述

3.4 第四个循环:数组从下到上赋值

第一圈:arr[4][0] = 13, arr[3][0] = 14, arr[2][0] = 15,arr[1][0] = 16
第二圈:arr[3][1] = 23, arr[2][1] = 24
在这里插入图片描述
此时(自增前):
第一圈:x = 0, y = 0, a = 0, b = 0, num = 0,temp = 17
第二圈:x = 1, y = 1, a = 1, b = 1, num = 1,temp = 25

3.5 自增,数组下标重新定位,圈数自增

此时(自增后)
第一圈:x = 1, y = 1, a = 1, b = 1, num = 1
第一圈:x = 1, y = 1, a = 1, b = 1, num = 1
在这里插入图片描述

3.6 补充

arr[2][2] = 25
在这里插入图片描述

4、输出

在这里插入图片描述

5、删除二维数组,释放内存

在这里插入图片描述

输出结果: 5 X 5

在这里插入图片描述

带下标的输出:

在这里插入图片描述

输出结果: 11 X 7

在这里插入图片描述

对于上面的for循环内的4个for循环里的if判断的补充说明:
在某些情况下,基于4个for循环,会导致部分已经被赋值过的数组再次被赋值,原本的会被覆盖掉,
加上if判断后,可以避免这种情况的发生。

如下图,是不加if判断的运行结果,请参照对比上面相同位置的 11 X 7:

在这里插入图片描述

感谢您的浏览。

#include<iostream>
using namespace std;
void main()
{
	//二维数组
	int **arr = NULL;
	int m, n;
	cout << "想要几乘几的方阵,请输入两个整数: ";
	cin >> n >> m;
	arr = new int*[m];
	for (int i = 0; i < m; i++)
	{ 
		arr[i] = new int[n]; 
	}

	// x,y 数组下标   a:记录行   b:记录列
	int x = 0, y = 0, a = 0, b = 0;
	int num = 0;//循环圈数
	int k = m*n;//输出的最后一个数
	int temp = 1;//给数组赋的值

	//循环开始
	for (; temp < k; )
	{
		//第 a 行 第 b 到 n-1 列  -> 从左到右
		for (y = b; y < n - 1 - num; y++)
		{
			if (arr[x][y] < 0) 
			{
				arr[x][y] = temp;
				temp++;
			}
			//	cout << "arr[" << x << "][" << y << "] = " << arr[x][y] << "\n";
		}
		
		//第 a - c 行 第 d 列  \|/ 从上到下
		for (x = a; x < m - 1 - num; x++)
		{
			if (arr[x][y] < 0) 
			{
				arr[x][y] = temp;
				temp++;
			}
			//	cout << "arr[" << x << "][" << y << "] = " << arr[x][y] << "\n";
		}
		
		//第 c 行 第 d - b  列  <- 从右到左
		for (y = n - 1 - num; y > b; y--)
		{
			if (arr[x][y] < 0) 
			{
				arr[x][y] = temp;
				temp++;
			}
			
		//第 c -a 行 第 b 列   /|\  / 从下到上
		for (x = m - 1 - num; x > a; x--)
		{
			if (arr[x][y] < 0) 
			{
				arr[x][y] = temp;
				temp++;
			}
			//	cout << "arr[" << x << "][" << y << "] = " << arr[x][y] << "\n";
		}
		
		//自增 改变操作行和列
		x++;
		y++;
		a++;
		b++;
		num++;		
		/*
		  cout << a << "\t" 
			   << b << "\t" 
			   << x << "\t" 
			   << y << "\t" 
			   << num << "\t" 
			   << temp << "\n";
		*/
	}

	//补充,数组两个下标相等,且都为奇数的情况下,
	//位于数组最中间的那个位置的数(最后一个数),
	//循环不到,在此作补充
	if (temp == k)
	{
		if (arr[x][y] <= 0)
		{
			arr[x][y] = temp;
		}
	}

	//输出
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << arr[i][j] << '\t';
			//cout << "arr[" << i << "][" << j << "] = " << arr[i][j] <<"\t";
		}
		cout << endl;
	}

	//删除数组
	for (int i = 0; i < m; i++) 
	{
		delete[] arr[i]; 
	}
	delete arr;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++输出螺旋数组 的相关文章

随机推荐

  • 思考::战略藐视:RTOS 高级多任务调度器 (***)

    战略藐视 RTOS 高级任务调度器 压力大 将 RTOS 视为操作系统 则似乎有很大的学习心里压力 复杂 耗时 有难度 减压 将它们视为是 某种 高级多任务调度器 来学习 就好了 这样似乎就简单了 心里压力也就小了 或者 将它们视为是 某种
  • 基于Python生成Markdown的标题序号

    import sys import os import time import re headline title sign list 用于判断标题产生环境 titles added number 保存嵌入了编号的标题 用于产生新编号 is
  • Java的内部类

    学习笔记 内部类 内部类访问特点 1 内部类可以直接访问外部类中的成员 2 外部类要访问内部类 必须建立内部类的对象 一般用于类的设计 分析事物时 发现该事物描述中还有事物 而且这个事物还在访问被描述事物的内容 这时就是 还有的事物 定义成
  • iOS进阶_多线程(二.线程间的状态)

    ViewController m 004 NSThread状态 Created by mac on 2018 4 27 Copyright 2018年 mac All rights reserved import ViewControlle
  • TencentOS-tiny 时间管理(十 六)- 时间片轮转机制

    一 时间管理 时间片轮转机制 概述 TencentOS tiny操作系统内核是一个抢占式内核 抢占式内核的特点是 如果最高优先级的任务不放弃CPU 调用tos task delay tos task yeild等主动放权 或者任务间同步通信
  • 深度学习:不平衡的二分类,precise与recall

    在不平衡的二分类问题中 一般数量较少的样本标签为1 precise 预测为正样本中真实为正样本的比例 recall 真实为正样本中预测为正样本的比例 f1 score precise与recall的调和平均 两者中较小值的起决定性作用
  • 配置防火墙,开启80端口、3306端口 & iptables 使用详解

    1 配置防火墙 开启80端口 3306端口 vi etc sysconfig iptables A INPUT m state state NEW m tcp p tcp dport 80 j ACCEPT 允许80端口通过防火墙 A IN
  • GIT常用命令大全——赶紧收藏

    史上最全的GIT常用命令都在这里啦 全是干货 建议收藏起来 反复观看 一 git安装后 指定名称和邮箱 git config global user name Your Name git config global user email e
  • Linux cache介绍及控制

    有关Cache 文件缓存是提升性能的重要手段 毋庸置疑 读缓存 Read caching 在绝大多数情况下是有益无害的 程序可以直接从RAM中读取数据 而写缓存 Write caching 则相对复杂 Linux内核将写磁盘的操作分解成了
  • salt 服务器信息收集,使用saltstack自定义模块获取服务器的信息

    1 查看MASTER的BASE路径 在对应的路径建立 modules文件夹 存放 py的模块 root v72 modules cat etc salt master grep file roots A 5 file roots base
  • c语言 学生成绩信息综合管理系统(包含文件写入读出,链表,冒泡排序....)

    include
  • Kendo UI开发教程(27): 移动应用开发简介

    Kendo UI 支持开发Web应用 前面介绍的SPA 也支持开发移动应用 至于使用 HTML5 JavaScript CSS开发移动是不是一个好的选择不在本文的讨论之中 Kendo UI Mobile提供了一种快速开发跨手机平台的方法 K
  • linux dev/zero,/dev/zero是什么意思

    hsvea 于 2009 10 16 10 35 03发表 dev zero 是一个输入设备 你可你用它来初始化文件 dev zero 该设备无穷尽地提供0 可以使用任何你需要的数目 设备提供的要多的多 他可以用于向设备或文件写入字符串0
  • Pycharm 安装第三方库报错及解决方案——no such option: --build-dir

    Pycharm 安装第三方库报错及解决方案 no such option build dir Pycharm 安装第三方库报错及解决方案 no such option build dir 最近在学习路径规划相关内容 在运行GitHub上下载
  • 数据结构知识整理

    基于严蔚敏及吴伟民编著的清华大学C语言版教材并结合网上相关资料整理 http www docin com p 2027739005 html 第一章 绪论 1 数据结构 是一门研究非数值计算的程序设计问题中计算机的操作对象以及他们之间的关系
  • varifocal loss(VFL)介绍

    文章目录 一 论文链接 二 公式理解 代码 一 论文链接 https arxiv org pdf 2008 13367 pdf 二 公式理解 简单说明下 这里的IACS是IoU aware classification score的缩写 V
  • spring校验注解@valid和@validated重点获取校验消息

    spring校验注解 valid和 validated重点获取校验消息 valid作用范围类 方法参数 成员变量 可以用来做嵌套校验 validated作用范围类 方法参数 不可以用来做嵌套校验 可以分组 valid不可以分组 可以做一个全
  • STM32 us精确延时方式

    STM32精确延时方式 使用TIM定时器方式延时 使用空代码方式延时 F103系列 F429系列 本文纯属记录自己学习历程 如有不妥之处 欢迎指正 使用TIM定时器方式延时 使用STM32CubeMX配制TIM1定时 如下图所示 自动重装载
  • Flutter 修改appBar 高度

    Scaffold appBar PreferredSize child AppBar title Text AppBar bottom appBarView preferredSize Size fromHeight 60 0 自定义高度
  • C++输出螺旋数组

    C 输出螺旋数组 思路 具体实现代码如下 1 建立二维数组 2 声明变量 3 循环开始 3 1 第一个循环 数组从左到右赋值 3 2 第二个循环 数组从上到下赋值 3 3 第三个循环 数组从右到左赋值 3 4 第四个循环 数组从下到上赋值