ภาษา C การเขียน code สลับค่าของ 2 ตัวแปร (สร้างเป็น function)
พอดีมีรุ่นน้องคนนึงมาถามผมเรื่องการสลับค่าของ 2 ตัวแปร ผมก็เลยอยากจะเอามาอธิบายสักหน่อย เผื่อไว้เป็น Basic เริ่มต้นสำหรับใครหลายๆคน แต่ในที่นี้ ผมจะเขียนด้วยภาษา C บ้างล่ะ (Java มันง่าย... รึป่าว?) มาเริ่มกันเลยละกันครับ
สมมติว่า มีมือกลกากๆ อยู่ 2 ข้าง (ข้างละ 1 มือ) ทั้ง 2 ข้างต้องการสลับสิ่งของที่ถืออยู่ มันจำเป็นต้องมีพื้นที่วางของอยู่ที่หนึ่ง เพื่อให้มือของมันเองจะได้ว่าง มือข้างหนึ่ง จึงต้องไปฝากหัวใจไว้ที่กล่องฝากของ จะได้ดังรูปที่ 2
ซึ่งกล่องฝากของนั้น เราจะเรียกว่า temp ก็ได้ เพราะใช้เพียงชั่วคราว เมื่อฝากของไว้ได้แล้ว มือข้าง A ก็ว่างแล้วสิ แสดงว่า A สามารถรับสิ่งของจาก B ได้แล้ว จึงส่งหัวใจจาก B ไปยัง A ทันทีดังรูปที่ 3
สุดท้าย B ก็หยิบหัวใจจากในกล่องออกไป
จะเห็นว่า ในการสลับของจำเป็นจะต้องมีตัวฝาก ตัวกลาง หรือที่เค้าเรียกว่า temp (temporary แปลว่า ชั่วคราว) มารับฝากไว้ จึงจะสลับกันได้
ในการ Coding ก็เหมือนกัน เราก็จะสร้างตัวแปร temp ไว้เช่นเดียวกัน เพื่อเก็บไว้
มาดู Code กันเลยครับ
แต่!!! ผมไม่ได้ return ค่ากลับมาหนิ แล้ว x กับ y ทำไมถึงสลับค่ากันได้ล่ะ
ที่เป็นอย่างนี้ก็เพราะว่า ในบรรทัดที่ 18 parameter ที่รับเข้ามา มันเป็น swap(int &x , int &y)
ซึ่ง &x และ &y มันหมายถึงการรับค่า address ของตัวแปรนั้นๆ นั่นเอง เมื่อมีการสลับที่กัน จึงไปเปลี่ยนแปลงค่าที่ address นั้น ทำให้ผลลัพธ์แสดงได้อย่างถูกต้องครับ
ไม่เชื่อลองเอา & ออกดิ ผลลัพธ์มันจะไม่สลับค่าให้ สมมติว่าผมเขียน function swap แบบนี้
แต่ใน swap(int x,int y) ค่า x และ y ที่อยู่ใน swap นั้น มันก็จองพื้นที่ใหม่เช่นกัน เวลามันสลับค่ากัน มันก็สลับค่าในพื้นที่ใหม่ที่จองไว้
แต่ไม่ได้สลับค่าที่ประกาศใน main แค่นี้เอง
ไม่ยากครับ เพียงแค่เวลาส่งค่าเข้าไป ให้ส่งเป็นตัวแปร pointer ไปแทนครับ ดังนี้
และแก้ไขใน function swap ดังนี้
เนื่องจากใช้คำสั่ง strcpy() เราจำเป็นต้อง include library string.h เข้ามาด้วยครับ
อธิบาย Code
เนื่องจากว่าคำสั่ง strcpy บังคับให้ค่า parameter ตัวที่ 2 ต้องเป็น constant เพราะฉะนั้น จำเป็นต้องใส่ & ไว้หน้าตัวแปรด้วย ถ้าหากเราใส่เป็น strcpy(temp,a) มันจะขึ้น error ว่าใส่ค่าไม่ตรงกับที่มันต้องการ
รูปที่ 1 การสลับของกันของมือกล |
มาดู Basic Algorithm การสลับค่าก่อนนะ
สมมติว่า มีมือกลกากๆ อยู่ 2 ข้าง (ข้างละ 1 มือ) ทั้ง 2 ข้างต้องการสลับสิ่งของที่ถืออยู่ มันจำเป็นต้องมีพื้นที่วางของอยู่ที่หนึ่ง เพื่อให้มือของมันเองจะได้ว่าง มือข้างหนึ่ง จึงต้องไปฝากหัวใจไว้ที่กล่องฝากของ จะได้ดังรูปที่ 2
รูปที่ 2 ฝากของไว้ที่พื้นที่ |
รูปที่ 3 ส่งหัวใจจาก B ไปยัง A |
รูปที่ 4 หยิบหัวใจออกมา |
ในการ Coding ก็เหมือนกัน เราก็จะสร้างตัวแปร temp ไว้เช่นเดียวกัน เพื่อเก็บไว้
มาดู Code กันเลยครับ
#include <stdio.h> #include <conio.h> void swap(int &x,int &y); main() { int x,y; x = 5; y = 11; printf("\t\tBefore swapping-------------\n"); printf("\tx = %d\n",x); printf("\ty = %d\n",y); swap(x,y); printf("\t\tAfter swapping-------------\n"); printf("\tx = %d\n",x); printf("\ty = %d\n",y); } void swap(int &x,int &y) { int temp; temp = x; x = y; y = temp; }
รูปที่ 5 ผลลัพธ์ของโปรแกรม swap |
อธิบาย Code สักนิด ชีวิตจิตแจ่มใส
ใน main() ไม่มีอะไรมาก กำหนดค่า x และ y ก่อน และเรียก function swap() โยนค่า x และ y เข้าไป ...แต่!!! ผมไม่ได้ return ค่ากลับมาหนิ แล้ว x กับ y ทำไมถึงสลับค่ากันได้ล่ะ
ที่เป็นอย่างนี้ก็เพราะว่า ในบรรทัดที่ 18 parameter ที่รับเข้ามา มันเป็น swap(int &x , int &y)
ซึ่ง &x และ &y มันหมายถึงการรับค่า address ของตัวแปรนั้นๆ นั่นเอง เมื่อมีการสลับที่กัน จึงไปเปลี่ยนแปลงค่าที่ address นั้น ทำให้ผลลัพธ์แสดงได้อย่างถูกต้องครับ
ไม่เชื่อลองเอา & ออกดิ ผลลัพธ์มันจะไม่สลับค่าให้ สมมติว่าผมเขียน function swap แบบนี้
void swap(int x,int y) { int temp; temp = x; x = y; y = temp; }ค่า x และ y ไม่สลับกันหรอก เป็นเพราะว่า ตอนที่เราส่งค่าเข้ามาให้ x และ y ใน swap(x,y) อ่ะ เราก็ส่งค่าเข้าไปปกติ
แต่ใน swap(int x,int y) ค่า x และ y ที่อยู่ใน swap นั้น มันก็จองพื้นที่ใหม่เช่นกัน เวลามันสลับค่ากัน มันก็สลับค่าในพื้นที่ใหม่ที่จองไว้
แต่ไม่ได้สลับค่าที่ประกาศใน main แค่นี้เอง
แล้วถ้า ต้องการสลับข้อความกันล่ะ ทำยังไงดี
ไม่ยากครับ เพียงแค่เวลาส่งค่าเข้าไป ให้ส่งเป็นตัวแปร pointer ไปแทนครับ ดังนี้
char a[10] = "Hello"; char b[10] = "Good bye"; swap(*a,*b);
และแก้ไขใน function swap ดังนี้
void swap(char &a, char &b)
{
char temp[10];
strcpy(temp,&a);
strcpy(&a,&b);
strcpy(&b,temp);
}
เนื่องจากใช้คำสั่ง strcpy() เราจำเป็นต้อง include library string.h เข้ามาด้วยครับ
อธิบาย Code
เนื่องจากว่าคำสั่ง strcpy บังคับให้ค่า parameter ตัวที่ 2 ต้องเป็น constant เพราะฉะนั้น จำเป็นต้องใส่ & ไว้หน้าตัวแปรด้วย ถ้าหากเราใส่เป็น strcpy(temp,a) มันจะขึ้น error ว่าใส่ค่าไม่ตรงกับที่มันต้องการ
เทพจริงๆๆๆๆๆๆๆๆๆๆๆๆ
ตอบลบทำแบบง่ายๆๆ แบบเด็กๆๆ ให้ดูหน่อยได้ไหมคะ.
ตอบลบ#จงวิเคราะห์โปรแกรมรับค่าตัวเลข 2 จำนวน ถ้าตัวเลขตัวที่ 1 น้อยกว่าเท่ากับ 5 ให้ทำการสลับค่าตัวเลขทั้ง 2 จำนวน แล้วทำการแสงค่าตัวเลข 2 จำนวน ออกทางจอภาพ