CProgrammingPro

หวัดดีคร้าบท่านผู้อ่านทุกท่าน บทนี้จะนำเสนอเรื่องการจองอาเรย์แบบที่ปรับเปลี่ยนขนาดได้!!!

ปรับเปลี่ยนได้ไม่ได้หมายถึง จองไว้ 10 แล้วกลางโปรแกรมหดเลือห 5 แล้วยืดไป 7 อะไรแบบนี้นะครับ
(ทำได้รึเปล่าไม่รู้แฮะ) แต่หมายถึงว่า เราสามารถให้โรแกรมกำหนดขนาดตอนจองได้(อ่าว งงละสิ)

คืองี้ครับ ปกติเวลาเราจองอาเรย์ เราก็จะประกาศแบบนี้(สมมติจอง 100 ช่อง)

int array[100];

ซึ่งหมายความว่า ไม่ว่าเราจะรันกี่ร้อยกี่พันครั้ง มันก็จะจองให้เรา 100 ช่อง

สมมติเราทำโปรแกรมเก็บอายุนักเรียน แบบเขียนครั้งเดียว แจกให้ทุกโรงเีรียนทั่วประเทศ ถ้าโรงเรียนนึง
 มี 100 คน อีกโรงเรียนมี 200 คน อีกโรงเรียนมี 500 คน เราก็ต้องประกาศอาเรย์ถึง 500 ช่องถูกมั้ยครับ
ถ้าน้อยกว่านี้ โรงเรียนสุดท้ายก็จะมีอาเรย์ไม่พอ แต่ถ้าประกาศ 500 ช่อง โรงเรียนแรกซึ่งต้องการใช้
แค่100 ช่อง ก็จะเสียหน่วยความจำไปฟรีๆ400ช่อง การสร้างตัวแปรแบบ Dynamic จึงได้ถือกำเนิดขึ้น!!!

ก่อนอื่น ทุกคนควรจะมีความู้เรื่อง pointer มาบ้างนะครับ เพราะจำเป็นสำหรับบทนี้

วิธีการคือ เวลาเราประกาศ เราไม่ต้องไปประกาศเป็นอาเรย์ครับ ให้ประกาศเป็น pointer ไปเลย!!!

int* dnm;

จากนั้น เราก็จัดการบอกโปรแกรมว่า ต้องการให้มันมีกี่ช่อง ด้วยฟังก์ชันแบบนี้

dnm = ( int *)malloc(size * sizeof(int));

ชนิดข้อมูลไม่จำเป็นต้องเป็น int นะครับ อย่างอื่นก็ได้ แต่ต้องประกาศเป็นพอยเตอร์ชนิดนั้นๆ
แล้วก็เปลี่ยนคำว่า int ตรง malloc เป็นชื่อชนิดข้อมูลนั้นๆด้วย

size : ขนาด หมายถึงจำนวนช่อง ใส่เป็นตัวแปรได้(นี่คือสิ่งที่ทำให้มันเป็น dynamic เพราะการ
ประกาศอาเรย์ปกติใส่ตัวแปรไม่ได้ ยกเว้นตัวแปรค่าคงที่) เช่นถ้าให้ประกาศ 10 ช่องก็ใส่เลข 10 ถ้าให้
ประกาศ n ช่องก็ใส่ตัวแปร n เข้าไปได้เลย

เวลาใช้งาน เราก็ลืมไปเลยว่ามันเป็น pointer ครับ ใช้งานเหมือนอาเรย์ได้ทุกประการ

แต่มีข้อยกเว้นคือ เมื่ไหร่ที่เราไม่ต้องการมันอีก เราต้องทำการ free มันครับ ไม่งั้นมันจะเป็นเนื้อที่
ที่ใช้งานไม่ได้อยู่ในหน่วยความจำ(รกนั่นเอง) วิธํี free ก็คือ

free(ชื่อตัวแปร);

เช่น

free(dnm);

หลังจากที่ free ไปแล้ว เราจะใช้งานตัวแปรอาเรย์ไดนามิกที่เราสร้างขึ้นไม่ได้อีก ถ้าอยากใช้งาน
ต้องจับมันมา malloc อีกครั้ง

ตัวอย่างโปรแกรม

#include   [stdio.h ] // change  [ , ] to < , >

