ผลต่างระหว่างรุ่นของ "01204111 model codes"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
แถว 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">
ส่วนแรกเป็นโปรแกรมหลักที่รับสัมประสิทธิ์ a,b,c และเรียกใช้โปรแกรมย่อยในการประมวลผล
+
เมท็อด 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 มีเงื่อนไขเกี่ยวกับค่า <math>b^2-4ac</math>  ที่ต้องรวมการแสดงผลไว้ด้วยเพราะว่าแสดงผลได้สองแบบ (และเรายังคืนค่าเป็น complex ไม่เป็น) ซึ่งถ้าแบ่งงานอีกแบบคือให้โปรแกรมย่อยคืนค่าเป็นจำนวนเชิงซ้อนตลอดเวลา ก็จะเขียนได้สะอาดกว่านี้
+
เขียนในเมท็อด 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 realPart, imgPart;
+
             double sol1real, sol1img, sol2real, sol2img;
             FindComplexSolutions (a, b, c, realPart, imgPart);
+
             FindComplexSolutions (a, b, c, sol1real, sol1img, sol2real, sol2img);
             OutputComplexSolutions (realPart, imgPart);
+
             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">
กรณีทีคำตอบเป็น complex (และไม่เป็นจำนวนจริง)
+
เขียนคล้าย ๆ เดิม แต่ในการคืนคำตอบจะคืนสองคำตอบแยกเป็นส่วน 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 realPart, out double imgPart)
+
                                     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 realPart, double imgPart)
+
     static void OutputComplexSolutions(double sol1real, double sol1img,
 +
                                      double sol2real, double sol2img)
 
     {
 
     {
         Console.WriteLine ("There are two complex solutions: {0}+{1}i and {0}-{1}i", realPart, imgPart);
+
         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 คาบ
  • องค์ประกอบคอมพิวเตอร์เบื้องต้น
    • ฮาร์ดแวร์ ซอฟต์แวร์ และระบบปฏิบัติการ
  • การแทนข้อมูล
  • ระบบเลขฐาน
  • เครือข่ายคอมพิวเตอร์และอินเทอร์เน็ต (?)
  • มโนทัศน์การโปรแกรม
    • ภาษาระดับต่ำ
    • ภาษาระดับสูง
    • การแปลภาษา
    • ขั้นตอนวิธีและการแตกปัญหาเป็นปัญหาย่อย
    • โฟลว์ชาร์ท

ตัวอย่างโปรแกรม

โปรแกรมการกินข้าว

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