PDA

View Full Version : [Q] Mang hai chieu dong



Dhhg
19-12-2002, 16:35
Co cach nao su dung mang 2 chieu dong trong C++ ko, tui thi phai su dung mang dong thong qua con tro nhung mang 2 chieu dong trong con tro tui khong hieu sao C++ lai ko cho sai ma chi cho sai mang 1 chieu dong thoi, chi tui voi, neu lam duoc mang dong nhieu chieu ma ko can con tro thi cang tot.May ban nho cho tui mot vd nhe(ngan va don gian thoi).

Bin Laden
22-12-2002, 13:48
Đầu tiên là góp ý với bạn nhé:
Thứ nhất là không nên gửi tiếng việt không dấu, cái này các mod đã nhắc nhở nhiều rồi.
Thứ hai là bạn nên cẩn thận vấn đề chính tả, tiếng việt nói là "tiêu xài" chứ không nói là "tiêu sài" (:rolleyes: Tớ nói đúng không nhỉ)
Còn vấn đề bạn hỏi, tớ gợi ý cho bạn nhé:
Trong C++ có thể khai báo mảng động như sau:

char * ch = new char[100] khai báo mảng 100 char.
ch là con trỏ, trỏ tới mảng có 100 phần tử.

Nếu ta có một đối tượng (hay một kiểu dữ liệu tự định nghĩa) A, ta có thể khai báo như sau:

A * a = new A[100] -> mảng 100 phần tử A.

Vậy nếu phần tử A này là một mảng thì ta đã có được mảng 2 chiều.

Bạn thử xem nhé.

minhbeo
23-12-2002, 20:55
Xin chào bạn!
vấn đề này được giải quyết bằng mảng cấp phát động 1 chiều như sau
bạn muốn trỏ đến phần tử dòng m, cột n của ma trận M,N thì phần tử trong mảng 1 chiều là N*(m-1)+n;
Tôi xin đưa lên đây một số code của véc tơ và ma trận mà tôi đã từng xây dựng để mô tả ma trận độ cứng của hệ thanh.
dùng thư viện này bạn sẽ được định nghĩa chồng toán tử nên sử dụng rất dễ.

tập tin containe.hpp
// lop vat chua truu tuong
// muc tieu : tao lop co so truu tuong
# include <fstream.h>
# if !defined __CONTAINER_HPP
# define __CONTAINER_HPP 1
typedef float TYPE;
class container
{

protected :
unsigned long count; // so phan tu
void (*errorhandler)(); // con tro den ham xu ly ngoai le
public :
container();
container(const container &c);
void operator =(const container &c);
unsigned long getcount() { return count; };
void assignhandler(void(*userhandler)()) {errorhandler=userhandler;};
virtual fstream& operator >>(fstream &f)=0;
virtual fstream& operator <<(fstream &f)=0;
//virtual int store(void *item)=0;
//virtual void * examine()=0;
//virtual void * retrieve()=0;
//virtual void empty()=0;
};
#endif

tập tin CONTAINE.cpp
# include "containe.hpp"
# include <iostream.h>
static void defaulthandler()
{
cout<<"loi trong container : khong cap phat duoc bo nho"<<"/n";
}
container::container()
{
count=0;
errorhandler=defaulthandler;
}
container::container(const container &c)
{
count=c.count;
errorhandler=c.errorhandler;
}
void container::operator =(const container &c)
{
count=c.count;
errorhandler=c.errorhandler;
}

tập tin VECTOR.hpp

# include "containe.hpp"
# if !defined __VEC_HPP
# define __VEC_HPP 1

class vec : public virtual container
{
protected :
unsigned long max;
TYPE far *vpr;
public :
vec(TYPE v);
vec();
vec(unsigned long Max=1);
vec(const vec &v);
~vec();
void fill(unsigned long num,TYPE val=0);
// void vaccess(unsigned long index,TYPE x);
TYPE& operator [](unsigned long index);
const TYPE& operator [] (unsigned long index) const;
void addscalar(unsigned long num1,unsigned long num2,TYPE scalar);
void multscalar(unsigned long num1,unsigned long num2,TYPE scalar);
void operator =(const vec& v);
friend vec operator +(const vec& v1,const vec& v2);
friend vec operator -(const vec& v1,const vec& v2);
friend TYPE operator *(const vec& v1,const vec& v2);
unsigned long sizemax() { return max;};
void realloc(unsigned long newsize=1);
virtual fstream& operator >>(fstream &f);
virtual fstream& operator <<(fstream &f);
};
#endif

tập tin VECTOR.cpp

