65,207
社区成员
发帖
与我相关
我的任务
分享
#ifndef MAIN
#define MAIN
#include <iostream>
#include <math.h>
#include <cassert>
#include <iomanip>
using namespace std;
#endif
#ifndef ARRAY_H
#define ARRAY_H
#include "Mainhead.h"
const int PRECISION=6;
template <class T>
class Array
{
protected:
T* list;
int size;
public:
Array(const int& sz=50);
Array (const Array<T> &a);
~Array();
Array<T>& operator= (const Array<T> &rhs);
T & operator [](const int& i);
const T & operator[] (const int& i) const;
operator T* ();
operator const T*() const;
int getSize() const;
void resize(const int& sz);
template <typename T>
friend istream & operator>>(istream & in, Array<T>& a);
template <typename T>
friend ostream & operator<<(ostream & out, const Array<T> & a);
};
template <class T>
Array<T>::Array(const int& sz)
{
assert(sz>=0);
size=sz;
list=new T[size];
}
template <class T>
Array<T>::~Array()
{
delete [] list;
}
template <class T>
Array<T>::Array(const Array<T> &a)
{
size=a.size;
list=new T[size];
for (int i=0;i<size;i++)
{
list[i]=a.list[i];
}
}
template <class T>
Array<T>& Array<T>::operator= (const Array<T> &rhs)
{
if (&rhs!=this)
{
if (size!=rhs.size){
delete [] list;
size=rhs.size;
list=new T[size];}
for (int i=0;i<size;i++){
list[i]=rhs.list[i];}
}
return *this;
}
template <class T>
T & Array<T>::operator[] (const int& i)
{
assert(i>=0&&i<size);
return list[i];
}
template <class T>
const T& Array<T>::operator[](const int& i) const
{
assert(i>=0&&i<size);
return list[i];
}
template <class T>
Array<T>::operator T*() {return list;}
template <class T>
Array<T>::operator const T*() const {return list;}
template <class T>
int Array<T>::getSize() const {return size; }
template <class T>
void Array<T>::resize(const int& sz)
{
assert(sz>=0);
if (sz==size)
return;
T* newlist=new T[sz];
int n=(sz<size)?sz:size;
for (int i=0;i<n;i++){
newlist[i]=list[i];}
delete[] list;
list=newlist;
size=sz;
}
template <typename T>
istream & operator>>(istream & in, Array<T>& a )
{
for (int i=0;i<a.size;i++)
{ in >>a.list[i]; }
return in;
}
template <typename T>
ostream & operator<<(ostream & out, const Array<T> & a)
{
for (int i=0;i<a.size;i++)
{ out <<setprecision(PRECISION)<<a.list[i]<<' '; }
return out;
}
#endif
#ifndef MATRIX_H
#define MATRIX_H
#include "Mainhead.h"
#include "Array.h"
template <class T>
class Matrix
{
protected:
Array<T>* ary;
int rownum;
int colnum;
public:
Matrix(const int& rn=20,const int& cn=20);
Matrix(const Matrix<T> &mt);
~Matrix();
Matrix<T>& operator= (const Matrix<T> & mt);
Array<T> & operator [] (const int& i);
const Array<T> & operator [] (const int& i) const;
operator Array<T>* ();
operator const Array<T>*() const;
int getRownum() const;
int getColnum() const;
int getSize() const;
void resize(const int& rn,const int& cn);
template <typename T>
friend istream & operator>>(istream & in,Matrix<T> & mt);
template <typename T>
friend ostream & operator<<(ostream & out,const Matrix<T> & mt);
};
template <class T>
Matrix<T>::Matrix(const int& rn,const int& cn)
{
assert(rn>=0&&cn>=0);
rownum=rn;
colnum=cn;
ary=new Array<T>[rownum];
for (int i=0;i<rownum;i++)
{
ary[i]=*(new Array<T>);
ary[i].resize(colnum);
}
}
template <class T>
Matrix<T>::~Matrix()
{
rownum=0;
colnum=0;
for (int i=0;i<rownum;i++){
ary[i].~Array();
}
delete[] ary;
}
template <class T>
Matrix<T>::Matrix(const Matrix<T> & mt)
{
rownum=mt.rownum;
colnum=mt.colnum;
ary=new Array<T>[rownum];
for (int i=0;i<rownum;i++)
{
ary[i]=mt.ary[i];
}
}
template <class T>
Matrix<T>& Matrix<T>::operator=(const Matrix<T> &rhs)//赋值操作符重载,应该有问题,但没看出来
{
if (&rhs!=this)
{
if (rownum!=rhs.rownum||colnum!=rhs.colnum)
{
for (int i=0;i<rownum;i++)
{
ary[i].~Array();
}
delete[] ary;
ary=new Array<T>[rhs.rownum];
for (int i=0;i<rhs.rownum;i++)
{
ary[i]=rhs.ary[i];
}
rownum=rhs.rownum;
colnum=rhs.colnum;
}
}
return *this;
}
template <class T>
Array<T> & Matrix<T>::operator [] (const int& i)
{
assert(i>=0&&i<rownum);
return ary[i];
}
template <class T>
const Array<T> & Matrix<T>::operator[](const int& i) const
{
assert(i>=0&&i<rownum);
return ary[i];
}
template <class T>
Matrix<T>::operator Array<T>*() {return ary;}
template <class T>
Matrix<T>::operator const Array<T>*() const {return ary;}
template <class T>
int Matrix<T>::getRownum() const {return rownum;}
template <class T>
int Matrix<T>::getColnum() const {return colnum;}
template <class T>
int Matrix<T>::getSize() const {return rownum*colnum;}
template <class T>
void Matrix<T>::resize(const int& rn,const int& cn)//修改矩阵大小,貌似也有错误
{
assert(rn>=0&&cn>=0);
if (rn==rownum&&cn==colnum)
{return;}
Array<T>* newary=new Array<T>[rn];
int r=(rn<rownum)?rn:rownum;
for (int i=0;i<r;i++)
{
newary[i]=ary[i];
}
for (int i=0;i<rn;i++)
{
newary[i].resize(cn);
}
for (int i=0;i<rownum;i++)
{
ary[i].~Array();
}
delete[] ary;
for (int i=0;i<rn;i++)
{
ary[i]=newary[i];
}
ary=newary;
rownum=rn;
colnum=cn;
}
template <typename T>
istream & operator>>(istream & in,Matrix<T>& mt)
{
for (int i=0;i<mt.rownum;i++)
{ in >>mt.ary[i]; }
return in;
}
template <typename T>
ostream & operator<<(ostream & out,const Matrix<T>& mt)
{
for (int i=0;i<mt.rownum;i++)
{ out <<mt.ary[i]<<endl;}
return out;
}
#endif
#include "Mainhead.h"
#include "Array.h"
#include "Matrix.h"
void main()
{
double goon;
do
{
int row1,col1,row2,col2;//依次输入第一个矩阵的行数、列数,第二个矩阵的行数、列数
cin >>row1>>col1>>row2>>col2;
Matrix<double> mt1(row1,col1),mt2(row2,col2);
cin >>mt1;//输入第一个矩阵
mt2=mt1;//令第二个矩阵等于第一个矩阵
cout<<mt2;//输出第二个矩阵
cout<<"是否再来?(输入非零继续,输入零退出)";
cin >>goon;
}while(goon);
system("pause");
}

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int **newarr2d(int rows,int cols) {
int **p,i;
p=(int **)malloc(rows*sizeof(int *));
if (NULL==p) exit(1);
for (i=0;i<rows;i++) {
p[i]=(int *)malloc(cols*sizeof(int));
if (NULL==p[i]) exit(1);
}
return p;
}
void deletearr2d(int **p,int rows) {
int i;
for (i=0;i<rows;i++) {
free(p[i]);
}
free(p);
}
int main() {
int **arr2d,i,j,r,c;
r=4;
c=5;
//在堆中开辟一个4×5的二维int数组
arr2d=newarr2d(r,c);
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
arr2d[i][j]=i*c+j;
}
}
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
printf(" %2d",arr2d[i][j]);
}
printf("\n");
}
deletearr2d(arr2d,r);
r=6;
c=3;
//在堆中开辟一个6×3的二维int数组
arr2d=newarr2d(r,c);
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
arr2d[i][j]=i*c+j;
}
}
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
printf(" %2d",arr2d[i][j]);
}
printf("\n");
}
deletearr2d(arr2d,r);
return 0;
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
// 0 1 2
// 3 4 5
// 6 7 8
// 9 10 11
// 12 13 14
// 15 16 17
//