1 / 73

418115: การเขียนโปรแกรมโครงสร้าง คำสั่ง while (1)

418115: การเขียนโปรแกรมโครงสร้าง คำสั่ง while (1). ประมุข ขันเงิน pramook@gmail.com. yes. โปรแกรมใน unix (และในระบบปฏิบัติการลูกหลาน เช่น linux และ Mac OS X) ตัวหนึ่ง การทำงาน พิมพ์ “y” บรรทัดละตัว ไปเรื่อยๆ ไม่รู้จบ จนกระทั่งมีใครสั่งฆ่า (kill) มัน

Download Presentation

418115: การเขียนโปรแกรมโครงสร้าง คำสั่ง while (1)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 418115: การเขียนโปรแกรมโครงสร้างคำสั่ง while (1) ประมุข ขันเงิน pramook@gmail.com

  2. yes • โปรแกรมใน unix(และในระบบปฏิบัติการลูกหลาน เช่น linux และ Mac OS X) ตัวหนึ่ง • การทำงาน • พิมพ์ “y” บรรทัดละตัว ไปเรื่อยๆ ไม่รู้จบ • จนกระทั่งมีใครสั่งฆ่า (kill) มัน • หรือถ้าส่งข้อมูลผ่าน pipe ก็จะทำไปเรื่อยๆ จนกระทั่ง pipe พัง (ท่อแตก) • ประโยชน์ • ใช้ทดสอบว่าเครื่องคอมพิวเตอร์สามารถรับงานหนักๆ ได้ไหม • ใช้ตอบคำถามของคำสั่งอื่นๆ แทนผู้ใช้

  3. yes > yes y y y y y y y y

  4. คำสั่ง while • ไวยากรณ์ while (นิพจน์ทางตรรกศาสตร์) คำสั่ง; • การทำงาน • เช็คว่านิพจน์ทางตรรกศาสตร์ว่าเป็นจริงหรือไม่ • ถ้าเป็นจริงให้ทำคำสั่งที่อยู่ใต้คำสั่ง while • หลังจากนั้นกลับไปเช็คใหม่ • กล่าวคือทำงานไปเรื่อยๆ จนกว่าเงื่อนไขจะเป็นเท็จ

  5. เขียน yes • ต้องการให้มันวนไปเรื่อยๆ ไม่รู้จบ • ฉะนั้นเงื่อนไขที่ใส่ต้องเป็นจริงเสมอ • อะไรจริงเสมอ?  อะไรก็ตามที่ไม่ใช่ 0 #include <stdio.h> intmain() { while(1) printf("y\n"); return0; }

  6. while และ Compound Statement • ถ้าต้องการให้การวนรอบแต่ละรอบมีการทำคำสั่งมากกว่าหนึ่งคำสั่งให้ใช้ compound statement แทน “คำสั่ง;” #include <stdio.h> intmain() { while(1) { printf("y"); printf("\n"); } return0; }

  7. คำสั่ง do • ไวยากรณ์ do { คำสั่ง 1; คำสั่ง 2; คำสั่ง 3; :} while (เงื่อนไข);

  8. คำสั่ง do • การทำงาน • ทำคำสั่งใน compound statement ทั้งหมด • แล้วไปเช็คเงื่อนไขที่อยู่ข้างล่าง • ถ้าเงื่อนไขเป็นจริงให้ย้อนไปทำคำสั่งใน compound statement ใหม่ • ทำงานไปเรื่อยๆ จนกว่าเงื่อนไขจะเป็นเท็จ • ข้อแตกต่างกับคำสั่ง while • คำสั่ง while เช็คก่อนทำ • คำสั่ง do ทำก่อนเช็ค

  9. เขียน yes ด้วยคำสั่ง do #include <stdio.h> intmain() { do { printf("y"); printf("\n"); }while(1); return0; }

  10. โปรแกรมหาค่าเฉลี่ยของชุดตัวเลขโปรแกรมหาค่าเฉลี่ยของชุดตัวเลข • ต้องการโปรแกรมสำหรับอ่านตัวเลขชุดหนึ่งมาจากผู้ใช้ • อ่านเลขเข้ามาทีละตัว • หลังจากอ่านให้ถามว่าต้องการป้อนข้อมูลต่อหรือไม่ • ถ้าใช้ก็ให้อ่านเข้ามาใหม่ • ถ้าไม่ใช่ก็ให้หยุดอ่าน • หลังจากนั้นบอกผู้ใช้ว่าป้อนตัวเลขเข้ามากี่ตัวแล้ว • แล้วหาค่าเฉลี่ยของเลขเหล่านั้น

  11. ตัวอย่างผลลัพธ์ 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.

  12. ตัวอย่างผลลัพธ์ 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.

  13. ออกแบบโปรแกรม • การหาค่าเฉลี่ย • ต้องหาผลบวกของจำนวนที่ผู้ใช้ให้มาทั้งหมด • ต้องนับจำนวนของเลขที่ผู้ใช้ให้มาทั้งหมด • เสร็จแล้วเอาผลบวกหารด้วยจำนวน • ตัวแปร • double sum; สำหรับเก็บผลบวก • int count; สำหรับเก็บจำนวน • ในลูปแต่ละรอบ • อ่านข้อมูลเข้าเก็บใส่ตัวแปร สมมติเป็น x • sum += x; • count++;

  14. ออกแบบโปรแกรม • หลังจากอ่านเลขจากผู้ใช้ ให้ถามผู้ใช้ว่าต้องการต่อหรือไม่ • สมมติว่าเราอ่านข้อมูลมาเก็บไว้ในตัวแปร choice • เราจะให้ลูปทำงานต่อไปก็ต่อเมื่อ choice == 1

  15. ลูป 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);

  16. ทั้งโปรแกรม #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; }

  17. โปรแกรมพิมพ์ 0 ถึง n-1 • ให้ผู้ใช้ป้อนจำนวนเต็ม n • โปรแกรมพิมพ์เลข 0ถึง n-1 ทีละตัว

  18. ตัวอย่างผลลัพธ์ Enter n: 5 0 1 2 3 4

  19. ตัวอย่างผลลัพธ์ Enter n: 10 0 1 2 3 4 5 6 7 8 9

  20. ตัวแปร counter • ในการเขียนลูปที่มีจำนวนครั้งการวนรอบคงที่ เรามักจะมีตัวแปรตัวหนึ่งบอกว่าลูปทำงานไปกี่ครั้งแล้ว • ตัวแปรพวกนี้มักจะเรียกว่าตัวแปร counter • ตัวแปร counter จะมีค่าเพิ่มขึ้นหนึ่ง ทุกครั้งที่ loop ทำงาน • Loop จะหยุดทำงานเมื่อตัวแปร counter มีค่าเท่ากับจำนวนครั้งที่เราต้องการ

  21. ลูป • ในกรณีนี้เราจะมีตัวแปร counter ตัวหนึ่งชื่อ i • ตอนแรก iมีค่าเท่ากับ 0 • ในแต่ละลูป • พิมพ์ i • เพิ่มค่า i • ลูปจะจบการทำงานก็ต่อเมื่อ iมีค่าเท่ากับ n • กล่าวคือมันจะทำงานไปเรื่อยๆ ตราบที่ i < n

  22. ลูป inti=0; while(i<n) { printf("%d\n",i); i++; }

  23. ทั้งโปรแกรม #include <stdio.h> intmain() { intn; printf("Enter n: "); scanf("%d",&n); inti=0; while(i<n) { printf("%d\n",i); i++; } return0; }

  24. แพทเทิร์น • สมมติว่าเราต้องการทำอะไรซ้ำๆ กัน n ครั้ง • สร้างตัวแปร counter สมมติว่าให้ชื่อ i • ตอนแรกให้ iมีค่าเท่ากับ 0 • สร้าง loop while โดยเช็คว่า i < n • ในลูปให้ทำสิ่งที่คุณต้องการ • เสร็จแล้วสั่ง i++

  25. แพทเทิร์น inti=0; while(i<n) { [ทำสิ่งที่ต้องการทำซ้ำ n ครั้ง] i++; }

  26. โปรแกรมพิมพ์สี่เหลี่ยมโปรแกรมพิมพ์สี่เหลี่ยม • ผู้ใช้กำหนดความยาวด้านของสี่เหลี่ยม: n • พิมพ์ตารางขนาด n คูณ n ที่ประกอบด้วยตัวอักษรดอกจัน (*) Enter n: 5 ***** ***** ***** ***** *****

  27. ตัวอย่างผลลัพธ์ Enter n: 9 ********* ********* ********* ********* ********* ********* ********* ********* *********

  28. ลูปซ้อนลูป • เราต้องการ: • ทำซ้ำ n รอบ โดยแต่ละรอบ • ต้องพิมพ์เครื่องหมายดอกจัน n รอบ • แล้วพิมพ์ \n

  29. ใช้แพทเทิร์น inti=0; while(i<n) { [พิมพ์ดอกจัน n ดอก] printf("\n"); i++; }

  30. ใช้แพทเทิร์น inti=0; while(i<n) { intj=0; while(j<n) { [พิมพ์ดอกจัน 1 ดอก] j++; } printf("\n"); i++; }

  31. ใช้แพทเทิร์น inti=0; while(i<n) { intj=0; while(j<n) { printf("*"); j++; } printf("\n"); i++; }

  32. ทั้งโปรแกรม #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; }

  33. โปรแกรมพิมพ์สามเหลี่ยมโปรแกรมพิมพ์สามเหลี่ยม • คราวนี้เอาแบบนี้บ้าง Enter n: 5 * ** *** **** *****

  34. ตัวอย่างผลลัพธ์ Enter n: 8 * ** *** **** ***** ****** ******* ********

  35. ออกแบบโปรแกรม • ทำซ้ำ n ครั้งเหมือนเดิม • แต่ในการทำซ้ำแต่ละครั้งต้องพิมพ์จำนวนดอกจันไม่เหมือนกัน • ครั้งที่ 1 พิมพ์ 1 ดวง • ครั้งที่ 2 พิมพ์ 2 ดวง • ครั้งที่ 3 พิมพ์ 3 ดวง • เราจะรู้ได้อย่างไรว่าตอนนี้เราอยู่ในการวนซ้ำครั้งที่เท่าใด? • ดูตัวแปร counter!

  36. ลูปโปรแกรมพิมพ์สี่เหลี่ยมลูปโปรแกรมพิมพ์สี่เหลี่ยม inti=0; while(i<n) { [พิมพ์ดอกจัน n ดอก] printf("\n"); i++; } • สังเกตว่า i+1 คือจำนวนครั้งที่เราทำซ้ำมาแล้ว

  37. ลูปโปรแกรมพิมพ์สี่เหลี่ยมลูปโปรแกรมพิมพ์สี่เหลี่ยม inti=0; while(i<n) { [พิมพ์ดอกจัน i+1 ดอก] printf("\n"); i++; }

  38. ลูปโปรแกรมพิมพ์สี่เหลี่ยมลูปโปรแกรมพิมพ์สี่เหลี่ยม inti=0; while(i<n) { intj=0; while(j<i+1) { printf("*"); j++; } printf("\n"); i++; }

  39. ทั้งโปรแกรม #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; }

  40. โปรแกรมพิมพ์สามเหลี่ยมอีกแบบโปรแกรมพิมพ์สามเหลี่ยมอีกแบบ • คราวนี้เอาแบบนี้บ้าง Enter n: 5 * ** *** **** *****

  41. ตัวอย่างผลลัพธ์ Enter n: 9 * ** *** **** ***** ****** ******* ******** *********

  42. ออกแบบโปรแกรม • ทำซ้ำ n รอบเหมือนเดิม • ในการทำซ้ำรอบที่ iเราต้อง • พิมพ์ดอกจัน i+1 ดอก (เหมือนกับโปรแกรมพิมพ์สามเหลี่ยม) • แต่ก่อนหน้าที่จะพิมพ์ดอกจันต้องพิมพ์ space ให้ดอกจันชิดขวา • เราต้องพิมพ์ space กี่ตัว? • ความจริงเราสร้างตารางขนาด n x n • แต่ละแถวมีตัวอักษร n ตัวพอดี • ฉะนั้นเมื่อมีดอกจัน i+1 ตัว เราต้องมี space ทั้งหมด n-1 ตัว

  43. ลูป inti=0; while(i<n) { [พิมพ์ spacen-i-1 ตัว] [พิมพ์ดอกจัน i+1 ดอก] printf("\n"); i++; }

  44. ลูป 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++; }

  45. โปรแกรมพิมพ์ปิระมิด • จำปิระมิดในแล็ปแรกได้ไหม? Enter n: 5 * * * * * * * * * * * * * * *

  46. ตัวอย่างผลลัพธ์ Enter n: 8 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

  47. สังเกต • ทุกบรรทัดจบด้วยดอกจันหนึ่งตัว • ถ้าเรานับข้อความ “* “ (ดอกจันตามด้วย space) เป็นตัวอักษรหนึ่งตัว เราพบว่าทุกบรรทัดจะมีตัวอักษรที่ไม่ใช่ดอกจันตัวสุดท้ายเท่ากับ n-1 ตัวพอดี

  48. สังเกต • กล่าวคือ • ในบรรทัดที่ 1(i = 0) • มี space n-1 ตัว • ตามด้วย “* “ 0 ตัว • ตามด้วยดอกจัน 1 ตัว • ในบรรทัดที่ 2 (i = 1) • มี space n-2 ตัว • ตามด้วย “* “ 1 ตัว • ตามด้วยดอกจัน 1 ตัว • ในบรรทัดที่ 3 (i = 2) • มี space n-3 ตัว • ตามด้วย “* “ 2 ตัว • ตามด้วยดอกจัน 1 ตัว

  49. สังเกต • ฉะนั้น • ในบรรทัดที่ i+1 • มี space n-i-1 ตัว • ตามด้วย “* “ iตัว • ตามด้วยดอกจัน 1 ตัว

  50. ลูป inti=0; while(i<n) { [พิมพ์ spacen-i-1 ตัว] [พิมพ์ข้อความ “* “ iครั้ง] printf(“*"); printf("\n"); i++; }

More Related