---
# System prepended metadata

title: 民國111.11.07 C#
tags: [課程111ERP02]

---

---
tags: 課程111ERP02
---
# 民國111.11.07 C#

## 第一節
chap 3-14
//   loop  迴圈三兄弟
```
  private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 1; i <= 10; i++)       // i is private in the for loop   
            {
                MessageBox.Show(i.ToString());
            }
        }
```

// for迴圈的執行次數, 在迴圈開始時, 就已經固定了

```
private void button2_Click(object sender, EventArgs e)
{
    int i = 1;
    while (i <= 10)
    {
        MessageBox.Show(i.ToString());
        i++;            
    }
}
```



// do while 的迴圈本體至少會被執行1次, 即使條件為假  
//do while 的條件是後測 所以至少會被執行1次
// for , while 使用率 99% ,  do while 的使用率 1%(適用至少執行一次的案例)  
//  do while 的迴圈, 結束要加 ;
```
 private void button3_Click(object sender, EventArgs e)
        {
            int i = 1;
            do
            {
                MessageBox.Show(i.ToString());
                i++;
            }  while (i<=10);
        }
```

//結論:迴圈次數的掌握是關鍵
1.迴圈變數的初始值設定
2.迴圈變數的遞增值
3.迴圈結束的條件(避免迴圈成為無窮迴圈)

//無窮迴圈
```
private void button15_Click(object sender, EventArgs e)
        {
            for (  ;  ;  )            
                ;            
        }
```
```
 private void button16_Click(object sender, EventArgs e)
        {
            while  (true )
                ;            
        }
```

```
private void button15_Click(object sender, EventArgs e)
        {
            do
            {
                ;
            } while (true);
        }
```


//作業1:  使用迴圈3兄弟,  求1~100的總和=5050
//作業2:  使用迴圈3兄弟,  求1~100的奇數總和
//作業3:  使用迴圈3兄弟,  將1~100的數,顯示在richTextBox
                每列顯示10個數, 數中間用逗點隔開, 如下:
                1,2,3,4,5,6,7,8,9,10,
                11,12,13,14,15,16,17,18,19,20,

//作業3的 參考解答
```
    private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "";
            for (int i = 1; i <= 100; i++)
            {
                richTextBox1.Text += i + ",";
                if (i % 10 == 0)
                { richTextBox1.Text += "\n"; }           
            }
        }
```

//作業4: 製作一個九九乘法表, 顯示在richTextBox (要使用2個迴圈, 一個外圈; 一個內圈)
輸出格式如下: (使用 for , while 迴圈)
  1x1=1   1x2=2  1x3=3  1x4=4  1x5=5    1x6=6     1x7=7     1x8=8    1x9=9
  2x1=2   2x2=4  2x3=6  2x4=8  2x5=10  2x6=12   2x7=14  2x8=16  2x9=18

//參考解答思考方向
```
using System;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 1 ; i <= 9; i++)
            {
                for (int j = 1; j <= 9; j++)
                {
                    Console.Write( i + "*" + j + "=" + (i * j).ToString("00") + " " );
                }
                Console.Write("\r\n");
            }
            Console.ReadLine();
        }
    }
}
//
class Demo
 {
    static void Main() 
    {
        int i = 1;
        while (i <= 9)
        {
            int j = 1;             
            while (j <= 9)
            {
                System.Console.Write("{0} ", i * j);
                j++;
            }             
            i++;
            System.Console.WriteLine();
        }
    }
}

 

// i--
   private void button2_Click(object sender, EventArgs e)
        {
            int i = 10;
            while ( i> 0)
            {
                MessageBox.Show(i.ToString());
                i--;
            }
        }

  private void button4_Click(object sender, EventArgs e)
        {
            for (int i = 1; i <= 10; i=i+2)   //  i+=2  也可以
            {
                MessageBox.Show(i.ToString());   // 1 3 5 7 9
            }

        }

        private void button5_Click(object sender, EventArgs e)
        {
            for (int i = 10; i >= 1; i--)
            {
                MessageBox.Show(i.ToString());
            }
        }

//   if  else

  private void button1_Click(object sender, EventArgs e)
        {
            int i=5;
            if (i > 1)
            {
                MessageBox.Show(i.ToString());  //5
            }
           MessageBox.Show(i.ToString());  
        }

        private void button2_Click(object sender, EventArgs e)
        {
            int i = -5;
            if (i > 0)
            {
                MessageBox.Show("i>0");
            }
            else
            {
                MessageBox.Show("i<0");
            }
           MessageBox.Show("The end");
        }
```

//if { }  else { } 使用大括號來確定勢力範圍,是良好的習慣, 可以避錯
//以下邏輯錯誤示範:  邏輯錯誤不會出現紅色毛毛蟲
//忘記寫大括號,  但是有縮排對齊
//考不及格還是會顯示"恭喜過關"-->邏輯錯誤
//懶惰會報應現前:
```
     private void button3_Click(object sender, EventArgs e)
        {
            int i = 50;
            if (i >=60)
                MessageBox.Show("i>=60");
                MessageBox.Show("恭喜過關");         
        }
```

//正解如下:
```
     private void button3_Click(object sender, EventArgs e)
        {
            int i = 50;
            if (i >=60)
               {
                MessageBox.Show("i>=60");
                MessageBox.Show("恭喜過關");         
               }
        };    
```

作業1: 輸入3個數字, 求最大者  (用Windows form改寫3-4 頁例題)

//參考解答
```
  private void button1_Click(object sender, EventArgs e)
        {
            int n1, n2, n3, max;
            n1 = Convert.ToInt32(textBox1.Text);
            n2 = Convert.ToInt32(textBox2.Text);
            n3 = Convert.ToInt32(textBox3.Text);

            if (n1 > n2)
            {
                if (n1 > n3)
                { 
                    max = n1;
                }
                else
                { 
                   max = n3;
                }
            }
            else
            {
                if (n2 > n3)
                {   max = n2;}
                else
                { max = n3; }
            }
            MessageBox.Show("max="+max.ToString());
        }
```

if 四姊妹
1. if
2. if else
3. if else if
3.1  if if else
4. switch case

注意!!
1. else 不會單獨存在
2. else 會往前面找, 離他最近的if 配對(else 倒追 if)


作業:3數求最大, 使用 3元運算子
//參考解答
//方法1
```
   private void button1_Click(object sender, EventArgs e)
        {
            int n1, n2, n3, max;
            n1 = Convert.ToInt32(textBox1.Text);
            n2 = Convert.ToInt32(textBox2.Text);
            n3 = Convert.ToInt32(textBox3.Text);

            max = (n1 > n2) ? n1 : n2;
            max = (max > n3) ? max : n3;
          
            MessageBox.Show(max+ " is big");
        }
```