int main()
{
    int* p;
    int n,i;
    printf("How many element in array : ");
    scanf("%d",&n);
    p = (int *) malloc(n*sizeof(int));
   
printf("Input\n");
    for(i=0;i
        scanf("%d",&p[i]);
    for(i=0;i
        printf("%d ",p[i]);
    free(p);
    scanf(" ");
    return 0;
}

ผลการรัน

 


edit @ 5 Jul 2009 21:32:18 by Mistertun

edit @ 5 Jul 2009 21:39:17 by Mistertun

สำหรับผู้ที่เขียนภาษาซีเป็นแล้ว (และควรจะเขียนฟังก์ชันใช้งานเองเป็น)

    บทความของผมหลังจากนี้จะเริ่มเน้นไปทางบทความสำหรับผู้ที่มีพื้นฐานทางเขียนโปรแกรมแล้ว (เขียน
อธิบายง่ายกว่า แต่ถ้ามีแรงจะกลับมาเขียนให้ผู้เริ่มต้นอีกครับ) ซึ่งจะจัดอยู่ใน category ชื่่อ
CProgrammingPro
(คนเขียนก็ไม่ได้ pro หรอกนะ แต่หาชื่อเท่ห์ๆอย่างอื่นไม่ได้ - -")

หลายๆคนคงเคยเขียนโปรแกรมที่ต้องมีการจัดเรียนข้อมูล(sort)ในอาเรย์ ซึ่งการเขียนฟังก์ชันsortเองก็อาจจะ
เสียเวลา ในภาษาซีเรามีฟังก์ชันสำเร็จรูปมาให้แล้วครับ(ซึ่งทำงานได้เร็วพอสมควร)

ข้ันแรก ทำการ include ไฟล์ stdlib.h ด้วย

ขั้นที่ 2 ก๊อปฟังก์ชันด้านล่างนี้ไปแปะไว้ก่อน main()

int compare(const void *  a,const void * b)
{
    return (*(int*)a - *(int*)b);
}

ขั้นที่ 3 เมื่อไหร่ที่ต้องการซอร์ต ให้แทรกฟังก์ชันนี้เข้าไป

qsort(ชื่ออาเรย์,จำนวนช่องที่ต้องการจัดเรียง,ขนาดของข้อมูลแต่ละตัว,compare);

ชื่ออาเรย์ก็คือชื่อของอาเรย์ที่เราต้องการจัดเรียงข้อมูล
จำนวนช่อง ก็คือ สมมติว่าเรามีอาเรย์ขนาด 10 ช่อง แต่ต้องการจัดเรียงแค่ 5 ช่อง เราก็ใส่ 5 แค่นั้น(ใส่เป็นตัว
แปรเช่น n ก็ได้)
ขนาดข้อมูล ตรงนี้ให้ใส่แบบนี้ครับ sizeof(ชนิดข้อมูล) ถ้าเป็นอาเรย์แบบ int ก็ให้ชนิดข้อมูลเป็น int ถ้าอาเรย์
double ก็ให้ชนิดข้อมูลเป็น double
ส่วน compare ไม่ต้องสนใจ ใส่ๆไป

นี่เป็นตัวอย่างการจัดเรียงแบบน้อยไปมาก ถ้าอยากได้แบบมากไปน้อย ในฟังก์ชัน compare ให้แก้เป็นแบบนี้

int compare(const void *  a,const void * b)
{
    return (*(int*)b - *(int*)a); // สังเกตว่า a และ b สลับที่กัน
}

ตัวอย่างโปรแกรมนะครับ

#include [ stdio.h ] // change [ , ] to < , >
#include [ stdlib.h ] // change [ , ] to < ,>

int compare (const void * a, const void * b)
{
  return ( *(int*)b - *(int*)a
); // sort Max to Min
}


int main ()
{
  int n,arr[50],i;
  printf("How many number : ");
  scanf("%d",&n);
  printf("Input Number\n");
  for(i=0;i
    scanf("%d",&arr[i]);
  qsort (arr, 6, sizeof(int), compare);
  for (i=0;i
     printf ("%d ",arr[n]);
  scanf(" ");  
  return 0;
}

ผลการรัน

 

 

 


 

edit @ 5 Jul 2009 21:24:13 by Mistertun

edit @ 5 Jul 2009 21:25:54 by Mistertun

edit @ 5 Jul 2009 21:26:04 by Mistertun

edit @ 5 Jul 2009 21:40:07 by Mistertun