01204111 model codes
ตัวอย่างโปรแกรมที่ควรเขียนได้และเข้าใจเมื่อเรียนเนื้อหาแต่ละส่วน
เนื้อหา
- 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 ตัวอย่างเช่น
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