[TH] พื้นฐาน C#

บทความมนี้กล่าวถึงพื้นฐานการเขียนโปรแกรมภาษา C# ที่นำไปใช้ในการเรียนการสอนในรายวิชา การพัฒนาเกม และคณิตร์ศาสตร์คอมพิวเตอร์ โดยเริ่มจากเรื่องของจำนวน การดำเนินการกับจำนวน เงื่อนไข การทำซ้ำ โปรแกรมย่อย อันนำไปสู่การประยุกต์ใช้คณิตศาสตร์เข้ากับเกมหรือนำไปใช้กับการเขียนโปรแกรมด้วย Unity ต่อไป ด้วยเครื่องมือการเขียนโปรแกรมอย่าง Visual Studio, Unity หรือ Godot mono เป็นต้น

ตัวเลขในภาษา C#

          จำนวนที่ใช้กับ C# ประกอบด้วยจำนวนเต็มและทศนิยม โดยจำนวนมีขนาดแตกต่างกันตามตารางที่ 1 เพื่อให้ผู้เขียนโปรแกรมเลือกใช้ตามช่วงค่าที่ต้องการใช้ ทำให้ประหยัดปริมาณหน่วยความจำของคอมพิวเตอร์ หรืออุปกรณ์ที่รันโปรแกรม

          ถ้าเป็นจำนวนเต็มให้ใช้ค่าตัวเลขระบุ เช่น 1, 5, -10, 0  หรือ -200 แต่ถ้าเป็นทศนิยมจะต้องใส่ค่าหลังเลขจำนวนเต็มประกอบ เช่น 1.0, 5.0, -10.0, 0.0 หรือ 200.0 โดยต้องกำหนดอักษร f ต่อท้ายตัวเลขเพื่อระบุประเภทของตัวเลขเป็นทศนิยมแบบ float แต่ถ้าไม่ระบุจำหมายถึง double เป็นต้น

          ตัวเลขที่ถูกใช้ในภาษา C# มี 2 ประเภท คือ ตัวเลขที่เป็นค่าคงที่ และตัวเลขที่เก็บอยู่ในตัวแปร โดยในรูปแบบแรกนั้นเป็นการอ้างอิงชื่อเพื่อใช้แทนค่าตัวเลขทำให้สะดวกในการอ้างอิงหรือเปลี่ยนแปลงค่าแล้วส่งผลให้ทุกชื่อที่อ้างอิงนั้นเปลี่ยนเป็นค่าเดียวกันหมด ส่วนตัวแปรนั้นเป็นการจองหน่วยความจำของคอมพิวเตอร์เพื่อจัดเก็บตัวเลขลงในหน่วยความจำที่จองนั้น ดังนั้น ถ้าหน่วยความจำไม่เพียงพอจะส่งผลให้โปรแกรมไม่สามารถทำงานได้ และการจองหน่วยความจำที่ไม่เพียงพอต่อการเก็บส่งผลให้ค่านั้นเปลี่ยนแปลงไปเป็นค่าที่ไม่พึงประสงค์ได้ เช่น จองไว้ 1 ไบต์ ซึ่งเก็บค่าได้ -128 ถึง 127 (ดังตารางที่ 1-1) เมื่อใดที่มีค่าเป็น 127 แล้วเพิ่มค่าอีก 1 จะไม่ทำให้ค่าเป็น 128 แต่กลับกลายเป็น -128 เป้นต้น นอกจากนี้ในบางครั้งที่จองขนาดหน่วยความจำที่เกินกว่าจำเป็น เช่น ไม่ว่าอย่างไรค่าที่เก็บเป็นตัวเลขในช่วง 1 ถึง 8 แต่ผู้เขียนโปรแกรมจองหน่วยความจำเป็น UInt32 ซึ่งต้องการหน่วยความจำจำนวน 4 ไบต์ในการเก็บทั้งที่ใช้เพียง 1 ไบต์ก็เพียงพอ เป็นต้น

ตัวแปรและค่าคงที่

สำหรับจำนวนที่ผู้เขียนโค้ดต้องการให้มีการเปลี่ยนแปลงค่าได้ในภายหลังเรียกว่าตัวแปร (variable) และจำนวนที่ไม่ต้องการให้มีการเปลี่ยนแปลงค่าเรียกว่า ค่าคงที่ (constant) นั้นมีรูปแบบของการกำหนดดังนี้ ส่วนประเภทข้อมูล 

ประเภทข้อมูล  ชื่อตัวแปร;

const ประเภทข้อมูล ชื่อค่าคงที่ = ตัวเลข;

กรณีที่ต้องการประกาศตัวแปรโดยไม่ต้องการระบุประเภทของข้อมูลสามารถสร้างตามรูปแบบของคำสั่งต่อไปนี้

var  ชื่อตัวแปร = ตัวเลข;