# include "vector.hpp"
# include <string.h>
# include <stdlib.h>
vec::vec(unsigned long Max):container()
{
max=Max;
// __new_handler=errorhandler;
vpr = new TYPE far[max];
fill(max);
}
vec::vec():container()
{
max=1;
vpr = new TYPE[max];
fill(max);
}
vec::vec(TYPE v):container()
{
max=1;
vpr=&v;
}
vec::vec(const vec &v):container()
{
max=v.sizemax();
vpr=new TYPE[max];
for (unsigned long i=0;i<max;i++)
vpr[i]=v[i];
}
vec::~vec()
{
if (vpr!=NULL)
{
delete[max] vpr;
max=0;
vpr=NULL;
}
}
void vec::fill(unsigned long num,TYPE val)
{
for (unsigned long i=0;i<num;i++)
vpr[i]=val;
}
TYPE& vec::operator [](unsigned long index)
{
return vpr[index];
}
const TYPE& vec::operator [](unsigned long index) const
{
return vpr[index];
}
void vec::addscalar(unsigned long num1,unsigned long num2,TYPE scalar)
{
for (unsigned long i=num1;i<num2;i++)
vpr[i]=vpr[i]+scalar;
}
void vec::multscalar(unsigned long num1,unsigned long num2,TYPE scalar)
{
for (unsigned long i=num1;i<num2;i++)
vpr[i]=vpr[i]*scalar;
}
void vec::operator =(const vec& v)
{
if (sizemax()!=v.sizemax()) realloc(v.sizemax());
for (unsigned long i=0;i<sizemax();i++)
vpr[i]=v[i];
}
vec operator +(const vec& v1,const vec& v2)
{
unsigned long r=v2.sizemax();
vec v(v1.sizemax());
if (v1.sizemax()<v2.sizemax())
{
r=v1.sizemax();
v.realloc(v2.sizemax());
}
for (unsigned long i=0;i<r;i++)
v[i]=v1[i]+v2[i];
return v;
}
vec operator -(const vec& v1,const vec& v2)
{
v2.multscalar(0,v2.sizemax(),-1);
return v1+v2;
}
TYPE operator *(const vec& v1,const vec& v2)
{
if (v1.sizemax()!=v2.sizemax()) exit(-1);
TYPE temp=0;
for (unsigned long i=0;i<v1.sizemax();i++)
temp += v1[i]*v2[i];
return temp;
}
void vec::realloc(unsigned long newsize)
{
TYPE far *temp=new TYPE far[newsize];
if (temp!=NULL)
{
if (newsize>sizemax())
memcpy(temp,vpr,sizemax()*sizeof(TYPE));
else
memcpy(temp,vpr,newsize*sizeof(TYPE));
delete[max] vpr;
max=newsize;
vpr=temp;
temp=NULL;
}
}
fstream& vec::operator <<(fstream &f) //xuat
{
for (long int i=0;i<sizemax();i++)
{
TYPE t=vpr[i];
f.write((char *) &t,sizeof(t));
}
return f;
}
fstream& vec::operator >>(fstream &f) //nhap
{
for (long int i=0;i<sizemax();i++)
{
TYPE t;
f.read((char *) &t,sizeof(t));
vpr[i]=t;
}
return f;
}


tập tin DMAT.hpp

/* Lop ma tran dong co so
Viet boi : Dương Quang Minh Phòng thẩm định sở giao thông TT-Huế
Noi dung : cac phuong thuc truy cap va tinh toan tren ma tran dong
co bac tuy y */

# include "vector.hpp"


# if !defined __DMAT_HPP
# define __DMAT_HPP 1


