Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
56
บทท 8
โปรแกรมแบบวนซา (Loop)
นอกจากโปรแกรมแบบทางเลอกทนกเรยนไดเรยนมาแลวนนซงถอวาเปนหวใจสาคญของการเขยนโปรแกรม
แกปญหาตางๆ หวใจของการเขยนโปรแกรมอกรปแบบหนงทมความสาคญไมยงหยอนไปกวากน นนกคอโปรแกรม
แบบวนซ า (Loop) หรอโปรแกรมแบบทาซ า
การทางานแบบวนซ ากคอการทโปรแกรมสามารถทาตามคาสงใดๆ ไดมากกวา 1 ครง สมมตวาเราตองการ
แสดงคาวา “Hello” จานวน 3 ครง การเขยนโปรแกรมรปแบบเดมทเราไดเรยนมาแลวจะไดรหสคาสงดงน
Console.WriteLine("Hello"); Console.WriteLine("Hello"); Console.WriteLine("Hello");
จะเหนวาเราตองเขยนคาสงแบบเดยวกนถง 3 บรรทดจงจะไดผลลพธตามทเราตองการ ทนนกเรยนลองคด
ตอไปอกวา ถาหากวาเราตองการแสดงคานจานวน 1,000,000 ครง เราจะตองเขยนรหสคาสงอกกบรรทด... ถกตองแลว
ครบ นนคอเราจะตองเขยนรหสคาสงอก 1,000,000 บรรทด ถาเปนแบบนการเขยนโปรแกรมกคงจะยงยากนาด
จากปญหาดงกลาวผพฒนาโปรแกรมภาษาทกภาษาจงไดพฒนาโปรแกรมแบบวนซ ามาเพอใหการเขยน
โปรแกรมมความกระชบ สน และมประสทธภาพ การเขยนโปรแกรมเพอแสดงคาวา “Hello” จะกลานครงกไมใช
ปญหาอกตอไป นกเรยนลองดรหสคาสงสาหรบการแสดงคาวา “Hello” จานวน 3 บรรทด ดงตอไปน
for (int i = 1; i <= 3; i++) { Console.WriteLine("Hello"); }
และรหสคาสงสาหรบการแสดงผลคาวา “Hello” จานวน 1,000,000 บรรทด
for (int i = 1; i <= 1000000; i++) { Console.WriteLine("Hello"); }
จะเหนวาความยาวของรหสคาสงยงเทาเดม นแหละคอประโยชนของโปรแกรมแบบวนซ า
คาสงโปรแกรมแบบวนซา
โปรแกรมภาษา C# ไดเตรยมคาสงทใชในการเขยนโปรแกรมแบบวนซ าไวหลายคาสงดวยกน เพอใหผเขยน
โปรแกรมสามารถนาไปใชแกปญหาทเหมอนหรอแตกตางกน ขนอยกบผเขยนโปรแกรมจะเลอกใช ไดแก (1) คาสง
for (2) คาสง while (3) คาสง do while และ (4) คาสง foreach
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
57
1. คาสง for
นกเรยนดตวอยางรหสคาสงตอไปน ซงเปนคาสงสาหรบการแสดงตวเลข 1-3 โดยใชคาสง for
for (int i = 1; i <= 3; i++) { Console.WriteLine(i); //คาสงในบลอกของ for } Console.ReadKey(); Output: 1 2 3
คาอธบาย:
for (int i = 1; i <= 3; i++)
คาสง for ประกอบไปดวย 3 นพจนทวางไวในวงเลบ ดงน
พจนท 1 (int i = 1) เปนการประกาศตวแปรเพอกาหนดคาเรมตนของการนบจานวนรอบในทนเรมนบจาก 1
พจนท 2 (i <= 3) เปนเงอนไขของการวนซ า ตราบใดทเงอนไขยงเปนจรงอยโปรแกรมจะทางานตามคาสง ท
อยในบลอกของ for ไปเรอยๆ (ถาคาของ i ยงไมมากกวา 3) ในทนมเพยง 1 คาสงคอ Console.WriteLine(i);
พจนท 3 (i++ หมายถง i=i+1) เปนการเพมหรอลดคาของตวแปรทใชในการวน ในทนเปนการเพมคาทละ 1
ตอการวนซ า 1 รอบ
Console.WriteLine(i); //คาสงในบลอกของ for
คาสงนเปนการแสดงคาของตวแปร i ใน 1 รอบจะแสดงคา i 1 ครง แตเนองจากคาของ i มการเพมขนทละ 1
ดงนนจงเปนการแสดงตวเลข 1-3 นนเอง
หมายเหต:
การเพมคาของ i ไมจาเปนตองเพมทละ 1 เสมอไป อาจเพมทละสองกได โดยใชนพจน i=i+2 หรอ i+=2
แทน i++ ตวอยางเชน เราตองการแสดงเลข 1-10 แตแสดงเฉพาะเลขค เราสามารถเขยนโปรแกรมไดดงน
for (int i = 2; i <= 10; i=i+2) { Console.WriteLine(i); } Console.ReadKey(); Output: 2 4 6 8 10
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
58
แนวทางการประยกตใชคาสง for
คาสง for สามารถนาไปประยกตใชในการเขยนโปรแกรมไดหลากหลาย แตจะเหมาะสมกบการวนซ าทม
จานวนรอบทแนนอน หมายความวาผเขยนโปรแกรมรแลววาจะใหโปรแกรมทางานกรอบ มกจะเลอกใชคาสงวนซ า
for เพราะจะทาใหโปรแกรมสนและกระชบทสด
การใชคาสง for แกปญหาเรองจานวนเฉพาะ
ตวอยางตอไปนเปนโปรแกรมตรวจสอบตวเลขจานวนเตมวาเปนจานวนเฉพาะหรอไม วกพเดย ใหคานยาม
ของจานวนเฉพาะวา จานวนเฉพาะ (prime number) คอ จานวนธรรมชาตทมตวหารทเปนบวกอย 2 ตว คอ 1 กบตวมน
เอง สาหรบเลข 1 ไมถอวาเปนจานวนเฉพาะตามนยาม สาหรบจานวนธรรมชาตหมายถงจานวนเตมบวกหรอจานวน
นบ จากนยามดงกลาวเราจงใชหลกการวเคราะหเพอนาเขาสการเขยนโปรแกรม ดงน
วธคดกอนการเขยนโปรแกรม
1.จานวนเฉพาะไมมจานวนนบใดหารมนลงตวยกเวน 1 และตวมนเองเทานน ดงนนถาจะตรวจสอบวา N เปน
จานวนเฉพาะหรอไม ตองนาตวเลขตงแต 2 ขนไป จนถงตวท N-1 ไปหาร ถาไมมตวใดหาร N ไดลงตวเลย แสดงวา N
เปนจานวนเฉพาะ
2.กาหนดตวแปรชอ PrimeNumber เปนชนด bool ขนมา 1 ตวเพอเกบคา true ในกรณทเปนจานวนเฉพาะ
หรอ false ในกรณทไมใชจานวนเฉพาะ
3.กาหนดตวแปรขนมา 1 ตว ชอ N เปนชนด int ใชแทนตวเลขทตองการหาวาเปนจานวนเฉพาะหรอไม
4.ใชคาสง for วนซ าโดยใหตวแปร i มคาเปน 2,3,4,…,ไปจนถงตวท N-1 ไปหาร N เพอตรวจสอบวาหารลงตว
หรอไม
5.ในขณะทวนซ า ใชเงอนไข if (N % i = = 0) ตรวจสอบวาหารลงตวหรอไม ถารอบใดพบวามการหารลงตว
แสดงวา N ไมใชจานวนเฉพาะ ใหแปร PrimeNumber = false แลวกระโดดออกจากการวนซ าทนท โดยไมจาเปนตอง
วนซ าไปจนถงตวหารท N -1 ตามทกาหนดไว
6.เมอออกจากการวนซ าแลวตรวจสอบวา PrimeNumber = true หรอไม ถาใชแสดงขอความวาเปนจานวน
เฉพาะ ถาไมใชกแสดงขอความวาไมใชจานวนเฉพาะ
7.นาวธคดไปเขยนผงงานไดดงหนาตอไป
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
59
นาผงงานไปเขยนโปรแกรม ไดดงน
ตวอยางท 1
โปรแกรมตรวจสอบจานวนเฉพาะ
bool PrimeNumber = true; Console.Write("Enter a number:"); int N = int.Parse(Console.ReadLine()); for (int i = 2; i < N; i++) { if (N % i == 0) { PrimeNumber = false; break; //กระโดดออกไปทางานหลงคาสง for } } if (PrimeNumber==true) Console.WriteLine("Number {0} is prime number.", N); else Console.WriteLine("Number {0} is not prime number.", N); Console.ReadKey();
start
bool PrimeNumber=true
int N
i < N
N % i == 0
PrimeNumber = false
PrimeNumber=true
N เปนจานวนเฉพาะ
N ไมเปนจานวนเฉพาะ
เพมคา i อก 1
end
yes
no
yes
no
yes
no
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
60
Output: Enter a number: 38701 Number 38701 is not prime number.
Enter a number: 56711 Number 56711 is prime number.
ขอควรร: 1.คาสง break เปนคาสงททาใหออกจากการวนซ าทนท ดงนนคาสงทอยถดจากคาสง break จะไมถกกระทา
2.คาสง continue เปนคาสงททาใหขนไปวนซ ารอบถดไปทนท ดงนนคาสงทอยถดจากคาสง continue จะ
ไมถกกระทา
ตวอยางโปรแกรมวนซาทเรยกใชคาสง continue
โปรแกรมนเปนโปรแกรมแสดงเฉพาะค เหมอนตวอยางทนาเสนอมาแลวขางตน แตเปลยนรปแบบการใช
คาสงใหม แตผลลพธยงคงเหมอนเดม ดงน
โปรแกรมเดม โปรแกรมใหม
for (int i = 2; i <= 10; i=i+2) { Console.WriteLine(i); } Console.ReadKey(); Output: 2 4 6 8 10
คาอธบาย: สาหรบโปรแกรมใหมนน ทกครงท i/2 ไมลงตว หมายถงเปนเลขค จะทาใหเงอนไข if (i%2 != 0) เปนจรง ก
จะไปทาตามคาสง continue ซงกจะสงใหโปรแกรมกระโดดขนไปวนรอบตอไปทนท ทาใหคาสงทอยตอจากคาสง
continue คอคาสง Console.WriteLine(i); กจะไมถกกระทา เลขคจงไมถกแสดงออกมา
for (int i = 1; i <= 10; i++) { if (i%2 != 0) continue ; //ขนไปเชครอบถดไปเลย Console.WriteLine(i); } Console.ReadKey();
นกเรยน: แหม..! คาสง for น เยยมไปเลยนะคะคณคร
หนอยากเขยนโปรแกรมแลวละ..
คร : ดคาสงวนซ าตวอนๆ กอนดไหม...
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
61
ตวอยางการเขยนโปรแกรมแกโจทยปญหา
ผงสายพนธหนงประกอบดวย นางพญา ผงงาน และผงทหาร การเจรญพนธเตมวยของผงในสายพนธน มระยะเวลาหนงป เมอผสมพนธแลวผงทหารหนงตวสามารถใหกาเนดลกเปนผงงานไดเพยงหนงตว สวนผงงานหนงตวสามารถใหกาเนดลกไดสองตวเปนผงงานและผงทหารอยางละหนงตว เมอใหกาเนดลกผงแลว ผงงานและผงทหารทเปนผใหกาเนดจะตายไป สาหรบนางพญาสามารถใหกาเนดลกเปนผงงานไดเพยงหนงตว และมชวตอยตลอดไปไมมวนตาย
ในทานองเดยวกนกบผงรนกอน ผงทเกดใหมเมอมอายไดหนงปจะเจรญพนธเตมวย มการผสมพนธ และใหกาเนดลกผงรนตอไปตามกฎในยอหนาแรก และสาหรบนางพญาเมอใหกาเนดลกผงครบหนงปแลว สามารถผสมพนธและใหกาเนดลกผงไดเชนเดยวกน
กาหนดใหผงรงหนงเรมตนดวยนางพญาหนงตว และผงงานอกหนงตว ดงนนเมอส นปแรก (นบเปนปทหนง)ผงรงนจะมนางพญาจานวนหนงตว, ผงงาน (ทเกดจากนางพญา) จานวนหนงตว, ผงทหารและผงงาน อยางละหนงตว (ทเกดจากผงงานในรนกอน ซงเมอใหกาเนดลกผงแลวตายไป) รวมเปนผงในรงทงส น 4 ตว และโดยวธการเดยวกนในปทสองผงรงนจะประกอบดวยนางพญาจานวนหนงตว ผงทหารจานวนสองตว และผงงานจานวนสตว รวมเปนผงในรงทงส น 7 ตว
จงเขยนโปรแกรมเพอคานวณจานวนผงงานและผงทงหมดในรงของแตละปทกาหนด ขอมลนาเขา
ขอมลนาเขามเพยงบรรทดเดยว ประกอบดวยจานวนเตมตงแตสองจานวนขนไป โดยจานวนแรกจนถงจานวนรองสดทาย เปนจานวนเตมบวกแทนปทตองการคานวณหาจานวนผงในรง คาสดทายเปน -1 ซงใชเปนรหสปดทายขอมล โดยมรายละเอยดดงน
1. จานวนปทตองการคานวณมคาไดตงแต 1 ถง 24 จานวน 2. คาตวเลขของปในขอ 1. เปนตวเลขทไมซากน และมคาไดตงแต 1 ถง 24 3. รหส ปดทายขอมล (sentinel) มคาเปน -1 เสมอใชแสดงวาขอมลทตองทาการประมวลผลหมดแลว ใหเลกทางาน
และไมตองประมวลผลคาน 4. ขอมลแตละจานวนแยกจากกนดวยเครองหมายเวนวรรคจานวน 1 วรรค
ขอมลสงออก
จานวนบรรทดของผลลพธมจานวนเทากบจานวนปทเปนขอมลนาเขา โดยผลลพธในแตละบรรทดมสองคา ไดแก 1. คาแรกเปนจานวนของผงงาน 2. คาทสองเปนจานวนของผงทงหมดในรง 3. ระหวางคาแรกและคาทสองใหคนดวยเวนวรรคจานวน 1 วรรค
ทมา: การแขงขนคอมพวเตอรโอลมปก สอวน. ครงท 2 มหาวทยาลยบรพา
ตวอยางขอมลนาเขา ตวอยางขอมลสงออก
1 3
2 4 7 12
(โจทยปรบปรงมาจาก ww.programming.in.th)
จากโจทยปญหาทนามาดงกลาว จดทาขนเพอใหเขยนโปรแกรมดวยโปรแกรมภาษา C++ ดงนนครจะนาโจทย
มาประยกตใชในโปรแกรมภาษา C# แตกอนอนนกเรยนศกษาวธคดของคร กอนเขยนโปรแกรม ดงตอไปน
แบบฝกทกษะท 8.1 เรอง คาสงวนซา for
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
62
วธคด
ขนท 1. เขยนเปนแผนภาพแสดงความสมพนธของจานวนผงแตละป
คาเรมตน ปท 1 ปท2 ปท 3
นางพญา งาน งาน งาน
ทหาร ทหาร งาน
นางพญา งาน งาน ทหาร นางพญา งาน นางพญา งาน งาน งาน งาน ทหาร ทหาร
ทหาร งาน งาน งาน ทหาร
ขนท 2. ดอตราการเพมแตละปเพอกาหนดสมการการเพมของผงแตละตว
ปท 1 เพม ปท 2 เพม ปท 3 สมการทได
นางพญา (bee1) 1 0 1 0 1 bee1=1
งาน (bee2) 2 2 4 3 7 bee2=bee2+YearNumber
ทหาร (bee3) 1 1 2 2 4 bee3=bee3+(YearNuber-1) //bee1=ผงนางพญา, bee2=ผงงาน, bee3=ผงทหาร int bee1 = 1, bee2 = 2, bee3 = 1; //กาหนดคาเรมตนจากปท 1 Console.Write("Enter year that you want to know: "); int YearAll = int.Parse(Console.ReadLine()); for (int YearNumber = 2; YearNumber <= YearAll; YearNumber++) //เรมหาปท 2 ขนไป { // bee1 = 1; ไมตองคานวณเพราะไมวาปใดจะมคาเทากบ 1 เสมอ bee2 = bee2+YearNumber; bee3 = bee3+(YearNumber-1); } Console.WriteLine("Bee2={0} Bee all={1}", bee2, (bee1 + bee2 + bee3) ); Console.ReadKey(); Output: Enter year that you want to know: 2 Bee2=4 Bee all=7
Enter year that you want to know: 3 Bee2=7 Bee all=12
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
63
คาชแจง: ใหนกเรยนเลอกทาโจทยขอใดขอหนงตอไปนเพยง 1 ขอเทานน
1.ใหนกเรยนเขยนโปรแกรมแสดงสตรคณโดยรบขอมลแมทตองการ และใหแสดงการคณตงแต 1 ถง 12 (7 คะแนน)
ตวอยาง: Input: N = 2 Output: 2 x 1 = 2 2 x 2 = 4 … 2 x 12 = 24
2.ใหนกเรยนเขยนรหสคาสงของโปรแกรมแสดงจานวนเฉพาะ ทอยในชวงตวเลขตงแต N1 ถง N2 และแสดงผลการ
นบจานวนเฉพาะทมอยในชวงทงหมด (10 คะแนน)
ตวอยาง: Input: N1 = 1 Output: 2 N2 = 10 3 5 7 Counter = 4
3.ใหนกเรยนใชคาสงวนซ าเขยนโปรแกรมหาจานวนเงนทงสนตามระยะปทตองการ จากการกเงนแบบดอกเบยทบตน
โดยรบขอมลเงนตน อตราดอกเบยรอยละตอป และปทตองการทราบจานวนเงน (10 คะแนน)
ตวอยาง: Input: Enter the capital : 1000 Output: Amount = 1210.00 Enter the interest rate : 10 Enter sum of the year: 2
นกเรยนเลอกทาขอท.........วธคดกอนเขยนโปรแกรมมดงน
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
64
รหสคาสงของโปรแกรมทนกเรยนเลอกทา มดงน
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
65
2. คาสง while
หลกการทางานของคาสง while คลายกบคาสง for แตแตกตางกนตรงในวงเลบของ while มเพยงนพจนเดยวท
เปนเงอนไขของการวนซ าเทานน นกเรยนดตวอยางรหสคาสงตอไปน ซงเปนคาสงสาหรบการแสดงตวเลข 1-3
int i = 1; เปรยบเทยบกบคาสง for
while (i<= 3) { Console.WriteLine(i); i++; } Console.ReadKey(); Output: 1 2 3
คาอธบาย:
โปรแกรมจะเรมตรวจสอบเงอนไขกอน ถาเงอนไขเปนจรง โปรแกรมกจะทาคาสงทอยในบลอกของ while
แลวจะวนขนไปตรวจสอบเงอนไขใหม ทาอยางนไปเรอยๆ จนกวาเงอนไขจะเปนเทจ (เมอ i =4) จงจะจบการวนซ า
แนวทางการประยกตใชคาสง while
ในใบความรท 7 ทผานมาเราไดออกแบบผงงานการหาคาเฉลยของผลการเรยน เราจะนาผงงานนนมาเขยนเปน
โปแกรมโดยใชคาสง while ไดดงน
ตวอยางท 2
โปรแกรมหาผลการเรยนเฉลย
double sum1 = 0, sum2 = 0; byte i = 1;
Console.Write("How many your subjects? "); byte number = byte.Parse(Console.ReadLine());
while (i <= number) { Console.Write("No.{0} unit:", i); double unit = double.Parse(Console.ReadLine()); Console.Write(" grade:", i); double grade = double.Parse(Console.ReadLine());
sum1=sum1+(unit*grade); sum2 = sum2 + unit; i++; } double average = sum1 / sum2; Console.WriteLine("Average = {0:F2}", average); Console.ReadKey();
for (int i = 1; i <= 3; i++) { Console.WriteLine(i); } Console.ReadKey();
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
66
Output: How many your subjects? 3 No. 1 unit : 1 grade : 4 No.2 unit : 1.5 grade : 3.5 No.3 unit : 1 grade : 3.5 Average = 3.64
จรงๆ แลวโปรแกรมการหาคาเฉลยของผลการเรยนทผานมา เราสามารถใชคาสง for ไดเชนกน แต
ความสามารถของคาสง while อกรปแบบหนงทสามารถนามาประยกตใชไดกคอ การสงใหโปรแกรมวนซ าแบบไมร
จบโดยใชเงอนไขแบบ while (true) จะใหโปรแกรมจะหลดออกจากการทาซ าตองใชคาสง break เทานน
ตวอยางโปรแกรม เกมทายตวเลข ตอไปน ซงโปรแกรมจะสมตวเลขทอยระหวาง 1-100 มา 1 ตว แลวใหผเลน
สลบกนทายวาเปนตวเลขใดไปเรอยๆ จนกวาจะมผททายถกตองจงจะจบโปรแกรม (นกเรยนคดลอกโปรแกรมแลว
ทดลองเลนเกมกบเพอน)
ตวอยางท 3
โปรแกรมเกมทายตวเลข
Random ran = new Random(); int number = ran.Next(1, 100); //สมตวเลขทอยในชวง 1-100 while (true) { Console.Write("Please enter a number :"); int YourNumber = int.Parse(Console.ReadLine()); if (YourNumber == number) { Console.WriteLine("Correct, you are win."); break; } else if (YourNumber > number) Console.WriteLine("Wrong! It's more."); else Console.WriteLine("Wrong! It's less."); } Console.ReadKey();
Output: Please enter a number :39 Wrong! It's less. Please enter a number :60 Wrong! It's less. Please enter a number :90 Wrong! It's more.. Please enter a number :80 Wrong! It's more.. Please enter a number :75 Wrong! It's more.. Please enter a number :70 Wrong! It's less. Please enter a number :73 Wrong! It's more.. Please enter a number :72 Correct, you are win.
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
67
ใหนกเรยนเลอกทาโจทยขอใดขอหนงตอไปนเพยง 1 ขอเทานน
1.ใหนกเรยนเขยนโปรแกรมเกมทายลกเตาโดยรบขอมลตวเลขระหวาง 1-6 แลวแสดงผลการสมตวเลขของลกเตา
(เหมอนการโยนลกเตาทไมรวาจะออกตวใดแน) พรอมกบแจงใหทราบวาทายถกหรอทายผด จากนนวนซ ากลบไปเรม
เลนเกมใหมไดเรอยๆ จนกวาจะปอนตวเลขเปน 0 จงจะจบโปรแกรม (5 คะแนน)
ตวอยาง: Input: You choose number= 3 Output: You wrong guess. Number of dice is 2
Input: You choose number= 5 Output: You correct guess. Number of dice is 5
2.ใหนกเรยนเขยนโปรแกรมวนซ ารบขอมลปเรมตน และรายไดประจาปยอนหลง 10 ป แลวรายงานขอมลปทมรายได
เพมจากปกอนหนามากทสดและปทมรายไดลดลงจากปกอนหนามากทสด (7 คะแนน)
ตวอยาง: Input: Start year=2001 Output: Up yaer 2003 Year 2001=25090000 Down year 2008 Year 2002=23000000 Year 2003=25507000 … Year 2010=21090000
3.ใหนกเรยนเขยนโปรแกรมคดเลอกชายทมรปรางดทสด โดยวนซ ารบขอมลนาหนกและสวนสงไปเรอยๆ จนกวาจะ
พบคนทมสวนสงอยระหวาง 175-185 และมผลตางระหวางสวนสงและนาหนกเทากบ 100 พอด คนนนจะไดรบการ
คดเลอก ใหจบการวนซ าและรายงานผลดงนคอ แสดงเลขลาดบ ของคนทไดรบการคดเลอก คนทอวนทสด และคนท
ผอมทสด (10 คะแนน)
ตวอยาง: Input: No.1 Weight=62 Output: Great man is number 8 Height=170 Fat man is number 5 No.2 Weight=70 Thin man is number 1 Height=164 … No.8 Weight=78 Height=178
นกเรยนเลอกทาขอท.........วธคดกอนเขยนโปรแกรมมดงน
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
แบบฝกทกษะท 8.2 เรอง คาสงวนซา while
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
68
รหสคาสงของโปรแกรมทนกเรยนเลอกทา มดงน
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
69
3. คาสง do while
หลกการทางานของคาสง do while แตกตางจากคาสง for และคาสง while ตรงทคาสง do while จะมการทา
คาสงทอยในบลอกของ do while กอน 1 รอบ แลวจงตรวจสอบเงอนไข และกจะวนทาซ าไปเรอยๆ ตราบใดทเงอนไข
ยงเปนจรงอย แตเมอใดทเงอนไขเปนเทจกจะหลดออกจากการทาซ าทนทเหมอนคาสง for และ while นกเรยนด
ตวอยางรหสคาสงตอไปน ซงเปนคาสงสาหรบการแสดงตวเลข 1-3
เปรยบเทยบคาสง while เปรยบเทยบคาสง for
int i = 1; do { Console.WriteLine(i); i++; } while (i <= 3); Console.ReadKey(); Output: 1 2 3
แนวทางประยกตใชคาสง do while
เราจะนาคาสง do while มาใชในการเขยนโปรแกรมหาคาสงสดและคาตาสดจากชดตวเลขทเราปอนเขาไป
โปรแกรมจะรบคาตวเลขไปเรอยๆ และใชคาสง if เปรยบเทยบหาคาสงสดและตาสด เกบไวทตวแปร max และ min
ตามลาดบ แตถาเราปอนตวเลขเปน 0 (ไมนา 0 ไปเปรยบเทยบ) จะจบการทาซ าทนทพรอมแสดงคา max และ min
ตวอยางท 4
โปรแกรมหาคาสงสดตาสด
int num, max = 0, min = 1000000;
do { Console.Write("Please enter a number:"); num = int.Parse(Console.ReadLine());
if (num > max && num != 0) max = num;
if (num < min && num != 0) min = num;
} while (num != 0);
Console.WriteLine("Max = {0}", max); Console.WriteLine("Min = {0}", min); Console.ReadKey();
for (int i = 1; i <= 3; i++) { Console.WriteLine(i); } Console.ReadKey();
int i = 1; while (i<= 3) { Console.WriteLine(i); i++; }
Output: Please enter a number:4 Please enter a number:8 Please enter a number:1 Please enter a number:9 Please enter a number:3 Please enter a number:0 Max = 9 Min = 1
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
70
ใหนกเรยนเลอกทาโจทยขอใดขอหนงตอไปนเพยง 1 ขอเทานน
1.ใหนกเรยนเขยนโปรแกรมวนซ ารบขอมลตวเลขไปเรอยๆ จนกวาจะรบขอมลเปนเลขรหสปดทายคอ -1 ใหจบการวน
ซ าและแสดงคาเฉลยของตวเลขทงหมด ทงนไมนบรวมเลขรหสปดทาย -1 (5 คะแนน)
ตวอยาง: Input: Number=6 Output: Average=9.67 Number=8 Number=15 Number=-1
2.ใหนกเรยนเขยนโปรแกรมหาผลบวกตงแต N1 ถง N2 โดยใชคาสง if กาหนดทางเลอก 3 ทางดงน (7 คะแนน)
1. บวกทงหมด 2. บวกเฉพาะเลขคเทานน 3. บวกเฉพาะเลขคเทานน
ตวอยาง: Input: Choice = 3 Output: sum = 9 N1=1 N2=5
3.ใหนกเรยนเขยนโปรแกรมวนซ ารบรหสประจาตวของผเขาสอบ และคะแนนจากการสอบ 3 วชาเรยงลาดบดงน
Thai, Math และ Science แตละวชาจะมคะแนนเตม 100 คะแนน ขณะรบขอมลคะแนน ถาพบวาวชาใดมคะแนนไมถง
50 คะแนน ไมตองรบคะแนนวชาทเหลอใหแสดงผลลพธวา “Sorry! <รหส> you don’t pass.” แลวออกจากการวนซ า
แตถาไดคะแนนเกน 50 คะแนนทกวชา ใหแสดงผลลพธวา “Excellent! <รหส> you pass.” พรอมแสดงชอวชาและ
คะแนนของวชาทสอบไดคะแนนสงสด (10 คะแนน)
ตวอยาง: Input: Enter student ID: 12002 Output: Sorry! 12002 You don’t pass. The score of Thai:45
Input: Enter student ID: 12042 Output: Excellent! 12042 you pass. The score of Thai: 78 Top score is Math to 91. The score of Math: 91 The score of Science: 65
นกเรยนเลอกทาขอท.........วธคดกอนเขยนโปรแกรมมดงน
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
แบบฝกทกษะท 8.3 เรอง คาสงวนซา do while
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
71
รหสคาสงของโปรแกรมทนกเรยนเลอกทา มดงน
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
72
4. คาสง foreach
หลกการทางานของคาสง foreach แตกตางจากคาสงวนซ าทงสามตวทกลาวมา กลาวคอคาสง foreach เปน
คาสงทใชสาหรบการวนซ าทมจานวนรอบอตโนมตตามจานวนสมาชกของขอมลใดขอมลหนง เชน จานวนสมาชกใน
ตวแปรชด (Array) จานวนไฟลทอยในโฟลเดอร จานวนตวอกขระในสตรง เปนตน
ตวอยางตอไปนจะใหโปรแกรมแสดงสมาชกทงหมดทอยในตวแปรชด numbers
int[] numbers = {0, 1, 2, 3}; foreach (int element in numbers) { System.Console.WriteLine(element); } Console.ReadKey();
Output: 0 1 2 3
จากนนเราลองเพมสมาชกลงไปโดยทเราไมตองเปลยนคาสงของ foreach เลยโปรแกรมกยงสามารถแสดง
สมาชกทมอยไดท งหมด
int[] numbers = {0, 1, 2, 3, 5, 8, 13}; foreach (int element in numbers) { System.Console.WriteLine(element); } Console.ReadKey();
Output: 0 1 2 3 5 8 13
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
73
การนาคาสง foreach มาแกโจทยปญหา
โปรแกรมตอไปนเปนการใชคาสง foreach ในการแสดงชอไฟลในโฟลเดอร ซงเราสามารถกาหนดโฟลเดอร
หรอชนดของไฟลทเราตองการแสดงได ดงตวอยางตอไปน
ตวอยางท 5
โปรแกรมแสดงชอไฟลในโฟลเดอร
using System; using System.IO; //เราตองเพม namespace นจงจะใชงานเกยวกบไฟลได
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string[] filePaths = Directory.GetFiles(@"c:\Temp\"); foreach (string FilesName in filePaths) { System.Console.WriteLine(FilesName); } Console.ReadKey(); } } }
Output: c:\Temp\debug.txt c:\temp\nuw file Icon.jpg c:\temp\Penguins.docx c:\temp\the Miz.docx
ถาตองการเลอกแสดงเฉพาะชนดไฟลทตองการ ใหเปลยนอารกวเมนทของเมธอด GetFiles() ดงน
string[] filePaths = Directory.GetFiles(@"c:\Temp\","*.jpg"); Output: c:\temp\nuw file Icon.jpg
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
74
ตวอยางท 6
โปรแกรมนบจานวนตวอกขระ
โจทย: จงเขยนโปรแกรมเพอรบขอความและรายงาน จานวนอกขระทเปนตวเลข (0-9) จานวนอกขระภาษาองกฤษ
พมพใหญ (A-Z) จานวนอกขระภาษาองกฤษพมพเลก (a-z) และจานวนอกขระทเหลออนๆ (ไมรวมชองวาง)
Console.Write("Enter a string:"); string str = Console.ReadLine(); int cntDigit = 0, cntUpper = 0, cntLower = 0, cntOther = 0; foreach (char chr in str) { if (chr >= '0' && chr <= '9') cntDigit++; else if (chr >= 'A' && chr <= 'Z') cntUpper++; else if (chr >= 'a' && chr <= 'z') cntLower++; else if (chr !=' ') cntOther++; } Console.WriteLine("There are {0} digits.", cntDigit); Console.WriteLine("There are {0} uppercase.", cntUpper); Console.WriteLine("There are {0} lowercase.", cntLower); Console.WriteLine("There are {0} other characters.", cntOther); Console.ReadKey(); Output: Enter a string: Suteerat Thipaksorn Tel. 083-797-5558 There are 10 digits. There are 3 uppercase. There are 18 lowercase. There are 3 other characters.
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
75
ใหนกเรยนเลอกทาโจทยขอใดขอหนงตอไปนเพยง 1 ขอเทานน
1.จงเขยนโปรแกรมเพอรบขอความ แลวเปลยนอกขระภาษาองกฤษพมพใหญ (A-Z) ใหเปนตวพมพเลก และเปลยน
ตวพมพเลก (a-z) ใหเปนตวพมพใหญ ตวอกขระทเหลออนๆ ใหคงเดม เกบไวในตวแปรตวใหมชนดสตรง แลวรายงาน
ผลลพธทได (10 คะแนน)
คาแนะนาเพมเตม:
1.ตวแปรใหมชนดสตรง การประกาศตองกาหนดคาเปน null ไวกอน (string NewStr=null;)
2.เมธอดทตองนามาใชในโปรแกรมไดแก
ToString() ใชแปลงจาก char เปน string
ToUpper() ใชแปลงจากตวพมพเลกใหเปนตวพมพใหญ
ToLower() ใชแปลงจากตวพมพใหญใหเปนตวพมพเลก
3.ใชโอเปอเรเตอร += ในการเพมตวอกขระเขาไปในตวแปรสตรงใหม
ตวอยาง: Input: Please enter a string: WxyKm01mk Output: New string is wXYkM01MK
2.ตารวจสบทราบมาวา พวกมจฉาชพกลมหนงใชรหสลบในการสอสารกน โดยตารวจสบทราบมาวาพวกนจะมวธการ
เขยนรหสลบทไมเหมอนขอความทวไปดงน (10 คะแนน)
1.ตวหนงสอถกพมพจาขวาไปซาย แทนทจะเปนซายไปขวาเหมอนปกต
2.อกขระ ‘R’ ถกแทนดวยอกขระ ‘E’ ในการเขารหส
3.อกขระ ‘W’ ถกแทนดวยอกขระ ‘R’ ในการเขารหส
4.อกขระ ‘E’ ถกแทนดวยอกขระ ‘W’ ในการเขารหส
5.อกขระอนๆ รวมถงตวเลขและสญลกษณตางๆ ไมมการเปลยนแปลงใดๆ
นกเรยนจงชวยตารวจในการเขยนโปรแกรมถอดรหสลบใหเปนขอความปกต (โจทยดดแปลงจาก สสวท.)
ตวอยาง: Input: Enter a word: SNOPAWR WEOM DWWN
Output: NEED MORE WEAPONS
แบบฝกทกษะท 8.4 เรอง คาสงวนซา foreach
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
76
นกเรยนเลอกทาขอท.........วธคดกอนเขยนโปรแกรมมดงน
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
รหสคาสงของโปรแกรมทนกเรยนเลอกทา มดงน
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
77
การใชคาสงวนซาแบบซบซอน
การแกปญหาบางอยางไมสามารถใชคาสงวนซ าชนเดยวได ตองใชคาสงวนซ าซอนมากกวา 1 ชน จงจะ
แกปญหาได นอกจากนนเรายงสามารถนาคาสงวนซ าทง 4 คาสงไดแก for, while, do while และ foreach มาใชรวมกน
ไดอกดวย
ตอไปนเราจะแสดงตวอยางการเขยนโปรแกรมหาคาแฟกทอเรยล (factorial) โดยใชคาสงวนซ าซอนกน ซงม
เงอนไขวา ใหปอนตวเลขทตองการหาคาแฟกทอเรยล แลวแสดงคาตอบ จากนนใหวนกลบมาปอนตวเลขเพอหาคา
แฟกทอเรยลไดอก จนกวาจะปอนเลข 0 หรอจานวนเตมลบ จงจะจบการทางานของโปรแกรม
(ฟนความจาดานแฟกทอเรยล เชน 5! = 5 x 4 x 3 x 2 x 1=120)
ตวอยางท 7
โปรแกรมหาคาแฟกทอเรยล
while (true) { Console.Write("Enter a number for process to factorial:"); int Number = int.Parse(Console.ReadLine()); if (Number <= 0) break; double factorial=Number; for (int i = Number-1; i >= 1; i--) { factorial = factorial * i; } Console.WriteLine("{0}! = {1} ",Number, factorial); } Console.WriteLine("Thank you."); Console.ReadKey();
Output: Enter a number for process to factorial: 5 5! = 120
Enter a number for process to factorial: 10 10! = 3628800
Enter a number for process to factorial: 0 Thank you.
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
78
การใชคาสงวนซาแสดงรปรางแบบตางๆ
เราสามารถใชคาสงวนซ าเขยนโปรแกรมแสดงภาพเปนรปรางตางๆ เชน ตวอยางตอไปน เปนการแสดงรป
สามเหลยม โดยในแนวแกน X จะคอยๆ ลดจานวนเครองหมาย * ลงบรรทดละ 1
ตวอยางท 8
โปรแกรมแสดงรปภาพสามเหลยม
int column = 10; for (int y = 1; y <= 10; y++) { for (int x = 1; x <= column; x++) { Console.Write("*"); } Console.WriteLine(); column --; } Console.ReadKey();
การเขยนโปรแกรมสรางรปสามารถใชคาสงวนซ าซอนกนใหเกดรปทแตกตางกนไดอยางหลากหลาย เชนการ
สรางรปภเขา 1 ลก และภเขา 2 รป นกเรยนดตวอยางตอไปน
ตวอยางท 9
โปรแกรมแสดงรปภเขา 1 ลก
int column1 = 1, column2 = 9; for (int y = 1; y <= 10; y++) { for (int space = 1; space <= column2; space++) { Console.Write(" "); } column2--; for (int x = 1; x <= column1; x++) { Console.Write("*"); } Console.WriteLine(); column1 += 2; } Console.ReadKey();
Output: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
Output: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
79
ตวอยางท 10
โปรแกรมแสดงรปภเขา 2 ลก
int column1 = 1, column2 = 9, column3 = 18; for (int y = 1; y <= 10; y++) { for (int space = 1; space <= column2; space++) { Console.Write(" "); } column2--;
for (int x = 1; x <= column1; x++) { Console.Write("*"); }
for (int space = 1; space <= column3; space++) { Console.Write(" "); } column3 -= 2;
for (int x = 1; x <= column1; x++) { Console.Write("*"); }
Console.WriteLine(); column1 += 2; } Console.ReadKey();
Output: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
80
ใหนกเรยนเลอกทาโจทยขอใดขอหนงตอไปนเพยง 1 ขอเทานน
1.จงเขยนโปรแกรมแสดงรปภาพโดยใชคาสงวนซ า โดยใหรปภาพมลกษณะดงน (7 คะแนน)
Output: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2.จงเขยนโปรแกรมแสดงรปภาพโดยใชคาสงวนซ า โดยใหรปภาพมลกษณะดงน (10 คะแนน)
Output: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
แบบฝกทกษะท 8.5 เรอง คาสงวนซาแบบซบซอน
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
81
นกเรยนเลอกทาขอท...................รหสคาสงของโปรแกรมทนกเรยนเลอกทา มดงน
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
.............................................................................................................................................................................
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
82
บทท 9
ตวแปรชดหรอตวแปรอารเรย (Array)
ความรเกยวกบตวแปรทนกเรยนไดเรยนมาแลวคอ ตวแปร 1 ตวจะเกบขอมลไดเพยง 1 คาเทานน เชน
A=1;
B=4;
A=A+B; // A=5
นนคอ คาของตวแปร A ไมสามารถจดเกบไดทง 1 และ 5 หมายความวา เมอตวแปร A มคาเปลยนไปเปน 5 คา
ของ A เดมทเปน 1 จะถกแทนทดวย 5 นนเอง
ปญหานทาใหเราจะตองประกาศตวแปรหลายรอยตวถาตองการจดเกบขอมลหลายรอยคา การประกาศตวแปร
มากมายขนาดนคงจะเปนปญหาไมนอยในการเขยนโปรแกรม ดงนนวธแกปญหานกคอการทาใหตวแปรเปนตวแปร
ชด หรอเรยกวาตวแปรอารเรย (Array) ซงมขอดคอ ตวแปรเพยงตวเดยว สามารถจดเกบขอมลไดหลายรอยหลายพนคา
เลยทเดยว ดตวอยางตอไปน
int[] n1 = new int[4] {2, 4, 6, 8}; int[] n2 = new int[] {2, 4, 6, 8}; int[] n3 = {2, 4, 6, 8};
ตวแปรทงสามตวลวนแตเปนตวแปรชนด int ทงสามตวมวธการประกาศตวแปรทแตกตางกน แตทงสามตว
ลวนแลวแตเปนตวแปรชดเหมอนกน และมคาเทากน นกเรยนสามารถเขยนโปรแกรมตรวจสอบคาของตวแปรทงสาม
ตวไดดงตอไปน
int[] n1 = new int[4] { 2, 4, 6, 8 }; int[] n2 = new int[] { 2, 4, 6, 8 }; int[] n3 = { 2, 4, 6, 8 }; Console.WriteLine("Value of n1"); foreach (int i in n1) { Console.WriteLine(i); } Console.WriteLine("Value of n2"); foreach (int i in n2) { Console.WriteLine(i); } Console.WriteLine("Value of n3"); foreach (int i in n3) { Console.WriteLine(i); } Console.ReadKey();
Output: Value of n1 2 4 6 8 Value of n2 2 4 6 8 Value of n3 2 4 6 8
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
83
ทนคาถามแรกทตามมากคอ ทาไมการประกาศตวแปรแบบอารเรยจงสามารถทาไดหลากหลาย คาตอบกคอ
เพออานวยความสะดวกสาหรบผเขยนโปรแกรมนนเอง
คาถามท 2 กคอการประกาศตวแปรอารเรยนนจะตองกาหนดคาอยางนทกครงหรอไม แลวถาเราตองการให
อารเรยเกบคาใหเราถงหนงรอยหรอหนงพนคาเราจะทาอยางไร คาตอบคอ ไมจาเปน นกเรยนดตวอยางตอไปน
string[] s1 = new string[100]; for (int i = 0; i < 100; i++) { s1[i] = "Pointer " + i; } foreach (string s in s1) { Console.WriteLine(s); } Console.ReadKey();
จากตวอยางแสดงใหเหนวาเราสามารถประกาศตวแปรอารเรยกอนแลวจงกาหนดคาใหในภายหลง ในตวอยาง
เราประกาศตวแปรอารเรยชอ S1 ใหเปนชนดสตรง มสมาชก 100 ตว สมาชกลาดบแรกของอารเรยกาหนดใหเปนลาดบ
ท 0 เสมอ ดงนนเมอมสมาชก 100 ตว ลาดบสดทายจงเปนลาดบท 99 เมอเราวนซ าเพอกาหนดคาใหสมาชกแตละตวเรา
จงตองเรมจากลาดบท 0 คอใหคาสงวนซ า for (int i = 0; i < 100; i++) หมายถงการวนซ าจาก 0-99 นนเอง จากนน
เราใชความสามารถของคาสงวนซ า foreach แสดงสมาชกทงหมดออกมาใหเหน ดงผลลพธทแสดงไวในกรอบ
หมายเหต: การประกาศตวแปรอารเรยแบบไมกาหนดคา ประกาศไดแบบเดยวคอแบบในตวอยางทผานมา
เมอตวแปรอารเรยมลาดบหรอตวช (Pointer) ประจาตว ดงนนการทางานกบตวแปรอารเรยเราจงสามารถ
เรยกใชขอมลเฉพาะบางสมาชกได โดยใชตวชเปนตวระบสมาชกทตองการ ดงตวอยางตอไปน
int[] n1 = new int[4] { 2, 4, 6, 8 }; int A = 10; Console.WriteLine("Result={0}",A+n1[3]); Console.ReadKey(); Output: Result=18
เราใหตวแปร A ซงมคาเทากบ 10 บวกกบตวแปรอารเรย n1 ตวชท 3 เมอเราเรมนบจาก 0 ไปจนถง 3 คาของตว
แปร n1[3] จงไดแก 8 นนเอง เมอนามาบวกกบ 10 ผลลพธทไดจงเทากบ 18
การกาหนดตวชตวแปรอารเรยนนจะตองกาหนดใหอยในขอบเขตของสมาชก จากตวอยางถาเราชไปท n1[4]
โปรแกรมจะแจงขอผดพลาดทนท ดวยขอความวา “Index was outside the bounds of the array.” เพราะสมาชกของ n1
มสมาชกตงแตลาดบท 0-3 เทานน ตวชลาดบท 4 จงเปนลาดบทอยนอกขอบเขตของอารเรยนนเอง
ตวแปรอารเรยทเราไดทราบมาขางตนเราเรยกวา ตวแปรอารเรย 1 มต ซงอารเรย 2 มตเราจะไมกลาวถง
Output: Pointer 0 Pointer 1 Pointer 2 … … … Pointer 99
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
84
แนวทางการประยกตใชตวแปรอารเรย
ตวแปรอารเรยสามารถนามาแกปญหาไดอยางมประสทธภาพ เชน ถาเราตองการเขยนโปรแกรมจดเรยงขอมล
เรากสามารถใชตวแปรอารเรยมาชวยแกปญหา แตกอนทจะแสดงตวอยางโปรแกรมจดเรยงขอมล นกเรยนดตวอยาง
โปรแกรมสลบคาตวแปรเสยกอน ดงตวอยางตอไปน
ตวอยางท 1
int A = 5, B = 7, C;
โปรแกรมสลบคาตวแปร
C = A; A = B; B = C; Console.WriteLine("A={0} B={1}", A, B); Console.ReadKey(); Output: A=7 B=5
การสลบคาตวแปร เราไมสามารถสลบการโดยตรงได เพราะถาให
A=B; // A=7
B=A; // B=7
คาของตวแปร A และ B กจะเทากน ดงนนจงตองใชตวแปร C มาเกบคาของตวแปร A เอาไวกอน (C=A) เมอ
ให A=B แลว จงให B=C ทจดเกบคาของ A ไวกอนแลวนนเอง
เราจะใชความรพนฐานการสลบคาตวแปรมาเขยนโปรแกรมเรยงลาดบขอมล โดยโจทยมอยวา ใหเขยน
โปรแกรมวนซ ารบคาตวเลขจานวนเตมบวกไปเรอยๆ จนกวาจะรบคาเปน 0 จงใหแสดงผลลพธตวเลขทเรยงลาดบจาก
นอยไปมาก โดยไมตองแสดงเลข 0
ตวอยางท 2
โปรแกรมเรยงลาดบตวเลขจากนอยไปมาก
int[] num = new int[100]; // ประกาศตวแปรแบบอารเรย (aray) 100 ตว int i=0; // ขนท 1 วนซารบคาตวเลขไปเรอยๆ จนกวาจะปอนเลข 0 ใหจบการวนซา while (true) { Console.Write("Enter a number:"); num[i] = int.Parse(Console.ReadLine()); if (num[i] == 0) break; i++; } (โปรแกรมมตอหนาถดไป)
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
85
// ขนท 2 นาตวเลขทรบไดมาดาเนนการจดเรยง ดวยการวนซา 2 ชน int xNum; for (int j = 0; j <= i; j++) { for (int k = 0; k <= j; k++) { if (num[k] > num[j]) { xNum = num[j]; num[j] = num[k]; num[k] = xNum; } } } // ขนท 3 วนซาแสดงตวเลขทเรยงเรยบรอยแลว เรมตงแตลาดบท 1 เพราะลาดบท 0 คาเปน 0 for (int j = 1; j <= i; j++) // j วนจาก 1 ถง i { Console.WriteLine(num[j]); } Console.ReadKey(); Output: Enter a number:5 Enter a number:9 Enter a number:1 Enter a number:8 Enter a number:0 1 5 8 9
จะเหนวาการจดเรยงตวเลขจากตวอยางขางตนมความซบซอนมาก ภาษาซชารปจงไดจดเตรยมคลาสอารเรย
สาหรบการจดเรยง โดยเราจะเปลยนคาสงในขนท 2 ใหมดงน
// ขนท 2 นาตวเลขทรบไดมาดาเนนการจดเรยง ดวยคลาส Array Array.Sort(num); //หลงจากจดเรยงแลว สามารถปรบใหเปนเรยงลาดบอารเรยจากมากไปนอยได ดงน Array.Reverse(X);
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
86
จดการขอมลในอารเรยงายๆ ดวยอารเรยลสต (Array List)
ตวแปรอารเรยทนกเรยนไดเรยนรมาแลวนนถงแมจะสามารถนาไปใชงานไดเปนอยางด แตกยงมปญหา
เกยวกบการจดการตวแปรอารเรยในบางอยาง เชน การลบสมาชกบางตว การแทรกสมาชก การจดเรยงสมาชกใน
อารเรย ดงนนภาษา C# จงไดออกแบบตวแปรอารเรยอกรปแบบหนงเรยกวา อารเรยลสต (Array List) โดยกอนทเราจะ
สามารถใชอารเรยลสตไดนนเราจะตองเรยกใชเนมสเปซ System.Collections เสยกอน
ตวอยางท 1
การประกาศตวแปรและการเพมสมาชกในอารเรยลสต
using System; using System.Collections; //ตองใชเนมสเปซนจงจะใชอารเรยลสตได class Program { static void Main(string[] args) { ArrayList list = new ArrayList(); list.Add(3); list.Add(5); list.Add(8);
foreach (int i in list) { Console.WriteLine(i); } Console.ReadKey(); } } Output: 3 5 8
ตวอยางท 2
ArrayList slist = new ArrayList();
การแทรกและการลบสมาชกในอารเรยลสต
slist.Add("Dog"); slist.Add("Cat"); slist.Add("Ant"); slist.RemoveAt(1); // ลบสมาชกในลาดบท 1 คงเหลอ [Dog,Ant] slist.Insert(0, "Monkey"); // แทรกสมาชกใหมในลาดบท 0 " [Monkey,Dog,Ant] slist.RemoveRange(0, 2); // ลบสมาชกตงแตลาดบท 0 มา 2 ตว " [Ant] foreach (string value in slist) { Console.WriteLine(value); } Console.ReadKey();
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
87
ตวอยางท 3
การดงขอมลบางสวนจากสมาชกในอารเรยลสต
ArrayList list = new ArrayList(); list.Add("fish"); list.Add("amphibian"); list.Add("bird"); list.Add("plant"); ArrayList range = list.GetRange(2, 2); // ดงเรมจากลาดบท 2 มา 2 ลาดบ foreach (string value in range) { Console.WriteLine(value); } Console.ReadKey(); Output: bird plant
ตวอยางท 3
ArrayList list = new ArrayList();
การจดเรยงขอมลในอารเรยลสต และการคนหาสมาชก
list.Add(6); list.Add(3); list.Add(8); list.Add(2); list.Sort(); foreach (int value in list) { Console.WriteLine(value); } Console.WriteLine("Index of 6 is {0}",list.BinarySearch(6)); Console.ReadKey(); Output: 2 3 6 8 Index of 6 is 2
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
88
การใช อารเรยลสตมาแกปญหาโปรแกรมทซบซอน
จากโปรแกรมจดเรยงขอมลในตวอยางท 2 ทผานมาเปนโปรแกรมทใชอารเรยและคาสงวนซ าทซบซอน ทาให
การเขยนโปรแกรมทาไดยาก ดงนนเราจะใชอารเรยลสมาแกปญหาความซบซอนดงน
ตวอยางท 4
โปรแกรมจดเรยงลาดบตวเลข
//โปรแกรมใหมท ArrayList // อยาลมเรยกใช using System.Collections; ArrayList NumList=new ArrayList(); while (true) { Console.Write("Enter a number: "); int number = int.Parse(Console.ReadLine()); if (number == 0) break; NumList.Add(number); } NumList.Sort(); foreach (int n in NumList) { Console.WriteLine(n); } Console.ReadKey();
Output: Enter a number:5 Enter a number:9 Enter a number:1 Enter a number:8 Enter a number:0 1 5 8 9
นกเรยนจะเหนวาโปรแกรมแบบใหมสามารถเขยน
โปรแกรมไดงายกวามาก
//โปรแกรมเกาทใช Array int[] num = new int[100]; int i=0; while (true) { Console.Write("Enter a number:"); num[i] =int.Parse(Console.ReadLine()); if (num[i] == 0) break; i++; } int xNum; for (int j = 0; j <= i; j++) { for (int k = 0; k <= j; k++) { if (num[k] > num[j]) { xNum = num[j]; num[j] = num[k]; num[k] = xNum; } } } for (int j = 1; j <= i; j++) // j วนจาก 1 ถง i { Console.WriteLine(num[j]); } Console.ReadKey(); Output: Enter a number:5 Enter a number:9 Enter a number:1 Enter a number:8 Enter a number:0 1 5 8 9
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
89
บทท 10
การสรางเมธอด (ฟงกชน)
โปรแกรมภาษา C# ไดเตรยมเมธอดไวใหผเขยนโปรแกรมเรยกมาใชไดอยางมากมายแตถงกระนนกยงไมอาจ
ตอบสนองความตองการของโปรแกรมเมอรไดทงหมด โปรแกรม C# จงไดเปดโอกาสใหโปรแกรมเมอรสามารถสราง
เมธอดขนมาใชงานไดดวยตนเอง นกเรยนดตวอยางโปรแกรมตอไปน
using System; class Program { //เมธอดหลกท C# สรางใหเราอตโนมต static void Main(string[] args) { String name = "Suteerat Thipaksorn"; MyMethod(name); Console.ReadKey(); }
//เมธอดทเราสรางขนเอง static void MyMethod(string name) { Console.WriteLine("Hello! "+name); } }
Output: Hello! Suteerat Thipaksorn
คาอธบาย:
โปรแกรมขางตนเปนโปรแกรมทมการสรางเมธอดชอ MyMethod(string name) สงทอยในวงเลบของ
เมธอดนเรยกวา พารามเตอร การประกาศตวแปรและชนดขอมลของพารามเตอรใชหลกเดยวกนกบการประกาศตวแปร
ทวไป อาจจะเปนชอเดยวกนหรอคนละชอกบตวแปรทสงเขามากได (ในโปรแกรมใชชอ name เหมอนกน) แตชนด
ของขอมลตองเปนชนดเดยวกนเทานน (ในตวอยางเปนสตรงเหมอนกน)
การเรยกใชเมธอดนนเราจะเรยกใช ณ จดใดกได หมายความวาจะเรยกใชจากเมธอดหลก หรอเมธอดยอยทเรา
สรางขนเองกได (ในตวอยางเรยกใชจากเมธอดหลก) วธการเรยกใชกคอ พมพชอของเมธอดพรอมกบระบอากวเมนท
ใหตรงพารามเตอรของเมธอดทเรยกใช MyMethod(name)
หมายเหต เมธอดอาจจะไมมพารามเตอรกได ถาเมธอดไมมพารามเตอรการเรยกใชกจะไมระบอากวเมนต เชน
เมธอด Console.Readkey() เปนเมธอดทไมมพารามเตอร
อากวเมนท (arguments)
พารามเตอร (parameters)
จดเรยกใชเมธอด
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
90
เมธอดทไมมการสงคากลบ
การจดทาเมธอดจากตวอยางทผานมา ไดแกเมธอด static void MyMethod(string name) จดวาเปนเมธอด
ทไมมการสงคากลบ ใหสงเกตทสวนประกาศเมธอดจะมคาวา void (หมายถง ไมมผล หรอวางเปลา) ปรากฏอย การท
เมธอดไมสงคา (ขอมล) กลบแสดงวามการดาเนนการอยางใดอยางหนงสาเรจภายในเมธอดนนๆ เลย จากตวอยาง
ขางตนเปนการสงใหแสดงคาวา “Hello!” บวกดวยตวแปร name ทรบคาเขามาจากจดเรยกใชนนเอง
เมธอดทมการสงคากลบ
นกเรยนดตวอยางโปรแกรมเมธอดทมการสงคากลบดงตอไปน
static void Main(string[] args) { while (true) { Console.Clear(); Console.WriteLine(" Menu "); Console.WriteLine("-----------------------------------------"); Console.WriteLine(" For addition (+) press 1"); Console.WriteLine(" For subtract (-) press 2"); Console.WriteLine(" For multiply (*) press 3"); Console.WriteLine(" For division (/) press 4"); Console.WriteLine(" For exit press other key."); Console.WriteLine("-----------------------------------------"); Console.Write("Please choose a choice to continue :"); string choice = Console.ReadLine(); if (choice != "1" && choice != "2" && choice != "3" && choice != "4") break; Console.Write("Enter first number:"); Double num1 = double.Parse(Console.ReadLine()); Console.Write("Enter last number:"); double num2 = double.Parse(Console.ReadLine()); double result = Calculation(choice, num1, num2); Console.WriteLine("Rusult = {0:#,#.##}", result); Console.ReadKey(); } } // เมธอดทเราสรางขนเอง static double Calculation(string _choice, double _num1, double _num2) { if (_choice == "1") return _num1 + _num2; else if (_choice == "2") return _num1 - _num2; else if (_choice == "3") return _num1 * _num2; else return _num1 / _num2; }
จดเรยกใชเมธอด
แบบฝกทกษะ วชาการเขยนโปรแกรมภาษา
91
คาอธบาย:
while (true)
เปนคาสงวนซ าแบบไมรจบ
Console.Clear();
เปนคาสงลางจอภาพ
double result = Calculation(choice, num1, num2); //เรยกใชเมธอด
เปนคาสงเรยกใชเมธอดชอ Calculation โดยสงอากวเมนตเขาไป 3 ตว คอ choice, num1 และ num2 และรบ
คาทถกสงกลบมาจากเมธอดไวทตวแปร result
static double Calculation(string _choice, double _num1, double _num2) { if (_choice == "1") return _num1 + _num2; else if (_choice == "2") return _num1 - _num2; else if (_choice == "3") return _num1 * _num2; else return _num1 / _num2; }
เปนเมธอดทเราสรางขน เปนชนด double มพารามเตอร 3 ตว ไดแก _choice, num1 และ num2 ซงจะมจานวน
3 ตวเทากบจานวนอากวเมนทในจดทเรยกใชพอด และเปนขอมลชนดเดยวกนทงหมด เราสามารถกาหนดชอตวแปร
ของพารามเตอรไมเหมอนกบชอของอากวเมนททเรารบเขามากได
เมอประมวลผลแลวกจะมการสงคากลบโดยใชคาสง return คาทคานวณไดกจะถกสงกลบไปยงเมธอดเมนใน
จดทเรยกใชเพอนาไปดาเนนการอยางอนตอไป
เมธอดทมการสงคากลบจะตองประกาศชนดของเมธอดเปนชนดขอมลใดกได เชน int double string เปนตน
แตถาไมมการสงคากลบใหประกาศเปนชนด void แทน
ลองเปรยบเทยบคาสงทเปนจดเรยกใช และการประกาศชอเมธอดอกครง เพอจะไดเหนความสมพนธของทง
สองคาสงอยางชดเจน ดงน
จดเรยกใช double result = Calculation(choice, num1, num2);
การประกาศเมธอด static double Calculation(string _choice, double _num1, double _num2)