โดยประเภทของตัวแปรที่สร้างนี้จะเป็นจำนวนเต็มหรือทศนิยมด้วยการจำแนกจากตัวเลขที่กำหนดให้ตัวแปร

โครงสร้างการเขียนโค้ด

          โครงสร้างโปรแกรมพื้นฐานของ C# เป็นดังด้านล่างนี้ โดยจะพบว่า เมื่อใดที่วัตถุถูกเรียกขึ้นใช้งาน และพร้อมทำงานจะมีการเรียกใช้ฟังก์ชัน Main() ให้ทำงานเป็นฟังก์ชันแรกเสมอ ส่วนคำสั่ง WriteLine() ใช้สำหรับแสดงข้อความจากข้อมูลที่ส่งให้ และเมื่อแสดงข้อมูลครบทุกตัวจะดำเนินการขึ้นบรรทัดใหม่ และด้านหน้า WriteLine() จะมีชื่อคลาส Console ซึ่งเป็นคลาสที่อยู่ภายใต้คลาส System ที่ถูกเรียกใช้ในบรรทัดแรกด้วยคำสั่ง using แต่ถ้าผู้เขียนโปรแกรมไม่ได้เรียก using System จะต้องใช้คำสั่ง WriteLine() ในรูปแบบต่อไปนี้

System.Console.WriteLine( ข้อมูล )

ข้อสังเกตเพิ่มเติมคือชื่อของคลาสจะเป็นชื่อเดียวกับไฟล์ และไฟล์ต้นฉบับ (Source Code) ภาษา C# จะมีนามสกุลเป็น .cs

โปรแกรม 1-1 รูปแบบของโปรแกรมภาษา C#

using System;
namespace ชื่อแอปพลิเคชัน
{
    classชื่อคลาส
    {
        static void Main( string[] args )
        {
            Console.WriteLine( "Hi, C#!" );
        }
    }
}

          ตัวอย่างโปรแกรมสำหรับการสร้างค่าคงที่ my_pi ให้เก็บค่า 3.1415 และตัวแปร x และ y สำหรับเก็บค่า 100 และ -50.2 แล้วแสดงผลของค่าที่ส่วนแสดงผลของโปรแกรมด้วยคำสั่ง print() สามารถเขียนได้ดังโปรแกรม 1-2 โดยตัวอย่างของผลลัพธ์เป็นดังภาพที่ 1-2

โปรแกรม 1-2 แสดงค่าจากตัวแปรและค่าคงที่

using System;
namespace Hi
{
    class Program
    {
        static void Main(string[] args)
        {
            var x = 100;
            var y = -50.2;
            const float my_pi = 3.1415f;
            Console.WriteLine("x = " + x);
            Console.WriteLine("y = " + y);
            Console.WriteLine("my_pi = " + my_pi);
        }
    }
}

การกำหนดค่า

การกำหนดค่าในทางคอมพิวเตอร์ใช้รูปแบบของการทำงานดังนี้

L = R;

โดย     

L คือ ตัวแปร                    

R คือ นิพจน์ (expression) อันจะเป็นตัวเลข ค่าคงที่ ตัวแปร หรือโปรแกรมย่อยที่จะถูกกระทำหรือทำงานจนได้คำตอบเพื่อนำไปเก็บใน L

นิพจน์เป็นการดำเนินการระหว่างตัวดำเนินการตามรูปแบบชองเครื่องหมายดำเนินการ อันได้แก่

                    1. เครื่องหมายดำเนินการ ตัวดำเนินการ

                    2. ตัวดำเนินการ1  เครื่องหมายดำเนินการ ตัวดำเนินการ2

          ในรูปแบบที่ 1 จะเป็นเครื่องหมายดำเนินการประเภทเปลี่ยนแปลงค่าของตัวดำเนินการ อันได้แก่

                    -a        หมายถึง          การนำ -1 คูณกับ a

                    !a        หมายถึง          กลับค่าตรรกะของ a ถ้าเดิม a เป็น true จะได้ผลลัพธ์เป็น

                                                  false และ ในทางกลับกันเมื่อเดิม a เป็น false จะได้ผลลัพธ์

                                                  เป็น true

                    not a   หมายถึง          กลับค่าตรรกะของ a ซึ่งให้ผลลัพธ์เหมือนกับการใช้คำสั่ง !a

          ในรูปแบบที่ 2 เป็นการกระทำระหว่างตัวดำเนินการ1 กับตัวดำเนินการ2 ซึ่งเครื่องหมายในกลุ่มนี้ได้แก่ การดำเนินการทางคณิตศาสตร์ เป็นตามตารางที่ 1-1 และการดำเนินการทางตรรกะ เป็นตามตารางที่ 1-2 (ให้ผลลัพธ์เป็น false หรือ true)