class dmat : public virtual vec // kich thuoc dong ,cot ma tran tinh tu 0
{
private :
unsigned int sizerow, // so dong ( hay kich thuoc cot )
sizecol, // so cot ( hay kich thuoc dong )
cur, // dong hien tai
cuc; // cot hien tai
public :
dmat(unsigned int r,unsigned int c); // cac constructor
dmat();
dmat(const dmat &d);
~dmat();

unsigned long loc(unsigned int r,unsigned int c);// PT tinh dia chi
// void access(unsigned int r,unsigned int c,TYPE x);//dua phan tu x vao dong r, cot c
TYPE& operator ()(unsigned int r,unsigned int c);// noi dung phan tu dong r, cot c
const TYPE& operator ()(unsigned int r,unsigned int c) const;// noi dung phan tu dong r, cot c
virtual fstream& operator >>(fstream &f);// dua matrix ra dia
virtual fstream& operator <<(fstream &f);// dua matrix vao memory
vec operator >>(unsigned int r); // trich ra dong thu r dua vao vec
vec operator > (unsigned int c); // trich ra cot thu c dua vao vec
void operator <<(vec vr); // dua vec vao dong hien hanh
void operator < (vec vc); // dua vec vao cot hien hanh
/* trich ra dmat ma tran con dinh boi dong dau fr, cot dau fc,
dong cuoi lr, cot cuoi lc */
dmat membermat(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc);

/* dua vao ma tran con dm dinh boi dong dau fr, cot dau fc,
dong cuoi lr, cot cuoi lc vao ma tran hien hanh */
void membermat(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc,const dmat& dm);

/* dua vao ma tran con dm dinh boi dong dau fr, cot dau fc,
dong cuoi lr, cot cuoi lc vao cong voi ma tran hien hanh */
void addmember(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc,const dmat& dm);


void fill(TYPE val=0);// lap day noi dung ma tran boi gia tri val
void addscalar(TYPE scal);// cong toan bo ma tran voi scal
void multscalar(TYPE scal);// nhan toan bo ma tran voi scal

void operator =(const dmat& d); // toan tu = ma tran
friend dmat operator +(const dmat& d1,const dmat& d2);// toan tu + ma tran
friend dmat operator -(const dmat& d1,const dmat& d2);// toan tu - ma tran
friend dmat operator *(const dmat& d1,const dmat& d2);// toan tu * ma tran
friend dmat operator ~(const dmat& d); // toan tu chuyen vi ma tran
friend dmat operator !(const dmat& d); // toan tu nghich dao ma tran

// PT dieu chinh tinh chat lien ket cua dau thanh
void chinhlk(TYPE ro,const dmat& m1,const dmat& t,const dmat& m2);

// PT chuyen he truc toa do cua ma tran do cung phan tu
void chuyentruck(const dmat& t,const dmat& mat);

// PT chuyen he truc toa do cua ma tran tai trong phan tu
void chuyentrucf(const dmat& t,const dmat& f);

// PT xoa cac lien ket vo dinh cua ma tran do cung toan he
dmat operator --();

void writematrix();// viet ma tran ra man hinh
void readmatrix();// doc vao ma tran tu ban phim

unsigned int getsizerow() { return sizerow;} // tra ve so dong ma tran
unsigned int getsizecol() { return sizecol;} // tra ve so cot ma tran
unsigned int getcur() { return cur;} // tra ve dong hien hanh
unsigned int getcuc() { return cuc;} // tra ve cot hien hanh
void setsizerow(unsigned int srow) { sizerow=srow;} //dat lai kich thuoc dong =srow
void setsizecol(unsigned int scol) {sizecol=scol;} //dat lai kich thuoc cot =scol
void setcur(unsigned int scur) {cur=scur;} //dat lai kich thuoc dong hien hanh =scur
void setcuc(unsigned int scuc) {cuc=scuc;} //dat lai kich thuoc cot hien hanh =scuc

};
#endif

tập tin DMAT1.cpp

# include "dmat.hpp"
# include <iostream.h>
# include <iomanip.h>
# include <math.h>
dmat::dmat(unsigned int r,unsigned int c):vec((unsigned long) (r*c))
{
cuc=0;
cur=0;
sizerow=r;
sizecol=c;
}
dmat::dmat():vec((unsigned long) 1)
{
cuc=0;
cur=0;
sizerow=1;
sizecol=1;
}
dmat::dmat(const dmat &d):vec((unsigned long) d.sizemax())
{
for(unsigned long i=0;i<d.sizemax();i++)
{
vpr[i]=d.vpr[i];
}
cuc=d.getcur();
cur=d.getcuc();
sizerow=d.getsizerow();
sizecol=d.getsizecol();
}
dmat::~dmat()
{
cuc=0;
cur=0;
sizerow=0;
sizecol=0;
}
void dmat::writematrix()
{
for (unsigned int i=0;i<getsizerow();i++)
{
for (unsigned int j=0;j<getsizecol();j++)
{
cout<<setiosflags(ios::showpoint|ios::fixed)<<setprecision(5)<<setiosflags(ios::left);
cout<<vpr[loc(i,j)]<<" ";
}
cout<<"\n";
}
}
void dmat::readmatrix()
{
TYPE x;
for (unsigned int i=0;i<getsizerow();i++)
{
for (unsigned int j=0;j<getsizecol();j++)
{
cout<<" nhap "<<i<<","<<j<<" ";
//cin>>x;
if (i==j) x=1000;else x=500;
vpr[loc(i,j)]=x;
}
}
}

tập tin DMAT2.cpp


# include "dmat.hpp"
# include <stdlib.h>

