0

我正在尝试学习 C,我复制了一个计算增值税的代码>我修改了它以重新计算用户是否回答是,如果回答否,则退出。令我惊讶的是,它以一种奇怪的方式表现,如果答案是肯定的,它应该去开始要求用户输入项目成本。相反,它希望在按下 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 结尾的字符串。您永远不会在 ; 中添加空终止符answer。您应该将其初始化为:

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

或者,您可以将它们声明为单个字符,而不是使用字符串 forreply和 answer:

char reply = 'y';
char answer;

然后你可以用==它们来比较它们。

于 2013-10-12T22:16:25.293 回答
1

你的程序错误太多。

  1. 你用过goto
  2. 在语句中scanf("%c\n", &answer);%c期望 achar但您将其传递给 a char (*)[2]
  3. 您声明char reply[2]={"y"};了 ,这不是有效的 C 语法。
  4. 但是,如果reply声明为char数组,则if(answer==reply)完全错误。

结论:

阅读有关 C 的优秀教程或阅读一本好书以了解 C 的基本语法。

于 2013-10-12T22:22:45.227 回答