【C++課程設計】購買到最多的巧克力

題目:

  假設我們可以從自動售貨機購買巧克力,一次1美元。每塊巧克力都有一個優惠券。我們可以從自動售貨機用7張優惠券兌換一塊巧克力。我們想知道一點:如果我們有n美元,那麼一共能夠吃到多少塊巧克力,包括優惠券兌換到的巧克力,以及還有多少張富餘的優惠券。
  例如,如果我們有20美元,我們最開始用20美元購買20塊巧克力。這樣一來,我們可以獲得20張優惠券。14張優惠券可以兌換2塊巧克力。這兩塊巧克力又含有兩張優惠券,所以,再加上最初剩下的6張優惠券,就一共有8張優惠券。這樣一來,我們又可以用其中的7張優惠券兌換最後一塊巧克力。最後,我們得到23塊巧克力和兩張富餘的優惠券。
  進一步,如果更改了自動售貨機兌換一塊巧克力所需的優惠券張數,比如由7張改爲需要9張才能進行兌換。因此你需要解決這樣一個問題,有n美元,m張優惠券兌換一塊巧克力。
  針對這個問題寫一個遞歸解決方案,從用戶那裏接受購買巧克力所花的美元數,然後輸出花完這些錢後所得的巧克力塊數,並儘量多換優惠券。編寫的遞歸函數將基於所得到的優惠券的數量。

源碼:

#include <iostream>
using namespace std;

//巧克力類
class Chocolate {
private:
	double moneyCost;	//消費的美元數
	double ticketCost;	//消費優惠券
	double awardTicket; //每塊巧克力獎勵多少

public:
	Chocolate(double mCost, double tCost, double award) {
		this->moneyCost = mCost;
		this->ticketCost = tCost;
		this->awardTicket = award;
	}

	double getMoneyCost() {
		return moneyCost;
	}

	double getTicketCost() {
		return ticketCost;
	}

	double getAward() {
		return awardTicket;
	}
};

//客戶類
class Custome {
private:
	double money; //擁有美元數
	double ticket; //擁有優惠券數

public:
	Custome(double money, double ticket) {
		this->money = money;
		this->ticket = ticket;
	}

	//用美元購買一次巧克力
	void buyByMoney(Chocolate cho) {
		money -= cho.getMoneyCost();
		ticket += cho.getAward();
	}

	//用優惠券購買一次巧克力
	void buyByTicket(Chocolate cho) {
		ticket = ticket - cho.getTicketCost() + cho.getAward();
	}

	//非費遞歸算法:獲取用戶最多可得到的巧克力數
	/*double getMaxChocolate(Chocolate cho) {
		double count = 0;
		while (money >= cho.getMoneyCost())
		{
			buyByMoney(cho);
			count++;
		}
		while (ticket >= cho.getTicketCost())
		{
			buyByTicket(cho);
			count++;
		}
		return count;
	}*/

	//遞歸算法:獲取用戶最多可得到的巧克力數
	double getMaxChocolate(Chocolate cho) {
		double count = 0;

		//遞歸出口
		if (money < cho.getMoneyCost() && ticket < cho.getTicketCost())
			return count;

		if (money >= cho.getMoneyCost()) {
			buyByMoney(cho);
			count++;
		}

		if (ticket >= cho.getTicketCost()) {
			buyByTicket(cho);
			count++;
		}

		return count + getMaxChocolate(cho);
	}
};

int main() {
	double c_dollar, c_ticket, c_award;
	cout << "請分別輸入每塊巧克力消費的美元或優惠券,以及每塊巧克力獎勵多少優惠券:" << endl;
	cout << "美元:";
	cin >> c_dollar;
	cout << "優惠券:";
	cin >> c_ticket;
	cout << "獎勵優惠券:";
	cin >> c_award;

	Chocolate cho(c_dollar, c_ticket, c_award);	//創建巧克力對象

	double m_dollar, m_ticket;
	cout << "你擁有多少美元或優惠券:" << endl;
	cout << "美元:";
	cin >> m_dollar;
	cout << "優惠券:";
	cin >> m_ticket;

	Custome custome(m_dollar, m_ticket);	//創建用戶對象

	if (c_ticket > c_award) {
		double count = custome.getMaxChocolate(cho);
		cout << "你最多可以買到 " << count << " 塊巧克力。" << endl;
	}
	else
	{
		cout << "店家送的比賣的還多,你把巧克力店買倒閉了!!!" << endl;
	}
	system("pause");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章