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

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

โครงสร้าง if หลายชั้น
ในบางโปรแกรม เราจำเป็นต้องเขียนโครงสร้าง if (หรือ if...else) ซ้อนไว้ภายใต้โครงสร้าง
ของคำสั่ง if อีกอันหนึ่ง โดยเฉพาะอย่างยิ่งโปรแกรมที่ต้องตรวจสอบเงื่อนไขมากกว่าสองเงื่อนไข ซึ่งมี
รูปแบบการใช้งานโดยทั่วไปดังนี้

if (condition1)
  statement1;
else if (condition2)
  statement2;
else if (condition3)
  statement3;
:
else
  statementN;

         จากรูปแบบด้านบน statement1 จะถูกเรียกทำงานเมื่อเงื่อนไข condition1 เป็นจริง ลอง
พิจารณา statement2 จะเห็นว่ามันถูกควบคุมด้วยเงื่อนไข condition2 และยังอยู่ภายใต้ else
ของโครงสร้าง if อันบนสุด จึงทำให้ statement2 นี้ถูกเรียกทำงานเมื่อเงื่อนไข condition2 เป็น
จริงและเงื่อนไข condition1 เป็นเท็จเท่านั้น ในทำนองเดียวกัน คำสั่ง condition3 จะถูกเรียก
ทำงานเมื่อเงื่อนไข condition1 และ condition2 ทั้งคู่เป็นเท็จ และเงื่อนไข condition3 เป็น
จริงเท่านั้น และสุดท้ายคือ statementN ซึ่งจะถูกเรียกทำงานเมื่อเงื่อนไขทั้งหมดข้างต้นเป็นเท็จ

ตัวอย่างที่ 3.4 พิจารณากระบวนการตัดเกรดนักเรียนโดยพิจารณาจากคะแนนสอบไล่ที่ได้ตามตาราง

เงื่อนไข
ระดับคะแนน
ได้คะแนนน้อยกว่า 50
F
ได้คะแนนตั้งแต่ 50 แต่น้อยกว่า 60
D
ได้คะแนนตั้งแต่ 60 แต่น้อยกว่า 70
C
ได้คะแนนตั้งแต่ 70 แต่น้อยกว่า 80
B
ได้คะแนนตั้งแต่ 80 ขึ้นไป
A

เราสามารถเขียนโปรแกรมเพื่อทำงานดังกล่าวโดยใช้โครงสร้าง if หลายชั้นดังนี้

if (point < 50)
    Console.WriteLine("Grade F");
else if (point < 60)
    Console.WriteLine("Grade D");
else if (point < 70)
    Console.WriteLine("Grade C");
else if (point < 80)
    Console.WriteLine("Grade B");
else
    Console.WriteLine("Grade A");

โครงสร้าง switch...case

         ถึงแม้ว่าการจัดการเงื่อนไขหลาย ๆ เงื่อนไขในคราวเดียวกันจะสามารถทำได้โดยอาศัยโครงสร้าง
if แบบหลายชั้น ภาษา C# ยังได้เตรียมโครงสร้าง switch...case เพื่อใช้ในการจัดการเงื่อนไขหลาย

เงื่อนไขโดยเฉพาะ การใช้งานโครงสร้าง switch...case อยู่ในรูปแบบดังนี้

switch (expression)
{
   case constant-expression-1:
      statements;
      break;
   case constant-expression-2:
      statements;
      break;
   case constant-expression-3:
      statements;
      break;
   :
   default:
      statements;
      break;
}

            ภาษา C# ยอมให้นิพจน์ที่ใช้ในตำแหน่ง expression เป็นนิพจน์แบบจำนวนเต็ม (integer)
แบบอักขระ (char) หรือแบบข้อความ (string) เท่านั้น หลังจากที่ค่าของ expression ถูกตรวจสอบ
โปรแกรมจะกระโดดไปทำงาน ณ คำสั่ง case ที่ระบุค่าของ constant-expression ไว้ตรงกับค่า
ของ expression ที่ประเมินได้ คำสั่งต่าง ๆ ที่อยู่ถัดจากคำสั่ง case นั้น ๆ จะถูกเรียกใช้งานตามลำดับ
ไปเรื่อย ๆ จนกว่าโปรแกรมจะพบคำสั่ง break ซึ่งมีผลทำให้โปรแกรมหยุดการทำงานภายในโครงสร้าง
switch...case นั้นและกระโดดไปยังคำสั่งที่ต่อไปนอกโครงสร้าง หากไม่พบ constantexpression
ใดที่มีค่าตรงกับ expression โปรแกรมจะกระโดดไปยังจุดที่มีการระบุด้วยคำสั่ง default

