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

ご覧のとおり、ガスチャージと電気チャージの出力は、同じ入力を使用する両方で異なります。どうすればこれを修正できますか?

4

2 に答える 2

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);

}

または、誰かがあなたのコードをチェックできるように、教授から得た式を提供してください。

于 2012-11-05T10:35:11.727 に答える
0

最初にいくつかの高レベルの発言。

double calcOutput(...);

何も返さず、影響を与えるすべての変数へのポインターを受け取るため、何も返す必要はありません。宣言すればいい

void calcOutput(...);

次、

double calcElecCharges(double* kwhConsumed);

消費された KWh の数を変更しないため、ポインターを渡しても意味がありません。その親族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 を返します。後者は意図されている可能性がありますが、前者の場合は、値を小数点以下 2 桁に丸めたいと考えています。これは、浮動小数点表現のより細かい点を無視して、100 を掛けて、最も近い整数を 100 で割って、

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

それでも、目的の出力はほとんど生成されませんが、料金を計算するための実際の式がどうあるべきかを知らなければ、それを診断することはできません。

于 2012-11-05T15:55:44.977 に答える