【程式設計 C#】命令提示字元視窗的輸出與輸入

命令提示字元視窗是我們的視窗作業環境中的一個特殊視窗,不支援視窗的元件、滑鼠,只有簡單的文字輸出及鍵盤輸入。支援的輸入與輸出方法(部份):

Read()從鍵盤讀取一個輸入,返回值為整數型態,也就是鍵盤輸入字元(按的一個鍵)的ASCII碼。
ReadLine() 從鍵盤讀取一行(按enter代表輸入完成),方法傳回一個字串。
Write() 輸出,不換行。
WriteLine()輸出後換行(等效於”\r\n”)

輸出:

範例1:

// Hello1.cs
public class Hello1
{
   public static void Main()
   {
      System.Console.WriteLine("Hello, World!");
   }
}
  • 每一個 Main 方法必須包含在類別中 (本範例中為 Hello1)。
  • WriteLine 方法是System.Console 類別中用來輸出一個字串到主控台 (Console) 的方法 。

範例2:

可以使用 using 指示詞 (Directive)宣告使用System命名空間(類似Java的套件),之後可以用較簡短的方式使用該命名空間下的類別方法,如下所示:

// Hello2.cs
using System;

public class Hello2
{
   public static void Main()
   {
      Console.WriteLine("Hello, World!");
   }
}

範例3:

如果想要存取傳遞到應用程式的命令列參數,需變更 Main 方法的簽名,以下列方式來存取它們。本範例計算和顯示命令列引數。

// Hello3.cs
// arguments: A B C D
using System;

public class Hello3
{
   public static void Main(string[] args)
   {
      Console.WriteLine("Hello, World!");
      Console.WriteLine("你輸入了 {0} 個命令列參數:",
         args.Length );
      for (int i=0; i < args.Length; i++)
      {
         Console.WriteLine("{0}", args[i]); 
      }
   }
}

範例 4

在整個程式的應用環境裏,一個程式可以喚用另一個程式,也因此,若要傳回一個傳回碼 (Return Code)給其呼叫者,可將 Main 方法的簽名變成:

// Hello4.cs
using System;

public class Hello4
{
   public static int Main(string[] args)
   {
      Console.WriteLine("Hello, World!");
      return 0; //回傳0
   }
}

在命令提示字元視窗中取得鍵盤輸入:

Console.Write("請輸入一個整數(0~100):");
int num = Convert.ToInt32(Console.ReadLine());//取得鍵盤的輸入(型態是字串),再轉換成int32整數資料型態

若要取得其他資料型態數值,請換成其他的資料型態:

char,double,float等

範例:

using System;

public class Hello
{
   public static void Main()
   {
		string str1;
		int price, qty;
		Console.WriteLine();
		Console.WriteLine(" 富國電腦圖書廣場");
		Console.WriteLine("======================");
		Console.Write(" 1. 書名:");
		str1 = Console.ReadLine(); // 輸入書名並指定給 輸入書名並指定給str1變數

		Console.Write(" 2. 售價:");		
		price = int.Parse(Console.ReadLine());

		Console.Write(" 3. 數量:");		
		qty = Convert .ToInt32 (Console.ReadLine());

		Console.WriteLine("======================");
		Console.WriteLine(" 4. 金額:{0}", price * qty);
		Console.Read();
	}
}

 

【C#-題庫】字串 Strings

1.  何者敘述為真?

String s1, s2;
s1 = “Hi”;
s2 = “Hi”;

  1. 在無法使用new的情況下,String物件無法被建立。
  2. 只有一個物件會被建立。
  3. s1 和 s2 皆指向相同的一個物件。
  4. 2個物件會被建立,其中一個被s1參考,另一個被s2參考。
  5. s1 和s2 是指向相同的物件的2個參考。

A. 1, 2, 4
B. 2, 3, 5
C. 3, 4
D. 2, 5

Answer
B