จากตาราง 1-2 จะพบว่าการประยุกต์ใช้เครื่องหมายสำหรับการย่อการเขียนในกรณีที่ตัวดำเนินการเป็นตัวเดียวกัน เช่น การเพิ่มค่าตัวแปร a ขึ้น 1 ค่า สามารถเขียนได้เป็น

             a = a + 1

          แต่สามารถเขียนแบบย่อเพื่อให้คำสั่งสั้นลงเป็นดังนี้

             a += 1

          ดังนั้น เครื่องหมายสำหรับการเขียนแบบย่อจึงมีด้วยกัน 5 แบบ คือ

                    ตัวแปร += ค่า             หมายถึง          ตัวแปร = ตัวแปร + ค่า

                    ตัวแปร -=  ค่า             หมายถึง          ตัวแปร = ตัวแปร – ค่า

                    ตัวแปร *=  ค่า             หมายถึง          ตัวแปร = ตัวแปร * ค่า

                    ตัวแปร /=  ค่า             หมายถึง          ตัวแปร = ตัวแปร / ค่า

                    ตัวแปร %=  ค่า           หมายถึง          ตัวแปร = ตัวแปร % ค่า

          จากตารางที่ 1-3 จะได้ผลลัพธ์ของการดำเนินการทางตรรกะแบบ และ เป็นตามตารางที่  1-4 และการดำเนินการทางตรรกะแบบ หรือ เป็นผลลัพธ์ตามตารางที่ 1-5

          การกระทำระหว่างจำนวนในเชิงของระบบคอมพิวเตอร์นั้นมีเงื่อนไขดังนี้

                    1. การกระทำระหว่างตัวเลขจำนวนเต็มกับจำนวนเต็มจะได้ค่าเป็นจำนวนเต็ม

                    2. การกระทำระหว่างตัวเลขทศนิยมกับเลขทศนิยมจะได้ค่าเป็นทศนิยม

                    3. การกระทำระหว่างตัวเลขจำนวนเต็มกับตัวเลขทศนิยมจะได้เป็นทศนิยม

                    4. การหารด้วย 0 จะได้ค่าเป็นอนันต์ (infinity) ซึ่งไม่ถูกนิยามในทางคณิตศาสตร์แต่ในระบบคอมพิวเตอร์จะก่อเกิดปัญหาเรื่อง divide by zero อันทำให้โปรแกรมที่เขียนนั้นเกิดความผิดพลาดและส่งผลให้สิ้นสุดการทำงานแบบเกิดความผิดพลาด

                    5. ตัวเลข 0 หารด้วยค่าใด ๆ ได้ผลลัพธ์เป็น 0 เสมอ

          ตัวอย่างโปรแกรม 1-3 เป็นการคำนวณการแปลงค่าอุณหภูมิจาก 35 องศาเซลเซียสเป็นฟาเรนไฮต์ จากสมการแปลงค่าอุณหภูมิดังนี้

°F = °C x (9/5) + 32

โปรแกรม 1-3 ตัวอย่างการแปลง 35 องศาเซลเซียสเป็นฟาเรนไฮต์

using System;

namespace temp_conv
{
    class Program
    {
        public static double C;
        public static double F;

        static void Main(string[] args)
        {
            C = 35.0;
            F = C * 9.0 / 5.0 + 32;
            Console.WriteLine(F);
        }
    }
}

          จากโปรแกรม 1-3 ได้ประกาศตัวแปร C ให้มีค่าเป็น 35 และตัวแปร F  ให้เป็นตัวแปรแบบทศนิยม หลังจากนั้นในฟังก์ชัน Main() ได้ทำการคำนวณนิพจน์ทางด้านขวาดังนี้

C * 9.0/5.0+32

          จากนิพจน์จะได้ว่า โดยปกติแล้วหลักการทำงานของคอมพิวเตอร์จะทำภายใน ( ) ในสุดก่อน และถ้าพบเครื่องหมายดำเนินการจะแบ่งเป็น 3 กลุ่ม และทำตามลำดับก่อนหลังดังนี้

                    1. กลับค่า เช่น -A

                    2. การคูณ หาร

                    3. การบวก ลบ

          ถ้าเครื่องหมายลำดับเดียวกันจะทำจากซ้ายไปขวา ด้วยเหตุนี้จากนิพจน์ข้างตนจึงได้ลำดับของการคำนวณดังนี้

                    1. C*9.0 ซึ่งได้ผลลัพธ์เป็น 35*9.0 หรือ 315.0

                    2. ผลลัพธ์จาก 1 ถูกหารด้วย 5 ซึ่งได้ผลลัพธ์จาก 315.0/5เป็น 63.0

                    3. ผลลัพธ์จาก 2 นำมาบวกด้วย 35 ทำให้ได้ผลลัพธ์ของ 63.0+32 เป็น 95.0

          เมื่อทำครบทั้ง 3 ขั้นตอนจะนำผลลัพธ์ที่ได้จากขั้นตอนที่ 3 ไปเก็บไว้ในตัวแปรทางซ้ายมือ ทำให้ตัวแปร F เก็บค่า 95.0 เอาไว้ หลังจากนั้นนำค่าที่เก็บในตัวแปร F มาแสดงผลด้วยคำสั่ง WriteLine()

