Если еще заявление не дает ожидаемого ответа
Введенные значения не совпадают с выходной оценкой, поскольку она дает 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;
}