for循环重复直到值小于三

for loop repeats until value is less than three

我不知道为什么我的 for 循环不起作用。我已经尝试了这么久。它只运行 do / while 并给出 return。 do / while 循环中的所有内容。我在 main 函数外声明了一个宏,并将其用作循环条件。我无法添加更多详细信息,我只有代码。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#define MIN_YEAR 2012
#define MAX_YEAR 2022

#define LOG_DAYS 3

int main(void)
{
    const int JAN = 1;
    const int DEC = 12;
    int year = 0;
    int month = 0;
    char day1 = 01;
    char day2 = 02;
    char day3 = 03;
    float ratingMorning = 0;
    float ratingEvening = 0;

    printf("General Well-being Log\n"
        "======================\n");

    do
    {
        printf("Set the year and month for the well-being log (YYYY MM): ");
        scanf(" %d %d", &year, &month);

        if ((MIN_YEAR > year || year > MAX_YEAR))
        {
            printf("   ERROR: The year must be between 2012 and 2022 inclusive\n");
        }

        if ((JAN > month || month > DEC))
        {
            printf("   ERROR: Jan.(1) - Dec.(12)\n");
        }

        if ((JAN <= month && month <= DEC) && (MIN_YEAR <= year && year <= MAX_YEAR))
        {
            printf("\n*** Log date set! ***\n\n");
            break;
        }

    } while ((MIN_YEAR <= year || year <= MAX_YEAR) && (JAN <= month || month <= DEC));

    for (int i = 0; i < LOG_DAYS; i++)
    {
        printf(" %d", year);
        printf("-");
        printf(" %d", month);
        printf("-");
        printf(" %d",day1);
        printf("   Morning rating (0.0-5.0): ");
        scanf(" %d", &ratingMorning);

        if (ratingMorning < 0 || ratingMorning > 5)
        {
            printf("      ERROR: Rating must be between 0.0 and 5.0 inclusive!");
        }
        
        printf("   Evening rating (0.0-5.0): ");
        scanf(" %d", &ratingEvening);

        if (ratingEvening < 0 || ratingEvening > 5)
        {
            printf("      ERROR: Rating must be between 0.0 and 5.0 inclusive!");
        }
    }
    return 0;
}

如果问题是:

if (ratingMorning < 0 || ratingMorning > 5) is not working

即永远不会打印错误行 ERROR: Rating must be between 0.0 and 5.0 inclusive!",然后当您将 scanf(" %d", &ratingMorning); 行中的 %d 更改为 %f 时,会打印错误,因为现在 ratingMorningratingEvening 包含有效值,而当它们作为整数输入时,这些值无效。

while 部分 do / while 循环中的测试不正确。使用 for(;;) 循环并在输入正确时中断要简单得多,避免了冗余和有时不一致的测试。

floatscanf() 转换说明符是 %f,而不是 %d

这是修改后的版本:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#define MIN_YEAR 2012
#define MAX_YEAR 2022

#define LOG_DAYS 3

int main(void) {
    const int JAN = 1;
    const int DEC = 12;
    int year = 0;
    int month = 0;
    char day1 = 1;
    char day2 = 2;
    char day3 = 3;
    float ratingMorning = 0;
    float ratingEvening = 0;

    printf("General Well-being Log\n"
        "======================\n");

    for (;;) {
        printf("Set the year and month for the well-being log (YYYY MM): ");
        if (scanf(" %d %d", &year, &month) != 2) {
            printf("invalid input\n");
            return 1;
        }
        if (year < MIN_YEAR || year > MAX_YEAR) {
            printf("   ERROR: The year must be between 2012 and 2022 inclusive\n");
        } else
        if (month < JAN || month > DEC)) {
            printf("   ERROR: Jan.(1) - Dec.(12)\n");
        } else {
            printf("\n*** Log date set! ***\n\n");
            break;
        }
    }

    for (int i = 0; i < LOG_DAYS; i++) {
        printf(" %d- %d- %d", year, month, day1);
        printf("   Morning rating (0.0-5.0): ");
        if (scanf("%f", &ratingMorning) != 1) {
            printf("invalid input\n");
            return 1;
        }
        if (ratingMorning < 0 || ratingMorning > 5) {
            printf("      ERROR: Rating must be between 0.0 and 5.0 inclusive!");
            continue;
        }
        
        printf("   Evening rating (0.0-5.0): ");
        if (scanf("%f", &ratingEvening) != 1) {
            printf("invalid input\n");
            return 1;
        }
        if (ratingEvening < 0 || ratingEvening > 5) {
            printf("      ERROR: Rating must be between 0.0 and 5.0 inclusive!");
            continue;
        }
        // ... handle the ratings and report success
    }
    return 0;
}