2012-11-05 12 views
1
#include <stdio.h> 
#include <math.h> 
#define BASELINE 75.6 
#define CONST1 0.11430 
#define CONST2 0.12989 
#define CONST3 0.22944 
#define CONST4 0.32146 
#define GAS_BASELINE 12.6 
#define CONST5 1.13309 
#define CONST6 1.35349 

void getInput(long *preElecRead, long *currElecRead, long *preGasRead, long *currGasRead); 
double calcOutput(double *kwhConsumed, double *thermsConsumed, double *elecCharges, double *gasCharges, double *totalDue, 
      long preElecRead, long currElecRead, long preGasRead, long currGasRead); 
void printOutput(long preElecRead, long currElecRead, long preGasRead, long currGasRead,double kwhConsumed, double thermsConsumed, 
      double elecCharges, double gasCharges, double totalDue); 
double calcKWH(long preElecRead, long currElecRead); 
double calcGasTherms(long preGasRead, long currGasRead); 
double calcElecCharges(double* kwhConsumed); 
double calcGasCharges(double thermsConsumed); 
double round100th(double n); 
double calcTotalDue(double* gasCharges, double* elecCharges); 


int main(void) 
{ //Declaration 
    long preElecRead; 
    long currElecRead; 
    long preGasRead; 
    long currGasRead; 
    double kwhConsumed; 
    double thermsConsumed; 
    double elecCharges; 
    double gasCharges; 
    double totalDue; 
    //Statement 
    getInput(&preElecRead, &currElecRead, &preGasRead, &currGasRead); 
    calcOutput(&kwhConsumed, &thermsConsumed, &elecCharges, &gasCharges, &totalDue, preElecRead, 
      currElecRead, preGasRead, currGasRead); 
    printOutput(preElecRead, currElecRead, preGasRead, currGasRead, kwhConsumed, thermsConsumed, elecCharges, gasCharges,totalDue); 

    return 0; 
} //end main 

void getInput(long *preElecRead, long *currElecRead, long *preGasRead, long *currGasRead) 
{ 
    printf("Enter previous & current electric meter readings: ", preElecRead, currElecRead); 
    scanf("%ld %ld", preElecRead, currElecRead); 
    printf("Enter previous & current gas meter readings: ", preGasRead, currGasRead); 
    scanf("%ld %ld", preGasRead, currGasRead); 
} 

double calcOutput(double *kwhConsumed, double *thermsConsumed, double *elecCharges, double *gasCharges, double *totalDue, 
      long preElecRead, long currElecRead, long preGasRead, long currGasRead) 
{ 
    *kwhConsumed = calcKWH(preElecRead, currElecRead); 
    *thermsConsumed = calcGasTherms(preGasRead, currGasRead); 
    *elecCharges = calcElecCharges(kwhConsumed); 
    *gasCharges = calcGasCharges(*thermsConsumed); 
    *totalDue = calcTotalDue(gasCharges, elecCharges); 
} 

double calcKWH(long preElecRead, long currElecRead) 
{ 
    double kwh; 

    kwh = (double)currElecRead - (double)preElecRead; 

    return kwh; 
} 

double calcGasTherms(long preGasRead, long currGasRead) 
{ 
    double gas; 

    gas = (double)currGasRead - (double)preGasRead; 

    return gas; 
} 

double calcElecCharges(double* kwhConSumed) 
{ 
    double elecCharge ; 
    if (*kwhConSumed > 0 && *kwhConSumed <= BASELINE) 
    { 
     elecCharge = *kwhConSumed * CONST1; 
    } 
     else 
      if (*kwhConSumed > BASELINE && *kwhConSumed <= (1.3*BASELINE)) 
       { 
        elecCharge = *kwhConSumed * CONST2; 
       } 
       else 
        if (*kwhConSumed > (1.3*BASELINE) && *kwhConSumed <= (2.0*BASELINE)) 
        { 
         elecCharge = *kwhConSumed * CONST3; 
        } 
         else 
          if (*kwhConSumed > 2.0*BASELINE) 
          { 
           elecCharge = *kwhConSumed * CONST4; 
          } 
    return round100th(elecCharge); 
} 
double calcGasCharges(double thermsConsumed) 
{ 
    double gas; 
    // check if therms < 0 and <= baseline 
    if (thermsConsumed > 0 && thermsConsumed <= GAS_BASELINE) gas = thermsConsumed * CONST5; 
     else 
      if (thermsConsumed > GAS_BASELINE) gas = thermsConsumed * CONST6; 
    return round100th(gas); 

} 

double round100th(double n) 
{ 
    if(n > 0) 
    { 
     n = (n + 50)/100 * 100; 
    } 
    else 
    { 
     return n = 0; 
    } 
    return n; 
} 

double calcTotalDue(double* gasCharges, double* elecCharges) 
{ 
    double i; 

    i = (double)(*gasCharges)+ (double)(*elecCharges);// calc total 

    return i; 
} 