2.  底下程式片段輸出為何?

String s1 = “ALL MEN ARE CREATED EQUAL”;
String s2;
s2 = s1.Substring(12, 3);
Console.WriteLine(s2);

A. ARE
B. CRE
C. CR
D. REA
E. CREATED

Answer
B

3. 下列那個程式片段能夠正確地複製一個字串到另一個字串?

A.

String s1 = "String";
String s2; 
s2 = s1;

B.

String s1 = "String" ; 
String s2;
s2 = String.Concat(s1, s2);

C.

String s1 = "String"; 
String s2;
s2 = String.Copy(s1);

D.

String s1 = "String"; 
String s2;
s2 = s1.Replace();

E.

String s1 = "String"; 
String s2;
s2 = s2.StringCopy(s1);
Answer
C

4. 利用String類別所建立的字串是不可變的,另一方面,利用StringBuilder所建立的字串是可變的。

A. True
B. False

Answer
A

5. 底下程式的輸出為何?

String s1 = "Nagpur";
String s2;
s2 = s1.Insert(6, "Mumbai"); 
Console.WriteLine(s2);

A. NagpuMumbair
B. Nagpur Mumbai
C. Mumbai
D. Nagpur
E. NagpurMumbai

Answer
E

6. 如果s1和s2是參考到字串的參考,底下何者可以正確地比較2個參考?

A. s1 is s2
B. s1 = s2
C. s1 == s2
D. strcmp(s1, s2)
E. s1.Equals(s2)

Answer
E

7. 底下程式的輸出為何?

namespace IndiabixConsoleApplication
{
    class SampleProgram
    {
        static void Main(string[ ] args)
        {
            string str= "Hello World!";
            Console.WriteLine( String.Compare(str, "Hello World?" ).GetType() );
        }
    }
}

A. 0
B. 1
C. String
D. Hello World?
E. System.Int32

Answer
E

解說:String.Compare比較兩個指定的 String 物件,並傳回一個整數,指出它們在排序順序中的相對位置。

GetType()取得所屬的資料型態,此題是String.Compare傳回一個整數(Int32),所以GetType會傳回System.Int32。

8.  底下那一個程式片段能夠正確地轉換一個Single資料型態成為String資料型態?

1.

Single f = 9.8f; 
String s;
s = (String) (f);

2.

Single f = 9.8f; 
String s;
s = CONVERT.ToString(f);

3.

Single f = 9.8f; 
String s;
s = f.ToString();

4.

Single f = 9.8f; 
String s;
s = Clnt(f);

5.

Single f = 9.8f; 
String s;
s = CString(f);

A. 1, 2
B. 2, 3
C. 1, 3, 5
D. 2, 4

Answer
B

9. 底下程式的輸出為何?

String s1="Kicit";
Console.Write(s1.IndexOf('c') + " "); 
Console.Write(s1.Length);

A. 3 6
B. 2 5
C. 3 5
D. 2 6
E. 3 7

Answer
B

10. 底下那一個程式片段能夠正確地轉換一個String資料型態成為int資料型態?

1.

String s = "123"; 
int i;
i = (int)s;

2.

String s = "123";
int i;
i = int.Parse(s);

3.

String s = "123"; 
int i;
i = Int32.Parse(s);

4.

String s = "123"; 
int i;
i = CONVERT.ToInt32(s);
5.
String s = "123"; 
int i;
i = CInt(s);

A. 1, 3, 5
B. 2, 4
C. 3, 5
D. 2, 3, 4

Answer
D

11. 底下何者對String的敘述是正確的?

A. 一個String 字串建立在堆疊(stack)上。
B. 一個String 字串依其長度來決定是建置在堆疊或堆積(heap)上。
C.  String 字串是原始的資料型態。
D. 一個String 字串的建立是透過String s1 = new String;敘述來建立。
E. 一個String字串是建立在堆積(heap)上。

Answer
E