ตัวอย่างที่ 3.5 โปรแกรมต่อไปนี้แสดงแต้มคะแนนตามระดับคะแนน (A,B,C,D,F) ที่ป้อนโดยผู้ใช้

ระดับคะแนน (grade)
แต้มระดับคะแนน (grade point)
A
4.0
B
3.0
C
2.0
D
1.0
F
0.0

using System;
class GradePoint {
  static void Main() {
    string grade;
    Console.Write("Please input your grade: ");
    grade = Console.ReadLine();
    switch (grade) {
      case "A" : Console.WriteLine("Your point is 4.0."); break;
      case "a" : Console.WriteLine("Your point is 4.0."); break;
      case "B" : Console.WriteLine("Your point is 3.0."); break;
      case "b" : Console.WriteLine("Your point is 3.0."); break;
      case "C" : Console.WriteLine("Your point is 2.0."); break;
      case "c" : Console.WriteLine("Your point is 2.0."); break;
      case "D" : Console.WriteLine("Your point is 1.0."); break;
      case "d" : Console.WriteLine("Your point is 1.0."); break;
      case "F" : Console.WriteLine("Your point is 0.0."); break;
      case "f" : Console.WriteLine("Your point is 0.0."); break;
      default: Console.WriteLine("Invalid input!!"); break;
    }
  }
}

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

Please input your grade: A
Your point is 4.0.

Please input your grade: B
Your point is 3.0.


Please input your grade: e
Invalid input!!

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

using System;
class GradePoint {
  static void Main() {
    string grade;
    Console.Write("Please input your grade: ");
    grade = Console.ReadLine();
    switch (grade) {
      case "A" :
      case "a" : Console.WriteLine("Your point is 4.0."); break;
      case "B" :
      case "b" : Console.WriteLine("Your point is 3.0."); break;
      case "C" :
      case "c" : Console.WriteLine("Your point is 2.0."); break;
      case "D" :
      case "d" : Console.WriteLine("Your point is 1.0."); break;
      case "F" :
      case "f" : Console.WriteLine("Your point is 0.0."); break;
      default: Console.WriteLine("Invalid input!!"); break;
    }
  }
}

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

using System;
class GradePoint {
  static void Main() {
    string grade;
    double point = -1;
    Console.Write("Please input your grade: ");
    grade = Console.ReadLine();
    switch (grade) {
      case "A" : case "a" : point = 4.0; break;
      case "B" : case "b" : point = 3.0; break;
      case "C" : case "c" : point = 2.0; break;
      case "D" : case "d" : point = 1.0; break;
      case "F" : case "f" : point = 0.0; break;
      default: Console.WriteLine("Invalid input!!"); break;
    }
    if (point >= 0)
       Console.WriteLine("Your point is {0:f1}.", point);
  }
}

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

1:  using System;
2:  class Calculator {
3:     static void Main() {
4:        double n1, n2, ans = 0;
5:        char op;
6:        Console.Write("Enter the first number: ");
7:        n1 = double.Parse(Console.ReadLine());
8:        Console.Write("Enter the second number: ");
9:        n2 = double.Parse(Console.ReadLine());
10:       Console.Write("Enter the operator: ");
11:       op = char.Parse(Console.ReadLine());
12:       switch(op) {
13:         case '+': ans = n1+n2; break;
14:         case '-': ans = n1-n2; break;
15:         default: op = ' '; break;
16:       } 
17:       if (op == ' ')
18:         Console.WriteLine("Invalid operator!");
19:       else
20:         Console.WriteLine("{0}{1}{2} = {3}", n1, op, n2, ans);
21:     }
22:  }

          สังเกตบรรทัดที่ 15 ซึ่งใช้จัดการกรณีที่ผู้ใช้ป้อนตัวดำเนินการอื่นนอกเหนือจาก + หรือ - บรรทัดนี้
จะเปลี่ยนค่าของตัวแปร op ให้เป็นช่องว่าง (' ') เพื่อนำไปเช็คที่ท้ายโปรแกรมอีกทีหนึ่ง

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

Enter the first number: 8
Enter the second number: 10
Enter the operator: +
8+10 = 18

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

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