พื้นฐานปาสคาลพื้นฐาน rapidqเว็บภาษาไทยเว็บภาษาอังกฤษ

Case ... Of

โครงสร้าง case of เป็นโครงสร้างที่มักใช้กับ
โปรแกรมที่มีแขนงของการทำงาน หลายกรณี

ผมขอยกตัวอย่าง ด้วย if ก่อนนะครับ

หากผมต้องการแสดงผลเกรดวิชาภาษาอังกฤษ ของนักเรียนซึ่งมี 5 เกรดคือ
A B C D และ F
เมื่อป้อนคะแนนของนักเรียน.. ผมจะทำดังนี้ครับ
uses crt ;
var
      score : integer ;

begin
     clrscr ;
     write (' insert your Score= ') ; readln( score ) ;

    if ( score >= 80 ) and ( score <= 100 ) then
write ( 'your grade is A' ) ;
    if ( score >= 70 ) and (  score < 80 ) then
write ( 'your grade is B' ) ;
    if ( score >= 60 ) and (  score < 70 ) then
write ( 'your grade is C' ) ;
    if ( score >= 50 ) and (  score < 60 ) then
write ( 'your grade is D' ) ;
    if ( score >= 0  ) and  (  score < 50 ) then
write ( 'your grade is F' ) ;
    if ( score < 0  ) or  (  score > 100 ) then
write ( 'your score is incorrect' ) ;

readln ;
end.
insert your Score=
หากคะแนนมากกว่าหรือเท่ากับ 80 แต่ไม่เกิน 100 คุณได้ A
หากคะแนนมากกว่าหรือเท่ากับ 70 แต่น้อยกว่า 80 คุณได้ B
หากคะแนนมากกว่าหรือเท่ากับ 60 แต่น้อยกว่า 70 คุณได้ C
หากคะแนนมากกว่าหรือเท่ากับ 50 แต่น้อยกว่า 60 คุณได้ D
หากคะแนนมากกว่าหรือเท่ากับ 0 แต่น้อยกว่า 50 คุณได้ F ครับ


แต่ในกรณีเช่นนี้ ควรจะใช้ CASE OF มากกว่า เพราะโปรแกรม มีแขนงการทำงานหลายกรณี
uses crt ;
var
   score : integer ;

begin
     clrscr ;
     write (' insert your Score= ') ; readln( score ) ;

   case score of
    80..100  :  write ('your grade is A') ;
    70..79    :  write ('your grade is B') ;
    60..69    :  write ('your grade is C') ;
    50..59    :  write ('your grade is D') ;
    0 ..49     :  write ('your grade is F') ;
    end ;

readln ;
end.
insert your Score=
หากคะแนนอยู่ระหว่าง 80 ถึง 100 คุณได้เกรด A
หากคะแนนอยู่ระหว่าง 70 ถึง 79 คุณได้เกรด B
หากคะแนนอยู่ระหว่าง 60 ถึง 69 คุณได้เกรด C
หากคะแนนอยู่ระหว่าง 50 ถึง 59 คุณได้เกรด D
หากคะแนนอยู่ระหว่าง 0 ถึง 49 คุณได้เกรด F


โครงสร้าง case .. of
case ชื่อของตัวแปร of
ขอบเขต ของกรณีที่ 1 : การทำงาน ของกรณีที่ 1 ;
ขอบเขต ของกรณีที่ 2 : การทำงาน ของกรณีที่ 2 ;
ขอบเขต ของกรณีที่ n : การทำงาน ของกรณีที่ n ;
end ;


ในกรณีที่คำสั่งมากกว่า 2 คำสั่ง ก็จะต้อง ใช้ begin .. end ; ล้อมไว้
แบบเดียวกับ การใช้ if - then เลยครับ
uses crt ;
var
   score : integer ;

begin
    clrscr ;
     write (' insert your Score= ') ; readln( score ) ;

   case score of
    80..100  :  begin
                         writeln ('your grade is A') ;
                         writeln ('very good') ;
                      end ;
    70..79    :  begin
                         writeln ('your grade is B') ;
                         writeln ('good') ;
                      end ;
    60..69    :  begin
                         writeln ('your grade is C') ;
                         writeln ('that ok') ;
                      end ;
    50..59    :  begin
                         writeln ('your grade is D') ;
                         writeln ('you is Doraemon') ;
                      end ;
    0 ..49     :  begin
                         writeln ('your grade is F') ;
                         writeln ('Sorry you is not pass') ;
                      end ;
    end ;

readln ;
end.
insert your Score=
หากคะแนนอยู่ระหว่าง 80 ถึง 100 คุณได้เกรด A
และคำชม
very good

