C# Tutorial ตอนที่ 6(loop)

posted on 12 Jun 2005 22:33 by tidno1 in csharp-and-dotnet

การวนลูป

การทำอะไรบางอย่างที่เป็นการทำซ้ำ ๆ กัน เราจะเรียกว่าการวนลูป คือการทำงานเป็นวงรอบนั่นเอง
โดย loop ในภาษานี้จะมีอยู่ 3 แบบคือ

  • while( )..
  • do..while( )
  • for(; ;)

while loop


ดูจาก flow chart ข้างบนคงพอเข้าใจกันบ้าง นั่นคือจะมีการเช็กเงื่อนไขก่อนเข้าลูป ถ้าเป็นจริง ก็จะทำงาน แล้วก็จะกลับมาเช็กเงื่อนไขใหม่ เป็นอย่างนี้ไปเรื่อย ๆ
โดยมี syntax ดังนี้

while(cond)
    statement
ถ้าแปลความหมายเป็นภาษาไทยก็คือ ในขณะที่(เงื่อนไข) ทำ ...
คล้าย ๆ กับ if นะครับ คือไม่มี keyword do อยู่หลัง condition เหตุผลเดียวกับ if ล่ะครับ นั่นคือ วงเล็บปิด เป็นตัวบอกจุดเริ่มของ statement ที่ต้องทำงานในลูป

do .. while loop


อันนี้จะคล้าย ๆ กับ while นะครับ เพียงแต่ต่างกันตรงที่ว่า จะทำงาน statement ใน loop ก่อน 1 ครั้ง แล้วจึงค่อยเช็ก condition
มี syntax ดังนี้ครับ

do
    statement
while(cond);
สังเกตนะครับ ตรงหลัง cond มี ; (semicolon) อยู่ด้วย

โดยปกติแล้ว loop นี้มักจะไม่ค่อยได้ใช้ เนื่องจากสามารถเขียนแทนด้วย while loop ได้(โดยการนำเอา statement ใน loop ไปเขียนข้างนอกอีกครั้ง) และ while loop ยังอ่านได้ง่ายกว่าอีกด้วย

for loop

ในภาษาอย่างเช่น pascal หรือ vb นั้น for loop เป็นเหมือนกับ while loop ที่ลดรูปลงมา ไว้ใช้สำหรับการวนลูปที่กำหนดจำนวนครั้งเอาไว้ เช่น

var i, n, sum : integer;
Begin
    readln(n);
    for i:=1 to n do
    begin
        sum = sum + i;
    end;
    writeln('sum is', sum);
End.
ซึ่งสามารถเขียนแทนด้วย while loop ได้ง่าย ๆ อยู่แล้ว

แต่ใน ภาษาตั้งแต่ C เป็นต้นมา for loop นั้นคือ while loop แท้ ๆ เลยครับ โดยมี รูปแบบ syntax ดังนี้

for(initial_expr; condition; update_expr)
    statement

โดยเราสามารถเปลี่ยนfor loop เป็น while loop ได้ดังนี้

initial_expr;
while(condition) {
    statement
    update_expr;
}
แต่โดยปกติแล้ว เรามักจะเขียน for loop เพื่อทำงานง่าย ๆ อย่างเช่นการ วนลูปเป็นจำนวนครั้งคงที่ เราก็จะเขียนได้คล้าย ๆ อย่างนี้
int n = Int32.Parse(Console.ReadLine());
int i, sum = 0;

for(i = 1; i <= n; i++) {
    sum += i;
}

Console.WriteLine(sum);
แต่เรามักจะได้เห็นอย่างนี้ซะมากกว่า
int i;
for(i = 0; i < n; i++) {
    ...
}
เนื่องจากว่า index ของภาษาตระกูลนี้จะเริ่มจาก 0 เสมอ การวนลูปข้างบนก็จะวนตั้งแต่ i = 0 จนถึง n-1 ซึ่งเป็นการวนจำนวน n ครั้ง อยู่ดี

เราสามารถเขียน initial_expr และ update_expression ได้หลาย expression โดยต้องคั่นแต่ละ expression ด้วย comma

int i, n;
long fac;

Console.Write("Input nonnegative number : ");
n = Int32.Parse(Console.ReadLine());

for(i = 1, fac = 1; i <= n; i++) {
    f *= i;
}

Console.WriteLine("{0}! = {1}", n, fac);

