(二)C++基础 动态内存

一、目的和要求

1.熟练掌握数组的使用方法
2.掌握指针的使用方法
1.熟练掌握动态内存分配与释放
2.掌握基本算法的实现

二、具体内容

1.给定一个整数数组,找出两个元素的和等于给定值的数对,并统计符合条件的数对的个数,如果没有满足条件的数对,返回0。
例如给定数组[1, 5, 7, 5, 8, 9, 11, 12],给定数值12,那么,满足条件的数对共有3对,分别是(1,11),(5,7),(7,5)。

#include <iostream>
using namespace std;

void print_array(int array[], int n) {
	for (int i = 0; i < n; i++) {
		cout << array[i] << " ";
	}
}

int find_pairs(int array[], int n, int sum) {
	int count = 0;
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (array[i] + array[j] == 12) {
				count++;
			}
		}
	}
	return count;
}

int main() {
	int array[] = { 1,5,7,5,8,9,11,12 };
	int n = sizeof array / sizeof array[0];
	int sum = 12;
	cout << "Original array: ";
	print_array(array, n);
	cout << "\nNumber of pairs whose sum equal to " << sum << " is ";
	cout << find_pairs(array, n, sum) << endl;
	cin.get();
	return 0;
}

运行结果:
在这里插入图片描述

2.通过键盘输入二维数组的行和列,动态创建二维数组。实现下列函数功能。

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)统计数组中的值分别为0~255的个数,也就是0~255这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 <string>
using namespace std;
unsigned char** new_array2d(unsigned int row, unsigned int column)//动态创建二维数组
{
	unsigned char **array2d = new unsigned char*[row];
	for (int i = 0; i < row; i++) {
		array2d[i] = new unsigned char[column];
	}
	return array2d;
}

void delete_array2d(unsigned char** array2d, unsigned int row)//释放二维数组
{
	delete[]array2d;
}

void set_array2d(unsigned char** array2d, unsigned int row, unsigned int column)//为二维数组随机赋值,每一个元素的值范围为0~255
{
	srand((unsigned int)time(NULL));
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < column; j++)
			array2d[i][j] = rand() % 255;
	}
}

unsigned int* histgram(unsigned char** array2d, unsigned int row, unsigned int column)//返回unsigned int[256]数组表示统计结果
{
	unsigned int *count = new unsigned int[256];
	for (int i = 0; i < 256; i++){
count[i] = 0;
}
	for (int i = 0; i < row; i++){
           for (int j = 0; j < column; j++){
                    count[array2d[i][j]] += 1;
}
}	
	return count;
}

void print_array1d(unsigned int* array1d, unsigned int n)//打印一维数组
{
	for (int i = 0; i < n; i++){
           cout << array1d[i] << " ";
}
	cout << endl;
}


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++) {
			cout << array2d[i][j] << " ";
		}
		cout << endl;
	}
}

unsigned char** get_sub_array(unsigned char** array2d, unsigned int row_index, unsigned int column_index, unsigned int height, unsigned int width)
{   //根据给定的数组的左上角坐标、高、宽,取出子数组
int row = 0, column = 0;
	unsigned char **array = new_array2d(height, width);
		for (int i = row_index; i < row_index + width; i++) {
		for (int j = column_index; j < column_index + height; j++) {
			array[row][column] = array2d[i][j];
			column++;
			if (column == width) {
				column = 0;
				row++;
			}
		}
	}
	return array;
}

void gray_to_binary(unsigned char** array2d, unsigned int row, unsigned int column)//按任意取出3x3的子数组,大于等于128的为1,小于128为0
{
	srand((unsigned int)time(NULL));
	int row_index = rand() % ((int)row - 4);
	int column_index = rand() % ((int)column - 4);
	for (int i = row_index; i < row_index + 3; i++) {
		for (int j = column_index; j < column_index + 3; j++) {
			if (array2d[i][j] < 128)
				array2d[i][j] = 0;
			else array2d[i][j] = 1;
		}
	}
}
unsigned int find_min_value(unsigned char** array2d)//四种排列转换为十进制数,求这个四个十进制数的最小值
{
	char n[8];
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++) {
			if (i == 1 && j == 1) continue;
			array2d[i][j] = array2d[i][j] ^ array2d[1][1];
		}
	n[0] = array2d[0][0]; n[1] = array2d[0][1]; n[2] = array2d[0][2];
	n[3] = array2d[1][2]; n[4] = array2d[2][2]; n[5] = array2d[2][1];
	n[6] = array2d[2][0]; n[7] = array2d[1][0];
	int num1 = n[7] + n[6] * 2 + n[5] * 4 + n[4] * 8 + n[3] * 16 + n[2] * 32 + n[1] * 64 + n[0] * 128;
	int num2 = n[1] + n[0] * 2 + n[7] * 4 + n[6] * 8 + n[5] * 16 + n[4] * 32 + n[3] * 64 + n[2] * 128;
	int num3 = n[3] + n[2] * 2 + n[1] * 4 + n[0] * 8 + n[7] * 16 + n[6] * 32 + n[5] * 64 + n[4] * 128;
	int num4 = n[5] + n[4] * 2 + n[3] * 4 + n[2] * 8 + n[1] * 16 + n[0] * 32 + n[7] * 64 + n[6] * 128;
	if (num1 <= num2 && num1 <= num3 && num1 <= num4) return num1;
	if (num2 <= num1 && num2 <= num3 && num2 <= num4) return num2;
	if (num3 <= num1 && num3 <= num2 && num3 <= num4) return num3;
	return num4;
}

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);
}

运行结果:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值