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

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
แถว 207: แถว 207:
 
int i = int.Parse(Console.ReadLine());
 
int i = int.Parse(Console.ReadLine());
 
return i;
 
return i;
 +
}
 +
}
 +
}
 +
</syntaxhighlight>
 +
</div>
 +
</div>
 +
 +
'''5. โปรแกรมคำนวณพื้นที่สี่เหลี่ยมคางหมู'''
 +
<div class="toccolours mw-collapsible mw-collapsed">
 +
ปรับแก้จากตัวอย่างการคำนวณค่าเฉลี่ย แสดงตัวอย่างการนำโปรแกรมที่แบ่งโครงสร้างที่ดีไว้แล้วมาปรับแก้
 +
<div class="mw-collapsible-content">
 +
<syntaxhighlight lang="csharp">
 +
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;
 
}
 
}
 
}
 
}

รุ่นแก้ไขเมื่อ 22:52, 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 ตัวอย่างเช่น
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

นิพจน์เชิงตรรกและโครงสร้างคำสั่งแบบทางเลือก

  • ทุกตัวอย่างมีการใช้โปรแกรมย่อยเสมอ

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

คิดค่าส่งไปรษณีย์

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 และตัวอย่างเยอะ ๆ

โครงสร้างคำสั่งแบบวนซ้ำ

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