unsigned long dmat::loc(unsigned int r,unsigned int c)
{
return (unsigned long)(r*getsizecol()+c);
}
TYPE& dmat::operator ()(unsigned int r,unsigned int c)
{
setcur(r);
setcuc(c);
return vpr[loc(r,c)];
}
const TYPE& dmat::operator ()(unsigned int r,unsigned int c) const
{
setcur(r);
setcuc(c);
return vpr[loc(r,c)];
}
vec dmat::operator >>(unsigned int r)
{
vec temp((unsigned long) getsizecol());
for ( unsigned int i=0;i<temp.sizemax();i++)
temp[i]=vpr[loc(r,i)];
return temp;
}
vec dmat::operator >(unsigned int c)
{
vec temp((unsigned long) getsizerow());
for ( unsigned int i=0;i<temp.sizemax();i++)
temp[i]=vpr[loc(i,c)];
return temp;
}
void dmat::operator <<(vec vr)
{
if (vr.sizemax()!=getsizecol()) exit(-1);
for (unsigned int i=0;i<getsizecol();i++)
vpr[loc(getcur(),i)]=vr[i];
}
void dmat::operator <(vec vc)
{
if (vc.sizemax()!=getsizerow()) exit(-1);
for (unsigned int i=0;i<getsizerow();i++)
vpr[loc(i,getcuc())]=vc[i];
}
dmat dmat::membermat(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc)
{
unsigned int nr=lr-fr+1,nc=lc-fc+1;
dmat d(nr,nc);
for (unsigned int i=0;i<nr;i++)
{
unsigned int k=fr+i;
for (unsigned int j=0;j<nc;j++)
{
unsigned int l=fc+j;
d.vpr[d.loc(i,j)]=vpr[loc(k,l)];
}
}
return d;
}
void dmat::membermat(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc,const dmat& dm)
{
unsigned int nr=lr-fr+1,nc=lc-fc+1;
if ((dm.getsizerow()<nr)||(dm.getsizecol()<nc)) exit(-1);
for (unsigned int i=0;i<nr;i++)
{
unsigned int k=fr+i;
for (unsigned int j=0;j<nc;j++)
{
unsigned int l=fc+j;
vpr[loc(k,l)]=dm(i,j);
}
}
}
void dmat::addmember(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc,const dmat& dm)
{
unsigned int nr=lr-fr+1,nc=lc-fc+1;
if ((dm.getsizerow()<nr)||(dm.getsizecol()<nc)) exit(-1);
for (unsigned int i=0;i<nr;i++)
{
unsigned int k=fr+i;
for (unsigned int j=0;j<nc;j++)
{
unsigned int l=fc+j;
TYPE t=vpr[loc(k,l)];
vpr[loc(k,l)]=dm(i,j)+t;
}
}
}
fstream& dmat::operator <<(fstream &f)//xuat
{
for (unsigned int i=0;i<getsizerow();i++)
{
for (unsigned int j=0;j<getsizecol();j++)
{
TYPE t=vpr[loc(i,j)];
f.write((char *) &t,sizeof(t));
}
}
return f;
}
fstream& dmat::operator >>(fstream &f)//nhap
{
for (long int i=0;i<getsizerow();i++)
{
for (unsigned int j=0;j<getsizecol();j++)
{
TYPE t;
f.read((char *) &t,sizeof(t));
vpr[loc(i,j)]=t;
}
}
return f;
}

tập tin DMAT3.cpp

# include "dmat.hpp"

void dmat::fill(TYPE val)
{
for (unsigned long i=0;i<sizemax();i++)
vpr[i]=val;
setcur(getsizerow());
setcuc(getsizecol());
}
void dmat::addscalar(TYPE scalar)
{
for (unsigned long i=0;i<sizemax();i++)
vpr[i]=vpr[i]+scalar;
setcur(getsizerow());
setcuc(getsizecol());
}
void dmat::multscalar(TYPE scalar)
{
for (unsigned long i=0;i<sizemax();i++)
vpr[i]=vpr[i]*scalar;
setcur(getsizerow());
setcuc(getsizecol());
}

tập tin DMAT4.cpp


# include <stdlib.h>
# include <math.h>
# include "dmat.hpp"

void dmat::operator =(const dmat& d)
{
if (sizemax()!=d.sizemax()) realloc(d.sizemax());
for (unsigned long i=0;i<sizemax();i++)
vpr[i]=d.vpr[i];
sizerow=d.getsizerow();
sizecol=d.getsizecol();
cur=d.getcur();
cuc=d.getcuc();
}
dmat operator +(const dmat& d1,const dmat& d2)
{
if ((d1.getsizerow()!=d2.getsizerow())||(d1.getsizeco l()!=d2.getsizecol()));
exit(-1);
dmat temp(d1.getsizerow(),d1.getsizecol());
for (unsigned long i=0;i<temp.sizemax();i++)
temp.vpr[i]=d1.vpr[i]+d2.vpr[i];
return temp;
}
dmat operator -(const dmat& d1,const dmat& d2)
{
d2.multscalar(-1);
dmat temp=d1+d2;
return temp;
}

dmat operator *(const dmat& d1,const dmat& d2)
{
if (d1.getsizecol()!=d2.getsizerow())
exit(-1);
dmat temp(d1.getsizerow(),d2.getsizecol());
for (unsigned int k=0;k<d2.getsizecol();k++)
{
for (unsigned int i=0;i<d1.getsizerow();i++)
{
temp.vpr[temp.loc(i,k)]=0;
for (unsigned int j=0;j<d1.getsizecol();j++)
temp.vpr[temp.loc(i,k)]=temp.vpr[temp.loc(i,k)]+d1.vpr[d1.loc(i,j)]*d2.vpr[d2.loc(j,k)];
}
}
return temp;
}

