C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.77967 の関連記事表示

<< 0 >>
■77967  演算について(C#)
□投稿者/ タカタ -(2015/12/04(Fri) 19:30:33)

    分類:[C#] 

    C#で数値計算のプログラムを作っています。

    ある式を用いて、時間T のときの 変数Y を算出することはできたのですが、

    変数Y を 時間ごとにどんどん加算させていくことはできるのでしょうか?

    T=1 のときに Y=5

    T=2 のときに Y=3

    T=3 のときに Y=8

    T=4 のときに Y=10

    とすると、

    T=1 Y=5

    T=2 Y=5+3 = 8

    T=3 Y=5+3+8 = 16

    T=4 Y=5+3+8+10 = 26

    のような、、、
親記事 /過去ログ132より / 関連記事表示
削除チェック/

■77968  Re[1]: 演算について(C#)
□投稿者/ 魔界の仮面弁士 -(2015/12/04(Fri) 20:35:32)
    No77967 (タカタ さん) に返信
    > ある式を用いて、時間T のときの 変数Y を算出することはできたのですが、
    > 変数Y を 時間ごとにどんどん加算させていくことはできるのでしょうか?

    現在の算出式が、仮に
     Y = fn(T)
    で表せるのであれば、変数 Y をクラスフィールドにした上で、
     Y += fn(T)
    の形で処理するようにし、T をインクリメントしていけば良いかと。
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■77969  Re[1]: 演算について(C#)
□投稿者/ Azulean -(2015/12/04(Fri) 23:07:59)
    同じく、Y = fn(T) で導ける前提であり、クラスフィールドではなく、任意の T に対する Y の積算値を得る関数を作りたいなら
    以下のようにループするとよいかと。
    
    int sumY = 0;
    for (int Ti = 1; Ti <= T; Ti++)
    {
      sumY += fn(Ti);
    }
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78071  Re[2]: 演算について(C#)
□投稿者/ タカタ -(2015/12/11(Fri) 15:31:22)
    No77969 (Azulean さん) に返信
    > 同じく、Y = fn(T) で導ける前提であり、クラスフィールドではなく、任意の T に対する Y の積算値を得る関数を作りたいなら
    > 以下のようにループするとよいかと。
    >
    > int sumY = 0;
    > for (int Ti = 1; Ti <= T; Ti++)
    > {
    > sumY += fn(Ti);
    > }

    ありがとうございます。加算されていく様子が確認できました。

    しかし、加算しているはずなので、途中から sumY の値が 下がる現象が見られました、、、

    fn(Ti) の式がおかしいのですかね、、、 fn(Ti) の値は見ている限りでは、常に + の値を出しているのですが、、、
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78072  Re[3]: 演算について(C#)
□投稿者/ とっちゃん -(2015/12/11(Fri) 15:52:15)
    No78071 (タカタ さん) に返信
    > ありがとうございます。加算されていく様子が確認できました。
    >
    > しかし、加算しているはずなので、途中から sumY の値が 下がる現象が見られました、、、
    >
    > fn(Ti) の式がおかしいのですかね、、、 fn(Ti) の値は見ている限りでは、常に + の値を出しているのですが、、、

    sumY の値に、fn(Ti) の結果を足すと、Int32 の扱える最大値(2,147,483,647=0x7FFFFFFF) を超える値になりませんか?
    fn(T) が返す値とその総和が上記の最大値を超えるなら、それを扱える数値型を使う必要があります。

    現在のコンピュータの整数演算は基本的に有限値しか扱えません。
    Int64(9,223,372,036,854,775,807=0x7FFFFFFFFFFFFFFF) を使うか
    さらに大きな値(物理メモリの制限のみ受ける)BigInteger 型を使うことになります。

記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78133  Re[4]: 演算について(C#)
□投稿者/ タカタ -(2015/12/16(Wed) 20:20:05)
    No78072 (とっちゃん さん) に返信
    > ■No78071 (タカタ さん) に返信
    >>ありがとうございます。加算されていく様子が確認できました。
    >>
    >>しかし、加算しているはずなので、途中から sumY の値が 下がる現象が見られました、、、
    >>
    >>fn(Ti) の式がおかしいのですかね、、、 fn(Ti) の値は見ている限りでは、常に + の値を出しているのですが、、、
    >
    > sumY の値に、fn(Ti) の結果を足すと、Int32 の扱える最大値(2,147,483,647=0x7FFFFFFF) を超える値になりませんか?
    > fn(T) が返す値とその総和が上記の最大値を超えるなら、それを扱える数値型を使う必要があります。
    >
    > 現在のコンピュータの整数演算は基本的に有限値しか扱えません。
    > Int64(9,223,372,036,854,775,807=0x7FFFFFFFFFFFFFFF) を使うか
    > さらに大きな値(物理メモリの制限のみ受ける)BigInteger 型を使うことになります。


    初歩的な質問にわざわざご対応頂き有難う御座います。

    Int32の扱える最大値を超えているかどうか確認しましたが、超える値にはなっていないようです。

    以下のようなプログラムで繰り返しXの変数を足し算しているのですが、どうもうまくできません。

    float Y = 0;
    for (int i=1; i<=Time; i++)
    {
    Y += X;
    }

    Xの変数が 10,11,12,13・・・と時間変数Timeが増えるごとに増えていく、もしくは変化せず10,10,10,10・・・

    という場合には、問題なく Yの値が 10,21,33,47・・・・ もしくは 10,20,30,40・・・と

    加算されていくのですが、時間変数Timeが増えるごとに 10,9,8,7 ・・・ と減る場合には、

    なぜか加算しているのにも関わらず なぜか 10,8,6,4・・・・のように減っていってしまいます。

    Xの変数がマイナスの数値を出していないに、、、





記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78134  Re[5]: 演算について(C#)
□投稿者/ 魔界の仮面弁士 -(2015/12/16(Wed) 20:39:51)
    No78133 (タカタ さん) に返信
    > 以下のようなプログラムで繰り返しXの変数を足し算しているのですが、どうもうまくできません。
    > float Y = 0;
    > for (int i=1; i<=Time; i++)
    > {

    念のために確認。
    ループ内で、変数 i や Time の値を書き換えたりはしていませんか?
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78136  Re[5]: 演算について(C#)
□投稿者/ みい -(2015/12/17(Thu) 09:28:02)
    2015/12/17(Thu) 09:45:40 編集(投稿者)
    2015/12/17(Thu) 09:37:09 編集(投稿者)

    No78133 (タカタ さん) に返信
    > Xの変数が 10,11,12,13・・・と時間変数Timeが増えるごとに増えていく、もしくは変化せず10,10,10,10・・・

    > という場合には、問題なく Yの値が 10,21,33,47・・・・ もしくは 10,20,30,40・・・と

    > 加算されていくのですが、時間変数Timeが増えるごとに 10,9,8,7 ・・・ と減る場合には、

    > なぜか加算しているのにも関わらず なぜか 10,8,6,4・・・・のように減っていってしまいます。

    確認です。
    Yの値はループの中で見ていますか?
    それともループを抜けた後ですか?

    BreakPointはって1行ずつ値の変化をみてみるのが一番解決早いかと思います。
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78145  Re[6]: 演算について(C#)
□投稿者/ タカタ -(2015/12/17(Thu) 13:01:13)
    魔界の仮面弁士さん、 みいさん、ご回答有難う御座います。

    >ループ内で、変数 i や Time の値を書き換えたりはしていませんか?
    ループ内で変数i や Timeは変えておりません。

    > Yの値はループの中で見ていますか?
    > それともループを抜けた後ですか?
    Yの値はループを抜けた後で見ております。


    プログラムの概要としては、

    変数 Time のときの X を計算する定義式を記載(
     ・
     ・
     ・
    Xの結果を表示する定義文

    float Y = 0;
    for (int i=1; i<=Time; i++)
    {
    Y += X;
    }

    Yの値を表示する定義文

    といった感じです。


    Timeを1ずつ増やして 360 まで計算させています。
    Timeを1ずつ増やして 360 まで繰り返して Xの積算を Y にする、という文をしているつもりですが、、、
    for文のi という変数を設ける意味があまり分かっていませんが、初期値みたいなものでしょうか。
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78148  Re[7]: 演算について(C#)
□投稿者/ 魔界の仮面弁士 -(2015/12/17(Thu) 13:25:09)
    No78145 (タカタ さん) に返信
    > Timeを1ずつ増やして 360 まで計算させています。

    「Timeを1ずつ増やす」という部分が良く分からないのですが、
    実際のコードは、こんな感じになっているということでしょうか。


    結果表示処理(X);
    float Y = 0;
    for(int Time = 0; Time <= 360 ; Time++)
    {
      for (int i=1; i<=Time; i++)
      {
       Y += X;
      }
    }
    結果表示処理(Y);




    > for文のi という変数を設ける意味があまり分かっていませんが、

    ループカウンタ用の変数です。変数名を i 以外にしても構いませんが、
    各回のループが「何回目の処理なのか」を知る必要がある場合には、
    ループ内でその変数を参照する必要が生じるでしょう。

    逆に、ループの総回数だけが重要であり、各回のループ回数には
    特に気を配る必要が無いのなら、変数 i を参照する必要はありません。


    極端な話、無限ループとして処理させる場合には、
     for( ; ; )
     {

     }
    のように、初期化子セクション・継続条件セクション・反復子セクションを
    空欄にすることさえあります。

    あるいは逆に、複数の変数を用いて
     for (int C = 1, D = 7; C < D; C += 2, D++)
    みたいなこともできます。これはあまり使われることは無い表記ですが。


    > 初期値みたいなものでしょうか。

    ザックリ言うと、いわゆる

     for(int i = 1; i < 10 ; i++)
     {
       // 処理
     }

    という処理は、別の書き方をすれば

     {
      int i = 1;  // 変数 i を宣言し、初期値として 1 をセット
      while(i < 10) // 「i < 10」の条件を満たしている間ループする
      {
        //処理
        i++;   // ループの各回の終わりに「i++」を実行
      };
     }

    と同じ意味です。
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78147  Re[7]: 演算について(C#)
□投稿者/ furu -(2015/12/17(Thu) 13:19:16)
    タカタさん

    ある程度、プログラムを張り付けて頂いた方が解決が早いと思います。

    いろんな疑問があり、想像でしか答えられません。

    Xの型はなんなのか?
    Timeの型はなんのか?
    おかしな現象の時のXとTimeの値は?
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78150  Re[8]: 演算について(C#)
□投稿者/ 774RR -(2015/12/17(Thu) 13:43:36)
    現状、読者としては限りなく情報不足なので憶測するしかなくて、なので話が収束しない。

    とりあえずデバッガの使い方を覚えてみよう。
    ・ループ直前にブレイクポイントを置いて
    ・ループをステップ実行しながら
    ・ウオッチ画面に表示される変数値を随時確認してみる
    とか

    C でいう printf デバッグ C# なら Debug.WriteLine デバッグ
    毎回 System.Diagnostics.Debug.WriteLine と書くのは長ったらしいので
    using System.Diagnostics; しておいて
    見たい変数があるところで(このケースの場合ループ内)
    Debug.WriteLine("i=" + i.ToString() + " X=" + X.ToString()); のように書くと
    デバッグ実行のときだけこの機能が有効になり、デバッガ画面に表示がされる
    リリース実行のときはこの機能はそもそもコンパイルすらされない

    そうすると何かわかるかもしれない
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78151  Re[9]: 演算について(C#)
□投稿者/ タカタ -(2015/12/17(Thu) 19:24:13)
    皆様、ご回答有難う御座います。長文になりますがとりあえずプログラム貼り付けます。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;

    namespace WindowsFormsApplication7
    {
    public partial class Form1 : Form
    {
    //計算に使用する各パラメータを定義
    float platenPCD01;
    float platenPCD02;
    float module;
    float gearINT;
    float gearSUN;
    float waferPCD;
    float waferPosition;
    float rpmUpper;
    float rpmLower;
    float rpmINT;
    float rpmSUN;
    float rpmWafer;
    float Theta;

    public Form1()
    {
    InitializeComponent();

    platenPCD01 = 1420;
    platenPCD02 = 430;
    module = 5;
    gearINT = 290;
    gearSUN = 80;
    waferPCD = 300;
    waferPosition = 150;
    rpmUpper = -10;
    rpmLower = 10;
    rpmINT = 30;
    rpmSUN = 10;
    rpmWafer = 0;
    float CRV = ((gearSUN * rpmSUN) + (gearINT * rpmINT)) / (gearSUN + gearINT);
    float CRO = ((((module * gearINT) / 2) * rpmINT) - (((module * gearSUN) / 2) * rpmSUN)) / ((module * gearINT - module * gearSUN) / 2);
    float Time = Theta / 36;
    double dThetaC = CRV / 60 * Math.PI * Time;
    float ThetaC = (float)dThetaC;
    }

    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
    platenPCD01 = 1420;
    platenPCD02 = 430;
    module = 5;
    gearINT = 290;
    gearSUN = 80;
    waferPCD = 300;
    waferPosition = 150;
    rpmUpper = -10;
    rpmLower = 10;
    rpmINT = 30;
    rpmSUN = 10;
    rpmWafer = 0;

    float CRV = ((gearSUN * rpmSUN) + (gearINT * rpmINT)) / (gearSUN + gearINT);
    float CRO = ((((module * gearINT) / 2) * rpmINT) - (((module * gearSUN) / 2) * rpmSUN)) / ((module * gearINT - module * gearSUN) / 2);

    float Time = Theta / 36;

    double dThetaC = CRV / 120 * Math.PI * Time;
    float ThetaC = (float)dThetaC;

    double dThetaW = CRO / 120 * Math.PI * Time;
    float ThetaW = (float)dThetaW;

    double dThetaWW = (CRO + rpmWafer) / 120 * Math.PI * Time;
    float ThetaWW = (float)dThetaWW;

    double dThetaL = rpmLower / 120 * Math.PI * Time;
    float ThetaL = (float)dThetaL;

    double dThetaL0 = rpmLower / 120 * Math.PI * ((Theta - 1) / 36);
    float ThetaL0 = (float)dThetaL0;

    double dWXC = ((module * gearSUN) / 2 + ((module * gearINT - module * gearSUN) / 4)) * Math.Cos(ThetaC) + waferPosition / 2 * Math.Cos(ThetaW);
    double dWYC = ((module * gearSUN) / 2 + ((module * gearINT - module * gearSUN) / 4)) * Math.Sin(ThetaC) + waferPosition / 2 * Math.Sin(ThetaW);
    float WXC, WYC;
    WXC = (float)dWXC;
    WYC = (float)dWYC;

    double dThetaC0 = CRV / 120 * Math.PI * ((Theta - 1) / 36);
    float ThetaC0 = (float)dThetaC0;
    double dThetaW0 = CRO / 120 * Math.PI * ((Theta - 1) / 36);
    float ThetaW0 = (float)dThetaW0;

    double dWXC0 = ((module * gearSUN) / 2 + ((module * gearINT - module * gearSUN) / 4)) * Math.Cos(ThetaC0) + waferPosition / 2 * Math.Cos(ThetaW0);
    double dWYC0 = ((module * gearSUN) / 2 + ((module * gearINT - module * gearSUN) / 4)) * Math.Sin(ThetaC0) + waferPosition / 2 * Math.Sin(ThetaW0);
    float WXC0, WYC0;
    WXC0 = (float)dWXC0;
    WYC0 = (float)dWYC0;

    double dThetaWW0 = (CRO + rpmWafer) / 120 * Math.PI * ((Theta - 1) / 36);
    float ThetaWW0 = (float)dThetaWW0;

    double dX150r0d = WXC + 150 * Math.Cos(ThetaWW + 0);
    double dY150r0d = WYC + 150 * Math.Sin(ThetaWW + 0);
    float X150r0d, Y150r0d;
    X150r0d = (float)dX150r0d;
    Y150r0d = (float)dY150r0d;

    double dX150r0d0 = WXC0 + 150 * Math.Cos(ThetaWW0 + 0);
    double dY150r0d0 = WYC0 + 150 * Math.Sin(ThetaWW0 + 0);
    float X150r0d0, Y150r0d0;
    X150r0d0 = (float)dX150r0d0;
    Y150r0d0 = (float)dY150r0d0;

    float VX150r0d = X150r0d - X150r0d0;
    float VY150r0d = Y150r0d - Y150r0d0;

    double dR150r0d = Math.Sqrt((X150r0d * X150r0d) + (Y150r0d * Y150r0d));
    float R150r0d;
    R150r0d = (float)dR150r0d;

    float M;
    if (X150r0d < 0)
    {
    M = 180;
    }
    else if (X150r0d > 0 && Y150r0d < 0)
    {
    M = 360;
    }
    else
    {
    M = 0;
    }

    double dT150r0d = Math.Atan(Y150r0d / X150r0d) * 180 / Math.PI + M;
    float T150r0d;
    T150r0d = (float)dT150r0d;
    double dVXP150r0d = (-R150r0d * (ThetaL)) * Math.Sin(T150r0d / 180 * Math.PI) - (-R150r0d * (ThetaL0)) * Math.Sin(T150r0d / 180 * Math.PI);
    float VXP150r0d, VYP150r0d;
    VXP150r0d = (float)dVXP150r0d;
    double dVYP150r0d = (R150r0d * (ThetaL)) * Math.Cos(T150r0d / 180 * Math.PI) - (R150r0d * (ThetaL0)) * Math.Cos(T150r0d / 180 * Math.PI);
    VYP150r0d = (float)dVYP150r0d;
    float VRX150r0d = VX150r0d - VXP150r0d;
    float VRY150r0d = VY150r0d - VYP150r0d;
    double dSR150r0d = (Math.Sqrt((VRX150r0d * VRX150r0d) + (VRY150r0d * VRY150r0d)));

    if (R150r0d > platenPCD01 / 2 && R150r0d < platenPCD02 / 2)
    {
    dSR150r0d = 0;
    }
    float SR150r0d;
    SR150r0d = (float)dSR150r0d;

    int SSSR150r0d;
    SSSR150r0d = (int)SR150r0d;


    float SSR150r0d = 0;
    for (int d = 1; d <= Theta; d++)
    {
    SSR150r0d += SSSR150r0d;
    }



    label35.Text = "移動量の総和: " + SSSR150r0d.ToString("F1");
    label28.Text = "移動量: " + SSR150r0d.ToString("F1");
    label30.Text = "Theta: " + Theta;
    }

    private void hsbPhase_Scroll(object sender, ScrollEventArgs e)
    {
    Theta = hsbPhase.Value;
    Refresh();
    }

    private void btnAuto_Click(object sender, EventArgs e)
    {
    if (btnAuto.Text == "自動")
    {
    btnAuto.Text = "停止";
    timer1.Interval = 1;
    timer1.Start();
    }
    else
    {
    btnAuto.Text = "自動";
    timer1.Stop();
    }
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
    if (hsbPhase.Value < hsbPhase.Maximum)
    {
    hsbPhase.Value += 1;
    }
    else
    {
    hsbPhase.Value = hsbPhase.Minimum;
    }
    Theta = hsbPhase.Value;
    Refresh();
    }
    }
    }

    計算を始めるボタンを設けて、ボタンを押すと変数 Theta が1ずつ増えていきます。Thetaの値はスクロールバーとも連動しています。

    変数がたくさんありますが、Thetaの値が1ずつ増えていったときの SSSR150r0d の値を見てみると、

    Theta が 100くらいまでは、SSSR150r0d の値は 9 という値になっていますが、その後、8・・・7・・・6・・・ と変化していきます。

    SSR150r0d は SSSR150r0d の値の総和を見ていますが、なぜか 1200くらいまで増えていったときに、一旦 1000 に下がり、

    また1100 まで増えると 1000 になったりと、変な挙動を示しております。


    無理やりプログラムを貼り付けてしまってご迷惑おかけします。
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78155  Re[10]: 演算について(C#)
□投稿者/ Azulean -(2015/12/17(Thu) 22:15:16)
    2015/12/17(Thu) 22:18:38 編集(投稿者)

    No78151 (タカタ さん) に返信
    > Theta が 100くらいまでは、SSSR150r0d の値は 9 という値になっていますが、その後、8・・・7・・・6・・・ と変化していきます。
    >
    > SSR150r0d は SSSR150r0d の値の総和を見ていますが、なぜか 1200くらいまで増えていったときに、一旦 1000 に下がり、
    >
    > また1100 まで増えると 1000 になったりと、変な挙動を示しております。

    どの時点の SSR150r0d を気にしているのですか?
    for ループを抜けた後の数値ですか?
    それが正しいとして、SSR150r0d はどうなっていくことを期待しているのでしょうか?


    SSR150r0d はある Theta の時の SSSR150r0d の合計に過ぎませんから、SSSR150r0d が減っていくことがあるのであれば、Theta の増分次第では次の合計値は前回の合計値よりも減っていくこともあるかと思います。
    そういうことではなくて?

    (SSR150r0d はローカル変数なのですから、Paint イベントが呼ばれる度に 0 から足し直される。結果として、足し込む数 SSSR150r0d と足す回数 Theta の関係性によっては、SSR150r0d が前回値よりも減ったように見えるはずです)
    -----
    SSSR150r0d の結果をずっと蓄積したい、Paint イベントの度にどんどん増やしていきたいのであれば、for ループをなくして、SSR150r0d をメンバー変数(フィールド変数)に昇格すべきです。
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78157  Re[10]: 演算について(C#)
□投稿者/ 魔界の仮面弁士 -(2015/12/17(Thu) 23:13:11)
    2015/12/17(Thu) 23:18:42 編集(投稿者)

    No78151 (タカタ さん) に返信
    本題となる、質問されていたループというのは、この部分ですよね。

    > float SSR150r0d = 0;
    > for (int d = 1; d <= Theta; d++)
    > {
    >   SSR150r0d += SSSR150r0d;
    > }

    上記は要するに、SSSR150r0d を Theta 回分、足し続けているだけなので、
      float SSR150r0d = SSSR150r0d * Theta;
    と同じ結果しか生み出しません。

    では、その時々で、SSSR150r0d の値はどうなっていましたか?
    そして、その SSSR150r0d を生み出す元となる、
    dSR150r0d の値はどのような内容でしたか?


    ――具体的に見てみましょうか。

    >> なぜか加算しているのにも関わらず なぜか 10,8,6,4・・・・のように減っていってしまいます。
    たとえば「Theta」が 100 の場合、
     float Time = Theta / 36;
    は 2.77777767 です。

    そのまま計算を続けると、
     float R150r0d;
     R150r0d = (float)dR150r0d;
    にて、値が 631.63821038695028 から 631.6382 へと丸められ、
     double dSR150r0d = (Math.Sqrt((VRX150r0d * VRX150r0d) + (VRY150r0d * VRY150r0d)));
    を通じて 8.8952280275213376 となります。
    これを int にしているのですから、SSSR150r0d は『8』ですよね。


    一方、「Theta」が 90 の場合、
     float Time = Theta / 36;
    は 2.5 です。そして、
     R150r0d = (float)dR150r0d;
    では、642.06091402559639 から 642.0609 へと丸められ、
     double dSR150r0d = (Math.Sqrt((VRX150r0d * VRX150r0d) + (VRY150r0d * VRY150r0d)));
    が 9.0639756483810388 となります。
    これを int にしているのですから、SSSR150r0d は『9』ですよね。


    ですから、Theta が 90 のときに「9」だったものが
    100 になって「8」というのは、プログラムとしては正しい動作というわけです。
    それが望んできた結果かどうかは別として。


    プログラムというのは、思っていた通りに動くのではなく、書いたとおりに動くものです。
    ですから、それぞれの各行がどういう計算を行っているのかを、自身がデータ型も含めて
    把握していなければ、問題個所を特定できません。
    それを把握し、調査・修正する作業が「デバッグ」となります。



    === 以下余談 ===

    > Thetaの値はスクロールバーとも連動しています。
    hsbPhase ということは、水平スクロールバーでしょうか。
    (水平スクロールバー の代わりに、TrackBar でも良いかも)


    今回は Scroll イベントを使われているようですが、このケースでは
    ValueChanged イベントを使う方がおすすめです。というのも、
    >  hsbPhase.Value += 1;
    のように、Value を直接書き換える際には、
    ValueChanged は発生しますが、Scroll は発生しないからです。

    そのため、上記を ValueChanged に差し替えれば、
    >  Theta = hsbPhase.Value;
    の処理を、Tick と Scroll の二か所に記述する必要がなく、
    ValueChanged の一か所に書くだけで済みます。



    > 長文になりますがとりあえずプログラム貼り付けます。

    Paint は「再描画が必要になった」ことを通知するイベントであり、
    その引数 e.Graphics を通じて、描画処理を行うために用意されています。

    しかし提示されたコードでは、Paint の引数 e は一切使用されておらず、
    本来の使い方からはかけ離れています。ましてや、このタイミングで
    Label の値を変更するというコードのは、処理としては不自然です。


    もう一つの問題はコンストラクタ。

    >   float Time = this.Theta / 36;
    >   double dThetaC = CRV / 60 * Math.PI * Time;
    >   float ThetaC = (float)dThetaC;
    > }
    コンストラクタの最後に、Time , dThetaC , ThetaC という変数を宣言し、
    値を格納していますが、その値は一切使われていません。これらの変数は
    ローカル変数であるがゆえ、コンストラクタの処理が終わった時点で
    破棄されてしまい、まったくの無意味です。


    ほかにも、float と double などの型変換が、
    無暗に行われすぎていて、無計画的にみえてしまう点や、
    整数型なのに何故か F1 フォーマットを適用している点など
    いろいろと突っ込みどころがありますが…とりあえずこの辺で。
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/

■78218  Re[11]: 演算について(C#)
□投稿者/ タカタ -(2015/12/22(Tue) 20:46:48)
    皆様、返事が遅くなり申し訳御座いません。

    加算していく変数を、メンバー変数にすることで問題解決できました。

    私のような初心者に丁寧に説明、かつ粘り強く解決への道筋を提示頂き、大変感謝しております。

    有難う御座いました。
記事No.77967 のレス /過去ログ132より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -