C# Tutorial ตอนที่ 4 (if clause)

posted on 07 Jun 2005 01:20 by tidno1  in csharp-and-dotnet

ช่วงนี้เนื้อหาอาจจะสั้นหน่อย และอาจจะเขียนช้าบ้าง เพราะตอนนี้เปิดเทอมแล้ว คงต้องแบ่งเวลาไปเรียนพอควร(จริงเรอะ)

Control Statement

โดยปกติแล้วโปรแกรมที่เราเขียนจะมีลำดับการทำงานจากบนไปล่าง ทีละคำสั่ง จบหนึ่งคำสั่งถึงไปทำอีกคำสั่งหนึ่ง แต่ถ้าเราต้องการให้มันทำงานเป็นเงื่อนไข คือต้องตัดสินใจว่าจะทำคำสั่งนึงหรือไม่ โดยขึ้นกับอีกคำสั่งนึง เราก็จะต้องใช้ control statement จำพวก if..else ลองอ่านประโยคข้างล่างดู

Console.Write("Please input number : ");
string s = Console.ReadLine();
int x = Int32.Parse(s);

if(x < 0)
    x = -x;

Console.WriteLine("Non-negative number of your input is {0}", x);
นั่นคือส่วนของโปรแกรมง่าย ๆ ซึ่งจะรับค่าตัวเลขมาหนึ่งตัว(อย่าลืมนะครับว่า Console.ReadLine() รับค่าเข้ามาเป็น string เสมอ เราจึงต้องใช้ Int32.Parse() ในการแปลงมาเป็นตัวเลข) แล้วตรวจสอบว่าถ้าเป็นค่าติดลบ เราจะทำให้เป็นค่าบวกก่อน

สังเกตนะครับ ในภาษานี้ไม่เหมือนภาษาอื่นตรงที่ไม่มีคำว่า then หลัง condition เพราะว่าตรง condition นั้นมี '(' และ ')' ครอบอยู่(ต้องใส่ทุกครั้งนะครับ)
')' โดยวงเล็บปิดจะเป็นตัวบอกว่าจบ condition แล้ว และเริ่ม statement ที่จะต้องทำงานเมื่อถูกเงื่อนไข และถ้าเราต้องการให้มีการ execute statement หลาย ๆ statement ในเงื่อนไขเดียว เราต้องใช้เครื่องหมาย '{' และ '}' (วงเล็บปีกกา) ครอบกลุ่มคำสั่งเหล่านั้นไว้ เช่น

if( ) {
    // statement_1
    // statement_2
    // ...
    // statement_n
}
ถึงแม้ว่า statement หลัง if จะมีแค่ statement เดียว เราก็ควรจะใส่วงเล็บปีกกาครอบไว้เสมอ เพื่อความเป็นระเบียบ

ลองมาดูอีกแบบกันดีกว่า

DateTime dtToday = DateTime.Today;
DayOfWeek thisDay = dtToday.DayOfWeek;

if((thisDay == DayOfWeek.Sunday) || (thisDay == DayOfWeek.Saturday)) {
    Console.WriteLine("Today is weekend");
} else {
    Console.WriteLine("Today is weekday");
}
ง่าย ๆ นะครับ คล้าย ๆ กับ else ของภาษาอื่น

Nested if คือ if else if else if แบบต่อเนื่องกันนั่นแหละครับ

Console.Write("Please input number : ");
string s = Console.ReadLine();
int x = Int32.Parse(s);

if(x < 0) {
    Console.WriteLine("{0} is negative number", x);
} else if(x > 0) {
    Console.WriteLine("{0} is positive number", x);
} else {
    Console.WriteLine("{0} is zero", x);
}

Dangling else

ภาษาหลาย ๆ ภาษาที่ไม่มีคำสั่ง end if (หรือ endif) มักจะเกิดปัญหาการตีความ ประโยคประมาณนี้

if(cond1) if(cond2) stmt1; else stmt2;
ถ้าอ่านแล้วจะตีความได้สองแบบ
แบบที่ 1
if(cond1)
    if(cond2)
        stmt1;
else
    stmt2;
หรือ แบบที่ 2
if(cond1)
    if(cond2)
        stmt1;
    else
        stmt2;
ปัญหาข้างบนเกิดขึ้นบ่อยมาก ๆ สำหรับคนพึ่งหัดเขียนโปรแกรมใหม่ ๆ และมีการจัด indent ไม่ดี ทำให้คนเขียนเองก็ตีความสับสน วิธีจำง่าย ๆ ก็คือ
รักแท้ยังแพ้ความใกล้ชิด : else แท้ ๆ ก็รัก if ตัวที่อยู่ใกล้ที่สุด
เพราะฉะนั้นแบบที่สอง ถ.
ถ.
ถ.
ถ.
ถ. ถูกต้องนะค้าบ

