Бесконечный цикл в небольшой физической программе - PullRequest
0 голосов
/ 20 мая 2011

Вот программа, которая моделирует теннисный мяч, сбрасываемый со стороны 50-метрового здания. Программа должна выводить значения x, y и скорости на каждом временном шаге. Тем не менее, я, кажется, получаю бесконечный цикл.

 #include<stdio.h>
 #include<math.h>

 int main() {

     //Intial values 
     float ax = 0; //acceleration in the horizontal direction
     float ay = -9.8; //acceleration in the downward direction
     float x = 0; //top of building at position 0 
     float y = 50; //building is height 50 m
     float vx = 10*cos(30); //velocity in the horizontal direction = 10 m/s * cos(30); 
     float vy = 10*sin(30); //velocity in the vertical direction = 10 m/s * sin(30);     
     int time = 0; //time starts at 0 seconds
     float deltaTime = 0.001; //increment time by .001 each iteration

     //while ball is greater than 0, or above the ground which is at position 0
     while(y > 0) {

     time = time + deltaTime;
     vx = vx + ax*deltaTime;
     vy = vy + ay*deltaTime;
     x = x + vx*deltaTime + (1/2*ax*deltaTime*deltaTime);
     y = y + vy*deltaTime + (1/2*ay*deltaTime*deltaTime);     

     printf("x = %f, y = %f, vx = %f, vy = %f, time = %d, ", x,y,vx,vy,time);

     }
     system ("PAUSE"); 
     return 0;

 }

Я предполагаю, что y никогда не станет меньше 0, но из-за моих ограниченных физических знаний я не знаю, как я мог это исправить.

Ответы [ 5 ]

8 голосов
/ 20 мая 2011

1/2 == 0, а не 0,5

Поскольку 1 и 2 оба являются целыми числами, используется целочисленное деление, которое усекается до ближайшего целого числа. Используйте 0.5f для получения float или просто 0.5 для получения двойного.

1 голос
/ 20 мая 2011

Объявите время как float, а не int: из-за этого оно не меняется в вашем текущем коде.Тригонометрические функции в <math.h> принимают радианы , не градусы.

1 голос
/ 20 мая 2011

time - это int, а не float;так не останется ли это навсегда на нуле?

0 голосов
/ 20 мая 2011

Если вам интересно узнать, как ваш код, с небольшими изменениями, завершается без цикла убийцы в C #:

            float ax = 0; //acceleration in the horizontal direction
            float ay = -9.8f; //acceleration in the downward direction
            float x = 0; //top of building at position 0 
            float y = 50; //building is height 50 m
            float vx = 10f * (float)Math.Cos(30); //velocity in the horizontal direction = 10 m/s * cos(30); 
            float vy = 10 * (float)Math.Sin(30); //velocity in the vertical direction = 10 m/s * sin(30);     
            float time = 0; //time starts at 0 seconds
            float deltaTime = 0.001f; //increment time by .001 each iteration

            //while ball is greater than 0, or above the ground which is at position 0
            while (y > 0)
            {

                time = time + deltaTime;
                vx = vx + ax * deltaTime;
                vy = vy + ay * deltaTime;
                x = x + vx * deltaTime + (1 / 2 * ax * deltaTime * deltaTime);
                y = y + vy * deltaTime + (1 / 2 * ay * deltaTime * deltaTime);

                Console.WriteLine("x = {0}, y = {1}, vx = {2}, vy = {3}, time = {4}, ", x, y, vx, vy, time);

            }
            Console.ReadKey();

Единственная модификация, которую я сделал, это наложение на Cos и Sin и изменение времени для плавания. И добавил 'f' после некоторых начальных значений (например, приведения).

Возможно, это не реальный ответ для C, но это может быть подсказка?

0 голосов
/ 20 мая 2011

Посмотрите на термин

y = y + vy*deltaTime + (1/2*ay*deltaTime*deltaTime);   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...