0

私は C を学ぼうとしていて、VAT を計算するコードをコピーしました > ユーザーが「はい」と答えた場合は再計算し、「いいえ」と答えた場合は終了するように修正しました。驚いたことに、答えが「はい」の場合、ユーザーにアイテムのコストを入力するように要求するため、最初に移動することになっているという点で、奇妙な動作をします。代わりに、y が押された直後にコストが入力されることを期待しています。以下のコード。

    /* VAT Calculation*/

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

float price_with_vat(float cost, float vat, int quant);

main()
{
    float cost, vat, full_price;
    int quant,count=0;
    char answer[2];
    char reply[2]={"y"};
    x:
    count=count+1;
    printf("count= %d\n",count);
    printf("Please enter the item cost:\n\n");
    scanf("%f", &cost);
    printf("\nPlease enter the quantity of product:\n");
    scanf("%d", &quant);
    printf("\nquantity=%d\n",quant);
    /* exit(0); */
    printf("\nPlease enter the VAT percentage:\n");
    scanf("%f", &vat);
    printf("\ncost=%6.2f quant=%d vat=%6.2f\n",cost, quant, vat);
    /* exit(0); */
    full_price = price_with_vat(cost, vat, quant);
    printf("The total price is %6.2f\n\n",full_price);
    printf("\nDo you want to perform another transaction? (y/n)\n");

    scanf("%c\n", &answer);
    if(answer==reply)
    {
      system("cls");
      main();
    }
    else
    return 0;
}



     float price_with_vat(float cost, float vat, int quant)


i replace the part

      if(answer==reply)
      {
          system("cls");
          main();
      }
      else

  if(answer==reply)
     goto x

goto コンストラクトが C (および Fortran) で推奨されていないことはわかっています。do-while ループを使用するバリアントがあります。同じように動作します。この動作の理由はありますか? ジローレ・ムンバ

4

3 に答える 3

1

他のコメントと回答で説明されているように、提示されたコードには次のようないくつかの問題があります
。1) goto の使用は一般的に不要であり、めったに使用されません。
2) main() 内から main() を呼び出す。間違い。
3)プログラムの本体内で実行フローが適切に制御され
ていないため、説明した予期しない動作が発生します。
4)比較手法はすべて間違っています。==、など を読んでくださいstrcmp()!=

以下は、より予測どおりに実行する必要がある同様のコードの例で、ユーザーとの簡単なダイアログを実行し、結果を表示する方法を示しています。これがお役に立てば幸いです:)

注: 私の環境では必要なかった#include <conio.h>ので、削除しました。環境に合わせて再度追加する必要がある場合があります。

/* VAT Calculation*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

float price_with_vat(float cost, float vat, int quant);

int main(void)
{
    float cost, vat, full_price;
    int quant,count=0;
    char answer[2]={""};
    float running_total=0.0;
    count = 0;
    //dialog section of code
    while(answer[0] != 'n')
    {
    //get price, quantity and VAT
        printf("Please enter the item cost:");
        scanf("%f", &cost);
        printf("\nPlease enter the quantity:");
        scanf("%d", &quant);
        printf("\nPlease enter VAT percentage:");
        scanf("%f", &vat);
        count++;
    //results section   
        printf("\n\nCost: %6.2f\nQuantity: %d\nVAT percent: %6.2f", cost, quant, vat);
        full_price = price_with_vat(cost, vat, quant);
        running_total += full_price;
        printf("The total price is %6.2f\n\n",full_price);
        printf("\nRunning total is currently: %6.2f for %d items.\n",running_total, count);
    //request if continue
        printf("\nDo you want to perform another transaction? (enter \"y\" or \"n\")\n");
        scanf("%s", answer);
    }
    return 0;
}


float price_with_vat(float cost, float vat, int quant)
{
    return cost*((1.0)+vat)*((float)(quant));    
}
于 2013-10-13T00:22:25.577 に答える
1

C では文字列を比較できない==ため、これは間違っています。

if(answer==reply)

使用する必要がありますstrcmp()

if (strcmp(answer, reply) == 0)

strcmp()両方の引数が null で終わる文字列である必要があります。answernull ターミネータを;に追加することは決してありません。次のように初期化する必要があります。

char answer[] = { '\0', '\0' };

または、文字列と回答を使用する代わりに、replyそれらを単一の文字として宣言できます。

char reply = 'y';
char answer;

次に==、それらを比較するために使用できます。

于 2013-10-12T22:16:25.293 に答える