วันศุกร์ที่ 6 กันยายน พ.ศ. 2556

ใบความรู้ 8 การเขียนโปรแกรมด้วยภาษา C#

การส่งค่าไปยังเมท็อด

          เราสามารถสร้างเมท็อดที่มีการรับค่าจากผู้เรียกเพื่อกำหนดพฤติกรรมการทำงานของเมท็อดนั้น ๆ
ค่าที่ถูกส่งไปนี้เรียกว่า อาร์กิวเมนต์ (argument) ส่วนเมท็อดที่ถูกเรียกจะรับค่าเหล่านี้ผ่านมาทางพารามิเตอร์ (parameter) ซึ่งถูกนิยามไว้ในส่วน parameter_list ของการประกาศเมท็อด (ลองย้อนกลับไปดู
รูปแบบการประกาศเมท็อดข้างต้น) เมท็อดแต่ละอันสามารถถูกประกาศให้มีพารามิเตอร์ได้ตั้งแต่ศูนย์ตัว
หรือมากกว่า โดยพารามิเตอร์แต่ละตัวจะต้องมีรูปแบบข้อมูลกำกับไว้เสมอ และอาร์กิวเมนต์ที่ใช้ในขณะ
เรียกใช้งานเมท็อดจะต้องมีรูปแบบข้อมูลที่ตรงกัน