หากคะแนนอยู่ระหว่าง 70 ถึง 79 คุณได้เกรด B
และคำชม
good

หากคะแนนอยู่ระหว่าง 60 ถึง 69 คุณได้เกรด C
และคำชม
that ok

หากคะแนนอยู่ระหว่าง 50 ถึง 59 คุณได้เกรด D
และคำชม
you is Doraemon

หากคะแนนอยู่ระหว่าง 0 ถึง 49 คุณได้เกรด F
และคำว่า
Sorry you is not pass


ส่วนการกำหนดการทำงานให้กับกรณีอื่นๆ ( ELSE ) ก็มีให้ใช้เหมือนกับ if - then เช่นเดียวกันครับ
uses crt ;
var
   score : integer ;

begin
    clrscr ;
     write (' insert your Score= ') ; readln( score ) ;

   case score of
    80..100  :  begin
                         writeln ('your grade is A') ;
                         writeln ('very good') ;
                      end ;
    70..79    :  begin
                         writeln ('your grade is B') ;
                         writeln ('good') ;
                      end ;
    60..69    :  begin
                         writeln ('your grade is C') ;
                         writeln ('that ok') ;
                      end ;
    50..59    :  begin
                         writeln ('your grade is D') ;
                         writeln ('you is Doraemon') ;
                      end ;
    0 ..49     :  begin
                         writeln ('your grade is F') ;
                         writeln ('Sorry you is not pass') ;
                      end
    else
                     begin
                        writeln ('your grade is false');
                        writeln (' your score is incorrect');
                     end ;
    end ;

readln ;
end.
insert your Score=
หากคะแนนอยู่ระหว่าง 80 ถึง 100 คุณได้เกรด A
และคำชม
very good

หากคะแนนอยู่ระหว่าง 70 ถึง 79 คุณได้เกรด B
และคำชม
good

หากคะแนนอยู่ระหว่าง 60 ถึง 69 คุณได้เกรด C
และคำชม
that ok

หากคะแนนอยู่ระหว่าง 50 ถึง 59 คุณได้เกรด D
และคำชม
you is Doraemon

หากคะแนนอยู่ระหว่าง 0 ถึง 49 คุณได้เกรด F
และคำว่า
Sorry you is not pass

หากคะแนนอยู่นอกเหนือไปจากกรณีต่างๆ ดังกล่าว
คุณจะได้รับคำว่า

your grade is false และ
your score is incorrect
โปรดดูที่ end ที่อยู่ข้างหน้า else นะครับว่า ไม่ได้ใส่ ; ( semi-colon )
เหมือนกับตอนที่ใช้ else กับ if - then เลยใช่ไหมครับ
แต่ผมเคยทดสอบดูกับ turbopascal แล้ว ปรากฎว่า ถึงผมจะเขียน end แบบมี ; ( semi-colon )
โปรแกรมก็ compile ผ่านได้เหมือนกัน ดังนั้นจะใช้แบบไหนก็คงได้กระมังครับ




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



การใช้ loop เป็นเรื่องที่ต้องระวังนิดนึง
ตัวอย่างเช่น loop REPEAT UNTIL
ถ้าหากเราวางเงื่อนไข ที่ไม่สามารถเป็นจริง
เราก็จะได้ loop ที่ทำงานซ้ำๆ กันไปโดยหยุดไม่ได้

แต่ไม่เป็นไรครับ ผมจะแนะนำ
การ หยุด loop แบบเฉพาะหน้าให้ก่อน

วิธีแรก

ให้กดปุ่ม Ctrl+Break เมื่อกดแล้ว โปรแกรมก็จะหยุดการทำงาน

แต่ถ้าหาปุ่ม break ไม่เจอ(เครื่องผมปุ่ม break เขียนว่า pause Break)
หรือกดปุ่มตามวิธีแรกแล้ว โปรแกรมยังไม่หยุด ต้องมาใช้วิธีที่สอง
แต่วิธีนี้จะเสี่ยงกับ source code ที่พิมพ์ไว้หายไป
วิธีที่สอง
  1. หากคุณใช้ Mode Window คุณก็สามารถหยุด loop ได้โดยเพียงกดปุ่ม close (ปุ่ม กากบาท)
  2. หากคุณใช้ Mode Full-screen คุณจะต้องกดปุ่ม Ctrl+Alt+delete (กดครั้งเดียวพอนะถ้ากด 2 ครั้ง Restart นา)
    จากนั้นให้ทำการ ปิดโปรแกรมที่ทำงานไม่ยอมหยุดของเราลงไป โดยให้แถบสีอยู่ที่ชื่อโปรแกรมเรา และกด end task
