二维数组或三维数组转为一维数组

1.二维数组转换为一维数组:

设二维数组a[i][j],数组a行数x行,列数y列;
一维数组b[n],数组b最多存储m=x*y个元素。
令x=3,y=4则:m=12
此时,数组a中元素的位置序号(i j)为:
00  01  02  03
10  11  12  13
20  21  22  23
数组b中元素的位置序号(n)为:
0   1   2   3
4   5   6   7
8   9   10  11
数组a中每一行位置j的序号均为:0    1   2   3
因此,数组b中元素的位置序号可写成:
0+0        1+0        2+0        3+0
4+0        4+1        4+2        4+3
8+0        8+1        8+2        8+3
数组a中每列位置i的序号均为:0   1   2
因此,数组b中元素的位置序号可写成:
0*4+0      0*4+1      0*4+2      0*4+3
1*4+0      1*4+1      1*4+2      1*4+3
2*4+0      2*4+1      2*4+2      2*4+3
由上述数组b中元素的位置序号可得:
n=i*y+j,其中y为数组a的列数,此例中y=4。
综上所述,经猜想与反复验证数组a中元素的位置序号(i j)与
数组b中元素的位置序号(n)的关系为;n=i*y+j(y为数组a的列数)

代码如下:

#include<stdio.h>
#define x 3//宏定义数组每列存储元素的最多个数
#define y 4//宏定义数组每行存储元素的最多个数
void main()
{int a[x][y],b[100],i,j,n,m;printf("enter %d elements:\n",x*y);for(i=0;i<x;i++){for(j=0;j<y;j++){scanf("%d",&a[i][j]);//输入二维数组存储元素}}printf("The 2D array is:\n");for(i=0;i<x;i++){for(j=0;j<y;j++){printf("a[%d][%d]=%d  ",i,j,a[i][j]);//输出二维数组存储元素}printf("\n");//以每行y个元素的格式输出}for(i=0;i<x;i++){for(j=0;j<y;j++){b[j+i*y]=a[i][j];//二维数组转一维数组}}printf("The 1D array is:\n");for(n=0,m=1;n<x*y;n++,m++){printf("b[%d]=%d  ",n,b[n]);//输出一维数组存储元素if(m%3==0){printf("\n");//以每行3个元素的格式输出}}
}

运行结果如下:

2.三维数组转换为一维数组:

设三维数组a[i][j][k],数组a中x轴方向最多有x个元素,
y轴方向最多有y个元素,z轴方向最多有z个元素。
一维数组b[n],数组b最多存储m=x*y*z个元素。
令x=3,y=2,z=2则:m=12
此时,数组a中元素的位置序号(i j k)为:
000   001   002
010   011   012
100   101   102
110   111   112
数组b中元素的位置序号(n)为:
0   1   2
3   4   5
6   7   8
9   10  11
因猜想过程难以描述,所以此处省略猜想过程。
数组b中元素的位置序号(n)最终可写成:
3*(2*0+0)+0   3*(2*0+0)+1   3*(2*0+0)+2
3*(2*0+1)+0   3*(2*0+1)+1   3*(2*0+1)+2
3*(2*1+0)+0   3*(2*1+0)+1   3*(2*1+0)+2
3*(2*1+1)+0   3*(2*1+1)+1   3*(2*1+1)+2
由上述数组b中元素的位置序号可得:
n=x(y*i+j)+k,其中x为数组a在x轴方向存储元素的最多个数,
y为数组a在y轴方向存储元素的最多个数,此例中x=3,y=2。
综上所述,经猜想与反复验证数组a中元素的位置序号(i j k)与
数组b中元素的位置序号(n)的关系为;
n=x(y*i+j)+k(x为数组a在x轴方向存储元素的最多个数,
y为数组a在y轴方向存储元素的最多个数)

代码如下:

#include<stdio.h>
#define z 2//宏定义数组在z轴方向存储元素的最多个数
#define y 2//宏定义数组在y轴方向存储元素的最多个数
#define x 3//宏定义数组在x轴方向存储元素的最多个数
void main()
{int a[z][y][x],b[100],i,j,k,m,n;printf("enter %d elements:\n",z*y*x);for(i=0;i<z;i++){for(j=0;j<y;j++){for(k=0;k<x;k++){scanf("%d",&a[i][j][k]);//输入三维数组存储元素}}}printf("The 3D array is:\n");for(i=0;i<z;i++){for(j=0;j<y;j++){for(k=0;k<x;k++){printf("a[%d][%d][%d]=%d  ",i,j,k,a[i][j][k]);//输出三维数组存储元素}printf("\n");//以每行x个元素的格式输出}}for(i=0;i<z;i++){for(j=0;j<y;j++){for(k=0;k<x;k++){b[x*y*i+x*j+k]=a[i][j][k];//三维数组转一维数组}}}printf("The 1D array is:\n");for(n=0,m=1;n<x*y*z;n++,m++){printf("b[%d]=%d  ",n,b[n]);//输出一维数组存储元素if(m%3==0){printf("\n");//以每行3个元素的格式输出}}
}

运行结果如下:

二维数组或三维数组转换为一维数组相关推荐

  1. CDQ分治(二维CDQ 、三维CDQ+树状数组、四维CDQ+CDQ+树状数组)

    CDQ分治 CDQ分治相较于普通分治,多了左区间处理后对于右区间的影响. 利用这一点,CDQ分治可以用来做很多数据结构的题目(树状数组.线段树),加一个log的时间复杂度来优化一维. 操作: 假设有两 ...

  2. 创建二维数组(一维长度3,二维长度6),值为一维数组和二维数组索引值的积

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  3. python 将三维数据转为二维_将三维切片转换为二维图像

    有没有一种方法使用vtk从一个剖切面(可以是倾斜的)的3D坐标和相关数据中获得2D图像吗?在 以下是我读取结构化网格并设置剖切面的代码片段:self._reader = vtk.vtkXMLStruc ...

  4. php把二维数组变为一维,如何将PHP二维数组转换为一维数组

    如何将PHP二维数组转换为一维数组 发布时间:2020-07-22 11:12:05 来源:亿速云 阅读:137 作者:Leah 如何将PHP二维数组转换为一维数组?相信很多没有经验的人对此束手无策, ...

  5. php 二维数组变一维数组,PHP二维数组如何转换为一维数组

    PHP二维数组转换为一维数组的方法:1.使用"array_column($array, column_key,index_key);"方法实现转换:2.通过"array_ ...

  6. android 一维数组遍历,$.each()循环遍历一维数组、二维数组、JSON数据和DOM元素

    本文介绍$.each()循环遍历一维数组.二维数组.JSON数据和DOM元素. 请注意在使用JQuery $.each()方法前,要首先引用jquery库文件. $.each()循环遍历一维数组 Jq ...

  7. JAVA中一维数组的作用,JAVA中一维数组和二维数组的定义

    在java中数组被看成是一个对象 在定义数组时,有两种定义方法:int[] a 和int a[]:第二种是C/C++对数组定义方式,对于JAVA建议采用第一种定义方式. 总的原则:任何对象在被调用之前 ...

  8. 《c primer pius》第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的

    <c primer pius>第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处 ...

  9. 用STM32实现:摄像头扫到二维码后提取二维码中的信息分别放到数组中

    摄像头扫到二维码后提取二维码中的信息分别放到数组中 把想要的信息编辑好放到二维码中(网上有好多在线生成二维码的工具) /** *作者:魏波 *时间:2017.6.6 * **/char name[6] ...

最新文章

  1. 解决Mac安装tesserocr报错问题 Failed building wheel for
  2. odoo开发笔记 -- 异常、错误、警告、提示、确认信息显示
  3. 网易考拉没有了,网易严选还会远吗?
  4. 构建高性能.NET应用之配置高可用IIS服务器-第二篇 IIS请求处理模型
  5. linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...
  6. 用C#编写一个抓网页的应用程序
  7. 【转】Asp.Net MVC详解Controller之Filter
  8. azure云数据库_Azure SQL数据库的性能调优
  9. html取php值,使用PHP从HTML中提取值
  10. ELK详解(十五)——ELK+Redis配置实战
  11. MQTT协议学习笔记
  12. Hyper-V上Linux的鼠标驱动
  13. 五种常见的linux系统有哪些,常见的Linux操作系统有哪些
  14. 关于时间轴发展历程等PPT模板展现方式的探讨
  15. mame android版本,重整街机模拟器MAME(Android版)
  16. R-residuals plots
  17. 邮储银行计算机岗位笔试题,中国邮政储蓄银行各类岗位笔试经验汇总
  18. 一位资深开发的个人经历 【转自百度贴吧 java吧 原标题 4年java 3年产品 现在又开始做android了】...
  19. arm方案商,三星S5P6818开发板ARM Cortex-A53架构
  20. Chrome的在线自动字幕辅助工具

热门文章

  1. Android自定义控件(UI,点击事件)
  2. 复印件泄密及防范措施
  3. Correlate-and-Excite: Real-Time Stereo Matching viaGuided Cost Volume Excitation(CoEx)(一)论文翻译
  4. Mysql实现行列转换
  5. 适合做读书笔记的工具 这款APP满足你的笔记需求
  6. 工程管理系统源码企业工程项目管理系统简介
  7. hive报错:running beyond physical memory limits. Current usage: 2.0 GB of 2 GB physica终极解决方式
  8. 实战分布式之电商高并发秒杀场景总览
  9. NOIP2002普及组第一题【级数求和】题解 (普及山东tyd)
  10. 各类船舶作业注意事项(昼夜计划表)