《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柱上了。
具體程式碼實現
把大象裝進冰箱需要多少步
- 把冰箱門開啟
- 把大象放進去
- 把冰箱門關上
把漢諾塔放到C柱需要多少步?
-
把底層上面的盤子放到B柱
-
把最底層盤子放到C柱
-
把B柱那些盤子放到C柱
抽象一下就是:
-
把n-1層盤子從起點移到暫存區
-
然後把第n層盤子從起點移到終點
-
然後把n-1層盤子從暫存區移到終點
在這裡可以建立一個Move方法來移動盤子
static void Move(int pile, char src, char tmp, char dst)
{
}
src
就是源起點,tmp
就是暫存區,dst
就是終點
最外層的Move
方法完成的是把pile
層漢諾塔從src
經過tmp
移動到dst
現在要把大象裝進冰箱了
在Move
方法裡面呼叫Move
方法來解決之後的問題:
- 把冰箱門開啟
Move(pile - 1, src, dst, tmp);
這層Move
完成的是把pile-1
層漢諾塔從src
經過dst
移動到tmp
-
把大象塞進去
Move(1, src, tmp, dst);
這層
Move
完成的是把最底層漢諾塔盤子從src
直接移動到dst
-
把門關上
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);
}
}
}