前言
今天更新内容主要还是实现数组的变形,在Python中一个函数Reshape的事,在C++耗费了我两个多小时,可能是我C++基础差吧,
怪我大一,大二没好好学
。本次还有一个很重要的内容就是用C++的“new”创建动态数组,在上一篇C++文章中是用的C语言的“malloc”实现数组地址的动态分配,在一个就是用指针来对数组操作,这些很简单的操作,我还要在大三重新认识,惭愧至极,话不多说,直接上代码。
代码
/*
作者:山科_xxin
时间:2017-03-14 23:27:40
功能:数组变形,求数组极值及其下标
类别:C++数组练习
*/
#include<iostream>
#include<stdlib.h>
#include<ctime>
using namespace std;
int **random(int n,int m)
{
int t;
int **data;
t = time(0);
srand(t);
data=(int **)malloc(n*sizeof(int *));
for (int i=0;i<n;i++)
data[i]=(int *)malloc(2*sizeof(int));
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
data[i][j] = rand()%100;
}
}
return data;
}
int visit(int **data,int n,int m)
{
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
cout<<data[i][j]<<" ";
cout<<endl;
}
return 0;
}
int **reshape(int **data,int n,int m,int x,int y )
{
int k = 0;
int *midata = new int[n*m];
int **redata = new int *[x];
if (n*m!=x*y)
cout<<"reshap失败,非法输入";
else
{
for( int i=0; i<x; i++ )
{
redata[i] = new int[y] ;
}
int redata1[3][2];
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
k++;
*(midata+k) = data[i][j];
}
}
int k1 = 0;
/*
for(int i = 0;i<n*m;i++)
{
k1++;
cout<<*(midata+k1)<<" ";
//cout<<midata[k1]<<" ";
}
cout<<endl;
*/
int k2 = 0;
for(int ii = 0;ii<x;ii++)
{
for(int jj = 0;jj<y;jj++)
{
//cout<<midata[ii*y+jj+1]<<" ";
//redata[ii][jj] = midata[ii*y+jj+1];
//cout<<redata[ii][jj];
redata[ii][jj] = midata[ii*y+jj+1];
//cout<<redata[ii][jj]<<" ";
}
//cout<<endl;
}
}
for(int i = 0; i < x; i++)
return redata;
}
int *Max(int **data,int n,int m)
{
int maxv = -999;
int maxi = 0,maxj = 0;
int *max = new int[3];
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
if (data[i][j]>=maxv)
{
maxv = data[i][j];
maxi = i;
maxj = j;
}
}
}
*max = maxv;
*(max+1) = maxi;
*(max+2) = maxj;
return max;
}
int *Min(int **data,int n,int m)
{
int minv = 999;
int mini = 0,minj = 0;
int *min = new int[3];
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
if (data[i][j]<=minv)
{
minv = data[i][j];
mini = i;
minj = j;
}
}
}
*min = minv;
*(min+1) = mini;
*(min+2) = minj;
return min;
}
int main()
{
int n,m,x,y;
int maxv,minv;
cout<<"请输入行数,列数"<<endl;
cin>>n;
cin>>m;
int *min;
int *max;
cin>>x;
cin>>y;
int **data = random(n,m);
int **redata = reshape(data,n,m,x,y);
cout<<"原始数组"<<endl;
visit(data,n,m);
cout<<"变形后"<<endl;
visit(redata,x,y);
min = Min(data,n,m);
max = Max(data,n,m);
cout<<"min:"<<min[0]<<" "<<"i:"<<min[1]<<" "<<"j:"<<min[2]<<endl;
cout<<"max:"<<max[0]<<" "<<"i:"<<max[1]<<" "<<"j:"<<max[2]<<endl;
system("pause");
return 0;
}
演示


注:生成3*6的随机数组,变形为9*2数组,求原数组的最大值,最小值,并返回其坐标。
后语
用C++写一个图像处理算法,肯定是一个庞大的工程,用解释性语言,比如Python,能轻松处理数组,使你更专注于算法的实现,但是C语言速度更快,比如说C语言0.001s完成的任务,Python可能需要0.1s,但是你基本察觉不出来,并且C++还有编译的过程,而Python直接运行。