คุณควร save ไฟล์ *.pas ไว้ก่อนใช้โปรแกรมที่มีการ loop นะครับ เพราะถ้าไม่ save ไว้ก่อน
ถ้า โปรแกรมเราไม่ยอมหยุดและต้องปิดลงไปด้วย end task ละก็..
โปรแกรมที่เขียนไว้นั้นจะหายไปครับ


ข้อควรระวัง
โดยปกติ Run Program ที่ loop ไม่หยุด ไม่มีอันตรายอะไรกับเครื่องคอมฯ
แต่ก็มีโอกาสบ้างเหมือนกันที่จะเกิดความผิดพลาดขึ้น
เช่นบางครั้ง ข้อมูลยังไม่ได้ save แล้วเกิดไป restart ก็จะทำให้ข้อมูลที่ไม่ได้ save ไว้สูญหาย
หรือถ้า Run โปรแกรม loop ไม่หยุดนานไปจนเครื่อง hang ในบางกรณีก็มีเหมือนกัน

ดังนั้นผมขอแนะนำว่าหากคุณจะหัดเขียนโปรแกรม
ไม่ควรไปหัดที่บริษัทหรือ computer ที่เก็บข้อมูลสำคัญมากๆ นะครับ
เพราะถึงการเขียนโปรแกรมขั้นพื้นฐานนี้ ไม่มีอันตรายต่อคอมพิวเตอร์
แต่ก็อาจจะทำให้ข้อที่เปิดอยู่สูญหายได้ในบางกรณี




ไม่ต้องกังวลนะครับว่าข้อมูลคุณใน harddisk จะหายหมด
เพราะจากที่ได้ยินได้ฟังมา และโดยประสบการณ์ของผม ที่หัดเขียนมาประมาณ 6 เดือนแล้ว
การหัดเขียนโปรแกรมในระดับพื้นฐาน ผมยังไม่เคยพบปัญหาที่รุนแรงไปกว่า
ข้อมูลไฟล์ *.pas ที่ไม่ได้ save สูญหาย ไปเพราะการ run program ที่ loop ไม่หยุดเพียงไฟล์เดียวเท่านั้นเอง


REPEAT UNTIL

เอาล่ะครับ มาต่อกันในเรื่อง loop
loop แรกที่จะมาทำความรู้จักกัน ได้แก่ REPEAT UNTIL
โครงสร้าง repeat - until
repeat
   คำสั่งงาน
until เงื่อนไข

( เมื่อเงื่อนไขเป็นจริง โปรแกรมจะหยุดทำการวนซ้ำ )


ตัวอย่างการใช้ loop REPEAT UNTIL
uses crt ;
var
    k : byte ;
begin
   clrscr ;
   k := 0 ;

      repeat
           k := k+1 ;
           writeln( 'this is loop', k ) ;
      until k=5 ;

    readln ;
end.

this is loop1
this is loop2
this is loop3
this is loop4
this is loop5



การทำงาน ของ loop
 Loop 1 
โปรแกรม นำค่า k ( ตอนแรก k เก็บค่า 0 ) มาบวก 1 และนำไปเก็บไว้ที่ค่า k
ตอนนี้ k = 1
จากนั้นจะ แสดง this is loop1
ต่อไปโปรแกรมจะตรวจสอบว่า ตัวแปร k = 5 หรือไม่

 Loop 2 
โปรแกรม นำค่า k มาบวก 1 และนำไปเก็บไว้ที่ค่า k
ตอนนี้ k = 2
จากนั้นจะ แสดง this is loop2
ต่อไปโปรแกรมจะตรวจสอบว่า ตัวแปร k = 5 หรือไม่

 Loop 3 
โปรแกรม นำค่า k มาบวก 1 และนำไปเก็บไว้ที่ค่า k
ตอนนี้ k = 3
จากนั้นจะ แสดง this is loop3
ต่อไปโปรแกรมจะตรวจสอบว่า ตัวแปร k = 5 หรือไม่

 Loop 4 
โปรแกรม นำค่า k มาบวก 1 และนำไปเก็บไว้ที่ค่า k
ตอนนี้ k = 4
จากนั้นจะ แสดง this is loop4
ต่อไปโปรแกรมจะตรวจสอบว่า ตัวแปร k = 5 หรือไม่

 Loop 5 
