SLIDE1

Monday, February 2, 2015

[OOP C++] Tính Tổng, Hiệu, Tích, Thương của 2 phân số theo kiểu lập trình hướng đối tượng

[OOP C++] Tính Tổng, Hiệu, Tích, Thương của 2 phân số theo kiểu lập trình hướng đối tượng. có menu lựa chọn, nhập phân số kiểu string thuận tiện.



PHANSO.H
#pragma once
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
class phanso
{
private:
int tu,mau;
public:
phanso(void);
~phanso(void);
int gettu(); //trả về giá trị của tử số.
int getmau(); //trả về giá trị của mẫu số.
void settu(int); //cà đặt giá trị cho tử và mẫu
void setmau(int);
void nhapphanso();
void xuatphanso();
int rutgon();
// các phương thức tính tổng, hiệu, tích, thương của phân số ta đang viết class với phân số khác
//cũng là phân số thuộc đối tượng phanso nhưng nó nằm ngoài phạm vi hoạt động của class ta đang xây dựng nên phải có các phương thức get,set như trên để giao tiếp với nó
void tinhtong(phanso);
void tinhtich(phanso);
void tinhhieu(phanso);
void tinhthuong(phanso);
};




PHANSO.CPP
#include "phanso.h"
phanso::phanso(void) //khởi tạo đối tượng mặ định.
{
//nếu biến trong private là kiểu con trỏ thì cấp phát vùng nhớ khởi tạo cho nó ở đây.
}
phanso::~phanso(void)//kết thúc nội đối tượng
{
//nếu biến trong private là cấp phát động thì delete nó ở đây.
}
void phanso::nhapphanso()
{
char s[100],a[100];
int i,j,k;
do{
k=0;
cout<<"\nnhap vao phan so dang a/b: ";
fflush(stdin); gets(s);
//phân số nhập vào đảm bảo phải chứa 1 dấu '/' và số, nếu sai thì nhập không đúng định dạng yêu cầu nhập lại.
int dem=0,d=0;
for(i=0;i<strlen(s);i++)
{
if((s[i]>='0' && s[i]<='9')|| s[i]=='/') dem++;
if(s[i]=='/') d++; //đếm số dấu '/', nếu có 2 dấu trở lên thì nhập sai.
}
if(dem!=strlen(s) || d!=1) // có nghĩa là đã xuất hiện ký tự không đúng yêu cầu, có thể là chữ, kí hiệu đặc biệt,...
{
cout<<"\nban da nhap khong dung dinh dang! nhap lai!";
k=1; // để lặp lại việc nhập phân số.
}
}while(k);

//lấy tử số là các chữ số nằm trước dấu '/'.
i=0;
while(s[i]!='/')
{
a[i]=s[i];
i++;
}
a[i]='\0';
tu=atoi(a);
k=0;
for(j=i+1;j<strlen(s);j++) a[k++]=s[j];
a[k]='\0';
mau=atoi(a);
}
void phanso::xuatphanso()
{
cout<<tu<<"/"<<mau;
}
int phanso::gettu()
{
return tu;
}
int phanso::getmau()
{
return mau;
}
void phanso::settu(int x)
{
tu=x;
}
 void phanso::setmau(int x)
{
mau=x;
}
int phanso::rutgon()//rút gọn phan số
{
//tìm UCLN rồi lấy tử và mẫu chia cho UCLN để rút gọn phân số.
int a=abs(tu),b=abs(mau);
while(a!=b)
if(a>b)a-=b;
else b-=a;

tu/=a;
mau/=a;
if(a!=1) return 1; //có rút gọn
return 0;//không xảy ra rút gọn
}
void phanso::tinhtong(phanso x)
{
phanso kq;
kq.settu(tu*x.getmau()+mau*x.gettu());// gán giá trị cho tử của phấn số kết quả thông qua phương thức settu đã tạo ở trên. tương tự cho mẫu.
kq.setmau(mau*x.getmau());
//in ket qua
cout<<"\n";xuatphanso();cout<<" + ";x.xuatphanso();cout<<" = ";kq.xuatphanso();
//nếu có rút gọn thì in kết quả đã rút gọn ra
if(kq.rutgon()) 
{
cout<<" = ";kq.xuatphanso();
}
cout<<"\n";
}
void phanso::tinhhieu(phanso x)
{
phanso kq;
kq.settu(tu*x.getmau()-mau*x.gettu());
kq.setmau(mau*x.getmau());
//in ket qua
cout<<"\n";xuatphanso();cout<<" - ";x.xuatphanso();cout<<" = ";kq.xuatphanso();
//nếu có rút gọn thì in kết quả đã rút gọn ra
if(kq.rutgon()) 
{
cout<<" = ";kq.xuatphanso();
}
cout<<"\n";
}
void phanso::tinhtich(phanso x)
{
phanso kq;
kq.settu(tu*x.gettu());
kq.setmau(mau*x.getmau());
//in ket qua
cout<<"\n";xuatphanso();cout<<" x ";x.xuatphanso();cout<<" = ";kq.xuatphanso();
//nếu có rút gọn thì in kết quả đã rút gọn ra
if(kq.rutgon()) 
{
cout<<" = ";kq.xuatphanso();
}
cout<<"\n";
}
void phanso::tinhthuong(phanso x)
{
phanso kq;
kq.settu(tu*x.getmau());
kq.setmau(mau*x.gettu());
//in ket qua
cout<<"\n";xuatphanso();cout<<" : ";x.xuatphanso();cout<<" = ";kq.xuatphanso();
//nếu có rút gọn thì in kết quả đã rút gọn ra
if(kq.rutgon()) 
{
cout<<" = ";kq.xuatphanso();
}
cout<<"\n";

}



SOURCE.CPP
#include"phanso.h"
void main()
{
phanso x,y;
cout<<"\n\t*nhap phan so x*\n";
x.nhapphanso();
cout<<"\n\t*nhap phan so y*\n";
y.nhapphanso();
int k,kt;
do{
do{
kt=0;
cout<<"\n------------------MENU------------------";
cout<<"\n1. tinh TONG 2 phan so x,y.";
cout<<"\n2. tinh HIEU 2 phan so x,y.";
cout<<"\n3. tinh TICH 2 phan so x,y.";
cout<<"\n4. tinh THUONG 2 phan so x,y.";
cout<<"\n0.ket thuc chuong trinh.";
cout<<"\n-----------------------------------------";
cout<<"\n->lua chon cua ban: ";
cin>>k;
//kiểm tra lựa chọn có hợp lý không.
if(k!=0 && k!=1 && k!=2 && k!=3 && k!=4)
{
cout<<"\nlua chon khong hop le! chon lai!!!\n";
kt=1;//để lặp lại việc nhập.
}
}while(kt);
//lựa chọn hợp lý thì tiến hành lựa chọn đó.
if(k==1)
{
cout<<"\n\t*TONG*\n";
x.tinhtong(y);//gọi các phương thúc cần dùng ra.
}
if(k==2)
{
cout<<"\n\t*HIEU*\n";
x.tinhhieu(y);
}
if(k==3)
{
cout<<"\n\t*TICH*\n";
x.tinhtich(y);
}
if(k==4)
{
cout<<"\n\t*THUONG*\n";
x.tinhthuong(y);
}
}while(k!=0);//dừng chương trình khi k=0. lựa chọn kết thúc trong menu ở trên
system("pause");

}