这个c程序跳过scanf();命令和切换案例有错误

时间:2017-05-20 01:59:22

标签: c switch-statement scanf

这个程序编码完成了我的一个大学实验表。我不知道如何修改scanf()语句来纠正此错误。 看来切换机箱也出现了错误。这是我的代码。

#include<stdio.h>

//Function main
int main (void)
{
    char roomType,payingMethod,cont;
    int noOfRooms=0,noOfNights=0;
    float discount=0,amount=0;

    while(cont!='n'||cont!='N')
    {
        printf("\n(D-Deluxe|S-Superior Deluxe|C-Club Suits|E-Executive Suits|P-Presidential Suits)\nENTER THE ROOM TYPE:");
        scanf("%c%*c",&roomType);

        if(roomType!='D' || roomType!='S' || roomType!='E' || roomType!='C' || roomType!='P')
        {
            printf("Invalid Room Type!\n");
            return 0;
        }

        printf("\nENTER THE NUMBER OF ROOMS:");
        scanf("%d",&noOfRooms);
        printf("\nNUMBER OF NIGHTS:");
        scanf("%d",&noOfNights);
        printf("\nPAYING METHOD (M-cash|C-credit card):");
        scanf("%c%*c",&payingMethod);

        if(payingMethod=='c'||payingMethod=='C')
            discount=0.9;
        else 
            discount=1.0;

        switch(roomType)
        {
        case 'D':
            amount=31000*noOfRooms*noOfNights*discount;
            break;

        case 'S':
            amount=35000*noOfRooms*noOfNights*discount;
            break;

        case 'C':
        case 'c': 
            amount=50000*noOfRooms*noOfNights*discount;
            break;

        case 'E':
        case 'e': 
            amount=75000*noOfRooms*noOfNights*discount;
            break;

        case 'P':
        case 'p': 
            amount=100000*noOfRooms*noOfNights*discount;
            break;

        }

        printf("\nTotal amount payable: %f\n",amount);

        printf("\nDO you want to continue(y/n):");
        scanf("%*c%c",&cont);
        printf("__________________________________________________________");
    }

}//End function main

3 个答案:

答案 0 :(得分:0)

输入没有问题。如果有条件你就错了 它一定是

if(roomType!='D' && roomType!='S' && roomType!='E' && roomType!='C' && roomType!='P')

因为每次你给出一个roomType并不是全部D, S, E, C, P所以你的if条件每次评估为真。您需要使用&&而不是||,这样如果它是其中之一,那么它的计算结果为false。

问题if(roomType!='D' || roomType!='S' || roomType!='E' || roomType!='C' || roomType!='P')

中的if run条件

如果我将输入设为D, 然后roomType!='D'评估为假,因此它跳转到下一个检查,即

roomType!='S'所以现在我的roomType为D而不是S,因此这个条件适用,它会进入if condition并退出代码。每次都会发生这种情况,因此这段代码永远不会有效。

只需修改其if condition

即可

答案 1 :(得分:0)

我宁愿假设您可以阅读the fscanf manual返回值部分,并将一些调试代码写入:

  • 确保scanf返回正确的,并且......
  • 在您阅读之后检查roomTypepayingMethodcont的内容(提示:他们可能是换行符,当您尝试将它们打印为字符时,在控制台上显示不可见;因此将它们打印为整数)...

...而不是假设您无法阅读该手册并为您解决问题......

错误外,循环终止时出现逻辑错误。您的循环将一直运行,直到cond不等于'n' cond不等于'N';这与cond集合中['n', 'N']不包含的语义不同。

  • cond == 'n'cond != 'N'时,循环继续运行。
  • cond == 'N'cond != 'n'时,循环继续运行。

换句话说,你有一个无限循环。您可能意味着while (cond != 'n' && cond != 'N')或更好,while (!strchr("nN", cond)) ...

类似的问题出现在if(roomType!='D' || roomType!='S' || roomType!='E' || roomType!='C' || roomType!='P')中。您可能打算使用&&,或者可以使用if (!strchr("DSECP", roomType)) ...

答案 2 :(得分:0)

if条件错误而不是使用|| (或)你必须使用&amp;&amp;(和),因为在许多情况下,if条件变得不必要地为真并且返回0执行并且程序在没有输出的情况下结束。 还有用例&#39; d&#39;和案例&#39;除了这个开关外壳是完美的。 让我们的代码干涸 首先,让我们说如果用户输入&#39; S&#39; 所以roomType =&#39; S&#39;现在我们转到if这个值的条件 如果是roomType!=&#39; D&#39;变为真,如||表达式如果任何条件为真,则结果为true,因此如果条件变为true且打印输出无效的房间类型!和程序以return语句结束。