12. 底下何者對String的敘述是正確的?

A. 一個String 字串是可變的,因其建立後,可以修改String 字串內容。
B. String 字串類別的方法可用來修改String 字串。
C. 一個數字無法用一個String的形式表示。
D. 一個String 字串有一個從零開始的索引
E. System.Array類別用來表示一個字串。

Answer
D

解說:String 是一個字元陣列。

13. 底下程式片段輸出為何?

String s1 = "Five Star";
String s2 = "FIVE STAR";
int c;
c = s1.CompareTo(s2);
Console.WriteLine(c);

A. 0
B. 1
C. 2
D. -1
E. -2

Answer
D

14. 如果s1和s2是參考到字串的參考,底下何者可以正確地判斷2個字串是否相等?1.

if(s1 = s2)

2.

if(s1 == s2)

3.

int c;
c = s1.CompareTo(s2);

4.

if( strcmp(s1, s2) )

5.

if (s1 is s2)

A. 1, 2
B. 2, 3
C. 4, 5
D. 3, 5

Answer
B

15. 底下何者對String的敘述是正確的?

1.2個子串可用 s3 = s1 + s2; 的方式相串接。
2.String 字串是原始的資料型態。
3.使用StringBuilder 類別建立的字串是可變的。
4.使用String 類別建立的字串是不可變的。
5.2個子串可用 s3 = s1&s2; 的方式相串接。

A. 1, 2, 5
B. 2, 4
C. 1, 3, 4
D. 3, 5

Answer
C

16. 底下敘述何者正確?

  1.  String是一個數值型態。
  2.  String字符值可以包含任何一個字元,包含跳脫字元。
  3.  等效運算子被定義為比較2個字串物件的值,和其參考。
  4.  嘗試存取超過字串界限的一個字元會導致一個IndexOutOfRangeException。
  5.  一個字串物件的內容可以在其建立後被改變。

A. 1, 3
B. 3, 5
C. 2, 4
D. 1, 2, 4

Answer
C

17.  底下何者可以被正確地找出字串 “She sells sea shells on the sea-shore”中第2個’s’的位置(在字串中的索引)?

 

A.

String str = "She sells sea shells on the sea-shore"; 
int i;
i = str.SecondIndexOf("s");

B.

String str = "She sells sea shells on the sea-shore"; 
int i, j;
i = str.FirstIndexOf("s"); 
j = str.IndexOf("s", i + 1);

C.

String str = "She sells sea shells on the sea-shore"; 
int i, j;
i = str.IndexOf("s"); 
j = str.IndexOf("s", i + 1);

D.

String str = "She sells sea shells on the sea-shore"; 
int i, j;
i = str.LastIndexOf("s"); 
j = str.IndexOf("s", i - 1);

E.

String str = "She sells sea shells on the sea-shore"; 
int i, j;
i = str.IndexOf("S"); 
j = str.IndexOf("s", i);
Answer
C

【C#-題庫】陣列 (Arrays)

1.  底下何者對下面的程式片段說法正確?

int[ , ] intMyArr = {{7, 1, 3}, {2, 9, 6}};
  1. intMyArr 表示一個2列和3行的規則陣列。
  2. intMyArr.GetUpperBound(1) 會得到2。
  3. intMyArr.Length 會得到24。
  4. intMyArr 表示一個5個整數的1維陣列。
  5. intMyArr.GetUpperBound(0) 會得到2.

A. 1, 2
B. 2, 3
C. 2, 5
D. 1, 4
E. 3, 4

Answer
A

解說:

1. Array.GetUpperBound 方法 : 取得 Array 中指定維度的陣列索引的上限。

2. Array.Length 屬性 : 取得代表 Array 所有維度的元素總數之 32 位元整數。

2. 底下何者對下面的程式片段說法正確?

