2012-05-02 11 views
-3

Я редактирую программу, сделанную тем, кто знает, учитель. В любом случае, это отображение значений запаса, которые хранятся в массиве, показанном на графике. Учитель отметил, что ось Y графика неверна, но нам не нужно ее менять. Нам нужно изменить флажки для флажков, чтобы мы могли отображать несколько значений запаса на графике.Минимальные и максимальные значения массива

Итак, чтобы нарисовать новый график, мы должны получить минимальные и максимальные значения Y выбранных запасов. Я решил пойти с:

if (checkBox1.Checked == true) 
{ 
    GetStockValues(0); 
    maxVal[0] = StockArray.Max(); 
} 
int maxValue = Convert.ToInt16(maxVal.Min()); 
return maxValue; 

То же самое касается minValue. Проблема в том, что я не получаю правильных чисел. Вот и вся программа:

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 VC2008_StockMktGraphics 
{ 
    public partial class frmMaster : Form 
    { 
     // let's make the stock values array be public so we don't have to pass 
     // them back and forth. 

     public double[] StockArray = new double[ 30 ] ; 
     public double[] minVal = new double [ 4 ]; 
     public double[] maxVal = new double[4]; 

     public frmMaster() 
     { 
      InitializeComponent(); 
     } 

     private void frmMaster_Resize(object sender, EventArgs e) 
     { 
      this.Invalidate() ; 
     } 

     protected override void OnPaint(PaintEventArgs e) 
      { 
      int h = this.Bounds.Height ; 
      int w = this.Bounds.Width ; 

      Rectangle r = new Rectangle(); 

      // Create the graphics context to draw into 
      Graphics gc = this.CreateGraphics() ; 
      Pen pBl = new Pen(Color.Black , 2) ; 
      SolidBrush sB = new SolidBrush(Color.Honeydew) ; 

      // if the window is too small, force it to a size 
      if ((h < 200) || (w < 200)) 
      { 
       this.Width = 200 ; 
       this.Height = 200 ; 
      } 

      // Set dynamic location of graphics box 
      r.X=Convert.ToInt32(Convert.ToDouble(w) * 0.2) ; 
      r.Y=Convert.ToInt32(Convert.ToDouble(w) * 0.2) ; 
      r.Width=Convert.ToInt32(Convert.ToDouble(w) * 0.8) -r.X ; 
      r.Height=Convert.ToInt32(Convert.ToDouble(h) * 0.8 -r.Y); 

      // draw the outer rectangle and fill with a light color 
      gc.DrawRectangle(pBl, r); 
      gc.FillRectangle(sB, r); 

      // set the location of the buttons 
      btnExit.Left = r.X + r.Width + 10; 
      btnExit.Top = 10; 
      chkStartAtZero.Left = r.X + r.Width + 10; 
      chkStartAtZero.Top = btnExit.Top + 25; 
      checkBox1.Left = r.X + r.Width + 10; 
      checkBox1.Top = chkStartAtZero.Top + 25; 
      checkBox2.Left = checkBox1.Left; 
      checkBox2.Top = checkBox1.Top + 25; 
      checkBox3.Left = checkBox2.Left; 
      checkBox3.Top = checkBox2.Top + 25; 
      checkBox4.Left = checkBox3.Left; 
      checkBox4.Top = checkBox3.Top + 25; 

      if (checkBox1.Checked == true) 
       DrawStock(0, gc, r); 
      if (checkBox2.Checked == true) 
       DrawStock(1, gc, r); 
      if (checkBox3.Checked == true) 
       DrawStock(2, gc, r); 
      if (checkBox4.Checked == true) 
       DrawStock(3, gc, r); 

      // dispose of object memories we've allocated 
      pBl.Dispose() ; 
      sB.Dispose(); 
      gc.Dispose() ; 
     } 

     public void DrawStock(int iWhichStock , Graphics gc , Rectangle r) 
     { 
      int i ; 
      int iLabelX; 
      int iMinY = 999999; 
      int iMaxY = 0; 
      int iCnt; 

      double dxIncrement; 
      double dyIncrement; 

      string strAxisLabel; 

      Point pLineStart = new Point(); 
      Point pLineEnd = new Point(); 

      Pen pB2 = new Pen(Color.Red, 2); 

      Font f = new Font("Ariel", (float)10.0); 

      Brush b = new SolidBrush(Color.Blue); 

      // Normally, we'd get stock from a database, I'm just going to go 
      // get it from a function with hard-coded values for demonstration 
      // purposes. 
      iMinY = Convert.ToInt16(GetMin()); 
      iMaxY = Convert.ToInt16(GetMax()); 


      // Take the min and max to the next increment of 5 outside them. 
      iMinY = Convert.ToInt16(iMinY/5) * 5 ; 
      iMaxY = (Convert.ToInt16(iMaxY/5) + 1) * 5 ; 


      // Find the number of x-coordinate values 
      iCnt = 0; 
      foreach (double d in StockArray) 
      { 
       if (d > 0) 
        iCnt++; 
      } 

      // so now we know how many x values there are to spread on the x-axis 

      dxIncrement = Convert.ToDouble(r.Width/iCnt); 

      // if the zero checkbox is checked, then we'll set the minimums to zero 
      if (chkStartAtZero.Checked == true) 
      { 
       iMinY = 0; 
       dMinStockValue = 0.0; 
      } 

      // so each y-axis pixel must contain this many dollars of actual stock price 

      dyIncrement = Convert.ToDouble(r.Height/(iMaxY - iMinY)); 

      // set the starting point of the stock line 
      pLineStart.X = r.X; 
      pLineStart.Y = r.Top + r.Height - 
          Convert.ToInt16(dyIncrement * (StockArray[ 0 ] - Convert.ToDouble(iMinY))) ; 

      // now graph them 
      for(i = 1 ; i < StockArray.Length ; i++) 
      { 
       if(StockArray[i] == 0) 
        continue ; 
       pLineEnd.X = pLineStart.X + Convert.ToInt16(dxIncrement); 
       pLineEnd.Y = r.Top + r.Height - 
            Convert.ToInt16(dyIncrement * (StockArray[i] - Convert.ToDouble(iMinY))); 
       gc.DrawLine(pB2,pLineStart, pLineEnd) ; 
       pLineStart = pLineEnd ; 
      } 

      // now draw the y-axis labels 
      i = iMinY; 
      pLineStart.X = r.X; 
      pLineStart.Y = r.Top + r.Height - Convert.ToInt16(0); 
      pLineEnd.X = r.X - 8; 

      while(i <= iMaxY) 
      { 
       pLineStart.Y = r.Top + r.Height - 
           Convert.ToInt16(Convert.ToDouble(i-iMinY) * dyIncrement) ; 
       pLineEnd.Y = pLineStart.Y; 
       gc.DrawLine(pB2, pLineStart, pLineEnd); 
       strAxisLabel = Convert.ToString(i); 
       iLabelX = pLineEnd.X - 18; 
       if (i < 10) 
        iLabelX = pLineEnd.X - 8; 
       else 
        if (i < 100) 
         iLabelX = pLineEnd.X - 18; 
        else 
         if (i < 1000) 
          iLabelX = pLineEnd.X - 28; 

       gc.DrawString(strAxisLabel, f, b, iLabelX, pLineEnd.Y - 8); 
       i += 10; 
      }     
     } 

     public double GetMin() 
     {  
      if (checkBox1.Checked == true) 
      { 
       GetStockValues(0); 
       minVal[0] = StockArray.Min(); 
      } 
      if (checkBox2.Checked == true) 
      { 
       GetStockValues(1); 
       minVal[1] = StockArray.Min(); 
      } 
      if (checkBox3.Checked == true) 
      { 
       GetStockValues(2); 
       minVal[2] = StockArray.Min(); 
      } 
      if (checkBox4.Checked == true) 
      { 
       GetStockValues(3); 
       minVal[3] = StockArray.Min(); 
      } 
      int minValue = Convert.ToInt16(minVal.Min()); 
      label1.Text = Convert.ToString(minValue); 
      return minValue; 
     } 

     public double GetMax() 
     { 
      if (checkBox1.Checked == true) 
      { 
       GetStockValues(0); 
       maxVal[0] = StockArray.Max(); 
      } 
      if (checkBox2.Checked == true) 
      { 
       GetStockValues(1); 
       maxVal[1] = StockArray.Max(); 
      } 
      if (checkBox3.Checked == true) 
      { 
       GetStockValues(2); 
       maxVal[2] = StockArray.Max(); 
      } 
      if (checkBox4.Checked == true) 
      { 
       GetStockValues(3); 
       maxVal[3] = StockArray.Max(); 
      } 
      int maxValue = Convert.ToInt16(maxVal.Min()); 
      label2.Text = Convert.ToString(maxValue); 
      return maxValue; 
     } 

     public void GetStockValues(int iWhichStock) 
     { 
     if (iWhichStock == 0) 
      { 
       // IBM 
       StockArray[0] = 147.64; // 1-10-11 
       StockArray[1] = 147.28; 
       StockArray[2] = 149.10; 
       StockArray[3] = 148.82; 
       StockArray[4] = 150.00; 
       StockArray[5] = 150.65; 
       StockArray[6] = 155.69; 
       StockArray[7] = 155.80; 
       StockArray[8] = 155.50; 
       StockArray[9] = 159.63; 
       StockArray[10] = 161.44; 
       StockArray[11] = 161.04; 
       StockArray[12] = 161.07; 
       StockArray[13] = 159.21; 
       StockArray[14] = 162.00; 
       StockArray[15] = 163.56; 
       StockArray[16] = 163.30; 
       StockArray[17] = 163.53; 
       StockArray[18] = 164.00; 
       StockArray[19] = 164.83; 
      } 
      if (iWhichStock == 1) 
      { 
       // BA (The Boeing Company) 
       StockArray[0] = 69.09; // 1-10-11 
       StockArray[1] = 68.96; 
       StockArray[2] = 70.15; 
       StockArray[3] = 69.63; 
       StockArray[4] = 70.07; 
       StockArray[5] = 72.47; 
       StockArray[6] = 71.73; 
       StockArray[7] = 71.12; 
       StockArray[8] = 71.68; 
       StockArray[9] = 72.73; 
       StockArray[10] = 72.24; 
       StockArray[11] = 70.02; 
       StockArray[12] = 70.56; 
       StockArray[13] = 69.23; 
       StockArray[14] = 69.48; 
       StockArray[15] = 70.29; 
       StockArray[16] = 71.00; 
       StockArray[17] = 70.98; 
       StockArray[18] = 71.38; 
       StockArray[19] = 71.93; 
      } 
      if (iWhichStock == 2) 
      { 
       // CAP (CAI International 
       StockArray[0] = 19.44; // 1-10-11 
       StockArray[1] = 19.66; 
       StockArray[2] = 19.68; 
       StockArray[3] = 19.45; 
       StockArray[4] = 19.79; 
       StockArray[5] = 19.90; 
       StockArray[6] = 19.53; 
       StockArray[7] = 19.06; 
       StockArray[8] = 19.05; 
       StockArray[9] = 19.14; 
       StockArray[10] = 19.28; 
       StockArray[11] = 20.11; 
       StockArray[12] = 19.74; 
       StockArray[13] = 19.06; 
       StockArray[14] = 19.04; 
       StockArray[15] = 20.03; 
       StockArray[16] = 19.69; 
       StockArray[17] = 19.56; 
       StockArray[18] = 19.61; 
       StockArray[19] = 19.63; 
      } 
      if (iWhichStock == 3) 
      { 
       // TOT (Total Societe Anonyme) 
       StockArray[0] = 53.00; // 1-10-11 
       StockArray[1] = 53.32; 
       StockArray[2] = 55.00; 
       StockArray[3] = 56.03; 
       StockArray[4] = 57.11; 
       StockArray[5] = 57.10; 
       StockArray[6] = 56.95; 
       StockArray[7] = 57.12; 
       StockArray[8] = 57.12; 
       StockArray[9] = 58.04; 
       StockArray[10] = 58.79; 
       StockArray[11] = 58.69; 
       StockArray[12] = 59.00; 
       StockArray[13] = 59.50; 
       StockArray[14] = 57.80; 
       StockArray[15] = 58.77; 
       StockArray[16] = 61.03; 
       StockArray[17] = 60.70; 
       StockArray[18] = 59.76; 
       StockArray[19] = 59.25; 
      } 
     } 

     private void btnExit_Click(object sender, EventArgs e) 
     { 
      Application.Exit(); 
     } 

     private void chkStartAtZero_CheckedChanged(object sender, EventArgs e) 
     { 
      this.Invalidate(); 
     } 

     private void checkBox1_CheckedChanged(object sender, EventArgs e) 
     { 
      this.Invalidate(); 
     } 

     private void checkBox2_CheckedChanged(object sender, EventArgs e) 
     { 
      this.Invalidate(); 
     } 

     private void checkBox3_CheckedChanged(object sender, EventArgs e) 
     { 
      this.Invalidate(); 
     } 

     private void checkBox4_CheckedChanged(object sender, EventArgs e) 
     { 
      this.Invalidate(); 
     } 

     private void frmMaster_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 
+6

Когда у вас есть переменная с именем maxValue, вы действительно собираетесь использовать Min()? (ваш код: 'int maxValue = Convert.ToInt16 (maxVal.Min()); ') Кроме того, нам не нужно видеть всю вашу программу, откидывайте ее специально для той части, которая не работает. Опустите остальных, это отвлекает. –

+1

@Erkdance, вы получите ответы лучше, если зададите вопрос с более узким и более общим охватом. Теперь вы задаете несколько вопросов, а может быть, и о программировании WinForms, а другое о получении значений min и max из массива. Попробуйте перевести его на простые факты и задайте более одного вопроса. Удачи! –

+0

Max() и Min() - метод расширения Linq. Я пытаюсь найти минимальное значение (и максимум) четырех разных массивов и хранить значения в другом массиве. Значение, которое я пытаюсь вернуть, minValue, является минимальным значением всех массивов. – Erkdance

ответ

1

Пара проблем. Ваша основная проблема: вы звоните int maxValue = Convert.ToInt16(maxVal.Min()); в GetMax(), я думаю, вы хотели int maxValue = Convert.ToInt16(maxVal.Max());.

Однако, как только вы исправите это, вы столкнетесь с тем, что сравниваете неинициализированные/старые значения массива maxVal.

Скажите, что у меня есть только флажок 1 и 3, а затем я сниму 3, Каким будет значение maxVal [2], когда будет запущено время GetMax или GetMin (вот подсказка, это не 0)

+0

Вы были правы, меняя Min() на Max, мою опечатку. Однако GetMin(); всегда возвращается 0 на любой из акций. Спасибо, что указали на неинициализированные/старые значения, это было бы моим следующим шагом после того, как мои значения GetMin GetMax вернут правильные значения. – Erkdance

+0

«GetMin(); всегда возвращается 0», еще один ключ, Вернуться к моему примеру «Я только проверял 1 и 3». Каково значение MinVal [1] и MinVal [3] после запуска GetMin() один раз и никогда проверка ящиков Коробки 2 или 4? –

+0

Он всегда будет возвращать 0. – Erkdance

Смежные вопросы