Да, это C, но C, который приглашает Undefined Behavior за неспособность проверить ввод пользователя.Что происходит в вашем коде, если пользователь пропускает и нажимает 'r'
вместо '5'
при вводе высоты шара?
Чтобы предотвратить неправильный ввод и восстановить его, необходимо проверить возврат вашей входной функции и пустых stdin
любых оскорбительных символов перед вашей следующей попыткой чтения, например
/* validate every input */
if (scanf ("%lf", &startingHeight) != 1) {
int c;
fputs ("error: invalid input.\n", stderr);
do /* read offending chars until '\n' or EOF */
c = getchar();
while (c != '\n' && c != EOF);
continue;
}
Все, хотя с do .... while (...)
вы просто переходите кконец цикла и ваш startingHeight < 0
тест ложен, и вы переходите к вопросу о скорости, лучше:
for (;;) { /* loop continually until valid input */
printf ("\n Enter initial height of the ball (in ft.): ");
/* validate every input */
if (scanf ("%lf", &startingHeight) != 1) {
int c;
fputs ("error: invalid input.\n", stderr);
do /* read offending chars until '\n' or EOF */
c = getchar();
while (c != '\n' && c != EOF);
continue;
}
if (startingHeight < 0) {
printf ("\t The initial height must be greater than or equal to 0");
/* you should empty stdin here as well -- hint: create a function */
}
else
break;
}
Таким образом, вы повторно задаете вопрос о высоте, пока у вас не будет действительного startingHeight >= 0
.
Другой нит, не используйте printf
для вывода одиночного символа, для этого putchar
или fputc
, например,
// printf ("\n"); /* replace this with... */
putchar ('\n');
Кроме того, нет необходимостидвух- printf
вызовов (вы не выполняете никаких преобразований), в которых будет делать один puts
, например,
// printf("\n");
// printf("Time\tHeight\n");
puts ("\nTime\tHeight");
В противном случае, кроме обычного начального сбоя проверки, у вас все хорошо.