推 EricTsai:自己F11一步一步跑會看不出來嗎... 01/14 14:01
各位高手們 可以幫我看看我的程式出了什麼問題嗎
我寫了一個自動倒車入庫的程式
我用了遞迴
在主程式中呼叫EXE副程式
然後在EXE的最後呼叫自己
但是程式中的e跟y可以順利
傳回自己重複運算
但是phi卻不行>"<
(隨著呼叫次數改變 e y 會一直變 但是phi 跟theta卻始終維持不變..)
我明明都用一樣的方法寫阿..
請各位幫我解答吧! 感謝感謝!!!<(_ _)>
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
//=================================================
static public double LE(double x) //LE(x)
{
if (x<10)
return 1;
else if (x >= 10 && x<35)
return (35-x) / 25;
else
return 0;
}
//==================================================
static public double LC(double x) //LC(x)
{
if (x>=30 && x<40)
return 1-((40-x)/10);
else if (x>=40 && x<50)
return (50-x)/10;
else
return 0;
}
//===================================================
static public double CE(double x) //CE(x)
{
if (x >= 45 && x < 50)
return 1-((50-x) / 5);
else if (x >= 50 && x < 55)
return (55-x) / 5;
else
return 0;
}
//=================================================
static public double RC(double x) //RC(x)
{
if (x >= 50 && x < 60)
return 1-((60-x) / 10);
else if (x >= 60 && x < 70)
return (70-x) / 10;
else
return 0;
}
//==================================================
static public double RJ(double x) //RJ(x)
{
if (x >= 65 && x < 90)
return 1-((90 - x) / 25);
else if (x >= 90)
return 1;
else
return 0;
}
//==================================================
static public double RB(double x) //RB(x)
{
if (x >= -100 && x < -45)
return 1-((-45 - x) / 55);
else if (x >= -45 && x < 10)
return (10 - x) / 55;
else
return 0;
}
//==================================================
static public double RU(double x) //RU(x)
{
if (x >= -10 && x < 25)
return 1-((25 - x) / 35);
else if (x >= 25 && x < 60)
return (60 - x) / 35;
else
return 0;
}
//===================================================
static public double RV(double x) //RV(x)
{
if (x >= 40 && x < 65)
return 1-((65 - x) / 25);
else if (x >= 65 && x < 90)
return (90 - x) / 25;
else
return 0;
}
//===================================================
static public double VE(double x) //VE(x)
{
if (x >= 80 && x < 90)
return 1-((90 - x) / 10);
else if (x >= 90 && x < 100)
return (100 - x) / 10;
else
return 0;
}
//===================================================
static public double LV(double x) //LV(x)
{
if (x >= 90 && x < 115)
return 1-((115 - x) / 25);
else if (x >= 115 && x < 140)
return (140 - x) / 25;
else
return 0;
}
//===================================================
static public double LU(double x) //LU(x)
{
if (x >= 120 && x < 155)
return 1-((155 - x) / 35);
else if (x >= 155 && x < 190)
return (190 - x) / 35;
else
return 0;
}
//===================================================
static public double LB(double x) //LB(x)
{
if (x >= 170 && x < 225)
return 1-((225 - x) / 55);
else if (x >= 225 && x < 280)
return (280 - x) / 55;
else
return 0;
}
//====================================================
static public double MIN(double m, double n) //Find the minimum
of two numbers
{
if (m >= n)
return n;
else
return m;
}
//====================================================
static public void EXE( double e, double y, double phi)
{
int NB = -30, NM = -15, NS = -6, ZE = 0, PS = 7, PM = 15, PB = 30;
double[] MOTHER = new double[35];
double[] CHILD = new double[35];
double Add_Childs = 0, Add_Mothers = 0, theta;
int counter;
CHILD[0] = MIN(RB(phi), LE(e)) * PS;
CHILD[1] = MIN(RB(phi), LC(e)) * PM;
CHILD[2] = MIN(RB(phi), CE(e)) * PM;
CHILD[3] = MIN(RB(phi), RC(e)) * PB;
CHILD[4] = MIN(RB(phi), RJ(e)) * PB;
CHILD[5] = MIN(RU(phi), LE(e)) * NS;
CHILD[6] = MIN(RU(phi), LC(e)) * PS;
CHILD[7] = MIN(RU(phi), CE(e)) * PM;
CHILD[8] = MIN(RU(phi), RC(e)) * PB;
CHILD[9] = MIN(RU(phi), RJ(e)) * PB;
CHILD[10] = MIN(RV(phi), LE(e)) * NM;
CHILD[11] = MIN(RV(phi), LC(e)) * NS;
CHILD[12] = MIN(RV(phi), CE(e)) * PS;
CHILD[13] = MIN(RV(phi), RC(e)) * PM;
CHILD[14] = MIN(RV(phi), RJ(e)) * PB;
CHILD[15] = MIN(VE(phi), LE(e)) * NM;
CHILD[16] = MIN(VE(phi), LC(e)) * NM;
CHILD[17] = MIN(VE(phi), CE(e)) * ZE;
CHILD[18] = MIN(VE(phi), RC(e)) * PM;
CHILD[19] = MIN(VE(phi), RJ(e)) * PM;
CHILD[20] = MIN(LV(phi), LE(e)) * NB;
CHILD[21] = MIN(LV(phi), LC(e)) * NM;
CHILD[22] = MIN(LV(phi), CE(e)) * NS;
CHILD[23] = MIN(LV(phi), RC(e)) * PS;
CHILD[24] = MIN(LV(phi), RJ(e)) * PM;
CHILD[25] = MIN(LU(phi), LE(e)) * NB;
CHILD[26] = MIN(LU(phi), LC(e)) * NB;
CHILD[27] = MIN(LU(phi), CE(e)) * NM;
CHILD[28] = MIN(LU(phi), RC(e)) * NS;
CHILD[29] = MIN(LU(phi), RJ(e)) * PS;
CHILD[30] = MIN(LB(phi), LE(e)) * NB;
CHILD[31] = MIN(LB(phi), LC(e)) * NB;
CHILD[32] = MIN(LB(phi), CE(e)) * NM;
CHILD[33] = MIN(LB(phi), RC(e)) * NM;
CHILD[34] = MIN(LB(phi), RJ(e)) * NS;
MOTHER[0] = MIN(RB(phi), LE(e));
MOTHER[1] = MIN(RB(phi), LC(e));
MOTHER[2] = MIN(RB(phi), CE(e));
MOTHER[3] = MIN(RB(phi), RC(e));
MOTHER[4] = MIN(RB(phi), RJ(e));
MOTHER[5] = MIN(RU(phi), LE(e));
MOTHER[6] = MIN(RU(phi), LC(e));
MOTHER[7] = MIN(RU(phi), CE(e));
MOTHER[8] = MIN(RU(phi), RC(e));
MOTHER[9] = MIN(RU(phi), RJ(e));
MOTHER[10] = MIN(RV(phi), LE(e));
MOTHER[11] = MIN(RV(phi), LC(e));
MOTHER[12] = MIN(RV(phi), CE(e));
MOTHER[13] = MIN(RV(phi), RC(e));
MOTHER[14] = MIN(RV(phi), RJ(e));
MOTHER[15] = MIN(VE(phi), LE(e));
MOTHER[16] = MIN(VE(phi), LC(e));
MOTHER[17] = MIN(VE(phi), CE(e));
MOTHER[18] = MIN(VE(phi), RC(e));
MOTHER[19] = MIN(VE(phi), RJ(e));
MOTHER[20] = MIN(LV(phi), LE(e));
MOTHER[21] = MIN(LV(phi), LC(e));
MOTHER[22] = MIN(LV(phi), CE(e));
MOTHER[23] = MIN(LV(phi), RC(e));
MOTHER[24] = MIN(LV(phi), RJ(e));
MOTHER[25] = MIN(LU(phi), LE(e));
MOTHER[26] = MIN(LU(phi), LC(e));
MOTHER[27] = MIN(LU(phi), CE(e));
MOTHER[28] = MIN(LU(phi), RC(e));
MOTHER[29] = MIN(LU(phi), RJ(e));
MOTHER[30] = MIN(LB(phi), LE(e));
MOTHER[31] = MIN(LB(phi), LC(e));
MOTHER[32] = MIN(LB(phi), CE(e));
MOTHER[33] = MIN(LB(phi), RC(e));
MOTHER[34] = MIN(LB(phi), RJ(e));
for (counter = 0; counter <= 34; counter++)
{
Add_Childs = Add_Childs + CHILD[counter];
Add_Mothers = Add_Mothers + MOTHER[counter];
}
theta = Add_Childs / Add_Mothers;
Console.WriteLine("\n\ntheta: {0}", theta);
e = e + 1.6 * Math.Sin((Math.PI / 180) * theta) *
Math.Cos((Math.PI / 180) * phi);
y = y + 1.6 * Math.Sin((Math.PI / 180) * theta) *
Math.Cos((Math.PI / 180) * phi);
phi =(180/Math.PI)* Math.Atan((Math.Sin((Math.PI / 180) * phi) +
1.6 * Math.Cos(Math.PI / 180 * phi) *
Math.Sin(Math.PI / 180 * theta)) / (Math.Cos((Math.PI / 180)
* phi) - 1.6 *
Math.Sin(Math.PI / 180 * phi) * Math.Sin(Math.PI / 180 *
theta)));
Console.WriteLine("\n\nNew_x: {0}", e);
Console.WriteLine("\n\nNew_y: {0}", y);
Console.WriteLine("\n\nNew_phi: {0}", phi);
Console.WriteLine("=======================================");
phi = phi*Math.PI/180;
while (e != 50 && y != 100 && e<=100 && y<=100&&theta!=0&&phi!=90)
EXE( e, y, phi);
Console.Read();
}
static void Main(string[] args)
{
double e1, phi1, y1;
string temp1, temp2, temp3;
Console.Write("1.請輸入X值: ");
temp1 = Console.ReadLine();
e1 = System.Convert.ToDouble(temp1);
Console.Write("2.請輸入Y值: ");
temp3 = Console.ReadLine();
y1 = System.Convert.ToDouble(temp3);
Console.Write("3.請輸入φ值: ");
temp2 = Console.ReadLine();
phi1 = System.Convert.ToDouble(temp2);
EXE(e1, y1, phi1);
}
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.127.208.92
※ 編輯: ssupermaxx 來自: 59.116.51.211 (01/13 21:29)
※ 編輯: ssupermaxx 來自: 59.116.51.211 (01/14 01:42)