While 循环重复输出字符串

问题描述 投票:0回答:1

我在学习 C 的同时编写代码,遇到了一个问题。 这是代码:

#include <stdio.h>
#define _USE_MATH_DEFINES
#include <math.h>

int main()
{   
    printf("%s", "Inserisci uno dei valori seguenti per il calcolo dell'area di:\n");
    puts("1 - Cerchio\n");
    puts("2 - Quadrato\n");
    puts("3 - Sfera\n");

    int n;
    float x;
    float A;
    
    while (n != EOF)
    {   
        switch (n = getchar())
        {
            case '1':    
                puts("Inserisci il raggio del cerchio: ");
                scanf("%f", &x);
                A = (float)M_PI*x*x;
                printf("L'area del cerchio e': \n%f", A);
                break;
            
            case '2':   
                puts("Inserisci il lato del quadrato: ");
                scanf(" %f", &x);
                A = x*x;
                printf("L'area del quadrato e': \n%f", A);
                break;
            
            case '3':
                puts("Inserisci il raggio della sfera: ");
                scanf(" %f", &x);
                A = (float)M_PI*x*x*4;
                printf("L'area della sfera e': \n%f", A);
                break;

            case '\n': //ignora i newline
            case '\t': //ignora le tabulazioni
            case ' ': //ignora gli spazi in input
                break;

            default:
                puts("Non e' stato inserito un valore valido\n");
                if (n = EOF)
                {
                    puts("Inserito valore per la terminazione del programma. (CTRL+Z)");
                }
        }         
        puts("\nInserire un altro valore per l'area");
    } 
}

输出:

Inserisci uno dei valori seguenti per il calcolo dell'area di:
1 - Cerchio

2 - Quadrato

3 - Sfera

1
Inserisci il raggio del cerchio: 
1
L'area del cerchio e': 
3.141593
Inserire un altro valore per l'area

Inserire un altro valore per l'area

问题是它打印了 while 循环最后一个字符串的两次。 我试图在 case 指令结束后打印字符串“Inserire un altro valore”。 我该如何解决这个问题?我认为这可能是一个逻辑错误,而不是语法错误。不知道,还在学习中

c
1个回答
0
投票

因为您执行了

puts("\nInserire un altro valore per l'area");
,所以它会在每次迭代结束时执行。是否有效。另外,默认情况下已经包含类似的消息,当输入无效时,这将重复。

我会这样做:将 p

uts("\nInserire un altro valore per l'area");
移动到有效的 case 块内,并将其从默认行为中删除。

while (n != EOF)
{   
    switch (n = getchar())
    {
        case '1':    
            puts("Inserisci il raggio del cerchio: ");
            scanf("%f", &x);
            A = (float)M_PI * x * x;
            printf("L'area del cerchio e': \n%f", A);
            puts("\nInserire un altro valore per l'area");
            break;
        
        case '2':   
            puts("Inserisci il lato del quadrato: ");
            scanf(" %f", &x);
            A = x * x;
            printf("L'area del quadrato e': \n%f", A);
            puts("\nInserire un altro valore per l'area");
            break;
        
        case '3':
            puts("Inserisci il raggio della sfera: ");
            scanf(" %f", &x);
            A = (float)M_PI * x * x * 4;
            printf("L'area della sfera e': \n%f", A);
            puts("\nInserire un altro valore per l'area");
            break;

        case '\n': //ignora i newline
        case '\t': //ignora le tabulazioni
        case ' ': //ignora gli spazi in input
            break;

        default:
            puts("Non e' stato inserito un valore valido\n");
            if (n == EOF)
            {
                puts("Inserito valore per la terminazione del programma. (CTRL+Z)");
            }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.