要求
通过键盘输入二维数组的行和列,动态创建二维数组。实现下列函数功能。 1)动态创建二维数组。 unsigned char** new_array2d(unsigned int row, unsigned int column); 2)释放二维数组。 void delete_array2d(unsigned char** array2d, unsigned int row); 3)为二维数组随机赋值,每一个元素的值范围为0~255。 void set_array2d(unsigned char** array2d, unsigned int row, unsigned int column); 4)统计数组中的值分别为0255的个数,也就是0255这256个数每一个出现的个数。 unsigned int* histgram(unsigned char** array2d, unsigned int row, unsigned int column);//返回unsigned int[256]数组表示统计结果 5)打印数组。 void print_array1d(unsigned int array[],unsigned int n);//打印一维数组 void print_array2d(unsigned char** array2d, unsigned int row, unsigned int column);//打印二维数组 6)根据给定的数组的左上角坐标、高、宽,取出子数组,如图1所示 unsigned char** get_sub_array(unsigned char** array2d, unsigned int row_index, unsigned int column_index, unsigned int height, unsigned int width); 图1 子数组示意图 7)从所创建的二维数组中,按任意取出3x3的子数组(例如从位置(1,1)取3x3子数组),并将子数组的值转换为0-1值,即大于等于128的为1,小于128为0。 void gray_to_binary(unsigned char** array2d, unsigned int row, unsigned int column); 8)对(7)所获得的3x3的二维数组(如图2所示),设每一个元素按顺时针顺序标注为a0,a1,a2,a3,a4,a5,a6,a7,a8共9个元素。现作如下处理: a)数组四周元素与中间元素作异或运算(两个元素值相同为0,不同为1),即 a0 = a0 ^ a8; a1 = a1 ^ a8;……;a7 = a7 ^ a8;
b)四周元素与中间元素异或运算后,组成下列四种排列 a0,a1,a2,a3,a4,a5,a6,a7 a2,a3,a4,a5,a6,a7,a0,a1 a4,a5,a6,a7,a0,a1,a2,a3 a6,a7,a0,a1,a2,a3,a4,a5 将上面四种排列转换为十进制数,求这个四个十进制数的最小值。 unsigned int find_min_value(unsigned char** array2d);
代码
#include <iostream>
#include <time.h>
#include <algorithm>
using namespace std
;
unsigned char** new_array2d(unsigned int row
, unsigned int column
)
{
unsigned char** p
= new unsigned char* [row
];
for (int i
= 0; i
< column
; i
++) {
p
[i
] = new unsigned char[column
];
}
return p
;
}
void delete_array2d(unsigned char** array2d
, unsigned int row
)
{
for (int i
= 0; i
< row
; i
++) {
delete[] array2d
[i
];
}
delete[] array2d
;
}
void set_array2d(unsigned char** array2d
, unsigned int row
, unsigned int column
)
{
srand((unsigned)time(NULL));
for (int i
= 0; i
< row
; i
++) {
for (int j
= 0; j
< column
; j
++) {
array2d
[i
][j
] = rand();
}
}
}
unsigned int* histgram(unsigned char** array2d
, unsigned int row
, unsigned int column
)
{
unsigned int* cb
= new unsigned int [300];
memset(cb
, 0, sizeof(unsigned int) * 256);
for (int i
= 0; i
< row
; i
++) {
for (int j
= 0; j
< column
; j
++) {
if (array2d
[i
][j
] >= 0 && array2d
[i
][j
] <= 255) {
cb
[array2d
[i
][j
]] ++;
}
}
}
return cb
;
}
void print_array1d(unsigned int* array1d
, unsigned int n
)
{
for (int i
= 0; i
< n
; i
++) {
printf("%u ", array1d
[i
]);
}printf("\n");
}
void print_array2d(unsigned char** array2d
, unsigned int row
, unsigned int column
)
{
for (int i
= 0; i
< row
; i
++) {
for (int j
= 0; j
< column
; j
++) {
printf("%u ", array2d
[i
][j
]);
}
printf("\n");
}
}
unsigned char** get_sub_array(unsigned char** array2d
, unsigned int row_index
, unsigned int column_index
, unsigned int height
, unsigned int width
)
{
unsigned char** cb
= new unsigned char* [30];
int ii
= 0, jj
= 0;
for (int i
= row_index
; i
< row_index
+ height
; i
++, ii
++) {
cb
[ii
] = new unsigned char[30];
for (int j
= column_index
; j
< column_index
+ width
; j
++, jj
++) {
printf("%u ", array2d
[i
][j
]);
cb
[ii
][jj
] = array2d
[i
][j
];
}
printf("\n");
}
return cb
;
}
void gray_to_binary(unsigned char** array2d
, unsigned int row
, unsigned int column
)
{
for (int i
= 0; i
< row
; i
++) {
for (int j
= 0; j
< column
; j
++) {
if (array2d
[i
][j
] >= 128)
printf("1 ");
else
printf("0 ");
}
printf("\n");
}
}
unsigned int find_min_value(unsigned char** array2d
)
{
unsigned int ans2
[4];
unsigned int cb
[3][3];
unsigned int cNum
[9];
unsigned int ans
[4];
memset(ans2
, 0, sizeof(ans2
));
for (int i
= 0; i
< 3; i
++) {
for (int j
= 0; j
< 3; j
++) {
cb
[i
][j
] = array2d
[i
][j
];
}
}
for (int i
= 0; i
< 3; i
++) {
for (int j
= 0; j
< 3; j
++) {
if (array2d
[i
][j
] >= 128)
cb
[i
][j
] = 1;
else
cb
[i
][j
] = 0;
}
}
for (int i
= 0; i
< 3; i
++) {
cNum
[i
] = cb
[0][i
];
}
cNum
[3] = cb
[1][2];
cNum
[4] = cb
[2][2];
cNum
[5] = cb
[2][1];
cNum
[6] = cb
[2][0];
cNum
[7] = cb
[1][0];
cNum
[8] = cb
[1][1];
for (int i
= 0; i
< 9; i
++) {
cNum
[i
] ^= cNum
[8];
}
ans
[0] = cNum
[0];
for (int i
= 1; i
< 8; i
++) {
ans
[0] = (ans
[0] * 10) + cNum
[i
];
}
ans
[1] = cNum
[2];
for (int i
= 3; i
< 8; i
++) {
ans
[1] = ans
[1] * 10 + cNum
[i
];
}
ans
[1] = cNum
[1] * 10 + cNum
[1];
ans
[2] = cNum
[4];
for (int i
= 5; i
< 8; i
++) {
ans
[2] = ans
[2] * 10 + cNum
[i
];
}
for (int i
= 0; i
< 4; i
++) {
ans
[2] = ans
[2] * 10 + cNum
[i
];
}
ans
[3] = cNum
[6] * 10 + cNum
[7];
for (int i
= 0; i
< 6; i
++) {
ans
[3] = ans
[3] * 10 + cNum
[i
];
}
for (int i
= 0; i
< 8; i
++) {
int kk
= ans
[0] % 10;
ans
[0] /= 10;
ans2
[0] = kk
+ ans2
[0] * 2;
}
for (int i
= 0; i
< 8; i
++) {
int kk
= ans
[1] % 10;
ans
[1] /= 10;
ans2
[1] = kk
+ ans2
[1] * 2;
}
for (int i
= 0; i
< 8; i
++) {
int kk
= ans
[2] % 10;
ans
[2] /= 10;
ans2
[2] = kk
+ ans2
[2] * 2;
}
for (int i
= 0; i
< 8; i
++) {
int kk
= ans
[3] % 10;
ans
[3] /= 10;
ans2
[3] = kk
+ ans2
[3] * 2;
}
sort(ans2
, ans2
+ 4);
return ans2
[0];
}
int main()
{
unsigned int row
= 0;
unsigned int column
= 0;
cin
>> row
>> column
;
unsigned char** array2d
= new_array2d(row
, column
);
set_array2d(array2d
, row
, column
);
cout
<< "Oringin array" << endl
;
print_array2d(array2d
, row
, column
);
unsigned int* hist
= histgram(array2d
, row
, column
);
cout
<< "Histgram" << endl
;
print_array1d(hist
, 256);
unsigned char** sub_array_2d
= get_sub_array(array2d
, 1, 1, 3, 3);
cout
<< "Sub array" << endl
;
print_array2d(sub_array_2d
, 3, 3);
gray_to_binary(sub_array_2d
, 3, 3);
cout
<< "Binary sub array" << endl
;
print_array2d(sub_array_2d
, 3, 3);
unsigned int min_value
= find_min_value(sub_array_2d
);
cout
<< "The min value is " << min_value
<< endl
;
cout
<< "Now free memeory" << endl
;
delete_array2d(array2d
, row
);
delete_array2d(sub_array_2d
, 3);
delete[] hist
;
cin
.get();
return(0);
}