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

While.. Do (ทำการวนซ้ำ หากเงื่อนไขเป็นจริง)

ลูป while นี้นับเป็นชนิดที่ 3 ที่ผมจะพูดถึง และเป็นชนิดสุดท้ายในภาษาปาสคาล
ซึ่งลูปชนิดนี้มีข้อแตกต่างกับ ลูป REPEAT.. UNTIL ดังนี้
ข้อแตกต่างทางด้านโครงสร้างการเขียน
while เงื่อนไข do
    งาน ..
repeat
    งาน ..
until เงื่อนไข

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

เช่น while x>5 do begin .. end;
หาก x มากกว่า 5 คำสั่งในลูปจะทำงาน
เมื่อ x ไม่มากกว่า 5 หยุดการทำงานในลูป
( ทำงานขณะที่เงื่อนไขเป็นเท็จ
เงื่อนไขเป็นจริง หยุดการวนซ้ำ)

เช่น repeat .. until x>5;
หาก x ไม่มากกว่า 5 คำสั่งในลูปจะทำงาน
เมื่อ x มากกว่า 5 หยุดการทำงานในลูป

ข้อแตกต่างในลำดับก่อนหลัง ระหว่างการตรวจสอบเงื่อนไข และการทำงานของคำสั่ง
x:=5;

while x<5 do
begin
    write( x );
    x:=x+1;
end;
x:=5;

repeat
     write( x );
     x:=x+1;
until x>=5
----- proceed of program ---->

ตรวจสอบค่า x
ค่า x ไม่ได้น้อยกว่า 5
คำสั่งใน loop จึงไม่ทำงาน


สำหรับลูปแบบ while จะมีการตรวจสอบเงื่อนไขก่อนทำงาน
ดังนั้นหากเงื่อนไขเป็นเท็จ จะไม่มีการทำงานของคำสั่งเลย
----- proceed of program ---->

แสดงค่า x บนจอมอนิเตอร์
เพิ่มค่า x ขึ้นอีก 1 หน่วย
ตรวจสอบค่า x พบว่าเท่ากับ 6
หยุดการวนซ้ำคำสั่ง

สังเกตว่าที่จริง x=5 อยู่ก่อนแล้ว(เงื่อนไขจึงเป็นจริงแต่แรก)
แต่ที่โปรแกรมทำงานภายในลูป เพราะมีการตรวจสอบหลังการทำงาน

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

while..do กับ repeat..until นั้นสามารถใช้แทนกันได้
เหมือนกับ ชามซึ่งใช้แทนจานได้ ( ใส่อาหารทั่วๆ ไป )
อย่างไรก็ตาม บางโปรแกรมจะเหมาะกับ while..do เท่านั้น
( เช่น เวลาอาหารที่มีน้ำซุปที่ต้องใส่ไว้ในชามถึงจะสะดวก )
แต่บางโปรแกรมน้ำซุปไม่มาก อาจจะใช้ repeat..until แทนได้
( เกือบจะกลายเป็นวิธีเลือกภาชนะใส่กับข้าวเสียแล้วสิ )

ตัวอย่าง เปรียบเทียบการวนซ้ำแบบ repeat..until กับแบบ while..do
   โปรแกรมทั้งสองฝั่งจะมีการทำงานคล้ายๆ กัน ( หากค่า money น้อยกว่าหรือเท่ากับ 0 จะหยุดการวนซ้ำ )
   ต่างกันที่ โปรแกรมฝั่ง while..do จะไม่ทำงานเลย ส่วนฝั่ง repeat..until จะทำงานก่อนรอบหนึ่ง
   จากนั้นเมื่อตรวจสอบพบว่าน้อยกว่าหรือเท่ากับ 0 จึงหยุดการวนซ้ำ
uses
       crt ;
var
       money, price: integer;
begin
       clrscr ;
             write( 'You have some money=' );
             readln( money );

                   repeat
                      write( 'current you have ',money );
                      write( ' you pay for your food=' );
                      readln( price );
                         money:=money-price;
                   until money<=0; 

                   if money<0 then
                   begin
                       write( 'Oh no, i will pay ');
                       write( money * -1 );
                       write( ' to you next time' );
                   end
                   else
                     write( 'i have a zero' );
       readln ;
end.
uses
       crt ;
var
       money, price: integer;
begin
       clrscr ;
             write( 'You have some money=' );
             readln( money );

                  while money>0 do
                  begin
                      write( 'current you have ',money );
                      write( ' you pay for your food=' );
                      readln( price );
                         money:=money-price;
                  end;

                   if money<0 then
                   begin
                       write( 'Oh no, i will pay ');
                       write( money * -1 );
                       write( ' to you next time' );
                   end
                   else
                     write( 'i have a zero' );
       readln ;
