การโปรแกรม C#: นิพจน์ เงื่อนไข และการทาซา้ 01204111 คอมพิวเตอร์และการโปรแกรม แผนการ • นิพจน์ การอ่านข้อมูลเข้า และการแสดงผล • การควบคุมการไหลของโปรแกรม – นิพจน์ตรรกศาสตร์ – เงือ่ นไข – การทาซ้า ภาพรวม การทาซา้ คาสั่งเงื่อนไข การควบคุมการไหลของโปรแกรม: นิพจน์ ตรรกศาสตร์ (เงื่อนไข) การแปลงข้ อมูล, เมธอดทางคณิตศาสตร์ พืน้ ฐาน ตัวแปร, นิพจน์ , การอ่ านข้ อมูลเข้ า การส่ งข้ อมูลออก คาเตือน • เนื้อหาในการบรรยายครัง้ นี้จะค่อนข้างเยอะ เมือ่ เทียบกับการบรรยาย ก่อนช่วงการสอบกลางภาค • อย่างไรก็ตาม ไม่วา่ เราจะเขียนภาษาใด แนวคิดหลัก ๆ ของการ โปรแกรมนัน้ จะยังเหมือนเดิม • แต่สงิ่ ทีจ่ ะเปลีย่ นไปคือ – ไวยากรณ์ทน่ี ิสติ จะต้องพยายามปรับเล็กน้อย – แนวคิดปลีกย่อยต่าง ๆ ซึง่ จะได้เน้นต่อไป โปรแกรมภาษา C#: ทบทวน using System; namespace Sample { class Program { static void Main() { Console.WriteLine("Hello, world"); } } } • โปรแกรมจะเริม่ ทางานทีเ่ มธอด Main • โปรแกรมประกอบด้วย namespace, class และ method • อาจไม่ตอ้ งประกาศส่วน namespace ก็ได้ ภายในเมธอด Main • การประกาศตัวแปร • คาสัง่ static void Main(string[] args) { const double pi = 3.1416; int radius; double area; radius = int.Parse(Console.ReadLine()); area = pi*radius*radius; Console.WriteLine(area); } ข้อควรระวัง 1 การปิดคาสัง่ • ในภาษา C# ทุก ๆ คาสังจะต้ ่ องปิดด้วยเครือ่ งหมาย ; int x; int y = 10; x = int.Parse(Console.ReadLine()); if(x > y) Console.WriteLine("Good"); • ยกเว้นกรณีทเ่ี ป็ นคาสังรวม ่ ทีร่ วมกันในเครือ่ งหมาย { } if(x <= y) { Console.WriteLine("Ummm"); Console.WriteLine("Try harder."); } ตัวแปร: ทบทวน • เมือ่ เราต้องการเก็บค่าระหว่างการทางาน เราจะใช้ตวั แปร (variable) • ในภาษา C# ก่อนใช้ตวั แปรต้อง – มีการประกาศก่อน – ระบุแบบชนิด (type) ของข้อมูลทีจ่ ะเก็บในตัวแปรนัน้ แบบชนิดข้อมูลพืน้ ฐานใน C#: ทบทวน Type Size Description bool char byte 1 byte 1 byte 1 byte Store truth value Store one character Store positive integer short int 2 byte 4 byte Store integer Store integer long 8 byte Store integer double 16 byte Store real number string N/A Store sequence of characters Range true / false character code 0 – 255 0 – 255 -32,768 -- 32,767 -2.1 x 109 -- 2.1 x 109 -9.2 x 1018 -- 9.2 x 1018 ± 5.0x10-324 -± 1.7x10308 N/A แบบข้อมูลที่สาคัญ • ค่าตรรกะ bool – มีสองค่า คือ true และ false • จานวนเต็ม int – เก็บค่าในขอบเขต 2.1 x 109 -- 2.1 x 109 • จานวนจริง double – เก็บค่าในขอบเขต ± 5.0x10-324 -- ± 1.7x10308 แบบข้อมูลที่สาคัญ • ข้อความ string – เขียนในเครือ่ งหมายคาพูดคูเ่ ท่านัน้ เช่น "Hello" – ถ้าต้องการเครือ่ งหมายคาพูด ให้นาหน้าด้วย \ เช่น s = "He says \"I love you.\""; Console.WriteLine(s); He says "I love you." • อักขระ char – แทนอักษรตัวเดียว เขียนในเครือ่ งหมายคาพูดเดีย่ ว ตัวแปร: ชื่อ • ตัวแปรจะต้องมีชอ่ื การตัง้ ชือ่ จะต้องทาตามกฎง่าย ๆ ดังนี้ – ประกอบด้วย: ตัวเลข ตัวอักษรภาษาอังกฤษ หรืออักษรขีดเส้นใต้ – ตัวแรกต้องเป็ นตัวอักษรภาษาอังกฤษ หรือขีดเส้นใต้ (_) – ไม่ซ้ากับชื่อสงวน (reserved words) • ตัวพิมพ์เล็ก-ตัวพิมพ์ใหญ่ แตกต่างกัน ตัวอย่ าง _data name Name point9 9point class class_A class_”A” การประกาศตัวแปร: ทบทวน • จะต้องระบุแบบชนิด • สามารถกาหนดค่าเริม่ ต้นไปพร้อม กันได้ int radius; string firstName; double GPA; int radius = 5; string firstName = "john"; double GPA = 2.4; นิพจน์ • การคานวณค่าต่าง ๆ จะเขียนเป็ นนิพจน์ (expression) คล้ายคลึงกับใน Python นิพจน์ นิพจน์เลขคณิต นิพจน์ตรรก ตัวดาเนินการ • สาหรับตัวดาเนินการเลขคณิตโดยมากแล้วทางานเหมือนใน ไพธอน ยกเว้นเครือ่ งหมายหาร ( / ) – ตัวดาเนินการ: + - * / – ตัวดาเนินการ: % (หารเอาเศษ) • การคานวณค่าของนิพจน์จะประมวลผลตัวดาเนินการ ตามลาดับความสาคัญ ตัวดาเนินการ • นิพจนเหล านี ี าเท ์ ่ ้มค ่ าใด? ่ – 11 + 5 16 หารจานวนเต็ม ได้ ผลลัพธ์ เป็ นจานวนเต็ม – 39 / 5 7 – 39.0/5 7.8 การหารที่เกี่ยวข้ องกับจานวนจริง ผลลัพธ์ เป็ นจานวนจริง – 39 % 5 4 – 5.0 % 2.2 0.6 การอ่านข้อมูลเข้า • เมธอดหลักทีเ่ ราจะใช้ในการอ่านข้อมูลเข้าเป็ นสตริงในภาษา C# คือเมธอด Console.ReadLine() string name = Console.ReadLine(); Console.WriteLine("Your name is {0}", name); การแปลงข้อมูลจากสตริง • อย่างไรก็ตาม ถ้าเราต้องการนาข้อมูลไปคานวณ เราจาเป็ น จะต้องแปลงสตริง ให้เป็ นข้อมูลประเภททีเ่ ราต้องการ – เมธอด int.Parse แปลงสตริงเป็ นจานวนเต็ม – เมธอด double.Parse แปลงสตริงเป็ นจานวนจริง string sc = Console.ReadLine(); int count = int.Parse(Console.ReadLine()); int age = int.Parse(Console.ReadLine()); double time = double.Parse(Console.ReadLine()); การแสดงผล • เมธอด Console.Write กับ Console.WriteLine ทา หน้าทีห่ ลักในการแสดงผลออกทางจอภาพ – เมธอด Console.Write ทางานเหมือนกับ Console.WriteLine แต่ ไม่ขน้ึ บรรทัดใหม่ • เราสามารถจัดรูปแบบการแสดงผลได้โดยง่ายด้วยเมธอดทัง้ สองนี้ การใช้งานเมท็อด Console.WriteLine • การใช้งานทัวไป ่ Console.WriteLine("Hello"); Console.WriteLine(area); • การระบุกรอบสาหรับพิมพ์ Console.WriteLine(”Size {0}x{1}”, width, height); • การกาหนดรูปแบบการพิมพ์ double salary=12000; Console.WriteLine("My salary is {0:f2}.", salary); 20 มุมนักคิด • เขียนโปรแกรมรับส่วนสูง (เป็ นเมตร) และน้าหนัก (เป็ น กิโลกรัม) จากนัน้ คานวณค่า BMI ตามสูตรต่อไปนี้ BMI = Weight in Kilograms (Height in Meters) X (Height in Meters) Enter weight (in kg): 83 Enter height (in m): 1.7 Your BMI is 28.72. เฉลยมุมนักคิด public static void Main(string[] args) { Console.Write("Enter weight (in kg): "); double w = double.Parse(Console.ReadLine()); Console.Write("Enter height (in m): "); double h = double.Parse(Console.ReadLine()); Console.WriteLine("Your BMI is {0}.", w / (h*h)); (กดเพือ่ แสดง) Console.ReadLine(); } จัดรูปแบบไม่ สวย Enter weight (in kg): 83 Enter height (in m): 1.7 Your BMI is 28.719723183391. การจัดรูปแบบการพิมพ์อย่างง่าย • ในการแสดงผลจานวนจริง WriteLine อาจแสดงผลด้วยความละเอียด ทีม่ ากเกินไป Console.WriteLine("Your BMI is {0:f2}.", w / (h*h)); เพิ่มรูปแบบการแสดงผล :f2 เข้ าไปในสตริงระบุวิธีการพิมพ์ f หมายถึงแสดงจานวนจริงเป็ นทศนิยม, 2 ระบุจานวนหลักของทศนิยม Enter weight (in kg): 83 Enter height (in m): 1.7 Your BMI is 28.72. มุมนักคิด 1: มดข้ามสะพาน • มีสะพานอันหนึ่งยาว m เมตร มดตัวหนึ่งเริม่ ต้นเดินจากปลายสะพาน ด้านหนึ่งด้วยความเร็ว v เมตร/วินาที เมือ่ เดินไปถึงปลายอีกข้างก็จะ กลับหลังหันแล้วเดินกลับมาทันทีดว้ ยความเร็วเท่าเดิม มดตัวนัน้ เดิน ไปเป็ นเวลา t นาที ถามว่ามดเดินข้ามสะพานครบกีร่ อบ (เดินรอบ หนึ่งคือเดินไป-กลับมาทีจ่ ุดเริม่ ต้นไม่นบั รอบทีเ่ ดินไม่ครบ เขียนโปรแกรมรับค่า m, v, และ t เป็ นจานวนจริง แล้วคานวณว่ามดเดินไปได้ครบกี่รอบ แนวคิด • จากเวลาและความเร็วสามารถคานวณระยะทางทีม่ ดเดินได้ • จากระยะทางทีม่ ดเดิน และความยาวของสะพาน สามารถหา จานวนรอบทีม่ ดเดินได้ โดยการหาร – อย่างไรก็ตาม เราจะต้องปดั เศษทีไ่ ด้จากการหารทิง้ ด้วย เพราะ เราต้องการได้จานวนรอบทีเ่ ดินได้ครบ – เราจะเขียนส่วนทีค่ านวนแล้วได้จานวนรอบเป็ นทศนิยมก่อน แล้ว ค่อยมาปรับแก้ในส่วนนี้ เฉลยมุมนักคิด 1 (ครึ่งทาง) • แสดงเฉพาะส่วนเมธอด Main static void Main() { Console.Write("Enter m (m): "); double m = double.Parse(Console.ReadLine()); Console.Write("Enter v (m/s): "); double v = double.Parse(Console.ReadLine()); Console.Write("Enter t (min): "); double t = double.Parse(Console.ReadLine()); (กดเพือ่ แสดง) double dist = v * t * 60; double walk = dist / (2*m); Console.WriteLine("Number of times = {0}", walk); Console.ReadLine(); } การแปลงแบบชนิดข้อมูล • ข้อมูลหลายแบบชนิดสามารถแปลงไปมาได้ • ภาษา C# จะแปลงข้อมูลแบบชนิดทีเ่ ล็กกว่าไปหาข้อมูลที่ แบบชนิดใหญ่กว่าให้โดยอัตโนมัติ short int long int double การบังคับแปลงแบบชนิดข้อมูล • สาหรับการแปลงทีน่ อกเหนือจากนัน้ เราจะต้องบังคับให้เกิดการแปลง เอง (เรียกว่าการ cast) รูปแบบของการแปลงเป็ นดังนี้ (แบบชนิดข้อมูลใหม่) ค่า • ตัวอย่างเช่น ถ้าเราต้องการแปลงจานวนจริง 2.75 เป็ นจานวนเต็ม เราจะเขียน ได้ผลลัพธ์เป็ น 2 (int) 2.75 ในการแปลง เป็ นต้น double เป็ น int • บางครัง้ จะต้องใส่วงเล็บในส่วนค่าทีจ่ ะแปลงด้วย จะปัดลงเสมอ เฉลยมุมนักคิด 1 • แสดงเฉพาะส่วนเมธอด Main static void Main() { Console.Write("Enter m (m): "); double m = double.Parse(Console.ReadLine()); Console.Write("Enter v (m/s): "); double v = double.Parse(Console.ReadLine()); Console.Write("Enter t (min): "); double t = double.Parse(Console.ReadLine()); (กดเพือ่ แสดง) double dist = v * t * 60; int walk = (int)(dist / (2*m)); Console.WriteLine("Number of times = {0}", walk); Console.ReadLine(); } ตัวดาเนินการเพิ่มเติม • ในภาษา C# ยังมีตวั ดาเนินการอีกสองแบบทีม่ ปี ระโยชน์ – ตัวดาเนินการสาหรับการเพิม่ ลดค่าทีละหนึ่ง – ตัวดาเนินการสาหรับปรับค่า ตัวดาเนินการสาหรับปรับค่า • เช่นเดียวกับในภาษาไพธอน ภาษา C# มีตวั ดาเนินการทีใ่ ช้ สาหรับปรับค่าตัวแปร x = x + 10 x += 10 y = y * 7 y *= 7 z = z / 7 z /= 7 ตัวดาเนินการ ++, -• หลายครัง้ ทีเ่ ราต้องการเพิม่ ค่าตัวแปรครัง้ ละ 1 เรามีตวั ดาเนินการพิเศษสาหรับการนี้โดยเฉพาะ x = x + 1 x += 1 x++ x = x - 1 x -= 1 x-- ตัวอย่าง: ไล่พิมพ์ค่า int a = 1; while(a <= 10) { Console.WriteLine(a); int a = 1; while(a <= 10) { Console.WriteLine(a); a = a + 1; } } int a = 1; while(a <= 10) { Console.WriteLine(a); a++; } a += 1; ฟั งก์ชนั ทางคณิตศาสตร์ • ภาษา C# มีชุดคาสังเพื ่ อ่ คานวณทางคณิตศาสตร์ เมธอด เหล่านี้รวมอยูใ่ นคลาส Math ดังแสดงเป็ นรายการในหน้า ถัดไป รายการเมธอดทางคณิตศาสตร์ Method/ Constant Value returned Example Call Result PI Value of Math.PI 3.1415927 Max(x,y) Larger of the two Math.Max(1,2) 2 Abs(x) Absolute value of x Math.Abs(-1.3) 1.3 Sqrt(x) Square-root of x Math.Sqrt(4.0) 2.0 Round(x) Nearest integer to x Math.Round(0.8) 1 Pow(x,y) xy Math.Pow(3,2) 9.0 Log(x) Natural log of x Math.Log(10) 2.302585 Ceiling(x) Smallest integer greater Math.Ceiling(4.1) than or equal to x 5 Cos(x) Cosine of x radians -1 Math.Cos(Math.PI) มุมนักคิด จงเขียนโปรแกรมรับรัศมีของวงกลม จากนัน้ คานวณพืน้ ทีข่ อง วงกลมนัน้ Enter radius: 6 The area is 113.0973 คาแนะนา: Math.PI การควบคุมการไหลของโปรแกรม • หัวใจของการควบคุม: เงือ่ นไข หรือ นิพจน์ตรรกศาสตร์ • กรอบของการควบคุม: – คาสังเงื ่ อ่ นไข: if, if-else – คาสังท ่ าซ้า: while, do-while, for height <= True 140 x > 0 x > 0 True x < 0 True x < 0 x == 0 เงื่อนไข: นิพจน์ ตรรกศาสตร์ • เงือ่ นไขเกิดจากการ – เปรียบเทียบ – รวมเงือ่ นไขย่อย ๆ เข้าด้วยกัน ตัวดาเนินการ เปรี ยบเทียบ ตัวดาเนินการ ตรรกศาสตร์ ข้อมูลประเภท bool • แบบชนิดข้อมูลทีใ่ ช้แสดงสถานะทางตรรกศาสตร์คอื แบบชนิด ข้อมูล bool – จริง : true – เท็จ : false เช่นเดียวกับภาษาไพธอน ตัวพิมพ์เล็กกับพิมพ์ใหญ่ แตกต่างกันในภาษา C# ดังนันระวั ้ งว่า True นันไม่ ้ เท่ากับ true ตัวดาเนินการเปรียบเทียบ ตัวดาเนินการ == != < <= > >= ความหมาย ตัวอย่ าง เท่ ากับ a == 5 ไม่ เท่ ากับ done != False น้ อยกว่ า data < 10 น้ อยกว่ าหรือเท่ ากับ count <= 15 มากกว่ า money > 0 มากกว่ าหรือเท่ ากับ interest >= 0.02 ตัวดาเนินการตรรกศาสตร์ และ && หรือ || นิเสธ (not) ! ตัวอย่าง x ไม่เท่ากับ 0 หรือ y เท่ากับ 10 (x!=0) || (y==10) i น้ อยกว่า n และ x ไม่เท่ากับ y (i<n) && (x!=y) a มีค่าระหว่าง b ถึง c (a >= b) && (a <= c) คาสัง่ if • คาสัง่ if ใช้ควบคุมการทางานของโปรแกรมตามเงือ่ นไข if( เงือ่ นไข ) คำสั่ง คาสัง่ if-else • คาสัง่ if-else ใช้ควบคุมการทางานของโปรแกรมสองส่วน if( เงือ่ นไข ) คำสั่ง else คำสั่ง ตัวอย่าง รถไฟฟ้ามีสว่ นลด 50% ให้กบั เด็กทีม่ อี ายุไม่เกิน 10 ปี ราคาเต็มสาหรับ ผูใ้ หญ่คอื 50 บาท รับอายุจากนัน้ ให้พมิ พ์ราคาค่าตั ๋ว static void Main() { int age = int.Parse(Console.ReadLine()); if(age <= 10) Console.WriteLine("Price = 25"); else Console.WriteLine("Price = 50"); } ข้อระวัง • ในภาษาไพธอน คาสัง่ if ไม่จาเป็ นต้องเขียนเงือ่ นไขในวงเล็บ if age <= 10: print("Hello!") • แต่ในภาษา C# วงเล็บตามหลังคาสัง่ if (และคาสัง่ while) เป็ นส่วนหนึ่งของไวยากรณ์ของภาษา ไม่สามารถละได้ if(age <= 10) Console.WriteLine("Hello"); คาสังว่ ่ าง • เช่นเดียวกับในภาษาไพธอน ในภาษา C# เราสามารถมีคาสัง่ ทีไ่ ม่ทาอะไรได้ ซึง่ เรียกว่าคาสังว่ ่ าง โดยเขียนเป็ น ; • เช่น if(x > 15) ; else Console.WriteLine("hello"); การควบคุมหลายคาสัง่ • คาสัง่ if และ if-else จะควบคุมคาสังถั ่ ดไปแค่คาสังเดี ่ ยวเท่านัน้ ยิง่ ไปกว่านัน้ ในภาษา C# การย่อหน้าไม่มผี ลในเชิงความหมายใด ๆ กับโปรแกรม (ไม่เหมือนภาษาไพธอน) if age <= 10: print("Hello, kid") print("Your price is 25 baht") แปลงเป็ น C# if(age <= 10) Console.WriteLine("Hello, kid"); Console.WriteLine("Your price is 25 baht"); บล็อค (block) การรวมคาสัง่ • เราสามารถรวมคาสังหลายค ่ าสังเข้ ่ าด้วยกันเป็ นบล็อค (block) โดยใช้ เครือ่ งหมายวงเล็บปีกกา { } • บล็อคจะทาหน้าทีเ่ หมือนคาสังหนึ ่ ่งคาสัง่ if age <= 10: print("Hello, kid") print("Your price is 25 baht") if(age <= 10) { Console.WriteLine("Hello, kid"); Console.WriteLine("Your price is 25 baht"); } แปลงเป็ น C# บล็อก ข้อระวัง • ในภาษา C# สิง่ ทีก่ าหนดบล็อกคือวงเล็บปีกกาเท่านัน้ การ เว้นย่อหน้าไม่มผี ลใด ๆ if(x > 0) total += x; count++; มีความหมาย ไม่เหมือนกับ มีความหมาย เหมือนกับ if(x > 0) total += x; count++; if(x > 0) { total += x; count++; } มุมนักคิด • จากการคานวณ BMI ในตัวอย่างก่อน ให้บอกกับผูใ้ ช้เพิม่ เติม ว่าผูใ้ ช้มสี ถานะด้านน้าหนักเป็ นอย่างไร ตามตารางด้านล่างนี้ BMI สถานะ ต่ากว่ า 18.5 Underweight มากกว่ าหรื อเท่ ากับ 18.5 แต่ น้อยกว่ า 25 Normal มากกว่ าหรื อเท่ ากับ 25.0 แต่ น้อยกว่ า 30 Overweight มากกว่ าหรื อเท่ ากับ 30 Obese (Extremely Fat) ให้เขียนเฉพาะส่วนของโปรแกรมทีร่ ะบุสถานะเทานั ่ ้น ให้สมมติวาค ่ า่ BMI ถูกคานวณไวแล ้ ว ้ ในตัวแปร bmi เฉลย 1: if ธรรมดา if(bmi < 18.5) Console.WriteLine("Underweight"); if((bmi >= 18.5) && (bmi < 25)) Console.WriteLine("Normal"); if((bmi >= 25) && (bmi < 30)) (กดเพือ่ แสดง) Console.WriteLine("Overweight"); if(bmi >= 30) Console.WriteLine("Extremely fat"); เฉลย 2: if ซ้อนกัน if(bmi < 18.5) Console.WriteLine("Underweight"); else if(bmi < 25) Console.WriteLine("Normal"); else (กดเพือ่ แสดง) if(bmi < 30) Console.WriteLine("Overweight"); else Console.WriteLine("Extremely fat"); การใช้คาสัง่ if ที่ซ้อนกัน if(a > 5) if(b < 10) Console.WriteLine("Hello"); else Console.WriteLine("Good-bye"); if(a > 5) if(b < 10) Console.WriteLine("Hello"); else Console.WriteLine("Good-bye"); โปรแกรมทัง้ สองนี ้ เหมือนกัน เพราะว่ าใน ภาษา C# ช่ องว่ างและ การเว้ นย่ อหน้ าไม่ มีผล ต่ อความหมายของ โปรแกรม แล้ ว else ในโปรแกรม เชื่อมกับ if ตัวใด? การจับคู่ else กับ if if(a > 5) if(b < 10) Console.WriteLine("Hello"); else Console.WriteLine("Good-bye"); if(a > 5) if(b < 10) Console.WriteLine("Hello"); else Console.WriteLine("Good-bye"); ในกรณีท่ ไี ม่ มีการระบุอย่ างชัดเจน else จะจับคู่กับ if ที่อยู่ใกล้ กว่ าเสมอ การใช้บล็อค • ถ้าต้องการให้ else จับคูแ่ บบอื่น เราจะต้องระบุโดยการสร้าง บล็อคให้ชดั เจน if a > 5: if b < 10: print("Hello") else: print("Good-bye") if(a > 5) { if(b < 10) Console.WriteLine("Hello"); } else Console.WriteLine("Good-bye"); ตัวอย่าง: หักภาษี • ในการหักลดหย่อนภาษี ถ้ามีบุตร สามารถหักลดหย่อนได้คน ละ 15,000 บาท แต่หกั ได้ไม่เกิน 3 คน • ต้องการเขียนโปรแกรมดังด้านล่าง Do you have any children (Y/N)? N Your deduction is 0 baht. Do you have any children (Y/N)? Y How many children do you have? 2 Your deduction is 30000 baht Do you have any children (Y/N)? Y How many children do you have? 5 Your deduction is 45000 baht ลดหย่อน: แผนการ • เก็บมูลค่าการลดหย่อนในตัวแปร deduction • เขียนส่วนเงือ่ นไขแรก ทีถ่ ามว่ามีบุตรหรือไม่ก่อน • จากนัน้ ค่อยเพิม่ รายละเอียดส่วนอื่น ลดหย่อน: ขัน้ แรก public static void Main(string[] args) { Console.Write("Do you have any children (Y/N)? "); string ans = Console.ReadLine(); int deduction = 0; if(ans == "Y") { // ส่วนจัดการกรณีทม ่ี บี ุตร } else deduction = 0; Console.WriteLine("Your deduction is {0} baht.", deduction); Console.ReadLine(); } Y หรือ y • ถ้าต้องการให้ผใู้ ช้ตอบ Y ได้ทงั ้ ตัวพิมพ์เล็ก และพิมพ์ใหญ่ จะ แก้สว่ นเงือ่ นไขใน if อย่างไร? if(ans == "Y") if((ans == "Y") || (ans == "y")) { // ……… } ใช้ตัวเชือ ่ ม "หรือ" ( || ) ลดหย่อน: สมบูรณ์ public static void Main(string[] args) { Console.Write("Do you have any children (Y/N)? "); string ans = Console.ReadLine(); int deduction = 0; if((ans == "Y") || (ans == "y")) { Console.Write("How many children do you have? "); int ccount = int.Parse(Console.ReadLine()); if(ccount > 3) ccount = 3; deduction = ccount * 15000; } else deduction = 0; Console.WriteLine("Your deduction is {0} baht.", deduction); Console.ReadLine(); } การทาซา้ • ในส่วนนี้เราจะศึกษาคาสังที ่ ใ่ ช้ในการทาซ้าสองคาสังคื ่ อ คาสั่ง while ตรวจเงื่อนไขก่ อน ค่ อยทา คาสั่ง do-while ทาก่ อน แล้ วค่ อยตรวจเงื่อนไขเพื่อทาซา้ คาสัง่ while • คาสัง่ while มีลกั ษณะการทางาน เหมือนกับคาสัง่ while ในภาษาไพธอน while( เงือ่ นไข ) คำสั่ง condition true statement 1 false statement 2 : statement n 63 คาสัง่ do-while • คาสัง่ do - while ไม่มใี นภาษาไพธอน statement 1 statement 2 do คำสั่ง while( เงือ่ นไข ); : statement n true condition false 64 ตัวอย่าง • รับรหัสผ่าน จนกว่าผูใ้ ช้จะพิมพ์ "hellocsharp" string pwd; เขียนด้วย while pwd = Console.ReadLine(); while(pwd != "hellocsharp") pwd = Console.ReadLine(); string pwd; เขียนด้วย do-while do pwd = Console.ReadLine(); while(pwd != "hellocsharp"); นิสิตคิดว่าแบบใดเข้ าใจได้ ง่ายกว่า ? ตัวอย่าง • รับจานวนเต็ม n พิมพ์เลข 1 – n บรรทัดละหนึ่งตัว เขียนด้วย while int n = int.Parse( Console.ReadLine()); int i = 1; while(i <= n) { Console.WriteLine(i); i++; } int n = int.Parse( Console.ReadLine()); int i = 1; do { Console.WriteLine(i); i++; } while(i <= n); เขียนด้วย do-while ข้อระวัง • แม้วา่ คาสัง่ while กับ do-while จะคล้ายกันมาก ข้อแตกต่างที่ สาคัญคือ คาสัง่ do-while จะไม่ตรวจสอบเงือ่ นไขในการ ทางานครัง้ แรก จากตัวอย่างที่แล้วถ้า n เป็ น 0 ค่า 1 จะถูกพิมพ์ออกมาด้วย int n = int.Parse( Console.ReadLine()); int i = 1; do { Console.WriteLine(i); i++; } while(i <= n); มุมนักคิด • ต้องการรับจานวนเต็ม n จากนัน้ พิมพ์ 1 ไล่ไปจนถึง n โดย พิมพ์เลขบรรทัดละ 8 ตัว คันแต่ ่ ละคูด่ ว้ ยช่องว่าง ไปจนจบ พิมพ์เลข: แผนการ • พิมพ์เลขทุกตัวในบรรทัดเดียวกันให้ได้ก่อน • จากนัน้ ค่อยมาแยกบรรทัดเมือ่ ถึงตัวทีต่ อ้ งการ พิมพ์เลข: 1 int n = int.Parse( Console.ReadLine()); int i = 1; while(i <= n) { Console.Write(i); i++; } 20 12345678910111213141516171 81920 • ปรับโปรแกรมให้พมิ พ์โดยไม่ขน้ึ บรรทัดใหม่ – ขัน้ ตอนต่อไป: เพิม่ ช่องว่างระหว่างพิมพ์ พิมพ์เลข: 2 int n = int.Parse( Console.ReadLine()); int i = 1; while(i <= n) { Console.Write("{0} ", i); i++; } 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 • จัดรูปแบบการพิมพ์เป็ น "{0} – ขัน้ ตอนต่อไป: ขึน้ บรรทัดใหม่ " พิมพ์เลข: 3 int n = int.Parse( Console.ReadLine()); int i = 1; while(i <= n) { Console.Write("{0} ", i); i++; } 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 if(___________________) Console.WriteLine(); • เราจะแทรกคาสังส ่ าหรับขึน้ บรรทัดใหม่ในโปรแกรมนี้ • จะขึน้ บรรทัดใหม่เมือ่ ครบ 8 ตัว นันคื ่ อเมือ่ i มีคา่ เป็ น 8, 16, 24, … พิมพ์เลข: เสร็จ int n = int.Parse( Console.ReadLine()); int i = 1; while(i <= n) { Console.Write("{0} ", i); if(i % 8 == 0) Console.WriteLine(); i++; } 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 • คาถาม: ถ้าแทรกหลังคาสัง่ i++ จะได้ผลลัพธ์เป็ นอย่างไร? สรุป • เนื้อหาส่วนนี้ เป็ นการอธิบายไวยากรณ์ของภาษา C# ในการ ทางานพืน้ ฐานต่าง ๆ ทีเ่ ทียบเท่ากับในภาษาไพธอน • สังเกตได้วา่ แม้เราจะเปลีย่ นภาษาไป แนวคิดพืน้ ฐานในการ เขียนโปรแกรมก็ไม่ต่างกันมากนัก