PDA

View Full Version : các phép toán trên Ma trận trong C++



soda_chanhmuoi
19-05-2007, 09:43 AM
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
#include<fstream.h>
#include<stdlib.h>
#include<ctype.h>
#include<stdio.h>
//HIEN THUC CLASS MANG 2 CHIEU GHI DOC TU FILE
int i,j;
///////////////////////////////////////////
class matran
/////////////////////////////////////////
{
private:
int tong1,tong2;
public:
int n;
int **a;
matran(int s){
n = s; //s la cap cua ma tran do nguoi nhap muon nhan vao
a=new int *[n];
for(i=0;i<n;i++)
a[i]=new int [n];
}
matran(matran &s)
{ //ham dung copy, ham chi 1 doi so tra ve chinh no
n = s.n;
a=new int *[n];
for(i=0;i<n;i++)
a[i]=new int [n];
for (i = 0; i < n;i ++)
for (j = 0; j < n;j++)
a[i][j] = s.a[i][j];
tong1 = s.tong1;
tong2 = s.tong2;

}
~matran()
{
for(i=0;i<n;i++) delete [] a[i];
delete [] a;
}


void nhap();
void xuat();
void tongCheo();
void soSoChan();
void tgDuoi(void);
void tgTren(void);
void ghiTep(char *ttep);
void docTep(char *ttep);
void maxMin(int &m,int &n);
void operator = (matran & a); //ham gan

matran tong(const matran &b);
matran hieu(const matran &b);
matran tich(const matran &b);
matran daoDau();
matran nhanK(int); //ham nhan ma tran voi so nguyen k
};
//--------------------------------------------------------------------------//
void matran::operator = (matran & x)
{
n = x.n;
tong1 = x.tong1;
tong2 = x.tong2;
for (i = 0; i < n;i ++)
for (j = 0; j<n;j++)
a[i][j] = x.a[i][j];
}


//-------------------------------------------------------------------------//
void matran::nhap()
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"nhap phan tu thu["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
}