programmer ทั้งหลายมักจะใช้ตัวแปร i มาเป็นตัวแปร index ในการวนลูป ดังนั้นจึงเห็นการประกาศ int i; เกือบ ๆ ทุกฟังก์ชัน
ดังนั้นตั้งแต่ C++ เป็นต้นมา จึงได้รวบบรรทัด int i; มาไว้ในลูปเลย ทำให้ไม่ต้องประกาศตัวแปรแยกอีก ดังนี้

for(int i = 0; i < n; i++) {
    ...
}
ตัวแปร i นี้ จะถูกอ้างค่าถึงได้เฉพาะใน ลูปนี้เท่านั้น ไม่สามารถอ้างข้างนอกได้อีก ดังนั้น code ข้างล่างนี้จะคอมไพล์ไม่ผ่านแน่นอน
for(int i = 0; i < n; i++) {
    Console.WriteLine(i);
}

Console.WriteLine(i);

expression ใน for loop นั้นสามารถละทิ้ง ไม่เขียนก็ได้ และถ้าเราไม่เขียนทั้ง 3 expression เลย ก็จะกลายเป็น

for(;;) {
    ...
}
นั่นก็คือ infinite loop (ลูปที่รันตลอดเวลา ไม่มีวันหลุดออกมา) ถ้าเป็น while loop ก็จะเขียนแบบนี้
while(true) {
    ...
}
โดยปกติแล้ว ลูปด้านบน(for) จะรันเร็วกว่าอันล่างเล็กน้อย(เล็กน้อยจริง ๆ) เนื่องจาก while ต้องคอยมาเช็กเงื่อนไขใน ( ) ว่าเป็น true หรือไม่
แต่ เราก็ควรจะใช้ while loop ดีกว่า เนื่องจากอ่านแล้วเข้าใจกว่า(มาก ๆ)

example : เรามาเขียน method ที่คล้าย ๆ กับ Int32.Parse กันดีกว่า(ตัวอย่างนี้ดัดแปลงมาจาก The C Programming language ของ K&R)

int ParseInt(string s) {
    int i, n, sign;

    for(i = 0; Char.IsWhiteSpace(s[i]); i++) // skip space
        ;

    sign = (s[i] == '-') ? -1 : 1;

    if(s[i] == '+' || s[i] == '-') // skip sign
        i++;

    for(n = 0; Char.IsDigit(s[i]); i++)
        n = 10 * n + (s[i] - '0');

    return sign * n;
}
ในบรรทัด ที่ 3 นั้น ที่เห็น ;(semicolon) เปล่า ๆ นั้นเราเรียกว่า empty statement ครับ คือเป็น statement ที่ไม่ทำอะไรเลย นั่นจะทำให้ลูป for อันแรกนั้น ทำการเลื่อนตำแหน่ง i ไปที่ตัวอักษรที่ไม่ใช่ space ไปเรื่อย ๆ
remark : s[i] หมายถึง character ในตำแหน่งที่ i ของ string s ครับ

expression ใน for loop ไม่ได้จำกัดว่า counter จะต้องเป็นจำนวนเต็มเท่านั้น จะเป็น เลขทศนิยม, ตัวอักษร หรืออะไรก็ได้

for(char c = 'a'; c <= 'z'; c++) {
    Console.WriteLine(c);
}
หรือจะไม่มีตัวนับไปเลยก็ได้
for(string s = null; s != ""; ) {
    s = Console.ReadLine();
    Console.WriteLine(s);
}
แต่ถ้าเราจะใช้เลขทศนิยมเป็นตัวเลข counter เราควรจะระวังในการใช้เครื่องหมาย == หรือ != ในการเปรียบเทียบ เพราะ operator สองตัวนี้มีความผิดพลาดเกิดขึ้นได้
ถ้าใครได้อ่านเรื่อง round-trip format ที่ท้ายบล็อกที่แล้ว ก็คงจะพอคุ้น ๆ กันบ้าง(ขอบคุณพี่ลิ่วที่เตือนมาครับ)
ลองมาดูตัวอย่างกันซักหน่อยครับ
for(float f = 0.0f; f != 1.0; f += 0.1f) {
    Console.WriteLine(f);
}
โปรแกรมข้างบนจะรันไม่หยุดนะครับ ถ้าจะให้หยุดก็กด Ctrl-C นะครับ
และนี่คือเหตุผลที่มันรันไม่หยุดครับ
float f = 0.0f;

