计算while循环中的错误

时间:2012-02-16 19:29:58

标签: c# algorithm object

我已经得到了很好的工作,但是当速度达到一定的速度时,它希望它保持这种速度而不是增加。代码在一定程度上实现了这一点,但是当我打印出值时,值为270,然后降回到250.我不希望它超过250。当最大速度被击中时,如果它不能保持相同的值,那么这个体面的变量会继续向上移动,或者这是正确的,并且它表现正确它只是看起来对我错了吗?我得到的是,如果物体已达到终止速度,我每次设置为250,那么行进的距离应该更多吗?或者我必须设置不同的代码?就像在那里有一个if语句来说mySpeed = maxSpeed然后只使用certian体面率?嗯,这直接来自一本物理书,所以...... 谢谢你的帮助

     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Text;

    namespace JumpSimR
    {
      class Program
      {
    static void Main(string[] args)
    {
        //non modifiable constants
        const double maxSpeed = 250; //terminal velocity
        const double g = 32.17; //imeriial unity feet per sec g = dv/dt

        //variablbes used for player
        double mySpeed;         //current spped of person
        double myAlt;           //altitude of the person
        double myDist;          //distance travled for jump
        double t;               //time in simulation
        //parachute variables
        bool deploy;
        bool lCord;
        bool rCord;


        double alt;

        //get the alttitude from user input
        Console.WriteLine("Enter Jump Altitued:");
        Console.WriteLine("a for 30000 Ft");
        Console.WriteLine("b for 25000 Ft");
        Console.WriteLine("c for 15000 Ft");
        String alt1 = Console.ReadLine();
        if (alt1.Equals("a"))
        {
            alt = 30000;
        }
        else if (alt1.Equals("b"))
        {
            alt = 25000;
        }
        else { alt = 15000; }
        Console.WriteLine("The Hight of the jump is " + alt);

        myAlt = alt; //assign player alt to jump hight
        t = 1;
        mySpeed = 0;
        deploy = false;

        while(myAlt > 0)
        {
            if (maxSpeed > mySpeed){
                mySpeed = g * t;
            }
            else if (mySpeed >= maxSpeed) 
            {
                mySpeed = maxSpeed;
            }

            myDist = mySpeed * t; //distace = velocity * time

            if (0 > myAlt - myDist) { myAlt = 0; } else { myAlt -= myDist; } //subtract distance travled from starting alt
            Console.WriteLine("My Speed: " + mySpeed);
            Console.WriteLine("My Distance: " + myDist);
            Console.WriteLine("Altitude: " + myAlt);
            t++;

        }

        // keep screen from going away
        // when run from VS.NET
        Console.ReadLine();

    }
}
        }  

3 个答案:

答案 0 :(得分:4)

取出else,你允许它传递一次迭代的最大值:

        if (maxSpeed > mySpeed){
            mySpeed = g * t;
        }
        if (mySpeed >= maxSpeed) 
        {
            mySpeed = maxSpeed;
        }

答案 1 :(得分:2)

除了最大速度问题,您的距离计算也是错误的。你在我的原始答案中犯了一个相反的错误,你不考虑加速。

myDist = mySpeed * t; //distace = velocity * time

需要更改为

myDist += mySpeed; //Old distance + current time slice's speed;

如果你没有改变加速度你可以使用X t = X 0 + V 0 t +(1/2 )在 2 公式,但由于变化(它从32.17变为0 mySpeed >= maxSpeed)所以你必须使用每次切片当前速度来总结当前位置。


以下是错误的,它没有考虑加速度变化的终端速度,我将它留在这里虽然这是一个有用的教训

除了有关最高速度的错误,人们发布了一些你的算法是错误的。

职位的公式是 X t = X 0 + V 0 t +(1/2)at 2 和速度公式是v t = v 0 t + a

对于您的游戏,V 0 = 0且X 0 = alt,因此您的代码可以简化为

while(myAlt > 0)
{
    myAlt = alt + .5 * g * t * t; // Starting Velocity was 0 so we left it out.
    mySpeed = g * t; // Starting Velocity was 0 so we left it out.
    Console.WriteLine("My Speed: " + mySpeed);
    Console.WriteLine("My Distance: " + (alt - myAlt));
    Console.WriteLine("Altitude: " + myAlt);
    t++;

}

P.S。如果没有什么可以处理的话,我发现Debugger.Break()比Console.ReadLine()更有用,可以防止程序关闭。

答案 2 :(得分:1)

在检查它是否小于最大速度后,您正在计算新的mySpeed - 您应该在之前执行此计算。为了简化代码,您还可以使用Math.Min()代替if支票:

mySpeed =  g * t;
mySpeed  = Math.Min(maxSpeed, mySpeed);