ภาษา C การเขียน code สลับค่าของ 2 ตัวแปร (สร้างเป็น function)

พอดีมีรุ่นน้องคนนึงมาถามผมเรื่องการสลับค่าของ 2 ตัวแปร ผมก็เลยอยากจะเอามาอธิบายสักหน่อย เผื่อไว้เป็น Basic เริ่มต้นสำหรับใครหลายๆคน แต่ในที่นี้ ผมจะเขียนด้วยภาษา C บ้างล่ะ (Java มันง่าย... รึป่าว?) มาเริ่มกันเลยละกันครับ
รูปที่ 1 การสลับของกันของมือกล




มาดู Basic Algorithm การสลับค่าก่อนนะ


สมมติว่า มีมือกลกากๆ อยู่ 2 ข้าง (ข้างละ 1 มือ) ทั้ง 2 ข้างต้องการสลับสิ่งของที่ถืออยู่ มันจำเป็นต้องมีพื้นที่วางของอยู่ที่หนึ่ง เพื่อให้มือของมันเองจะได้ว่าง มือข้างหนึ่ง จึงต้องไปฝากหัวใจไว้ที่กล่องฝากของ จะได้ดังรูปที่ 2
รูปที่ 2 ฝากของไว้ที่พื้นที่
ซึ่งกล่องฝากของนั้น เราจะเรียกว่า temp ก็ได้ เพราะใช้เพียงชั่วคราว เมื่อฝากของไว้ได้แล้ว มือข้าง A ก็ว่างแล้วสิ แสดงว่า A สามารถรับสิ่งของจาก B ได้แล้ว จึงส่งหัวใจจาก B ไปยัง A ทันทีดังรูปที่ 3
รูปที่ 3 ส่งหัวใจจาก B ไปยัง A
สุดท้าย B ก็หยิบหัวใจจากในกล่องออกไป
รูปที่ 4 หยิบหัวใจออกมา
จะเห็นว่า ในการสลับของจำเป็นจะต้องมีตัวฝาก ตัวกลาง หรือที่เค้าเรียกว่า temp (temporary แปลว่า ชั่วคราว) มารับฝากไว้ จึงจะสลับกันได้

ในการ 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 ว่าใส่ค่าไม่ตรงกับที่มันต้องการ

ความคิดเห็น

  1. เทพจริงๆๆๆๆๆๆๆๆๆๆๆๆ

    ตอบลบ
  2. ทำแบบง่ายๆๆ แบบเด็กๆๆ ให้ดูหน่อยได้ไหมคะ.
    #จงวิเคราะห์โปรแกรมรับค่าตัวเลข 2 จำนวน ถ้าตัวเลขตัวที่ 1 น้อยกว่าเท่ากับ 5 ให้ทำการสลับค่าตัวเลขทั้ง 2 จำนวน แล้วทำการแสงค่าตัวเลข 2 จำนวน ออกทางจอภาพ

    ตอบลบ

แสดงความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

Algorithm การหาค่า ห.ร.ม. โดยใช้วิธีของยุคลิด ( Euclidian Algorithm ) JAVA

SQL (Oracle) : สมการหาปีงบประมาณ และการแปลงรูปแบบปีให้เป็นปี พ.ศ.