# 北軟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)為梯形歸屬函數圖

請你設計一程式,可以劃出三角形歸屬函數圖和梯形歸屬函數圖,你的程式要可以讓使用者分別輸入參數[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 之梯形歸屬函數圖。

## 想法
這題其實很直觀,因為不需要推公式,他已經給你公式了,你只需要按照公式去做。
圖表上先做一次預處理,將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);
}
}
}
}
```
## 運行介面

textBox依序由上往下編號是1,2,3。button依序由上往下編號是1,2。
圖表為chart1。