下面是C/C++語言編寫的程序(在VC 6.0上測試通過),有比較詳細的註釋:
#include <stdio.h>
void main(){
int i,j; /*用於循環變量*/
/*
將下面的屬性保存到二維數組中
序號 屬性1 屬性2 屬性3 屬性4
0 0 0 1
1 0 1 0
0 1 1 1
1 1 0 0
1 0 1 0
*/
int arr[5][4] = {
{0,0,0,1},
{1,0,1,0},
{0,1,1,1},
{1,1,0,0},
{1,0,1,0}
}; /* 5行4列*/
/* 保存屬性對應的 0 與 1 的分類信息 */
/*
-1 是 arrResult 中默認的數字
每行的 0-4位置 用於保存 0 在原始數組的行的位置
每行的 5-9位置 用於保存 1 在原始數組的行的位置
*/
/* 例如:屬性1 */
/* 保存到 arrResult 中之後是: */
/* [ 1 3 -1 -1 -1 2 4 5 -1 -1 ] */
int arrResult[4][10];
/*給數組初始化 */
for ( i = 0; i < 4; i++ ){
for ( j = 0; j < 10; j++ ){
arrResult[i][j]=-1;
}
}
/* 按照列 進行掃描 */
for ( j = 0; j < 4; j++ ){ /* 列循環 */
int zeroIndexInResult = 0;/*每行的 0-4位置 用於保存 0 在原始數組的列的位置*/
int oneIndexInResult = 5;/*每行的 5-9位置 用於保存 1 在原始數組的列的位置*/
for ( i = 0; i < 5; i++ ){ /* 行循環 */
if ( arr[i][j] == 0 ){
arrResult[j][zeroIndexInResult++]=(i+1);
} else {
arrResult[j][oneIndexInResult++]=(i+1);
}
}
}
/*打印出轉換後的屬性*/
for ( i = 0; i < 4; i++ ){
printf( "屬性%d {", (i+1) );
for ( j = 0; j < 10; j++ ){
if ( j < 5 ){ /*值為0的元素*/
if ( arrResult[i][j]==-1 ){ /* 表示已經沒有屬性值為0的元素了*/
j = 4; /* 因為執行continue後,for的位置會對j進行 +1 操作 */
printf( "}; {" );
continue;
}
if ( j == 0 ){
printf( "%d", arrResult[i][j] );
} else {
printf( ",%d", arrResult[i][j] );
}
} else { /*值為1的元素*/
if ( arrResult[i][j]==-1 ){ /* 表示已經沒有屬性值為1的元素了*/
printf( "}\n" );
break;
}
if ( j == 5 ){
printf( "%d", arrResult[i][j] );
} else {
printf( ",%d", arrResult[i][j] );
}
}
}
}
}