//--------------------------------------------------------------------------//
void matran::xuat()
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(j==0) cout<<endl;
cout<<setw(6)<<a[i][j];
}
}
//--------------------------------------------------------------------------//
void matran::maxMin(int &max,int &min)
{
int l,k;
cout<<endl;
l=k=a[0][0];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(k<=a[i][j])
k=a[i][j];
if(l>a[i][j])
l=a[i][j];
}
max=k;
min=l;
}
//--------------------------------------------------------------------------//
void matran::tongCheo()
{
tong1=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i==j) tong1=tong1+a[i][j];
cout<<"tong cua phan tu nam tren duong cheo chinh la:"<<tong1;
cout<<endl;
//TINH TONG DUONG CHEO PHU
tong2=0;
for(i=0;i<n;i++)
for(j=0;j<n;++j)
{
if(j==(n-(i+1)))
tong2=tong2+a[i][j];
}
cout<<"tong cua duong cheo phu la:"<<tong2<<endl;
}
//-------------------------------------------------------------------------//
void matran::soSoChan()
{
int t=0;//bien dem cac so chan
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if (a[i][j]%2==0) ++t;
cout<< t;
}
//--------------------------------------------------------------------------//
void matran::tgDuoi(void)
{
//ma tran tam giac duoi cua ma tran la
for(i=0;i<n;i++)
for(j=0;j<i+1;j++)
{
cout<<a[i][j]<<setw(6);
if(j==i) cout<<endl;
}
}
//ma tran tam giac tren cua a
//----------------------------------------------------------------------------//
void matran::tgTren()
{
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{ if(j<i) cout<<" "; } //neu phan tu nao ma cot<hang thi ko xuat ra ,chi xuat khoang trang
for(j=i;j<n;j++)
{
cout<<setw(6)<<a[i][j];
if(j==n-1) cout<<endl;//toi phan tu cuoi cung cua cot se xuong hang
}
}
}
//-------------------------------------------------------------------------//
//TINH TONG CUA 2 MA TRAN
matran matran::tong(const matran &b)
{
matran x(n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
x.a[i][j]=a[i][j]+b.a[i][j];
return x;
}
//--------------------------------------------------------------------------//
matran matran::hieu(const matran &b)
{
matran x(n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
x.a[i][j]=a[i][j]-b.a[i][j];
return x;

}
//------------------------------------------------------------------------//
matran matran::tich(const matran &b)
{
matran c(n);
int k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
c.a[i][j]=0;
for(k=0;k<n;k++)
c.a[i][j]+= a[i][k]*b.a[k][j];
}
return c;
}
//------------------------------------------------------------------------//
matran matran::daoDau( )
{
matran y(n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
y.a[i][j] = a[i][j] * (-1);
}
return y;
}
//-------------------------------------------------------------------------//
matran matran::nhanK(int k)
{
matran x(n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
x.a[i][j]=k*a[i][j];
return x;
}
//--------------------------------------------------------------------------//
void matran::ghiTep(char *ttep)
{
ofstream f;
f.open(ttep,ios::app);
if(f.bad())exit(1);
f<<n<<setw(18)<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(j==0) f<<endl;
f<<setw(6)<<a[i][j];
}
f<<endl;
f.close();
}
//-------------------------------------------------------------------------//
void matran::docTep(char *ttep)
{
ifstream f;
f.open(ttep,ios::in);
cout<<endl;
f>>n;
f.ignore();
for(i=0;i<n;i++)
for(j=0;j<n;j++)
f>>a[i][j];
f.close();
}
//chuong trinh chinh
//************************************************** *************/**/
void main()
{
matran a(3);
matran b(3);

cout<<"nhap ma tran A"<<endl;
a.nhap();

cout<<"nhap ma tran B cung cap voi ma tran A:"<<endl;
b.nhap();

cout<<"xuat ma tran A"<<endl;
a.xuat();
cout<<endl;

cout<<"xuat ma tran B"<<endl;
b.xuat();
cout<<endl;

cout<<"max min cua ma tran A la:";
int x, y;
a.maxMin(x, y);
cout<<x<<" "<<y<<endl;

cout<<"max min cua ma tran B la:";
b.maxMin(x, y);
cout<<x<<" "<<y<<endl;


cout<<"so so chan cua ma tran a la:";
a.soSoChan();
cout<<endl;

cout<<"so so chan cua ma tran bla:";
b.soSoChan();
cout<<endl;


cout<<"tong cheo cua ma tran A:";
a.tongCheo();
cout<<endl;

cout<<"tong cheo cua ma tran B:";
b.tongCheo();
cout<<endl;

matran c=a.tong(b);
cout<<"ma tran tong la:";
c.xuat();
cout<<endl;


matran d=a.tich(b);
cout<<"ma tran tich la:";
d.xuat();
cout<<endl;


matran e=a.hieu(b);
cout<<"ma tran hieu la:";
e.xuat();
cout<<endl;

matran f=b.daoDau();
cout<<"ma tran dao dau cua b la:";
f.xuat();
cout<<endl;

matran i=a.daoDau();
cout<<"ma tran dao dau la:";
i.xuat();
cout<<endl;

cout<<"ma tran tam giac duoi cua A"<<endl;
a.tgDuoi();
cout<<endl;

//xuat ma tran tam giac tren cua A la:
cout<<"ma tran tam giac tren cua A:"<<endl;
a.tgTren();
cout<<endl;


cout<<" ma tran tam giac duoi cua B:"<<endl;
b.tgDuoi();
cout<<endl;

cout<<"ma tran tam giac tren cua B:"<<endl;
b.tgTren();
cout<<endl;


cout<<endl;
matran h=b.nhanK(2);
cout<<"ma tran dc nhan voi so nguyen k cua ma tran b la:"<<endl;
h.xuat();
cout<<endl;

cout<<endl;
matran k=a.nhanK(2);
cout<<"ma tran dc nhan voi so nguyen k cua ma tran a la:"<<endl;
k.xuat();
cout<<endl;

//------------------------------------------------------//
cout<<"cac ma tran duoc ghi va doc len file la:"<<endl;
cout<<"ma tran a:";
a.ghiTep("D:\matran.dl");
//a.docTep("D:\matran.dl");
a.xuat();
cout<<endl;

cout<<"ma tran b:";
b.ghiTep("D:\matran.dl");
b.xuat();
cout<<endl;

cout<<"ma tran tich";
d.ghiTep("D:\matran.dl");
d.xuat();
cout<<endl;

cout<<"ma tran tong";
c.ghiTep("D:\matran.dl");
c.xuat();
cout<<endl;


cout<<"ma tran hieu:";
e.ghiTep("D:\matran.dl");
e.xuat();
cout<<endl;

cout<<"ma tran dao cua b:";
f.ghiTep("D:\matran.dl");
f.xuat();
cout<<endl;

cout<<"ma tran dao cua a:";
i.ghiTep("D:\matran.dl");
i.xuat();
cout<<endl;

cout<<"ma tran dc nhan k cua mt b:";
h.ghiTep("D:\matran.dl");
h.xuat();
cout<<endl;

cout<<"ma tran dc nhan voi k cua mt a:";
k.ghiTep("D:\matran.dl");
k.xuat();
cout<<endl;
getch();
}

huynguyen
22-05-2007, 03:54 PM
Cái class matran của bạn ko phải là OOP, cần sửa lại khá nhiều. Tốt nhất bạn nên làm trên mảng trước rồi mới làm trên file và danh sách liên kết sau.

soda_chanhmuoi
22-05-2007, 04:47 PM
Hè chả biết OOP là gì hết. Bác sửa lại cho em đi theo cái kiểu OOP, chắc sửa xong là em biết OOP. Bài từ năm ngoái mà :(

nguyen190887
10-06-2007, 01:34 AM
Hè chả biết OOP là gì hết. Bác sửa lại cho em đi theo cái kiểu OOP, chắc sửa xong là em biết OOP. Bài từ năm ngoái mà :(

Mình cũng chả biết OOP là cái đinh gì hết. Nhìn code này thì hiểu dc mấy cái hàm, còn tụi "class, private, public," gì đó thì pó tay. Nếu lập một cái project thì e xin làm "function coder" (từ này mới đì-zai), còn giao cái developer cho mấy pác đó :) (đùa vui thôi nha)

iamvtn
10-06-2007, 05:50 PM
Chứng tỏ bạn này chưa học về lớp trong C++ rồi. Linh hồn của lập trình hướng đối tượng đó.

nguyen190887
10-06-2007, 06:12 PM
Uh, mình chỉ mới học C thôi, chưa biết tí gì về OPP, C++ cả. Mình chỉ biết con trỏ là linh hồn của C thôi, giờ biết thêm Lớp lầ linh hồn của OPP :)
Học OPP như thế nào là hiệu quả nhất hả bạn ? Nên bắt đầu bằng C++ hay Java thì hay hơn ?

neverland87
10-06-2007, 08:20 PM
Uh, mình chỉ mới học C thôi, chưa biết tí gì về OPP, C++ cả. Mình chỉ biết con trỏ là linh hồn của C thôi, giờ biết thêm Lớp lầ linh hồn của OPP :)
Học OPP như thế nào là hiệu quả nhất hả bạn ? Nên bắt đầu bằng C++ hay Java thì hay hơn ?
OOP đâu có gì khó, tải mấy ebook học C++ về đọc sẽ hiểu, lớp đơn giản là struct mở rộng, và để tránh phải copy and paste lại code, ta lại chơi thêm thừa kế :D , các đối tượng là biến có kiểu giá trị là tên lớp. Khỏi cần phải nghĩ đi đâu xa :)

nguyen190887
11-06-2007, 12:06 AM
Mò mẫm code của mấy bài viết bằng C++ trong forum thì mình thấy hình như Lớp cũng gần giống struct, chỉ có điều là nó có thêm mấy cái phương thức (method) nữa. Đúng ko nerverland87 ???
Còn nữa, nghe bạn nói "tránh phải copy và paste lại code" thì mình nghĩ là khi mình khai báo các lớp mới thì nó sẽ lưu vào một file nào đó để sau này mình có thể gọi lại phải không bạn ???

Học thầy hổng tày học bạn. Help me nha :)

iamvtn
11-06-2007, 12:54 AM
Thừa kế trong lớp là thế này
VD: ta có một lớp Động vật có vú có các thuộc tính của động vật có vú
Sau đó ta xây dựng thêm lớp chó, và lớp chó cũng có thuộc tính chung của động vật có vú và những thuộc tính riêng của nó. Thì ta sử dụng thừa kế để lớp chó thừa kế lại các thuộc tính của đv có vú trong lớp chó.
Bạn đọc thêm quyển tự học Lập trình hướng đối tượng trong 21 ngày hoặc quyển C++ lập trình hướng đối tượng (Của Phạm Văn Ất) thì sẽ rõ hơn