หมายเหตุ

          ในตัวอย่างโปรแกรม 1-3 ได้ประกาศตัวแปร F และ C โดยระบุคำ public static ไว้หน้าประเภทและชื่อตัวแปร โดยมีความหมายดังนี้

                    public หมายถึง ยินยอมให้เข้าถึงได้จากภายนอกคลาส

                    static   หมายถึง ให้สร้างตัวแปรนี้ในหน่วยความจำเมื่อมีการประกาศ

          ดังนั้น เมื่อพบคำสั่ง

                    public static double C;

          จึงมีความหมายว่า ให้ทำการสร้างตัวแปรชื่อ C ให้เป็นตัวแปรประเภททศนิยมที่ใช้พื้นที่ในการจัดเก็บ 8 ไบต์ หลังจากนั้นด้วยคำสั่ง static ทำให้ระบบทำการจองหน่วยความจำตามที่กำหนดเอาไว้ และกำหนดให้สามารถเข้าถึงได้จากนอกคลาส เป็นการสิ้นสุดการสั่งคำสั่ง

การสร้างเงื่อนไข

การสร้างเงื่อนไขใน C# มีรูปแบบการเขียนด้วยกัน 3 แบบ คือ

          1.รูปแบบแรกเป็นการตรวจสอบเงื่อนไข และถ้าเงื่อนไขเป็นจริงจะทำตามโค้ดที่เขียน ดังรูปแบบต่อไปนี้ โดยหลักการทำงานเป็นตามผังงานภาพที่ 1.3.4-1

               if (เงื่อนไข)

               {

                       สิ่งที่ทำเมื่อเงื่อนไขเป็นจริง1

                       สิ่งที่ทำเมื่อเงื่อนไขเป็นจริง2

                              …
                       สิ่งที่ทำเมื่อเงื่อนไขเป็นจริงn

               }

2. เป็นการตรวจสอบเงื่อนไข และถ้าเงื่อนไขเป็นจริงจะทำตามโค้ดที่เขียนไว้เพื่อรองรับ
การทำงานเมื่อไขเป้นจริง แต่ถ้าเงื่อนไขเป็นเท็จจะไปทำงานในส่วนที่อยู่ใน else โดยหลักการทำงานเป็นตามผังงานภาพที่ 1.3.4-2

               if (เงื่อนไข)

               {

                       สิ่งที่ทำเมื่อเงื่อนไขเป็นจริง

               }

               else

               {

                       สิ่งที่ทำเมื่อเงื่อนไขเป็นเท็จ

               }

          3. เป็นแบบซ้อนเงื่อนไข คือ ทำการตรวจสอบเงื่อนไขภายใต้ if ถ้าเป็นจริงจะทำตามที่เขียนโค้ดเพื่อตอบสนองกรณีที่ if เป็นจริง แต่ถ้าเป็นเท็จจะดำเนินการตรวจสอบเงื่อนไขที่อยู่หลัง else if ถัดไป ถ้าเงื่อนไขเป็นจริงจะทำคำสั่งภายใต้ else if นั้น แต่ถ้าเป็นเท็จจะข้ามไปตรวจสอบ else if ถัดไปเรื่อย ๆ จนไม่พบ else if จะไปทำใน else โดยหลักการทำงานเป็นตามผังงานภาพที่ 1.3.4-3

               if ( เงื่อนไข1 )

               {

                       สิ่งที่ทำเมื่อเงื่อนไข1เป็นจริง

               }

               else if ( เงื่อนไข2 )

               {

                       สิ่งที่ทำเมื่อเงื่อนไข2เป็นจริง

               }

               …

               else if ( เงื่อนไขn )

               {

                       สิ่งที่ทำเมื่อเงื่อนไขnเป็นจริง

               }

               else

               {

                       สิ่งที่ทำเมื่อเงื่อนไขเป็นเท็จ

               }

          เครื่องหมายดำเนินการด้านการเปรียบเทียบเป็นดังตาราง 1-6 โดยผลลัพธ์ที่ได้จากการเปรียบเทียบเป็นจริงหรือเท็จ (True/False)

          ตัวอย่างโปรแกรม 1-4 เป็นการกำหนดให้ตัวแปร x มีค่าเป็น 10 หลังจากนั้นตรวจสอบค่าที่เก็บในตัวแปร x ว่าเป็น 0 หรือไม่ ถ้าใช่จะแสดงคำว่า x == 0 แต่ถ้าไม่ใช่จะแสดง x !=0

โปรแกรม 1-4 ตัวอย่างการตรวจสอบค่าตัวแปร x มีค่าเป็น 0 หรือไม่

