Мой псевдокод:
Лучший случай: 1) Спросите у пользователя номер 2) Проверьте, является ли ввод пользователя числовым значением 3) Если ввод пользователя действителен, выполните функции пола, круга и потолка при вводе пользователя. 4) Отображение значений пола, круглых и потолочных значений пользовательского ввода
Худший случай: 1) Спросите у пользователя номер 2) Проверьте, является ли ввод пользователя числовым значением 3) Если ввод пользователя недействителен, спросите, хочет ли пользователь повторить попытку, выбрав Да/Нет. 4) Если пользователь говорит да, вернуться к 1), если пользователь говорит нет - завершить
#include <stdio.h>
#include <math.h>
int main(void) {
float user_input;
int a;
char answ;
do {
printf ("Enter a number to find its lower bound, rounded, and upper bound values: ");
if ((a = scanf("%f", &user_input) == 1)) {
float floored_input = floor(user_input);
float rounded_input = round(user_input);
float ceiled_input = ceil(user_input);
printf("Lower Bound: %1.0f\n", floored_input);
printf("Rounded: %1.0f\n", rounded_input);
printf("Upper Bound: %1.0f\n", ceiled_input);
break;
} else {
printf("Invalid input. Do you want to try again? (Y/N): ");
scanf("%c", &answ);
}
} while(answ == 'Y' || answ == 'y');
return 0;
}
Единственная проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь вводит буквально значение, отличное от «i», программа завершается, и я возвращаюсь в свой рабочий каталог.
Пользователь может ввести любое число, и оно сработает. Пользователь может ввести i, и ему будет предложено выбрать вариант Y/N.
ОДНАКО, когда пользователь вводит «i2», «hello», «h», «b», «yoooo» и т. д.
Пользователь не получает вариант Y/N, и программа завершается.
Вам нужно больше скобок в (a = scanf("%f", &user_input) == 1)
. ==
имеет более высокий приоритет, чем =
.
Все еще не работает. Подсказка Y/N появляется только тогда, когда пользователь вводит букву «i».
Кроме того, если scanf("%f", &user_input)
не возвращает 1
, возможно, что-то застряло в буфере, что будет подхвачено scanf(" %c", &answ);
Я попытался добавить больше скобок: if (a = (scanf("%f", &user_input) == 1)) и все равно дает те же результаты
Переменная a
не используется и может быть удалена. Кстати, вы еще не расставили скобки в нужном месте, поэтому удаление a
— ваш лучший вариант. Это не решит проблему, конечно. Чтобы решить проблему (когда пользователь вводит недопустимое число), код должен читаться до тех пор, пока не будет найдена новая строка, или код должен читать строку с fgets
и анализировать ее с помощью sscanf
удаление разрыва все равно не решает проблему
я вынул переменную <code>a</code>, а также в моей функции if: <code>if (scanf("%f", &user_input) == 1)</code> и она все еще делает то же самое. Хотя вынимать «код за кодом» приятно
Когда вы вводите «i2», scanf(" %c", answ);
удаляет только первый символ неправильного ввода. Я предлагаю вам перестать бороться с scanf
и получить ввод с fgets
и применить sscanf
к строке. Гораздо проще сбросить строку и получить другой ввод, чем возиться с очисткой входного буфера. Но не смешивайте fgets
с scanf
, используйте fgets
для всех ответов пользователей.
@TommySon делает Этот ответ помогает?
Я добавил: fgets(input, INPUT_SIZE, stdin); if ((sscanf(input, "%f", &user_input)) == 1) { .....} и теперь мне будет предложено ввести неверный ввод, спасибо. НО, если бы я ввел недопустимый ввод и снова выбрал число, когда будет предложено, отображается следующая строка: «Введите число, чтобы найти его нижнее, округленное и верхнее значения: неверный ввод. Вы хотите попробовать еще раз? (Д/Н): " и когда я ввожу y или Y, та же самая строка повторяется
@TommySon Как насчет чего-нибудь Так?
@Мичи, извини, это немного сбивает меня с толку.
OT: функция: floor()
, round()
и ceil()
возвращает double
не float
Предлагает 1) прочитать страницу MAN для функций, которые вы используете, и 2) предлагает: floorf()
и roundf()
и ceilf()
следующий предлагаемый код:
ctype.h
функция: toupper()
float
answ
и теперь предлагаемый код:
#include <stdio.h>
#include <math.h>
#include <ctype.h>
int main(void)
{
float user_input;
char answ = 'Y';
while( toupper( answ ) != 'N' )
{
printf ("Enter a number to find its lower bound, rounded, and upper bound values: ");
if ( scanf("%f", &user_input) == 1 )
{
float floored_input = floorf( user_input );
float rounded_input = roundf( user_input );
float ceiled_input = ceilf( user_input );
printf( "Lower Bound: %1.0f\n", floored_input );
printf( "Rounded: %1.0f\n", rounded_input );
printf( "Upper Bound: %1.0f\n", ceiled_input );
}
do
{
printf( "Do you want to try again? {Y/N}: " );
scanf( " %c", &answ );
//printf( "debug: answ = %x\n", answ );
} while( toupper(answ) != 'Y' && toupper( answ ) != 'N' );
}
return 0;
}
Добавьте пробел к
scanf(" %c", &answ);
, чтобы отфильтровать начальные пробелы. См. scanf() оставляет символ новой строки в буфере. Также обратите внимание, чтоchar answ
— неинициализированная переменная для циклов, которые не вводят значение. Это должно быть определено какchar answ = 'y';