การควบคุมให้เลือกทำงาน  

  

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

=
เท่ากับ
<>
ไม่เท่ากับ
>
มากกว่า
>=
มากกว่าหรือเท่ากับ
<
น้อยกว่า
<=
น้อยกว่าหรือเท่ากับ

คำสั่ง if/then (if/then statement)

การใช้ if/then จะใช้เมื่อมีการเลือกกระทำในทางเดียว (one- way selection) และประเมินเงื่อนไขโดยใช้การคำนวณแบบบูลีน(Boolean expression) ว่า "หากเป็นจริงให้ดำเนินการตามประโยคหลัง then" ซึ่งมีรูปแบบทั่วไปดังนี้

ถ้ามีเพียง  1  คำสั่ง  "Single  Statement"

รูปแบบ if (เงื่อนไขบูลีน) then <คำสั่ง>
ตัวอย่างการใช้ if - then

uses crt ;
var
      i : integer ;      

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;

      if  i>10 then
          write(' i more than 10 ' ) ;

          readln ;
end.
insert i=
หากใส่ ตัวเลขที่น้อยกว่า 10 หรือใส่ 10
คำสั่งที่อยู่ด้านหลัง then จะไม่ทำงาน
หากใส่ตัวเลขที่มากกว่า 10 โปรแกรมจะทำงานดังนี้


i more than 10



ถ้ามีการทำงานมากว่า  1 คำสั่ง เราเรียกว่า  " Compound  Statement"
หากเราต้องการให้ทำงานมากกว่า 1 คำสั่ง ต้องกั้นหน้าหลัง ด้วย begin - end ;
สังเกตที่ end นะค่ะว่า เป็น ; (semi-colon) ไม่ใช่ . (dot)

uses crt ;
var
      i : integer ;      

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;

      if  i>10 then
       begin
         writeln('condition is true') ;
         write(' i more than 10 ' ) ;
       end;
          

          readln ;
end.
insert i=
หากใส่ ตัวเลขที่น้อยกว่า 10 หรือใส่ 10
คำสั่งที่อยู่ด้านหลัง then จะไม่ทำงาน
หากใส่ตัวเลขที่มากกว่า 10 โปรแกรมจะทำงานดังนี้


condition is true
i more than 10


Else

หากต้องการให้ทำคำสั่งหนึ่งเมื่อเงื่อนไขเป็นจริงและให้ทำอีกคำสั่งหนึ่งเมื่อเงื่อนไขเป็นเท็จต้องใช้ else ค่ะ

uses crt ;
var
      i : integer ;      

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;

      if  i>10 then
         write(' i more than 10 ' )
      else
         write( 'i less than or equal 10' ) ;
          

          readln ;
end.
insert i=
หากใส่ตัวเลขที่มากกว่า 10 โปรแกรมจะทำงานดังนี้

i more than 10
หากใส่ ตัวเลขที่น้อยกว่า 10 หรือใส่ 10 จะเป็นดังนี้

i less than or equal 10

ให้สังเกตที่ คำสั่ง writeln() ; ก่อน else นะค่ะว่า จะเว้นไม่ใส่ ; (semi-colon)
เป็นรูปแบบที่ใช้สำหรับ else โดยเฉพาะค่ะ




ในตัวอย่างด้านล่างนี้ก็เป็น การกำหนดว่าหากเงื่อนไขเป็นจริง ให้เขียนคำตอบ สีฟ้า และหากเงื่อนไขเป็นเท็จ
ให้เขียนคำตอบ สีเขียว ให้สังเกตที่ end ข้างหน้า else ว่าจะไม่ใส่ semi-colon ค่ะ

uses crt ;
var
      i : integer ;      

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;

      if  i>10 then
        begin
            textcolor(11);
            write(' i more than 10');
            textcolor(7);
        end
      else
        begin
             textcolor(10);
             write(' i less than 10 or equal 10');
             textcolor(7);
         end;
          
          readln ;
end.
insert i=
หากใส่ตัวเลขที่มากกว่า 10 โปรแกรมจะแสดงผล
i more than 10
หากใส่ ตัวเลขที่น้อยกว่า 10 หรือใส่ 10 โปรแกรมจะแสดงผล
i less than 10 or equal 10


คำสั่ง if/then แบบใช้ซ้อนกัน
     การใช้ if/then ซ้อนกันตั้งแต่ 2 ครั้งขึ้นไปจะเกิดขั้นได้เมื่อเราต้องการ จะใช้เงื่อนไขที่มีความซับซ้อนยิ่งขึ้น เช่น
if (X=Y) then