for(int i = 1; i <= 11; i++, f += 0.1f) {
    Console.WriteLine("{0:R}", f);
}
0
0.1
0.2
0.3
0.4
0.5
0.6
0.700000048
0.8000001
0.9000001
1.00000012
ทางที่ดี เราควรจะใช้ <, >, <= หรือ >= ในการเปรียบเทียบแทนนะครับ
for(float f = 0.0f; f < 1.0; f += 0.1f) {
    Console.WriteLine(f);
}

เดี๋ยววันหลังจะมาเขียนเรื่อง floating-point representation ให้อ่านครับ

ในบางภาษานั้น จะไม่ยอมให้เราแก้ไขตัวแปร counter ภายใน for block ได้นะครับ แต่ถึงแม้ภาษาที่ไม่มีข้อบังคับเช่นนั้น เราก็ไม่ควรจะแก้ไขค่าของตัวแปร counter เอง เพราะจะทำให้ โปรแกรมอ่านยากขึ้น

for(int i = 0; i < 10; i++) {
    Console.WriteLine(i--);
}

break statement

ถ้าเราจำเป็นต้องออกจากลูป โดยไม่ต้องรอให้ครบรอบ เราก็สามารถทำได้โดยใช้ break;

int n;
string s;

s = Console.ReadLine();

while(s != "") {
    n = Int32.Parse(s);
    if(n < 0) {
        break;
    }

    s = Console.ReadLine();
}
จริง ๆ แล้วเราสามารถเขียนให้สั้นลง เป็นอย่างนี้ก็ได้
int n;
string s;

while((s = Console.ReadLine()) != "") {
    n = Int32.Parse(s);
    if(n < 0) {
        break;
    }
}

continue statement

การใช้ break; จะเป็นการออกจากลูปไปทันที แต่ถ้าต้องการให้มันแค่หยุดการวนลูปรอบนั้น และกลับไปทำงานใน loop ต่อ เราก็จะใช้ continue;

int i = 0, n, max, sum = 0;

max = Int32.Parse(Console.ReadLine());

while(i < max) {
    n = Int32.Parse(Console.ReadLine());
    if(n < 0) {
        continue;
    }
    sum += n;
    i++;
}

Console.WriteLine("average is {0}", sum / max);

การบ้าน

  1. วิธีหาหาตัวหารร่วมมาก(Greatest Common Divisor - gcd) โดยใช้ Euclid Algorithm มีขั้นตอนดังนี้
    1. ให้ m และ n เป็นเลขจำนวนเต็มบวกสองตัว ซึ่ง m >= n
    2. ให้ r เป็นเศษเหลือจากการหาร m ด้วย n
    3. ถ้า r == 0 จะได้ว่า n เป็น gcd
    4. ให้ m = n และ n = r แล้วย้อนกลับไปทำขั้นตอนที่ 2
    ให้เขียน program ที่หา gcd โดยใช้ Euclid algorithm
  2. เรามีนิยาม แต่ว่าจะต้องใช้ n ที่มีค่าสูงมาก(1,000,000)เพื่อให้ e มีค่าทศนิยมถูกต้องถึงตำแหน่งที่ 6 เราจึงใช้ความรู้ด้านอนุกรมมาช่วย เพื่อหาค่า e ทำให้เราได้ว่า ให้เขียนโปรแกรมเพื่อหาค่า e ให้ถูกต้องถึงตำแหน่งที่ 10
    e = 2.71828 18284 59045 23536 02874 71352 66249 77572 47093 69995 95749 66967 62772...
  3. เลข 153 เป็นเลข 3 หลัก ที่ ผลบวกของเลขโดดทั้ง 3 หลัก ยกกำลัง 3 แล้วบวกกันมีค่าเท่ากับตัวมันเอง (13 + 53 + 33 = 153) จงหาจำนวน 3 หลักทั้งหมดที่เป็นอย่างนี้
  4. เลข 1634 เป็นเลข 4 หลัก ที่ ผลบวกของเลขโดดทั้ง 4 หลัก ยกกำลัง 4 แล้วบวกกันมีค่าเท่ากับตัวมันเอง (14 + 64 + 34 + 44 = 1634) จงหาจำนวน 4 หลักทั้งหมดที่เป็นอย่างนี้
  5. ให้เขียนโปรแกรมที่แสดงรูปต่อไปนี้
    •   *
       ***
      *****
       ***
        *
      โดยรับ input เป็นจำนวนแถว
    • pascal 's triangle รับ input เป็น ค่า n เพื่อระบุว่าให้พิมพ์จนถึงแถว(a+b)n
          1
         1 1
        1 2 1
       1 3 3 1
      1 4 6 4 1
          .
          .
          .

