# 北軟99 pB 觀察輸入資料的分布 ###### tags: `北軟99` ## 題目: 當要觀察大量資料的分布情形時,可以利用讀檔方式,寫程式將許多筆資料讀進來觀測,也可以一筆資料接著一筆資料陸續讀進來,每一筆資料讀進電腦後,觀察資料分布情形。假設要讀入的資料檔檔名為 DataXY.txt,假設有三筆資料如下: 1 16 **29 89 1** 41 90 0 **55 90 0** 64 90 0 **91 75 0** 104 76 0 **121 79 0** 135 81 0 **191 116 1** 217 107 0 **239 83 0** 258 81 0 **284 89 0** 338 150 1 **433 141 0** 471 165 1 --- 2 15 9 231 1 39 238 1 75 230 1 112 218 1 146 202 1 182 167 1 217 127 1 252 100 1 284 91 1 319 86 1 353 78 1 388 72 1 419 67 1 451 62 1 476 58 1 --- 3 18 17 211 1 49 202 0 88 204 1 112 198 0 122 197 1 159 198 1 225 198 0 239 196 1 262 192 0 300 199 1 329 171 0 343 173 0 364 187 0 374 187 1 386 188 0 408 190 0 432 167 0 469 198 1 --- 上述三筆資料中,每一筆資料格式為:每個欄位用一個空白隔開,第一欄是第幾筆資料,第二欄是這一筆資料有幾項,接下來,每三個欄位為一項資料,一項資料裡的第一個欄位表示水平軸位址,第二個欄位表示垂直軸位址,第三個欄位表示類別,有兩個類別: 1 和 0。請寫一個程式,可以將資料檔 DataXY.txt 讀入電腦中,並可以一筆一筆顯示資料分布的情形,其中,第 1 類資料用紅色 o 表示,第 0 類資料用藍色\*表示,注意:資料是累積顯示,執行範例如下: ![](https://i.imgur.com/BnBNbXH.png) 評分: 1. 程式介面 (2.5 分)。 2. 可以一筆一筆顯示資料分布的情形(5 分)。 3. 可以繪出兩類資料分布(5 分)。 4. 每讀入一筆資料,水平和垂直座標,會隨著讀入資料不同而變動(12.5 分)。 ## 想法 我們先對圖表物件做預處理。 chart物件→屬性→圖表→Series集合 新增兩個Series,並且ChartType全部設為point。 ![](https://i.imgur.com/qQ1OV9H.png) 接下來,我們只需要讀資料,存成陣列,然後一一把點新增上去就好。 ## 程式碼(C#) ```csharp= 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.Windows.Forms; using System.IO; namespace problemB { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.ShowDialog(); string fileName = ofd.FileName; if (fileName.Equals("")) { return; } string data; using (StreamReader fs = new StreamReader(fileName)) { while ((data = fs.ReadLine()) != null) { string[] dataArray = data.Split(' '); int[] dataIntegerArray = new int[dataArray.Length]; for (int i = 0; i < dataArray.Length; i++) { dataIntegerArray[i] = Convert.ToInt32(dataArray[i]); } for (int i = 0; i < dataIntegerArray[1]; i++) { int x = dataIntegerArray[2 + i * 3]; int y = dataIntegerArray[2 + i * 3 + 1]; int group = dataIntegerArray[2 + i * 3 + 2]; if (group == 0) { chart1.Series[0].Points.AddXY(x, y); } else if (group == 1) { chart1.Series[1].Points.AddXY(x, y); } } } } } private void Form1_Load(object sender, EventArgs e) { chart1.Series[0].Points.Clear(); chart1.Series[1].Points.Clear(); } } } ```