//方法2
//本例是 巢狀的三元運算式(三元運算式裡面, 還有三元運算式)
```
    private void button5_Click(object sender, EventArgs e)
        {
            int n1, n2, n3, max;
            n1 = Convert.ToInt32(textBox1.Text);
            n2 = Convert.ToInt32(textBox2.Text);
            n3 = Convert.ToInt32(textBox3.Text);

            max = (n1 > n2)  ?  ((n1 > n3) ? n1 : n3)   :   ( (n2 > n3) ? n2 : n3);
            MessageBox.Show(max + " is big");
        }
```

自我練習作業: 用程式產生費氏數列, 輸出前面40數字到 richTextBox, 每列10個數字, 數字間用逗點隔開, 結果如下:
0,1,1,2,3,5,8,13,21,34,
55,89,144,233,377,610,987,1597,2584,4181,
6765,10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229,
832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 


提示:
費波那契數列由0和1開始，之後的費波那契系數就是由之前的兩數相加而得出。首幾個費波那契系數是：
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233…

//遞迴作法
```
Console.WriteLine("遞迴作法");
for (int i = 0; i < n; i++)
{
    Console.Write(foo(i).ToString() + ",");
}
Console.WriteLine();

static Int64 foo(Int64 i)
{
  if (i == 0 || i == 1)
     return i;
  else
     return foo(i - 1) + foo(i - 2);
}
```




//陣列作法

```
 private void button2_Click(object sender, EventArgs e)
        {
            long[] array = new Int64[] { 0, 1 };
            long tmp = 0;
            for (int i = 0; i <40 ; i++)
            {
                if (i == 0 || i == 1)
                    richTextBox1.Text += array[i].ToString() + ",";
                else
                {
                    tmp = array[0] + array[1];
                    richTextBox1.Text += tmp.ToString() + ",";
                    array[0] = array[1];
                    array[1] = tmp;
                }
            }
            richTextBox1.Text += "\n";
        }
```

 


作業:使用Windows Form改寫3-6 例題 


```
 private void button1_Click(object sender, EventArgs e)
        {
            int n;
             n = Convert.ToInt32(textBox1.Text.Trim());

            if (n == 1)
                   {   MessageBox.Show("答錯了");               }
            else   if (n == 2)
                      {   MessageBox.Show("答錯了");}
                      else
                              if (n == 3)
                              {   MessageBox.Show("答錯了");}
                              else
                               {  MessageBox.Show("答對了");}
        }
```

作業:  製作一個選擇題, 選擇答案(4), 回應正確
//使用 Panel 元件
(1) 太陽由西邊出來
(2) 0> 1
(3) 1 != 1
(4) 尼羅河位在埃及


if else 配對原則
else 會往上找離他最近的if 配對

"else" is impossible to exist alone

注意!!
1.巢狀if else 或if else if 由於結構複雜, 邏輯分析不容易,很容易出錯(新手,老手都會錯)
可改用列switch case條列式語法(從根本解決)
2.使用簡單if (條列式) , 搭配 switch case 可以解決多數的條件分類
//switch 後面的變數型態 和 case 後面的值,  型態必須相同
//switch 後面的變數型態有3種

// 1.number (數值)
```
   private void button1_Click(object sender, EventArgs e)
        {
            int n;
            n = Convert.ToInt32(textBox1.Text);
            switch (n)
            {
                case 1:
                    MessageBox.Show("1"); 
	break;
                case 2:
                    MessageBox.Show("2"); 
	break;
                case 3:
                    MessageBox.Show("3");
	 break;

                default:    //以上皆非   預設
                    MessageBox.Show("other");
                    break;
            }
        }
```

//通常case 的後面都要加break; 用來跳脫 switch
   不加break; 流程會進入下一個case 的判斷, 
//口訣: switch  case  default  break;
```
     private void button1_Click(object sender, EventArgs e)
        {
            int n;
            n = Convert.ToInt32(textBox1.Text);
            switch (n)
            {
                case 1:                
                case 3:
                case 5:
                case 7:
                case 9:
                    MessageBox.Show("奇數");
                    break;
                case 2:
                case 4:
                case 6:
                case 8:
                case 10:
                    MessageBox.Show("偶數");
                    break;

                default:
                    MessageBox.Show("other");
                    break;
            }
        }
```

//2.string (字串)
//Trim() 去除字串前後空白
//ToUpper() 英文字轉成大寫
   (有些人工作上只認識數字0~9 , 英文A~Z   ) 
//舉例:船公司中英文名稱對照表

```
private void button3_Click(object sender, EventArgs e)
    {
        string s;
        s = textBox1.Text.Trim().ToUpper();     //示範接龍 textBox1.Text.Trim().ToUpper();
        switch (s)
        {
            case "A":
                MessageBox.Show("A");
                break;
            case "B":
                MessageBox.Show("B");
                break;
            case "C":
                MessageBox.Show("C");
                break;

            default:
                MessageBox.Show("other");
                break;
        }
    }
```


//3.運算式   1.1
//輸入-9 當測試值
```
    private void button1_Click(object sender, EventArgs e)
        {
           int n;
            n = Convert.ToInt32(textBox1.Text);
            switch (n % 2)
            {
                case 0:
                    MessageBox.Show("餘數是偶數");
                    break;
                case 1:
                    MessageBox.Show("餘數是奇數");
                    break;
                case -1:
                    MessageBox.Show("餘數是-奇數");
                    break;
                default:
                    MessageBox.Show("it is impossible");
                    break;
            }
        }
```

//3.運算式1.2  使用Math.Abs()    absolute 絕對值
```
   private void button2_Click(object sender, EventArgs e)
        {
            int n;
            n =Math.Abs( Convert.ToInt32(textBox1.Text));
            switch (n % 2)
            {
                case 0:
                    MessageBox.Show("餘數是偶數");
                    break;
                case 1:
                    MessageBox.Show("餘數是奇數");
                    break;           
                default:
                    MessageBox.Show("it is impossible");
                    break;
            }
        }
```

//3.運算式2
//switch後面使用關係運算式的技巧(3元運算式)
```
   private void button1_Click(object sender, EventArgs e)
        {
            int n,r;
            n = Convert.ToInt32(  textBox1.Text);
            r = n % 2;
            switch (  n= (r==0)?0:1 )
            {
                case 0:
                        MessageBox.Show("餘數是偶數");
                        break;
                case 1:
                        MessageBox.Show("餘數是奇數");
                    break;
                default:
                    MessageBox.Show("it is impossible");
                    break;
            }
        }
```

// 在case 中運算
```
    private void button5_Click(object sender, EventArgs e)
        {
            int n;
            n = Convert.ToInt32(textBox1.Text);    //n=12
            switch (n % 2)      
            {
                case 0:
                    {
                        MessageBox.Show("餘數是偶數");
                        if (n > 10)
                        {
                            for (int i = 1; i <= 5; i++)
                            { MessageBox.Show(i.ToString()); }
                        }
                        break;
                    }
                case 1:
                    MessageBox.Show("餘數是奇數");
                    break;
                default:
                    MessageBox.Show("it is impossible");
                    break;
            }
        }
```

