using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace vcsTODAPP { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //----------------------------------------------------------------------- private void toolStripButton1_Click(object sender, EventArgs e) { double tpoint, ppoint, prbs; int r; System.IO.StreamReader sr; System.IO.StreamWriter sw; string dat; string[] sbuf; char delim = ','; string fname1 = ""; string fname2 = ""; int i, k, ndata; string com; //入出力ファイル指定 openFileDialog1.InitialDirectory = System.IO.Directory.GetCurrentDirectory(); if (openFileDialog1.ShowDialog() == DialogResult.OK) fname1 = openFileDialog1.FileName; if (saveFileDialog1.ShowDialog() == DialogResult.OK) fname2 = saveFileDialog1.FileName; //読み込み sr = new System.IO.StreamReader(fname1, System.Text.Encoding.Default); dat = sr.ReadLine(); com = dat; dat = sr.ReadLine(); sbuf = dat.Split(delim); ndata = int.Parse(sbuf[0]); double[] xd = new double[ndata]; double[] yd = new double[ndata]; k = 0; while (!sr.EndOfStream) { dat = sr.ReadLine(); sbuf = dat.Split(delim); xd[k] = double.Parse(sbuf[0]); yd[k] = double.Parse(sbuf[1]) + 0.5; k = k + 1; } sr.Close(); ndata = k - 1; //確率計算・画面表示 for (i = 0; i <= ndata; i++) { ppoint = xd[i]; prbs = SHENTON(ppoint); tpoint = TODA(prbs); r = dataGridView1.Rows.Add(); dataGridView1[0, r].Value = xd[i].ToString("0.0"); dataGridView1[1, r].Value = yd[i].ToString("0.000000"); dataGridView1[2, r].Value = prbs.ToString("0.000000"); dataGridView1[3, r].Value = tpoint.ToString("0.000"); } //書き込み sw = new System.IO.StreamWriter(fname2, false, System.Text.Encoding.Default); sw.WriteLine(com); sw.WriteLine("%点(入力値),非超過確率(正規分布表),非超過確率(Shenton),%点(戸田)"); k = 3; for (r = 0; r <= ndata; r++) { dat = dataGridView1[0, r].Value.ToString(); for (i = 1; i <= k; i++) { dat = dat + "," + dataGridView1[i, r].Value.ToString(); } sw.WriteLine(dat); } sw.Close(); } //----------------------------------------------------------------------- private double TODA(double rx) { //非超過確率の%点 int i; double ry, ay, uay,sum; double[] b = new double[11]; if (rx == 0.5) { uay = 0.0; } else { if (rx < 0.5) { ry = rx; } else { ry = 1 - rx; } ay = -Math.Log(4.0 * ry * (1.0 - ry)); b[0] = 1.570796288; b[1] = 0.03706987906; b[2] = -0.0008364353589; b[3] = -0.0002250947176; b[4] = 0.000006841218299; b[5] = 0.000005824238515; b[6] = -0.00000104527497; b[7] = 0.00000008360937017; b[8] = -0.000000003231081277; b[9] = 0.00000000003657763036; b[10] = 0.0000000000006936233982; sum = 0.0; for (i = 0; i <= 10; i++) { sum = sum + b[i] * Math.Pow(ay, (double)i); } uay = Math.Sqrt(ay * sum); if (rx < 0.5) uay = -uay; } return uay; } //----------------------------------------------------------------------- private double SHENTON(double u) { //%点に対する非超過確率 int nt = 30; int ii; double ue, af, qh, ag, ab, q; ue = 0.0; if (u >= 0) ue = u; if (u < 0) ue = -u; af = ue * ue; qh = 0.0; ag = Math.Exp(-0.5 * af) * 0.3989422804014327; ab = -1.0; for (ii = nt; ii >= 1; ii--) { qh = (double)ii * af / (2.0 * (double)ii + 1.0 + ab * qh); ab = -ab; } qh = 0.5 - ag * ue / (1.0 - qh); if (u < 0) qh = 1.0 - qh; q = qh; return 1.0 - q; } //----------------------------------------------------------------------- private void Form1_Load_1(object sender, EventArgs e) { dataGridView1.ColumnCount = 4; dataGridView1.Columns[0].Width = 100; dataGridView1.Columns[1].Width = 100; dataGridView1.Columns[2].Width = 100; dataGridView1.Columns[3].Width = 100; dataGridView1.Columns[0].HeaderText = "%点(入力値)"; dataGridView1.Columns[1].HeaderText = "非超過確率(正規分布表)"; dataGridView1.Columns[2].HeaderText = "非超過確率(Shenton)"; dataGridView1.Columns[3].HeaderText = "%点(戸田)"; } //----------------------------------------------------------------------- } }