Comment

Comment:

Tweet

*
*1*
**2**
***3*** **2**  *1*  *
ซึ่งเรียงแต่ล่ะวรรคเป็นแถวลงมา 
ข้อสอบกลางภาค ใครรู้ว่าทำยังไง ช่วยบอหนูหน่อยน่ะค่ะ ขอบคุณค่ะที่อ่าน embarrassed embarrassed

#35 By TOEI (202.29.24.195|202.29.24.195) on 2014-09-09 15:33

<span style="white-space: pre;"> </span>*
<span style="white-space: pre;"> </span>     * 1 *
<span style="white-space: pre;"> </span>   ** 2 **
         *** 3 ***
<span style="white-space: pre;"> </span>   ** 2 **
             * 1 *
                *
โจทย์แบบนี้ต้องทำยังไงบ้างค่ะ

#34 By TOEI (202.29.24.195|202.29.24.195) on 2014-09-09 15:22

sad smile แบบว่า
ที่โรงเรียนอะคะ
ครูสอนละเอียดมาก
รวมทั้งการใช้คำสั่งอี่นที่เชื่อมโยงกันได้
อยากได้ที่ละเอียด และสามาถรเข้าใจได้ง่ายอะคะ
ตอนนี้อยู่ ม.4
อยากได้คำแนะนำที่ง่ายๆ
และละเอียดนะคะ

#33 By H.bd (103.7.57.18|223.204.97.218) on 2013-03-11 22:59

มีใครเขียนโค้ดแบบนี้ไหมครับโดยให้รันออกมาแบบนี้
********
********
********
*****************
*****************
*****************
โดยใช้การเขียนแบบนี้ครับ(อันนี้ตัวอย่าง) 
1: using System;

2: class MyClass // คลาส MyClass
3: {

4: static void PrintLine() // เมท็อด PrintLine

5: {
6: for (int i = 0; i < 10; i++)

7: Console.Write('*');
8: Console.WriteLine();
9: }
10:
11: static void Main() // เมท็อด Main
12: {
13: MyClass.PrintLine(); // คําสั่งเรียกใช้เมท็อด ประกอบด้วย class.method

14: MyClass.PrintLine(); // ดังนั้นเราจึงเขียน MyClass.PrintLine()
15: }
16: } 

แต่ให้มันรันดอกจันแบบข้างบน
ลองดูครับ

#32 By Tj_Serato (103.7.57.18|101.51.188.19) on 2013-01-25 20:55

ว่าแล้วก็ส่งข้อ 4 ต่อเลย open-mounthed smile open-mounthed smile open-mounthed smile