end.
หากป้อน money น้อยกว่าหรือเท่ากับ 0
คำสั่งภายใน reapeat until จะทำงาน 1 ครั้ง
หากป้อน money น้อยกว่าหรือเท่ากับ 0
คำสั่งภายใน while do จะไม่ทำงาน
*หมายเหตุ money * -1
ในทางคณิตศาสตร์ จำนวนติดลบสามารถคูณได้
 ๑. หากจำนวนหนึ่งเป็นบวก อีกจำนวนหนึ่งเป็นลบ ผลลัพธ์จะเป็นลบ
     เช่น 5 คูณ -9 จะได้ผลลัพธ์เท่ากับ -45  หรือ -5 คูณ 9 ก็จะได้ผลลัพธ์ -45
 ๒. แต่หากเป็นจำนวนลบด้วยกัน เมื่อคูณกันแล้วค่าติดลบจะหายไป
     เช่น -5 คูณ -9 จะได้คำตอบเท่ากับ 45
จากโปรแกรม money จะเป็นค่าติดลบ
ผมต้องการแสดงค่าจำนวนไม่ติดลบ จึงต้องทำการคูณด้วย -1 เพื่อแสดงค่าที่เป็นบวก



การใช้ break และ continue

break และ continue นั้นเป็นโพรซีเจอร์อันหนึ่ง ที่จะนำมาใช้กับการวนซ้ำ
( for..do ,repeat..until, while..do )
ทั้งสองโพรซีเจอร์นี้จะใช้สำหรับควบคุมการวนซ้ำ
ก่อนที่ลูปจะทำงานครบรอบหนึ่ง
การใช้ break;
uses crt;
var
      Num : byte;
begin
   clrscr;
      for Num:=1 to 5 do  begin
           writeln ('you have ',Num,' bath'); 
                if Num=2 then
                   break;
           writeln ('you can buy ', Num*2,' sugus');
      end;
          write( '## loop end ##' );
readln;
end.
ตามปกติแล้ว การใช้ for ลูปแบบทางด้านซ้าย
ถ้าไม่มีคำสั่ง break โปรแกรมนี้จะแสดงผลดังนี้
you have 1 bath
you can buy 2 sugus
you have 2 bath
you can buy 4 sugus
you have 3 bath
you can buy 6 sugus
you have 4 bath
you can buy 8 sugus
you have 5 bath
you can buy 10 sugus
## loop end ##

แต่ในโปรแกรมดังกล่าว มีคำสั่ง break ดังนั้น
โปรแกรมจะออกไปทำงานต่อ ข้างนอกลูปทันที ดังนี้
you have 1 bath
you can buy 2 sugus
you have 2 bath
## loop end ##

การใช้ continue;
uses crt;
var
      Num : byte;
begin
   clrscr;
      for Num:=1 to 5 do  begin
           writeln ('you have ',Num,' bath'); 
                if Num=2 then
                 continue;
           writeln ('you can buy ', Num*2,' sugus');
      end;
          write( '## loop end ##' );
readln;
end.
break ใช้เพื่อออกจากลูปก่อนถึงคำสั่งด้านล่างสุด
ส่วน continue จะข้ามคำสั่งที่อยู่ด้านล่าง
แล้วไปทำงานต่อ ในรอบถัดไป
you have 1 bath
you can buy 2 sugus
you have 2 bath
you have 3 bath
you can buy 6 sugus
you have 4 bath
you can buy 8 sugus
you have 5 bath
you can buy 10 sugus
## loop end ##


คำสั่ง break และ continue นั้น สามารถนำไปใช้กับ ลูป repeat..until และ while..do ได้เช่นเดียวกัน
uses
       crt ;
var
       Num: byte;
begin
       clrscr ;
          Num:=1;

           repeat
                gotoxy(Num,Num);
                   write(Num);
                   delay(300);
                      if Num=10 then break;
                  inc(Num);
           until Num=15;

       readln ;
end.
ปกติถ้าไม่มีคำสั่ง break โปรแกรมจะหยุดต่อเมื่อ Num=15
แต่สำหรับโปรแกรมนี้
โปรแกรมจะหยุดตอน Num มีค่าเท่ากับ 10

1
  2
    3
      4
        5
          6
            7
              8
                9
                  10

แนวความคิดนี้คือ ต้องการแสดงตัวเลข ตามแนวเฉียง
โดยจะเพิ่มค่า Num รอบละหนึ่ง พร้อมทั้งเคลื่อนย้ายตำแหน่ง(gotoxy)
ไปทางขวาและทางด้านล่างมากขึ้นทีละหนึ่งช่องเช่นกัน

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

การวางเงื่อนไขของทั้งสองโพรซีเจอร์
สามารถวางไว้ตามส่วนต่างๆ ของ loop ได้หลายแห่ง
แล้วแต่ต้องการหยุดทำงาน(break) หรือเว้นการทำงาน(continue)ในส่วนใด? โดยเงื่อนไขใด?
best view with ie 5.0++, screen 600x800