作業:使用Windows Form改寫3-9 例題 

//C# switch case 不能判斷 (關係運算式)  
//作業1: 使用 if else  或 switch case 語法
電影按照輸入的年齡分級
普遍級,  保護級,  輔導級,   限制級

普遍級（簡稱「普」級）：一般觀眾皆可觀賞。
保護級（簡稱「護」級）：未滿6歲之兒童不得觀賞，6歲以上12歲未滿之兒童須父母、師長或成年親友陪伴輔導觀賞。//  age  >= 6    &&  age<12
輔導十二級（簡稱「輔十二」級）：未滿12歲之兒童不得觀賞。                                                                                            //  age  >= 12 &&  age<15
輔導十五級（簡稱「輔十五」級）：未滿15歲之兒童不得觀賞。                                                                                            //  age  >=15  &&  age<18
限制級（簡稱「限」級）：未滿18歲之人不得觀賞。   //  age  >=18
                                                                                                        

//作業2:輸入所得金額, 計算所得稅
稅率            所得金額
\---------------------------------------------
5%	TWD 0~540,000
12%	TWD 540,001～1,210,000
20%	TWD 1,210,001～2,420,000
30%	TWD 2,420,001～4,530,000
40%	TWD 4,530,001以上

//以上2個作業, 會安排線上作業發表

//3-22頁, 迴圈的中斷(break)

```
  private void button1_Click(object sender, EventArgs e)
        {
            for (int i=1; i <= 10; i++) 
            {
                if (i == 5)
                {
                    continue;  //會跳到到開頭, 繼續做
                     // Application.Exit(); //強制結束程式
                }
                if (i == 9)
                {
                    break;   //半途而廢 , 離開迴圈
                }
                MessageBox.Show(i.ToString());
            }

            MessageBox.Show("the end");
        }
```

//若要強制結束程式的執行
使用 Application.Exit();
使用在出現嚴重錯誤時
```
private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("I will exit");
            Application.Exit();
            MessageBox.Show("the end");   // never show
        }
```

//老師示範如何由工作列強制終止程式
\-------------------------------------------------------------------------
心得: 以下會改變程式的執行順序
1.Application.Exit(); 	強制結束程式的執行
2.return  		回上一層程式
3.break   		中斷迴圈的執行
4.continue  	回到迴圈開始處 

//2022.05.16

//作業:本例迴圈中斷(break , continue), 改用 while 迴圈語法
//作業:寫程式示範上述改變程式的執行順序( Application.Exit() , return  )
//參考範例
```
 private void button1_Click(object sender, EventArgs e)
        {
            int i = 1;
            while( i <= 10)
            {
                if (i == 5)
                {
                    i++;
                    continue;  //會跳到到開頭, 繼續做                             
                }
                if (i == 9)
                {
                    break;   //半途而廢
                }
                MessageBox.Show(i.ToString());
                i++;
            }

            MessageBox.Show("the end");
        }
```

//return  回到上一層
```
        private void button3_Click(object sender, EventArgs e)
        {
            MessageBox.Show("I will return");
            return;
            MessageBox.Show("the end");   // never show
        }
```

/////Random Number 亂數
```
   private void button1_Click(object sender, EventArgs e)
        {
            int guess;
            Random r = new Random();
            guess = r.Next(1, 50);   //  (1<=  r  < 50)     1,2,3,....,49
            MessageBox.Show(guess.ToString());
        }
```
//大樂透是一種樂透型遊戲。您必須從01~49中任選6個號碼

```
  private void button3_Click(object sender, EventArgs e)
        {
            int n1 = new int();    //int() is a Class(類別)
            // 宣告 n1 是一個整數變數, 這個n1變數是按照 int()這個類別建立的(佔據空間)
            int n2;
            n1 = 1;
            n2 = 2;
            MessageBox.Show((n1 + n2).ToString());
        }
```

//會使用亂數是一種技能, 短時間就可以產生大量隨機資料(獲得超能力)
//亂數可以亂槍打鳥, 雖不中亦不遠矣(樣本->母體)
//程式語言多內建亂數功能
//如果車輪餅是物件變數(Object),  做車輪餅的"模子"就是類別(Class)

//產生6個大樂透的號碼
```
   private void button2_Click(object sender, EventArgs e)
        {
            int guess;
            Random r = new Random();
            label1.Text = "";
            for (int i = 0; i <= 5; i++)
            {
                guess = r.Next(1, 50);
                label1.Text += guess.ToString() + ",";
            }
          
        }
```

//作業:本例6個大樂透的號碼, 輸出到richTextBox


======================================================================
/////// console  控制台,  看守台
// console= 螢幕 + 鍵盤
如何進入 主控台應用程式 (.NET Framework)  ?
建立新專案的步驟:
1.  C# > Windows > 主控台 
2.  主控台應用程式 (.NET Framework)

或是在專案類型搜尋輸入 : 主控台  c#

用途:C#的主控台應用程式,省略圖型介面控制項,僅使用單純的C#語法
         微軟許多線上的範例使用主控台模式
  
```
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello");
            Console.WriteLine("你好");
            Console.ReadLine();      //暫停
        }
    }
}

//Console.ReadLine() 的使用方法 (read 1 line at a time)
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string s;
            s = Console.ReadLine();
            Console.WriteLine("s=" + s);
            Console.ReadLine();                       // pause
        }
    }
}
```

//輸入字串轉成數字
```
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int n;
            Console.WriteLine("Please input n=" );
            n= int.Parse( Console.ReadLine() );
            n++;
            Console.WriteLine("n++ ="+n);
            Console.ReadLine(); 
        }
    }
}
```

//使用參數(parameter,  argument, 引數)
```
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("1+{0}={1}", 1, 2);
            Console.ReadLine();   //1+1=2

            int n1 = 1, n2 = 2;
            Console.WriteLine("1+{0}={1}", n1, n2);
            Console.ReadLine();   //1+1=2          
        }
    }
}
```

//換行  與顯示中文
範例1:
```
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("{0} \n {1} "," 春眠不覺曉","處處聞啼鳥");         
            Console.ReadLine();         
        }
    }
}
```

範例2:
```
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("{0} ~ {1} "," 春眠不覺曉","處處聞啼鳥");         //春眠不覺曉 ~ 處處聞啼鳥
            Console.ReadLine();         
        }
    }
}
```

作業:使用控制台程式,列印下列輸出
春眠不覺曉
處處聞啼鳥
夜來風雨聲
花落知多少