int[] a = {11, 3, 5, 9, 4};
  1. 此陣列元素是建立在堆疊(stack)之上。
  2. 陣列的參考a是建立在堆疊(stack)之上。
  3. 此陣列元素是建立在堆積(heap)之上。
  4. 在宣告該陣列時,一個新的陣列被建立出來,而此新陣列是繼承自System.Array類別。
  5.  該陣列元素是依據其陣列的大小來決定建立於堆疊或堆積之上。

A. 1, 2
B. 2, 3, 4
C. 2, 3, 5
D. 4, 5
E. None of these

Answer
B

3. 底下何者敘述正確?

A. 陣列元素僅能是整數型態。
B. 一個陣列的維度是其所擁有元素的數量。
C. 一個陣列的長度是該陣列的維度數。
D. 陣列元素的預設值為0(零)。
E. 陣列元素是排序過的。

Answer
D

4.  如果a是一個5個整數的陣列,底下何者敘述正確?

A.

int[] a = new int[5]; 
int[] a = new int[10];

B.

int[] a = int[5]; 
int[] a = int[10];

C.

int[] a = new int[5]; 
a.Length = 10 ;

D.

int[] a = new int[5]; 
a = new int[10];

E.

int[] a = new int[5]; 
a.GetUpperBound(10);
Answer
D

5. 如果要正確地印出陣列a的所有元素,你要如何完成下面的程式?

int[][]a = new int[2][];
a[0] = new int[4]{6, 1 ,4, 3};
a[1] = new int[3]{9, 2, 7}; 
foreach (int[ ] i in a)
    {
      /* Add loop here */
      Console.Write(j + " ");
      Console.WriteLine(); 
    }

A. foreach (int j = 1; j < a(0).GetUpperBound; j++)
B. foreach (int j = 1; j < a.GetUpperBound (0); j++)
C. foreach (int j in a.Length)
D. foreach (int j in i)
E. foreach (int j in a.Length -1)

Answer
D

6. 底下程式片段輸出為何?

int[ , , ] a = new int[ 3, 2, 3 ]; 
Console.WriteLine(a.Length);

A. 20
B. 4
C. 18
D. 10
E. 5

Answer
C

7. 下列何者對陣列的說法為正確?

  1. Arrays can be rectangular or jagged. 陣列可以是規則的,也可以是不規則的。
  2. 規則陣列被儲存在緊鄰的記憶體空間中。
  3. 不規則陣列不可以存取System.Array類別的方法。
  4. 規則陣列不可以存取System.Array類別的方法。
  5. 不規則陣列儲存在非緊鄰的記憶體空間中。

A. 1, 2
B. 1, 3, 5
C. 3, 4
D. 1, 2, 5
E. 4, 5

Answer
D

8.  底下何者對下面的程式片段說法正確?

int[][]intMyArr = new int[2][]; 
intMyArr[0] = new int[4]{6, 1, 4, 3}; 
intMyArr[1] = new int[3]{9, 2, 7};

A. intMyArr 為一個指向一個2維不規則陣列的參考。
B. intMyArr指向的不規則陣列的2個列被儲存在緊鄰的記憶體空間中。
C. intMyArr[0] 指向第0個1維陣列,intMyArr[1]指向第1個1維陣列。
D. intMyArr 指向intMyArr[0] 和intMyArr[1].
E. intMyArr 指向intMyArr[1] 和intMyArr[2].

Answer
C

9. 那一個是正確的方式來定義一個2列和3行的陣列?

  1. int[ , ] a;
    a = new int[2, 3]{{7, 1, 3},{2, 9, 6}};
  2. int[ , ] a;
    a = new int[2, 3]{};
  3. int[ , ] a = {{7, 1, 3}, {2, 9,6 }};
  4. int[ , ] a;
    a = new int[1, 2];
  5. int[ , ] a;
    a = new int[1, 2]{{7, 1, 3}, {2, 9, 6}};

