Just My Life & My Work

[C++&C] 計算通話費

這是阿貞的作業,我幫他寫XD~希望他自己有空練習練習,雖然說電機系很少寫程式,但是若會寫程式的話,會比別人強好多,況且會寫程式的人可以創造更多自己的東西,會很有成就感的!

題目:通話費計算
某家電信業者通話費共分四種月租費,分別有186、386、586、986四種類型,使用者可以只能任選一種來計費。使用月租費可以抵通話費,通話費若未超過月租費以月租費繳。若超過月租費則有折扣,折扣方式如下表。 現在請你們要撰寫一個程式來計算要繳納的費用,使用者輸入月租費的型式及通話時間,通話時間以秒數計算,經由程式計算後會輸出該繳納之費用以元計算單位,個位數以下小數點四捨五入。以下為,月租費折扣表:
月租費    通話費率    超過月租費1倍(包含1倍)以上之折扣
186元    0.09元/秒    8折
386元    0.08元/秒    7折
586元    0.07元/秒    6折
986元    0.06元/秒    5折
程式執行說明:
輸入:386 36000
輸出:2016
第一個數值表示月租費型式是選擇386元,第二個數值為通話時間36000秒,其中通話費為0.08*36000 = 2880元,2880大於等於2*386一倍以上,因此再給予0.8的折扣,通話費就變成2016元。

我的C++程式碼如下:

/**
	Theme: 計算通話費
	Compiler: Dev C++ 4.9.9.2
	Date: 100/04/25
	Author: ShengWen
	Blog: https://cg2010studio.wordpress.com/
*/
#include<iostream>
using namespace std;
enum MonthRent{C186=186,C386=386,C586=586,C986=986};
enum Rate{R009=9,R008=8,R007=7,R006=6};
enum Discount{D08=8,D07=7,D06=6,D05=5};
int main(){
	int choice, second;
	double money;
	while(true){
		cout<<"請輸入月租費和秒數: ";
		cin>>choice>>second;
		switch(choice){
			case C186:
				money=second*R009*0.01;
				if(money>=2*C186)
					money*=D08*0.1;
				if(money<=C186)
					money=C186;
				break;
			case C386:
				money=second*R008*0.01;
				if(money>=2*C386)
					money*=D07*0.1;
				if(money<=C386)
					money=C386;
				break;
			case C586:
				money=second*R007*0.01;
				if(money>=2*C586)
					money*=D06*0.1;
				if(money<=C586)
					money=C586;
				break;
			case C986:
				money=second*R006*0.01;
				if(money>=2*C986)
					money*=D05*0.1;
				if(money<=C986)
					money=C986;
				break;
			default:
				cout<<"Wrong!!"<<endl;
				money=0;
		}
		cout<<money<<endl;
	}
	return EXIT_SUCCESS;
}

執行結果:

請輸入月租費和秒數: 100 500
Wrong!!
0
請輸入月租費和秒數: 186 100
186
請輸入月租費和秒數: 386 36000
2016
請輸入月租費和秒數: 586 10000
700
請輸入月租費和秒數:

我使用enum來定義常數,但是只能定義整數常數,所以在case裡再乘以0.010.1。以上3個case都有測試,還有未定義也有輸出錯誤訊息。

以下程式碼是阿那達用C寫的:

#include <stdio.h>
#include <stdlib.h>

int main(void){
	int type,     /*月租費的型式*/
		 seconds,  /*通話時間*/
		 fee;
	float discount_table[][3]={{186,0.09,0.8},{386,0.08,0.7},{586,0.07,0.6},{986,0.06,0.5}};
	printf("請輸入月租費的型式,通話時間(秒):");
	while(fscanf(stdin, "%d,%d", &type, &seconds)==2){
		switch(type){
			case 186:
				if((fee=discount_table[0][1]*seconds)>=2*186){
					fee*=discount_table[0][2];
					printf("通話費為:%d 元\n",fee);
				}else if(fee > type){
					printf("通話費為:%d 元\n",fee );
				}else{
					printf("通話費為:%d 元\n",type );
				}
				break;
			case 386:
				if((fee=discount_table[1][1]*seconds)>=2*386){
					fee*=discount_table[1][2];
					printf("通話費為:%d 元\n",fee);
				}else if(fee > type){
					printf("通話費為:%d 元\n",fee );
				}else{
					printf("通話費為:%d 元\n",type );
				}
				break;
			case 586:
				if((fee=discount_table[2][1]*seconds)>=2*586){
					fee*=discount_table[2][2];
					printf("通話費為:%d 元\n",fee);
				}else if(fee > type){
					printf("通話費為:%d 元\n",fee );
				}else{
					printf("通話費為:%d 元\n",type );
				}
				break;
			case 986:
				if((fee=discount_table[3][1]*seconds)>=2*986){
					fee*=discount_table[3][2];
					printf("通話費為:%d 元\n",fee);
				}else if(fee > type){
					printf("通話費為:%d 元\n",fee );
				}else{
					printf("通話費為:%d 元\n",type );
				}
				break;
		}
		printf("\n請輸入月租費的型式,通話時間(秒):");
	}
	system("pause");
	return 0;
}

程式結果如:

請輸入月租費的型式,通話時間(秒):100,500

請輸入月租費的型式,通話時間(秒):186,100
通話費為:186 元

請輸入月租費的型式,通話時間(秒):386,36000
通話費為:2015 元

請輸入月租費的型式,通話時間(秒):586,10000
通話費為:700 元

請輸入月租費的型式,通話時間(秒):

看來也不錯!注意輸入的格式喔~2015和2016有誤差,大概是宣告的型態不一樣,所以計算的精準度也就有差異了!

隨意留個言吧:)~

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

標籤雲

%d 位部落客按了讚: