730 likes | 865 Views
418115: การเขียนโปรแกรมโครงสร้าง คำสั่ง while (1). ประมุข ขันเงิน pramook@gmail.com. yes. โปรแกรมใน unix (และในระบบปฏิบัติการลูกหลาน เช่น linux และ Mac OS X) ตัวหนึ่ง การทำงาน พิมพ์ “y” บรรทัดละตัว ไปเรื่อยๆ ไม่รู้จบ จนกระทั่งมีใครสั่งฆ่า (kill) มัน
E N D
418115: การเขียนโปรแกรมโครงสร้างคำสั่ง while (1) ประมุข ขันเงิน pramook@gmail.com
yes • โปรแกรมใน unix(และในระบบปฏิบัติการลูกหลาน เช่น linux และ Mac OS X) ตัวหนึ่ง • การทำงาน • พิมพ์ “y” บรรทัดละตัว ไปเรื่อยๆ ไม่รู้จบ • จนกระทั่งมีใครสั่งฆ่า (kill) มัน • หรือถ้าส่งข้อมูลผ่าน pipe ก็จะทำไปเรื่อยๆ จนกระทั่ง pipe พัง (ท่อแตก) • ประโยชน์ • ใช้ทดสอบว่าเครื่องคอมพิวเตอร์สามารถรับงานหนักๆ ได้ไหม • ใช้ตอบคำถามของคำสั่งอื่นๆ แทนผู้ใช้
yes > yes y y y y y y y y
คำสั่ง while • ไวยากรณ์ while (นิพจน์ทางตรรกศาสตร์) คำสั่ง; • การทำงาน • เช็คว่านิพจน์ทางตรรกศาสตร์ว่าเป็นจริงหรือไม่ • ถ้าเป็นจริงให้ทำคำสั่งที่อยู่ใต้คำสั่ง while • หลังจากนั้นกลับไปเช็คใหม่ • กล่าวคือทำงานไปเรื่อยๆ จนกว่าเงื่อนไขจะเป็นเท็จ
เขียน yes • ต้องการให้มันวนไปเรื่อยๆ ไม่รู้จบ • ฉะนั้นเงื่อนไขที่ใส่ต้องเป็นจริงเสมอ • อะไรจริงเสมอ? อะไรก็ตามที่ไม่ใช่ 0 #include <stdio.h> intmain() { while(1) printf("y\n"); return0; }
while และ Compound Statement • ถ้าต้องการให้การวนรอบแต่ละรอบมีการทำคำสั่งมากกว่าหนึ่งคำสั่งให้ใช้ compound statement แทน “คำสั่ง;” #include <stdio.h> intmain() { while(1) { printf("y"); printf("\n"); } return0; }
คำสั่ง do • ไวยากรณ์ do { คำสั่ง 1; คำสั่ง 2; คำสั่ง 3; :} while (เงื่อนไข);
คำสั่ง do • การทำงาน • ทำคำสั่งใน compound statement ทั้งหมด • แล้วไปเช็คเงื่อนไขที่อยู่ข้างล่าง • ถ้าเงื่อนไขเป็นจริงให้ย้อนไปทำคำสั่งใน compound statement ใหม่ • ทำงานไปเรื่อยๆ จนกว่าเงื่อนไขจะเป็นเท็จ • ข้อแตกต่างกับคำสั่ง while • คำสั่ง while เช็คก่อนทำ • คำสั่ง do ทำก่อนเช็ค
เขียน yes ด้วยคำสั่ง do #include <stdio.h> intmain() { do { printf("y"); printf("\n"); }while(1); return0; }
โปรแกรมหาค่าเฉลี่ยของชุดตัวเลขโปรแกรมหาค่าเฉลี่ยของชุดตัวเลข • ต้องการโปรแกรมสำหรับอ่านตัวเลขชุดหนึ่งมาจากผู้ใช้ • อ่านเลขเข้ามาทีละตัว • หลังจากอ่านให้ถามว่าต้องการป้อนข้อมูลต่อหรือไม่ • ถ้าใช้ก็ให้อ่านเข้ามาใหม่ • ถ้าไม่ใช่ก็ให้หยุดอ่าน • หลังจากนั้นบอกผู้ใช้ว่าป้อนตัวเลขเข้ามากี่ตัวแล้ว • แล้วหาค่าเฉลี่ยของเลขเหล่านั้น
ตัวอย่างผลลัพธ์ Enter a number: 10 Do you want to continue? (1=yes, 0=no): 1 Enter a number: 20 Do you want to continue? (1=yes, 0=no): 1 Enter a number: 60 Do you want to continue? (1=yes, 0=no): 0 You entered 3 number(s). The mean is 30.000000.
ตัวอย่างผลลัพธ์ Enter a number: 441.93 Do you want to continue? (1=yes, 0=no): 1 Enter a number: 841 Do you want to continue? (1=yes, 0=no): 1 Enter a number: 7.65 Do you want to continue? (1=yes, 0=no): 1 Enter a number: 28.28 Do you want to continue? (1=yes, 0=no): 1 Enter a number: -46.49 Do you want to continue? (1=yes, 0=no): 0 You entered 5 number(s). The mean is 322.062200.
ออกแบบโปรแกรม • การหาค่าเฉลี่ย • ต้องหาผลบวกของจำนวนที่ผู้ใช้ให้มาทั้งหมด • ต้องนับจำนวนของเลขที่ผู้ใช้ให้มาทั้งหมด • เสร็จแล้วเอาผลบวกหารด้วยจำนวน • ตัวแปร • double sum; สำหรับเก็บผลบวก • int count; สำหรับเก็บจำนวน • ในลูปแต่ละรอบ • อ่านข้อมูลเข้าเก็บใส่ตัวแปร สมมติเป็น x • sum += x; • count++;
ออกแบบโปรแกรม • หลังจากอ่านเลขจากผู้ใช้ ให้ถามผู้ใช้ว่าต้องการต่อหรือไม่ • สมมติว่าเราอ่านข้อมูลมาเก็บไว้ในตัวแปร choice • เราจะให้ลูปทำงานต่อไปก็ต่อเมื่อ choice == 1
ลูป do { doublex; printf("Enter a number: "); scanf("%lf",&x); sum+=x; count++; printf("Do you want to continue? (1=yes, 0=no): "); scanf("%d",&choice); }while(choice==1);
ทั้งโปรแกรม #include <stdio.h> intmain() { doublesum=0; intcount=0; intchoice; [ลูปของหน้าที่แล้ว] printf("You entered %d number(s).\n",count); printf("The mean is %lf.\n",sum/count); return0; }
โปรแกรมพิมพ์ 0 ถึง n-1 • ให้ผู้ใช้ป้อนจำนวนเต็ม n • โปรแกรมพิมพ์เลข 0ถึง n-1 ทีละตัว
ตัวอย่างผลลัพธ์ Enter n: 5 0 1 2 3 4
ตัวอย่างผลลัพธ์ Enter n: 10 0 1 2 3 4 5 6 7 8 9
ตัวแปร counter • ในการเขียนลูปที่มีจำนวนครั้งการวนรอบคงที่ เรามักจะมีตัวแปรตัวหนึ่งบอกว่าลูปทำงานไปกี่ครั้งแล้ว • ตัวแปรพวกนี้มักจะเรียกว่าตัวแปร counter • ตัวแปร counter จะมีค่าเพิ่มขึ้นหนึ่ง ทุกครั้งที่ loop ทำงาน • Loop จะหยุดทำงานเมื่อตัวแปร counter มีค่าเท่ากับจำนวนครั้งที่เราต้องการ
ลูป • ในกรณีนี้เราจะมีตัวแปร counter ตัวหนึ่งชื่อ i • ตอนแรก iมีค่าเท่ากับ 0 • ในแต่ละลูป • พิมพ์ i • เพิ่มค่า i • ลูปจะจบการทำงานก็ต่อเมื่อ iมีค่าเท่ากับ n • กล่าวคือมันจะทำงานไปเรื่อยๆ ตราบที่ i < n
ลูป inti=0; while(i<n) { printf("%d\n",i); i++; }
ทั้งโปรแกรม #include <stdio.h> intmain() { intn; printf("Enter n: "); scanf("%d",&n); inti=0; while(i<n) { printf("%d\n",i); i++; } return0; }
แพทเทิร์น • สมมติว่าเราต้องการทำอะไรซ้ำๆ กัน n ครั้ง • สร้างตัวแปร counter สมมติว่าให้ชื่อ i • ตอนแรกให้ iมีค่าเท่ากับ 0 • สร้าง loop while โดยเช็คว่า i < n • ในลูปให้ทำสิ่งที่คุณต้องการ • เสร็จแล้วสั่ง i++
แพทเทิร์น inti=0; while(i<n) { [ทำสิ่งที่ต้องการทำซ้ำ n ครั้ง] i++; }
โปรแกรมพิมพ์สี่เหลี่ยมโปรแกรมพิมพ์สี่เหลี่ยม • ผู้ใช้กำหนดความยาวด้านของสี่เหลี่ยม: n • พิมพ์ตารางขนาด n คูณ n ที่ประกอบด้วยตัวอักษรดอกจัน (*) Enter n: 5 ***** ***** ***** ***** *****
ตัวอย่างผลลัพธ์ Enter n: 9 ********* ********* ********* ********* ********* ********* ********* ********* *********
ลูปซ้อนลูป • เราต้องการ: • ทำซ้ำ n รอบ โดยแต่ละรอบ • ต้องพิมพ์เครื่องหมายดอกจัน n รอบ • แล้วพิมพ์ \n
ใช้แพทเทิร์น inti=0; while(i<n) { [พิมพ์ดอกจัน n ดอก] printf("\n"); i++; }
ใช้แพทเทิร์น inti=0; while(i<n) { intj=0; while(j<n) { [พิมพ์ดอกจัน 1 ดอก] j++; } printf("\n"); i++; }
ใช้แพทเทิร์น inti=0; while(i<n) { intj=0; while(j<n) { printf("*"); j++; } printf("\n"); i++; }
ทั้งโปรแกรม #include <stdio.h> intmain() { intn; printf("Enter n: "); scanf("%d",&n); inti=0; while(i<n){ intj=0; while(j<n){ printf("*"); j++; } printf("\n"); i++; } return0; }
โปรแกรมพิมพ์สามเหลี่ยมโปรแกรมพิมพ์สามเหลี่ยม • คราวนี้เอาแบบนี้บ้าง Enter n: 5 * ** *** **** *****
ตัวอย่างผลลัพธ์ Enter n: 8 * ** *** **** ***** ****** ******* ********
ออกแบบโปรแกรม • ทำซ้ำ n ครั้งเหมือนเดิม • แต่ในการทำซ้ำแต่ละครั้งต้องพิมพ์จำนวนดอกจันไม่เหมือนกัน • ครั้งที่ 1 พิมพ์ 1 ดวง • ครั้งที่ 2 พิมพ์ 2 ดวง • ครั้งที่ 3 พิมพ์ 3 ดวง • เราจะรู้ได้อย่างไรว่าตอนนี้เราอยู่ในการวนซ้ำครั้งที่เท่าใด? • ดูตัวแปร counter!
ลูปโปรแกรมพิมพ์สี่เหลี่ยมลูปโปรแกรมพิมพ์สี่เหลี่ยม inti=0; while(i<n) { [พิมพ์ดอกจัน n ดอก] printf("\n"); i++; } • สังเกตว่า i+1 คือจำนวนครั้งที่เราทำซ้ำมาแล้ว
ลูปโปรแกรมพิมพ์สี่เหลี่ยมลูปโปรแกรมพิมพ์สี่เหลี่ยม inti=0; while(i<n) { [พิมพ์ดอกจัน i+1 ดอก] printf("\n"); i++; }
ลูปโปรแกรมพิมพ์สี่เหลี่ยมลูปโปรแกรมพิมพ์สี่เหลี่ยม inti=0; while(i<n) { intj=0; while(j<i+1) { printf("*"); j++; } printf("\n"); i++; }
ทั้งโปรแกรม #include <stdio.h> intmain() { intn; printf("Enter n: "); scanf("%d",&n); inti=0; while(i<n){ intj=0; while(j<i+1){ printf("*"); j++; } printf("\n"); i++; } return0; }
โปรแกรมพิมพ์สามเหลี่ยมอีกแบบโปรแกรมพิมพ์สามเหลี่ยมอีกแบบ • คราวนี้เอาแบบนี้บ้าง Enter n: 5 * ** *** **** *****
ตัวอย่างผลลัพธ์ Enter n: 9 * ** *** **** ***** ****** ******* ******** *********
ออกแบบโปรแกรม • ทำซ้ำ n รอบเหมือนเดิม • ในการทำซ้ำรอบที่ iเราต้อง • พิมพ์ดอกจัน i+1 ดอก (เหมือนกับโปรแกรมพิมพ์สามเหลี่ยม) • แต่ก่อนหน้าที่จะพิมพ์ดอกจันต้องพิมพ์ space ให้ดอกจันชิดขวา • เราต้องพิมพ์ space กี่ตัว? • ความจริงเราสร้างตารางขนาด n x n • แต่ละแถวมีตัวอักษร n ตัวพอดี • ฉะนั้นเมื่อมีดอกจัน i+1 ตัว เราต้องมี space ทั้งหมด n-1 ตัว
ลูป inti=0; while(i<n) { [พิมพ์ spacen-i-1 ตัว] [พิมพ์ดอกจัน i+1 ดอก] printf("\n"); i++; }
ลูป inti=0; while(i<n) { intj=0; while(j<n-i-1){ printf(" "); j++; } j=0; while(j<i+1){ printf("*"); j++; } printf("\n"); i++; }
โปรแกรมพิมพ์ปิระมิด • จำปิระมิดในแล็ปแรกได้ไหม? Enter n: 5 * * * * * * * * * * * * * * *
ตัวอย่างผลลัพธ์ Enter n: 8 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
สังเกต • ทุกบรรทัดจบด้วยดอกจันหนึ่งตัว • ถ้าเรานับข้อความ “* “ (ดอกจันตามด้วย space) เป็นตัวอักษรหนึ่งตัว เราพบว่าทุกบรรทัดจะมีตัวอักษรที่ไม่ใช่ดอกจันตัวสุดท้ายเท่ากับ n-1 ตัวพอดี
สังเกต • กล่าวคือ • ในบรรทัดที่ 1(i = 0) • มี space n-1 ตัว • ตามด้วย “* “ 0 ตัว • ตามด้วยดอกจัน 1 ตัว • ในบรรทัดที่ 2 (i = 1) • มี space n-2 ตัว • ตามด้วย “* “ 1 ตัว • ตามด้วยดอกจัน 1 ตัว • ในบรรทัดที่ 3 (i = 2) • มี space n-3 ตัว • ตามด้วย “* “ 2 ตัว • ตามด้วยดอกจัน 1 ตัว
สังเกต • ฉะนั้น • ในบรรทัดที่ i+1 • มี space n-i-1 ตัว • ตามด้วย “* “ iตัว • ตามด้วยดอกจัน 1 ตัว
ลูป inti=0; while(i<n) { [พิมพ์ spacen-i-1 ตัว] [พิมพ์ข้อความ “* “ iครั้ง] printf(“*"); printf("\n"); i++; }