A. 1, 2 , 3
B. 1, 3
C. 2, 3
D. 2, 4, 5
E. 4, 5

Answer
B

10.  對底下的陣列宣告何者敘述正確?

int[][][] intMyArr = new int[2][][];

A. intMyArr 指向1個2維的2列不規則陣列。
B. intMyArr指向1個2維的3列不規則陣列。
C. intMyArr指向1個3維不規則陣列,其中包含了2個2維不規則陣列。
D. intMyArr指向1個3維不規則陣列,其中包含了3個2維不規則陣列。
E. intMyArr指向1個3維不規則陣列,其中包含了2個2維規則陣列。

Answer
C

11. 對底下的陣列宣告何者敘述正確?

int[] intMyArr = {11, 3, 5, 9, 4};

A. intMyArr為一個指向System.Array類別物件的參考。
B. intMyArr為一個指向繼承自System.Array類別的物件的參考。
C. intMyArr為一個指向整數陣列的參考。
D. intMyArr為一個指向在堆疊中的物件參考。
E. intMyArr為一個指向建立在堆疊中的陣列參考。

Answer
B

12. 下面那個程式片段能夠正確地定義(define)並初始化(initialize )一個陣列的4個整數?

  1. int[] a = {25, 30, 40, 5};
  2. int[] a;
    a = new int[3];
    a[0] = 25;
    a[1] = 30;
    a[2] = 40;
    a[3] = 5;
  3. int[] a;
    a = new int{25, 30, 40, 5};
  4. int[] a;
    a = new int[4]{25, 30, 40, 5};
  5. int[] a;
    a = new int[4];
    a[0] = 25;
    a[1] = 30;
    a[2] = 40;
    a[3] = 5;

A. 1, 2
B. 3, 4
C. 1, 4, 5
D. 2, 4, 5
E. 2, 5

Answer
C

13. 底下程式片段的輸出為何?

    int[][] a = new int[2][];
    a[0] = new int[4]{6, 1, 4, 3};
    a[1] = new int[3]{9, 2, 7}; 
    Console.WriteLine(a[1].GetUpperBound(0));

A. 3
B. 4
C. 7
D. 9
E. 2

Answer
E

14. 那一個敘述能夠正確地取得底下陣列的元素數量?

int[] intMyArr = {25, 30, 45, 15, 60};
  1. intMyArr.GetMax;
  2. intMyArr.Highest(0);
  3. intMyArr.GetUpperBound(0);
  4. intMyArr.Length;
  5. intMyArr.GetMaxElements(0);

A. 1, 2
B. 3, 4
C. 3, 5
D. 1, 5
E. 4, 5

Answer
B

15. 底下程式片段的輸出為何?

namespace IndiabixConsoleApplication
{
    class SampleProgram
    {
        static void Main(string[ ] args)
        {
            int i, j;
            int[ , ] arr = new int[ 2, 2 ];
            for(i = 0; i < 2; ++i)
            {
                for(j = 0; j < 2; ++j)
                {
                    arr[i, j] = i * 17 + i * 17;
                    Console.Write(arr[ i, j ] + " ");
                }
            }
        }
    }
}

A. 0 0 34 34
B. 0 0 17 17
C. 0 0 0 0
D. 17 17 0 0
E. 34 34 0 0

Answer
A

【資料結構】佇列(Queue)介紹與使用

生活中的各種佇列

系統 客戶 服務者
接待櫃台 一般人員 接待人員
購票櫃台(高鐵、台鐵、戲院…) 購票者 售票服務人員
醫院 病患 護理師
機場 飛機 飛機跑道
道路網 汽車 交通號誌燈
超市、攤販 購買者 結帳櫃台
電腦 工作 CPU, disk, printer

Queue的種類

  • Multiple queues, multiple servers,台鐵售票、量販店/統聯結帳櫃台
  • Single queue, multiple servers,高鐵售票、
  • Single queue, single server, 小型商店、攤販…
  • Priority queues