Còn tập tin DMAT5.cpp về các phép tính riêng cho hệ kết cấu có lẽ các bạn không cần hoặc có thể viết rất dễ tôi không đưa lên vì thế này là đã qúa dài. Nếu cần bạn có thể liên lạc với tôi
minhnhat@pmail.vnn.vn

thanhdat86
14-12-2007, 00:21
mình xin góp ý một cách làm mảng động hai chiều như sau:
fstream fin; //Giả sử đọc dữ liệu từ một file text có dạng ma trận n*n
// 4
// 1 0 1 0
// 0 1 1 1
// 0 1 1 0
// 1 0 0 0
char *ch;
int **a,n;
fin.open(ch);
fin>>n;
for (int k=0;k<n;k++)
{
a[k]= new int[n];
}
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
fin>>a[i][j];
fin.close()

edogawaconan
14-12-2007, 11:34
Xin chào bạn!
vấn đề này được giải quyết bằng mảng cấp phát động 1 chiều như sau
bạn muốn trỏ đến phần tử dòng m, cột n của ma trận M,N thì phần tử trong mảng 1 chiều là N*(m-1)+n;
Tôi xin đưa lên đây một số code của véc tơ và ma trận mà tôi đã từng xây dựng để mô tả ma trận độ cứng của hệ thanh.
dùng thư viện này bạn sẽ được định nghĩa chồng toán tử nên sử dụng rất dễ.

tập tin containe.hpp
// lop vat chua truu tuong
// muc tieu : tao lop co so truu tuong
# include <fstream.h>
# if !defined __CONTAINER_HPP
# define __CONTAINER_HPP 1
typedef float TYPE;
class container
{

protected :
unsigned long count; // so phan tu
void (*errorhandler)(); // con tro den ham xu ly ngoai le
public :
container();
container(const container &c);
void operator =(const container &c);
unsigned long getcount() { return count; };
void assignhandler(void(*userhandler)()) {errorhandler=userhandler;};
virtual fstream& operator >>(fstream &f)=0;
virtual fstream& operator <<(fstream &f)=0;
//virtual int store(void *item)=0;
//virtual void * examine()=0;
//virtual void * retrieve()=0;
//virtual void empty()=0;
};
#endif

tập tin CONTAINE.cpp
# include "containe.hpp"
# include <iostream.h>
static void defaulthandler()
{
cout<<"loi trong container : khong cap phat duoc bo nho"<<"/n";
}
container::container()
{
count=0;
errorhandler=defaulthandler;
}
container::container(const container &c)
{
count=c.count;
errorhandler=c.errorhandler;
}
void container::operator =(const container &c)
{
count=c.count;
errorhandler=c.errorhandler;
}

tập tin VECTOR.hpp

# include "containe.hpp"
# if !defined __VEC_HPP
# define __VEC_HPP 1

class vec : public virtual container
{
protected :
unsigned long max;
TYPE far *vpr;
public :
vec(TYPE v);
vec();
vec(unsigned long Max=1);
vec(const vec &v);
~vec();
void fill(unsigned long num,TYPE val=0);
// void vaccess(unsigned long index,TYPE x);
TYPE& operator [](unsigned long index);
const TYPE& operator [] (unsigned long index) const;
void addscalar(unsigned long num1,unsigned long num2,TYPE scalar);
void multscalar(unsigned long num1,unsigned long num2,TYPE scalar);
void operator =(const vec& v);
friend vec operator +(const vec& v1,const vec& v2);
friend vec operator -(const vec& v1,const vec& v2);
friend TYPE operator *(const vec& v1,const vec& v2);
unsigned long sizemax() { return max;};
void realloc(unsigned long newsize=1);
virtual fstream& operator >>(fstream &f);
virtual fstream& operator <<(fstream &f);
};
#endif

tập tin VECTOR.cpp