BEGIN
WRTELN('X and Y are eaual');
if (X>20) then WRITELN ('X and Y are between 20 and 30 ')
END;

ตัวอย่างนี้เราสามารถใช้ซีนแท็กซ์อย่างอื่นซึ่งเข้าใจง่ายกว่าได้ดังนี้

if (X=Y) then
BEGIN WRTELN('X and Y are eaual');
if (X>20) AND (X<30) then
WRITELN ('X and Y are between 20 and 30 ')
END;

ดังนั้นการใช้ if/then ที่ซ้อนกันจึงไม่ค่อยจะกระทำกัน เพราะว่าไม่มีความจำเป็นอะไรเนื่องจากมีวิธีที่สั้นกว่าดังที่ยกตัวอย่าง
เปรียบเทียบให้เห็นแล้ว จากตัวอย่างข้างต้นนี้จะเห็นว่าเราสามารถจะใช้ if/then กับ AND, OR และ NOT ได้ หากการ
แก้ปัญหาในโปรแกรมต้องใช้เงื่อนไขการเลือกแบบนั้น เช่นเราอาจจะต้องเลือกกระทำดังตัวอย่างต่อไปนี้

if(SEX = 'MALE') then
if (MARRIED > 0) OR (LWA* > O )
then COUNTER := COUNTER+1 : หรือใช้ AND, OR ตามตัวอย่างต่อไปนี้ซึ่งก็ได้ผล เช่นเดียวกับตัวอย่างข้างต้น
if (SEX = 'MALE') AND ((MARRIED>O) OR (LWS>O)) then
COUNTER := COUNTER+1;

คำสั่ง if/then/else (if/then/else statement)

การใช้ if/the/else จะมีลักษณะเลือกกระทำ เป็น 2 ทางเลือก (two - way selection) แต่จะเลือกทำอย่างใดอย่างหนึ่ง
เท่านั้นหลังจากได้ประเมินเงื่อนไขแบบบูลแล้วว่า หากเป็นจริงตามเงื่อนไขให้ดำเนินการตามประโยคหลัง then แต่ถ้าไม่จริงให้
ดำเนินการตามประโยคหลัง else คำสั่ง if / the /else มีรูปแบบการใช้ดังนี้

รูปแบบ if (เงื่อนไขบูลีน) then < คำสั่ง 1 > (*ไม่ต้องใส่เซมิโคลอน*) else < คำสั่ง 2 >;
ตัวอย่าง if (X >O) then