//Console.ReadLine()  vs Console.Read();
//輸入3個字串
```
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string s;
            for (int i = 1; i <= 3; i++)
            {
                Console.WriteLine("Please input:");
                s=Console.ReadLine();
                Console.WriteLine("You input="+s);
            }
            Console.ReadLine();
        }
    }
}
```

//Console.Read()的秘密  (應用在物聯網的序列通訊)
//C# 的 Console.Read() 會讀入整數   (read 1 character at a time and turn it into an integer)
// Enter 換行鍵, 會產生 0D 0A  2字元 (ASCII)   (Enter makes 0D  0A , 2 control characters at a time)
//0D = 13    Carriage Return    (CR)
//0A = 10    Line Feed               (LF)
//使用 Console.Read() 按Enter, 會讀入3個整數
//範例1.1    使用Read()
//注意!! 讀入1, 2, 3, 三個整數, 得到 49,  50,  51,  三個ASCII的值
```
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int n, CR, LF;
            int s=0;
            for (int i = 1; i <= 3; i++)
            {
                Console.WriteLine("Please input:1 Enter , 2 Enter , 3 Enter");
                n  =Console.Read();   // 1, 2, 3
                CR = Console.Read();  //0D
                LF  = Console.Read();  //0A
                s += n;                 
                Console.WriteLine("You input="+n);
            }
            Console.WriteLine("sum="+s);  //49+50+51 =150  (ASCII 的10進位編號)
            Console.ReadLine();
        }
    }
}
```

//練習: 本例輸入 A, B, C  的結果為何?  (ANS:198)

//範例1.2     使用ReadLine()
```
 static void Main(string[ ] args)
        {
            string s ;
            int sum = 0;
            for (int i = 1; i <= 3; i++)
            {
                Console.WriteLine("Please input:1 Enter , 2 Enter , 3 Enter");
                s =  Console.ReadLine();   // 1, 2, 3
                sum += int.Parse(s);
                Console.WriteLine("You input=" + s);
            }
            Console.WriteLine("sum=" + sum);  //1+2+3 =6
            Console.ReadLine();
        }
```

//範例2  (使用轉型  (int)   (char)   )   
//要求:使用Console.Read() 讀入1, 2, 3, 三個字元 , 希望相加後, 得到的答案是:6 怎麼做?
```
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char c;
            int CR, LF;
            int s = 0;
            for (int i = 1; i <= 3; i++)
            {
                Console.WriteLine("Please input:1 Enter , 2 Enter , 3 Enter");
                 
                c = (char) Console.Read();   // 1, 2, 3
                CR = Console.Read();  //0D
                LF = Console.Read();  //0A
                s += (int) c -48;       //(int) 可以省略
                Console.WriteLine("You input=" + c);
            }
            Console.WriteLine("sum=" + s);  //1+2+3 =6
            Console.ReadLine();
        }
    }
}
```

//範例3
//C語言的字元和數值可以混和運算
```
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char c='1';   //49
            int s ;
            s = c + 1;     //49+1     
            Console.WriteLine("sum=" + s);  //50
            Console.ReadLine();
        }
    }
}
```


作業:使用 Console.Read()  輸入 1 ~10 累加 ,計算和=55 
//參考解答
```
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char c;
            int cr, lf, n;
            int s = 0;
            for (int i = 1; i <= 9; i++)
            {
                Console.WriteLine("Please input:1 ,2 ,3~9");
                c = (char)Console.Read();   // 1, 2, 3
                cr = Console.Read();  //0D
                lf = Console.Read();  //0A
                s += (int)c - 48;       //(int) 可以省略
                Console.WriteLine("You input=" + c);
            }
            Console.WriteLine("Please input:10");
            n = int.Parse( Console.ReadLine());   // 10
             s += n;      
      
            Console.WriteLine("sum=" + s);  //1+2+3+..+10 =55
            Console.ReadLine();

        }
    }
}
```

==========================================================================
chap 3-1
// array 陣列是多個相同名稱的變數

   ```
private void button1_Click(object sender, EventArgs e)
        {
            int[] a=new int[5];   //宣告a是一個整數陣列 ,有5個儲存空間
         //   int[] a;
         //   a = new int[5];
            int s;
            a[0] = 1;
            a[1] = 2;
            a[2] = 3;
            a[3] = 4;
            a[4] = 5;
   //      a[5] = 6;     // cause runtime error   System.IndexOutOfRangeException: '索引在陣列的界限之外。
            s = a[0] + a[1] + a[2] + a[3] + a[4];    //15
            MessageBox.Show(s.ToString());
        }
```

//作業: 仿上例, 用陣列計算 1+2+3+...+10

//索引溢位(overflow)是陣列的夢魘(索引去撞牆)
//索引(index), 註標(subscript)

//如何記住陣列宣告方式?
----------------------------------------------------------------------
//  int[] a               -> a 是一個整數陣列[ ]
//  = new int[5]   -> a是按照整數[5個儲存空間]的模子做出來的
//陣列的初始值用一對{大括號}括起來
//    int[] a = new int[5] {1,2,3,4,5};

```
private void button2_Click(object sender, EventArgs e)
    {
        int[] a = new int[5] {1,2,3,4,5} ;
        // int[] a = new int[ ] {1,2,3,4,5} ;   //省略大小, 自己會算
        int s=0;       
        for (int i = 0; i <= 4; i++)
        {
            s += a[i];
        }
            MessageBox.Show(s.ToString());  //15
    }
```


//C語言的陣列由0開始起算
// n個儲存空間的編號由 0 到 n-1
//搭配的for迴圈也由0開始

// 學C#要放棄由1起算的日常習慣(要放棄由1起算的堅持)
// 因為C#元件內部陣列,物件內部成員計算,是由0起算

  ```
private void button3_Click(object sender, EventArgs e)
    {
        int[] a = new int[5] {1,2,3,4,5};
        int s = 0;

        for (int i = 0; i <= 4; i++)
        {
            s += a[i];     // s=s+a[i];
        }
        MessageBox.Show(s.ToString());
    }
```


//作業1:  使用textbox1~7, 輸入一周7日溫度(浮點數), 求一周平均溫度
//使用 for , while 迴圈各做一次
//使用陣列來存一周7日溫度
//陣列(array) 和 迴圈(for loop) 是最佳拍檔

//以下是浮點數陣列
```
   private void button3_Click(object sender, EventArgs e)
        {
            double[] a = new double[5] { 1.1, 2.2, 3.3, 4.4, 5.5 };
            double s = 0;
            for (int i = 0; i <= 4; i++)
            {
                s += a[i];
            }
            MessageBox.Show(s.ToString());  //16.5           
        }
```