using System;
namespace if_else
{
    class Program
    {
        static void Main(string[] args)
        {
            double x = 10.0;


            if (x == 0.0)
            {
                Console.WriteLine(" x == 0 ");
            }
            else
            {
                Console.WriteLine(" x != 0 ");
            }
        }
    }
}

          ตัวอย่างโปรแกรม 1-5 เป็นการตรวจสอบระดับของผู้เล่นจากค่าที่เก็บในตัวแปร score โดยเงื่อนไขกำหนดไว้ดังนี้

                    1. ถ้าค่าน้อยกว่า 10 เป็น Level 0

                    2. ถ้ามีค่าเป็น 10 ถึง 19 เป็น Level 1

                    3. ถ้ามีค่าเป็น 20 ถึง 29 เป็น Level 2

                    4. ถ้ามีค่าเป็น 30 ถึง  39 เป็น Level 3

                    5. กรณีอื่น ๆ เป็น Level 4

          สำหรับกรณีของการเปรียบเทียบความเท่ากันของตัวเลขทศนิยมจะมีปัญหาในบางกรณีตามรูปแบบขชองการใช้เลขทศนิยมแบบ IEEE 754 (The IEEE Standard for Floating-Point Arithmetic)
ดังเช่นโค้ดต่อไปนี้จะพบว่าค่าไม่เท่ากันทั้งที่ควรจะเท่ากัน

		        float a = 0.1f;
            		float b = 0.2f;
            		Console.WriteLine("a = ", a);
            		Console.WriteLine("b = ", b);
            		Console.WriteLine("a+b = ", (a+b));
            		if ((a+b) == 0.3)
            		{
                		Console.WriteLine("0.3");
            		}
            		else
            		{
                		Console.WriteLine("???");
            		}

          วิธีการแก้ปัญหาคือ ใช้หลักของการหาความแตกต่างของค่า 2 ค่า ถ้าน้อยกว่าค่าที่กำหนด (epsilon) จะถือว่าเป็นค่าเดียวกัน แต่ถ้ามากกว่าหรือเท่ากันกับค่าดังกล่าวจะถือว่าเป็นตัวเลขทศนิยมทั้ง 2 ค่านั้นไม่เท่ากัน ดังตัวอย่างโปรแกรม 1-6

โปรแกรม 1-5 แสดงระดับของผู้เล่นจากตัวแปร score

using System;
namespace level_if
{
    class Program
    {
        public static float score;
        static void Main(string[] args)
        {
            score = 35.0f;
            if (score <10) {
                Console.WriteLine("Level 0");
            } else if (score < 20) {
                Console.WriteLine("Level 1");
            } else if (score < 30) {
                Console.WriteLine("Level 2");
            } else if (score < 40) {
                Console.WriteLine("Level 3");
            } else {
                Console.WriteLine("Level 4");
            }
        }
    }
}

โปรแกรม 1-6 การเปรียบเทียบค่าทศนิยม

using System;
namespace err_float2
{
    class Program
    {
        const float epsilon = 0.000001f;
        static void Main(string[] args)
        {
            float a = 0.1f;
            float b = 0.2f;
            float c = a + b;
            Console.WriteLine("a = ", a);
            Console.WriteLine("b = ", b);
            Console.WriteLine("a+b = ", (a + b));
            if ((c - 0.3) < epsilon)
                Console.WriteLine("0.3");

            else
                Console.WriteLine("???");
        }
    }
}

การทำซ้ำ

การวนรอบหรือทำซ้ำ (repetition) ใน C# เป็นการใช้ชุดคำสั่งเพื่อให้เกิดการทำซ้ำภายใต้เงื่อนไข เช่น ทำถ้าเป็นจริง และทำเรื่อย ๆ จนกว่าเงื่อนไขที่ตรวจสอบจะเป็นเท็จ หรือ ทำเมื่ออยู่ในช่วงที่กำหนด เป็นต้น

             while (เงื่อนไข) {

                    สิ่งที่ทำ1

                           …

                    สิ่งที่ทำn

             }

ในรูปแบบนี้เป็นการทำซ้ำเมื่อเงื่อนไขเป็นจริง และเมื่อทำในสิ่งที่กำหนดให้ทำจนเสร็จสิ้นจะกลับไปตรวจสอบเงื่อนไขอีกครั้ง ถ้าเงื่อนไขยังคงเป็นจริงจะทำต่อไปตราบจนได้ผลของเงื่อนไขเป็นเท็จจึงออกจากการทำซ้ำ เช่น การแสดงข้อมูล  0, 3, 6, 9 และ 12 สามารถเขียนได้ดังส่วนของโปรแกรมในโปรแกรม 1-7

โปรแกรม 1-7 การวนซ้ำแบบ while

