---
# System prepended metadata

title: 北軟103 problemA 劃三角形和梯形歸屬函數
tags: [北軟103]

---

# 北軟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。