2011-10-19 11 views
0

私がプログラムを実行してプレミアムを選択すると、それが実行され、それから通常のサービスのための機能も実行されます。問題はintのメインラインにあります。私は何を間違えたのですか? ITは私が問題をはっきりと説明しなかったと言いますが、どうしてここでそれを回避するためのテキストがあるのか​​わかりません。スイッチとファンクション

/************************************************/ 
/* Author:  Sam LaManna      */ 
/* Course:  CSC 135 Lisa Frye    */ 
/* Assignment: Program 3 Cell Phone Bill  */ 
/* Due Date: 10/20/2011      */ 
/* Filename: program3.cpp      */ 
/* Purpose: This program calculates and  */ 
/*    prints the bill for a cellular */ 
/*    telephone company    */ 
/************************************************/ 



//TODO: 
//Fix account number issue: large numbers cause intfinte loop. Maybe use string? 
//Complete premium and regular service calculation functions 
//Output function - Figure out how to print 



#include <iostream> //Basic input/output 
#include <iomanip>  //Manipulators 

using namespace std; 

void instruct();  //Function declaration for printing instructions 
int accnum();   //Function declaration for account number 
char servcode();  //Function declaration for service code 
float regserv();  //Function declaration for regular service 
float premserv (int& daymin, int& nightmin);  //Function declaration for premium service 
void output (float premiumserv, float regularserv);  //Function declaration for printing results 

int main() 
{ 
    int accountnum = 0;  //Var for account number 
    char servicecode = 'a';  //Var for service code 
    float premiumserv = 0;  //Var for premium service total 
    float regularserv = 0;  //Var for regular service total 
    int daymin = 0; 
    int nightmin = 0; 

    instruct();  //Function call to print instructions 

    accountnum = accnum();  //Function call to input account number 

    servicecode = servcode(); //Function call to get service code 

    switch(servicecode)  //Switch to determine which calc to use 
    { 
    case 'r': 
     break; 
    case 'R': 
    regserv(); 
     break; 
    case 'p': 
     break; 
    case 'P': 
    premserv (daymin, nightmin); 
     break; 
    } 

    premiumserv = premserv (daymin, nightmin);  //Function call for regular service 

    regularserv = regserv();  //Function call for premium service 

    cout <<"total" << premiumserv <<"day" << daymin << "night " << nightmin; 

    return 0; 
} 



/************************************************/ 
/* Name: instruct        */ 
/* Description: Prints instructions to user  */ 
/* Parameters: N/A        */ 
/* Return Value: N/A       */ 
/************************************************/ 

void instruct() 
{ 
    cout << "\n" << "This program will calculate the cellular telephone bill for a given customer when " << "\n" 
     << "given the correct inputs. "; 
    //Prints instructions to user 

    return; 
} 

/************************************************/ 
/* Name: accnum         */ 
/* Description: Get user account number   */ 
/* Parameters: N/A        */ 
/* Return Value: accnum       */ 
/************************************************/ 

int accnum() 
{ 
    int accnum = 0;        //Define var for account number 
    char accyn = 'n';        //Define char for user verify 
    int i = 1;         //Define var for sentinel loop 


    do { 
    cout << "\n" << "\n" << "Please enter your account number: "; 
    cin >> accnum; 
    while ((accnum < 0) && (i<3)) 
     { 
    cout << "\n" << "Error - invalid number, please try again."; 
    cout << "\n" << "Please enter your account number: "; 
    cin >> accnum; 
    i++; 
    if (i == 3) 
     { 
     cout << "\n" << "Too many invalid attempts, program terminating." << "\n" 
     << "Have a nice day. " << "\n" << "\n"; 
     exit (0); 
     }  //end if 
     }  //end while 
    cout << "\n"; 
    cout << "Your account number is: " << accnum << "\n" 
    << "Is this correct? [y/n] "; 
    cin >> accyn; 
    } while (accyn != 'y');  //end do/while loop 


    return accnum; 
} 

/************************************************/ 
/* Name: servcode        */ 
/* Description: Get service type    */ 
/* Parameters: N/A        */ 
/* Return Value: servcode      */ 
/************************************************/ 

char servcode() 
{ 
    char servcode = 'a';        //Define var for service code 
    char serviceyn = 'n';       //Define var for user verify 
    int i = 1;          //Define var for sentinel loop 

    do { 
    cout << "\n" << "Please enter your service code, [R]egular or [P]remium:" << "\n"; 
    cin >> servcode; 
    while ((servcode != 'R' && servcode != 'P' && servcode != 'r' && servcode != 'p') && (i < 3)) 
     { 
    cout << "\n" << "Error - invalid service code, please try again. "; 
    cout << "\n" << "Please enter your service code: "; 
    cin >> servcode; 
    i++; 
    if (i == 3) 
     { 
     cout << "\n" << "Too many invalid attempts, program terminating." << "\n" 
     << "Have a nice day. " << "\n" << "\n"; 
     exit (0); 
     }  //end if 
     }  //end while 
    cout << "\n" << "You entered: " << servcode << "\n" 
    << "Is that correct? [y,n]"; 
    cin >> serviceyn; 
     } while (serviceyn != 'y'); // end do/while loop 

    return servcode; 
} 

