Các phép toán cơ bản trên phân số [Bài tập C++]

Nội dung bài viết Ẩn
Các phép toán cơ bản trên phân số [Bài tập C++] | Khiêm Lê

Đề 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:
      1. Nhập lệnh từ terminal: ./frac add [<ps1> <ps2>…,<psn>]
      2. Tính tổng các phân số <ps1>+<ps2>+…+<psn> và in ra màn hình
      3. 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:
      1. Nhập lệnh từ terminal: ./frac sub [<ps1> <ps2>…,<psn>]
      2. Tính hiệu các phân số <ps1>-<ps2>-…-<psn> và in ra màn hình
      3. 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:
      1. Nhập lệnh từ terminal: ./frac multi [<ps1> <ps2>…,<psn>]
      2. Tính tích các phân số <ps1>*<ps2>*…*<psn> và in ra màn hình
      3. 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:
      1. Nhập lệnh từ terminal: ./frac div [<ps1> <ps2>…,<psn>]
      2. Tính thương các phân số <ps1>/<ps2>/…/<psn> và in ra màn hình
      3. 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;
}
Bài viết liên quan
Dãy Fibonacci [Bài tập Python]
Fibonacci-bai-tap-python

Tìm hiểu về dãy Fibanacci, các thuật toán tính số Fibanacci trong Python

Định nghĩa class CHAR và STRING trong C++ [Bài tập OOP]
Giai-bai-tap-OOP-cpp

Giải bài tập OOP: định nghĩa class CHAR và STRING trong C++

Quản lý nhân viên bằng danh sách liên kết đơn [Bài tập C++]
Quan-ly-nhan-vien-bang-danh-sach-lien-ket-don-bai-tap-cpp

Quản lý nhân viên bằng danh sách liên kết đơn

Quản lý sinh viên [Bài tập C++]
Quan-ly-sinh-vien-cpp

Video và source cách giải bài quản lý sinh viên chi tiết bằng C++

guest
0 Comments
Inline Feedbacks
View all comments