เทคนิคการทำให้ ลูปหยุดได้แน่นอน
ในการวางเงื่อนไขให้โปรแกรมวนซ้ำบางครั้ง
ก็อาจผิดพลาด จนทำให้โปรแกรมทำงานไม่หยุดก็เป็นได้
โดยปกติเราจะใช้วิธีการกด ปุ่ม Ctrl+Break ในการหยุดโปรแกรม
แต่การทำให้ ลูปหยุด ด้วยการกด Ctrl+Break บางครั้ง
ก็ไม่สามารถทำให้โปรแกรมหยุดทำงานได้
จนทำให้เราจำใจต้องปิดโปรแกรม โดยกด Alt+F4
ทำให้ source code ที่ยังไม่ได้ทำการ save สูญหายไป
แต่ก็มีแนวทางในการวางเงื่อนไขในลูปให้สามารถหยุด
ได้อย่างแน่นอน เพื่อกันโปรแกรมหยุดไม่ได้อยู่บ้าง
ที่ผมเคยใช้ก็มีอยู่สองวิธีด้วยกัน
1. การทำให้ loop มีเงื่อนไข
IF keypressed THEN break;
เช่น
uses
crt ;
var
x : byte;
begin
clrscr ;
x := 20;
repeat
write( 'abc' );
IF keypressed THEN break;
until x=50;
readln ;
end.
ตามปกติ เงื่อนไขดังกล่าวจะไม่มีวันเป็นจริง ทำให้โปรแกรมทำงานไม่หยุด
แต่ เมื่อเอาเงื่อนไข IF keypressed THEN break;
มาวางไว้ภายในจะทำให้โปรแกรม หยุดได้โดยง่าย
หากต้องการมั่นใจว่าลูปจะหยุดได้ ก็อาจจะนำ
เงื่อนไขนี้ไปวางในลูปต่างๆ ที่ไม่แน่ใจว่าเงื่อนไขถูกต้องหรือไม่
เพื่อกันโปรแกรมทำงานไม่หยุด
การใช้เพียงเงื่อนไข keypressed อาจจะกว้างเกินไปเพราะ
โปรแกรมบางครั้งก็มีการ กด key ดังนั้นอาจ
จะใช้วิธีหยุด loop เมื่อกด esc ก็ได้ ดังนี้
เช่น
uses
crt ;
var
x : byte;
k : char;
begin
clrscr ;
x := 20;
repeat
write( 'abc' );
IF keypressed THEN
begin
k:=readkey;
if k=#0 then k:=readkey;
if k=#27 then break;
end;
until x=50;
readln ;
end.
2. การกำหนดให้ loop วนซ้ำได้ในจำนวนจำกัด
เช่น
uses
crt ;
const
limitLoop = 1000;
var
x : byte;
curloop : word;
begin
clrscr ;
x := 20;
curloop := 0;
repeat
write( 'abc' );
inc (curloop);
IF curloop>=limitLoop THEN break;
until x=50;
readln ;
end.
ประโยชน์ ของการประกาศค่าคงที่
มีอยู่พักหนึ่งผมก็สงสัยว่าค่าคงที่ก็เหมือนๆ กับตัวแปรนั่นแหละ
แต่พอ มาเขียนโปรแกรมยาวๆ ถึงได้รู้ว่า
การประกาศค่าคงที่ก็ดีเหมือนกัน...
เพราะว่า จะแก้ไขได้ง่าย(ประกาศอยู่ด้านบนทั้งหมด)
ไม่ต้องไปเลื่อนหาทีละประโยค ซึ่งเสียนานทีเดียว
และจะช่วยประหยัดหน่วยความจำในกรณีที่ใช้ซ้ำๆ กันหลายแห่ง
เช่น
uses
crt ;
begin
clrscr ;
write (' - - - - - - - -');
write (' - - - - - - - -');
write (' - - - - - - - -');
write (' - - - - - - - -');
readln ;
end.
ดูเผินๆ จะรู้สึกว่าโปรแกรมนี้ก็เขียนได้เรียบร้อยดี
แต่มีข้อเสียคือ หากต้องการจะเปลี่ยน ต้องเปลี่ยนถึง 4 บรรทัด
และมี ค่าคงที่ในรูปไม่มีตัวแปรอยู่ 4 ตัว
ซึ่งน่าเสียดายหน่วยความจำอยู่เหมือนกัน
ดังนั้นควรปรับปรุงดังนี้ครับ
uses
crt ;
const
line = ' - - - - - - - -';
begin
clrscr ;
write( line );
write( line );
write( line );
write( line );
readln ;
end.
โปรแกรมนี้เขียนได้เหมาะสมกว่า
เพราะว่า มีค่าคงที่อยู่เพียงตัวเดียว
และแก้ไขตัวที่ซ้ำกันทั้งหมด ได้ในบรรทัดเดียว
หากเขียนโดยไม่ประกาศเป็นค่าคงที่
และโปรแกรมที่มีความยาวมากกว่า 500 บรรทัด
จะทำให้เสียเวลาค้นหาข้อความเพื่อแก้ไขมากทีเดียว
การแก้ไขที่ตัวแปรค่าคงที่ จะทำให้มั่นใจได้ว่าทุกส่วน
ถูกแก้ไขไปได้ตรงกันทั้งหมด อีกด้วยครับ
( ผมเคยเขียนโปรแกรมยาวมาก และต้องการแก้ไขข้อความที่ซ้ำกัน
แทนที่จะใช้เวลาแก้ 2-3 นาที ต้องใช้เวลาค้น ถึง 10-15 นาที
เพราะไม่แน่ใจว่า ข้อความถูกแก้ครบทุกอันโดยเหมือนกันแล้วหรือไม่ )
|