C# Queue類別

C# System.Collection 命名空間裏提供了一個Queue類別,實現在佇列先進行出的概念(FIFO,First In First Out),和堆疊Stack 的操作(後進先出)完全不一樣。Queue類別也是一個有序集合物件。

Queue集合類別允許多個null/空值,且允許重複的值,提供Enqueue() 方法來加入值到Queue集合物件中,Dequeue() 方法從Queue集合物件中取出資料。

 

120116_0009_Queue1.png

 

Queue重要的屬性與方法

方法 或 屬性 用途
Count 傳回Queue集合物件中的元素數量
Enqueue 加入一個項目到queue中
Dequeue 從queue的前端取出一個項目並刪除該項目
Peek 從queue的前端取出一個項目(不刪除該項目)
Contains 檢查queue是否包含某一個特定項目
Clear 清除queue所有的項目
TrimToSize 調整queue的大小到實際儲存項目的大小

加入項目到 Queue中:

Queue 是一個非泛型的集合(non-generic collection),你可以使用Enqueue()方法加入任何資料形態的元素到queue中。
Enqueue() 簽名: void Enqueue(object obj)

Enqueue()範例

Queue queue = new Queue();
queue.Enqueue(3);
queue.Enqueue(2);
queue.Enqueue(1);
queue.Enqueue(“Four”);

存取Queue:

Dequeue() 方法從queue的前端取出一個項目並刪除該項目。
Dequeue() method signature: object Dequeue()

Dequeue()範例

Queue queue = new Queue();
queue.Enqueue(3);
queue.Enqueue(2);
queue.Enqueue(1);
queue.Enqueue(“Four”);
Console.WriteLine(“Queue中的元素數量: {0}”, queue.Count);
while (queue.Count > 0) Console.WriteLine(queue.Dequeue());
Console.WriteLine(“Queue中的元素數量: {0}”, queue.Count);

輸出:
Queue中的元素數量: 4
3
2
1
Four
Queue中的元素數量: 0

Peek():

從queue的前端取出一個項目(不刪除該項目),在一個空的queue喚用Peek() 和 Dequeue() 方法會導至一個執行時期的例外, “InvalidOperationException”.
Peek() 方法 Signature: object Peek();

Peek()範例:

Queue queue = new Queue();
queue.Enqueue(3);
queue.Enqueue(2);
queue.Enqueue(1);
queue.Enqueue(“Four”);
Console.WriteLine(“Queue中的元素數量: {0}”, queue.Count);
Console.WriteLine(queue.Peek());
Console.WriteLine(queue.Peek());
Console.WriteLine(queue.Peek());
Console.WriteLine(“Queue中的元素數量: {0}”, queue.Count);

輸出:
Queue中的元素數量: 4
3
3
3
Queue中的元素數量: 4

 

如果你想走訪queue中的每一個元素,又不想刪去其中的元素,可以將queue轉換為一個陣列:

走訪Queue範例:

Queue queue = new
Queue();
queue.Enqueue(3);
queue.Enqueue(2);
queue.Enqueue(1);
queue.Enqueue(“Four”);
Console.WriteLine(“Queue中的元素數量: {0}”, queue.Count);
foreach (var i in queue.ToArray())
Console.WriteLine(i);
Console.WriteLine(“Queue中的元素數量: {0}”, queue.Count);

輸出:

Queue中的元素數量: 4
3
2
1
Four
Queue中的元素數量: 4

  • Contains方法

Contains()方法檢查queue是否包含某一個特定項目,有的話方法回傳true,沒有的話回傳false。
Contains() Signature: bool Contains(object obj);

Contains範例

Queue queue = new
Queue();
queue.Enqueue(3);
queue.Enqueue(2);
queue.Enqueue(1);
queue.Enqueue(“Four”);
queue.Contains(2); // true
queue.Contains(100); //false

  • Clear()方法:

