# 北軟103 problemA 劃三角形和梯形歸屬函數 ###### tags: `北軟103` ## 題目 三角形歸屬函數定義如下: \begin{equation} u(x) = \left \{ \begin{aligned} & 0 && x<=a\\ & \dfrac{x-a}{m-a} && a < x <= m \\ & \dfrac{b-x}{b-m} && m < x < b \\ & 0 && x >= b \end{aligned} \right. \end{equation} 其中,參數 a 為下限,b 分為下限,a < m < b,u(x)之值介於 0~1,x 為自變數(x >= 0),圖 1(a)為三角形歸屬函數圖。梯形歸屬函數定義如下: \begin{equation} u(x) = \left \{ \begin{aligned} & 0 && (x<a)\text{或}(x>d)\\ & \dfrac{x-a}{b-a} && a <= x <= b \\ & 1 && b <= x <= c \\ & 1 - \dfrac{x-c}{d-c} && c <= x <= d \end{aligned} \right. \end{equation} 其中,參數 a 為下限,d 為上限,b 為支撐下限,c 為支撐上限,a,b,c,d 四者大小為 a < b < c < d,u(x)之值介於 0~1,x 為自變數(x >= 0),圖 1(b)為梯形歸屬函數圖 ![](https://i.imgur.com/VR3Qw6d.png) 請你設計一程式,可以劃出三角形歸屬函數圖和梯形歸屬函數圖,你的程式要可以讓使用者分別輸入參數[a m b] 和[a b c d],以及自變數 x 之上限,並且劃出正確之圖型。 評分: 1. 可以輸入自變數 x 之上限 (2.5 分)。 2. 可以輸入三角形歸屬函數之參數[a m b] (2.5 分)。 3. 可以正確劃出三角形歸屬函數圖(7.5 分)。 4. 可以輸入梯形歸屬函數之參數[a b c d] (2.5 分)。 5. 可以正確劃出梯形歸屬函數圖(7.5 分)。 6. 可以劃出 x 軸和 y 軸之標示(2.5 分)。 範例: 2(a)為參數[a m b]=[3 6 8],自變數 x 上限為 10 之三角形歸屬函數圖,圖 2(b)為參數[a b c d]=[1 7 14 20],自變數 x 上限為 20 之梯形歸屬函數圖。 ![](https://i.imgur.com/9CGb79B.png) ## 想法 這題其實很直觀,因為不需要推公式,他已經給你公式了,你只需要按照公式去做。 圖表上先做一次預處理,將Series集合內的ChartType換成Line。 接下來依序把點標上去即可。 ## 程式碼(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; namespace problemA { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Button1_Click(object sender, EventArgs e) { string data = textBox1.Text; string[] split = data.Split(','); int[] convertData = new int[split.Length]; for(int i = 0; i < split.Length; i++) { convertData[i] = Convert.ToInt32(split[i]); } int x = Convert.ToInt32(textBox3.Text); chart1.Series[0].Points.Clear(); for(int i = 0; i <= convertData[0]; i++) { chart1.Series[0].Points.AddXY(i, 0); } for (int i = convertData[0]+1; i <= convertData[1]; i++) { chart1.Series[0].Points.AddXY(i, ((i- convertData[0]) *1.0)/((convertData[1]- convertData[0]) *1.0)); } for (int i = convertData[1]+1; i <= convertData[2]; i++) { chart1.Series[0].Points.AddXY(i, ((convertData[2] - i) * 1.0) / ((convertData[2] - convertData[1]) * 1.0)); } for (int i = convertData[2] + 1; i <= x; i++) { chart1.Series[0].Points.AddXY(i, 0); } } private void Form1_Load(object sender, EventArgs e) { chart1.Series[0].Points.Clear(); } private void Button2_Click(object sender, EventArgs e) { string data = textBox2.Text; string[] split = data.Split(','); int[] convertData = new int[split.Length]; for (int i = 0; i < split.Length; i++) { convertData[i] = Convert.ToInt32(split[i]); } int x = Convert.ToInt32(textBox3.Text); chart1.Series[0].Points.Clear(); for (int i = 0; i <= convertData[0]; i++) { chart1.Series[0].Points.AddXY(i, 0); } for (int i = convertData[0] + 1; i <= convertData[1]; i++) { chart1.Series[0].Points.AddXY(i, ((i - convertData[0]) * 1.0) / ((convertData[1] - convertData[0]) * 1.0)); } for (int i = convertData[1] + 1; i <= convertData[2]; i++) { chart1.Series[0].Points.AddXY(i, 1); } for (int i = convertData[2] + 1; i <= convertData[3]; i++) { chart1.Series[0].Points.AddXY(i, 1.0 - ((i - convertData[2]) * 1.0) / ((convertData[3] - convertData[2]) * 1.0)); } for (int i = convertData[3] + 1; i <= x; i++) { chart1.Series[0].Points.AddXY(i, 0); } } } } ``` ## 運行介面 ![](https://i.imgur.com/j94AuAO.png) textBox依序由上往下編號是1,2,3。button依序由上往下編號是1,2。 圖表為chart1。