using System;
namespace loop_while
{
    class Program
    {
        static Int32 x;
        static void Main(string[] args)
        {
            x = 0;
            while (x <= 12)
            {
                Console.WriteLine(x);
                x = x + 3;
            }
        }
    }
}

กรณีที่ต้องการวนรอบโดยไม่ต้องตรวจสอบเงื่อนไข แต่เป็นการทำซ้ำที่เกิดจากการตรวจสอบค่าจากตัวแปรว่าอยู่ในช่วงค่าที่กำหนดหรือไม่จะใช้รูปแบบคำสั่งทำซ้ำเป็นดังนี้

             for ( ค่าเริ่ม; เงื่อนไข; สิ่งที่ก่อนเริ่มรอบใหม่ ) {

                    สิ่งที่ทำ1

                           …

                    สิ่งที่ทำn

             }

          จากรูปแบบของคำสั่ง for สามารถเขียนขั้นตอนของการทำงานได้ดังนี้

                    1. ทำส่วนของค่าเริ่ม

                    2. ตรวจสอบเงื่อนไข ถ้าเงื่อนไขเป็นจริงจะทำ สิ่งที่ทำ1 ไปจนถึง สิ่งที่ทำn

                              แต่ถ้าเงื่อนไขเป็นเท็จจะข้ามการทำงานของคำสั่ง for

                    3. หลังจากทำสิ่งที่ทำn จะเข้าไปทำ สิ่งที่ก่อนเริ่มรอบใหม่

                    4. กลับไป 2

          เมื่อนำโปรแกรมตัวอย่าง 1-7 มาเขียนในรูปแบบของ for จะเขียนได้ดังโปรแกรมตัวอย่าง 1-8

โปรแกรม 1-8 การวนซ้ำแบบ for

using System;
namespace loop_for
{
    class Program
    {
        static Int32 x;
        static void Main(string[] args)
        {
            for (x=0; x <= 12; x+=3)
            {
                Console.WriteLine(x);
            }
        }
    }
}

          และสำหรับการวนรอบหรือทำซ้ำโดยทำก่อน 1 รอบ หลังจากนั้นทำการตรวจสอบเงื่อนไข และถ้าเงื่อนไขเป็นจริงจะดำเนินการทำซ้ำอีกครั้งตราบเท่าที่เงื่อนไขนั้นเป้นจริง โดยรูปแบบของการใช้คำสั่งเป็นดังนี้

             do {

                    สิ่งที่ทำ1

                           …

                    สิ่งที่ทำn

             } while (เงื่อนไข);

          นอกจากการทำซ้ำยังมีคำสั่งสำหรับออกจากการทำซ้ำ คือ break และคำสั่งสำหรับให้กลับไปตรวจสอบเงื่อนหลัง while โดยให้ข้ามคำสั่งถัดไป คือ continue

แถวลำดับของข้อมูล

          แถวลำดับ (Array) เป็นโครงสร้างข้อมูลประเภทหนึ่งที่เกิดจากการจองข้อมูลประเภทเดียวกันเป็นจำนวน n ชุด ทำให้ข้อมูลอยู่ต่อเรียงกันไปเป็นลำดับที่ 0 ถึง n-1 อันทำให้สะดวกต่อการบริหารจัดการกับตัวแปร เช่น ต้องการสร้างตัวแปรเก็บพิกัดค่า x จำนวน 5 ชุด จะต้องสร้างตัวแปร 5 ตัว แต่ถ้าเป็นแถวลำดับจะใช้ตัวแปรตัวเดียว แต่อ้างอิงลำดับของข้อมูลเป็นข้อมูลลำดับที่ 0, 1, 2 ,3 และ 4 เป็นต้น

          การสร้างตัวแปรประเภทแถวลำดับมีรูปแบบของการสร้างดังนี้

             ชนิดตัวแปร[] ชื่อตัวแปร;

          การกำหนดค่าให้กับแถวลำดับมีรูปแบบการสั่งงานดังนี้

             ชนิดตัวแปร[] ชื่อตัวแปร;

          สำหรับการประกาศตัวแปรพร้อมกับการระบุสมาชิกภายในแถวลำดับสามารถใช้งานตามรูปแบบดังต่อไปนี้

             ชนิดตัวแปร[] ชื่อตัวแปร = new ชนิดตัวแปร[จำนวนสมาชิก];

             ชนิดตัวแปร[จำนวนสมาชิก] ชื่อตัวแปร = {

                           ข้อมูล0, ข้อมูล1, ข้อมูล2, …, ข้อมูลจำนวนสมาชิก-1

             };

          ตัวอย่างการประยุกต์ใช้แถวลำดดับเพื่อเก็บค่าสถานะของตัวละคร เช่น ความแข็งแกร่ง  (ST: Strength) ความแม่นยำ (AC: Accuracy) ความคล่องแคล่วว่องไว (DX: Dexterity) ความอดทน (RS: Resistance) แต้มชีวิต (HP: Hit Points) แต้มพลังเวทย์มนต์ (MP: Magic Points) และค่าประสบการณ์ ( EX: Experience ) โดยให้สมาชิกแต่ละตัวเก็บเป็นตัวเลขจำนวนเต็ม และค่าสูงสุดไม่เกิน 4000 พร้อมจัดเก็บแบบเรียงกันไปเป็นลำดับ 0,1,2,3,4 และ 5 สามารถเขียนได้ดังนี้

             UIint16 [7] actor_stat;

          การเข้าถึงสมาชิกของแถวลำดับจะต้องระบุตำแหน่งลำดับของสมาชิกนั้นดังรูปแบบการใช้งานด้านล่างนี้ โดยสมาชิกตัวแรกเป็นลำดับที่ 0 และลำดับสุดท้ายจะเท่ากับจำนวนสมาชิกลบด้วย 1

           ชื่อตัวแปร[ ลำดับ ] = ค่า

          สำหรับการอ้างอิงถึงค่าของข้อมูลในแถวลำดับให้ทำตามรูปแบบต่อไปนี้

                    ชื่อตัวแปร[ ลำดับ ]

          การตรวจสอบจำนวนสมาชิกภายใแถวลำดับสามารถใช้คำสั่ง Length เพื่ออ่านค่าออกมาตามรูปแบบการใช้งานดังนี้

             ชื่อตัวแปร.Length

          กรณีที่กำหนดค่าของแต่ละคุณสมบัติให้มีค่าเรียงกันไปดังนี้ 5, 4, 5, 5, 10, 10 และ 0 หลังจากนั้นเขียนโปรแกรมเพื่อวนรอบเพื่อแสดงข้อมูลแต่ละรายการสามารถเขียนได้ดังตัวอย่างโรแกรม 1-9 และได้ผลลัพธ์ดังภาพที่ 1-3