/************************************************/ 
/* Name: regserv        */ 
/* Description: Calculations for regular serv */ 
/* Parameters: N/A        */ 
/* Return Value: regserv      */ 
/************************************************/ 

float regserv() 
{ 
    int regmin = 0;  //Var for number of minutes used 
    float regserv = 0; //Var for cost for regular service 


    cout << "\n" "Please enter the minutes used: " << "\n"; 
    cin >> regmin; 
    regserv = (regmin - 50) * 0.2 + 10; 

    return regserv; 

} 

/************************************************/ 
/* Name: premserv        */ 
/* Description: Calculations for premium serv */ 
/* Parameters: N/A        */ 
/* Return Value: premserv      */ 
/************************************************/ 

float premserv (int& daymin, int& nightmin) 
{ 
    float daytotal = 0;  //Var for day total 
    float nighttotal = 0; //Var for night total 
    float premserv = 0;  //Var for premium service cost 

    cout << "\n" << "Please enter the number of minutes used durring the day (6AM - 6PM): " << "\n"; 
    cin >> daymin; 
    cout << "\n" << "Please enter the number of minutes used durring the night (6PM - 6AM): " << "\n"; 
    cin >> nightmin; 

    daytotal = (daymin - 75) * 0.1; 
    nighttotal = (nightmin - 100) * 0.05; 
    premserv = 25 + daytotal + nighttotal; 

    return premserv; 

} 
+5

ITは正しいです... – Nate

+0

どのように、私は問題をリストアップし、私は問題だと思いました。私も完全なコードが含まれています。他には何があるの? –

+0

補足として、プレミアムサービスを実行するには 'P'と 'p'を、通常のサービスを実行するには 'R'と 'r'を使用すると仮定しています。これは、あなたの望むことですか?あなたが 'r'か 'p'を入力すると今は動作しませんので、すぐに中断して終了します。あなたが望むのは、そのような休憩を取り除くことです。 case 'r': case 'R': regserv(); case 'p': case 'P': premserv(daymin、nightmin); –

答えて

1

以下

premiumserv = premserv(daymin, nightmin); 
regularserv = regserv(); 

完全なコードあなたは、switchステートメントの内側regserv()またはpremserv()を呼び出すが、その後、あなたは無条件にスイッチした直後にそれらの両方を呼び出します。

スイッチに関するコメントは、スイッチのセマンティクスを誤解していることを示唆しています。次に起こることを「選択」せず、実際にはスイッチ内でコードを実行するため、切り替え後にコードを呼び出す必要はありません。しかし、premiumservregularserv変数を割り当てるために忘れて、switchステートメント内の出力を行う、例えばません:

... 
case 'R': 
    regularserv = regserv(); 
    cout << ... regularserv ... 
    break; 
... 
+0

どのように関数からの出力を保存するのですか?スイッチのステートメントの外側でやっているのと同じように、スイッチのステートメント –

+0

の後に何をしようとしているのですか? – ObscureRobot

+0

switch文の引数の出力を割り当てません。それはスイッチの下に2行のコードがあります。 –

0

あなたの問題は、コードのこのセクションにあるかもしれないように見えます:

switch(servicecode)  //Switch to determine which calc to use 
    { 
    case 'r': 
     break; 
    case 'R': 
    regserv(); 
     break; 
    case 'p': 
     break; 
    case 'P': 
    premserv (daymin, nightmin); 
     break; 
    } 

    premiumserv = premserv (daymin, nightmin);  //Function call for regular service 

    regularserv = regserv();  //Function call for premium service 

    cout <<"total" << premiumserv <<"day" << daymin << "night " << nightmin; 

ここでは、サービスコードを切り替えて、regservとpremservを呼び出します。その後、これらの関数を呼び出しますが、regservの場合は戻り値を変数に代入します。この変数は決して再び参照されません。

0

あなたのプログラムが何をしているのかを100%確信しているわけではありませんが、ユーザーが 'R'または 'r'を入力したときにregserve関数を呼び出して、 'P'または 'p'を入力します。しかし、switch文で 'p'または 'r'を受け取ったときにすぐにbreakを呼び出します。どのような休憩をとるかは、 'P'や 'R'の場合に陥るのではなく、switch文の終了後に実行を続けることです。

これを修正する最良の方法は、regserveまたはプレサブを各ケースに対して明示的に呼び出すことです(ブレークを含まないようにすることができますが、明示的にアクションを記述することで読みやすくなります)それぞれのケースについて)。

関連する問題