# include "vector.hpp"
# include <string.h>
# include <stdlib.h>
vec::vec(unsigned long Max):container()
{
max=Max;
// __new_handler=errorhandler;
vpr = new TYPE far[max];
fill(max);
}
vec::vec():container()
{
max=1;
vpr = new TYPE[max];
fill(max);
}
vec::vec(TYPE v):container()
{
max=1;
vpr=&v;
}
vec::vec(const vec &v):container()
{
max=v.sizemax();
vpr=new TYPE[max];
for (unsigned long i=0;i<max;i++)
vpr[i]=v[i];
}
vec::~vec()
{
if (vpr!=NULL)
{
delete[max] vpr;
max=0;
vpr=NULL;
}
}
void vec::fill(unsigned long num,TYPE val)
{
for (unsigned long i=0;i<num;i++)
vpr[i]=val;
}
TYPE& vec::operator [](unsigned long index)
{
return vpr[index];
}
const TYPE& vec::operator [](unsigned long index) const
{
return vpr[index];
}
void vec::addscalar(unsigned long num1,unsigned long num2,TYPE scalar)
{
for (unsigned long i=num1;i<num2;i++)
vpr[i]=vpr[i]+scalar;
}
void vec::multscalar(unsigned long num1,unsigned long num2,TYPE scalar)
{
for (unsigned long i=num1;i<num2;i++)
vpr[i]=vpr[i]*scalar;
}
void vec::operator =(const vec& v)
{
if (sizemax()!=v.sizemax()) realloc(v.sizemax());
for (unsigned long i=0;i<sizemax();i++)
vpr[i]=v[i];
}
vec operator +(const vec& v1,const vec& v2)
{
unsigned long r=v2.sizemax();
vec v(v1.sizemax());
if (v1.sizemax()<v2.sizemax())
{
r=v1.sizemax();
v.realloc(v2.sizemax());
}
for (unsigned long i=0;i<r;i++)
v[i]=v1[i]+v2[i];
return v;
}
vec operator -(const vec& v1,const vec& v2)
{
v2.multscalar(0,v2.sizemax(),-1);
return v1+v2;
}
TYPE operator *(const vec& v1,const vec& v2)
{
if (v1.sizemax()!=v2.sizemax()) exit(-1);
TYPE temp=0;
for (unsigned long i=0;i<v1.sizemax();i++)
temp += v1[i]*v2[i];
return temp;
}
void vec::realloc(unsigned long newsize)
{
TYPE far *temp=new TYPE far[newsize];
if (temp!=NULL)
{
if (newsize>sizemax())
memcpy(temp,vpr,sizemax()*sizeof(TYPE));
else
memcpy(temp,vpr,newsize*sizeof(TYPE));
delete[max] vpr;
max=newsize;
vpr=temp;
temp=NULL;
}
}
fstream& vec::operator <<(fstream &f) //xuat
{
for (long int i=0;i<sizemax();i++)
{
TYPE t=vpr[i];
f.write((char *) &t,sizeof(t));
}
return f;
}
fstream& vec::operator >>(fstream &f) //nhap
{
for (long int i=0;i<sizemax();i++)
{
TYPE t;
f.read((char *) &t,sizeof(t));
vpr[i]=t;
}
return f;
}


tập tin DMAT.hpp

/* Lop ma tran dong co so
Viet boi : Dương Quang Minh Phòng thẩm định sở giao thông TT-Huế
Noi dung : cac phuong thuc truy cap va tinh toan tren ma tran dong
co bac tuy y */

# include "vector.hpp"


# if !defined __DMAT_HPP
# define __DMAT_HPP 1


class dmat : public virtual vec // kich thuoc dong ,cot ma tran tinh tu 0
{
private :
unsigned int sizerow, // so dong ( hay kich thuoc cot )
sizecol, // so cot ( hay kich thuoc dong )
cur, // dong hien tai
cuc; // cot hien tai
public :
dmat(unsigned int r,unsigned int c); // cac constructor
dmat();
dmat(const dmat &d);
~dmat();

unsigned long loc(unsigned int r,unsigned int c);// PT tinh dia chi
// void access(unsigned int r,unsigned int c,TYPE x);//dua phan tu x vao dong r, cot c
TYPE& operator ()(unsigned int r,unsigned int c);// noi dung phan tu dong r, cot c
const TYPE& operator ()(unsigned int r,unsigned int c) const;// noi dung phan tu dong r, cot c
virtual fstream& operator >>(fstream &f);// dua matrix ra dia
virtual fstream& operator <<(fstream &f);// dua matrix vao memory
vec operator >>(unsigned int r); // trich ra dong thu r dua vao vec
vec operator > (unsigned int c); // trich ra cot thu c dua vao vec
void operator <<(vec vr); // dua vec vao dong hien hanh
void operator < (vec vc); // dua vec vao cot hien hanh
/* trich ra dmat ma tran con dinh boi dong dau fr, cot dau fc,
dong cuoi lr, cot cuoi lc */
dmat membermat(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc);

/* dua vao ma tran con dm dinh boi dong dau fr, cot dau fc,
dong cuoi lr, cot cuoi lc vao ma tran hien hanh */
void membermat(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc,const dmat& dm);

/* dua vao ma tran con dm dinh boi dong dau fr, cot dau fc,
dong cuoi lr, cot cuoi lc vao cong voi ma tran hien hanh */
void addmember(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc,const dmat& dm);


void fill(TYPE val=0);// lap day noi dung ma tran boi gia tri val
void addscalar(TYPE scal);// cong toan bo ma tran voi scal
void multscalar(TYPE scal);// nhan toan bo ma tran voi scal

void operator =(const dmat& d); // toan tu = ma tran
friend dmat operator +(const dmat& d1,const dmat& d2);// toan tu + ma tran
friend dmat operator -(const dmat& d1,const dmat& d2);// toan tu - ma tran
friend dmat operator *(const dmat& d1,const dmat& d2);// toan tu * ma tran
friend dmat operator ~(const dmat& d); // toan tu chuyen vi ma tran
friend dmat operator !(const dmat& d); // toan tu nghich dao ma tran

// PT dieu chinh tinh chat lien ket cua dau thanh
void chinhlk(TYPE ro,const dmat& m1,const dmat& t,const dmat& m2);

// PT chuyen he truc toa do cua ma tran do cung phan tu
void chuyentruck(const dmat& t,const dmat& mat);

// PT chuyen he truc toa do cua ma tran tai trong phan tu
void chuyentrucf(const dmat& t,const dmat& f);

// PT xoa cac lien ket vo dinh cua ma tran do cung toan he
dmat operator --();

void writematrix();// viet ma tran ra man hinh
void readmatrix();// doc vao ma tran tu ban phim

unsigned int getsizerow() { return sizerow;} // tra ve so dong ma tran
unsigned int getsizecol() { return sizecol;} // tra ve so cot ma tran
unsigned int getcur() { return cur;} // tra ve dong hien hanh
unsigned int getcuc() { return cuc;} // tra ve cot hien hanh
void setsizerow(unsigned int srow) { sizerow=srow;} //dat lai kich thuoc dong =srow
void setsizecol(unsigned int scol) {sizecol=scol;} //dat lai kich thuoc cot =scol
void setcur(unsigned int scur) {cur=scur;} //dat lai kich thuoc dong hien hanh =scur
void setcuc(unsigned int scuc) {cuc=scuc;} //dat lai kich thuoc cot hien hanh =scuc

};
#endif