//作業2:計算夏季一周均溫 (高溫均溫,低溫均溫) , 使用陣列
//計算方式:每日高溫取天花板整數, 低溫取地板整數. 例如(29.3, 21.3)   -->  (30, 21)
//                每日溫度格式: (溫度1, 溫度2) 數字大的是高溫, 數字小的是低溫, 要自行判斷高低溫 
//                如果輸入有負數, 是輸入錯誤, 負數要轉成正數(因為夏天的低溫不會低於0度)
//                一周溫度如下:  (溫度1, 溫度2)={ (28.5, 20.1), (-21.3, 29.3), (30.2, 22.2), (21.7, 23.7), (32.6, -24.9), (23.4, 25.2), (34.1, -26.4)  }
//                最後求出來的一周高低均溫, 使用4捨5入法, 取到整數

//chap 4-5
```
 private void button4_Click(object sender, EventArgs e)
        {
           int[] a = new int[5] { 1, 2, 3, 4, 5 };
            int len,len2, ub, lb,rnk;
            len = a.Length;   //5      *最常使用的屬性
            len2 = a.GetLength(0);   //5    第0維的長度
            ub = a.GetUpperBound(0); // 4   a[4]     第0維的上限
            lb = a.GetLowerBound(0);  // 0    a[0]     第0維的下限
            rnk = a.Rank; // 1    1 dimension    維度

            MessageBox.Show(len.ToString());
            MessageBox.Show(len2.ToString());
            MessageBox.Show(ub.ToString());
            MessageBox.Show(lb.ToString());
            MessageBox.Show(rnk.ToString());
        }
```


```
  private void button5_Click(object sender, EventArgs e)
        {
        int[] a = new int[5] { 5, 4, 3, 2, 1 };

            Array.Sort(a);  //ascending  ASC    *最常使用的方法
            for (int i = 0; i <=4; i++)
            {
                MessageBox.Show(a[i].ToString());
            }         
        }
```

//作業 : 使用array.Length屬性, 配合 for 迴圈
1. 列印 int[] a = new int[5] { 1, 2, 3, 4, 5 }; 到 richTextBox
2. 列印 int[] a = new int[5] { 5, 4, 3, 2, 1 }; 到 richTextBox
參考:
```
   private void button1_Click(object sender, EventArgs e)
        {
            int[] a = new int[5] { 5, 4, 3, 2, 1 };  //Length=5
                     
            for (int i = 0; i < a.Length; i++)   //使用array.Length屬性, 避免迴圈索引溢位(index out of range)
            {
                MessageBox.Show(a[i].ToString());
            }
        }
```


//作業 : 一個陣列使用亂數,產生5個元素, 經過排序(Sort)後, 求最大值和最小值
可用GetUpperBound(0)取上限值
       GetLowerBound(0)取下限值

//作業1:使用亂數, 產生6個大樂透的號碼, 放入陣列, 並輸出到label
```
  private void button1_Click(object sender, EventArgs e)
        {                     
            int[] a = new int[6];
            Random r = new Random();
            for (int i = 0; i < a.Length; i++)  //a.Length=6
            {                
                a[i] = r.Next(1, 50);                       
            }
            label1.Text = "";
            for (int i = 0; i < a.Length; i++)
            {
                label1.Text += a[i].ToString()+", ";
            }
        }
```

//作業2:陣列a的內容 , 給陣列b
```
private void button6_Click(object sender, EventArgs e)
        {           
            int[] a = new int[] { 1, 2, 3, 4, 5 };
            int[] b = new int[5];
            b = a;     //陣列a的內容 , 給陣列b , 陣列名稱a, 是陣列的位址(address) 
            int s = 0;
            for (int i = 0; i <= 4; i++)
            {
                s += b[i];
            }
            MessageBox.Show(s.ToString());  //15
        }
```

//作業2:產生6個大樂透的號碼, 並輸出到label, 去除重複號碼
//參考
```
  private void button1_Click(object sender, EventArgs e)
        {
            int[] a = new int[10];
            Random r = new Random();
            for (int i = 0; i < a.Length; i++)  //a.Length=10
            {
                a[i] = r.Next(1, 50);                   //產生10個樂透號碼
            }

            Array.Sort(a);  //排序

            label1.Text = "";
            for (int i = 0; i < a.Length; i++)                 //顯示前10個號碼(可能會有重複的值)
            {
                label1.Text += a[i].ToString() + ", ";
            }

            int[] result = a.Distinct().ToArray();    //Distinct() 唯一 ,  注意:  a的內容不變喔!
            //新產生的陣列  int[] result  不會有重複的值,  a.Distinct() 會產生一個運算後的暫存數列         
            for (int i = 0; i < 6; i++)                 //取出前6個號碼
            {
                label2.Text += result[i].ToString() + ", ";
            }
        }
```

// a.Length
```
  private void button9_Click(object sender, EventArgs e)
        {
            int[] a = new int[5] { 5, 4, 3, 2, 1 };

            Array.Sort(a);  //ascending  ASC
            for (int i = 0; i < a.Length; i++)
            {
                MessageBox.Show(a[i].ToString());
            }
        }
```

//作業 : 陣列中求最大值, 最小值
```
  private void button3_Click(object sender, EventArgs e)
        {
            int[] a = new int[] { 5, 4, 3, 2, 1, 100 };         
            Array.Sort(a);          
            MessageBox.Show("MIN=" + a[0]);   //1
            MessageBox.Show("MAX=" + a[a.Length-1]);  //100
        }
```
\/\/Array.Sort      Array.Reverse      Array.Clear
```
        private void button6_Click(object sender, EventArgs e)
        {
            int[] a = new int[5] { 5, 4, 3, 2, 1 };

            Array.Sort(a);  //ascending  ASC  12345
            Array.Reverse(a);  //DESC   descending  54321
            for (int i = 0; i < a.Length; i++)
            {
                MessageBox.Show(a[i].ToString());   //54321
            }
            MessageBox.Show("Clear ary");
            Array.Clear(a,0,a.Length);  //  Array.Clear (陣列名稱,起始位置,刪除個數)
            for (int i = 0; i < a.Length; i++)
            {
                MessageBox.Show(a[i].ToString());
            }
        }
```

//   Array.Clear(a:需要清除的陣列, index:起始索引, length:要清除的元素個數)

//作業 : 字串陣列排序
```
  private void button4_Click(object sender, EventArgs e)
        {
            string[] a = new string[] { "this", "is", "a", "book" };
            Array.Sort(a);
            for (int i = 0; i < a.Length; i++)
            {
                MessageBox.Show(a[i].ToString());    // a  book  is  this
            }

            Array.Clear(a, 0, a.Length);  //字串陣列清除成為虛值null
            if (a[0] == null)
            {
                MessageBox.Show("1.reset to null.  YES");
            }
            if (a[0] == "")
            {
                MessageBox.Show("1.reset to Empty.  NO");   //本行不會執行 
            }
           //////////////////////////////////////////////////////////////
            for (int i = 0; i < a.Length; i++)
            {
                a[i] = "";
            }

            if (a[0] == null)
            {
                MessageBox.Show("2.reset to null.  NO");      //本行不會執行
            }
            if (a[0] == "")
            {
                MessageBox.Show("2.reset to Empty.  YES");    
            }
        }
```

