创建动态二维数组的例子

    科技2022-08-28  91

    要求

    通过键盘输入二维数组的行和列,动态创建二维数组。实现下列函数功能。 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; // to do list } void delete_array2d(unsigned char** array2d, unsigned int row) { for (int i = 0; i < row; i++) { delete[] array2d[i]; } delete[] array2d; // to do list } 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(); } } // to do list } 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; // to do list } void print_array1d(unsigned int* array1d, unsigned int n) { for (int i = 0; i < n; i++) { printf("%u ", array1d[i]); }printf("\n"); // to do list } 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"); } // to do list } 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; //to do list } 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)//problem printf("1 "); else printf("0 "); } printf("\n"); } // to do list } 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]; // to do list } 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);//problem cout << "Sub array" << endl; print_array2d(sub_array_2d, 3, 3);//problem gray_to_binary(sub_array_2d, 3, 3);//problem 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);//problem delete[] hist; cin.get(); return(0); }
    Processed: 0.020, SQL: 9