tập tin DMAT1.cpp

# include "dmat.hpp"
# include <iostream.h>
# include <iomanip.h>
# include <math.h>
dmat::dmat(unsigned int r,unsigned int c):vec((unsigned long) (r*c))
{
cuc=0;
cur=0;
sizerow=r;
sizecol=c;
}
dmat::dmat():vec((unsigned long) 1)
{
cuc=0;
cur=0;
sizerow=1;
sizecol=1;
}
dmat::dmat(const dmat &d):vec((unsigned long) d.sizemax())
{
for(unsigned long i=0;i<d.sizemax();i++)
{
vpr[i]=d.vpr[i];
}
cuc=d.getcur();
cur=d.getcuc();
sizerow=d.getsizerow();
sizecol=d.getsizecol();
}
dmat::~dmat()
{
cuc=0;
cur=0;
sizerow=0;
sizecol=0;
}
void dmat::writematrix()
{
for (unsigned int i=0;i<getsizerow();i++)
{
for (unsigned int j=0;j<getsizecol();j++)
{
cout<<setiosflags(ios::showpoint|ios::fixed)<<setprecision(5)<<setiosflags(ios::left);
cout<<vpr[loc(i,j)]<<" ";
}
cout<<"\n";
}
}
void dmat::readmatrix()
{
TYPE x;
for (unsigned int i=0;i<getsizerow();i++)
{
for (unsigned int j=0;j<getsizecol();j++)
{
cout<<" nhap "<<i<<","<<j<<" ";
//cin>>x;
if (i==j) x=1000;else x=500;
vpr[loc(i,j)]=x;
}
}
}

tập tin DMAT2.cpp


# include "dmat.hpp"
# include <stdlib.h>

