Đây là một dạng bài tập cơ bản giúp cho việc luyện tập lập trình C/C++, cũng như nẵm rõ lập trình hướng đối tượng hơn.
Ma trận trong lập trình hướng đối tượng OOP C/C++
Trong bài viết này mình sẽ hướng dẫn các bạn giải bài toán Ma trận trong C/C++ với OOP. Một số ý trong bài này sẽ bao gồm tạo class Ma Trận, định nghĩa các thuộc tính và phương thức ban đầu cho lớp Ma trận, viết code xử lý nhập xuất ma trận, kiểm tra ma trận, cộng 2 ma trận và nhân 2 ma trận.
Xây dựng lớp Ma trận với các thuộc tính và phương thức ban đầu
Một ma trận trên C/C++ sẽ được biểu diễn bằng một mảng 2 chiều gồm n dòng và m cột. Vậy chúng ta sẽ định nghĩa lớp ma trận như sau:
//Khái báo lớp Ma trận
class Matrix{
//Thuộc tính ta sẽ để phạm vi truy caapjlaf private để che đậy thông tin
private:
int n; //Ma trận gồm n dòng
int m; //m cột
int A[100][100]; //Khai báo mảng A để biểu diễn ma trận gồm tối đa 100 dòng và 100 cột
};
Sau khi khai báo lớp Ma trận với các thuộc tính cần thiết mà chưa có các phương thức, chúng ta sẽ cần xây dựng các phương thức để thực hiện các nhiệm vụ tương ứng như đã nêu bên trên cho lớp Phân số.
class Matrix{
private:
int n;
int m;
int A[100][100];
//Phương thức chúng ta sẽ để chế độ public
public:
//2 phương thức khởi tạo (constructor) có tham số và không có thăm số
Matrix(){};
Matrix(int n, int m, int A[][100]){
this->n = n;
this->m = m;
for(int i = 0;i<n;i++){
for(int j = 0; j<n; j++){
this->A[i][j] = A[i][j];
}
}
}
//Phương thức kiểm tra ma trận hiện tại có bằng ma trận truyền vào
bool sameSize(Matrix b){
}
//Phương thức này kiểm tra xem số cột ma trận này có bằng số hàng ma trận truyền vào
bool checkCanMultiply(Matrix b){
}
//Phương thức nhập ma tran
void nhap(){
}
//Phương thức xuất ma tran
void xuat(){
}
//2 phương thức cộng và nhân ma tran sẽ có kiểu trả về là 1 Ma trận
Matrix cong(Matrix b){
}
Matrix nhan(Matrix b){
}
//Các phương thức get và set => Để lấy và thay đổi giá trị của thuộc tính
void setN(int n){
this->n = n;
}
void setM(int m){
this->m = m;
}
void setElementMattrix(int value, int i, int j){
this->A[i][j] = value;
}
int getN(){
return this->n;
}
int getM(){
return this->m;
}
int getElementMattrix(int i, int j){
return this->A[i][j];
}
};
Về cơ bản cấu trúc lớp Mattrix sẽ như vậy, bây giờ chúng ta sẽ cùng đi viết code cho từng phương thức.
Xây dựng phương thức nhập xuất cho Ma trận
Nếu bạn đã học tới OOP thì phần nhập xuất cơ bản bạn đã nắm rõ nên mình sẽ không giải thích gì nhiều, mà mình sẽ code luôn như sau:
#include <bits/stdc++.h>
using namespace std;
class Matrix{
private:
int n;
int m;
int A[100][100];
public:
Matrix(){};
Matrix(int n, int m, int A[][100]){
this->n = n;
this->m = m;
for(int i = 0;i<n;i++){
for(int j = 0; j<m; j++){
this->A[i][j] = A[i][j];
}
}
}
void nhap(){
cout<<"Nhap n (So hang): "; cin>>n;
cout<<"Nhap m (So cot): "; cin>>m;
cout<<"\n\nNhap ma tran\n";
for(int i = 0;i<n;i++){
for(int j = 0; j<m; j++){
cout<<"A["<<i<<"]["<<j<<"] = ";
cin>>this->A[i][j];
}
}
}
void xuat(){
for(int i = 0;i<n;i++){
for(int j = 0; j<m; j++){
cout<<this->A[i][j]<<" ";
}
cout<<"\n";
}
}
};
int main(){
Matrix A;
cout<<"\n\n--------------NHAP MA TRAN-----------\n";
A.nhap();
cout<<"\n\n--------------XUAT MA TRAN-----------\n";
A.xuat();
}
Và dưới đây là kết quả chạy thử đoạn chương trình
Xây dựng phương thức cộng 2 ma trận
Điều kiện để cộng 2 ma trận là 2 ma trận phải có cùng kích thước, tức là số hàng và số cột của hai ma trận phải bằng nhau. Cộng 2 ma trận này ta chỉ việc cộng các phần tử có cùng vị trí với nhau thành 1 ma trận.
Ta sẽ viết phương thức cộng 2 ma trận như sau
//Hàm cộng 2 ma trận
Matrix cong(Matrix b){
Matrix c; //Khai báo thêm ma trận c để tính tổng
for(int i = 0;i<this->n;i++){
for(int j = 0;j<this->m;j++){
c.A[i][j] = this->A[i][j] + b.A[i][j]; //kết quả thứ i, j chính bằng tổng phần tử vị trí thứ i, j của 2 ma trận
}
}
return c; //Trả về kq c là tổng 2 ma trận cho hàm
}
Xây dựng phương thức nhân 2 ma trận
Phép nhân hai ma trận chỉ thực hiện được khi số lượng cột trong ma trận thứ nhất phải bằng số lượng hàng trong ma trận thứ hai. Ma trận kết quả, được gọi là tích ma trận, có số lượng hàng của ma trận đầu tiên và số cột của ma trận thứ hai.
Nếu ma trận A có kích thước (m×n) và ma trận B có kích thước (n×p), thì ma trận tích C=A×B có kích thước (m×p), phần tử đứng ở hàng thứ i, cột thứ j xác định bởi công thức:
Vậy đã có công thức, ta viết phương thức nhân 2 ma trận như sau:
Matrix nhan(Matrix b){
Matrix c;
for(int i=0;i<this->n;i++)
for(int j=0;j<b.m;j++) {
int tt=0;
for(int k=0;k<this->m;k++)
{
tt = tt + (this->A[i][k] * b.A[k][j]); //Công th?c tính C[i][j]
}
c.A[i][j] = tt;
}
}
Xây dựng 2 phương thức kiểm tra ma trận
Phương thức kiểm tra 2 ma trận có kích thước bằng nhau
//Hàm kiểm tra ma trận hiện tại và ma trận truyền vào có kích thươc bằng nhau kh
bool sameSize(Matrix b){
//Nếu n và m của ma trận hiện tại và ma trận truyền vào đều bằng nhau thì 2 ma trận cùng kích thước
if(this->n == b.getN() && this->m == b.getM()) return true;
return false;
}
Phương thức kiểm tra số cột ma trận hiện tại có bằng số hàng ma trận truyền vào
//Phương thức kiểm tra số cột ma trận hiện tại có bằng số hàng ma trận truyền vào
bool checkCanMultiply(Matrix b){
//Lệnh if viết gon, tương đương nếu m hiện tại bằng n ma trận truyền vào trả về true và kg bằng thì trả về false
return this->m == b.getN() ? true:false;
}
Chương trình mẫu hoàn chỉnh
Qua các ý trên ta đã xây dựng hoàn thành tất cả phương thức cho lớp Ma trận, vậy ta ghép lại được chương trình chính như bên dưới.
#include <bits/stdc++.h>
using namespace std;
class Matrix{
private:
int n;
int m;
int A[100][100];
public:
Matrix(){};
Matrix(int n, int m, int A[][100]){
this->n = n;
this->m = m;
for(int i = 0;i<n;i++){
for(int j = 0; j<m; j++){
this->A[i][j] = A[i][j];
}
}
}
void nhap(){
cout<<"Nhap n (So hang): "; cin>>n;
cout<<"Nhap m (So cot): "; cin>>m;
cout<<"\n\nNhap ma tran\n";
for(int i = 0;i<n;i++){
for(int j = 0; j<m; j++){
cout<<"A["<<i<<"]["<<j<<"] = ";
cin>>this->A[i][j];
}
}
}
void xuat(){
for(int i = 0;i<n;i++){
for(int j = 0; j<m; j++){
cout<<this->A[i][j]<<" ";
}
cout<<"\n";
}
}
Matrix cong(Matrix b){
Matrix c;
for(int i = 0;i<this->n;i++){
for(int j = 0;j<this->m;j++){
c.A[i][j] = this->A[i][j] + b.A[i][j];
}
}
return c;
}
bool sameSize(Matrix b){
if(this->n == b.getN() && this->m == b.getM()) return true;
return false;
}
bool checkCanMultiply(Matrix b){
return this->m == b.getN() ? true:false;
}
Matrix nhan(Matrix b){
Matrix c;
for(int i=0;i<this->n;i++)
for(int j=0;j<b.m;j++) {
int tt=0;
for(int k=0;k<this->m;k++)
{
tt = tt + (this->A[i][k] * b.A[k][j]); //Công th?c tính C[i][j]
}
c.A[i][j] = tt;
}
}
void setN(int n){
this->n = n;
}
void setM(int m){
this->m = m;
}
void setElementMattrix(int value, int i, int j){
this->A[i][j] = value;
}
int getN(){
return this->n;
}
int getM(){
return this->m;
}
int getElementMattrix(int i, int j){
return this->A[i][j];
}
};
int main(){
Matrix A;
Matrix B;
cout<<"\n\n--------------NHAP MA TRAN A-----------\n";
A.nhap();
cout<<"\n\n--------------NHAP MA TRAN B-----------\n";
B.nhap();
cout<<"\n\n--------------XUAT MA TRAN A-----------\n";
A.xuat();
cout<<"\n--------------XUAT MA TRAN B-----------\n";
B.xuat();
cout<<"\n\n--------------CONG 2 MA TRAN-----------\n";
Matrix tong;
if(A.sameSize(B) == true){
tong = A.cong(B);
tong.xuat();
}else{
cout<<"\n=>Khong the cong 2 ma tran khong cung kich thuoc";
}
cout<<"\n\n--------------TICH 2 MA TRAN-----------\n";
Matrix tich;
if(A.sameSize(B) == true){
tich = A.nhan(B);
tich.xuat();
}else {
cout<<"\n=>Khong the cong 2 ma tran khong cung kich thuoc";
}
}
Kết quả chạy chương trình.
Cảm ơn bạn đã đọc hết bài viết! CHúc HọC TốT!
[Xem tất cả bài viết chủ đề C/C++ tại đây]
phần hàm contructor có tham số, mình thấy nó vô nghĩa thì phải
Nếu nói vô nghĩa thì là sai…chỉ là trong bài này thì mình không sử dụng tới.