โปรแกรม นำค่า k มาบวก 1 และนำไปเก็บไว้ที่ค่า k ตอนนี้ k = 5
จากนั้นจะ แสดง this is loop5
ต่อไปโปรแกรมจะตรวจสอบว่า ตัวแปร k = 5 หรือไม่
ตอนนี้ k = 5 โปรแกรมจะหยุด ทำการวนซ้ำ
การอธิบายเรื่อง loop เป็นเรื่องไม่ยากครับ แต่จะต้องเขียนยาวมาก ส่วนใหญ่เขาจึงใช้แผนภูมิรูปภาพ
สำหรับอธิบายกันมากกว่าเพราะสั้นและสะดวกในการอ่าน

รูปการทำงานของ loop
ไม่ต้องตกใจว่า เป็นแผนภูมิการเขียน loop แบบใหม่ นะครับ
เพราะผมเขียน แผนภาพ แบบที่เขาใช้กันไม่เป็นนั่นเอง..+_+ ก็เลยเขียนแบบนี้ไง
เมื่อคุณต้องการ เขียนโปรแกรมสักงานชิ้นหนึ่ง คุณอาจจะออกแบบก่อน ที่จะพิมพ์
โดยเขียนแผนภาพแสดงการทำงาน ที่เรียกว่า flow chart นี่
จะช่วยให้ลดจำนวนครั้งหรือระยะเวลาในการพิมพ์ ตรวจทานและแก้ไขได้มาก


คำอธิบาย ผมได้เขียนไปค่อนข้างยาวเพราะผมรู้สึกว่า การใช้คำอธิบายสั้นๆ อาจจะไม่เพียงพอ
สำหรับบางคนที่ต้องการ ทราบถึงขั้นตอนการทำงาน ในแต่ละขั้นของโปรแกรม
แต่บางทีมันจะทำให้คุณสับสน.. เรามาให้ความสนใจกับอย่างต่อไปดีกว่าครับ
uses crt ;
var
   score : integer ;

begin
   clrscr ;

repeat
     write (' insert your Score= ') ; readln( score ) ;

   case score of
       80..100  :  write ('your grade is A') ;
       70..79    :  write ('your grade is B') ;
       60..69    :  write ('your grade is C') ;
       50..59    :  write ('your grade is D') ;
       0 ..49     :  write ('your grade is F') ;
   end ;

    readln ;
until (score < 0) or (score > 100) ;

end.
อันนี้เป็นการ นำเอาตัวอย่างที่สองของหน้านี้
มาร่วมกับ loop REPEAT UNTIL


insert your Score=

ลอง Run Program ดูคุณจะพบว่า
โปรแกรมจะทำการวนคำสั่งเดิมไปเรื่อยๆ
จนกว่า เราจะป้อนค่าให้ ตัวแปร score น้อยกว่า 0
หรือ มากกว่า 100 โปรแกรมถึงจะหยุดครับ


หากคุณ ลองเพิ่ม โพรซีเจอร์ CLRSCR ; วางไว้ข้างหลัง repeat คุณจะได้โปรแกรมที่ดูดีขึ้นครับ
uses crt ;
var
   score : integer ;

begin
   clrscr ;

repeat
    clrscr ;
     write (' insert your Score= ') ; readln( score ) ;

   case score of
       80..100  :  write ('your grade is A') ;
       70..79    :  write ('your grade is B') ;
       60..69    :  write ('your grade is C') ;
       50..59    :  write ('your grade is D') ;
       0 ..49     :  write ('your grade is F') ;
   end ;

    readln ;
until (score < 0) or (score > 100) ;

end.
โปรแกรมเดียวกับด้านบน แต่หน้าจอสะอาดขึ้นครับ

insert your Score=



ต่อไปมารู้จัก function Keypressed กันครับ
ฟังค์ชั่นนี้ เป็นฟังค์ชั่น boolean ที่จะมีค่าเป็นเท็จ
ในขณะที่เรายังไม่กดปุ่ม keyboard ใดๆ
และจะมีค่าเป็นจริง ต่อเมื่อเรากด ปุ่มใดๆ

uses crt ;
var
begin
   clrscr ;

       repeat
           delay(60) ;
           write('001') ;
       until keypressed ;

   readln ;
end.
โปรแกรมนี้ เมื่อ Run จะพบว่า มีการพิมพ์ " 001 " กันอย่างต่อเนื่อง
และจะหยุดเมื่อมีการกดปุ่มใดๆ บน keyboard ครับ

สำหรับ ตัวแปรชนิด boolean และฟังค์ชั่นผมจะอธิบายในโอกาสต่อไป

ยังมีเนื้อหาบางอย่าง ที่ควรศึกษาอีก สำหรับ repeat until กับ case of แต่จะเพิ่มในการ update คราวหน้าครับ

best view with ie 5.0++, screen 600x800