โปรแกรม 1-9 แถวลำดับเก็บสถานะของตัวละคร

using System;
namespace array1
{
    class Program
    {
        static UInt16[] actor_stat;
        static void Main(string[] args)
        {
            actor_stat = new ushort[7];
            String[] stat_info = {"ST","AC","DX","RS","HP","MP","EX"};
            actor_stat[0] = 5; // ST
            actor_stat[1] = 4; // AC
            actor_stat[2] = 5; // DX
            actor_stat[3] = 5; // RS
            actor_stat[4] = 10; // HP
            actor_stat[5] = 10; // MP
            actor_stat[6] = 0; // EX
            for (int idx=0; idx<actor_stat.Length; idx++)
            {
                Console.WriteLine(stat_info[idx].ToString() +
                                  "="+ actor_stat[idx].ToString());
            }
        }
    }
}
หมายเหตุ             การแปลงข้อมูลตัวเลขให้เป็นข้อความมีรูปแบบการใช้งานดังนี้               
ข้อมูลตัวอักษร = ตัวแปร.ToString()  

โปรแกรมย่อย

          โปรแกรมย่อย หรือ ฟังก์ชัน (function) หรือ เมธอด (method) เป็นการสร้างกลุ่มของคำสั่งเพื่อนำกลับมาใช้ในภายหลัง อันจะพบว่า ในโค้ดโปรแกรมที่ได้ศึกษามาในตัวอย่างก่อนหน้านี้มีฟังก์ชันหรือโปรแกรมย่อยชื่อ Main() ซึ่งเป็นโปรแกรมย่อยที่ไม่มีการคืนค่ากลับพร้อมทั้งไม่ต้องการพารามิเตอร์ และเป็นฟังก์ชันที่ถูกกำหนดให้เป็นฟังก์ชันแรกที่ถูกเรียกใช้เมื่อโปรแกรมเริ่มทำงาน โดยประเภทของโปรแกรมย่อยแบ่งเป็นหลายประเภท ได้แก่

                    1. โปรแกรมย่อยที่ไม่คืนค่าและไม่ต้องการพารามิเตอร์

                    2. โปรแกรมย่อยที่ไม่คืนค่าแต่ต้องการพารามิเตอร์

                    3. โปรแกรมย่อยที่คืนค่าแต่ไม่ต้องการพารามิเตอร์

                    4. โปรแกรมย่อยที่คืนค่าและต้องการพารามิเตอร์

โปรแกรมย่อยที่ไม่คินค่าและไม่ต้องการพารามิเตอร์

          โปรแกรมย่อยประเภทนี้ไม่ต้องการข้อมูลนำเข้าและไม่คืนค่ากลับ โดยโครงสร้างของโปรแกรมย่อยแบบนี้เป็นดังนี้

       void ชื่อโปรแกรมย่อย( )

       {

               คำสั่ง1;

               คำสั่ง2;

               …

               คำสั่งn;

       }

          ตัวอย่างการเขียนโปรแกรมย่อยเพื่อแสดงข้อความ “Hello” สามารถเขียนได้ดังนี้

             void say_hello() {

                    Console.WriteLine( “Helo” );

             }