WRITELN ('X is greater than zeri.')
else WRITELN ('X isless than zero or equal.');
อย่างไรก็ตามจากตัวอย่างข้างบนนี้หากจะใช้คำสั่ง if / then ก็สามารถจะทำได้โดยโปรแกรมจะยังให้ผลอย่างเดียวกันคือ
if (X >O) then WRITELN ( 'X is greater than zero.') ;
if NOT( X >O) then WRITELN ( X is less than zero or equal.') ;
ข้อสังเกตอย่างหนึ่งก็คือ if NOT ( X > 0) สามารถใช้ if (X <= 0) ได้ การจะใช้ซีแท็กซ์ใดที่ให้ผลอย่างเดียวกันเป็นความต้องการของโปรแกรมเมอร์แต่ละคน

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

รูปแบบ
  if (เงื่อนไขบูลีน 1) then
<คำสั่ง>
else
if(เงื่อนไขบูลีน 2 ) then <คำสั่ง 2>
else

<คำสั่ง 3>;
      รูปแบบนี้จะเห็นว่าใช้ if/then/else ซ้อนไปได้เรื่อยๆ ไม่มีข้อจำกัดอะไรเลยแต่ในกรณีที่มีการซ้อนกันเกินกว่า 2 ครั้งเราจะมีวิธีอื่นใช้แทนวิธีนี้คือ ใช้คำสั่ง case/of ซึ่งจะกล่าวต่อไป ข้อที่จะต้องระมัดระวังการใช้ if/then/else ก็คือการใช้เครื่องหมาย ; เพราะหลังประโยคหรือคำสั่งที่อยู่ก่อนหน้า else จะใส่เครื่องหมาย ; ไม่ได้ กล่าวคือภาษาปาสคาลถือว่ายังเป็นประโยคเดียวกันถ้าท่านลืมซีนแท็กซ์นี้ใส่เครื่องหมายดังกล่าวคอมไพเลอร์จะแสดงความ
ผิดพลาดให้รู้

Logical Operators
     มีไว้เชื่อมเงื่อนไข เข้าด้วยกันที่ผมใช้เป็นหรือเคยได้ใช้ ได้แก่

AND
OR
XOR
NOT
ตัวอย่างการใช้ AND(1)
uses crt ;
var
      i : integer ;      

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;

      if  ( i > 10 ) and ( i < 50 ) then
           write( ' i more than 10 AND i less than 50' ) ;
          
          readln ;
end.
โปรแกรมจะ รอรับค่า i
insert i =

ถ้า i มากกว่า 10  และ i น้อยกว่า 50
โปรแกรมจะ แสดง
i more than 10 AND i less than 50


แต่ถ้า ไม่เป็นไปตามเงื่อนไข
คือ i ไม่ได้อยู่ระหว่าง 10 ถึง 50

โปรแกรมจะ ไม่แสดงข้อความ

ตัวอย่างการใช้ AND(2)
uses crt ;
var
      i : integer ;      
     k : integer ;

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;
    write( 'insert k=' ) ; readln( k ) ;

      if  ( i > 10 ) and ( i > k ) then
           i := i - k ;
          
          write( 'i=', i ) ;
          readln ;
end.
โปรแกรมจะ รอรับค่า i และค่า k ตามลำดับ
insert i =
insert k =

ถ้า i มากกว่า 10  และ i มากกว่า k
โปรแกรมจะ นำค่า i ไปลบค่า k
และเก็บผลลัพธ์ที่ได้ ไว้ที่ตัวแปร i



แต่ถ้า ไม่เป็นไปตามเงื่อนไข
คือ i ไม่มากกว่า 10 หรือ i ไม่มากกว่า k
อย่างใดอย่างหนึ่ง หรือไม่ตรงกับเงื่อนไขทั้งสองกรณี

i ก็ยังคงมีค่าเท่ากับตอนที่เราป้อนค่า ทางคีร์บอร์ด

หลังจากตรวจสอบเงื่อนไขแล้ว โปรแกรมจะแสดง

i = ผลลัพธ์

หากคุณได้ลองไปพิมพ์ และทดสอบ Run ดู ก็จะเข้าใจได้เร็วขึ้นค่ะ

ตัวอย่างการใช้ AND(3)
uses crt ;
var
      i : integer ;      
     k : integer ;

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;
    write( 'insert k=' ) ; readln( k ) ;

      if  ( i > 10 ) and ( i > k ) then
        begin
                 i := i - k ;		
                 write( ' i - k = ', i ) ;
        end
      else
        begin
                  i := i + k ;
                  write( ' i + k= ', i ) ;
         end;
          
          readln ;
end.
โปรแกรมจะ รอรับค่า i และค่า k ตามลำดับ
insert i =
insert k =

ถ้า i มากกว่า 10  และ i มากกว่า k

โปรแกรมจะ นำค่า i ไปลบค่า k
และเก็บผลลัพธ์ที่ได้ ไว้ที่ตัวแปร i

และจะแสดง i - k = ผลลัพธ์

แต่ถ้า ไม่เป็นไปตามเงื่อนไข
คือ i ไม่มากกว่า 10 หรือ i ไม่มากกว่า k
อย่างใดอย่างหนึ่ง หรือไม่ตรงกับเงื่อนไขทั้งสองกรณี

โปรแกรมจะทำตาม คำสั่งข้างหลัง ELSE คือ
นำ i ไปบวก k แล้วเก็บค่าไว้ในตัวแปร i

และจะแสดง i + k = ผลลัพธ์





    ตัวอย่างการใช้ OR(1)
uses crt ;
var
      i : integer ;      
     k : integer ;

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;
    write( 'insert k=' ) ; readln( k ) ;

      if  ( i = 10 ) or ( k = 10 ) then          
          write( 'i or k or both = 10' ) ;

          readln ;
end.
โปรแกรมจะ รอรับค่า i และค่า k ตามลำดับ
insert i =
insert k =

ถ้า i เท่ากับ 10  หรือ k เท่ากับสิบ
หรือตรงตามเงื่อนไข ทั้งสองกรณี


โปรแกรมจะ แสดง

i or k or both = 10

(both แปลว่า ทั้งคู่ครับ)
แต่ถ้า ไม่เป็นไปตามเงื่อนไข
คือ i ไม่เท่ากับ 10 และ k ไม่เท่ากับ 10
( ไม่ตรงกับเงื่อนไขทั้งสองกรณี )


ก็จะไม่มีการแสดงข้อความใดๆ



    ตัวอย่างการใช้ OR(2)
uses crt ;
var
      i : integer ;      
     k : integer ;

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;
    write( 'insert k=' ) ; readln( k ) ;

      if  ( i > 10 ) or ( i > k ) then
        begin
                 i := i - k ;
                 write( ' i - k = ', i ) ;
        end
      else
        begin
                  i := i + k ;
                  write( ' i + k= ', i ) ;
         end;
          
          readln ;
end.
โปรแกรมจะ รอรับค่า i และค่า k ตามลำดับ
insert i =
insert k =

ถ้า i มากกว่า 10  หรือ i มากกว่า k
หรือตรงตามเงื่อนไขทั้งสองกรณี


โปรแกรมจะ นำค่า i ไปลบค่า k
และเก็บผลลัพธ์ที่ได้ ไว้ที่ตัวแปร i

และจะแสดง
i - k = ผลลัพธ์

แต่ถ้า ไม่เป็นไปตามเงื่อนไข
คือ i ไม่มากกว่า 10 และ i ไม่มากกว่า k
( ไม่ตรงกับเงื่อนไขทั้งสองกรณี )


โปรแกรมจะทำตาม คำสั่งข้างหลัง ELSE คือ
นำ i ไปบวก k แล้วเก็บค่าไว้ในตัวแปร i

และจะแสดง
i + k = ผลลัพธ์


    ตัวอย่างการใช้ XOR
uses crt ;
var
      i : integer ;      
     k : integer ;

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;
    write( 'insert k=' ) ; readln( k ) ;

      if  ( i > 10 ) xor ( i > k ) then
           i := i - k ;
          
          write( 'i=', i ) ;
          readln ;
end.
โปรแกรมจะ รอรับค่า i และค่า k ตามลำดับ
insert i =
insert k =

ถ้า i มากกว่า 10  หรือ i มากกว่า k
แต่เงื่อนไขทั้งสองกรณี ไม่ได้เป็นจริงพร้อมกัน

โปรแกรมจะ นำค่า i ไปลบค่า k
และเก็บผลลัพธ์ที่ได้ ไว้ที่ตัวแปร i

แต่ถ้า ไม่เป็นไปตามเงื่อนไข คือ
i ไม่มากกว่า 10 และ i ไม่มากกว่า k
( ไม่ตรงกับเงื่อนไขทั้งสองกรณี )

หรือ เงื่อนไขเป็นจริงทั้งสองกรณี

i ก็ยังคงมีค่าเท่ากับตอนที่เราป้อนค่า ทางคีร์บอร์ด

หลังจากตรวจสอบเงื่อนไขแล้ว โปรแกรมจะแสดง

i = ผลลัพธ์


ข้อแตกต่างระหว่าง OR กับ XOR คือ
     เงื่อนไข XOR จะเป็นจริงต่อเมื่อมีเพียงกรณีเดียวที่เป็นจริงหากทั้งสองกรณีเป็นจริง เงื่อนไข XOR จะเป็นเท็จ
และหากทั้งสองกรณีเป็นเท็จ เงื่อนไข XOR ก็จะเป็นเท็จส่วนเงื่อนไข OR จะเป็นเท็จ เมื่อทั้งสองกรณีเป็นเท็จ เท่านั้น
หากกรณีใดกรณีหนึ่งเป็นจริง.. OR ก็จะเป็นจริงหากทั้งสองกรณีเป็นจริง OR ก็จะเป็นจริง


สัญลักษณ์ " NOT "

ตัวอย่างการใช้ NOT(1)
uses crt ;
var
      i : integer ;      

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;

      if  not ( i=25 ) then
           write( ' i is not 25' );
         
          readln ;
end.
โปรแกรมจะ รอรับค่า i
insert i =
align=absmiddle>

หากว่า i ไม่เท่ากับ 25 โปรแกรมจะแสดง
i is not 25

ตัวอย่างการใช้ NOT(2)
uses crt ;
var
      i : integer ;      

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;

      if  ( i > 10 ) and not ( i=25 ) then
           write( 'i more than 10 AND i is not 25' );
         
          readln ;
end.
โปรแกรมจะ รอรับค่า i
insert i =
align=absmiddle>

หากว่า i มากกว่า 10   และ  i ไม่เท่ากับ 25 โปรแกรมจะแสดง
i more than 10 AND i is not 25


ความจริงใช้เครื่องหมายไม่เท่ากับ (<>) แทน NOT ก็ได้ค่ะ
uses crt ;
var
      i : integer ;      

begin
    clrscr ;
    write( 'insert i=' ) ; readln( i ) ;

      if  ( i > 10 ) and ( i <> 25 ) then
           write( 'i more than 10 AND i is not 25' );
         
          readln ;
end.
โปรแกรมจะ รอรับค่า i
insert i =
align=absmiddle>

หากว่า i มากกว่า 10   และ  i ไม่เท่ากับ 25 โปรแกรมจะแสดง
i more than 10 AND i is not 25