ผลต่างระหว่างรุ่นของ "01204111 model codes"
Jittat (คุย | มีส่วนร่วม) |
Chaiporn (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 35 รุ่นระหว่างกลางโดยผู้ใช้ 2 คน) | |||
แถว 44: | แถว 44: | ||
* ?? ไม่ต้องสอนการประกาศตัวแปรแบบ <tt>const</tt> | * ?? ไม่ต้องสอนการประกาศตัวแปรแบบ <tt>const</tt> | ||
* ไม่ต้องสอน <tt>ConvertTo()</tt> และการทำ type casting ระหว่างตัวเลขเป็นตัวอักษร (เช่น <tt>(int)'A'</tt> หรือ <tt>(char)65</tt>) | * ไม่ต้องสอน <tt>ConvertTo()</tt> และการทำ type casting ระหว่างตัวเลขเป็นตัวอักษร (เช่น <tt>(int)'A'</tt> หรือ <tt>(char)65</tt>) | ||
+ | |||
+ | === ลำดับโปรแกรมที่พัฒนา === | ||
+ | |||
+ | ==== โจทย์: คำนวณบิลค่าอาหาร ==== | ||
+ | * หัวข้อการเรียนรู้ | ||
+ | ** การคำนวณแบบบวกเลขอย่างง่าย | ||
+ | ** นิพจน์ทางคณิตศาสตร์ (math expression) | ||
+ | ** การส่งออกเอาท์พุท | ||
+ | ** ความหมายของคำสั่ง (statement) | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรม | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.WriteLine(82+64+90+75+33); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรมที่ปรับเอาท์พุทให้เหมาะสมขึ้น | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Total cost is "); | ||
+ | Console.WriteLine(82+64+90+75+33); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== โจทย์: บิลอาหารพร้อมส่วนลด 20% ==== | ||
+ | * หัวข้อการเรียนรู้ | ||
+ | ** ลำดับความสำคัญของตัวดำเนินการ | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรมที่ผิด (การคูณเกิดขึ้นกับ 33 เท่านั้น) | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Total cost is "); | ||
+ | Console.WriteLine(82+64+90+75+33 * 0.8); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรมที่ถูก (ใช้วงเล็บครอบนิพจน์บวกทั้งหมด) | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Total cost is "); | ||
+ | Console.WriteLine( (82+64+90+75+33) * 0.8); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== โจทย์: สั่งอาหารซ้ำกันหลายเมนู ==== | ||
+ | * หัวข้อการเรียนรู้ | ||
+ | ** ใช้วงเล็บช่วยให้เขียนโปรแกรมไม่กำกวม แม้ไม่ทำให้การทำงานเปลี่ยน | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรม (เขียนโดยอาศัยลำดับความสำคัญ * ที่มาก่อน +) | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Total cost is "); | ||
+ | Console.WriteLine(1*82+3*64+2*90+5*75+10*33); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรม (เพิ่มวงเล็บเพื่อความชัดเจน) | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Total cost is "); | ||
+ | Console.WriteLine( (1*82) + (3*64) + (2*90) + (5*75) + (10*33) ); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== โจทย์: แชร์ค่าอาหาร ==== | ||
+ | * หัวข้อการเรียนรู้ | ||
+ | ** การหารแบบจำนวนเต็ม และการหารแบบทศนิยม | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรมที่ผิด (ใช้การหารแบบจำนวนเต็ม) | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Total amount is "); | ||
+ | Console.WriteLine( 82+64+90+75+33 ); | ||
+ | Console.Write("Each has to pay "); | ||
+ | Console.WriteLine( (82+64+90+75+33) / 5 ); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรมที่ถูก (เปลี่ยนให้เป็นการหารแบบทศนิยม) | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Total amount is "); | ||
+ | Console.WriteLine( 82+64+90+75+33 ); | ||
+ | Console.Write("Each has to pay "); | ||
+ | Console.WriteLine( (82+64+90+75+33) / 5.0 ); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรมที่ปรับปรุงแล้ว (ใช้ตัวแปรเก็บค่านิพจน์ที่คำนวณซ้ำซ้อน) | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | int total = 82+64+90+75+33; | ||
+ | Console.Write("Total amount is "); | ||
+ | Console.WriteLine(total); | ||
+ | Console.Write("Each has to pay "); | ||
+ | Console.WriteLine( total / 5.0 ); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== โจทย์: แชร์ค่าอาหารพร้อมให้ทิป ==== | ||
+ | * หัวข้อการเรียนรู้ | ||
+ | ** การหารเอาเศษและตัวดำเนินการ % | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรม | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | int total; | ||
+ | total = 82+64+90+75+33; | ||
+ | Console.Write("Total amount: "); | ||
+ | Console.WriteLine( total ); | ||
+ | Console.Write("Each has to pay: "); | ||
+ | Console.WriteLine( total / 5 ); | ||
+ | Console.Write("Tip: "); | ||
+ | Console.WriteLine( total % 5 ); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== โจทย์: แปลงอุณหภูมิจากองศาเซลเซียสเป็นเคลวิน ==== | ||
+ | * หัวข้อการเรียนรู้ | ||
+ | ** การอ่านอินพุทด้วย <tt>Console.ReadLine()</tt> | ||
+ | ** ชนิดข้อมูลแบบจำนวนและสตริง | ||
+ | ** ตัวดำเนินการ + ที่ให้พฤติกรรมแตกต่างกันเมื่อใช้กับจำนวนและสตริง | ||
+ | ** การใช้เมท็อด <tt>Parse()</tt> เพื่อเปลี่ยนสตริงเป็นจำนวน | ||
+ | ** การฟอร์แมตเอาท์พุท | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรมที่ผิด (บวกสตริงเข้ากับจำนวน) | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Enter temperature in degrees Celcius: "); | ||
+ | string c = Console.ReadLine(); | ||
+ | Console.Write("Kelvin: "); | ||
+ | Console.WriteLine(c+273.15); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรมที่ถูก #1 | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Enter temperature in degrees Celcius: "); | ||
+ | double c = double.Parse(Console.ReadLine()); | ||
+ | Console.Write("Kelvin: "); | ||
+ | Console.WriteLine(c+273.15); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรมที่ถูก #2 (ฟอร์แมตข้อความให้เหมาะสม) | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Enter temperature in degrees Celcius: "); | ||
+ | double c = double.Parse(Console.ReadLine()); | ||
+ | Console.WriteLine("{0} degrees Celcius is equal to {1} Kelvin",c,c+273.15); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== โจทย์: แปลงอุณหภูมิจากองศาเซลเซียสเป็นหน่วยอื่น ๆ ==== | ||
+ | * หัวข้อการเรียนรู้ | ||
+ | ** การวิเคราะห์โจทย์ | ||
+ | ** การฟอร์แมตตัวเลขให้มีจำนวนทศนิยมที่กำหนด | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรม | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Enter temperature in degrees Celcius: "); | ||
+ | double c = double.Parse(Console.ReadLine()); | ||
+ | double f = ((c*9.0)/5.0)+32; | ||
+ | double r = (c*4)/5; | ||
+ | double k = c + 273.15; | ||
+ | Console.WriteLine("{0:f2} degrees Celsius is equal to:", c); | ||
+ | Console.WriteLine(" {0:f2} degrees Fahrenheit", f); | ||
+ | Console.WriteLine(" {0:f2} degrees Romer", r); | ||
+ | Console.WriteLine(" {0:f2} Kelvin", k); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== โจทย์: คำนวณเงินฝากธนาคาร ==== | ||
+ | * หัวข้อการเรียนรู้ | ||
+ | ** การวิเคราะห์โจทย์ | ||
+ | ** การใช้ไลบรารี <tt>Math</tt> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ตัวอย่างโปรแกรม | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class Program | ||
+ | { | ||
+ | static void Main() | ||
+ | { | ||
+ | Console.Write("Principle (Baht): "); | ||
+ | double principle = double.Parse(Console.ReadLine()); | ||
+ | Console.Write("Rate (% per year): "); | ||
+ | double rate = double.Parse(Console.ReadLine()); | ||
+ | Console.Write("Time (years): "); | ||
+ | int year = int.Parse(Console.ReadLine()); | ||
+ | Console.Write("Amount: "); | ||
+ | double amount = principle * Math.Pow( 1 + (rate/100), year); | ||
+ | Console.WriteLine(amount); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
== โปรแกรมย่อยและไลบรารี == | == โปรแกรมย่อยและไลบรารี == | ||
แถว 302: | แถว 634: | ||
เป็นตัวอย่างของการเขียนโปรแกรมแก้สมการกำลังสอง <math>ax^2 + bx + c</math> โดยพิจารณาแบบ top-down | เป็นตัวอย่างของการเขียนโปรแกรมแก้สมการกำลังสอง <math>ax^2 + bx + c</math> โดยพิจารณาแบบ top-down | ||
+ | ส่วนแรกเป็นโปรแกรมหลักที่รับสัมประสิทธิ์ a,b,c และเรียกใช้โปรแกรมย่อยในการประมวลผล | ||
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
− | + | เมท็อด Main | |
<div class="mw-collapsible-content"> | <div class="mw-collapsible-content"> | ||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
แถว 309: | แถว 642: | ||
{ | { | ||
double a, b, c; | double a, b, c; | ||
− | ReadCoefficients (a, b, c); | + | ReadCoefficients (out a, out b, out c); |
SolveAndOutput (a, b, c); | SolveAndOutput (a, b, c); | ||
แถว 317: | แถว 650: | ||
</div> | </div> | ||
− | + | เริ่มเขียนส่วนรับอินพุต | |
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
เขียนเมท็อด ReadCoefficients | เขียนเมท็อด ReadCoefficients | ||
แถว 334: | แถว 667: | ||
</div> | </div> | ||
</div> | </div> | ||
− | |||
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
แถว 349: | แถว 681: | ||
</div> | </div> | ||
+ | เมื่อเขียนถึงจุดนี้ควรจะทดสอบโปรแกรมเสียก่อน อาจจะต้อง comment SolveAndOutput ไปก่อน และเพิ่มคำสั่งในการพิมพ์ค่า a b c ออกมา | ||
+ | โครงหลักของการแก้สมการ SolveAndOutput มีเงื่อนไขเกี่ยวกับค่า <math>b^2-4ac</math> ที่ต้องรวมการแสดงผลไว้ด้วยเพราะว่าแสดงผลได้สองแบบ (และเรายังคืนค่าเป็น complex ไม่เป็น) ซึ่งถ้าแบ่งงานอีกแบบคือให้โปรแกรมย่อยคืนค่าเป็นจำนวนเชิงซ้อนตลอดเวลา ก็จะเขียนได้สะอาดกว่านี้ ในตอนแรกเราจะเขียนแค่ส่วนหาคำตอบกรณีที่เป็นจำนวนจริงก่อนเพื่อให้สามารถทดสอบโปรแกรมได้เมื่อทำส่วนย่อยแรกนี้เสร็จ | ||
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
− | + | เขียนในเมท็อด SolveAndOutput | |
<div class="mw-collapsible-content"> | <div class="mw-collapsible-content"> | ||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
แถว 358: | แถว 692: | ||
if (HasRealSolutions (a, b, c)) { | if (HasRealSolutions (a, b, c)) { | ||
double sol1, sol2; | double sol1, sol2; | ||
− | FindRealSolutions (a, b, c, sol1, sol2); | + | FindRealSolutions (a, b, c, out sol1, out sol2); |
OutputRealSolutions (sol1, sol2); | OutputRealSolutions (sol1, sol2); | ||
} else { | } else { | ||
− | |||
− | |||
− | |||
} | } | ||
} | } | ||
แถว 370: | แถว 701: | ||
</div> | </div> | ||
− | + | ส่วนตรวจสอบว่ามีคำตอบเป็นจำนวนจริง (ไม่ได้ตรวจว่ามีคำตอบเดียวหรือเปล่า --- สามารถเก็บไปเป็นการบ้านที่ทำในแลบได้) | |
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
− | + | ในการตรวจสอบจะคำนวณ inner term ด้วยเมท็อด CalculateInnerTerm ก่อน จากนั้นจึงค่อนตรวจสอบค่า | |
<div class="mw-collapsible-content"> | <div class="mw-collapsible-content"> | ||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
แถว 388: | แถว 719: | ||
</div> | </div> | ||
− | + | จากนั้นจึงเมท็อดที่เหลือในการหาคำตอบกรณีคำตอบเป็นจำนวนจริง | |
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
− | + | มีเมท็อด FindRealSolutions และ OutputRealSolutions | |
<div class="mw-collapsible-content"> | <div class="mw-collapsible-content"> | ||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
− | static | + | static void FindRealSolutions(double a, double b, double c, |
out double sol1, out double sol2) | out double sol1, out double sol2) | ||
{ | { | ||
แถว 410: | แถว 741: | ||
</div> | </div> | ||
+ | เมื่อเขียนถึงตรงนี้ควรจะทดสอบโปรแกรมก่อน (ไม่ควรเขียนต่อ) เราควรเน้นให้นิสิตทดสอบโปรแกรมเป็นระยะ ๆ ไม่ใช่เขียนรวดเดียวแล้วทดสอบทีเดียว | ||
+ | |||
+ | จากนั้นเราจะเพิ่มส่วนคำนวณคำตอบในกรณีที่คำตอบเป็น complex ในเมท็อด SolveAndOutput (ในส่วน else) | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | เขียนเพิ่มเติมในเมท็อด SolveAndOutput | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | static void SolveAndOutput(double a, double b, double c) | ||
+ | { | ||
+ | if (HasRealSolutions (a, b, c)) { | ||
+ | double sol1, sol2; | ||
+ | FindRealSolutions (a, b, c, out sol1, out sol2); | ||
+ | OutputRealSolutions (sol1, sol2); | ||
+ | } else { | ||
+ | double sol1real, sol1img, sol2real, sol2img; | ||
+ | FindComplexSolutions ( | ||
+ | a, b, c, | ||
+ | out sol1real, out sol1img, | ||
+ | out sol2real, out sol2img | ||
+ | ); | ||
+ | OutputComplexSolutions (sol1real, sol1img, sol2real, sol2img); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | โค้ดที่เหลือกรณีทีคำตอบเป็น complex (และไม่เป็นจำนวนจริง) เขียนคล้าย ๆ เดิม แต่ในการคืนคำตอบจะคืนสองคำตอบแยกเป็นส่วน real part และ imaginary part เราเลือกที่จะคำนวณคำตอบสองคำตอบให้เรียบร้อยใน FindComplexSolutions เลย แม้ว่าจะดูว่าเป็นการทำงานซ้ำซ้อน (เพราะว่า real part เท่ากัน) แต่เนื่องจากเราไม่ต้องการให้เงื่อนไขและรายละเอียดดังกล่าวไปปะปนอยู่ในส่วนแสดงผลลัพธ์ | ||
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
− | + | ด้านล่างเป็นเมท็อด FindComplexSolutions และ OutputComplexSolutions | |
<div class="mw-collapsible-content"> | <div class="mw-collapsible-content"> | ||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
static void FindComplexSolutions(double a, double b, double c, | static void FindComplexSolutions(double a, double b, double c, | ||
− | out double | + | out double sol1real, out double sol1img, |
+ | out double sol2real, out double sol2img) | ||
{ | { | ||
double innerTerm = CalculateInnerTerm (a, b, c); | double innerTerm = CalculateInnerTerm (a, b, c); | ||
− | realPart = -b / (2 * a); | + | double realPart = -b / (2 * a); |
− | imgPart = Math.Sqrt(-innerTerm) / (2 * a); | + | double imgPart = Math.Sqrt(-innerTerm) / (2 * a); |
+ | |||
+ | sol1real = realPart; | ||
+ | sol1img = imgPart; | ||
+ | |||
+ | sol2real = realPart; | ||
+ | sol2img = -imgPart; | ||
} | } | ||
− | static void OutputComplexSolutions(double | + | static void OutputComplexSolutions(double sol1real, double sol1img, |
+ | double sol2real, double sol2img) | ||
{ | { | ||
− | Console.WriteLine ("There are two complex solutions: {0}+{1}i and { | + | Console.WriteLine ( |
+ | "There are two complex solutions: {0}+{1}i and {2}-{3}i", | ||
+ | sol1real, sol1img, | ||
+ | sol2real, sol2img | ||
+ | ); | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
แถว 639: | แถว 1,009: | ||
== โครงสร้างคำสั่งแบบวนซ้ำและอาร์เรย์ 1 มิติ == | == โครงสร้างคำสั่งแบบวนซ้ำและอาร์เรย์ 1 มิติ == | ||
: ''Notes: for-loop, ใช้ flow chart ไฟล์อินพุต'' | : ''Notes: for-loop, ใช้ flow chart ไฟล์อินพุต'' | ||
+ | === ตัวอย่างโปรแกรม === | ||
+ | ==== คำนวณผลรวมของจำนวนเต็ม 5 จำนวน (ไม่ใช้ array) ==== | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | สองตัวอย่างแรกจะใช้เพื่อแสดงความจำเป็นของการใช้อาร์เรย์ | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class MainClass | ||
+ | { | ||
+ | static int ReadInt() | ||
+ | { | ||
+ | return int.Parse (Console.ReadLine ()); | ||
+ | } | ||
+ | |||
+ | public static void Main (string[] args) | ||
+ | { | ||
+ | int x1, x2, x3, x4, x5; | ||
+ | |||
+ | x1 = ReadInt (); | ||
+ | x2 = ReadInt (); | ||
+ | x3 = ReadInt (); | ||
+ | x4 = ReadInt (); | ||
+ | x5 = ReadInt (); | ||
+ | |||
+ | int sum = x1 + x2 + x3 + x4 + x5; | ||
+ | |||
+ | Console.WriteLine ("Total = {0}", sum); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ไม่ใช้ array) ==== | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | เอาโปรแกรมเดิมมาแก้ให้เป็น 10 ตัวแปร | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class MainClass | ||
+ | { | ||
+ | static int ReadInt() | ||
+ | { | ||
+ | return int.Parse (Console.ReadLine ()); | ||
+ | } | ||
+ | |||
+ | public static void Main (string[] args) | ||
+ | { | ||
+ | int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10; | ||
+ | |||
+ | x1 = ReadInt (); | ||
+ | x2 = ReadInt (); | ||
+ | x3 = ReadInt (); | ||
+ | x4 = ReadInt (); | ||
+ | x5 = ReadInt (); | ||
+ | x6 = ReadInt (); | ||
+ | x7 = ReadInt (); | ||
+ | x8 = ReadInt (); | ||
+ | x9 = ReadInt (); | ||
+ | x10 = ReadInt (); | ||
+ | |||
+ | int sum = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10; | ||
+ | |||
+ | Console.WriteLine ("Total = {0}", sum); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ใช้ array + while loop) ==== | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ประกาศตัวแปรแบบ array และคำนวณผลรวม | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class MainClass | ||
+ | { | ||
+ | static int ReadInt() | ||
+ | { | ||
+ | return int.Parse (Console.ReadLine ()); | ||
+ | } | ||
+ | |||
+ | public static void Main (string[] args) | ||
+ | { | ||
+ | int[] x = new int[10]; | ||
+ | |||
+ | int i = 0; | ||
+ | while (i < 10) { | ||
+ | x [i] = ReadInt (); | ||
+ | i++; | ||
+ | } | ||
+ | |||
+ | int sum = 0; | ||
+ | i = 0; | ||
+ | while (i < 10) { | ||
+ | sum += x[i]; | ||
+ | i++; | ||
+ | } | ||
+ | |||
+ | Console.WriteLine ("Total = {0}", sum); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ใช้ array + for loop) ==== | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ประกาศตัวแปรแบบ array และคำนวณผลรวม | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class MainClass | ||
+ | { | ||
+ | static int ReadInt() | ||
+ | { | ||
+ | return int.Parse (Console.ReadLine ()); | ||
+ | } | ||
+ | |||
+ | public static void Main (string[] args) | ||
+ | { | ||
+ | int[] x = new int[10]; | ||
+ | |||
+ | for(int i = 0; i < 10; i++) { | ||
+ | x [i] = ReadInt (); | ||
+ | } | ||
+ | |||
+ | int sum = 0; | ||
+ | for(int i=0; i < 10; i++) { | ||
+ | sum += x[i]; | ||
+ | } | ||
+ | |||
+ | Console.WriteLine ("Total = {0}", sum); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | ==== คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ใช้ array + for loop + โปรแกรมย่อย) ==== | ||
+ | ถ้ายังไม่สอนตอนนี้ ก็ข้ามตัวอย่างนี้ไปก่อนได้ครับ | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | ประกาศตัวแปรแบบ array และคำนวณผลรวม โดยแบ่งงานเป็นส่วน ๆ ด้วยโปรแกรมย่อย | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="csharp"> | ||
+ | using System; | ||
+ | |||
+ | class MainClass | ||
+ | { | ||
+ | static int ReadInt() | ||
+ | { | ||
+ | return int.Parse (Console.ReadLine ()); | ||
+ | } | ||
+ | |||
+ | static int [] ReadArray(int size) | ||
+ | { | ||
+ | int[] x = new int[size]; | ||
+ | for (int i = 0; i < size; i++) { | ||
+ | x [i] = ReadInt (); | ||
+ | } | ||
+ | return x; | ||
+ | } | ||
+ | |||
+ | static int FindSum(int[] x, int size) | ||
+ | { | ||
+ | int sum = 0; | ||
+ | for (int i = 0; i < size; i++) { | ||
+ | sum += x [i]; | ||
+ | } | ||
+ | return sum; | ||
+ | } | ||
+ | |||
+ | public static void Main (string[] args) | ||
+ | { | ||
+ | int[] x = ReadArray (10); | ||
+ | int sum = FindSum(x, 10); | ||
+ | Console.WriteLine ("Total = {0}", sum); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
== โครงสร้างคำสั่งแบบวนซ้ำหลายชั้น == | == โครงสร้างคำสั่งแบบวนซ้ำหลายชั้น == |
รุ่นแก้ไขปัจจุบันเมื่อ 16:16, 1 สิงหาคม 2559
ตัวอย่างโปรแกรมที่ควรเขียนได้และเข้าใจเมื่อเรียนเนื้อหาแต่ละส่วน
เนื้อหา
- 1 แนะนำคอมพิวเตอร์และการโปรแกรม
- 2 ตัวแปร นิพจน์ โปรแกรมเชิงลำดับอย่างง่าย อินพุต/เอาท์พุต
- 2.1 ลำดับโปรแกรมที่พัฒนา
- 2.1.1 โจทย์: คำนวณบิลค่าอาหาร
- 2.1.2 โจทย์: บิลอาหารพร้อมส่วนลด 20%
- 2.1.3 โจทย์: สั่งอาหารซ้ำกันหลายเมนู
- 2.1.4 โจทย์: แชร์ค่าอาหาร
- 2.1.5 โจทย์: แชร์ค่าอาหารพร้อมให้ทิป
- 2.1.6 โจทย์: แปลงอุณหภูมิจากองศาเซลเซียสเป็นเคลวิน
- 2.1.7 โจทย์: แปลงอุณหภูมิจากองศาเซลเซียสเป็นหน่วยอื่น ๆ
- 2.1.8 โจทย์: คำนวณเงินฝากธนาคาร
- 2.1 ลำดับโปรแกรมที่พัฒนา
- 3 โปรแกรมย่อยและไลบรารี
- 4 นิพจน์เชิงตรรกและโครงสร้างคำสั่งแบบทางเลือก
- 5 โครงสร้างคำสั่งแบบทางเลือกหลายชั้น
- 6 โครงสร้างคำสั่งแบบวนซ้ำ
- 7 โครงสร้างคำสั่งแบบวนซ้ำและอาร์เรย์ 1 มิติ
- 7.1 ตัวอย่างโปรแกรม
- 7.1.1 คำนวณผลรวมของจำนวนเต็ม 5 จำนวน (ไม่ใช้ array)
- 7.1.2 คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ไม่ใช้ array)
- 7.1.3 คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ใช้ array + while loop)
- 7.1.4 คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ใช้ array + for loop)
- 7.1.5 คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ใช้ array + for loop + โปรแกรมย่อย)
- 7.1 ตัวอย่างโปรแกรม
- 8 โครงสร้างคำสั่งแบบวนซ้ำหลายชั้น
- 9 โปรแกรมย่อยขั้นสูง
- 10 อาเรย์หลายมิติ
- 11 การแก้โจทย์เชิงประยุกต์
แนะนำคอมพิวเตอร์และการโปรแกรม
- 1 คาบ
- องค์ประกอบคอมพิวเตอร์เบื้องต้น
- ฮาร์ดแวร์ ซอฟต์แวร์ และระบบปฏิบัติการ
- การแทนข้อมูล
- ระบบเลขฐาน
- เครือข่ายคอมพิวเตอร์และอินเทอร์เน็ต (?)
- มโนทัศน์การโปรแกรม
- ภาษาระดับต่ำ
- ภาษาระดับสูง
- การแปลภาษา
- ขั้นตอนวิธีและการแตกปัญหาเป็นปัญหาย่อย
- โฟลว์ชาร์ท
ตัวอย่างโปรแกรม
โปรแกรมการกินข้าว
1. ขณะที่ ข้าวในจานยังไม่หมด ให้ทำดังนี้ 1.1 ถ้า ยังกินไหว ให้ทำดังนี้ 1.1.1 ตักข้าวเข้าปาก 1.2 ถ้าไม่เช่นนั้น 1.2.1 เลิกกิน 2. ถ้า ยังไม่อิ่ม และ เงินยังไม่หมด ให้ทำดังนี้ 2.1 ซื้อข้าวอีกจาน 2.2 กลับไปทำข้อ 1
ตัวแปร นิพจน์ โปรแกรมเชิงลำดับอย่างง่าย อินพุต/เอาท์พุต
- 1 คาบ
- แนะนำ data type เท่าที่จำเป็น
- int สำหรับจำนวนเต็ม (ไม่ต้องมี short หรือ byte)
- double สำหรับทศนิยม (ไม่ต้องมี float)
- char
- string
- ตัวดำเนินการพื้นฐาน +, -, *, /, %
- ลำดับความสำคัญ และวงเล็บ
- ยังไม่ต้องสอน ++, --, += และ -= ในตอนนี้
- อาศัย interactive shell ในการแสดงลำดับการคำนวณ การใช้ตัวแปร และการนำเอาลำดับเหล่านี้มารวมกันเป็นโปรแกรมเพื่อทำงานทีเดียว
- ??การประกาศตัวแปรด้วยคีย์เวิร์ด var
- การใช้ Console.ReadLine() และ Console.WriteLine() เมื่อเริ่มนำมาเขียนเป็นโปรแกรม
- แทรกเกร็ดเรื่อง formatting โดยใช้ Console.Write() ไปเรื่อย ๆ
- ?? ไม่ต้องสอนการประกาศตัวแปรแบบ const
- ไม่ต้องสอน ConvertTo() และการทำ type casting ระหว่างตัวเลขเป็นตัวอักษร (เช่น (int)'A' หรือ (char)65)
ลำดับโปรแกรมที่พัฒนา
โจทย์: คำนวณบิลค่าอาหาร
- หัวข้อการเรียนรู้
- การคำนวณแบบบวกเลขอย่างง่าย
- นิพจน์ทางคณิตศาสตร์ (math expression)
- การส่งออกเอาท์พุท
- ความหมายของคำสั่ง (statement)
ตัวอย่างโปรแกรม
using System;
class Program
{
static void Main()
{
Console.WriteLine(82+64+90+75+33);
}
}
ตัวอย่างโปรแกรมที่ปรับเอาท์พุทให้เหมาะสมขึ้น
using System;
class Program
{
static void Main()
{
Console.Write("Total cost is ");
Console.WriteLine(82+64+90+75+33);
}
}
โจทย์: บิลอาหารพร้อมส่วนลด 20%
- หัวข้อการเรียนรู้
- ลำดับความสำคัญของตัวดำเนินการ
ตัวอย่างโปรแกรมที่ผิด (การคูณเกิดขึ้นกับ 33 เท่านั้น)
using System;
class Program
{
static void Main()
{
Console.Write("Total cost is ");
Console.WriteLine(82+64+90+75+33 * 0.8);
}
}
ตัวอย่างโปรแกรมที่ถูก (ใช้วงเล็บครอบนิพจน์บวกทั้งหมด)
using System;
class Program
{
static void Main()
{
Console.Write("Total cost is ");
Console.WriteLine( (82+64+90+75+33) * 0.8);
}
}
โจทย์: สั่งอาหารซ้ำกันหลายเมนู
- หัวข้อการเรียนรู้
- ใช้วงเล็บช่วยให้เขียนโปรแกรมไม่กำกวม แม้ไม่ทำให้การทำงานเปลี่ยน
ตัวอย่างโปรแกรม (เขียนโดยอาศัยลำดับความสำคัญ * ที่มาก่อน +)
using System;
class Program
{
static void Main()
{
Console.Write("Total cost is ");
Console.WriteLine(1*82+3*64+2*90+5*75+10*33);
}
}
ตัวอย่างโปรแกรม (เพิ่มวงเล็บเพื่อความชัดเจน)
using System;
class Program
{
static void Main()
{
Console.Write("Total cost is ");
Console.WriteLine( (1*82) + (3*64) + (2*90) + (5*75) + (10*33) );
}
}
โจทย์: แชร์ค่าอาหาร
- หัวข้อการเรียนรู้
- การหารแบบจำนวนเต็ม และการหารแบบทศนิยม
ตัวอย่างโปรแกรมที่ผิด (ใช้การหารแบบจำนวนเต็ม)
using System;
class Program
{
static void Main()
{
Console.Write("Total amount is ");
Console.WriteLine( 82+64+90+75+33 );
Console.Write("Each has to pay ");
Console.WriteLine( (82+64+90+75+33) / 5 );
}
}
ตัวอย่างโปรแกรมที่ถูก (เปลี่ยนให้เป็นการหารแบบทศนิยม)
using System;
class Program
{
static void Main()
{
Console.Write("Total amount is ");
Console.WriteLine( 82+64+90+75+33 );
Console.Write("Each has to pay ");
Console.WriteLine( (82+64+90+75+33) / 5.0 );
}
}
ตัวอย่างโปรแกรมที่ปรับปรุงแล้ว (ใช้ตัวแปรเก็บค่านิพจน์ที่คำนวณซ้ำซ้อน)
using System;
class Program
{
static void Main()
{
int total = 82+64+90+75+33;
Console.Write("Total amount is ");
Console.WriteLine(total);
Console.Write("Each has to pay ");
Console.WriteLine( total / 5.0 );
}
}
โจทย์: แชร์ค่าอาหารพร้อมให้ทิป
- หัวข้อการเรียนรู้
- การหารเอาเศษและตัวดำเนินการ %
ตัวอย่างโปรแกรม
using System;
class Program
{
static void Main()
{
int total;
total = 82+64+90+75+33;
Console.Write("Total amount: ");
Console.WriteLine( total );
Console.Write("Each has to pay: ");
Console.WriteLine( total / 5 );
Console.Write("Tip: ");
Console.WriteLine( total % 5 );
}
}
โจทย์: แปลงอุณหภูมิจากองศาเซลเซียสเป็นเคลวิน
- หัวข้อการเรียนรู้
- การอ่านอินพุทด้วย Console.ReadLine()
- ชนิดข้อมูลแบบจำนวนและสตริง
- ตัวดำเนินการ + ที่ให้พฤติกรรมแตกต่างกันเมื่อใช้กับจำนวนและสตริง
- การใช้เมท็อด Parse() เพื่อเปลี่ยนสตริงเป็นจำนวน
- การฟอร์แมตเอาท์พุท
ตัวอย่างโปรแกรมที่ผิด (บวกสตริงเข้ากับจำนวน)
using System;
class Program
{
static void Main()
{
Console.Write("Enter temperature in degrees Celcius: ");
string c = Console.ReadLine();
Console.Write("Kelvin: ");
Console.WriteLine(c+273.15);
}
}
ตัวอย่างโปรแกรมที่ถูก #1
using System;
class Program
{
static void Main()
{
Console.Write("Enter temperature in degrees Celcius: ");
double c = double.Parse(Console.ReadLine());
Console.Write("Kelvin: ");
Console.WriteLine(c+273.15);
}
}
ตัวอย่างโปรแกรมที่ถูก #2 (ฟอร์แมตข้อความให้เหมาะสม)
using System;
class Program
{
static void Main()
{
Console.Write("Enter temperature in degrees Celcius: ");
double c = double.Parse(Console.ReadLine());
Console.WriteLine("{0} degrees Celcius is equal to {1} Kelvin",c,c+273.15);
}
}
โจทย์: แปลงอุณหภูมิจากองศาเซลเซียสเป็นหน่วยอื่น ๆ
- หัวข้อการเรียนรู้
- การวิเคราะห์โจทย์
- การฟอร์แมตตัวเลขให้มีจำนวนทศนิยมที่กำหนด
ตัวอย่างโปรแกรม
using System;
class Program
{
static void Main()
{
Console.Write("Enter temperature in degrees Celcius: ");
double c = double.Parse(Console.ReadLine());
double f = ((c*9.0)/5.0)+32;
double r = (c*4)/5;
double k = c + 273.15;
Console.WriteLine("{0:f2} degrees Celsius is equal to:", c);
Console.WriteLine(" {0:f2} degrees Fahrenheit", f);
Console.WriteLine(" {0:f2} degrees Romer", r);
Console.WriteLine(" {0:f2} Kelvin", k);
}
}
โจทย์: คำนวณเงินฝากธนาคาร
- หัวข้อการเรียนรู้
- การวิเคราะห์โจทย์
- การใช้ไลบรารี Math
ตัวอย่างโปรแกรม
using System;
class Program
{
static void Main()
{
Console.Write("Principle (Baht): ");
double principle = double.Parse(Console.ReadLine());
Console.Write("Rate (% per year): ");
double rate = double.Parse(Console.ReadLine());
Console.Write("Time (years): ");
int year = int.Parse(Console.ReadLine());
Console.Write("Amount: ");
double amount = principle * Math.Pow( 1 + (rate/100), year);
Console.WriteLine(amount);
}
}
โปรแกรมย่อยและไลบรารี
- เป้าหมาย: การใช้โปรแกรมย่อยเพื่อการแบ่งปัญหาเป็นปัญหาย่อย และเพื่อให้โปรแกรมอ่านเข้าใจง่าย (ไม่ใช่เพื่อทำให้โปรแกรมสั้นลง)
- 1 คาบ
- การเรียกใช้ฟังก์ชันในคลาส Math และทบทวนการเรียกใช้ฟังก์ชันที่เคยทำมาแล้ว (ReadLine, WriteLine, Parse ฯลฯ)
- การสร้างโปรแกรมย่อยและฟังก์ชันขึ้นมาด้วยตนเองเพื่อคำนวณสูตรที่ไม่มีให้ในไลบรารี
- พารามิเตอร์และการส่งค่า
- ความหมายของพารามิเตอร์และอาร์กิวเมนต์
- ครอบคลุมเฉพาะ pass by value
- ?? การกำหนดพารามิเตอร์ด้วย keyword argument ตัวอย่างเช่น
คลิก "ขยาย" เพื่อดูตัวอย่างโปรแกรม
double bmi(double weight, double height)
{
return weight/(height*height)*10000;
}
Console.WriteLine(bmi(height:175,weight:72));
- สโคปของตัวแปร
ลำดับของโปรแกรมที่จะพัฒนา
1. โปรแกรมคำนวณพื้นที่วงกลม 1
ตัวอย่างแรกสุดที่แสดงการเรียกโปรแกรมย่อยโดยไม่ต้องส่งพารามิเตอร์ใดๆ เพื่อแสดง top-down design ขั้นพื้นฐาน
using System;
namespace SRch1_circleArea
{
class CircleArea {
static void Main() {
ComputeCircleArea();
Console.ReadKey(true);
}
static void ComputeCircleArea() {
Console.Write("Enter a radius:");
double radius = double.Parse(Console.ReadLine());
double area = Math.PI*radius*radius;
Console.WriteLine("Area of a circle with radius {0} is {1}", radius, area);
}
}
}
2. โปรแกรมคำนวณพื้นที่วงกลม 2
ทำงานเดียวกับโปรแกรมแรก แต่มีการเรียกโปรแกรมย่อยที่มีพารามิเตอร์แบบ pass by value และรีเทิร์นผลลัพธ์ แสดงการออกแบบโปรแกรมแบบ modular และ stepwise refinement มากยิ่งขึ้น
using System;
namespace SRch1_circleArea_v2
{
class CircleArea
{
static void Main()
{
double radius = readDouble("Enter a radius:");
double area = circleArea(radius);
Console.WriteLine("Area of a circle with radius {0} is {1}", radius, area);
Console.ReadKey(true);
}
static double readDouble(string prompt) {
Console.Write(prompt);
double d = double.Parse(Console.ReadLine());
return d;
}
static double circleArea(double r)
{
return Math.PI*r*r;
}
}
}
3. โปรแกรมคำนวณค่าเฉลี่ยของตัวแปร 3 ตัว (version 2)
หาค่าเฉลี่ยของจำนวนเต็มสามตัว เป็นโปรแกรมที่ปรับมาจากโปรแกรมที่ Main ทำทุกอย่าง เป็นอีกตัวอย่างที่แสดงการใช้โปรแกรมย่อย
using System;
namespace SRch2_averageOfThree
{
class averageOfThree
{
public static void Main()
{
/* read three integers */
int a1 = readInt("1st value: ");
int a2 = readInt("2nd value: ");
int a3 = readInt("3rd value: ");
/* compute and output their average */
Console.WriteLine("average is {0}", average3(a1,a2,a3));
Console.ReadKey(true);
}
static double average3(int x, int y, int z)
{
return (x+y+z)/3.0;
}
static int readInt(string prompt)
{
Console.Write(prompt);
int i = int.Parse(Console.ReadLine());
return i;
}
}
}
4. โปรแกรมคำนวณค่าเฉลี่ยของตัวแปร 3 ตัว (version 3)
หาค่าเฉลี่ยของจำนวนเต็มสามตัว ใช้ out พารามิเตอร์ในการส่งค่ากลับ
using System;
namespace SRch2_averageOfThree //version 3 - more modular
{
class averageOfThree
{
public static void Main()
{
int a1, a2, a3;
read3integers(out a1, out a2, out a3);
Console.WriteLine("average is {0}", average3(a1,a2,a3));
Console.ReadKey(true);
}
static void read3integers(out int x, out int y, out int z)
{
x = readInt("1st value: ");
y = readInt("2nd value: ");
z = readInt("3rd value: ");
}
static double average3(int x, int y, int z)
{
return (x+y+z)/3.0;
}
static int readInt(string prompt)
{
Console.Write(prompt);
int i = int.Parse(Console.ReadLine());
return i;
}
}
}
5. โปรแกรมคำนวณพื้นที่สี่เหลี่ยมคางหมู
ปรับแก้จากตัวอย่างการคำนวณค่าเฉลี่ย แสดงตัวอย่างการนำโปรแกรมที่แบ่งโครงสร้างที่ดีไว้แล้วมาปรับแก้
using System;
namespace SRch2_trapezoid
{
class Program
{
public static void Main()
{
double side1, side2, height;
Console.WriteLine("Give me the size of your trapezoid.");
readTrapezoid(out side1, out side2, out height);
Console.WriteLine("Trapezoid's area is {0}", trapezoidArea(side1, side2, height));
Console.ReadKey(true);
}
static void readTrapezoid(out double a, out double b, out double h)
{ // read the two parallel side lengths (a and b), and height of a trapezoid (h)
a = readDouble("Parallel side 1's length: ");
b = readDouble("Parallel side 2's length: ");
h = readDouble("Height: ");
}
static double trapezoidArea(double a, double b, double h)
{
return 0.5*(a+b)*h;
}
static double readDouble(string prompt)
{
Console.Write(prompt);
double d = double.Parse(Console.ReadLine());
return d;
}
}
}
โปรแกรมตัวอย่างอื่น ๆ
หาพื้นที่สี่เหลี่ยม
ตัวอย่างแสดงการแยกส่วนของการคำนวณเป็นโปรแกรมย่อย
using System;
class MainClass
{
static double SquareArea (double sideLength)
{
return sideLength * sideLength;
}
public static void Main (string[] args)
{
double s = Double.Parse (Console.ReadLine ());
double area = SquareArea (s);
Console.WriteLine ("{0}", area);
}
}
ตัวอย่าง 2 (มีการใช้หลาย method)
- TODO
ตัวอย่าง 3 (มีการใช้หลาย method, ใน method มีการเรียนใช้ method อื่น)
- TODO
นิพจน์เชิงตรรกและโครงสร้างคำสั่งแบบทางเลือก
- ทุกตัวอย่างมีการใช้โปรแกรมย่อยเสมอ
ตัวอย่างโปรแกรม
แก้สมการกำลังสอง
เป็นตัวอย่างของการเขียนโปรแกรมแก้สมการกำลังสอง โดยพิจารณาแบบ top-down
ส่วนแรกเป็นโปรแกรมหลักที่รับสัมประสิทธิ์ a,b,c และเรียกใช้โปรแกรมย่อยในการประมวลผล
เมท็อด Main
public static void Main (string[] args)
{
double a, b, c;
ReadCoefficients (out a, out b, out c);
SolveAndOutput (a, b, c);
}
เริ่มเขียนส่วนรับอินพุต
เขียนเมท็อด ReadCoefficients
static void ReadCoefficients(out double a, out double b, out double c)
{
Console.Write ("Please enter a:");
a = ReadDouble ();
Console.Write ("Please enter b:");
b = ReadDouble ();
Console.Write ("Please enter c:");
c = ReadDouble ();
}
ที่ใช้เมท็อด ReadDouble
static double ReadDouble()
{
string line = Console.ReadLine ();
return Double.Parse (line);
}
เมื่อเขียนถึงจุดนี้ควรจะทดสอบโปรแกรมเสียก่อน อาจจะต้อง comment SolveAndOutput ไปก่อน และเพิ่มคำสั่งในการพิมพ์ค่า a b c ออกมา
โครงหลักของการแก้สมการ SolveAndOutput มีเงื่อนไขเกี่ยวกับค่า ที่ต้องรวมการแสดงผลไว้ด้วยเพราะว่าแสดงผลได้สองแบบ (และเรายังคืนค่าเป็น complex ไม่เป็น) ซึ่งถ้าแบ่งงานอีกแบบคือให้โปรแกรมย่อยคืนค่าเป็นจำนวนเชิงซ้อนตลอดเวลา ก็จะเขียนได้สะอาดกว่านี้ ในตอนแรกเราจะเขียนแค่ส่วนหาคำตอบกรณีที่เป็นจำนวนจริงก่อนเพื่อให้สามารถทดสอบโปรแกรมได้เมื่อทำส่วนย่อยแรกนี้เสร็จ
เขียนในเมท็อด SolveAndOutput
static void SolveAndOutput(double a, double b, double c)
{
if (HasRealSolutions (a, b, c)) {
double sol1, sol2;
FindRealSolutions (a, b, c, out sol1, out sol2);
OutputRealSolutions (sol1, sol2);
} else {
}
}
ส่วนตรวจสอบว่ามีคำตอบเป็นจำนวนจริง (ไม่ได้ตรวจว่ามีคำตอบเดียวหรือเปล่า --- สามารถเก็บไปเป็นการบ้านที่ทำในแลบได้)
ในการตรวจสอบจะคำนวณ inner term ด้วยเมท็อด CalculateInnerTerm ก่อน จากนั้นจึงค่อนตรวจสอบค่า
static double CalculateInnerTerm(double a, double b, double c)
{
return b * b - 4 * a * c;
}
static bool HasRealSolutions(double a, double b, double c)
{
return CalculateInnerTerm (a, b, c) >= 0;
}
จากนั้นจึงเมท็อดที่เหลือในการหาคำตอบกรณีคำตอบเป็นจำนวนจริง
มีเมท็อด FindRealSolutions และ OutputRealSolutions
static void FindRealSolutions(double a, double b, double c,
out double sol1, out double sol2)
{
double innerTerm = CalculateInnerTerm (a, b, c);
sol1 = (-b + Math.Sqrt(innerTerm)) / (2 * a);
sol2 = (-b - Math.Sqrt(innerTerm)) / (2 * a);
}
static void OutputRealSolutions(double sol1, double sol2)
{
Console.WriteLine ("There are two real solutions: {0} and {1}", sol1, sol2);
}
เมื่อเขียนถึงตรงนี้ควรจะทดสอบโปรแกรมก่อน (ไม่ควรเขียนต่อ) เราควรเน้นให้นิสิตทดสอบโปรแกรมเป็นระยะ ๆ ไม่ใช่เขียนรวดเดียวแล้วทดสอบทีเดียว
จากนั้นเราจะเพิ่มส่วนคำนวณคำตอบในกรณีที่คำตอบเป็น complex ในเมท็อด SolveAndOutput (ในส่วน else)
เขียนเพิ่มเติมในเมท็อด SolveAndOutput
static void SolveAndOutput(double a, double b, double c)
{
if (HasRealSolutions (a, b, c)) {
double sol1, sol2;
FindRealSolutions (a, b, c, out sol1, out sol2);
OutputRealSolutions (sol1, sol2);
} else {
double sol1real, sol1img, sol2real, sol2img;
FindComplexSolutions (
a, b, c,
out sol1real, out sol1img,
out sol2real, out sol2img
);
OutputComplexSolutions (sol1real, sol1img, sol2real, sol2img);
}
}
โค้ดที่เหลือกรณีทีคำตอบเป็น complex (และไม่เป็นจำนวนจริง) เขียนคล้าย ๆ เดิม แต่ในการคืนคำตอบจะคืนสองคำตอบแยกเป็นส่วน real part และ imaginary part เราเลือกที่จะคำนวณคำตอบสองคำตอบให้เรียบร้อยใน FindComplexSolutions เลย แม้ว่าจะดูว่าเป็นการทำงานซ้ำซ้อน (เพราะว่า real part เท่ากัน) แต่เนื่องจากเราไม่ต้องการให้เงื่อนไขและรายละเอียดดังกล่าวไปปะปนอยู่ในส่วนแสดงผลลัพธ์
ด้านล่างเป็นเมท็อด FindComplexSolutions และ OutputComplexSolutions
static void FindComplexSolutions(double a, double b, double c,
out double sol1real, out double sol1img,
out double sol2real, out double sol2img)
{
double innerTerm = CalculateInnerTerm (a, b, c);
double realPart = -b / (2 * a);
double imgPart = Math.Sqrt(-innerTerm) / (2 * a);
sol1real = realPart;
sol1img = imgPart;
sol2real = realPart;
sol2img = -imgPart;
}
static void OutputComplexSolutions(double sol1real, double sol1img,
double sol2real, double sol2img)
{
Console.WriteLine (
"There are two complex solutions: {0}+{1}i and {2}-{3}i",
sol1real, sol1img,
sol2real, sol2img
);
}
คิดค่าส่งไปรษณีย์
แสดงการแบ่งงานเป็นหลายกรณี
using System;
class MainClass
{
const double MinWeightThreshold = 100;
static double CalculatePrice (double weight)
{
if (weight < MinWeightThreshold) {
return 1;
} else {
return weight / 100;
}
}
static double CalculatePriceWithFastDelivery (double weight)
{
if (weight < MinWeightThreshold) {
return 5;
} else {
double wlevel = weight / 100;
return 5 * wlevel * wlevel;
}
}
public static void Main (string[] args)
{
Console.Write ("Package weight:");
double weight = Double.Parse (Console.ReadLine ());
Console.Write ("Fast delivery? (Y/N)");
string answer = Console.ReadLine ();
double price;
if ((answer == "Y") || (answer == "y")) {
price = CalculatePriceWithFastDelivery (weight);
} else {
price = CalculatePrice (weight);
}
Console.Write ("You have to pay {0} baht.", price);
}
}
โครงสร้างคำสั่งแบบทางเลือกหลายชั้น
- ไม่ต้องสอน switch/case
- ใช้ flow-chart และตัวอย่างเยอะ ๆ
ตัวอย่างโปรแกรม
คำนวณค่ามากที่สุดของจำนวนสามจำนวน
แสดงตัวอย่างการเขียนใน 8 รูปแบบ (ถ้าไม่ได้สอน expression ที่ใช้ ?: คงไม่ต้องยกตัวอย่างรูปแบบที่ 7/8)
using System;
namespace max_of_3_many_versions_modular
{
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World! We'll find the max of 3 integers.");
// read 3 integers
int x = readInt("Enter 1st integer: ");
int y = readInt("Enter 2nd integer: ");
int z = readInt("Enter 3rd integer: ");
Console.WriteLine("version 1: max = {0}", max3ver1(x, y, z));
Console.WriteLine("version 2: max = {0}", max3ver2(x, y, z));
Console.WriteLine("version 3: max = {0}", max3ver3(x, y, z));
Console.WriteLine("version 4: max = {0}", max3ver4(x, y, z));
Console.WriteLine("version 5: max = {0}", max3ver5(x, y, z));
Console.WriteLine("version 6: max = {0}", max3ver6(x, y, z));
Console.WriteLine("version 7: max = {0}", max3ver7(x, y, z));
Console.WriteLine("version 8: max = {0}", max3ver8(x, y, z));
Console.ReadKey(true);
}
static int readInt(string prompt)
{
Console.Write(prompt);
return int.Parse(Console.ReadLine());
}
// version 1: (if without else)
// exactly 6 comparisons in all cases
static int max3ver1(int a, int b, int c)
{
int max = int.MinValue; // to please the compiler
if (a >= b && a >= c)
max = a;
if (b >= a && b >= c)
max = b;
if (c >= a && c >= b)
max = c;
return max;
}
// version 2: (if without else)
// a little more efficient than version 1
// performs 2 to 6 comparisons depending on inputs
static int max3ver2(int a, int b, int c)
{
if (a >= b && a >= c)
return a;
if (b >= a && b >= c)
return b;
if (c >= a && c >= b)
return c;
return int.MinValue; // to please the compiler
}
// version 3: (nested if-else is used)
// still more efficient than version 2
// only 2 or 3 comparisons depending on inputs
static int max3ver3(int a, int b, int c)
{
if (a >= b && a >= c) // try a
return a;
else // a is not the max
if (b > c)
return b;
else
return c;
}
// version 4: (nested if-else is used)
// a little more efficient than version 3
// exactly 2 comparisons in all cases
static int max3ver4(int a, int b, int c)
{
if (a > b)
// b is not the max
if (a > c)
return a;
else
return c;
else // a is not the max
if (b > c)
return b;
else
return c;
}
// version 5: (no nested if, just a sequence of if's)
// exactly 2 comparisons in all cases
// not more efficient than version 4
// but more easily extended to 4 or more integers
static int max3ver5(int a, int b, int c)
{
int max;
if (a > b)
max = a;
else
max = b;
if (c > max)
max = c;
return max;
}
// version 6: a cute, enlightening, climactic, lazy-programming version
// This version is probably hailed by Lao zi as well as the Jedi order
// By the way, it actually has exactly the same logic as version 5.
static int max3ver6(int a, int b, int c)
{
return Math.Max(Math.Max(a,b),c);
}
// version 7: a non-readable C-style version (lol ha ha ha)
// However this version actually has exactly the same logic as version 5 and 6.
static int max3ver7(int a, int b, int c)
{
int max;
if (c > (max=a>b?a:b))
max = c;
return max;
}
// version 8: even less readable, uglily elegant version (can't laugh now)
// We are entering the dark side here.
// Nevertheless this version still has exactly the same logic as version 5, 6, and 7.
static int max3ver8(int a, int b, int c)
{
int max;
return (max=a>b?a:b) > c ? max:c;
}
}
}
โครงสร้างคำสั่งแบบวนซ้ำ
- Notes: while, do-while ใช้ flow-chart ช่วย, แทรก ++/-- ณ จุดนี้
โครงสร้างคำสั่งแบบวนซ้ำและอาร์เรย์ 1 มิติ
- Notes: for-loop, ใช้ flow chart ไฟล์อินพุต
ตัวอย่างโปรแกรม
คำนวณผลรวมของจำนวนเต็ม 5 จำนวน (ไม่ใช้ array)
สองตัวอย่างแรกจะใช้เพื่อแสดงความจำเป็นของการใช้อาร์เรย์
using System;
class MainClass
{
static int ReadInt()
{
return int.Parse (Console.ReadLine ());
}
public static void Main (string[] args)
{
int x1, x2, x3, x4, x5;
x1 = ReadInt ();
x2 = ReadInt ();
x3 = ReadInt ();
x4 = ReadInt ();
x5 = ReadInt ();
int sum = x1 + x2 + x3 + x4 + x5;
Console.WriteLine ("Total = {0}", sum);
}
}
คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ไม่ใช้ array)
เอาโปรแกรมเดิมมาแก้ให้เป็น 10 ตัวแปร
using System;
class MainClass
{
static int ReadInt()
{
return int.Parse (Console.ReadLine ());
}
public static void Main (string[] args)
{
int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10;
x1 = ReadInt ();
x2 = ReadInt ();
x3 = ReadInt ();
x4 = ReadInt ();
x5 = ReadInt ();
x6 = ReadInt ();
x7 = ReadInt ();
x8 = ReadInt ();
x9 = ReadInt ();
x10 = ReadInt ();
int sum = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10;
Console.WriteLine ("Total = {0}", sum);
}
}
คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ใช้ array + while loop)
ประกาศตัวแปรแบบ array และคำนวณผลรวม
using System;
class MainClass
{
static int ReadInt()
{
return int.Parse (Console.ReadLine ());
}
public static void Main (string[] args)
{
int[] x = new int[10];
int i = 0;
while (i < 10) {
x [i] = ReadInt ();
i++;
}
int sum = 0;
i = 0;
while (i < 10) {
sum += x[i];
i++;
}
Console.WriteLine ("Total = {0}", sum);
}
}
คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ใช้ array + for loop)
ประกาศตัวแปรแบบ array และคำนวณผลรวม
using System;
class MainClass
{
static int ReadInt()
{
return int.Parse (Console.ReadLine ());
}
public static void Main (string[] args)
{
int[] x = new int[10];
for(int i = 0; i < 10; i++) {
x [i] = ReadInt ();
}
int sum = 0;
for(int i=0; i < 10; i++) {
sum += x[i];
}
Console.WriteLine ("Total = {0}", sum);
}
}
คำนวณผลรวมของจำนวนเต็ม 10 จำนวน (ใช้ array + for loop + โปรแกรมย่อย)
ถ้ายังไม่สอนตอนนี้ ก็ข้ามตัวอย่างนี้ไปก่อนได้ครับ
ประกาศตัวแปรแบบ array และคำนวณผลรวม โดยแบ่งงานเป็นส่วน ๆ ด้วยโปรแกรมย่อย
using System;
class MainClass
{
static int ReadInt()
{
return int.Parse (Console.ReadLine ());
}
static int [] ReadArray(int size)
{
int[] x = new int[size];
for (int i = 0; i < size; i++) {
x [i] = ReadInt ();
}
return x;
}
static int FindSum(int[] x, int size)
{
int sum = 0;
for (int i = 0; i < size; i++) {
sum += x [i];
}
return sum;
}
public static void Main (string[] args)
{
int[] x = ReadArray (10);
int sum = FindSum(x, 10);
Console.WriteLine ("Total = {0}", sum);
}
}
โครงสร้างคำสั่งแบบวนซ้ำหลายชั้น
- Notes: continue และ break
โปรแกรมย่อยขั้นสูง
- Notes: เช่น pass by reference, ส่ง array เข้าเมท็อด, string processing
อาเรย์หลายมิติ
- Notes: นำเข้าข้อมูลจาก csv
การแก้โจทย์เชิงประยุกต์
- Notes: เสริมเนื้อหาเช่น GUI