โปรแกรมย่อยที่ไม่คืนค่าแต่ต้องการพารามิเตอร์

          โปรแกรมย่อยประเภทนี้ต้องการข้อมูลนำเข้าแต่ไม่คืนค่ากลับ ซึ่งข้อมูลนำเข้าเหล่านี้ถูกมองเสมือนเป็นตัวแปรภายในของโปรแกรมย่อยทำให้สามารถนำค่ามาใช้หรือเปลี่ยนแปลงค่าได้ตามความต้องการ โดยโครงสร้างของโปรแกรมย่อยแบบนี้เป็นดังนี้

       void ชื่อโปรแกรมย่อย( ประเภทข้อมูล1 ข้อมูล1

                                 ประเภทข้อมูล2 ข้อมูล2,

                                 …,

                                 ประเภทข้อมูลn ข้อมูลn )

       {

               คำสั่ง1;

               คำสั่ง2;

               …

               คำสั่งn;

       }

          ตัวอย่างโปรแกรมย่อยแสดงผลการบวกระหว่างตัวแปร x และ y ที่เป็น float สามารถเขียนได้ดังนี้

             void show_add( float x, float y ) {

                    Console.WriteLine( x + y );

             }

โปรแกรมย่อยที่คืนค่าแต่ไม่ต้องการพารามิเตอร์

          โปรแกรมย่อยประเภทนี้ไม่ต้องการข้อมูลนำเข้า แต่มีการคืนค่ากลับหลังจากการทำงานเสร็จ เพื่อเปิดโอกาสให้ผู้ใช้งานโปรแกรมย่อยสามารถนำค่าคืนค่ากลับนี้ไปใช้ในการตรวสอบหรือนำไปเก็บในตัวแปรเพื่อนำไปใช้งานต่อไป โดยโครงสร้างของโปรแกรมย่อยแบบนี้เป็นดังนี้

       ประเภทข้อมูล ชื่อโปรแกรมย่อย( )

       {

               คำสั่ง1;

               คำสั่ง2;

               …

               คำสั่งn;

             return ค่าคืนกลับ;

       }

          ตัวอย่างโปรแกรมการส่งค่าคืนกลับเป็นค่า Pi หารด้วย 180 สามารถเขียนได้ดังนี้

		float pi_over_180() {
			return ( 3.1415296f/180.0f );
		}

โปรแกรมย่อยที่คืนค่าและต้องการพารามิเตอร์

          โปรแกรมย่อยประเภทนี้ต้องการข้อมูลนำเข้า และคืนค่ากลับ ซึ่งข้อมูลนำเข้าเหล่านี้ถูกมองเสมือนเป็นตัวแปรภายในของโปรแกรมย่อยทำให้สามารถนำค่ามาใช้หรือเปลี่ยนแปลงค่าได้ตามความต้องการ พร้อมทั้งเมื่อทำงานเสร็จจะคืนค่ากลับไปให้ระบบ หรือนำไปเก็บในตัวแปรเพื่อเก็บผลลัพธ์ของการทำงานจากโปรแกรมย่อยนี้ต่อไป โดยโครงสร้างของโปรแกรมย่อยแบบนี้เป็นดังนี้

       ประเภทข้อมูล ชื่อโปรแกรมย่อย(      ประเภทข้อมูล1 ข้อมูล1

                                               ประเภทข้อมูล2 ข้อมูล2,

                                               …,

                                               ประเภทข้อมูลn ข้อมูลn )

       {

               คำสั่ง1;

               คำสั่ง2;

               …

               คำสั่งn;

             return ค่าคืนกลับ;

       }

          ตัวอย่างโปรแกรมย่อยแปลงค่ามุมแบบองศาให้เป็นเรเดียนเขียนได้ดังนี้

		float degree_to_radian( float degree ) {
			return degree * (180.0f/3.1415926f);
		}

สรุป

จากบทความนี้จะพบว่าโครงสร้างการเขียนโปรแกรม C# โดยพื้นฐานมีความคล้ายกับการเขียนภาษา C/C++/Java/Kotlin คือ มีการประกาศประเภทของข้อมูล การตั้งชื่อ การดำเนินการแบบนิพจน์ การตรวจสอบเงื่อนไข การทำซ้ำ ข้อมูลแบบแถวลำดับ และโปรแกรมย่อย ทำให้เมื่อเข้าใจภาษาใดภาษาหนึ่งจักทำให้สามารถนำไปประยุกต์กับภาษาอื่น ๆ ได้ ในครั้งหน้าจะเป็นเนื้อหาของการใช้ C# ใน Godot Mono และขอให้สนุกกับการเขียนโปรแกรมครับ

(C) 2020-2023, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ

ปรับปรุงเมื่อ 2023-07-14, 2024-04-06