1. 程式人生 > 其它 >《C#入門詳解》基本元素概覽 型別

《C#入門詳解》基本元素概覽 型別

C#入門詳解-劉鐵錳 基本元素概覽 型別

本節內容

  • 構成C#語言的基本元素
    • 關鍵字(Keyword)
    • 操作符(Operator)
    • 識別符號(Identifier)
    • 標點符號
    • 文字
    • 註釋與空白
  • 簡要介紹型別、變數與方法
  • 演算法簡介

構成C#語言的基本元素

  • 關鍵字(Keyword)
  • 操作符(Operator)
  • 識別符號(Identifier)
    • 什麼是合法的識別符號?
      • 怎樣閱讀語言定義文件?
    • 大小寫規範
    • 命名規範
  • 標點符號
  • 文字(字面值)
    • 整數
      • 多種字尾
    • 實數
    • 字元
    • 字串
    • 布林
    • 空(null)
  • 註釋與空白
    • 單行
    • 多行(塊註釋)
int x = 2;   // 短整型
long y = 3L;    // 長整型
float z = 3.0F;     // 單精度浮點型
double h = 3.00;    // 雙精度浮點型
char c = 'a';   // 字元型
string s = "a";     // 字串型
bool b = true;      // 布林型
string n = null;      // null型

註釋

// 單行註釋

/*
塊註釋
*/

初識型別、變數和方法

  • 初始型別(Type)

    • 亦稱資料型別(Data Type)
  • 變數是存放資料的地方,簡稱“資料”

    • 變數的宣告
    • 變數的使用
  • 方法(舊稱函式)是處理資料的邏輯,又稱為“演算法”

    • 方法的宣告
    • 方法的呼叫
  • 程式=資料+演算法

    • 有了變數和方法就可以寫有意義的程式了

演示程式碼:

using System;

namespace IdentifierExample
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int x = 2;   // 短整型
            long y = 3L;    // 長整型
            float z = 3.0F;     // 單精度浮點型
            double h = 3.00;    // 雙精度浮點型
            char c = 'a';   // 字元型
            string s = "a";     // 字串型
            bool b = true;      // 布林型
            string n = null;      // null型

            Calculator cal = new Calculator();
            int res = cal.Add(2, 3);
            Console.WriteLine(res);  // 5
            string day = cal.Today();
            Console.WriteLine(day);
        }
    }

    class Calculator // 定義一個Calculator類
    {
        // 有資料輸入,有資料輸出
        public int Add(int a, int b)   // 定義一個公開的Add方法
        {
            return a + b;
        }

        // 沒有資料輸入,有資料輸出
        public string Today()
        {
            int day = DateTime.Now.Day;
            return day.ToString();
        }

        // 沒有資料輸入,沒有資料輸出
        public void PrintSum(int a, int b)  // 沒有返回值
        {
            int result = a + b;
            Console.WriteLine(result);
        }
    }
}

演算法簡介

  • 迴圈初體驗
  • 遞迴初體驗
  • 計算1到100的和
using System;

namespace MyExample
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Calculator c = new Calculator();
            // c.PrintTo1(10);
            c.PrintTo2(10);
            int res = c.SumFrom1ToX1(10);
            Console.WriteLine(res);  // res=55
            res = c.SumFrom1ToX2(100);
            Console.WriteLine(res); // 5050
        }
    }

    class Calculator
    {
        public void PrintTo1(int x) // for迴圈實現
        {
            for (int i = x; i > 0; i--)
            {
                Console.WriteLine(i);
            }
        }

        public void PrintTo2(int x) // 遞迴實現
        {
            if (x==1)
            {
                Console.WriteLine(x);
            }
            else
            {
                Console.WriteLine(x);
                PrintTo2(x - 1);
            }
        }

        // 演示,實際開發不要這樣命名函式
        public int SumFrom1ToX1(int x) // for迴圈實現求和
        {
            int res = 0;
            for (int i = 1; i < x+1; i++)
            {
                res = res + i;
            }
            return res;
        }
        public int SumFrom1ToX2(int x)  // 遞迴實現求和
        { 
            if (x==1)
            {
                return 1;
            }
            else
            {
                int res = x + SumFrom1ToX2(x - 1);
                return res;
            }
        }
    }
}