static void Main(string[] args)
{
int i1 = 1;
int i2 = 0;
int i3 = 0;
int i4 = 0;
for (; i1 < 10; i1++)
{
for (; i2 < 10; i2++)
{
for (; i3 < 10; i3++)
{
for (; i4 < 10; i4++)
{
if (Math.Pow(i1, 4) + Math.Pow(i2, 4) + Math.Pow(i3, 4) + Math.Pow(i4, 4) == int.Parse(i1.ToString() + i2.ToString() + i3.ToString() + i4.ToString()))
{
Console.WriteLine(i1 + \\\"^4 + \\\" + i2 + \\\"^4 + \\\" + i3 + \\\"^4 + \\\" + i4 + \\\"^4 + = \\\" + i1.ToString() + i2.ToString() + i3.ToString() + i4.ToString());
}
}
i4 = 0;
}
i3 = 0;
}
i2 = 0;
}
i1 = 0;
Console.ReadKey();
}

question question question

#31 By Supernova (171.4.0.117) on 2011-09-05 22:26

พิมพ์ผิดนะครับ ข้อ 3 ไม่ใช้ข้อ 6 นะ

#30 By Supernova (171.4.0.117) on 2011-09-05 22:06

ส่งการบ้านระยะเวลา 6 ปี ข้อ 6 คร๊าฟ *-*
static void Main(string[] args)
{
int i1 = 1;
int i2 = 0;
int i3 = 0;
for (; i1 < 10; i1++)
{
for (; i2 < 10; i2++)
{
for (; i3 < 10; i3++)
{
if (((Math.Pow(i1, 3) + (Math.Pow(i2, 3)) + (Math.Pow(i3, 3)) == int.Parse(i1.ToString() + i2.ToString() + i3.ToString()))))
{
Console.WriteLine(i1 + "^3 + " + i2 + "^3 + " + i3 + "^3 + = " +i1.ToString() + i2.ToString() + i3.ToString());
}
}
i3 = 0;
}
i2 = 0;
}
i1 = 0;
Console.ReadKey();

#29 By Supernova (171.4.0.117) on 2011-09-05 22:04

test

#28 By jj (117.47.99.196) on 2010-07-17 10:12

#27 By (117.47.99.196) on 2010-07-17 10:11

confused smile

#26 By (58.147.70.194) on 2010-07-15 09:09

อยากเรียนวิธีเขียนบอทอ่ะครับ
ถ้าใครสนใจจะสอนผมยินดีจ้างค่าเสียเวลาครับ
ผมเรียน มาหลายภาษาแล้วjava python c# c++ LC3(assembly) ไม่รู้ทำไม ที่ๆผมเรียนอยู่ตอนนี้(New Zealand)ไม่สอนการhackเลยT_T ใครพอมีเวลาจะสอน เขียนเมลมาเลยนะครับ ezy2see@hotmail.com

#25 By NZ boys (203.211.81.144) on 2010-06-17 05:14

Why dont u use foreach() It's easier
eg foreach(string values in someArray[]){
dosomething;
}

#24 By NZ boys (203.211.81.144) on 2010-06-17 05:09

ขอบคุณมากครับ

#23 By Tommy (203.155.158.4) on 2010-03-10 09:32

สุดยอดครับ กำลังจาสอบ C# ได้ความรู้ตรงนี้ไป คาดว่ารอด F แน่ๆ

#22 By นิทัศน์ (124.121.185.94) on 2009-03-04 11:04

www.siam2play.com

#21 By www.siam2play.com (202.90.125.58) on 2009-01-13 15:04

www.thai2trip.com

#20 By www.thai2trip.com (202.90.125.58) on 2009-01-13 15:04

การบ้านข้อ 5. ตอนที่ 2 ทำไงคับ

#19 By หม่ำ (124.120.192.36) on 2008-11-17 17:54

123

#18 By (118.173.244.201) on 2008-07-31 17:29

foreach ใช้การเข้าถึงข้อมูลที่เป็น ออบเจก
เช่น
foreach(Mydataset.cusrow item Table){
cus cu = new cus()
{
cu.id =item.id;
cu.read(); //method read
customer.add(cu);//property
//customer
}
return customer;
}

มันจะออกจากลูกก็เมื่อเราส่งพารามิเตอร์มาถามว่า
customer id มี id นี้รึ่เปล่า ถ้ามีจะ return
ออกมา และจะได้ข้มูล customer ทั้งหมด เพราะสั่ง
ด้วย method read();
////////โปรเจกจบผมเขียนด้วย oop ล้วน เป็นระบบงานคล้ายฐานข้อมูลมีคลาสกว่า 30 คลาส
explo_227@hotmail.com เพิ่งจบน่ะ

#17 By itUdon (222.123.226.66) on 2008-07-28 08:59

#16 By (202.142.193.8) on 2006-09-29 11:55

ช่วยเขียนโค้ดc#ในการหาGCDของ2ตัวเลขหน่อยคับ

#15 By ปูน (158.108.42.243) on 2005-11-30 11:13

#14 By (203.130.128.170) on 2005-08-02 13:20

ไม่เป็นไร ไม่เป็นไร

#13 By Chariot (61.91.136.83) on 2005-07-08 08:47

อ่า หาแล้ว ตอบว่า ไม่ทราบครับ

#12 By T!D on 2005-07-07 18:43

ขอบคุณค่ะ

#11 By Chariot (61.91.134.16) on 2005-07-05 08:09

Chariot : ไม่แน่ใจครับ เดี๋ยวลองดูให้

#10 By T!D on 2005-07-04 19:59

ขอบคุณมากค่ะที่กรุณา

แต่มีข้อสงสัยเล็กน้อยอยากถามเพิ่มค่ะ

จากตัวอย่าง for ที่ยกมาเป็นตัวอย่างนี้ การทำงานรอบสุดท้ายของ for คือ การที่ i=5 ซึ่งจะทำให้เงื่อนไขเป็นเท็จก็จะออกจาก loop

แล้ว foreach จะได้ค่า i จาก arr ถ้า i = 5 แล้วก็จะทำงานที่ Console.WriteLine(i); แล้ว step การทำงานจะออกจาก loop ทันที หรือจะกลับไปที่ foreach เพื่อพิจารณาเหมือนกับfor loop หรือไม่ (ถ้ากลับไปจริงแล้วจะตรวจสอบการออกอย่างไร เพราะอย่าง for ก็ยังตรวจสอบกับ i และเงื่อนไขที่กำหนดไว้ได้)

ทดลองใช้ Step Into ใน Visual .NET มันจะกลับไปที่ foreach ในรอบสุดท้ายก่อนที่จะออกจาก loop แต่ก็ยังไม่เข้าใจการทำงานของมันอยู่ดี

ที่อยากทราบแบบนี้เพราะกำลังจำลองการทำงานของ C# ลงใน Flash เพื่ออธิบายการทำงานของ Program จึงอยากทราบการทำงานที่ถูกต้อง

ขอบคุณล่วงหน้าค่ะ

@ ^_^ @

#9 By Chariot (61.91.137.182) on 2005-07-02 00:12

foreach ใช้กับตัวแปร collection ครับ(พวกอะไรที่เป็นกลุ่ม ๆ ก้อน ๆ ของตัวแปรอย่างเช่น array) เพื่อให้เขียน for loop สั้นลง และรันเร็วขึ้นเช่น

int[] arr = {1, 2, 3, 4, 5};
for(int i = 0; i < arr.Length; i++) {
Console.WriteLine(arr[i]);
}
สามารถเขียนเป็น
foreach(int i in arr) {
Console.WriteLine(i);
}
(ใน Java 5.0 นั้น การใช้ foreach ร่วมกับ Generic นั้น จะเห็นประโยชน์ ว่ามันสั้นลงมาก ๆ)

#8 By T!D on 2005-07-01 00:16

ตอนนี้กำลังศึกษา C# ด้วยตนเองอยู่ และอยากทราบเรื่อง ของ foreach เพราะว่ารู้สึกว่าจะเพิ่งมีใน C# (ก็ไม่มั่นใจสักเท่าไหร่) ในหนังสือภาษาไทยที่อ่านๆดู ก็เขียนบ้าง แต่ไม่ละเอียดมาก ส่วนหนังสือภาษาอังกฤษก็คงมีบ้าง แต่แปลไม่ค่อยไม่เรื่อง(แบบว่าอ่อนแอภาษาอังกฤษมากๆ)

ใครพอเข้าใจเรื่อง foreach ก็ช่วยเข้ามาอธิบายกันหน่อย ถือว่าเป็นการให้ความรู้แก่ผู้ไม่รู้ล่ะกัน

@ ^_^ @

#7 By Chariot (61.91.137.182) on 2005-06-30 16:50

เจ๋งมากครับ...





แต่หลังๆมันเร็วจนผมตามไม่ทันเลยอ่ะ





จะลองศึกษาดูเรื่อยๆครับ

#5 By ปาม มี่ ♫ on 2005-06-15 14:33

บล็อคความรู้สุดยอด!! เรียนวิศวะคอมปี2ค่ะ ก็ต้องเจอพวกนี้เหมือนกัน
ขออนุญาติแอดบล็อคนะคะ (เผื่อมีเรื่องจะมาปรึกษา อิอิอิ)

#4 By ♡ BlackCrystal ♡ on 2005-06-14 22:38



เก่งจัง

#3 By A N E W on 2005-06-13 16:39

เอิ๊กๆ คิดผิดเองแหละ

#2 By zkan on 2005-06-13 08:03

ใน fn ParseInt เหมือนกับมันจะสลับเลขเลยอะ
เช่นจาก 32 กลายเป็น 23

for(n = 0; Char.IsDigit(s[i]); i++)
n = 10 * n + (s[i] - '0');

หรือว่าคิดผิดเองหว่า

#1 By zkan on 2005-06-13 07:54