การบ้าน
  1. เขียนโปรแกรมตัดเกรด(โจทย์คลาสสิคสุด ๆ) โดยให้รับ input เป็นตัวเลขจำนวนจริง โดยมีเกณฑ์ดังนี้ [0,50) ได้ F, [50,60) ได้ D, [60,70) ได้ C, [70,80) ได้ B, [80,100] ได้ A นอกนั้นให้แจ้งผู้ใช้ด้วยว่าใส่ตัวเลขเกินช่วง ผลลัพธ์ให้ WriteLine ออกจอละกัน
  2. รับตัวเลขจำนวนจริงเข้ามา 1 ตัว แล้วตอบว่าเลขนั้นเป็นจำนวนเต็มรึเปล่า(คือ จะ 50.0 หรือ 50 ก็เป็นจำนวนเต็ม แต่ 21.1 ไม่ใช่) หากไม่ใช่จำนวนเต็ม ให้บอกด้วยว่าต้อง เพิ่มหรือลดอีกน้อยที่สุดเท่าไรเพื่อทำให้เป็นจำนวนเต็ม เช่น 21.1 ต้องลดอีก 0.1 ไม่ใช่เพิ่มอีก 0.9

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

Tweet

ตอนสอนเดี๋ยวกรูจะมาเอาของเมิง 55

#1 By [M]och on 2005-06-07 01:55

ถ้าต้องการให้ else เป็นของ if ตัวแรกเขียนแบบนี้ได้ป่าวคับ
if (condition1)
if (condition2)
statement1;
else;
else statement2;

#2 By P.S. on 2005-06-07 10:17

P.S. : ก็ได้นะครับ
ถ้าจะให้ดี ใช้ { } ครอบไว้ดีกว่าครับ อ่านง่ายกว่าด้วย
if (condition1) {
if (condition2)
statement1;
}
else statement2;

#3 By T!D on 2005-06-07 22:31

อืมมม...





#4 By ปาม มี่ ♫ on 2005-06-15 14:21

#5 By (203.188.49.217 /127.0.0.1) on 2005-09-15 09:24

#6 By (203.188.49.217 /127.0.0.1) on 2005-09-15 09:25

โอ้ get ประมาณ 80%

#7 By (202.57.136.50) on 2007-06-05 09:21

rNFFzd qyuesbkg hczyusmr iqsipvzz

#8 By RtMALRpZO (89.248.172.50) on 2009-07-28 15:03

cmzwhlmv gusjjkpt qehmqkgy

#9 By qGCxiMvFLiaOHYl (95.169.190.71) on 2009-08-01 07:30

wyiqhvzr yzlakihl orncjptn

#10 By EZTxfeONjVLtbp (95.169.190.71) on 2009-08-01 10:12

fndyrhev bxeashdg bxnccsic

#11 By ZRHpGMENGMkkzhoZy (95.169.190.71) on 2009-08-01 11:32

piflwvsv hbygtbfp porxwrcg

#12 By oBEtIvumGOrRUD (89.248.172.50) on 2009-08-09 22:29

elxdvptn ttfsaxmq cgpvccpz

#13 By NpMjOdgoyhfhP (89.248.172.50) on 2009-08-10 01:17

jnfszhqz udnabmqa gmtubtoa

#14 By tjKVTzNqGfQLUcLo (89.248.172.50) on 2009-08-10 02:42

fwqvfrsw ufxfsddy xuwfhgwq

#15 By rPrSzzUyRY (94.102.49.213) on 2009-08-14 15:11

idupbhtd dzndnccm akktvseo

#16 By igTegmzvSgqErWw (94.102.49.213) on 2009-08-14 16:36

gihgtzbe zcowgznv waurxogr

#17 By EbVAiQIzSQotFZadai (94.102.49.213) on 2009-08-14 18:00

irmbnscz cmzgxkoz kcholhbh

#18 By ExEzzgRsL (94.102.49.213) on 2009-08-14 19:24

zohtbrjh wvknhova owvcqkkg

#19 By DDQUAfOEFYuk (94.102.49.213) on 2009-08-14 20:52

jpxeubju egyknsrz clyiazea

#20 By ISajTadrjn (94.102.49.213) on 2009-08-14 23:45

anvptnxm xwixcjul vzhbpgoi

#21 By dsJKiNdF (94.102.49.213) on 2009-08-15 01:10

sahtvqks wqktxsiq nssztojz

#22 By bIUglmBhCgSZaBtVk (94.102.49.213) on 2009-08-15 02:35

nuoeieoo asrytsgf qzfzilqt

#23 By rLVNnlifePSKxNlZLk (94.102.49.213) on 2009-08-15 03:58