Я хочу убедиться, что моя программа правильная, это c программирование - PullRequest
0 голосов
/ 02 марта 2019

Я просто хотел убедиться, что моя формула верна, и хотел посмотреть, есть ли способ сделать высоту равной нулю, и отсчет времени с этим здесь - мой код, так что я выполнил его с некоторымичисла, подобные высоте, равны 10, а скорость равна 0, и отсчет времени начинается с 0,0, а приращение увеличивается на 0,25, а высота начинается с 10, но она не будет отсчитываться до нуля для высоты и будет останавливаться на 0,75 для времени.мне жаль, если это сбивает с толку то, что я пытаюсь объяснить, потому что я запутался в себе

// Programmer:      Your Name
// Date:            Date
// Program Name:    The name of the program
// Chapter:         Chapter # - Chapter name
// Description:     2 complete English sentences describing what the program does,
//                  algorithm used, etc.

#define _CRT_SECURE_NO_WARNINGS // Disable warnings (and errors) when using non-secure versions of printf, scanf, strcpy, etc.
#include <stdio.h> // Needed for working with printf and scanf
#include <math.h>
int main(void)
{
    // Constant and Variable Declarations
    double startingHeight = 0.0;
    double heightBall = 0.0;
    double volicetyBall = 0.0;
    double ballTime = 0.0;
    double downTime = 0.25;
    double maxHeight = 0.0;
    double timeLast = 0.0;



    // *** Your program goes here ***
    do {
        printf("\n Enter initial height of the ball (in ft.): ");
        scanf("%lf", &startingHeight);

        if (startingHeight < 0) {
            printf("\t The initial height must be greater than or equal to 0");
        }


    } while (startingHeight < 0);

    do {
        printf("\n Enter initial velocity of the ball (in ft. per sec.): ");
        scanf("%lf", &volicetyBall);

        if (volicetyBall < 0) {
            printf("\t The initial velocity must be greater than or equal to 0");
        }

    } while (volicetyBall < 0);

    printf("\n");
    printf("Time\tHeight\n");
    if (startingHeight < 0 && volicetyBall > 0) {
        printf("%0.2f\t%0.1f\n", ballTime, startingHeight);
    }


    else {

        do {

            heightBall = startingHeight + volicetyBall * ballTime - 16 * pow(ballTime, 2);

            if (maxHeight < heightBall) {
                maxHeight = heightBall;
            }


            if (heightBall >= 0) {
                printf("%0.2f\t%0.1f\n", ballTime, heightBall);
                timeLast = ballTime;
            }

            ballTime = ballTime + downTime;
        } while (heightBall >= 0);

    }

    printf("\n The maximum height the ball will reach is %0.1f feet\n", maxHeight);
    printf("\n The time for the ball to reach the ground is %0.2f seconds\n", timeLast);

    printf("\n");



    return 0;
} // end main()

1 Ответ

0 голосов
/ 02 марта 2019

Да, это 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");

В противном случае, кроме обычного начального сбоя проверки, у вас все хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...