创建动态二维数组的例子

这篇博客详细介绍了如何使用C++编写一系列二维数组操作函数,包括动态创建、释放、随机赋值、统计值分布、打印、获取子数组、灰度转二值以及寻找3x3子数组的最小值。示例代码展示了如何应用这些函数,并在最后给出了一个完整的程序实例,演示了整个流程。
摘要由CSDN通过智能技术生成

要求

通过键盘输入二维数组的行和列,动态创建二维数组。实现下列函数功能。
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 子数组示意图
图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);
}



  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值