//c#在此碰到尷尬的問題, 解套如下:
//作業 : 空字串是 null ? 或  ""  ?
```
 private void button6_Click(object sender, EventArgs e)
        {
            string s1,s2;
            s1 = "";    //空字串
            s2 = null;
            if (s1 == "" )
            { MessageBox.Show("s1 is \"\"  "); }
            if (s2 == null)
            { MessageBox.Show(" s2 is null"); }

            if (String.IsNullOrEmpty(s1))
                MessageBox.Show( "S1 is null or empty");
            if (String.IsNullOrEmpty(s2))
                MessageBox.Show("S2 is null or empty");
            if (String.IsNullOrEmpty(textBox1.Text))
                MessageBox.Show("textBox1.Text is null or empty");
        }
```

//注意!!  
1. C# 的 ""  不等於 null   
    String.IsNullOrEmpty 是方便的方法，可讓您同時測試字串值是 Null 或 Empty 。 

2.若要簡化: 使用 ""   


//陣列的搜尋
//Array.IndexOf() 搜尋某數的位置            **面試熱門考題
//.IndexOf搜尋是循序搜尋(1,2,3,...,n)
```
  private void button11_Click(object sender, EventArgs e)
        {
              int[] a = new int[5] { 5, 4, 3, 2, 1 };
            int n = Array.IndexOf(a, 1);        
            if (n >= 0)
                MessageBox.Show("n=" + n.ToString());  //4
            else                
                MessageBox.Show("找不到");        
        }
```

```
  private void button1_Click(object sender, EventArgs e)
        {
         string[] a = new string[5] { "A", "B", "C", "D", "E" };
            int n = Array.IndexOf(a, "D");           
            if (n >= 0)
                MessageBox.Show("BINGO=" + n.ToString());  //3           
            else
                MessageBox.Show("找不到");
        }
```

//Array.BinarySearch() 的速度比 IndexOf() 快
//陣列需要事先排序, 才可以使用Array.BinarySearch()
//用於判斷某數存在陣列裡面嗎?( 要先做Array.Sort(a)排序)
//適用較大陣列, 搶時間
//二分搜尋(BinarySearch)法,每次只要搜1/2的範圍就好,快

```
private void button7_Click(object sender, EventArgs e)
{
    int[] a = new int[5] { 5, 4, 3, 2, 1 };

    Array.Sort(a);  //ascending  ASC   1 2 3 4 5
    int input, where;
    input = Convert.ToInt32(textBox1.Text);
    where = Array.BinarySearch(a, input);
    if (where >= 0)
        MessageBox.Show(where.ToString());
    else
       MessageBox.Show("找不到");      
}
```



//作業:  使用亂數產生一個介於1~100 之間的數字,使用者輸入一個數來猜它
//數字(Bingo)由亂數產生
//猜的過程顯示在richTextBox

55=bingo
Guess 1: (1+100)/2=51     大
Guess 2: (51+100)/2=76   小
Guess 3: (51+76)/2=64      小
Guess 4: (51+64)/2=58     小
Guess 5: (51+58)/2=55      bingo

二分搜尋的虛擬碼大致如下：
```
void binarysearch(Type data[1..n], Type search)
{
    Index low = 1;
    Index high = n;

    while (low <= high)
    {
        Index mid = (low + high) / 2;

        if (data[mid] = search)
        {
            print mid;
            return;
        }
        else if (data[mid] > search)
        {
            high = mid - 1;
        }
        else if (data[mid] < search)
        {
            low = mid + 1;
        }
    }

    print "Not found";
}
```

//Q:為什麼二分搜尋的速度比較快?    Ans:每次搜尋的範圍只有1/2

// c# 四捨五入範例
```
  private void button9_Click(object sender, EventArgs e)
        {
            double d;
            d = Math.Round(3.14159, 2);
            MessageBox.Show(d.ToString());  //3.14
            MessageBox.Show(Math.Round(3.14159, 3).ToString());  //3.142
        }
```

// demo binary search(二分搜尋法)

1  2  3  4  5 || 6  7  8  9  10

//indexof  不用事先做排序

```
private void button5_Click(object sender, EventArgs e)
    {
        int[] a = new int[] { 1, 2, 3, 6, 5, 4 };
        int input, where;
        input = Convert.ToInt32(textBox1.Text);
        where = Array.IndexOf(a, input);
        MessageBox.Show(where.ToString());
    }
```


//心得:
1.小陣列的搜尋使用 Array.IndexOf()
2.大陣列的搜尋使用 Array.BinarySearch();
 
111.05.23
二維陣列(2 dimension array) = 矩陣(matrix)
二維陣列由橫向的列(row) 和縱向的行(column) 所組成
//注意!! 二維陣列的處理順序: 先列後行, 由上而下, 由左而右
```
    private void button6_Click(object sender, EventArgs e)
        {
             int[,] a = new int[3, 4] { { 11,12, 13,14 },
                                                      { 21,22, 23,24 },
                                                      { 31,32, 33,34 } };
            for (int i = 0; i <= 2; i++)
            {
                for (int j = 0; j <= 3; j++)
                {
                    MessageBox.Show(a[i, j].ToString());
                }
            }

            foreach (var p in a)
            {
                MessageBox.Show("for value=" + p);
            }

            int len, len0, len1;
            len = a.Length;
            MessageBox.Show("total len=" + len.ToString());  //12
            len0 = a.GetLength(0);
            MessageBox.Show("len0=" + len0.ToString());    //3 row
            len1 = a.GetLength(1);
            MessageBox.Show("len1=" + len1.ToString());    //4 column
        }
```

//作業: 本例改用 a.GetLength(0)  a.GetLength(1) 做雙層迴圈的判斷,有效防止索引溢出撞牆
// a.GetLength(0)    第1維 (列)
// a.GetLength(1)    第2維 (行)

 ```
int[,] a = new int[3, 4] { { 11, 12, 13,14 },{ 21 ,22, 23,24 },{ 31, 32, 33, 34 } };

for (int i = 0; i < a.GetLength(0); i++)
{
    for (int j = 0; j <a.GetLength(1); j++)
    {
        MessageBox.Show(a[i, j].ToString());
    }
} 
```





//作業:  輸入一周三餐菜單(或飲料)[7,3]  到2維陣列   然後顯示菜單(可用richTextBox)
//進階作業:查詢某個菜色 出現的位置
//例如查詢 [排骨飯] 在周三中午供應 