漢諾塔問題

[參考博文地址]((156條訊息) C#中的遞迴以及解決漢諾塔問題_檸檬i的部落格-CSDN部落格_c#漢諾塔問題遞迴演算法)

漢諾塔由法國數學家愛德華·盧卡斯創造,他曾經編寫了一個印度的古老傳說:

在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。

怎麼解決漢諾塔問題?

要完成四層漢諾塔,需要先把第四層盤子從A柱放到C柱,而要把第四層盤子放到C柱,就要把上面三層的盤子放到B柱:

那麼要把這三層盤子移到B柱,那麼就要先把第三層盤子移到B柱。
要把第三層盤子移到B柱,就要把第二層盤子移到C柱子。
要把第二層盤子移到C柱,就要把第一層盤子移到B柱子。
移動一層漢諾塔到另一個柱不簡單嗎?
這樣子把問題解決了,第四層盤子就可以移動到C柱上了。
然後把剩下的三層漢諾塔也按照上面的思想,就可以移動到C柱上了。

具體程式碼實現

把大象裝進冰箱需要多少步

  1. 把冰箱門開啟
  2. 把大象放進去
  3. 把冰箱門關上

把漢諾塔放到C柱需要多少步?

  1. 把底層上面的盤子放到B柱

  2. 把最底層盤子放到C柱

  3. 把B柱那些盤子放到C柱

抽象一下就是:

  1. 把n-1層盤子從起點移到暫存區

  2. 然後把第n層盤子從起點移到終點

  3. 然後把n-1層盤子從暫存區移到終點

在這裡可以建立一個Move方法來移動盤子

static void Move(int pile, char src, char tmp, char dst)
{

}

src就是源起點,tmp就是暫存區,dst就是終點

最外層的Move方法完成的是把pile層漢諾塔從src經過tmp移動到dst

現在要把大象裝進冰箱了

Move方法裡面呼叫Move方法來解決之後的問題:

  1. 把冰箱門開啟
Move(pile - 1, src, dst, tmp);

這層Move完成的是把pile-1層漢諾塔從src經過dst移動到tmp

  1. 把大象塞進去

    Move(1, src, tmp, dst);
    

    這層Move完成的是把最底層漢諾塔盤子從src直接移動到dst

  2. 把門關上

    Move(pile - 1, tmp, src, dst);
    

    這層Move完成的是把pile-1層漢諾塔從tmp經過src移動到dst

Move方法完整程式碼:

static void Move(int pile, char src, char tmp, char dst)
{
    if (pile ==1)
    {
        Console.WriteLine($"{src}-->{dst}");
        steps++;
        return;
    }
    Move(pile - 1, src, dst, tmp);
    Move(1, src, tmp, dst);
    Move(pile-1, tmp, src, dst);
}

每一層Move方法都有他自己的起點、暫存區和終點,我們只需要把上一層的起點、暫存區和終點傳過去就行了。

完整程式碼

using System;

namespace Hannuota
{
    internal class Program
    {
        public const int Max_VALUE = 30; //宣告最大層數
        public static int steps = 0;
        static void Main(string[] args)
        {
            int levels;
            Console.WriteLine($"輸入漢諾塔層數(1-{Max_VALUE}):");
            levels = int.Parse(Console.ReadLine());
            if (levels > 0 && levels < Max_VALUE)
            {
                Move(levels, 'A', 'B', 'C');
                Console.WriteLine($"一共移動了{Program.steps}次。");
                Console.ReadKey();
                return;
            }
            Console.WriteLine("輸入範圍有誤");
            Console.ReadKey();
        }

        static void Move(int pile, char src, char tmp, char dst)
        {
            if (pile ==1)
            {
                Console.WriteLine($"{src}-->{dst}");
                steps++;
                return;
            }
            Move(pile - 1, src, dst, tmp);
            Move(1, src, tmp, dst);
            Move(pile-1, tmp, src, dst);
        }
    }
}