unsigned long dmat::loc(unsigned int r,unsigned int c)
{
return (unsigned long)(r*getsizecol()+c);
}
TYPE& dmat::operator ()(unsigned int r,unsigned int c)
{
setcur(r);
setcuc(c);
return vpr[loc(r,c)];
}
const TYPE& dmat::operator ()(unsigned int r,unsigned int c) const
{
setcur(r);
setcuc(c);
return vpr[loc(r,c)];
}
vec dmat::operator >>(unsigned int r)
{
vec temp((unsigned long) getsizecol());
for ( unsigned int i=0;i<temp.sizemax();i++)
temp[i]=vpr[loc(r,i)];
return temp;
}
vec dmat::operator >(unsigned int c)
{
vec temp((unsigned long) getsizerow());
for ( unsigned int i=0;i<temp.sizemax();i++)
temp[i]=vpr[loc(i,c)];
return temp;
}
void dmat::operator <<(vec vr)
{
if (vr.sizemax()!=getsizecol()) exit(-1);
for (unsigned int i=0;i<getsizecol();i++)
vpr[loc(getcur(),i)]=vr[i];
}
void dmat::operator <(vec vc)
{
if (vc.sizemax()!=getsizerow()) exit(-1);
for (unsigned int i=0;i<getsizerow();i++)
vpr[loc(i,getcuc())]=vc[i];
}
dmat dmat::membermat(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc)
{
unsigned int nr=lr-fr+1,nc=lc-fc+1;
dmat d(nr,nc);
for (unsigned int i=0;i<nr;i++)
{
unsigned int k=fr+i;
for (unsigned int j=0;j<nc;j++)
{
unsigned int l=fc+j;
d.vpr[d.loc(i,j)]=vpr[loc(k,l)];
}
}
return d;
}
void dmat::membermat(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc,const dmat& dm)
{
unsigned int nr=lr-fr+1,nc=lc-fc+1;
if ((dm.getsizerow()<nr)||(dm.getsizecol()<nc)) exit(-1);
for (unsigned int i=0;i<nr;i++)
{
unsigned int k=fr+i;
for (unsigned int j=0;j<nc;j++)
{
unsigned int l=fc+j;
vpr[loc(k,l)]=dm(i,j);
}
}
}
void dmat::addmember(unsigned int fr,unsigned int fc,unsigned int lr,
unsigned int lc,const dmat& dm)
{
unsigned int nr=lr-fr+1,nc=lc-fc+1;
if ((dm.getsizerow()<nr)||(dm.getsizecol()<nc)) exit(-1);
for (unsigned int i=0;i<nr;i++)
{
unsigned int k=fr+i;
for (unsigned int j=0;j<nc;j++)
{
unsigned int l=fc+j;
TYPE t=vpr[loc(k,l)];
vpr[loc(k,l)]=dm(i,j)+t;
}
}
}
fstream& dmat::operator <<(fstream &f)//xuat
{
for (unsigned int i=0;i<getsizerow();i++)
{
for (unsigned int j=0;j<getsizecol();j++)
{
TYPE t=vpr[loc(i,j)];
f.write((char *) &t,sizeof(t));
}
}
return f;
}
fstream& dmat::operator >>(fstream &f)//nhap
{
for (long int i=0;i<getsizerow();i++)
{
for (unsigned int j=0;j<getsizecol();j++)
{
TYPE t;
f.read((char *) &t,sizeof(t));
vpr[loc(i,j)]=t;
}
}
return f;
}

tập tin DMAT3.cpp

# include "dmat.hpp"

void dmat::fill(TYPE val)
{
for (unsigned long i=0;i<sizemax();i++)
vpr[i]=val;
setcur(getsizerow());
setcuc(getsizecol());
}
void dmat::addscalar(TYPE scalar)
{
for (unsigned long i=0;i<sizemax();i++)
vpr[i]=vpr[i]+scalar;
setcur(getsizerow());
setcuc(getsizecol());
}
void dmat::multscalar(TYPE scalar)
{
for (unsigned long i=0;i<sizemax();i++)
vpr[i]=vpr[i]*scalar;
setcur(getsizerow());
setcuc(getsizecol());
}

tập tin DMAT4.cpp


# include <stdlib.h>
# include <math.h>
# include "dmat.hpp"

void dmat::operator =(const dmat& d)
{
if (sizemax()!=d.sizemax()) realloc(d.sizemax());
for (unsigned long i=0;i<sizemax();i++)
vpr[i]=d.vpr[i];
sizerow=d.getsizerow();
sizecol=d.getsizecol();
cur=d.getcur();
cuc=d.getcuc();
}
dmat operator +(const dmat& d1,const dmat& d2)
{
if ((d1.getsizerow()!=d2.getsizerow())||(d1.getsizeco l()!=d2.getsizecol()));
exit(-1);
dmat temp(d1.getsizerow(),d1.getsizecol());
for (unsigned long i=0;i<temp.sizemax();i++)
temp.vpr[i]=d1.vpr[i]+d2.vpr[i];
return temp;
}
dmat operator -(const dmat& d1,const dmat& d2)
{
d2.multscalar(-1);
dmat temp=d1+d2;
return temp;
}

dmat operator *(const dmat& d1,const dmat& d2)
{
if (d1.getsizecol()!=d2.getsizerow())
exit(-1);
dmat temp(d1.getsizerow(),d2.getsizecol());
for (unsigned int k=0;k<d2.getsizecol();k++)
{
for (unsigned int i=0;i<d1.getsizerow();i++)
{
temp.vpr[temp.loc(i,k)]=0;
for (unsigned int j=0;j<d1.getsizecol();j++)
temp.vpr[temp.loc(i,k)]=temp.vpr[temp.loc(i,k)]+d1.vpr[d1.loc(i,j)]*d2.vpr[d2.loc(j,k)];
}
}
return temp;
}

Còn tập tin DMAT5.cpp về các phép tính riêng cho hệ kết cấu có lẽ các bạn không cần hoặc có thể viết rất dễ tôi không đưa lên vì thế này là đã qúa dài. Nếu cần bạn có thể liên lạc với tôi
minhnhat@pmail.vnn.vn

Người ta đang tìm hiểu , bạn đưa ra 1 ví dụ dài xọc vậy ai mà đọc nổi !
Mình thấy ví dụ bạn thanhdat là dễ hiểu đó , bạn nên tham khảo trướcc khi đọc bài khác !