練習1:
```
   private void button1_Click(object sender, EventArgs e)
        {
            string[,] a = new string[3, 3] { {"飯糰" ,"包子", "饅頭" },
                                                                 { "白米" ,"紫米", "五榖" },
                                                                 { "青菜" ,"豆腐", "湯" } };
            for (int i = 0; i <= 2; i++)
            {
                for (int j = 0; j <= 2; j++)
                {
                   richTextBox1.Text+=a[i, j].ToString()+"\t";
                }
                   richTextBox1.Text +=  "\n";
            }
        }
```

練習2:
```
string[,] a = new string[3, 3] { {"飯糰" ,"包子", "饅頭" },{ "白米" ,"紫米", "五榖" },{ "青菜" ,"豆腐", "湯" } };

        private void button2_Click(object sender, EventArgs e)
        {
        
            for (int i = 0; i <= 2; i++)
            {
                for (int j = 0; j <= 2; j++)
                {
                    richTextBox1.Text += a[i, j].ToString() + "\t";
                }
                richTextBox1.Text += "\n";
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            string input;
            input = textBox1.Text.Trim();
            for (int i = 0; i <= 2; i++)
            {
                for (int j = 0; j <= 2; j++)
                {
                    MessageBox.Show("Traverse at:" + i.ToString() + ", " + j.ToString() +"="+ a[i, j]);
                    if (a[i, j] == input)
                    {
                        MessageBox.Show("Bingo! "+input + " at " + i.ToString() + ", " + j.ToString());
                        break;
                    }
                }            
            }    
```

//矩陣相乘1
//對應的元素相乘, 處理比較簡單  , 使用2個for 迴圈
//ERP班同學,儘量把相乘矩陣設計成大小相同, 避錯才是王道
練習3:  二個 3x3的矩陣, 對應的元素相乘, 結果輸出到 richTextBox
```
        private void button1_Click(object sender, EventArgs e)
        {
            int[,] a = new int[3,3] { { 1, 2, 3 },   
                                                    { 4, 5, 6 },
                                                    { 7, 8, 9 } };
            int[,] b = new int[3,3] { { 1, 2, 3 },   
                                                    { 1, 2, 3 },
                                                    { 1, 2, 3 } };
            richTextBox1.Text = "";   
  //          1		4	 9	
  //          4		10	18	
  //          7		16	27
            for (int i = 0; i <= 2; i++)
            {
                for (int j = 0; j <=2; j++)
                {
                    richTextBox1.Text += (a[i, j] * b[i, j]).ToString() + "\t";
                }
                richTextBox1.Text += "\n";
            }       
        }
```

//練習3的作業:
1.先個別輸出上例二個 3x3的矩陣,到 richTextBox
2.再把二個 3x3的矩陣對應的元素相乘, 結果輸出到 richTextBox


//矩陣相乘2
//對應的元素相乘(列*行), 處理比較複雜  , 使用3個for 迴圈
練習4:  A=2x3      B=3x2   A*B=2x2        
A={ A(0,0), A(0,1), A(0,2),                                
        A(1,0), A(1,1), A(1,2)}

B={ B(0,0), B(0,1),                                
       B(1,0), B(1,1),
       B(2,0), B(2,1)}

A*B=      
       A{0,0}*B{0,0}+A{0,1}*B{1,0}+A{0,2}*B{2,0},  	A{0,0}*B{0,1}+A{0,1}*B{1,1}+A{0,2}*B{2,1}
       A{1,0}*B{0,0}+A{1,1}*B{1,0}+A{1,2}*B{2,0},  	A{1,0}*B{0,1}+A{1,1}*B{1,1}+A{1,2}*B{2,1}
	 
矩陣A 乘 矩陣B, 結果輸出到 richTextBox   (要使用3層for 迴圈)
//進階練習題目,可省略
//口訣: 一個在列把風, 一個在行把風,  一個動手相乘
```
        private void button1_Click(object sender, EventArgs e)
        {
            int[,] a = new int[2,3] { { 1, 2, 3 },   
                                                    { 4, 5, 6 } };
            int[,] b = new int[3,2] { { 1, 2 },   
                                                    { 1, 2 },
                                                    { 1, 2 } };
            richTextBox1.Text = "";   
  //            6                  12	      	
  //          15                  30		
            int s = 0;
            for (int i = 0; i <= 1; i++)
            {
                for (int j = 0; j <=1; j++)
                {
                    for (int k = 0; k <= 2; k++)
                    {
                        s += a[i, k] * b[k, j];                     
                    }
                    richTextBox1.Text += s.ToString() + "\t";
                    s = 0;
                }
                richTextBox1.Text += "\n";
            }       
        }
```

//foreach 是 for 迴圈的進階版語法(配合物件導向處理), 依序拜訪(traverse)陣列中的每一個元素
//foreach 是 for 迴圈的表弟
//polling(輪詢,  網路領域用語, 也是[依序拜訪]的意思 )
//foreach one  in array
```
   private void button7_Click(object sender, EventArgs e)
        {
            int[] a = new int[5] { 5, 4, 3, 2, 1 };
            foreach (int p in a)    //pointer
            {
                MessageBox.Show(p.ToString());            
            }
            int[,] b = new int[3, 4] {  {10,20,30,40} ,
                                                    {5,15,25,35},
                                                     {12,24,36,48}  };
            foreach (int p in b)
            {
                MessageBox.Show(p.ToString());
            }

        }
```
//foreach (int p in a)   = foreach (var p in a)  =  foreach (object p in a) 

//練習:把上例結果, 輸出到 richTextBox


//foreach 懶惰用法 object p , 可以指向任何型態的陣列
// p 是object  型態
```
     private void button9_Click(object sender, EventArgs e)
        {
            int[] a = new int[5] { 5, 4, 3, 2, 1 };
            foreach (object p in a)    //pointer
            {
    
                MessageBox.Show(p.ToString());
            }
            int[,] b = new int[3, 4] {  {10,20,30,40} ,
                                                    {5,15,25,35},
                                                     {12,24,36,48}  };
            foreach (object p in b)
            {
                MessageBox.Show(p.ToString());
            }
        }
```

//object 變數型態的用法(可存任意資料型別)
//object 處理的速度較慢

```
private void button6_Click(object sender, EventArgs e)
    {
        object j1, j2, j3;
        j1 = 1;
        j2 = "abc";
        j3='A';
        MessageBox.Show(j1.ToString());
        MessageBox.Show(j2.ToString());
        MessageBox.Show(j3.ToString());
    }
```


//object 陣列
//龍生九子, 子子不同 (object array)
//C語言當初設下的嚴格資料型態, 在物件導向中被解放了,(物極必反)

```
private void button4_Click(object sender, EventArgs e)
    {
        object[] a = new object[5] { 5, "字串", 3.14 , 'A', true };
        foreach (object p in a)    //pointer
        {
            MessageBox.Show(p.ToString());
        }
    }
```


// foreach index
```
     private void button5_Click(object sender, EventArgs e)
        {
            int[] a = new int[5] { 5, 4, 3, 2, 1 };
            int i=0;
            foreach (var p in a)    //pointer
            {
                 MessageBox.Show("a[i]="+i.ToString()+" is "+p.ToString());
                 i++;
            }
        }
```

