一維陣列轉二維陣列
阿新 • • 發佈:2019-01-04
假設你一維陣列的大小為100
你需要把它拆分為20*5的一個二維矩陣。
不妨這樣去實現:
假設一維陣列的下標為X,可以把它在邏輯上轉換為二維陣列的下標:
m = X / 5
n = X % 5
比如你要找第一行第二列的元素,那在一維陣列中就是a[1]
轉化為二維座標就是b[0][1]。
其實多維陣列和一維陣列一樣,在計算機中都是用的一段連續的記憶體。只是他們的表現形式不一樣。
另外,C裡邊沒有動態的二維陣列,第二維的大小必須指定的。
引用這個二維矩陣的時候,直接使用B[3][4]來引用第三行第四列的元素?
用巨集定義(以下巨集定義並沒有上機除錯,只是提供思路)
#define B[(x)][(y)] A[((x*m)+(y%n)]
但程式碼一有個缺點,那就是如果有多個最值,只能輸出最後一個。下面的程式碼是經過改進的。 程式碼二:
你需要把它拆分為20*5的一個二維矩陣。
不妨這樣去實現:
假設一維陣列的下標為X,可以把它在邏輯上轉換為二維陣列的下標:
m = X / 5
n = X % 5
比如你要找第一行第二列的元素,那在一維陣列中就是a[1]
轉化為二維座標就是b[0][1]。
其實多維陣列和一維陣列一樣,在計算機中都是用的一段連續的記憶體。只是他們的表現形式不一樣。
另外,C裡邊沒有動態的二維陣列,第二維的大小必須指定的。
引用這個二維矩陣的時候,直接使用B[3][4]來引用第三行第四列的元素?
用巨集定義(以下巨集定義並沒有上機除錯,只是提供思路)
#define B[(x)][(y)] A[((x*m)+(y%n)]
解釋一下:x*m,加入你需要B[3][4],那麼就是對應一維陣列第3*8+4%9=28個元素。
程式碼一:#include<stdio.h>
<span style="white-space:pre"> </span>int MAX,MIN;
<span style="white-space:pre"> </span>int maxi,maxj,mini,minj;
void main()
{ <span style="white-space:pre"> </span>void result(int x[][5],int m,int n);
<span style="white-space:pre"> </span>int a[5][5],max,min,i,j;
<span style="white-space:pre"> </span> for(i=0;i<5;i++)
<span style="white-space:pre"> </span>for(j=0;j<5;j++)
<span style="white-space:pre"> </span>scanf("%d",&a[i][j]);
<span style="white-space:pre"> </span>MAX=MIN=a[0][0];
<span style="white-space:pre"> </span>maxi=maxj=mini=minj=0;
<span style="white-space:pre"> </span> result(a,5,5);
<span style="white-space:pre"> </span>printf("MAX=%d,maxi=%d,maxj=%d\n",MAX,maxi,maxj);
<span style="white-space:pre"> </span>printf("MIN=%d,mini=%d,minj=%d\n",MIN,mini,minj);
}
</pre><pre name="code" class="cpp">void result(int x[][5],int m,int n)
{ <span style="white-space:pre"> </span>int i,j;
<span style="white-space:pre"> </span> for(i=0;i<m;i++)
<span style="white-space:pre"> </span>for(j=0;j<n;j++)
<span style="white-space:pre"> </span>{ if(x[i][j]>MAX)
<span style="white-space:pre"> </span>{ MAX=x[i][j];
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span> maxi=i;
<span style="white-space:pre"> </span> maxj=j;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span> if(x[i][j]<MIN)
<span style="white-space:pre"> </span>{ MIN=x[i][j];
<span style="white-space:pre"> </span> mini=i;
minj=j;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>}
}
但程式碼一有個缺點,那就是如果有多個最值,只能輸出最後一個。下面的程式碼是經過改進的。 程式碼二:
#include<stdio.h>
<span style="white-space:pre"> </span>int MAX,MIN;
<span style="white-space:pre"> </span>int maxi,maxj,mini,minj;
void main()
{ <span style="white-space:pre"> </span>void result(int x[][5],int m,int n);
<span style="white-space:pre"> </span>int a[5][5],max,min,i,j;
<span style="white-space:pre"> </span>for(i=0;i<5;i++) <span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>for(j=0;j<5;j++)
<span style="white-space:pre"> </span>scanf("%d",&a[i][j]);
<span style="white-space:pre"> </span>MAX=MIN=a[0][0];
<span style="white-space:pre"> </span>maxi=maxj=mini=minj=0;
<span style="white-space:pre"> </span>result(a,5,5);
}
void result(int x[][5],int m,int n)
{ <span style="white-space:pre"> </span>int i,j;
<span style="white-space:pre"> </span>for(i=0;i<m;i++)
<span style="white-space:pre"> </span>for(j=0;j<n;j++)
<span style="white-space:pre"> </span>{ if(x[i][j]>MAX)
<span style="white-space:pre"> </span> MAX=x[i][j];
if(x[i][j]<MIN)
<span style="white-space:pre"> </span>MIN=x[i][j];
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>for(i=0;i<m;i++)
<span style="white-space:pre"> </span>for(j=0;j<n;j++)
<span style="white-space:pre"> </span> { if(x[i][j]==MAX)
<span style="white-space:pre"> </span>{ MAX=x[i][j];
<span style="white-space:pre"> </span>maxi=i;
<span style="white-space:pre"> </span>maxj=j;
<span style="white-space:pre"> </span>printf("MAX=%d,maxi=%d,maxj=%d\n",MAX,maxi,maxj);
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> if(x[i][j]==MIN)
<span style="white-space:pre"> </span>{ MIN=x[i][j];
<span style="white-space:pre"> </span> mini=i;
<span style="white-space:pre"> </span> minj=j;
<span style="white-space:pre"> </span> printf("MIN=%d,mini=%d,minj=%d\n",MIN,mini,minj);
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>}
}