---
# System prepended metadata

title: 北軟96 pB 成績計算器
tags: [北軟96]

---

# 北軟96 pB 成績計算器

###### tags: `北軟96`

## 題目：
設計一成績計算器程式，可從輸入的一整個字串當中取出這 N 筆數字來進行計算，並使它具有下列功能：
1. 可計算這 N(3<N<11)筆數字的平均值、最小值、最大值，及標準差。 (12 分)
標準差的定義如下：$\sigma = \sqrt{\dfrac{1}{N}\displaystyle{\sum_{i=1}^{N}{(x_i-m_x)^2}}}$，在此 $x_i$表示第 i 筆數字, $m_x$表示這些數字的平均值。

2. 可偵測下列輸入錯誤，並要求重新輸入。(8 分) 
    1. 如 N＝6, 可偵測輸入不滿 6 個數字
    2. 輸入有不是 0-9 以及空格以外的字
    3. 輸入的數字其數值大於 100
3. 具有預設值的功能，如 N＝6,可載入字串為”10 30 50 60 80 100”，以便用來檢驗此程式的功能是否正常。(5 分) 

![](https://i.imgur.com/b2SntMQ.png)

## 想法：

這題比pA還更直觀更水題，似乎完全沒啥獨特的想法。
唯一必須要做處理的是驗錯的try和catch，我們可以將每個字串split，如果Convert.ToInt16()出現了問題，他將會throw FormatException，那我們同理，也可以進行throw exception的方式來驗錯，會讓程式碼比較簡便。

## 程式碼(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 problemB
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private bool verificater(string str)
        {
            string[] split = str.Split(' ');
            try
            {
                if (split.Length != 6) throw new Exception();
            
                for (int i = 0; i < split.Length; i++)
                {
                    int a = Convert.ToInt16(split[i]);
                    if (a > 100) throw new Exception();
                }
            }
            catch (Exception e)
            {
                return false;
            }
            return true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = "10 30 50 60 80 100";
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if(verificater(textBox1.Text) == false)
            {
                MessageBox.Show("輸入錯誤，請重新輸入");
                return;
            }
            string[] split = textBox1.Text.Split(' ');
            int[] number = new int[6];
            for(int i = 0; i < number.Length; i++)
            {
                number[i] = Convert.ToInt16(split[i]);
            }
            int aver = 0;
            for(int i = 0; i < number.Length; i++)
            {
                aver += number[i];
            }
            aver /= 6;
            int max = number.Max();
            int min = number.Min();
            double cnt = 0;
            for(int i = 0; i < number.Length; i++)
            {
                cnt += Math.Pow(number[i] - aver, 2);
            }
            cnt /= 6;
            cnt = Math.Sqrt(cnt);
            label2.Text += "平均值 = " + aver + Environment.NewLine;
            label2.Text += "最大值 = " + max + Environment.NewLine;
            label2.Text += "最小值 = " + min + Environment.NewLine;
            label2.Text += "標準差 = " + cnt + Environment.NewLine;
        }
    }
}
```