TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
──────── * ───────
BÀI TẬP LỚN
MÔN: PROJECT 1
Đề tài:
Chương trình giải ma trận
Sinh viên thực hiện:
MSSV
Lớp:
Giáo viên hướng dẫn:
Hà Nội, tháng năm
Project 1
LỜI MỞ ĐẦU
Đầu tiên, em xin chân thành cảm ơn thầy đã hướng dẫn em hoàn
thành đề tài này.
Đề tài này xây dựng một chương trình giải ma trận cho phép tính
tốn các hàm cơ bản với ma trận như +, -, *, /, tính min, max. Ngồi ra
chương trình cịn có khả năng tính định thức, nghịch đảo ma trận, giải
hệ phương trình tuyến tính.
Chương trình cịn nhiều thiếu sót mong thầy có thể sửa giúp em
để chương trình hồn thiện hơn.
2
Project 1
MỤC LỤC
LỜI MỞ ĐẦU............................................................................................................ 2
MỤC LỤC ................................................................................................................. 3
Chương 1:KHẢO SÁT, ĐẶC TẢ U CẦU BÀI TỐN ...................................... 4
1.1.
Mơ tả yêu cầu bài toán. ................................................................................ 4
1.2.
Biểu đồ use case ............................................................................................ 4
1.3.
Biểu đồ hoạt động......................................................................................... 5
1.4.
Biểu đồ lớp.................................................................................................... 6
1.5.
Xây dựng lớp ................................................................................................ 6
1.6.
Mã nguồn chương trình ............................................................................... 8
Chương 2: XÂY DỰNG CHƯƠNG TRÌNH MINH HỌA .................................... 19
Chương 3: KẾT LUẬN …………………………………………………………
23
3
Project 1
Chương 1:KHẢO SÁT, ĐẶC TẢ YÊU CẦU BÀI TOÁN
1.1. Mơ tả u cầu bài tốn.
• u cầu bài tốn:
-
Thiết kế và giải bài toán theo phương pháp hướng đối tượng.
-
Giao diện chương trình khơng bắt buộc (dịng lệnh hoặc đồ họa)
-
Tính định thức bằng phép khử Gauss,
-
Tính định thức bằng định nghĩa đệ quy.
-
Tính ma trận nghịch đảo của ma trận vng khả nghịch.
-
Giải hệ phương trình tuyến tính theo phương pháp Crame.
-
Gải hệ phương trình tuyến tính theo phân giải LU.
1.2. Biểu đồ use case
4
Project 1
1.3. Biểu đồ hoạt động
5
Project 1
1.4. Biểu đồ lớp
1.5. Xây dựng lớp
class MaTran {
public:
int rows;
int cols;
float **data;
char name[10];
public:
MaTran(void);
~MaTran(void);
MaTran(int, char*);
MaTran(int, int, char*);
void nhap();
void xuat();
void giaiPhong();
void copyto(MaTran&);
MaTran operator + (MaTran);
MaTran operator - (MaTran);
MaTran operator * (MaTran);
MaTran operator / (MaTran);
MaTran operator / (float);
MaTran operator * (float);
MaTran con(int, int);
void min();
void max();
bool laVuong();
float detG();
float detQ();
MaTran chuyenVi();
MaTran nghichDao();
MaTran boCot(int, MaTran);
};
6
Project 1
class HePhuongTrinh{
public:
MaTran A;
MaTran b;
MaTran x;
MaTran L;
MaTran U;
public:
HePhuongTrinh(void);
~HePhuongTrinh(void);
void nhap();
void cramer();
void phanRaLU();
void giaiHeTGD();
void giaiHeTGT();
void giaiLU();
void xuat();
};
class BieuThuc{
public:
int cuoi;
char mang[20][10];
int len;
char chuoibt[20];
MaTran ans;
MaTran data[20];
public:
BieuThuc(void);
~BieuThuc(void);
void nhap();
MaTran getMaTran(char*);
void phanTich();
void tinh();
};
7
Project 1
1.6. Mã nguồn chương trình
//Lớp Ma Tran
#include
#include
#include
#include
#include
"MaTran.h"
<stdio.h>
<math.h>
<iostream>
<string.h>
using namespace std;
MaTran::MaTran(void){
this->data = NULL;
strcpy(this->name , "");
}
MaTran::MaTran(int n, char name[10]) {
this->rows = n;
this->cols = n;
this->data = new float* [n];
for(int i=0; i
this->data[i] = new float[n];
strcpy(this->name , name);
}
MaTran::MaTran(int rows, int cols, char name[10]) {
this->rows = rows;
this->cols = cols;
this->data = new float* [rows];
for(int i=0; i
this->data[i] = new float[cols];
strcpy(this->name , name);
}
MaTran::~MaTran(void){
}
void MaTran::nhap() {
for(int i=0; i<this->rows; i++) {
for(int j=0; j<this->cols; j++) {
cout<<" "<<this->name<<"["<
cin>>this->data[i][j];
}
cout<
}
cout<
}
void MaTran::xuat() {
if(strcmp(this->name, "")!=0 && this->data != NULL) {
cout<
for(int i=0; i<this->rows; i++) {
for(int j=0; j<this->cols; j++)
cout<<" \t"<<this->data[i][j];
cout<
cout<
}
cout<
8
Project 1
}
else cout<<"Error!"<
}
void MaTran::giaiPhong() {
if(this->data != NULL)
for(int i=0; i<this->rows; i++)
delete [] this->data[i];
delete [] this->data;
}
void MaTran::copyto(MaTran &A) {
A.giaiPhong();
if(this->data != NULL) {
A = MaTran(this->rows, this->cols, "ans");
for(int i=0; i<this->rows; i++)
for(int j=0; j<this->cols; j++)
A.data[i][j] = this->data[i][j];
}
else A = MaTran();
}
MaTran MaTran::operator + (MaTran M) {
if(this->rows == M.rows && this->cols == M.cols ) {
MaTran
tong = MaTran(this->rows, this->cols, "Tong");
for(int i=0; i<this->rows; i++){
for(int j=0; j<this->cols; j++){
tong.data[i][j] = this->data[i][j] + M.data[i][j];
}
}
return tong;
}
else {
MaTran tong;
return tong;
}
}
MaTran MaTran::operator - (MaTran M) {
if(this->rows == M.rows && this->cols == M.cols ) {
MaTran
hieu = MaTran(this->rows, this->cols, "Hieu");
for(int i=0; i<this->rows; i++){
for(int j=0; j<this->cols; j++){
hieu.data[i][j] = this->data[i][j] - M.data[i][j];
}
}
return hieu;
}
else {
MaTran hieu;
return hieu;
}
}
MaTran MaTran::operator * (MaTran M) {
if(this->cols == M.rows && M.data != NULL) {
MaTran tich = MaTran(this->rows, M.cols, "Tich");
int i, j, k;
for(i=0; i<this->rows; i++){
for(j=0; j
tich.data[i][j] = 0;
for(k=0; k<this->cols; k++){
tich.data[i][j] += this->data[i][k] * M.data[k][j];
}
}
9
Project 1
}
return tich;
}
else {
MaTran tich;
return tich;
}
}
MaTran MaTran::operator * (float a) {
MaTran tich = MaTran(this->rows, this->cols, "Tich");
for(int i=0; i<this->rows; i++)
for(int j=0; j<this->cols; j++)
tich.data[i][j] = a * this->data[i][j];
return tich;
}
MaTran MaTran::operator / (MaTran M) {
if(this->cols == M.nghichDao().rows) {
MaTran A = MaTran(this->rows, "tmp");
for(int i=0; i<this->rows; i++)
for(int j=0; j<this->rows; j++)
A.data[i][j] = this->data[i][j];
return A * M.nghichDao();
}
else {
MaTran thuong;
return thuong;
}
}
MaTran MaTran::operator / (float a) {
MaTran thuong;
if(a) {
thuong = MaTran(this->rows, this->cols, "Thuong");
for(int i=0; i<this->rows; i++)
for(int j=0; j<this->cols; j++)
thuong.data[i][j] = this->data[i][j] / a;
}
return thuong;
}
MaTran MaTran::con(int m, int n) {
MaTran y = MaTran(this->rows-1, this->cols-1, "Con");
int a=0, b=0;
}
for(int i=0; i<this->rows; i++) {
for(int j=0; j<this->cols; j++) {
y.data[a][b] = this->data[i][j];
b += (j==n?0:1);
}
a += (i==m?0:1); b=0;
if(a==m && m==this->rows-1) return y;
}
return y;
void MaTran::max(){
float max = this->data[0][0];
for (int i=0; i<this->rows; i++)
for(int j=0; j<this->cols; j++)
if(max<this->data[i][j]) max=this->data[i][j];
cout<<"Phan tu lon nhat la: "<
}
//Phan tu nho nhat cua ma tran
void MaTran::min(){
10
Project 1
float min = this->data[0][0];
for (int i=0; i<this->rows; i++)
for(int j=0; j<this->cols; j++)
if(min>this->data[i][j]) min=this->data[i][j];
cout<<"Phan tu nho nhat la: "<
}
bool MaTran::laVuong() {
if(this->rows == this->cols) return true;
return false;
}
float MaTran::detG() {
if(this->laVuong()) {
MaTran A;
this->copyto(A);
float det = 1;
int n = this->rows, k;
for(int i=0; i
k=i+1;
if(A.data[i][i] == 0) {
while(k
if(k>n-1) {
det = 0;
break;
}
else {
det = -det;
for(int j = 0; j
float tmp = A.data[i][j];
A.data[i][j] = A.data[k][j];
A.data[k][j] = tmp;
}
}
}
for(k = i+1; k
float a = -A.data[k][i] / A.data[i][i];
for(int j = 0; j
A.data[k][j] += a*A.data[i][j];
}
}
}
for(int i=0; i
det *= A.data[i][i];
return det;
}
else {
cout<<"Error!"<
return 0;
}
float MaTran::detQ() {
if(this->laVuong()==true){
float tmp=0;
if(this->rows==1) return this->data[0][0];
for(int i=0; i<this->rows; i++) {
tmp+=pow(-1.0, i)*this->data[i][0] * this->con(i,
0).detQ();
}
return tmp;
}
11
Project 1
else{
}
cout<<"Error!"<
return 0;
}
MaTran MaTran::chuyenVi() {
MaTran A = MaTran(this->cols, this->rows, "KQ");
for(int i=0; i<this->cols; i++)
for(int j=0; j<this->rows; j++)
A.data[i][j] = this->data[j][i];
return A;
}
MaTran MaTran::nghichDao() {
if(this->rows==1 && this->cols==1 && this->data[0][0] != 0) {
MaTran B = MaTran(1, 1, "a");
B.data[0][0] = 1/this->data[0][0];
return B;
}
else
if(this->laVuong() && this->detG()!=0){
float det = this->detG();
MaTran B = MaTran(this->rows, "Nghich dao");
for(int i=0; i<this->rows; i++)
for(int j=0; j<this->rows; j++)
B.data[i][j] = pow(-1.0, i+j) * this->con(i,
j).detG() / det;
return B.chuyenVi();
}
else {
cout<<"Error!"<
MaTran B;
return B;
}
}
MaTran MaTran::boCot(int k, MaTran B) {
MaTran A;
this->copyto(A);
for(int i=0; i<this->rows; i++)
A.data[i][k] = B.data[i][0];
return A;
}
//Lop BieuThuc
#include "BieuThuc.h"
#include "HePhuongTrinh.h"
#include <iostream>
using namespace std;
BieuThuc::BieuThuc(void){
this->data[0] = MaTran(1,1,"ans");
this->data[0].data[0][0] = 0;
this->cuoi = 1;
this->len = 0;
}
BieuThuc::~BieuThuc(void){}
void BieuThuc::nhap() {
char s[20];
12
Project 1
}
fflush(stdin);
gets(s);
strcpy(this->chuoibt, s);
MaTran BieuThuc::getMaTran(char* name) {
for(int i=0; i<this->cuoi; i++)
if(strcmp(this->data[i].name, name)==0)
return this->data[i];
cout<<"Not Found!"<
MaTran B;
return B;
}
void BieuThuc::phanTich() {
int l = strlen(this->chuoibt);
int i=0, j;
int n=-1;
char tmp[10];
while(i
for(int k = 0; k<10; k++) tmp[k] = '\0';
== '.'){
if(isdigit(this->chuoibt[i])){
j=0;
while(isdigit(this->chuoibt[i]) || this->chuoibt[i]
tmp[j] = this->chuoibt[i];
++i;
++j;
}
n++;i--;
strcpy(this->mang[n], tmp);
for(int k = 0; k<10; k++) tmp[k] = '\0';
}
if(islower(this->chuoibt[i])){
j=0;
while(islower(this->chuoibt[i])){
tmp[j] = this->chuoibt[i];
++i;
++j;
}
n++;
strcpy(this->mang[n], tmp);
for(int k = 0; k<10; k++) tmp[k] = '\0';
}
}
if(this->chuoibt[i]=='+' || this->chuoibt[i]=='-' ||
this->chuoibt[i]=='*' || this->chuoibt[i] == '/'){
tmp[0] = this->chuoibt[i];
n++;
strcpy(this->mang[n], tmp);
for(int k = 0; k<10; k++) tmp[k] = '\0';
}
i++;
}
this->len=n+1;
void BieuThuc::tinh() {
if(strcmp(this->chuoibt, "")==0) cout<
else
if(this->len == 1 && islower(this->mang[0][0])) {
13
Project 1
if(strcmp(this->mang[0], "help")==0) {
cout<
========="<
cout<<
"|
Cu Phap
|
Chuc Nang
|"<
cout<<
"================================================================="<<
endl;
cout<<
"| new + ten ma tran | Tao ma tran
moi
|"<
cout<<
"| chv + ten ma tran | Chuyen vi ma tran
|"<
cout<<
"| ndao + ten ma tran | Lay ma tran nghich
dao
|"<
cout<<
"| detg + ten ma tran | Tinh dinh thuc theo
phuong phap Gauss |"<
cout<<
"| detq + ten ma tran | Tinh dinh thuc theo
phuong phap de quy |"<
cout<<
"| max + ten ma tran | Gia tri phan tu lon
nhat trong ma tran |"<
cout<<
"| min + ten ma tran | Gia tri phan tu nho
nhat trong ma tran |"<
cout<<
"| cramer
| Giai he phong trinh
pp cramer
|"<
cout<<
"| lu
| Giai he phong trinh
pp phan giai LU
|"<
cout<<
"| ans
| Ma tran answer
|"<
cout<<
"| list
| Liet ke cac ma tran
da nhap
|"<
cout<<
"| help
| Tro giup
|"<
cout<<
"| clear
| Xoa man hinh
|"<
cout<<
"| exit
| Thoat
|"<
cout<<
"================================================================="<
endl;
}
else if(strcmp(this->mang[0], "list")==0) {
for(int i=1; i<this->cuoi; i++)
cout<<" "<<this->data[i].name<
cout<
}
else if(strcmp(this->mang[0], "cramer")==0) {
HePhuongTrinh H;
H.nhap();
H.cramer();
H.xuat();
}
else if(strcmp(this->mang[0], "lu")==0) {
HePhuongTrinh H;
H.nhap();
H.giaiLU();
H.xuat();
}
else if(strcmp(this->mang[0], "clear")==0) system("cls");
else if(strcmp(this->mang[0], "exit")==0);
else if(strcmp(this->mang[0], "ans")==0){
this->data[0].xuat();
cout<
}
14
Project 1
else {
if(cuoi!=0) {
int k=0;
for(int i=0; i<this->cuoi; i++)
if(strcmp(this->data[i].name, this->mang[0])==0) {
this->getMaTran(this->mang[0]).xuat();
cout<
k++;break;
}
if(k==0) cout<<"Error!"<
}
else cout<<"Error!"<
}
}
else
if(this->len == 2) {
if(strcmp(this->mang[0], "new")==0 && islower(this>mang[1][0])) {
int k=0;
int m, n;
cout<
cout<<" So cot : "; cin>>n;
cout<
for(int i=0; i<this->cuoi; i++)
if(strcmp(this->data[i].name, this->mang[1])==0) {
this->data[i].giaiPhong();
this->data[i] = MaTran(m, n, mang[1]);
this->data[i].nhap();
k++;
break;
}
if(k==0){
this->data[cuoi] = MaTran(m, n, mang[1]);
this->data[cuoi].nhap();
cuoi++;
}
}
else if(strcmp(this->mang[0], "detg")==0 && islower(this>mang[1][0])) {
cout<
mang[1]).detG()<}
else if(strcmp(this->mang[0], "detq")==0 && islower(this>mang[1][0])) {
cout<mang[1]).detQ()<}
else if(strcmp(this->mang[0], "min")==0 && islower(this>mang[1][0])) {
cout<this->getMaTran(this->mang[1]).min();
cout<}
else if(strcmp(this->mang[0], "max")==0 && islower(this>mang[1][0])) {
cout<this->getMaTran(this->mang[1]).max();
cout<}
else if(strcmp(this->mang[0], "ndao")==0 && islower(this>mang[1][0])) {
this->getMaTran(this->mang[1]).nghichDao().xuat();
this->getMaTran(this->mang[1]).nghichDao().copyto(this>data[0]);
15
Project 1
}
else if(strcmp(this->mang[0], "chv")==0 && islower(this>mang[1][0])) {
this->getMaTran(this->mang[1]).chuyenVi().xuat();
this->getMaTran(this->mang[1]).chuyenVi().copyto(this>data[0]);
}
}
else
if(this->len == 3) {
if(islower(this->mang[0][0]) && islower(this->mang[2][0])) {
switch(this->mang[1][0]){
case '+':
(getMaTran(mang[0])+getMaTran(mang[2])).xuat();
(getMaTran(mang[0])+getMaTran(mang[2])).copyto(this->data[0]);
break;
case '-':
(getMaTran(mang[0])getMaTran(mang[2])).xuat();
(getMaTran(mang[0])getMaTran(mang[2])).copyto(this->data[0]);
break;
case '*':
(getMaTran(mang[0])*getMaTran(mang[2])).xuat();
(getMaTran(mang[0])*getMaTran(mang[2])).copyto(this->data[0]);
break;
case '/':
(getMaTran(mang[0])/getMaTran(mang[2])).xuat();
(getMaTran(mang[0])/getMaTran(mang[2])).copyto(this->data[0]);
break;
}
}
else if(islower(this->mang[0][0]) && isdigit(this->mang[2][0])
&& this->mang[1][0]=='*') {
(getMaTran(mang[0])*atof(this->mang[2])).xuat();
(getMaTran(mang[0])*atof(this->mang[2])).copyto(this>data[0]);
}
else if(islower(this->mang[2][0]) && isdigit(this->mang[0][0])
&& this->mang[1][0]=='*') {
(getMaTran(mang[2])*atof(this->mang[0])).xuat();
(getMaTran(mang[2])*atof(this->mang[0])).copyto(this>data[0]);
}
else if(islower(this->mang[0][0]) && isdigit(this->mang[2][0])
&& this->mang[1][0]=='/') {
(getMaTran(mang[0])/atof(this->mang[2])).xuat();
(getMaTran(mang[0])/atof(this->mang[2])).copyto(this>data[0]);
}
}
else
}
cout<<"Error!"<
16
Project 1
//Lop HePhuongTrinh
#include "HePhuongTrinh.h"
#include <iostream>
using namespace std;
HePhuongTrinh::HePhuongTrinh(void){}
HePhuongTrinh::~HePhuongTrinh(void){}
void HePhuongTrinh::nhap() {
int m, n;
cout<cout<<" So phuong trinh: "; cin>>m;
cout<this->A = MaTran(m, n, "A");
this->b = MaTran(m, 1, "b");
this->L = MaTran(m, n, "L");
this->U = MaTran(m, n, "U");
for(int i=0; ifor(int j=0; jcout<<" a"<cin>>this->A.data[i][j];
this->L.data[i][j] = 0;
this->U.data[i][j] = 0;
}
cout<<" b"<cin>>this->b.data[i][0];
cout<
}
}
void HePhuongTrinh::cramer() {
if(this->A.laVuong()) {
float det = this->A.detG();
if(det != 0) {
this->x = MaTran(this->b.rows, 1, "x");
for(int i=0; ix.data[i][0] = A.boCot(i, b).detG() / det;
}
else {
cout<<"Co nghiem khong tam thuong!"<this->x = MaTran();
}
}
else
cout<<"He khong tuong thich!"<}
void HePhuongTrinh::phanRaLU()
int n = this->A.rows;
for(int k =0; kthis->L.data[k][k]
this->U.data[k][k]
{
{
= 1;
= this->A.data[k][k];
for(int i=k+1; i
this->L.data[i][k] = this->A.data[i][k] / this->U.data[k][k];
this->U.data[k][i] = this->A.data[k][i];
}
for(int i = k+1; ifor(int j = k+1; j
17
Project 1
}
this->A.data[i][j] -= this->L.data[i][k] * this->U.data[k][j];
}
void HePhuongTrinh::giaiHeTGD() {
int n = this->L.rows;
this->x = MaTran(this->b.rows, 1, "x");
for(int i = 0; iif(L.data[i][i]!=0) {
if (i==0)
x.data[i][0] = b.data[i][0] / L.data[i][i];
else {
x.data[i][0] = b.data[i][0];
for(int j=0; jx.data[i][0] -= L.data[i][j] * x.data[j][0];
x.data[i][0] /= L.data[i][i];
}
}
}
}
void HePhuongTrinh::giaiHeTGT() {
int n = this->A.rows;
for(int i = n-1; i>=0; i--) {
if (U.data[i][i]!=0) {
if (i==n-1)
x.data[i][0] = x.data[i][0] / U.data[i][i];
else {
for(int j=i+1; jx.data[i][0]-= U.data[i][j] * x.data[j][0];
x.data[i][0] /= U.data[i][i];
}
}
}
}
void HePhuongTrinh::giaiLU() {
if(this->A.laVuong()){
if(this->A.detG() != 0) {
phanRaLU();
giaiHeTGD();
giaiHeTGT();
}
else
cout<<"He co nghiem khong tam thuong!"<}
else
cout<<"He khong tuong thich!"<}
void HePhuongTrinh::xuat() {
cout<
this->x.xuat();
}
//Ham Main
#include
#include
#include
#include
#include
#include
"MaTran.h"
<string.h>
"BieuThuc.h"
"HePhuongTrinh.h"
<conio.h>
<iostream>
18
Project 1
using namespace std;
int main()
{
BieuThuc BT = BieuThuc();
system("color F5");
while(strcmp(BT.chuoibt, "exit") != 0) {
cout<<">> ";
BT.nhap();
BT.phanTich();
BT.tinh();
}
}
return 0;
Chương 2: XÂY DỰNG CHƯƠNG TRÌNH MINH HỌA
19
Project 1
20
Project 1
21
Project 1
22
Project 1
Chương 3: KẾT LUẬN
1.1. Ưu nhược điểm
1.1.1.
Ưu điểm
Chương trình đã đáp ứng đầy đủ yêu cầu bài toán đề ra.
Ngồi ra, chương trình cịn hỗ trợ các thao tác cơ bản với ma
trận như tính tổng hai ma trận, hiệu hai ma trận, tích hai ma trận,
thương hai ma trận, nhân ma trận với một số, chia ma trận với
một số, tính phân tử nhỏ nhất, lớn nhất của ma trận,…
1.1.2.
Nhược điểm
Vẫn còn một số lỗi chưa khắc phục được.
1.2. Hướng dẫn sử dụng
- Chương trình được viết bởi Microsoft Visual C++ 2008 Express
Edition.
- Dùng lệnh help để biết các câu lệnh sử dụng.
- Các phép tính với ma trận thì nhập như tính tốn thơng thường.
23
Project 1
Quảng cáo
Ứng dụng tạo video hoạt hình trên điện thoại
/>
Tải bản dành cho điện thoại Android
/>
Hoặc quét mã QR
24