void printOutput(long preElecRead, long currElecRead, long preGasRead, long currGasRead,double kwhConsumed, double thermsConsumed, 
      double elecCharges, double gasCharges, double totalDue) 
{ 
    printf("Electric:\n"); 
    printf("Previous: %ld, Current: %ld,  KWH Used: %0.0lf, Charges: %.2lf\n", preElecRead, currElecRead, kwhConsumed, elecCharges); 

    printf("Gas:\n"); 
    printf("Previous: %ld, Current: %ld, Therms Used: %0.0lf, Charges: %.2lf\n", preGasRead, currGasRead, thermsConsumed, gasCharges); 

    printf("Total Charges: %60.2lf", totalDue); 
} 

您好我有這個代碼,我完成的代碼,但不知何故我出來把電充和燃氣費的一個問題是從所使用的測試運行輸出不同的我教授,我想我可能沒有使用正確的公式來計算氣體的電荷和電荷。誰能告訴我正確的公式來計算氣費和電荷提出一個方法來解決天然氣和電力費用計算

這是我的輸出

Enter previous & current electric meter readings: 80000 
80500 
Enter previous & current gas meter readings: 990 
1030 
Electric: 
Previous: 80000, Current: 80500,  KWH Used: 500, Charges: 210.73 
Gas: 
Previous: 990, Current: 1030, Therms Used: 40, Charges: 104.14 
Total Charges:              314.87 
Process returned 0 (0x0) execution time : 21.512 s 
Press any key to continue. 

這是試運行輸出:

Enter previous & current electric meter readings: 80000 
80500 
Enter previous & current gas meter readings: 990 
1030 
Electric: 
Previous: 80000, Current: 80500,  KWH Used: 500, Charges: 135.78 
Gas: 
Previous: 990, Current: 1030, Therms Used: 40, Charges: 135.78 
Total Charges:              271.56 

正如你可以看到輸出在使用相同的輸入時,氣體充電和電荷是不同的。我怎樣才能解決這個問題?

回答

1

你不能指望別人知道你想用什麼公式:)但我認爲你的問題是在代碼中,而不是公式。試試這個:

double calcElecCharges(double* kwhConSumed) 
{ 
    double elecCharge ; 
    if (*kwhConSumed > 0 && *kwhConSumed <= BASELINE) 
    { 
     elecCharge = *kwhConSumed * CONST1; 
    } 
    else 
    { 
     if (*kwhConSumed > BASELINE && *kwhConSumed <= (1.3*BASELINE)) 
      { 
       elecCharge = *kwhConSumed * CONST2; 
      } 
      else 
      { 
       if (*kwhConSumed > (1.3*BASELINE) && *kwhConSumed <= (2.0*BASELINE)) 
       { 
        elecCharge = *kwhConSumed * CONST3; 
       } 
       else if (*kwhConSumed > 2.0*BASELINE) 
       { 
        elecCharge = *kwhConSumed * CONST4; 
       } 
       else 
       { 
        //*kwhConSumed < (1.3*BASELINE) || *kwhConSumed > (2.0*BASELINE) 
        //What now?? 
       } 
      } 
    } 
    return round100th(elecCharge); 
} 
double calcGasCharges(double thermsConsumed) 
{ 
    double gas; 
    // check if therms < 0 and <= baseline 
    if (thermsConsumed > 0 && thermsConsumed <= GAS_BASELINE) 
     gas = thermsConsumed * CONST5; 
    else if (thermsConsumed > GAS_BASELINE) 
     gas = thermsConsumed * CONST6; 
    else 
    { 
     //thermsConsumed < 0 
     //What now?? 
    } 

    return round100th(gas); 

} 

或者提供你從教授得到的公式,以便有人可以檢查你的代碼。

0

一些較高級別的評論第一。

double calcOutput(...); 

不返回任何東西,因爲它接收指向它應該影響到所有變量,沒有必要爲它返回任何東西。應該宣佈

void calcOutput(...); 

接下來,

double calcElecCharges(double* kwhConsumed); 

不會改變消耗千瓦時的數量,所以有在一個指針傳遞給它沒有任何意義。它的親屬calcGasCharges()以普通的double作爲參數,所以應該calcElecCharges()

getInput(),傳遞無關的參數給printf()電話:

printf("Enter previous & current electric meter readings: ", preElecRead, currElecRead) 
printf("Enter previous & current gas meter readings: ", preGasRead, currGasRead); 

這確實沒有實際傷害,因爲printf()根本不理會超出格式字符串所需的那些參數,但它的壞作風。

現在的執行錯誤,

double round100th(double n) 
{ 
    if(n > 0) 
    { 
     n = (n + 50)/100 * 100; 
    } 
    else 
    { 
     return n = 0; 
    } 
    return n; 
} 

不幾乎做什麼它說上蓋子,它基本上增加了50到正值和負值一個返回0。後者可能是有意的,但對於前者,我相信你想在小數點後面的兩個位置舍入值,忽略浮點表示的更精細的點,將通過乘以100來實現,四捨五入到最接近的整數除以100,

if (n > 0) { 
    n = round(100.0*n)/100.0; 
} 

這並不幾乎產生所需的輸出仍,但不知道該費用的計算公式實際應該是什麼樣,我們不能診斷出。

+0

很好的解釋,但你不認爲他應該在學校學習:) – DjSol