2

私は初めて C でプログラミングを試みており、それをいくつかの具体的なものに適用しています...

問題で作成しているプログラムは、while ループを処理します。このプログラムの目標は、一連のトラックのガロンあたりの平均走行距離を計算することです。消費したガロン数に-1を入力したらすぐに終了させたいのですが、代わりにガロン数とマイル数の2回入力しなければなりません。この入力は、実際には結果の計算の一部として使用されることがわかりました。コードは次のとおりです。

#include <stdio.h>
int main()
{

    int tanks, miles;
    float gallons = 0, average = 0, miles_per_gallon = 0;
    tanks = 0;

    while (gallons != -1) {

            tanks += 1;
            miles_per_gallon = (float)miles / gallons;
            average = average + miles_per_gallon;
            printf("The miles / gallon for this tank was %.3f\n",
                   miles_per_gallon);

            printf("Enter the gallons used (-1 to end): ");
            scanf("%f", &gallons);

            printf("Enter the miles driven: ");
            scanf("%d", &miles);
    }

    average /= tanks;
    printf("The overall average miles/gallon was %.3f", average);
    return 0;
}

出力例を次に示します。

C:\>gallons
Enter the gallons used (-1 to end): 12.3
Enter the miles driven: 700
The miles / gallon for this tank was 56.911
Enter the gallons used (-1 to end): 13.4
Enter the miles driven: 666
The miles / gallon for this tank was 49.701
Enter the gallons used (-1 to end): 17.3
Enter the miles driven: 644
The miles / gallon for this tank was 37.225
Enter the gallons used (-1 to end): 15.5
Enter the miles driven: 777
The miles / gallon for this tank was 50.129
Enter the gallons used (-1 to end): -1
Enter the miles driven: -1
The miles / gallon for this tank was 1.000
The overall average miles/gallon was 38.993

助けてくれてありがとう。

4

4 に答える 4

2

問題は、コード内のステートメントのシーケンスが、2番目の入力が要求されるまでループの終了条件のチェックに到達しないようなものであるということです。入力するとすぐにチェックを追加-1して、ループから抜け出すことができます。または、ガロンの前にマイルを入力するように要求することもできます。

for (;;) { /* This is a "forwver" loop; we break out from the middle */

        tanks += 1;
        miles_per_gallon = (float)miles / gallons;
        average = average + miles_per_gallon;
        printf("The miles / gallon for this tank was %.3f\n",
               miles_per_gallon);

        printf("Enter the gallons used (-1 to end): ");
        scanf("%f", &gallons);

        /* This is where you break from the loop: */
        if (gallons == -1) return 0;

        printf("Enter the miles driven: ");
        scanf("%d", &miles);
}
于 2012-06-29T02:46:53.170 に答える
1

さて、あなたは自分でそれを解決することができるはずです、あなたがあなたのループを変えるか、ガロン入力の後にifステートメントを置くならばそれは簡単です

while (gallons != -1) {

        tanks += 1;
        miles_per_gallon = ( float ) miles / gallons;
        average = average + miles_per_gallon;
        printf("The miles / gallon for this tank was %.3f\n", miles_per_gallon);

        printf("Enter the gallons used (-1 to end): ");
        scanf("%f", &gallons);

        if(gallons==-1){
             printf("Program terminated");
            return 0;
        }

        printf("Enter the miles driven: ");
        scanf("%d", &miles);
    }
于 2012-06-29T02:46:41.940 に答える
1

ガロンを読み取った後、終了条件を確認します。私はあなたのコードにいくつかの変更を加えました --- あなたはガロンを読んだ後にしか壊れていないので、while 条件を true に変更しました。2番目にテストを <=0 に変更しました.0が入力されたかのように、0それで割ると数学が壊れます.0未満のものは単に意味がありません. 第三に、値を読み取った後に計算とレポートを変更したため、ゼロで割ることはありません。

  while (1) {

    printf("Enter the gallons used (-1 to end): ");
    scanf("%f", &gallons);
    if(gallons <= 0) break;

    printf("Enter the miles driven: ");
    scanf("%d", &miles);

    tanks += 1;
    miles_per_gallon = ( float ) miles / gallons;
    average = average + miles_per_gallon;
    printf("The miles / gallon for this tank was %.3f\n", miles_per_gallon);
  }
于 2012-06-29T02:51:57.463 に答える
0
while (gallons != -1) {
        /* snip */

        printf("Enter the gallons used (-1 to end): ");
        scanf("%f", &gallons);

        printf("Enter the miles driven: ");
        scanf("%d", &miles);
}

両方の質問をした後にのみ、終了基準を評価することに注意してください。マイルを求めるのを避けたい場合は、ループをもう少しゆがめる必要があります。次のようになります。

while (gallons != -1) {
        /* snip */

        printf("Enter the gallons used (-1 to end): ");
        scanf("%f", &gallons);

        if (gallons == -1)
            break;  /* exit the while loop */

        printf("Enter the miles driven: ");
        scanf("%d", &miles);
}

もちろん、このように途中でループを終了するのは少し荒削りですが、2 番目の質問をせずにループを終了するより便利な方法はすぐにはわかりません。

于 2012-06-29T02:50:34.587 に答える