Clear()方法清除queue所有的項目。
Clear() Signature: void Clear();

Clear()範例:

Queue queue = new
Queue();
queue.Enqueue(3);
queue.Enqueue(2);
queue.Enqueue(1);
queue.Enqueue(“Four”);
Console.WriteLine(“Queue中的元素數量: {0}”, queue.Count);
queue.Clear();
Console.WriteLine(“Queue中的元素數量: {0}”, queue.Count);

輸出:
Queue中的元素數量: 4
Queue中的元素數量: 0

使用Queue類別的佇列建立操作示範:

using System;
using System.Collections;
class Program
{
    static void Main(string[] args)
    {
        //建立一個看診佇列
        Queue myQ = new Queue();
        myQ.Enqueue("張三");//新增人員到看診佇列,也就是加入排隊…
        myQ.Enqueue("李四");
        myQ.Enqueue("王五");
        myQ.Enqueue("馬六");

        // 列印看診佇列的數量和值
        Console.WriteLine("候診的人數:    {0}", myQ.Count);

        // 列印看診佇列中的所有值
        Console.Write("目前候診的名單:");
        PrintValues(myQ);

        // 列印佇列中的第一個元素,並移除
        Console.WriteLine("進入診間的人:\t{0}", myQ.Dequeue());

        // 加入看診佇列
        Console.WriteLine("蘇小小加入等待看診排隊…");

        myQ.Enqueue("蘇小小");

        // 列印看診佇列中的所有值
        Console.Write("目前候診的名單:");
        PrintValues(myQ);

        // 列印看診佇列中的第一個元素,並移除
        Console.WriteLine("進入診間的人:\t{0}", myQ.Dequeue());

        // 列印看診佇列中的所有值
        Console.Write("目前候診的名單:");
        PrintValues(myQ);

        // 列印看診佇列中的第一個元素
        Console.WriteLine("下一個要進入診間的人(查詢):   \t{0}", myQ.Peek());

        // 列印看診佇列中的所有值
        Console.Write("目前候診的名單:");
        PrintValues(myQ);

        Console.ReadLine();

    }

    public static void PrintValues(IEnumerable myCollection)
    {
        foreach (Object obj in myCollection)
            Console.Write("    {0}", obj);
        Console.WriteLine();
    }
}

/* 程式的輸出
候診的人數:    4
目前候診的名單:    張三    李四    王五    馬六
進入診間的人:  張三
蘇小小加入等待看診排隊…
目前候診的名單:    李四    王五    馬六    蘇小小
進入診間的人:  李四
目前候診的名單:    王五    馬六    蘇小小
下一個要進入診間的人(查詢):    王五
目前候診的名單:    王五    馬六    蘇小小
*/

 

【佇列影音教學 on youtube】

【程式設計-C#】九九乘法表

【程式設計-C#】九九乘法表

【程式設計-C#】九九乘法表

 

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 九九乘法表
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string output = ""; //用來儲存要輸出的資料
            for (int i = 1; i <= 9; i++)
            {
                for (int j = 1; j <= 9; j++)
                {
                    output += "" + i + "*" + j + "=" + (i * j).ToString().PadLeft(2, ' ') + " ";
                }
                output += "\r\n"; //每印完一列,進行跳行(r:return, n:new line)
            }
            label1.Text = output; //將output內容輸出到label1上
        }
    }
}

9x9flow

【程式設計-C#】魔方陣

【程式設計-C#】魔方陣

【程式設計-C#】魔方陣

魔方陣的解法/演算法:

設有奇數方陣,3×3, 5×5…, nxn

要將1~nxn的數值填入此方陣中,使得此方陣的各列、各行、斜行/列上的數值加總為相等。

Step 1: 將1置放於方陣的第1列中間位置

設N= 2  … nxn

Step 2: 往左上角找候選的位置來放入N,此時左上角的位置,會有底下2種狀況

