Nội dung bài viết
Ẩn
Đề bài
Viết chương trình tính toán trên phân số với các tính năng sau:
- Cộng phân số
- Mô tả: thực hiện cộng một chuỗi các phân số
- Mô tả tương tác:
- Nhập lệnh từ terminal: ./frac add [<ps1> <ps2>…,<psn>]
- Tính tổng các phân số <ps1>+<ps2>+…+<psn> và in ra màn hình
- Ví dụ: ./frac add 1/2 1/3 3/2 -> kết quả là 7/3
- Trừ phân số
- Mô tả: thực hiện trừ một chuỗi các phân số
- Mô tả tương tác:
- Nhập lệnh từ terminal: ./frac sub [<ps1> <ps2>…,<psn>]
- Tính hiệu các phân số <ps1>-<ps2>-…-<psn> và in ra màn hình
- Ví dụ: ./frac sub 1/2 1/3 3/2 -> kết quả là -4/3 hoặc 4/-3
- Nhân phân số
- Mô tả: thực hiện nhân một chuỗi các phân số
- Mô tả tương tác:
- Nhập lệnh từ terminal: ./frac multi [<ps1> <ps2>…,<psn>]
- Tính tích các phân số <ps1>*<ps2>*…*<psn> và in ra màn hình
- Ví dụ: ./frac multi 1/2 1/3 3/2 -> kết quả là 1/4
- Chia phân số
- Mô tả: thực hiện chia một chuỗi các phân số
- Mô tả tương tác:
- Nhập lệnh từ terminal: ./frac div [<ps1> <ps2>…,<psn>]
- Tính thương các phân số <ps1>/<ps2>/…/<psn> và in ra màn hình
- Ví dụ: ./frac div 1/2 1/3 3/2 -> kết quả là 1
Source code
#include <iostream>
#include "Fraction.hpp"
#include <string>
int main(int argc, char* argv[])
{
std::string action = argv[1];
Fraction* fracs = new Fraction[argc];
int count = argc - 2;
for (auto i = 0; i < count; i++)
fracs[i].fromString(argv[i + 2]);
Fraction res;
if (action == "add")
{
for (auto i = 0; i < count; i++)
res = Fraction::add(res, fracs[i]);
}
else if (action == "sub")
{
res = fracs[0];
for (auto i = 1; i < count; i++)
res = Fraction::sub(res, fracs[i]);
}
else if (action == "multi")
{
res.setNum(1);
for (auto i = 0; i < count; i++)
res = Fraction::multi(res, fracs[i]);
}
else if (action == "div")
{
res = fracs[0];
for (auto i = 1; i < count; i++)
res = Fraction::div(res, fracs[i]);
}
res.print();
return 0;
}
#ifndef Fraction_hpp
#define Fraction_hpp
#include <string>
class Fraction
{
private:
int numerator;
int denominator;
public:
// constructor
Fraction();
// getter
int getNum() const;
int getDeno() const;
// setter
void setNum(int n);
void setDeno(int n);
// methods
void fromString(std::string str);
void simplify();
void print();
// static methods
static Fraction add(Fraction& fr1, Fraction& fr2);
static Fraction sub(Fraction& fr1, Fraction& fr2);
static Fraction multi(Fraction& fr1, Fraction& fr2);
static Fraction div(Fraction& fr1, Fraction& fr2);
};
#endif
#include <iostream>
#include <string>
#include "Fraction.hpp"
Fraction::Fraction()
{
numerator = 0;
denominator = 1;
}
int Fraction::getNum() const
{
return numerator;
}
int Fraction::getDeno() const
{
return denominator;
}
void Fraction::setNum(int n)
{
numerator = n;
}
void Fraction::setDeno(int n)
{
if (n != 0)
denominator = n;
}
void Fraction::fromString(std::string str)
{
int splashPos = str.find('/');
std::string strNum = str.substr(0, splashPos);
std::string strDeno = str.substr(splashPos + 1, str.length() - splashPos - 1);
setNum(std::stoi(strNum));
setDeno(std::stoi(strDeno));
}
int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a % b);
}
void Fraction::simplify()
{
int num = getNum();
int deno = getDeno();
int t = gcd(num, deno);
setNum(num / t);
setDeno(deno / t);
}
void Fraction::print()
{
simplify();
int num = getNum();
int deno = getDeno();
if (num % deno == 0)
std::cout << num / deno;
else
std::cout << num << '/' << deno;
}
Fraction Fraction::add(Fraction& fr1, Fraction& fr2)
{
Fraction frac;
frac.setNum(fr1.getNum() * fr2.getDeno() + fr2.getNum() * fr1.getDeno());
frac.setDeno(fr1.getDeno() * fr2.getDeno());
return frac;
}
Fraction Fraction::sub(Fraction& fr1, Fraction& fr2)
{
fr2.setNum(-fr2.getNum());
return add(fr1, fr2);
}
Fraction Fraction::multi(Fraction& fr1, Fraction& fr2)
{
Fraction frac;
frac.setNum(fr1.getNum() * fr2.getNum());
frac.setDeno(fr1.getDeno() * fr2.getDeno());
return frac;
}
Fraction Fraction::div(Fraction& fr1, Fraction& fr2)
{
Fraction frac;
frac.setNum(fr1.getNum() * fr2.getDeno());
frac.setDeno(fr1.getDeno() * fr2.getNum());
return frac;
}