Если еще заявление не дает ожидаемого ответа

Введенные значения не совпадают с выходной оценкой, поскольку она дает 10 оценок, даже если условия для 10 не выполнены. проблема заключается в том, что при твердости 50, прочности 5600 и углероде 0,7 балл 10, а для 10 класса углерод должен быть меньше 0,7? #include #include #include

int main() {
    // program grade the steel on quality basis

    int hardness;
    int strength;
    float carbon;

    printf("Enter the hardness of steel:");    // condition 1  hardness should be >= 50
    scanf("%d", &hardness);

    printf("Enter the tensile strength:");     // condition 2  strength should be >= 5600
    scanf("%d", &strength);

    printf("Enter carbon content:");           // condition 3  carbon less than 0.7
    scanf("%.2f", &carbon);


    if ((hardness >= 50) && (carbon < 0.7) && (strength >= 5600)) {        // all true
        printf("\ngrade = 10");
    }
    else if ((hardness >= 50) && (carbon < 0.7) && (strength <= 5600)) {     // 1 and 2 true
        printf("\ngrade = 9");
    }
    else if ((hardness <= 50) && (carbon < 0.7) && (strength >= 5600)) {    // 2 and 3 true
        printf("\ngrade = 8");
    }
    else if ((hardness >= 50) && (carbon > 0.7) && (strength >= 5600)) {    // 1 and 3 true
        printf("\ngrade = 7");
    }
    else if ((hardness >= 50) && (carbon > 0.7) && (strength <= 5600)) {    // any one true
        printf("\ngrade = 6");
    }
    else if ((hardness <= 50) && (carbon < 0.7) && (strength <= 5600)) {    // any one true
        printf("\ngrade = 6");
    }   
    else if ((hardness <= 50) && (carbon < 0.7) && (strength >= 5600)) {    // any one true
        printf("\ngrade = 6");
    }
    else {
        printf("\ngrade = 5");                     // none true
    }

    _getch();
    return 0;
}

2 ответа

Использование "%.2f" поскольку спецификатор формата неверен в scanf, Это хорошо для printf но нет scanf,

Это хорошая идея, чтобы всегда проверять возвращаемое значение scanf чтобы убедиться, что функция смогла прочитать ожидаемые данные.

if ( scanf("%.2f", &carbon) != 1 )
{
   // Deal with error.
}

Добавить аналогичные проверки к другому scanf звонки.

Я думаю, что изменение вышеуказанного спецификатора формата на "%f" должен исправить вашу проблему. Добавьте чек еще.

if ( scanf("%f", &carbon) != 1 )
{
   // Deal with error.
}

Проблема в спецификаторе формата (.2f) в выражении scanf. %.2f обычно используется для печати 2 цифр после точки.В C все литералы с плавающей точкой хранятся как значения двойной точности. Поэтому нам нужно указать, что мы используем число с плавающей точкой, то есть одинарную точность, добавив значения с помощью f.Проверьте изменение код, если вы хотите, чтобы ваш углерод был округлен с точностью до 2 цифр, вы можете использовать carbon = ceilf(carbon*100)/100.0; Когда вы в следующий раз отправите свой вопрос, опубликуете свой ввод, для которого он не получен, вы получите быстрый ответ, и вы можете написать это с меньшим количеством сравнений - вот рабочий код

#include<stdio.h>
int main(void) {
int hardness;
int strength;
float carbon;
printf("Enter the hardness of steel:"); 
scanf("%d", &hardness);
printf("Enter the tensile strength:"); 
scanf("%d", &strength);
printf("Enter carbon content:");
scanf("%f", &carbon);
if ((hardness >= 50) && (carbon < 0.7f) && (strength >= 5600))
    printf("\ngrade = 10");
else if ((hardness >= 50) && (carbon < 0.7f))
    printf("\ngrade = 9");
else if ((carbon < 0.7f) && (strength >= 5600))   
    printf("\ngrade = 8");
else if ((hardness >= 50) && (strength >= 5600)) 
    printf("\ngrade = 7");
else if ((hardness >= 50) || (carbon > 0.7f) || (strength <= 5600))
    printf("\ngrade = 6");
else
    printf("\ngrade = 5");                  
_getch();
return 0;
}
Другие вопросы по тегам