1. 程式人生 > >一維陣列轉二維陣列

一維陣列轉二維陣列

假設你一維陣列的大小為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)]

解釋一下: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>} 
}