狀況1: 左上角的位置跑出陣列外,此時,我們將左上角位置另一端位置做為新候選位置。

狀況2:若候選位置上已經被佔據了(已有數值),此時,我們將原本數值位置的下方位置,做為新候選位置。

Step 3: 將數值N放入候選位置/新候選位置 (找到的可放置數值位置)。

Step 4:N加1,重覆Step 2與Step 4,直到N等於nxn。


if & 取餘數循環版

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 WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void makeMagicMatrix1(int matrixSize)
        {
            int[,] Matrix = new int[99, 99];
            int row = 0;
            int col = matrixSize / 2;
            Matrix[row, col] = 1;

            for (int stepper = 2; stepper <= matrixSize * matrixSize; stepper++)
            {
                row--;col--; //往左上角移動,二維陣列行與列索引皆減1
                //判斷是否出界,小於0為出界的條件
                if (row < 0) row = matrixSize - 1;
                if (col < 0) col = matrixSize - 1;

                if (Matrix[row, col] != 0) //判斷要放置的位處若不是空的話,需要進行倒退的的動作
                {
                    row = (row + 2);
                    col = (col + 1);
                    //倒退後,也有可能出界,大於matrixSize-1為出界的條件
                    if (row >= matrixSize) row = row - matrixSize;
                    if (col >= matrixSize) col = col - matrixSize;
                }
                Matrix[row, col] = stepper;
            }

            string outStrng = "";

            for (int i = 0; i < matrixSize; i++)
            {
                for (int j = 0; j < matrixSize; j++)
                {
                    outStrng += Matrix[i, j].ToString().PadLeft(2, ' ') + "   ";

                }
                outStrng += "\r\n";
            }
            label2.Text = outStrng;
            label2.Location = new Point((this.panel2.Width - label2.Width) / 2, 0); //置中label2

        }


        private void makeMagicMatrix2(int matrixSize)
        {
            int[,] Matrix = new int[99, 99];
            int row = 0;
            int col = matrixSize / 2;
            Matrix[row, col] = 1;

            for (int stepper = 2; stepper <= matrixSize * matrixSize; stepper++)
            {
                row = (row - 1 + matrixSize) % matrixSize;
                col = (col - 1 + matrixSize) % matrixSize;
                if (Matrix[row, col] != 0)
                {
                    row = (row + 2) % matrixSize;
                    col = (col + 1) % matrixSize;
                }
                Matrix[row, col] = stepper;
            }

            string outStrng = "";

            for (int i = 0; i < matrixSize; i++)
            {
                for (int j = 0; j < matrixSize; j++)
                {
                    outStrng += Matrix[i, j].ToString().PadLeft(2, ' ') + "   ";

                }
                outStrng += "\r\n";
            }
            label2.Text = outStrng;
            label2.Location = new Point((this.panel2.Width - label2.Width) / 2, 0); //置中label2

        }

        private void button1_Click(object sender, EventArgs e)
        {
            int matrixSize = Convert.ToInt32(textBox1.Text);
            makeMagicMatrix1(matrixSize);
        }
    }
}

 

magicmatrixflow

2018/10/24 程式碼

const int n = 5;
int[,] M = new int[n, n];
int row = 0, col = n / 2;
M[row, col] = 1; //將1放入第1列中間位置           
for (int N = 2; N <= n * n; N++)
{
    //狀況1
    row = (row - 1 + n) % n; col = (col - 1 + n) % n;
    //狀況2
    if (M[row, col] != 0) //要放的位置上已經有數值
    {
        row = (row + 2) % n; col = (col + 1) % n;
    }
    M[row, col] = N; //將N放入決定好的位置
}
//輸出魔方陣
for (int r = 0; r < n; r++)
{
    for (int c = 0; c < n; c++)
    {
        Console.Write("{0, 4}", M[r, c]);
    }
    Console.WriteLine();
}