//心得: foreach 需要處理陣列索引(index)的時候, 改用 for 迴圈 比較直接

// foreach index (進階) 使用LINQ寫法

```
private void button5_Click(object sender, EventArgs e)
    {
        int[] arr = new int[5] { 1, 2, 3, 4, 5 };
        foreach (var p in arr.Select((value, ind) => new { ind, value }))
        {
            var index = p.ind;
            var value = p.value;
            MessageBox.Show("index=" + index.ToString() + " value= " + p.value.ToString());
        }
    }
```


// foreach 也支援 break  continue
```
    private void button1_Click(object sender, EventArgs e)
        {
            int[] a = new int[5] { 5, 4, 3, 2, 1 };
            foreach (int p in a)    //pointer
            {
                if (p == 3)
                    continue;
                MessageBox.Show(p.ToString());
            }
        
            MessageBox.Show("2nd loop");
            foreach (int p in a)
            {
                if (p == 3)
                    break;
                MessageBox.Show(p.ToString());
            }
        }
```

////作業:  使用foreach 顯示一周三餐菜單[7,3] 2維陣列 , 結果輸出到richTextBox

//補充1: 委派 delegate  4-9
//魔法棒 可以點石成金
```
       private void button10_Click(object sender, EventArgs e)
        {
            int[] a = new int[5] { 1, 2, 3, 4, 5 };
            Action<int> myaction = new Action<int>(doSquare );  //本行可省略
            Array.ForEach(a, doSquare);
        }

        void doSquare(int p)
        {
            MessageBox.Show((p * p).ToString());
        }

       void plus1(int p)
        {
            MessageBox.Show((p +1).ToString());
        }
```
//補充2: 
//列舉器的使用方法(chap7)
//可以讓C#處理資料結構的問題

```
using System.Collections;

      private void button1_Click(object sender, EventArgs e)
        {
            int[] a = new int[5] { 5, 4, 3, 2, 1 };
            foreach (object p in a)    //pointer
            {         
                MessageBox.Show(p.ToString());
            }

            MessageBox.Show("使用列舉器取出陣列元素");
            // Interface Enumerator
            IEnumerator myenum = a.GetEnumerator();
            while (myenum.MoveNext())
            {
                MessageBox.Show(  myenum.Current.ToString()      );
            }

            MessageBox.Show("Reset  列舉器  read again");
            myenum.Reset();
            while (myenum.MoveNext())
            {
                MessageBox.Show(myenum.Current.ToString());
            }

            Stack mstack = new Stack();
            foreach (int p in a)
            {
                mstack.Push(p);
            }
            MessageBox.Show("mstack has :" +mstack.Count.ToString()+   "  POP from stack");
            while (mstack.Count > 0)
            {
                MessageBox.Show(mstack.Pop().ToString());
            }
       
        }
```

//enum列舉資料型別
//enumerate   --> en number 數字化  -->用變數名稱(文字)來代表(取代)數字
//用"文字"來取代"數字"
// en number a difficult number to an easy name.  
//人類擅長記憶名稱, 記不住複雜數字,   例如:家人的身分證號碼 / 手機號碼/生日, 記不住
//範例:請你使用Unicode 來朗誦"床前明月光 疑似地上霜"  並評估情境感覺如何
//\u5e8a\u524d\u660e\u6708\u5149\u7591\u4f3c\u5730\u4e0a\u971c


//常數的集合(限整數型態使用)  2-43
// enum enumerate  數字化
//可以簡化複雜整數的處理
//人類腦力的記憶有限,不善於記憶長串複雜的數字,可用文字代表

```
enum Weekdays : int
    {
        Monday=1,
        Tuesday=2,
        Wendesday=3,
        Thursday=4,
        Friday=5,
        Saturday=6,
        Sunday=7
    };

    private void button1_Click(object sender, EventArgs e)
    {
        int d;
        d = (int) Weekdays.Sunday;
        MessageBox.Show( d.ToString());   //7
    }

    enum tel : int
    {
        husband = 0910123456,
        wife = 0920123456,
        son = 0930123456
    };

  private void button2_Click(object sender, EventArgs e)
    {
        int t;
        t = (int) tel.son;
       MessageBox.Show(t.ToString("0000000000"));  // with leading zero
       MessageBox.Show(t.ToString());  // without leading zero  前置零會變成空白
    }
```


2022.5.38
//struct結構   structure   2-45頁
//各種資料型態型變數的集合(結構是混和資料型態, 由使用者依需要自行定義)
//struct裡若變數需要公用,要宣告為public 

```
struct Student
    {
     public  int  sno;   //整數
     public string sname;  //字串
     int age;              //private
     private int tel;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Student john;
        john.sno = 1001;
        john.sname = "JOHN";

        Student mary;
        mary.sno = 1002;
        mary.sname = "MARY";

        MessageBox.Show(john.sno.ToString() + john.sname);
        MessageBox.Show(mary.sno.ToString()+mary.sname);
     //MessageBox.Show("Age="+john.age);
    }
```


//補充:
class和struct,所有的變數預設都是屬於private.
而在struct裡若變數需要公用  要宣告為public 

class和struct兩者主要就是將一些變數或函數集結在一起，成為一種新的型態；
class比struct多了一個建構和解構的觀念，也就是一個變數在宣告成class型態的時候，
當這個變數被產生﹙變數生命週期的開始﹚時，系統會去呼叫這個class的建構函數，
讓程式撰寫者可以進行一些初始化的動作﹙包含類似要求記憶體，設定初始值之類的﹚；
而當變數將被釋放﹙變數生命週期的結束﹚時，系統會去呼叫這個class的解構函數，
讓程式撰寫者可以進行一些收尾的動作﹙通常是處理記憶體釋放之類的﹚ 

就以我個人的習慣而言，通常如果是簡單的資料組，我會宣告成struct型態﹙感覺就是純粹資料的集結﹚例如： 
```
struct Student{ 
char Name[20]; 
int Score; 
} 
```
這就是純粹將姓名和分數集結成一個結構體。 

如果是結構的資料必須進行某些特別處理或計算的，通常習慣寫成類別，例如： 
```
class Dog{ 
int ID; 
public: 
char Name[20]; 
void Run(); 
... 
} 
```
在這個狗的類別當中，就包含了簡單的結構內變數，以及專屬這個類別的函數﹙例如跑、跳、呼吸什麼的﹚ 

//  use int()  class 類別
// 物件來自類別   類別是藍圖
```
 private void button1_Click(object sender, EventArgs e)
        {
            int a;
            a = 1;
            MessageBox.Show(a.ToString());

            int b = new int();
            b = 2;
            MessageBox.Show(b.ToString());
        }
```