ตัวอย่างที่ 5.2 เมท็อด PrintCharLine ด้านล่างนี้ดัดแปลงมาจากเมท็อด PrintLine เมท็อดใหม่นี้
กำหนดให้มีพารามิเตอร์สองตัว คือ c เป็นชนิด char และ len เป็นชนิด int โดยที่พารามิเตอร์ c ใช้
สำหรับระบุอักขระที่จะพิมพ์ออกทางจอภาพ ) ไม่ได้พิมพ์เพียงแค่ดาวอีกต่อไป (และ len ใช้ระบุจำนวน
อักขระที่ต้องการพิมพ์ในหนึ่งบรรทัด
1: using System;
2: class ParamNoRet {
3:   static void PrintCharLine(char c, int len) {
4:     for (int i = 0; i < len; i++)
5:       Console.Write(c);
6:     Console.WriteLine();
7:   }
8:
9:   static void Main() {
10:    PrintCharLine(’o’, 10);
11:    PrintCharLine(’x’, 20);
12:  }
13: }

          จากโปรแกรมข้างต้น การเรียกใช้เมท็อด PrintCharLine ครั้งแรกภายในเมท็อด Main ใน
บรรทัดที่ 10 มีอาร์กิวเมนต์เป็น 'o' และ 10 ซึ่งเมท็อด PrintCharLine จะรับค่าอาร์กิวเมนต์นี้เข้ามา
อยู่ในพารามิเตอร์ c และ len ตามลำดับ ดังนั้นจะเห็นว่าบรรทัดที่ 4 และ 5 จะมีผลทำให้โปรแกรมพิมพ์
อักขระ o ออกทางหน้าจอเป็นจำนวน 10 ตัว ในทำนองเดียวกัน การเรียกใช้เมท็อด PrintCharLine
ในบรรทัดที่ 11 จะมีผลทำให้โปรแกรมพิมพ์อักขระ x ออกทางหน้าจอเป็นจำนวน 20 ตัว
เมท็อดแบบคืนค่า
         เมท็อดแบบคืนค่าเป็นเมท็อดที่ส่งผลลัพธ์กลับไปให้ยังผู้เรียกหลังจากการทำงานในเมท็อดเสร็จสิ้นลงตัวอย่างที่เราคุ้นเคยดีอยู่แล้วคือเมท็อด Console.ReadLine ซึ่งทำหน้าที่รอรับข้อมูลจากผู้ใช้และ
คืนค่าที่ผู้ใช้ป้อนในรูปของข้อความเพื่อให้โปรแกรมนำไปใช้ต่อไป หรือเมท็อด int.Parse ที่มีการรับ
ค่าพารามิเตอร์ในรูปข้อความและคืนค่ากลับออกมาเป็นตัวเลขที่สามารถนำไปใช้ในการคำนวณต่อไปได้
ดังนั้นโดยทั่วไปแล้วเมท็อดประเภทนี้จะปรากฏอยู่ในโปรแกรมในรูปของนิพจน์ชนิดต่าง ๆ ขึ้นอยู่กับชนิด
ของข้อมูลที่เมท็อดนั้น ๆ คืนกลับมาให้ อย่างไรก็ตามเราสามารถเรียกใช้เมท็อดเหล่านี้เป็นคำสั่งโดด ๆ ได้เช่นเดียวกับเมท็อดที่ไม่คืนค่าหากเราไม่ต้องการนำค่าที่คืนกลับมาไปประมวลผลใด ๆ

         การสร้างเมท็อดแบบคืนค่าขึ้นมาเองนั้นต้องระบุชนิดของข้อมูลที่เมท็อดจะส่งกลับเอาไว้ในส่วนที่
เป็นreturn_type ของการประกาศเมท็อดนั้น ๆ แทนที่จะใช้คีย์เวิร์ด void เหมือนที่เคยใช้กับเมท็อด
แบบไม่คืนค่า และภายในตัวเมท็อดเองจะต้องมีการใช้คำสั่ง return เพื่อให้เมท็อดสิ้นสุดการทำงาน
ทันทีและส่งค่ากลับไปยังผู้เรียก รูปแบบการใช้งานคำสั่ง return เป็นดังนี้
return expression;

โดยแทนที่ expression ด้วยนิพจน์ที่จะถูกประเมินเป็นค่าที่ต้องการส่งกลับ
          เมท็อดแบบคืนค่านิยมใช้ในกรณีที่ต้องการแจ้งให้ผู้เรียกใช้งานเมท็อดทราบถึงสถานะการทำงาน
ในเมท็อดเองว่าทำงานได้เสร็จสมบูรณ์หรือผิดพลาดอย่างไรโดยรายงานอยู่ในรูปของค่าความจริง true
หรือ false หรือหากความผิดพลาดสามารถเกิดขึ้นได้ในหลายกรณีแล้วเมท็อดนั้น ๆ สามารถรายงาน
ความผิดพลาดกลับไปได้ในรูปของรหัสความผิดพลาดที่กำหนดขึ้นมาเอง (เช่น ค่า 0 หมายถึงทำงานถูกต้องสมบูรณ์ 1 หมายถึงผู้ใช้ป้อนข้อมูลผิด หรือ 2 หมายถึงผู้ใช้ยกเลิกการทำงาน เป็นต้น)
          อีกกรณีหนึ่งที่เมท็อดแบบคืนค่าถูกนำมาใช้มากคือการนิยามฟังก์ชัน (function) ทางคณิตศาสตร์
ขึ้นมาเองเพื่อชดเชยจากส่วนที่ขาดไปในคลาส Math อีกทั้งยังใช้ในการสร้างฟังก์ชันเพื่อคำนวณที่ซับซ้อนเพื่อซ่อนความซับซ้อนนั้นไม่ให้ปรากฏในส่วนของโปรแกรมหลักดังเช่นตัวอย่างต่อไปนี้

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

1:  using System;
2:  class Triangle {
3:    static double TriangleArea(double w, double h) {
4:      double area = w*h/2.0;
5:      return area;
6:    }
7:
8:    static void Main() {
9:      Console.Write("Enter width: ");
10:     double width = double.Parse(Console.ReadLine());
11:     Console.Write("Enter height: ");
12:     double height = double.Parse(Console.ReadLine());
13:     Console.WriteLine("The area of the triangle is {0:f2}.",
14:       TriangleArea(width, height));
15:   }
16: }


          สังเกตว่าเนื่องจากเมท็อด TriangleArea ถูกประกาศให้คืนค่าเป็นชนิด double ในบรรทัด
ที่ 3ดังนั้นการเรียกใช้เมท็อดนี้จึงอยู่ในรูปของนิพจน์แบบ double ทำให้สามารถใช้งานร่วมกับเมท็อด
Console.WriteLine ในบรรทัดที่ 13-14 ได้ทันที

ตัวอย่างที่ 5.4 ตัวอย่างนี้แสดงการนิยามฟังก์ชัน



          ให้อยู่ในรูปของเมท็อดที่ถูกเรียกใช้จากเมท็อด Main เพื่อแสดงตารางค่าของ f (n) สำหรับแต่ละค่าของ n ตั้งแต่ 1 ถึง 15

1:  using System;
2:  class Function {
3:    static double f(int n) {
4:       double sum = 0.0;
5:       for (int i = 1; i <= n; i++)
6:          sum += Math.Sqrt(i);
7:
8:       return sum;
9:    }
10:
11:   static void Main() {
12:      Console.WriteLine(" n | f(n)");
13:      Console.WriteLine("---+------");
14:      for (int n = 1; n <= 15; n++) {
15:         Console.WriteLine("{0,2} | {1:f3}", n, f(n));
16:      }
17:   }
18: }

ตัวอย่างผลการทำงาน

 n | f(n)
---+------
 1 | 1.000
 2 | 2.414
 3 | 4.146
 4 | 6.146
 5 | 8.382
 6 | 10.832
 7 | 13.478
 8 | 16.306
 9 | 19.306
10 | 22.468
11 | 25.785
12 | 29.249
13 | 32.855
14 | 36.596
15 | 40.469


หมายเหตุ: สัญลักษณ์ {0,2} ที่ใช้ในคำสั่ง Console.WriteLine ในบรรทัดที่ 15 คือการกำหนดให้
ผลลัพธ์ในการพิมพ์ค่าในนิพจน์แรก (ซึ่งก็คือค่าในตัวแปร n) มีความยาวอย่างน้อยสองอักขระ เช่น หาก n
มีค่าเท่ากับ 3 ผลลัพธ์ที่พิมพ์ออกทางหน้าจอคือ ' 3' คือมีช่องว่างนำหน้าหนึ่งช่อง (ไม่รวมเครื่องหมาย
') ทำให้ผลลัพธ์โดยรวมมีความยาวสองอักขระ แต่ถ้า n มีค่าเท่ากับ 15 โปรแกรมจะแสดงผลลัพธ์ '15'
โดยไม่มีช่องว่างเนื่องจาก 15 มีความยาวสองอักขระอยู่แล้ว เหตุผลที่ต้องทำแบบนี้เพื่อให้เส้นตารางใน
ผลลัพธ์ดูสวยงาม ไม่เหลื่อมซ้อนกัน

ไม่มีความคิดเห็น:

แสดงความคิดเห็น