ผลต่างระหว่างรุ่นของ "01204111 model codes"
Jittat (คุย | มีส่วนร่วม) |
Jittat (คุย | มีส่วนร่วม) |
||
แถว 302: | แถว 302: | ||
เป็นตัวอย่างของการเขียนโปรแกรมแก้สมการกำลังสอง <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"> | ||
แถว 317: | แถว 318: | ||
</div> | </div> | ||
− | + | เริ่มเขียนส่วนรับอินพุต | |
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
เขียนเมท็อด ReadCoefficients | เขียนเมท็อด ReadCoefficients | ||
แถว 334: | แถว 335: | ||
</div> | </div> | ||
</div> | </div> | ||
− | |||
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
แถว 349: | แถว 349: | ||
</div> | </div> | ||
− | + | โครงหลักของการแก้สมการ 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"> | ||
แถว 361: | แถว 361: | ||
OutputRealSolutions (sol1, sol2); | OutputRealSolutions (sol1, sol2); | ||
} else { | } else { | ||
− | double | + | double sol1real, sol1img, sol2real, sol2img; |
− | FindComplexSolutions (a, b, c, | + | FindComplexSolutions (a, b, c, sol1real, sol1img, sol2real, sol2img); |
− | OutputComplexSolutions ( | + | OutputComplexSolutions (sol1real, sol1img, sol2real, sol2img); |
} | } | ||
} | } | ||
แถว 370: | แถว 370: | ||
</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: | แถว 388: | ||
</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"> | ||
แถว 410: | แถว 410: | ||
</div> | </div> | ||
+ | เมื่อเขียนถึงตรงนี้ควรจะทดสอบโปรแกรมก่อน (ไม่ควรเขียนต่อ) โดยในการทดสอบนั้น เพื่อให้โปรแกรมทำงานได้ ต้อง comment ส่วนด้านหลังของ else ใน SolveAndOutput ไปก่อน | ||
+ | โค้ดที่เหลือกรณีทีคำตอบเป็น complex (และไม่เป็นจำนวนจริง) | ||
<div class="toccolours mw-collapsible mw-collapsed"> | <div class="toccolours mw-collapsible mw-collapsed"> | ||
− | + | เขียนคล้าย ๆ เดิม แต่ในการคืนคำตอบจะคืนสองคำตอบแยกเป็นส่วน real part และ imaginary part | |
<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> |
รุ่นแก้ไขเมื่อ 23:42, 20 มิถุนายน 2559
ตัวอย่างโปรแกรมที่ควรเขียนได้และเข้าใจเมื่อเรียนเนื้อหาแต่ละส่วน
เนื้อหา
- 1 แนะนำคอมพิวเตอร์และการโปรแกรม
- 2 ตัวแปร นิพจน์ โปรแกรมเชิงลำดับอย่างง่าย อินพุต/เอาท์พุต
- 3 โปรแกรมย่อยและไลบรารี
- 4 นิพจน์เชิงตรรกและโครงสร้างคำสั่งแบบทางเลือก
- 5 โครงสร้างคำสั่งแบบทางเลือกหลายชั้น
- 6 โครงสร้างคำสั่งแบบวนซ้ำ
- 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)
โปรแกรมย่อยและไลบรารี
- เป้าหมาย: การใช้โปรแกรมย่อยเพื่อการแบ่งปัญหาเป็นปัญหาย่อย และเพื่อให้โปรแกรมอ่านเข้าใจง่าย (ไม่ใช่เพื่อทำให้โปรแกรมสั้นลง)
- 1 คาบ
- การเรียกใช้ฟังก์ชันในคลาส Math และทบทวนการเรียกใช้ฟังก์ชันที่เคยทำมาแล้ว (ReadLine, WriteLine, Parse ฯลฯ)
- การสร้างโปรแกรมย่อยและฟังก์ชันขึ้นมาด้วยตนเองเพื่อคำนวณสูตรที่ไม่มีให้ในไลบรารี
- พารามิเตอร์และการส่งค่า
- ความหมายของพารามิเตอร์และอาร์กิวเมนต์
- ครอบคลุมเฉพาะ pass by value
- ?? การกำหนดพารามิเตอร์ด้วย keyword argument ตัวอย่างเช่น
คลิก "ขยาย" เพื่อดูตัวอย่างโปรแกรม
- สโคปของตัวแปร
ลำดับของโปรแกรมที่จะพัฒนา
1. โปรแกรมคำนวณพื้นที่วงกลม 1
ตัวอย่างแรกสุดที่แสดงการเรียกโปรแกรมย่อยโดยไม่ต้องส่งพารามิเตอร์ใดๆ เพื่อแสดง top-down design ขั้นพื้นฐาน
2. โปรแกรมคำนวณพื้นที่วงกลม 2
ทำงานเดียวกับโปรแกรมแรก แต่มีการเรียกโปรแกรมย่อยที่มีพารามิเตอร์แบบ pass by value และรีเทิร์นผลลัพธ์ แสดงการออกแบบโปรแกรมแบบ modular และ stepwise refinement มากยิ่งขึ้น
3. โปรแกรมคำนวณค่าเฉลี่ยของตัวแปร 3 ตัว (version 2)
หาค่าเฉลี่ยของจำนวนเต็มสามตัว เป็นโปรแกรมที่ปรับมาจากโปรแกรมที่ Main ทำทุกอย่าง เป็นอีกตัวอย่างที่แสดงการใช้โปรแกรมย่อย
4. โปรแกรมคำนวณค่าเฉลี่ยของตัวแปร 3 ตัว (version 3)
หาค่าเฉลี่ยของจำนวนเต็มสามตัว ใช้ out พารามิเตอร์ในการส่งค่ากลับ
5. โปรแกรมคำนวณพื้นที่สี่เหลี่ยมคางหมู
ปรับแก้จากตัวอย่างการคำนวณค่าเฉลี่ย แสดงตัวอย่างการนำโปรแกรมที่แบ่งโครงสร้างที่ดีไว้แล้วมาปรับแก้
โปรแกรมตัวอย่างอื่น ๆ
หาพื้นที่สี่เหลี่ยม
ตัวอย่างแสดงการแยกส่วนของการคำนวณเป็นโปรแกรมย่อย
ตัวอย่าง 2 (มีการใช้หลาย method)
- TODO
ตัวอย่าง 3 (มีการใช้หลาย method, ใน method มีการเรียนใช้ method อื่น)
- TODO
นิพจน์เชิงตรรกและโครงสร้างคำสั่งแบบทางเลือก
- ทุกตัวอย่างมีการใช้โปรแกรมย่อยเสมอ
ตัวอย่างโปรแกรม
แก้สมการกำลังสอง
เป็นตัวอย่างของการเขียนโปรแกรมแก้สมการกำลังสอง โดยพิจารณาแบบ top-down
ส่วนแรกเป็นโปรแกรมหลักที่รับสัมประสิทธิ์ a,b,c และเรียกใช้โปรแกรมย่อยในการประมวลผล
เมท็อด Main
เริ่มเขียนส่วนรับอินพุต
เขียนเมท็อด ReadCoefficients
ที่ใช้เมท็อด ReadDouble
โครงหลักของการแก้สมการ SolveAndOutput มีเงื่อนไขเกี่ยวกับค่า ที่ต้องรวมการแสดงผลไว้ด้วยเพราะว่าแสดงผลได้สองแบบ (และเรายังคืนค่าเป็น complex ไม่เป็น) ซึ่งถ้าแบ่งงานอีกแบบคือให้โปรแกรมย่อยคืนค่าเป็นจำนวนเชิงซ้อนตลอดเวลา ก็จะเขียนได้สะอาดกว่านี้
เขียนในเมท็อด SolveAndOutput
ส่วนตรวจสอบว่ามีคำตอบเป็นจำนวนจริง (ไม่ได้ตรวจว่ามีคำตอบเดียวหรือเปล่า --- สามารถเก็บไปเป็นการบ้านที่ทำในแลบได้)
ในการตรวจสอบจะคำนวณ inner term ด้วยเมท็อด CalculateInnerTerm ก่อน จากนั้นจึงค่อนตรวจสอบค่า
จากนั้นจึงเมท็อดที่เหลือในการหาคำตอบกรณีคำตอบเป็นจำนวนจริง
มีเมท็อด FindRealSolutions และ OutputRealSolutions
เมื่อเขียนถึงตรงนี้ควรจะทดสอบโปรแกรมก่อน (ไม่ควรเขียนต่อ) โดยในการทดสอบนั้น เพื่อให้โปรแกรมทำงานได้ ต้อง comment ส่วนด้านหลังของ else ใน SolveAndOutput ไปก่อน
โค้ดที่เหลือกรณีทีคำตอบเป็น complex (และไม่เป็นจำนวนจริง)
เขียนคล้าย ๆ เดิม แต่ในการคืนคำตอบจะคืนสองคำตอบแยกเป็นส่วน real part และ imaginary part
คิดค่าส่งไปรษณีย์
แสดงการแบ่งงานเป็นหลายกรณี
โครงสร้างคำสั่งแบบทางเลือกหลายชั้น
- ไม่ต้องสอน switch/case
- ใช้ flow-chart และตัวอย่างเยอะ ๆ
ตัวอย่างโปรแกรม
คำนวณค่ามากที่สุดของจำนวนสามจำนวน
แสดงตัวอย่างการเขียนใน 8 รูปแบบ (ถ้าไม่ได้สอน expression ที่ใช้ ?: คงไม่ต้องยกตัวอย่างรูปแบบที่ 7/8)
โครงสร้างคำสั่งแบบวนซ้ำ
- Notes: while, do-while ใช้ flow-chart ช่วย, แทรก ++/-- ณ จุดนี้
โครงสร้างคำสั่งแบบวนซ้ำและอาร์เรย์ 1 มิติ
- Notes: for-loop, ใช้ flow chart ไฟล์อินพุต
โครงสร้างคำสั่งแบบวนซ้ำหลายชั้น
- Notes: continue และ break
โปรแกรมย่อยขั้นสูง
- Notes: เช่น pass by reference, ส่ง array เข้าเมท็อด, string processing
อาเรย์หลายมิติ
- Notes: นำเข้าข้อมูลจาก csv
การแก้โจทย์เชิงประยุกต์
- Notes: เสริมเนื้อหาเช่น GUI