วันเสาร์ที่ 13 ธันวาคม พ.ศ. 2557

sort

bubble sort

  1. เริ่มจากการนำค่าแรก มาเปรียบเทียบกับค่าถัดไป ซึ่งก็คือค่าที่สองในแถวลำดับ ถ้าไม่ตรงตามจุดประสงค์จะทำการสลับค่าทั้งสอง จากนั้นขยับมาเปรียบเทียบ ระหว่างค่า ที่ 2 และที่ 3 ทำเช่นนี้ไปเรื่อยๆ จนกว่าจะถึงค่าสุดท้าย ก็จะได้ค่าที่เรียงแล้วค่าแรกอยู่ ณ ตำแหน่งสุดท้ายของ แถวลำดับ 
  2. ดำเนินการเช่นเดียวกับข้อ 1. โดยเริ่มต้น จากการเปรียบเทียบ ค่าที่ 2 กับ ค่าที่ 3 และเปรียบเทียบ ทีละคู่ไปเรื่อย ๆ จนถึงค่า รองสุดท้าย ก็จะได้ค่าที่เรียงแล้ว ค่าที่ 2 อยู่ ณ ตำแหน่งรองสุดท้าย ของแถวลำดับ
  3. ดำเนินการเช่นเดียวกับข้อ 1. จนครบทุกค่า ก็จะได้แถวลำดับที่เรียง


int num[5]={5,4,3,2,1};
int i,j,temp;
for(i=0;i<4;i++){
            for(j=0;j<4;j++){
                    if(num[j]>num[j+1]){
                            temp=num[j];
                            num[j]=num[j+1];
                            num[j+1]=temp;
                            }
              }
}

insertion sort
  1. นำข้อมูล 2 ตัวแรกเปรียบเทียบแล้วเรียงลำดับกันก่อน 
  2.  นำข้อมูลตัวถัดไปเปรียบเทียบตั้งแต่ตัวแรกของทางฝั่งซ้ายแล้วนำไปแทรกในตำแหน่งที่เหมาะสมที่สุด ทำขั้นตอนนี้ไปเรื่อยจนกว่าจะหมดข้อมูลทางด้านขวา ก็จะได้ผลลัพธ์ในการเรียงลำดับ
void insertionSort(int arr[]) {
   for(int i=0; i< arr.length; i++) { 
          int value = arr[i]; 
          int j = i-1; 
          while( j>=0 and arr[j]>value ) { 
                     arr[j + 1] = arr[j] 
                      j--; 
            } 
     arr[j+1] = value ;
      } 
 Selection Sort
  1. เริ่มจากการนำ ค่าแรก มาเทียบกับค่าที่สองของแถวลำดับ ถ้าค่าแรก ค่าแรกมากกว่าค่าที่สอง จะทำการสลับค่าทั้งสองทำเช่นนี้ไปเรื่อยๆ โดยการนำค่าแรก มาเทียบกับค่าที่สาม , ค่าที่สี่, . . . , ค่าสุดท้าย เพื่อย้ายค่าที่มีค่าน้อยที่สุดมาอยู่ ณ ตำแหน่งแรก ของแถวลำดับ และเมื่อสิ้นสุดก็ถือว่าค่าแรก เป็นค่าที่เรียงแล้วในแถวลำดับ
  2. ดำเนินการเช่นเดียวกับข้อ 1. โดยการนำค่าที่สอง มาเทียบกับค่าถัดไปจนครบทุกค่าของแถวลำดับ เพื่อย้ายข้อมูลที่มีค่าน้อยที่สุดเป็นลำดับสอง มาอยู่ ณ ตำแหน่งที่สองของแถวลำดับ
  3. ดำเนินการเช่นเดียวกับข้อ 1. กับค่าที่สาม, ค่าที่สี่ ไปเรื่อยๆ จนถึง ค่ารองสุดท้าย ของแถวลำดับ ซึ่งในที่สุดจะได้ชุดข้อมูลในแถวลำดับที่เรียงกันตามความต้องการ

 SelectionSort(Var : A[Max])
   For (I := 1  to  Max-1)
           For (J := I+1  to  Max)   Do
                   If(A[I] > A[J])   Then   Swape(A[I],A[J]);
Merge sort
           เริ่มด้วยการแบ่งข้อมูลออกเป็นส่วนที่เล็กที่สุด แล้วเริ่มผสานข้อมูลก้อนเล็ก ๆ เข้าด้วยกันกลายเป็นข้อมูลก้อนที่ใหญ่ขึ้นในที่สุดข้อมูลทุกชิ้นจะเรียงลำดับอย่างสมบูรณ์
void merge_sort(int low, int high, int* p){
    int pivot;
    static int i(1);
    if (high>low)
    {
        pivot = low + ((high - low)/2);
        merge_sort(low, pivot, p);
        merge_sort(pivot+1, high, p);
        merge(low, pivot, high, p);

    }
}
void merge(int l, int pi, int h,int* arr)
{
            int start = l;
        int mid = pi+1;
        while((start<=pi)&&(mid <=h)){
            if (arr[start] > arr[mid])
            {
                int temp = arr[mid];
                arr[mid] = arr[start];
                arr[start] = temp;
                mid++;
             }
            else
                start++;
    }
}
Quick Sort

quicksort เป็น divide & conquer คือ 

ถ้ามีข้อมูลชุดนึงที่เรียงแล้ว(น้อย->มาก) นำตัวตรงกลางๆ ออกมา ตัวนั้นต้องมีสมบัติดังนี้คือ ต้องมากกว่าข้อมูลทางซ้ายทั้งหมดและน้อยกว่าข้อมูลทางขวาทั้งหมด
เพราะฉะนั้นถ้าทำให้เราสามารถหยิบทุกตัวในข้อมูลแล้วมีคุณสมบัติตามนี้หมด (ยกเว้นกรณีหยิบซ้ายสุดขวาสุดนะ) ก็จะได้ว่าข้อมูลถูกเรียงแล้ว 
เพราะฉะนั้นเวลาเขียน quicksort ก็จะมี function นึงที่เลือกข้อมูลมาตัวนึงมาจัดให้ด้านซ้ายน้อยกว่ามันหมด และทางขวามากกว่ามันหมด
แล้วทำซ้ำแบบเดิมด้วยการใช้ function เดิมกับข้อมูลด้านซ้าย และด้านขวา


int quickSort( int a[], int l, int r)
{
   int j;
   if( l < r )
   {
      // divide and conquer
        j = partition( a, l, r);
       quickSort( a, l, j-1);
       quickSort( a, j+1, r);
   }
   return(0);
}


int partition( int a[], int l, int r) {
   int pivot, i, j, t;
   pivot = a[l];
   i = l; j = r+1;
   
   while( 1)
   {
      do ++i; while( a[ i ] <= pivot && i <= r );
      do --j; while( a[j] > pivot );
      if( i >= j ) break;
      t = a[ i ]; a[ i ] = a[j]; a[j] = t;
   }
   t = a[l]; a[l] = a[j]; a[j] = t;
   return j;
}

วันศุกร์ที่ 12 ธันวาคม พ.ศ. 2557

โครงสร้างข้อมูลแบบคิว (Queue)


  • มีลักษณะคล้ายกับสแตก  คือ ข้อมูลในคิวจัดเรียงกันอย่างมีลำดับเช่นเดียวกับสแตก แต่ต่างกันตรงที่คิวแยกทางเข้าและออกของข้อมูลไว้คนละส่วนกัน
  • ข้อมูลที่นำเข้าไปเก็บก่อนจะถูกนำออกมาทำงานก่อน ส่วนข้อมูลที่เข้าไปเก็บทีหลังก็จะถูกนำออกมาใช้งานทีหลัง 
  • มีคุณสมบัติที่เรียกว่า  FIFO (First-In-First-Out)
  • มีขั้นตอนที่ซับซ้อนกว่าสแตก  เนื่องจากต้องจัดการกับตัวชี้ front และ rear ให้ถูกต้อง
  • ตัวชี้ Front ชี้ไปที่สมาชิกตัวแรก และตัวชี้ Rear ชี้ไปที่สมาชิกตัวสุดท้ายของคิว โดยที่เวลาข้อมูลจะเข้าสู่คิวจะเข้าทาง R ส่วนเวลาที่ข้อมูลจะออกจากคิวจะออกทาง F 


การเพิ่มข้อมูลในคิว (Enqueue)
           การเพิ่มข้อมูลในคิว ข้อมูลจะถูกเพิ่มเข้ามาทางด้าน Rear ของคิว
ขั้นตอนการเพิ่มข้อมูลลงในคิว

  1. ตรวจสอบว่าคิวเต็มหรือไม่ กรณีเกิดคิวเต็มค่าของ Rear จะเท่ากับขนาดสูงสุดของตัวแปรอาร์เรย์ ถ้าคิวเต็มควรแจ้งด้วยว่า คิวเต็ม ไม่สามารถเพิ่มข้อมูลได้
  2. การนำข้อมูลเข้าสู่คิว  จะไม่สามารถนำเข้าในขณะที่คิวเต็มหรือไม่มีที่ว่าง ถ้าพยายามจะทำจะเกิด error ที่เรียกว่า  overflow
  3. ถ้าคิวยังว่างอยู่ ให้ขยับ Rear ไปที่ตำแหน่งถัดไป 1 ตำแหน่ง
  4. นำข้อมูลที่ต้องการเพิ่มมาเก็บไว้ ณ ตำแหน่งใหม่ของ Rear
  5. ถ้าข้อมูลที่เพิ่มเข้าไปเป็นค่าเดียวในคิว ให้ขยับ Front มาอยู่ตำแหน่งเดียวกันกับ Rear นั่นคือ Front = 1


Algorithm QINSERT(Q,Y)
This Algorithm is to insert the item into queue
Pre  Q is a queue structure that has N size
        Y is an item to insert into queue
Post  Y is inserted into queue
     if  (R = N)   then
print   “QUEUE FULL”
     else
           set R to R + 1         /* ให้  R ชี้ไปยังที่ว่างถัดไป */
           set Q[R] to Y         /*  นำข้อมูล Y เข้าสู่คิว  */
           if  (F = 0)    then      /* ถ้า Y เป็นค่าเดียวในคิว  */
set  F to 1               /* F และ R ชี้ไปยังค่าเดียวกัน */
set  R to 1            endif
      endif
End QINSERT

การดึงข้อมูลจากคิว (Dequeue)

            ข้อมูลจะถูกดึงออกจากคิวผ่านทาง Front   กรณีถ้าข้อมูลอยู่ภายในคิวมีเพียงตัวเดียว ค่า Front จะมีค่าเท่ากับ Rear
ขั้นตอนการดึงข้อมูลจากคิว
  1. ตรวจสอบดูก่อนว่า คิวว่างหรือไม่ ถ้าคิวว่างให้แจ้งออกมาว่า คิวว่าง ดึงข้อมูลไม่ได้
  2. การนำข้อมูลออกจากคิว  จะไม่สามารถนำอะไรออกจากคิวที่ว่างเปล่า  ถ้าพยายามจะทำจะเกิด error ที่เรียกว่า underflow
  3. ถ้าคิวไม่ว่าง ให้ดึงข้อมูลที่ Front ออกมาเก็บไว้ในตัวแปร (ก็คือ ตัวข้อมูลที่ดึงออกมาได้)
  4. ตรวจสอบดูว่า ข้อมูลที่ถูกดึงออกมาเป็นข้อมูลตัวสุดท้ายในคิวหรือไม่ นั่นคือ ดูว่า Front = Rear หรือไม่
  5. ถ้า Front = Rear นั่นคือ ข้อมูลที่ดึงออกมาเป็นข้อมูลตัวสุดท้าย ฉะนั้นตอนนี้คิวว่างแล้ว วิธีการบอกว่าคิวว่างก็คือ Front = Rear = 0
  6. ถ้า Front != Rear คือ คิวไม่ว่าง ก็ให้ขยับ Front ขึ้นไปอีก 1 ขั้น
Algorithm QDelete(Q)
This Algorithm is to delete the item from queue
Pre  Q is a queue structure that has N size
Post  X is an item returned
    if  (F = 0)   then
print   “QUEUE EMPTY”
    else
           set  X  to Q[F]         /* นำค่าแถวหน้าออกจากคิวเก็บไว้ใน  X */
           if  (F = R)    THEN      /* ถ้า ในคิวมีค่าเดียว  */
set  F  to  0              /* คิวว่าง */
set  R to 0            else  
set  F to F + 1       /*  ให้  F  ชี้ไปยังค่าหน้าแถวคิวถัดไป  */
           endif
    endif
End QDelete
การตรวจสอบคิวว่าง (Empty)

          การตรวจสอบว่าคิวว่างหรือไม่นั้น เป็นงานประจำที่จะต้องทำเมื่อต้องการดึงข้อมูลออกจากคิว ซึ่งมีหลักการในการพิจารณาง่ายๆ คือ กรณีที่จะเกิดคิวว่างได้ก็ต่อเมื่อ Front = Rear = 0 เท่านั้น
Algorithm EmptyQ(Q)
Pre  Q is a queue structure
Post  boolean returned
if (F = 0) and (R = 0)  then
set empty to True
else
set empty to  False
endif
End EmptyQ
การตรวจสอบคิวเต็ม (Full)
การตรวจสอบว่าคิวเต็มหรือไม่นั้น เป็นการดำเนินการที่จำเป็นต้องทำเสมอเมื่อต้องการที่จะเพิ่มข้อมูลเข้าไปในคิว ซึ่งมีหลักการในการพิจารณาคือ กรณีเกิดคิวเต็มค่าของ Rear จะมีค่าเท่ากับความจุของคิวนั้น
 Algorithm FullQ(Q)
Pre  Q is a queue structure
Post  boolean returned
if (R = Max)  then
set  full  to True
else
set  full  to  False
endif
End FullQ


โครงสร้างข้อมูลแบบกองซ้อน (Stack)


  • สแตกเป็นลิเนียร์ลิสต์ที่มีคุณสมบัติที่ว่าเมื่อทำการเพิ่มข้อมูลหรือลบข้อมูลในสแตกจะกระทำทีปลายข้างเดียวกัน ปลายข้างนั้นเรียกว่า top ของสแตก(Top Of Stack)  จึงเรียกว่า เป็นโครงสร้างแบบกองซ้อน
  •  มีคุณสมบัติเฉพาะที่เรียกว่า ไลโฟลิสต์(LIFO List) คือสมาชิกข้อมูลที่เข้าไปในลิสต์ทีหลังจะได้ออกจากลิสต์ก่อน(Last In First Out) 
  •  การเพิ่มข้อมูลเข้าสแตกจะเรียกว่า pushing
  •  การนำข้อมูลจากสแตกเรียกว่า poping
  • การเพิ่มหรือลบข้อมูลในสแตกทำที่ top ของสแตก 
  • Top ของสแตกเป็นตัวชี้สมาชิกตัวท้ายสุดของสแตก 
  • การสร้างสแตกผู้สร้างต้องดำเนินการสองสิ่งใหญ่ ๆ คือ

              เลือกการแทนข้อมูลของสแตก 
              สร้างการดำเนินงานโดยใช้การแทนที่ข้อมูลที่เลือกแล้ว
  • การแทนข้อมูลของสแต็ก  สามารถทำได้ 2 วิธี  คือ
              การแทนข้อมูลของสแต็กแบบอะเรย์
             การแทนข้อมูลของสแต็กแบบลิงค์ลิสต์ 
  • สิ่งที่ต้องเพิ่มเข้าไปเพื่อให้โครงสร้างข้อมูลแบบลิสต์กลายเป็นโครงสร้างข้อมูลแบบสแตก  ก็คือ  ตัวชี้ตำแหน่ง สำหรับข้อมูลที่อยู่บนสุดของโครง สร้าง ซึ่งค่าที่เก็บอยู่ที่ตัวชี้ตำแหน่ง ก็คือ ตำแหน่งของข้อมูลที่อยู่บนสุดของโครงสร้างข้อมูล
อาร์เรย์
ลิงค์ลิสต์
การดำเนินการพื้นฐานกับสแตก
      การทดสอบว่าสแตกว่างหรือไม่ (empty)
      การทำงานเพื่อตรวจสอบว่ามีข้อมูลอยู่ในสแตกหรือไม่ ทำได้โดยการตรวจสอบดูว่าตำแหน่งของ Top ของสแตกอยู่ ณ ตำแหน่งเริ่มต้นหรือไม่ (ตำแหน่ง 0 ตรงนี้ดูไห้ดีว่า top เป็น 0 หรือ -1)

Algorithm empty (s)
Pre  s is a stack
Post  boolean returned for showing status of stack
Return   boolean returned
if  Top = 0 then
    set empty to True
else set empty to False
endif
return empty
End empty
       การนำสมาชิกลงสแตก (push) 
  • การเพิ่มข้อมูลเข้าสแตก หมายถึง การเพิ่มข้อมูลเข้าในสแตก โดยให้ทับบนข้อมูล สุดท้ายในสแตก
  • จะสามารถเพิ่มเข้าได้เรื่อย ๆ จนกว่าจะเต็มสแตก 
  • ความหมายของคำว่า สแตกเต็ม คือ  top ของสแตกชี้ที่เนื้อที่สุดท้ายของสแตกแล้ว เช่น ถ้า สแตกนั้นจองเนื้อที่ไว้ N เนื้อที่  โดยที่สามารถบรรจุสมาชิกในสแตกได้ N ตัว เมื่อสแตกว่างค่า top เป็นศูนย์ เมื่อสแตกเต็มค่า top เป็น N ดังนั้นเมื่อ top ชี้ที่ N ก็ไม่สามารถ Push ข้อมูลลงสแตกได้อีกหรือ เกิด errorที่เรียกว่า “Stack Overflow”
      ขั้นตอนการเพิ่มข้อมูลลงในสแตก
  1. ตรวจสอบว่าสแตกเต็มหรือไม่ โดยดูว่าในขณะนั้น top ของสแตกอยู่ที่ตำแหน่งสูงสุดหรือไม่
  2. ถ้ายังไม่เกินขนาดของสแตก ให้เพิ่มค่าของ top ไปยังตำแหน่งใหม่
  3. จากนั้นเพิ่มข้อมูลไว้ที่ตำแหน่ง top ของสแตก
Algorithm push( S, data)
Insert one item into the stack
Pre     S is a stack passed by reference
           data contain data to be pushed into stack
Post    data have been pushed in stack or error printed
Return  -
If  top  = upperbound  then
print  “Stack Full”
else
set  top  to  top +1
set  S[top]  to  data
endif
End push
         การดึงข้อมูลออกจากสแตก (Poping stack)
  • การดึงข้อมูลออกจากสแตก หมายถึงการนำข้อมูลที่อยู่บนสุดในสแตกหรือข้อมูลในตำแหน่งที่ top ออกจากสแตก
  • จะสามารถ pop สแตกได้เรื่อย ๆ จนกว่าสแตกจะว่าง
  •  ไม่สามารถ pop ค่าออกจากสแตกที่ว่างเปล่าได้ ไม่เช่นนั้นจะเกิด error ที่เรียกว่า “Stack underflow”
        ขั้นตอนการดึงข้อมูลออกจากสแตก
  1.  ตรวจสอบดูก่อนว่าสแตกว่างหรือไม่ โดยเรียกใช้ฟังก์ชัน empty เพื่อป้องกัน ปัญหา underflow 
  2.  ถ้าสแตกว่างก็จะตอบกลับมาเป็น False นั่นคือ ดึงข้อมูลไม่ได้
  3.  ถ้าภายในสแตกมีข้อมูลอยู่ ให้ดึงข้อมูลตัวที่อยู่ตำแหน่ง top ของสแตกออกมา
  4.  ลดค่าของ top เนื่องจากเราต้องย้ายตำแหน่ง top ของสแตกลงไป 1 ค่า หลังจากที่มีการดึงข้อมูลออกจากสแตก
Algorithm  POP(s)
This algorithm pops the items on the top of the stack and return to the user
Pre       s is a stack
Post      the item is poped or error is printed
Return  dataout contains poped item is returned
if top = 0   then
      print  “Stack empty”
else
      set  dataout  to  S[top]
      set  top  to  top –1
endif
return dataout
End POP

ลิงค์สแตก

  • คือ  โครงสร้างข้อมูลสแตกที่แทนที่ข้อมูลแบบไดนามิกส์ที่ใช้ลิงค์  โดยมี พอยน์เตอร์ top  ชี้ที่ top ของสแตก
  • การ push คือ การเพิ่มข้อมูลที่ต้นลิสต์
  • การ pop คือ การลบข้อมูลที่ต้นลิสต์
  • ควรใช้โครงสร้างลิงค์สแตกเมื่อต้องการใช้สแตกเก็บข้อมูลโดยไม่ทราบแน่นอนว่าข้อมูลมีมากเพียงใด แต่ถ้าทราบแน่นอนว่าข้อมูลที่เก็บในสแตกมีน้อย ก็ควรแทนที่ข้อมูลแบบ static  เพราะลิงค์สแตกก็ต้องสิ้นเปลืองเนื้อที่ในส่วนของพอยน์เตอร์
 struct s {
                item type  item;
                struct s  *link;
 };
 struct s *top;
       


โครงสร้างข้อมูลแบบ Linked Lists


  • ลิงค์ลิสต์เป็นการนำข้อมูลแต่ละโหนดมาจัดเรียงต่อกันเป็นลิสต์ที่มีการเชื่อมโยงกัน
  • ภายในแต่ละโหนดแบ่งส่วนประกอบได้เป็น 2 ฟิลด์ คือ ข้อมูล และแอดเดรสของโหนดถัดไป (Link) โดยฟิลด์ข้อมูลสามารถเก็บข้อมูลได้มากกว่าหนึ่งค่า
  • ลิงค์ลิสต์เป็นการนำข้อมุลแต่ละโหนดมาเรียงต่อกันเป็นลิสต์ สิ่งที่เป็นตัวกำหนดลำดับ คือ ฟิลด์แอดเดรสของแต่ละโหนด
  • การเข้าถึงลิงค์ลิสต์เริ่มต้นจะต้องมีพอยน์เตอร์ชี้ไปยังโหนดแรกของลิงค์ลิสต์ (Head)
  • ฟิลด์แอดเดรสของโหนดสุดท้ายต้องกำหนดให้เป็น null ซึ่งเป็นการกำหนดให้จบลิงค์ลิสต์
  • ลิงค์ลิสต์ที่ไม่มีโหนดอยู่ภายในจะเรียกว่า ลิสต์ว่าง (empty list หรือ null list)
  • ลิงค์ลิสต์เดี่ยว (Single Linked List) คือ ลิงค์ลิสต์ที่มีฟิลด์แอดเดรสเพียงฟิลด์เดียวสำหรับชี้ตำแหน่งของโหนดถัดไป

  • ลิงค์ลิสต์คู่ (Double Linked List) คือ ลิงค์ลิสต์ที่มีฟิลด์แอดเดรสจำนวน 2 ฟิลด์ สำหรับชี้ตำแหน่งของโหนถัดไปและตำแหน่งของโหนดที่อยู่ก่อนหน้า


Insert a node to the right of node(p)
      สมมติว่า กำหนดให้ Double linked list  เป็น List of integers  และต้องการแทรกโหนดทางขวามือจากโหนดที่ p ชี้อยู่  และกำหนด q และ r  เป็นตัวชี้ไปยังโหนดใด ๆ
q = getnode()
info(q) = x
r = right(p)
left(r) = q
right(q) = r
left(q) = p
right(p) = q
 Insert a node to the left of node(p)
      สมมติว่า กำหนดให้ Double linked list  เป็น List of integers  และต้องการแทรกโหนดทางซ้ายมือจากโหนดที่ p ชี้อยู่  และกำหนด q และ r  เป็นตัวชี้ไปยังโหนดใด ๆ
        q = getnode()
info(q) = x
r = left(p)
right(r) = q
left(q) = r
right(q) = p
left(p) = q
Delete a given node
     สมมติว่า กำหนดให้ Double linked list  เป็น List of integers  และต้องการลบโหนดที่ p ชี้อยู่ และเก็บค่า info ของโหนดนั้นไว้ในตัวแปร X
กำหนด q และ r  เป็นตัวชี้ไปยังโหนดใด ๆ
x  =  info(p)
q = left(p)
r = right(p)
right(q) = r
left(r) = q
freenode(p)


The Array Structure

  • เป็นโครงสร้างข้อมูลที่มีลักษณะของการจองพื้นที่ในหน่วยความจำติดกัน ด้วยจำนวนคงที่ ซึ่งเก็บข้อมูลได้หลายๆ ตัวแต่จะเป็นชนิดของข้อมูล(Data Type) เดียวกัน เรียกว่า base type
  • เป็นแบบหนึ่งของโครงสร้างที่เรียกว่า  Linear List
  • เป็นโครงสร้างที่มีลักษณะ Random-access
  • การอ้างถึงข้อมูลใน Array จะทำได้โดยการใช้ชื่อ Array และระบุ index หรือ subscript ของข้อมูลที่ต้องการ
  • index ของ Array มีค่าตั้งแต่ 0 - n-1  (n คือจำนวนของข้อมูลทั้งหมดใน Array ซึ่งจะแสดงขนาดของ Array) 
ประเภทของ Array
nArray หนึ่งมิติ

  •          คือ โครงสร้างข้อมูลแถวลำดับที่มีการจัดเก็บข้อมูลต่อเนื่องกันไปเป็นแถวต่อ เนื่องกันตลอด ซึ่งเปรียบเหมือนกับตารางแถวเดียว โดยมีดัชนีอ้างอิงเพียง 1 ตัว
  • มีรูปแบบการประกาศตัวแปรเหมือนตัวแปรทั่วๆ ไปแต่มีการเพิ่มส่วนของการระบุจำนวนสมาชิก ว่าจะให้มีกี่ช่องไว้ในเครื่องหมายก้ามปู [ ] 

Data-Type   arrayName[arraySize]
Data-type  คือ ประเภทของข้อมูล Array  เช่น int,char,float
Array-name  คือ ชื่อของ Array
arraySize คือ จำนวนสมาชิกนี้สามารถระบุเป็นตัวเลขจำนวนเต็มลงไปเลย หรือใส่เป็นค่าคงที่ก็ได้ 
       การส่งผ่าน Array ไปยังฟังก์ชัน
void  setArray( int b[ ], int  n)
{
for (int i = 0; i< n; i++)
{   .................................................    {แสดงค่า ลำดับสมาชิกใน array}
    .................................................    {รับค่าจากผู้ใช้แล้วเก็บไว้เป็นสมาชิกของ array}

}
}

การเข้าถึงข้อมูลใน Array
การเข้าถึงข้อมูลที่อยู่ใน Array เพื่อที่จะนำไปสู่การค้นหา แก้ไข การเพิ่ม หรือการลดข้อมูลที่อยู่ในอาร์เรย์ ถ้ากำหนดให้ A คืออาร์เรย์หนึ่งมิติ เราสามารถเข้าถึงข้อมูลเพื่อทำงาน Process() ใดๆ กับข้อมูลทุกๆ ตัวที่อยู่ในอาร์เรย์
ตัวอย่าง
Traverse_Array(A)
set index  to 1   {กำหนดค่าเริ่มต้นให้กับดัชนี}
do while (index < size-of-A) {ทำซ้ำขณะที่ยังไม่ครบทุกตัว}
Process(A[index])   {ทำงานกับข้อมูล}
set index  to  index + 1 {เปลี่ยนตำแหน่งดัชนีของข้อมูล}
enddo
Insertion
สมมติให้ Array มีขนาด N ตัว ถ้าต้องการเพิ่มข้อมูล Item เข้าไปใน Array โดยให้เข้าไปอยู่ในตำแหน่ง K เขียนเป็นอัลกอริธึมได้ดังตัวอย่าง
ตัวอย่าง
Insert_Array(A, N, K, Item)
set index  to  N {กำหนดตำแหน่งตัวสุดท้าย}
do while (index > =K)             {ทำซ้ำขณะที่ยังไม่ถึงตำแหน่งที่ต้องการ}
set  A[index+1]  to  A[index] {ย้ายข้อมูลไป 1 ตำแหน่ง}
set index  to  index – 1 {ลดตำแหน่งลง}
end do
set  A[K]  to  Item {กำหนดค่า Item ในตำแหน่งที่ต้องการ}
set  N  to  N+1 {เปลี่ยนขนาดข้อมูล}
Deleting
สมมติให้อาร์เรย์มีขนาด N ตัว ถ้าต้องการลบข้อมูลตำแหน่งที่ K ออกจากอาร์เรย์ เขียนเป็นอัลกอริธึมได้ดังตัวอย่าง
Delete_Array(A, N, K)
set index to K
do while (index <= N-1) 
set  A[index] to A[index+1]
set  index to index+1
end do
set N to N - 1


วันพุธที่ 11 กันยายน พ.ศ. 2556

บทที่ 7 Array,String และการเรียงลำดับ

array คือกลุ่มของข้อมูลที่เรียงลำดับกัน มีจำนวนแน่นอนซึ่งข้อมูลจะเป็นประเภทเดียวกัน array จะเป็นตัวแปรที่ชื่อ เหมือนกัน แต่จะแตกต่างกันตรงหมายเลข อินเด็กซ์ เพื่อใช้ในการอ้างถึง  array จะทำให้การตั้งชื่อตัวแปรไม่มากมายหรือ ซับซ้อนเกินไปก็ได้ ถ้าหากตัวแปรหลายตัวเป็นประเภทเดียวกันเราก็อาจจะใช้ array แทนได้

รูปแบบการใช้ array 1 มืติ

 การใช้ตัวแปร array มีรูปแบบดังนี้

 ประเภทตัวแปร ชื่อตัวแปรarray[จำนวนสมาชิกของ array;

เช่น

 int Score[4];

ในที่นี้มีความหมายว่า เป็นการประกาศตัวแปร array ชื่อ Score มีจำนวน 4 รายการ โดยมีรายการที่

 Score[0]

 Score[1]

 Score[2]

 Score[3]



 Score[0]         Score[1]        Score[2]     Score[3]





          int                int             int                 int

รายการของ array จะเริ่มที่ 0 ไม่ได้เริ่มที่ 1 ถ้าเราประกาศตัวแปร array เช่น int i[3] ก็จะมีรายการที่ 0 ถึง 2 จะไม่มีหมายเลข อินเด็กซ์ 3

การเข้าถึงสมาชิกของ array

 การใช้ค่าคงที่ในการเข้าถึงสมาชิกของ array

 เราสามารถกำหนดค่าให้ สมาชิกของ array แต่ละรายการ คล้ายกับการกำหนดให้กับตัวแปร ธรรมดา แต่ว่าถ้าเป็น ตัวแปร array เราจะต้องกำหนด อินเด็กซ์ เป็นค่าคงที่ เช่น

 int A[4];

 A[0] = 50;

 จะมี

        A[0]             A[1]           A[2]                A[3]




      int                 int               int                int

 มีความหมายว่าให้ตัวแปร array ชื่อ A อินเด็กซ์ ที่ 0 มีค่าเท่ากับ 50

 ถ้าเราเขียน Source code แบบนี้

 cout << A[2];

 หมายถึงเป็นการให้โปรแกรมแสดงข้อมูลของตัวแปร array ชื่อ A อินเด็กซ์ที่ 2

 การใช้ตัวแปรในการเข้าถึงสมาชิกของ array

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

 int j = 3;

 int i[5];

 cout << i[j];

 แบบนี้จะมีความหมายว่าให้ แสดงค่าของตัวแปร array ชื่อ i อินเด็กซ์ที่ 3

 การใช้โอเปอเรเตอร์เลขคณิตในการเข้าถึงสมาชิกของ array

 เราสามารถใช้โอเปอเรเตอร์เลขคณิตในการเข้าถึงสมาชิกของ array ได้ เช่น

 A[2+3] = 40;

 หมายถึง การกำหนด ค่า 40 ให้กับตัวแปร array ชื่อ A อินเด็กซ์ที่ 5



โปรแกรมที่ 7-1 ตัวอย่างการใช้ตัวแปร array

Source code

1:#include"iostream.h"

2:main()

3:{

4: int Score[7];

5:

6:

7: Score[1] = 10;

8: Score[2] = 6;

9: Score[3] = 25;

10: Score[4] = 59;

11:

12: cout << Score[1] << endl;

13: cout << Score[2] << endl;

14: cout << Score[3] << endl;

15: cout << Score[4] << endl;

16: return 0;

17:}

Output

10

6

25

59

อธิบาย Source code

บรรทัดที่ 4: เป็นการประกาศตัวแปร array ประเภท int ชื่อ Score มีจำนวน 7 สมาชิก ตั้งแต่สมาชิกที่ 0 ถึง 6

บรรทัดที่ 7 ถึง บรรทัดที่ 10:เป็นการกำหนดค่าให้แก่ตัวแปร Score อินเด็กซ์ที่ 1,2,3,4 ตามลำดับ เราไม่จำเป็นต้องใช้ตัวแปร array ทุก อินเด็กซ์ที่มี เช่นในโปรแกรมนี้เราไม่ใช้ อินเด็กซ์ 0,5,6 เราอยากกำหนดให้อินเด็กซ์ ไหนก่อน ก็ได้

บรรทัดที่ 12 ถึง บรรทัดที่ 15:เป็นการแสดงค่าของตัวแปร array ชื่อ Score อินเด็กซ์ที่ 1,2,3,4 ตามลำดับ

โปรแกรมที่ 7-2 ตัวอย่างการใช้ loop ในการกำหนดและแสดงผลตัวแปร array โดยโปรแกรมนี้จะมีการทำงาน วน loop รับค่าตัวแปร array ชื่อ Score ทั้ง 7 อินเด็กซ์ และก็ใช้การวน loop แสดงผล โดยเรียงจากตำแหน่งสุดท้ายมาตำแหน่งแรก

Source code

1:#include"iostream.h"

2:main()

3:{

4: int Score[7];

5: int i;

6:

7: for(i=0;i<=6;i++)

8: {

9: cout << "Enter Score :";

10: cin >> Score[i];

11:

12: }

13:

14: for(i=6;i>=0;i--)

15: cout << Score[i] << endl;

16:

17: return 0;

18:}

Output

ข้อมูลที่จะลองใส่คือ 1,2,3,9,8,7,6

Enter Score:1

Enter Score:2

Enter Score:3

Enter Score:9

Enter Score:8

Enter Score:7

Enter Score:6

6

7

8

9

3

2

1

อธิบาย Source code

บรรทัดที่ 7 ถึง 12:เป็นการวน loop for โดยใช้ตัวแปร i ในการวน loop

ในบรรทัดที่ 10 เป็นการรับค่าตัวแปร Score อินเด็กซ์ ที่ i

 ในรอบแรกจะมีความหมายเหมือนกับ cin >> Score[0]

 ในรอบที่ 2 จะมีความหมายเหมือนกับ cin >> Score[1]

 จนถึงรอบสุดท้ายจะเป็นการรับค่าตัวแปร Score อินเด็กซ์ ที่ 6

บรรทัดที่ 14 ถึง 17:จะเป็นการวนloop แสดงค่าตัวแปร Score อินเด็กซ์ i โดยการวน loop ครั้งนี้จะแตกต่างจากการ วน loop รับค่า ตรงที่ ครั้งนี้ค่า i จะเริ่มที่ 6 และในรอบสุดท้ายค่า i จะเป็น 0

 ในรอบแรกจะมีความหมายเหมือนกับ cout << Score[6];

 ในรอบที่ 2 จะมีความหมายเหมือนกับ cout << Score[5];

 จนถึงรอบสุดท้ายจะเป็น อินเด็กซ์ 0



จากตัวอย่างที่ 7-1 และ 7-2 จะเห็นได้ว่าถ้าเราไม่ใช้ตัวแปร array เราก็อาจจะต้องประกาศตัวแปร ขึ้นมา ถึง 7 ตัว และเราจะไม่สามารถใช้การวน loop อ้างถึงตัวแปร แต่ละตัวได้ เช่น

 int Score1,Score2,Score3,Score4,Score5,Score6,Score7 ,i ;

 for(i=1;i<=7;i++)

 cin >> Scorei;

 ถึงแม้ว่าค่าของตัวแปร i ในแต่ละรอบจะเป็นตั้งแต่ 1 ถึง 7 แล้วเราเขียน Soucre code

เเบบนี้   cin >> Scorei;

เพื่อหวังว่ามันจะมีการทำงาน แบบนี้ในรอบที่ 1    cin >> Score1;

และจะเป็นแบบนี้ในรอบที่ 2  cin >> Score2;

 แต่ในความเป็นจริงแล้วมันเป็นไปไม่ได้ ถึงแม้ว่าC++  จะเป็นโปรแกรมภาษาที่ยืดหยุ่นมากก็เถอะ ถ้าเราจะใช้การวน loop ในการรับค่า กำหนดค่า หรือ แสดงผลเราต้องใช้ตัวแปร array

การกำหนดค่าเริ่มต้นให้แก่ตัวแปร array

 เราสามารถ กำหนดค่าเริ่มต้นให้แก่ สมาชิกแต่ละตัวของตัวแปร array ได้ โดยมีรูปแบบดังนี้

 ประเภทตัวแปร ชื่อตัวแปรarray[จำนวนสมาชิกของ array] = {ค่าของแต่ละอินเด็กซ์, ค่าของแต่ละอินเด็กซ์}

 ค่าของ แต่ละอินเด็กซ์แต่ละตัวต้องคั่นด้วยเครื่องหมาย , โดยที่ค่าที่กำหนดให้จะเรียงตามลำดับกันไป

เช่น

 int A[10] = {5,6,7,2,3,5,4,8,6,9}

 ตัวแปร A[0] จะเท่ากับ 5

  A[1] จะเท่ากับ  6

   A[9] จะเท่ากับ  9

โปรแกรมที่ 7-3 ตัวอย่างการกำหนดค่าเริ่มต้นให้กับต้วแปร array

Source code

1:#include"iostream.h"

2:int main()

3:{

4: int A[10] ={5,3,6,4,7,8,1,2,9,3};

5: int i;

6: for(i=0;i<=9;i++)

7: {

8: cout << "A[" << i << "]" << "=";

9: cout << A[i] << endl;

10: }

11:

12:

13: return 0;

14:}

Output

A[0] =5

A[1] =3

A[2] =6

A[3] =4

A[4] =7

A[5] =8

A[6] =1

A[7] =2

A[8] =9

A[9] =3

อธิบาย Source code

บรรทัดที่ 4:เป็นการประกาศตัวแปร array ชื่อ A มี 10 สมาชิก โดยกำหนดค่าเริ่มต้นให้แก่สมาชิกแต่ละตัวด้วย

บรรทัดที่ 6 ถึง บรรทัดที่ 10 :เป็นการวน loop เพื่อแสดงข้อความ และค่าของ สมาชิกแต่ละตัว

การใช้หน่วยความจำของ array

 จำนวนหน่วยความจำของตัวแปร array จะมีค่าเท่ากับ

หน่วยความจำของประเภทของตัวแปร * จำนวนสมาชิกของ

เช่น

int A[30];

ขนาดของหน่วนความจำที่ใช้จะเท่ากับ

ขนาดของตัวแปร int  * จำนวนสมาชิก

2 *  30 = 60 bytes

โปรแกรมที่ 7-4 ตัวอย่างการใช้ sizeof หาจำนวนหน่วยความจำที่ตัวแปร array ใช้

Source code

1:#include"iostream.h"

2:int main()

3:{

4:

5: cout << "size of int[10] = ";

6: cout << sizeof(int[10]) << " bytes" << endl;

7:

8: cout << "size of float[20] = ";

9: cout << sizeof(float[20]) << " bytes" <<endl;

10:

11: cout << "size of double[5] = ";

12: cout << sizeof(double[5]) << " bytes" <<endl;

13:

14: cout << "size of char[40] = ";

15: cout << sizeof(char[40]) << " bytes" <<endl;

16:

17:

18: return 0;

19:}

Output

size of int[10] = 20

size of float[20]= 80

size of double[5] = 40

size of char[40] = 40

อธิบาย Source code

บรรทัดที่ 6,9,12,15:เป็นการใช้ sizeof แสดงผลขนาดของตัวแปร array โดยผลที่ก็เป็นอย่าง Output เช่นในบรรทัดที่ 9 เป็นการสั่งให้แสดงผลค่าของตัวแปร float ที่มี 20 สมาชิก ค่าที่ได้คือ

 4 * 20 = 80 bytes

การใช้ array หลายมิติ

 array สามารถมีได้มากกว่า 1 มิติ เช่นรูปแบบ array 2 มิติจะเป็นแบบนี้

 รูปแบบของ array 2 มิติจะเป็นแบบนี้

 ประเภทตัวแปร ชื่อตัวแปรarray[จำนวนสมาชิกของของมิติที่ ][จำนวนสมาชิกของมิติที่ 2];

 เช่น

 int A[5][3];



 จะมีสมาชิกทั้งหมด 15 สมาชิก โดยจำนวนของสมาชิกจะเท่ากับ

จำนวนของมิติที่ 1 * จำนวนของมิติที่ 2

ในที่นี้ 5 * 3 = 15

สมาชิกจะมีตั้งแต่

 คอลัมน์0  คอลัมน์1 คอลัมน์2

แถวที่ 0 A[0][0]  A[0][1] A[0][2]

แถวที่ 1 A[1][0]  A[1][1] A[1][2]

แถวที่ 2 A[2][0]  A[2][1] A[2][2]

แถวที่ 3 A[3][0]  A[3][1] A[3][2]

แถวที่ 4 A[4][0]  A[4][1] A[4][2]



ในกรณีที่ array มี 2 มิติเราอาจจะเรียกมิติที่ 1 ว่า แถว และเรียกมิติที่ 2 ว่าคอลัมน์ก็ได้ แต่ถ้าจะนวนมิติของ array มีมากกว่า 2 ก็จะไม่สามารถใช้ คำว่าแถว หรือ คอลัมน์ได้

 การเข้าถึงข้อมูลสมาชิกของ array ที่มีหลายมิติ

 array ที่มีสมาชิกหลายมิติสามารถเข้าถึงข้อมูล ได้คล้ายกับ array 1 มิติ เพียงแต่เราต้องระบุอินเด็กซ์ของแต่ละมิติให้ครบ ตามจำนวนมิติของ array นั้น

 เข่น  int A[5][3];

 A[0][1] = 5;

 A[0][2] = 10;

 A[3][2] = 257;

 เป็นการกำหนดข้อมูลให้กับ ตัวแปร array 2 มิติ ชื่อ A โดยอินเด็กซ์ที่กำหนดให้ก็คือ [0][1],[0][2],[3][2] ค่าที่กำหนดให้คือ 5,7,257 ตามลำดับ สมมุติว่าเรากำหนดค่า 0 ให้กับสมาชิกตัวอื่นที่ไม่ใช้ 3 ตัวนี้ การเก็บข้อมูลจะเป็นรูปแบบนี้



  คอลัมน์0  คอลัมน์1 คอลัมน์2

แถวที่ 0 0 5 10

แถวที่ 1 0 0  0

แถวที่ 2 0 0  0

แถวที่ 3 0 0  257

แถวที่ 4 0 0  0



 นอกจากนั้นแล้วการ รับค่าจากทาง คีย์บอร์ด โดยใช้ cin และการแสดงผล โดยใช้ cout กับสมาชิกของ array ที่มีมากกกว่า 1 มิติก็ใช้ หลักการนี้ตลอด คือ เวลาจะกำหนดค่าหรือนำไปใช้ ก็ให้กำหนด อินเด็กซ์ ตามจำนวนมิติของ array นั้น ถ้าเป็น array 2 มิติก็ต้องกำหนด อินเด็กซ์ทั้ง 2 มิติ ถ้าเป็น array 3 มิติ ก็ต้องกำหนดทั้ง 3 มิติ

 ตัวอย่ากการใช้ array 2 มิติ

เราอาจจะนำ array 2 มิติมาใช้ได้สำหรับในกรณีที่ โปรแกรมของเราจะมีการเก็บข้อมูลในลักษณะนี้






โดยเราอาจจะใช้ array 2 มิติในการเก็บข้อมูลโดยให้ มิติแรก เป็นมิติที่ระบุ ลำดับที่ของนักเรียน และให้มิติที่ 2 ระบุ ลำดับที่ของวิชาของแต่ละคน

 เข่น Student[3][4];

 Student[0][1] = 50;

 หมายความว่า คะแนนของนักเรียนคนที่ 1 วิชาที่ 2 เท่ากับ 50

 สาเหตุที่อินเด็กซ์ 0 จะเท่ากับนักเรียนคนที่ 1 เพราะว่า อินเด็กซ์ของ array จะเริ่มที่ 0 และนี่ก็เป็นสาเหตุที่ อินเด็กซ์ 1 เท่ากับวิชาที่ 2

 Student[2][3] = 100;

 หมายความว่า คะแนนของนักเรียนคนที่ 3 วิชาที่ 4 เท่ากับ 100

โปรแกรมที่ 7-5 ตัวอย่างการใช้ array 2 มิติ

Source code

1:#include"iostream.h"

2:#include"conio.h"

3:#include"iomanip.h"

4:int main()

5:{

6: int Student[3][4];

7: int i,j;

8: // input data

9: for(i=0;i<=2;i++)

10: {

11:

12: cout << "Student " << i+1 << endl;

13: for(j=0;j<=3;j++)

14: {

15: cout << "Please enter Subject " << j+1 << ":";

16: cin >> Student[i][j];

17: }

18: cout << "******************************" << endl;

19: }

20:

21: // Output data

22: clrscr();

23: gotoxy(40,2);

24: cout << "Report";

25: cout << endl;



26: cout <<" *****************************************************" << endl;

27: gotoxy(15,4); cout << "Subject 1";

28: gotoxy(30,4); cout << "Subject 2";

29: gotoxy(45,4); cout << "Subject 3";

30: gotoxy(60,4); cout << "Subject 4";

31: cout << endl;

32: for(i=0;i<=2;i++)

33: {

34: cout << "Student" << i;

35:

36: for(j=0;j<=3;j++)

37: {

38:

39: cout << setw(15) << Student[i][j];

40: }

41: cout << endl;

42: }

43:

44: return 0;

45:}

Output

Student 1

Please enter Subject 1:1

Please enter Subject 2:2

Please enter Subject 3:3

Please enter Subject 4:4

******************************

Student 2

Please enter Subject 1:5

Please enter Subject 2:6

Please enter Subject 3:7

Please enter Subject 4:8

******************************

Student 3

Please enter Subject 1:9

Please enter Subject 2:10

Please enter Subject 3:11

Please enter Subject 4:12

หลังจากรับข้อมูลเสร็จแล้วโปรแกรมจะ เคลียร์หน้าจอ และแสดงผล

  Report

 *******************************************************

 Subject 1 Subject 2 Subject 3 Subject 4

Student 1 1   2 3 4

Student 2 5  6 7  8

Student 3 9 10  11 12

อธิบาย Source code

บรรทัดที่ 6: int Student[3][4]; เป็นการประกาศตัวแปร array 2 มิติประเภท int ชื่อว่า Student มิติแรกมีขนาด 3 สมาชิก เราจะใช้มิติแรกเพื่อเป็นการระบุลำดับที่ของนักเรียนแต่ละคน มิติที่ 2 มีจำนวน 4 สมาชิกเราจะใช้มิติที่ 2 ในการเก็บข้อมูลวิชาที่ 1 ถึง 4 แต่ละคน

บรรทัดที่ 9 ถึง บรรทัดที่ 19:เป็นการวน loop for โดยใช้ตัวแปร i เพื่อที่จะวน loop จำนวนนักเรียน 3 คน โดยเราจะใช้ตัวแปร i กับมิติแรกของ array  ในบรรทัดที่ 12 จะมีการแสดงผลข้อความที่หน้าจอเพื่อบอกว่านี่เป็นนักเรียนคนที่เท่าไหร่ สาเหตุที่ต้องแสดง i + 1 เพราะว่า

ตัวแปร i จะเป็น 0 สำหรับนักเรียน คนที่ 1

ตัวแปร i จะเป็น 1 สำหรับนักเรียน คนที่ 2

บรรทัดที่ 13 จะมีการทำงานคือ ทำการวน loop 4 รอบเพื่อรับคะแนนที่ป้อนเข้ามาทางคีย์บอร์ด

บรรทัดที่ 16 Statement นี้จะเป็นการทำการรับข้อมูลจากทางคีย์บอร์ดแล้วก็กำหนดให้ตัวแปร array

ที่ อินเด็กซ์ [i][j]

 ค่าตัวแปร i  ค่าตัวแปร j จะมีความหมายเท่ากับ

 โดยที่รอบแรก  0 0  cin >> Student[0][0]

  รอบที่ 2 0 1 cin >> Student[0][1]

 จนถึงรอบที่ 4 ค่าตัวแปร i จะเป็น 0 ค่าตัวแปร j จะเป็น 3 จะเป็นการกำหนดคะแนนของนักเรียนคนที่ 1 วิชา ที่ 4

บรรทัดที่ 22 ถึง 30: จะเป็นการแสดงส่วนหัวของ Menu

บรรทัดที่ 32 ถึง 42:จะเป็นการแสดงผลข้อมูลของ array โดยการวนloop จะเหมือนกับบรรทัดที่ 9 ถึง 19 แต่เปลี่ยนเป็นการแสดงผลแทน



โปรแกรมที่ 7-6 ตัวอย่างการใช้ array 2 มิติในการคำนวนผลบวกของ matrix

ถ้าหากเรามี Matrix อยู่ 2 Matrix

คือ MatrixA MatrixB เราจะสามารถใช้ตัวแปร array 2 มิติในการหาผลบวกของทั้ง 2 Matrix นี้ได้ โดยใน

ที่นี้จะแสดงตัวอย่างการบวกของ Matrix ที่มีขนาด 2 มิติ

Source code

1:#include"iostream.h"

2:#include"conio.h"

3:int main()

4:{

5: int MatrixA[2][2];

6: int MatrixB[2][2];

7: int i,j;

8: // input MatrixA

9: cout << "MatrixA" << endl;

10: for(i=0;i<=1;i++)

11: {

12: for(j=0;j<=1;j++)

13: {

14: cout << "Please enter number " << i+1 << "," << j+1 << " ";

15: cin >> MatrixA[i][j];

16:

17: }

18: }

19: cout << "MatrixB" << endl;

20: // input MatrixB

21: for(i=0;i<=1;i++)

22: {

23: for(j=0;j<=1;j++)

24: {

25: cout << "Please enter number " << i+1 << "," << j+1 << " ";

27: cin >> MatrixB[i][j];

28:

29: }

30: }

31:

32: clrscr();

33:// Output

34: cout << "MatrixA" << endl;

35: for(i=0;i<=1;i++)

36: {

37: for(j=0;j<=1;j++)

38: {

39: cout << MatrixA[i][j] << " ";

40: }

41: cout << endl;

42: }

43: cout << "MatrixB" << endl;

44: for(i=0;i<=1;i++)

45: {

46: for(j=0;j<=1;j++)

47: {

48: cout << MatrixB[i][j] << " ";

49: }

50: cout << endl;

51: }

52: // Calulate

53:

54: cout << "MatrixA+MatrixB" << endl;

55: for(i=0;i<=1;i++)

56: {

57: for(j=0;j<=1;j++)

58: {

59: cout << MatrixA[i][j] + MatrixB[i][j] << " ";

60: }

61: cout << endl;

62: }

63: return 0;

64:}

Output

MatrixA

Please enter number 1,1 1

Please enter number 1,2 2

Please enter number 2,1 3

Please enter number 2,1 4

MatrixB

Please enter number 1,1 4

Please enter number 1,2 3

Please enter number 2,1 2

Please enter number 2,1 1

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

MatrixA

1 2

3   4

MatrixB

4 3

2  1

MatrixA + MatrixB

5 5

5 5

อธิบาย Source code

บรรทัดที่ 5 และ บรรทัดที่ 6:เป็นการประกาศตัวแปร array 2 ตัวชื่อ MatrixA และ MatrixB โดยตัวแปร 2 ตัวนี้เราจะใช้ในการหาค่าผลรวมของ Matrix

บรรทัดที่ 10 ถึง บรรทัดที่ 18:เป็นการวน loop เพื่อรับค่าของ MatrixA โดยที่เราจะใช้ตัวแปร i และ j ในการวน loop โดยให้ loop j เป็น loop ที่ซ้อนอยู่ใน loop i อีกที

 รอบแรก

 จะเท่ากับ cin >> MatrixA[0][0];

 รอบที่ 2

 จะเท่ากับ cin >> MatrixA[0][1];

 รอบที่ 3

 จะเท่ากับ  cin >> MatrixA[1][0];

 รอบที่ 4

 จะเท่ากับ  cin >> MatrixA[1][1];

การวน loop ทั้งโปรแกรมที่เหลือต่อจากนี้จะเป็นลักษณะนี้

บรรทัดที่ 21 ถึง บรรทัดที่ 30:ก็จะมีการทำงานเหมือนกับบรรทัดที่ 10 ถึง บรรทัดที่ 18 แต่จะเป็น MatrixB

บรรทัดที่ 34 ถึงบรรทัดที่ 42:จะเป็นการแสดงผล MatrixA โดยใช้การวน loop i กับ j

บรรทัดที่ 43 ถึง บรรทัดที่ 51:จะเป็นการแสดงผล MatrixB โดยจะมีการทำงานเหมือนกับบรรทัดที่ 34 ถึง 42

บรรทัดที่ 54 ถึง บรรทัดที่ 62:จะเป็นการแสดงผลที่ได้จากการบวกกันของ ตัวแปร MatrixA และ MatrixB



โปรแกรมที่ 7-7 ตัวอย่างการใช้ array ขนาด 2 มิติ ในการหาค่าผลรวม

โดยที่โจทย์คือให้เขียนโปรแกรมรับข้อมูลทางแป้นพิมพ์เป็นตาราง 2 มิติ ขนาด 3 * 3 ตอนรับให้รับเรียงลงมาทีละบรรทัดก็ได้ แล้วหลังจากที่รับเสร็จ ก็ให้นำมาหาผลรวมในแต่ละด้าน และแสดงผลในลักษณะตาราง



 โปรแกรมนี้ไม่ยาก แต่จะค่อนข้าง ซับซ้อนอยู่พอสมควร ผู้เขียนจึงอยากอธิบายอัลกอริทึ่มแบบง่ายๆก่อน

 1.ให้สร้าง array 2 มิติที่สามารถบรรจุข้อมูลทั้งตารางได้ โดยที่เราควรสร้าง array ให้แต่ละมิติมีจำนวน 4 สมาชิก ถึงแม้ว่าโปรแกรมจะให้รับข้อมูล ขนาด 3 * 3 แต่เราจำเป็นต้องคำนวณผลรวมด้วย เพราะฉะนั้นให้ใช้ arry 2 มิติที่มี 4 สมาชิกในแต่ละมิติในที่นี้สมมุติว่าชื่อ A

 2.ทำการวนloop เพื่อรับข้อมูล โดยที่เราควรใช้ loop for ซ้อนกันในการรับข้อมูล ทั้ง 9 ตัว โดยที่รอบแรกต้องรับข้อมูลอินเด็กซ์ที่  0,0

 รอบที่ 2 คือ 0,1

จนถึงรอบที่ 9 คือ 2,2

ในที่นี้ให้ใช้ต้วแปร i และ j ในการวนloop โดยให้ loop  j ซ้อนอยู่ใน loop i

 3.จากนั้นเราจะได้ข้อมูลตัวที่ 0,0 ถึง 2,2 แล้วดังรูป

 A 0  1 2 3

 0 x xx xxx

 1 x xx xxx

 2 x xx xxx

 3

 ในตอนนี้ที่เราต้องทำคือหาค่าของ A[0][3] A[1][3] A[2][3] โดยเราจะได้จาก การที่ให้เราสร้างตัวแปร temp ขึ้นมา 1 ตัว และให้ทำการวน loop ทั้ง 9 ตัวโดยที่ตัวแปร temp จะทำการเก็บผลรวมในแต่ละรอบ โดยที่เมื่อครบ 3 รอบตัวแปร ก็ให้กำหนดให้ต้วแปร A[i][3] = temp และตัวแปร temp ก็ต้อง clear ค่าให้ เป็น 0

 ค่าตัวแปร A[0][3] = A[0][0] + A[0][1] + A[0][2]

 ค่าตัวแปร A[1][3] = A[1][0] + A[1][1] + A[1][2]

 ค่าตัวแปร A[2][3] = A[2][0] + A[2][1] + A[2][2]



 โดยที่การทำงาน รอบแรก ค่า i จะเป็น 0 และ j จะเป็น 0

 temp += A[0][0];

  รอบที่ 2 ค่า i จะเป็น 0 และ j จะเป็น 1

 temp += A[0][1];

  รอบที่ 3 ค่า i จะเป็น 0 และ j จะเป็น 2

 temp += A[0][2];

 จากนั้น จะเป็นการกำหนดให้ค่า temp ให้กับตัวแปร A[i][3];

 A[i][3] = temp;

 ซึ่งเราก็จะได้ A[0][3] , A[1][3] ,A[2][3] เมื่อโปรแกรมทำการวน loop ทั้ง 9 รอบ

 4.เราได้ทำการคำนวนตัวเลขมา 1 แถวแล้วดังรูป

 A 0  1 2 3

 0 x xx xxx รวม

 1 x xx xxx รวม

 2 x xx xxx รวม

 3

 ตอนนี้สิ่งที่เราต้องหาคือ  A[3][0] ,A[3][1] ,A[3][2] โดยที่การทำงานจะคล้ายกับข้อ 3 เพียงแต่เราต้องเปลี่ยนให้ตัวแปร temp เพิ่มค่า A[j][i] แทน จากเดิมที่เป็น A[i][j]

 ค่าตัวแปร A[3][0] = A[0][0] + A[1][0] + A[2][0]

 ค่าตัวแปร A[3][1] = A[0][1] + A[1][1] + A[2][1]

 ค่าตัวแปร A[3][2] = A[0][2] + A[1][2] + A[2][2]

 โดยที่การทำงาน รอบแรก ค่า i จะเป็น 0 และ j จะเป็น 0

 temp += A[0][0];

  รอบที่ 2 ค่า i จะเป็น 0 และ j จะเป็น 1

 temp += A[1][0];

  รอบที่ 3 ค่า i จะเป็น 0 และ j จะเป็น 2

 temp += A[2][0];

 จากนั้น จะเป็นการกำหนดให้ค่า temp ให้กับตัวแปร A[3][i];

 A[3][i] = temp;

 ซึ่งเราก็จะได้ A[3][0] , A[3][1] ,A[3][2] เมื่อโปรแกรมทำการวน loop ทั้ง 9 รอบ

 5.ตอนนี้เราได้ทำการคำนวนผลรวมมา เกือบทั้งหมดแล้วดังรูป

 A 0  1 2 3

 0 x xx  xxx รวม

 1 x xx xxx รวม

 2 x  xx xxx รวม

 3 รวม รวม รวม

 เหลืออยู่อย่างเดียวที่เรายังไม่ได้ทำคือ หาค่าตัวแปร A[3][3]

ค่าตัวแปร A[3][3] = A[3][0] + A[3][1] + A[3][2] + A[0][3] + A[1][3] + A[2][3]

โดยเราอาจจะแบ่งได้เป็น 2 ส่วนคือ

  ผลรวมของ A[3][0] A[3][1] A[3][2]

และ ผลรวมของ A[0][3] A[1][3] A[2][3]

ในส่วนแรกให้เราเขียน Source code วน loop โดยใช้ตัวแปร i ทำการวน loop 3 รอบ และใช้ตัวแปร temp ในการเก็บค่าผลรวม

 temp += A[3][i];

 ในรอบแรก จะเท่ากับ

 temp += A[3][0];

 ในรอบที่ 2 จะเท่ากับ

 temp += A[3][1];

ในรอบที่ 3 จะเท่ากับ

 temp +=A[3][2];

เท่านี้ตัวแปร temp ก็จะได้ผลรวมของ ส่วนแรกแล้ว

และในส่วนที่ 2 ก็จะคล้ายกับส่วนแรก แต่ให้เราเปลี่ยนเป็น

 temp += A[i][3];

 ในรอบแรก จะเท่ากับ

 temp += A[0][3];

 ในรอบที่ 2 จะเท่ากับ

 temp += A[1][3];

ในรอบที่ 3 จะเท่ากับ

 temp +=A[2][3];

 ตอนนี้ตัวแปร temp ก็จะมีค่าผลรวมของทั้ง 6 ตัวแล้วและ ก็ให้เรากำหนดค่าตัวแปร A[3][3] ให้เท่ากับตัวแปร temp

 6.แสดงผลในลักษณะตารางโดยใช้การวน loop

Source code

1:#include"iostream.h"

2:#include"conio.h"

3:#include"iomanip.h"

4:int main()

5:{

6: int i,j;

7: int A[4][4];

8: int temp=0;

9: for(i=0;i<=2;i++)

10: {

11: for(j=0;j<=2;j++)

12: {

13:  cout << "Please enter number " << i+1 << "," << j+1 << " ";

14:  cin >> A[i][j];

15: }

16: }

17:

18: for(i=0;i<=2;i++)

19: {

20:

21: for(j=0;j<=2;j++)

22: {

23: temp +=A[i][j];

24: }

25: A[i][3] = temp;

26: temp =0;

27: }

28: for(i=0;i<=2;i++)

29: {

30:

31: for(j=0;j<=2;j++)

32: {

33: temp +=A[j][i];

34: }

35: A[3][i] = temp;

36: temp =0;

37: }

38:

39: for(i=0;i<=2;i++)

40: temp += A[3][i];

41:

42:

43: for(i=0;i<=2;i++)

44: temp += A[i][3];

45:

46: A[3][3] = temp;

47:

48: clrscr();

49: for(i=0;i<=3;i++)

50: {

51: for(j=0;j<=3;j++)

52: {

53: cout << setw(3) << A[i][j];

54: }

55: cout << endl;

56: }

57: return 0;

58:}

Output

Please enter number 1,1 7

Please enter number 1,2 8

Please enter number 1,3 9

Please enter number 2,1 4

Please enter number 2,2 5

Please enter number 2,3 6

Please enter number 3,1 1

Please enter number 3,2 2

Please enter number 3,3 3

มาถึงตรงนี้โปรแกรมจะทำการเคลียร์หน้าจอและแสดงผล

 7 8 9 24

 4 5 6 15

 1 2 3 6

12 15 18 90

อธิบาย Source code

บรรทัดที่ 7:เป็นการสร้างต้วแปร array 2 มิติ ชื่อ A โดยแต่ละมิติมีสมาชิก 4 ตัว  Source code ในส่วนนี้ตรงกับ อัลกอริทึ่มในข้อ 1

บรรทัดที่ 9 ถึง บรรทัดที่ 16: เป็นการรับข้อมูลและก็กำหนดให้ตัวแปร array  Source code ในส่วนนี้ตรงกับ อัลกอริทึ่มในข้อ 2

บรรทัดที่ 18 ถึง บรรทัดที่ 27:เป็นการ วน loop เพื่อหาค่าตัวแปร A[0][3],A[1][3],A[2][3] Source code ในส่วนนี้ตรงกับ อัลกอริทึ่มในข้อ 3

บรรทัดที่ 28 ถึง บรรทัดที่ 37: เป็นการ วน loop เพื่อหาค่าตัวแปร A[3][0],A[3][1],A[3][2] Source code ในส่วนนี้ตรงกับ อัลกอริทึ่มในข้อ 4

บรรทัดที่ 39 ถึง บรรทัดที่ 46:เป็นการวน loop เพื่อหาค่าตัวแปร A[3][3] Source code ในส่วนนี้ตรงกับ อัลกอริทึ่มในข้อ 5

บรรทัดที่ 49 ถึง บรรทัดที่ 56:เป็นการวน loop เพื่อแสดงผลในลักษณะ ตาราง Source code ในส่วนนี้ตรงกับ อัลกอริทึ่มในข้อ 6

 การกำหนดค่าเริ่มต้นให้กับ array 2 มิติ

 วิธีการกำหนดค่าเริ่มต้นให้กับ array 2 มิติจะคล้ายกับ การกำหนดค่าเริ่มต้นให้กับ array 1 มิติแต่จะแตกต่างกันคือ ในข้อมูลแต่ละกลุ่มจะต้องแบ่งแยกด้วยเครื่องหมาย { และ } และต้องมีเครื่องหมาย , คั่นเช่น

เช่น int A[5][3] ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

 หรือเราจะเขียนแบบนี้เพื่อให้ดูง่ายก็ได้

int A[5][3] ={{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15}};

 หรือถ้าจะให้ดูง่ายกว่านี้ก็ให้เราเขียนแบบนี้ int A[5][3] ={

 {1,2,3},

 {4,5,6},

 {7,8,9},

 {10,11,12},

 {13,14,15}

  };

 มีความหมายว่า ตัวแปร A เป็นตัวแปร array 2 มิติ ประเภท int  โดยที่จะแบ่งได้เป็น 5 กลุ่ม คือ

 A[0] ถึง A[4] และแต่ละกลุ่มจะมี 3 สมาชิก คือ A[0][0],A[0][1],A[0][2] จนถึง A[4][2]

 ในที่นี้เราจะแบ่งสิ่งที่อยู่ในวงเล็บปีกกาเป็น 5 กลุ่มนั่นคือ มิติแรกของ array และ แบ่งส่วนที่อยู่ในวงเล็บปีกกาแต่ละอัน เป็น มิติที่ 2 ของ array

 แต่ละกลุ่มคือ

กลุ่มที่ 1 {1,2,3}

กลุ่มที่ 2 {4,5,6}

กลุ่มที่ 3 {7,8,9}

กลุ่มที่ 4 {10,11,12},

กลุ่มที่ 5 {13,14,15}

 โดยที่แต่ละกลุ่มจะมีสมาชิกอยู่ 3 ตัวรวมเป็น 15 ตัว จากตัวอย่างนี้

 A[0][0] จะมีค่า 1

 A[0][2] จะมีค่า 3

 A[3][0] จะมีค่า 7

โปรแกรมที่ 7-8 ตัวอย่างการกำหนดค่าเริ่มต้นให้กับ array 2 มิติ

Source code

1:#include"iostream.h"

2:#include"iomanip.h"

3:int main()

4:{

5: int A[5][3] ={

6: {1,2,3},

7: {4,5,6},

8: {7,8,9},

9: {10,11,12},

10: {13,14,15}

11:  };

12: int i,j;

13: for(i=0;i<=4;i++)

14: {

15: for(j=0;j<=2;j++)

16: {

17: cout << " A[" << i << "][" << j << "] =";

18: cout << setw(3) << A[i][j];

19: }

20: cout << endl;

21: }

22: return 0;

23:}

Output

 A[0][0] = 1 A[0][1] = 2 A[0][2] = 3

 A[1][0] = 4 A[1][1] = 5 A[1][2] = 6

 A[2][0] = 7 A[2][1] = 8 A[2][2] = 9

 A[3][0] =10 A[3][1] =11 A[3][2] = 12

 A[4][0] =13 A[4][1] =14 A[4][2] = 15

อธิบาย Source code

บรรทัดที่ 5 ถึง บรรทัดที่ 11:เป็นการประกาศตัวแปร array 2มิติพร้อมทั้งกำหนดค่าเริ่มต้น

บรรทัดที่ 13 ถึง บรรทัดที่ 21:เป็นการวน loop เพื่อแสดงผลค่าของตัวแปร array

array 3 มิติ

 ลักษณะการใช้ array 3 มิติก็จะคล้าย array 2 มิติ

ตัวอย่างโจทย์ที่ใช้ array 3 มิติ

โปรแกรมที่ 7-9 ให้เขียนโปรแกรมที่ทำการรับข้อมูลคะแนนนักเรียน 4 คน โดยแต่ละคน จะเรียน 2 เทอมและในแต่ละเทอม จะมี 2 วิชา ให้รับข้อมูลนักเรียนทีละ 1 คน หลังจากที่รับข้อมูลเสร็จแล้ว 1 คนก็ให้ทำการเคลียร์หน้าจอ และหลังจากที่รับข้อมูลคนสุดท้ายเสร็จแล้ว ก็ให้แสดงผลในลักษณะนี้


ในที่นี้เราสามารถใช้ array 3 มิติได้ โดย มิติแรก สำหรับจำนวนนักเรียน มิติที่ 2 สำหรับเทอม และมิติที่ 3 สำหรับวิชา

Source code

1:#include"iostream.h"

2:#include"iomanip.h"

3:#include"conio.h"

4:int main()

5:{

6: int St[4][2][12];

7: int i,j,k;

8: for(i=0;i<=3;i++)

9: {

10: clrscr();

11: cout << "Student " << i+1 << endl;

12: for(j=0;j<=1;j++)

13: {

14: cout << "Term " << j+1 << endl;

15: for(k=0;k<=1;k++)

16: {

17: cout << " Subject " << k+1 << " ";

18: cin >> St[i][j][k];

19: }

20: }

21: }

22: clrscr();

23: cout << "**********************************************************" << endl;

24: cout << " Number of Student";

25:

26: cout << setw(20) << "Term 1" << setw(20) << "Term 2" << endl;

27:

28: cout << "**********************************************************" << endl;

29: cout << " ";

30: cout << setw(10) << "Subject1" << setw(10) << "Subject2";

31: cout << setw(10) << "Subject1" << setw(10) << "Subject2" << endl;

32: cout << "**********************************************************" << endl;

33: for(i=0;i<=3;i++)

34: {

35: cout << endl;

36: cout << setw(5) << i +1;

37: cout << "  ";

38: for(j=0;j<=1;j++)

39:  for(k=0;k<=1;k++)

40:  cout << setw(10) << St[i][j][k];

41:

42: }

43:

44:

45: return 0;

46:}

Output โปรแกรมนี้จะทำการรับข้อมูลนักเรียน 4 คน

Student 1

 term 1

 Subject 1 1

 Subject 2 2



 term 2

 Subject 1 3

 Subject 2 4

หลังจากนี้โปรแกรมจะทำการ เคลียร์หน้าจอและทำการรับข้อมูลคนต่อไปจนถึงคนที่ 4 เสร็จแล้วโปรแกรมก็ทำการ เคลียร์หน้าจออีกครั้ง จากนั้นก็แสดงผล รูปที่ 7-1



รูปที่ 7-1

อธิบาย Source code

บรรทัดที่ 8 ถึง บรรทัดที่ 21:เป็นการวน loop เพื่อรับข้อมูลคะแนนนักเรียน 4 คนแต่ละคนมี 2 เทอม และแต่ละเทอมมี 2 วิชา โดยที่เราจะใช้ตัวแปร 3 ตัวแปร ในการวน loop คือตัวแปร i,j,k โดยที่

ตัวแปร i จะใช้กับนักเรียนมีการวน loop 4 รอบ

ตัวแปร j จะใช้กับ เทอมมีการวน loop 2 รอบ และตัวแปร j จะเป็น loop ที่ซ้อนอยู่ใน loop i

ตัวแปร k จะใช้กับ วิชา มีการวน loop 2 รอบ และ ตัวแปร k จะเป็น loop ที่ซ้อนอยู่ใน loop j

การวน loop จึงเป็นลักษณะนี้

คนที่(ตัวแปร i loop 4 ครั้ง)

 เทอมที่(ตัวแปร j loop 2 ครั้ง)

 วิชาที่(ตัวแปร k ทำการวน loop 2 ครั้ง)

บรรทัดที่รับข้อมูลคือบรรทัดที่ 18

บรรทัดที่ 23 ถึง บรรทัดที่ 32:สร้างส่วนหัว Menu

บรรทัดที่ 33 ถึง บรรทัดที่ 42:เป็นการวน loop เพื่อแสดงผลข้อมูล โดยจะใช้ 3 ตัวแปร ในการวน loop เหมือนตอนรับข้อมูล



String

 String คือข้อความ หรือ สายของอักขระ ในภาษา C++ ไม่มีตัวแปร ประเภท String แต่จะมีตัวแปรประเภท char ให้ใช้แทน ซึ่งตัวแปร ประเภทchar จะสามารถเก็บอักขระได้ 1 อักขระ เท่านั้นถ้าหากเราอยากให้ตัวแปร char สามารถเก็บข้อความได้เราก็สามารถ ทำให้ตัวแปร char เป็น array ได้ เช่น

 char Name[10];

 มีความหมายว่า

 ตัวแปร ชื่อ Name เป็นตัวแปรประเภท char สามารถเก็บอักขระได้ 9 ตัวอักษรสาเหตุที่เก็บได้ 9 ตัวอักษรก็เพราะว่า ในกรณีที่เราใช้ตัวแปร char เป็น array เพื่อเก็บข้อความ  Compiler จะเหลือเนื้อที่ตำแหน่งสุดท้ายไว้เก็บอักขระ นัล  เพื่อให้รู้ว่าเป็นการจบ String เพราะฉะนั้นรูปแบบการประกาศตัวแปร char ที่เป็น Stringจึงเป็นแบบนี้

 char ชื่อตัวแปร[จำนวนอักษร+1];

 ถ้าเราต้องการประกาศตัวแปร char ที่เป็น String ไว้เก็บข้อมูลชื่อที่มีได้มากสุด 30 ตัวอักษรก็ให้ประกาศดังนี้

 char Name[31];

 หรือถ้าเรา จะประกาศตัวแปร char ที่เป็น String ไว้เก็บข้อมูลชื่อเดือนมีได้มากสุด 20 ตัวอักษรก็ให้ประกาศดังนี้

 char Month[21];



การกำหนดค่าเริ่มต้นให้กับ String

 เนื่องจากตัวแปร String เป็นตัวแปร char ที่เป็น array เพราะฉะนั้นการกำหนดค่าเริ่มต้นให้กับ String ก็เหมือนกับการกำหนดค่าเริ่มต้นให้กับตัวแปร array เช่น

 char Name[10] ={'K','r','i','r','K'};

 ในที่นี้มีความหมายว่าตัวแปร

 Name[0] จะเท่ากับ ‘K’

 Name[1] จะเท่ากับ ‘r’

 Name[2] จะเท่ากับ ‘i’

 จนถึง Name[4] จะเท่ากับ ‘K’ และ Name[5] จะเท่ากับ อักขระนัล Compiler จะกำหนดให้เอง เพื่อให้รู้ว่าเป็นการจบ String

 นอกจากนั้นแล้ว String ยังมีการกำหนดค่าเริ่มต้นอีกแบบหนึ่งซึ่งไม่เหมือนกับตัวแปร array แบบอื่น เราสามารถกำหนดค่าเริ่มต้นของ String ตั้งแต่ตอนประกาศโดยอยู่ในเครื่องหมาย “ และเครื่องหมาย “ ได้ เช่น

 char Name[10] = “Krirk”;

 แบบนี้ก็จะเหมือนแบบที่แล้ว

 ในC++ เราไม่จำเป็นต้องกำหนดจำนวนของตัวอักษรตอนประกาศก็ได้ เพราะCompiler จะจองเนื้อที่ให้เอง เช่น

 char Name[] =”Krirk”;

 แบบนี้ก็จะทำงานได้เหมือนกัน

การรับค่า String

 ในกรณที่เราประกาศตัวแปร array ของ char ขึ้นมา ถ้าหากเราใช้ cin และโอเปอเรเตอร์ >> แล้วต่อท้ายด้วยชื่อตัวแปร เหมือนกับตัวแปร ปกติ เช่น

 char Name[10];

 cin >> Name;

 ถ้าเป็นแบบนี้โปรแกรมจะรับข้อความที่ผู้ใช้ป้อนทาง คีย์บอร์ดและจะนำมาเก็บไว้ในตัวแปร Name โดยเรียงตามลำดับ เช่นถ้าผู้ใช้ป้อนข้อมูล PUNG

 Name[0] จะเท่ากับ ‘P’

 Name[1] จะเท่ากับ ‘U’

 Name[2] จะเท่ากับ ‘N’

 Name[3] จะเท่ากับ ‘G’

 แต่ถ้าหากเราใช้ cin และโอเปอเรเตอร์ >> และต่อท้ายด้วยชื่อตัวแปร โดยมีอินเด็กซ์อยู่ด้วย เช่น

 cin >> Name[4];

 จะมีความหมายว่าข้อมูลที่ผู้ใช้ป้อนมาทางคีย์บอร์ดจะนำไปเก็บในตัวแปร Name[4] ซึ่งตัวแปร Name[4] จะเก็บได้ 1 อักขระเท่านั้น

 String ถ้าจะใช้ร่วมกับ cin ในการรับค่าไม่จำเป็นต้องใส่เครื่องหมาย [] หลังตัวแปรถ้าหากเราไม่ได้กำหนด index

 เช่น cin >> Name[] ; แบบนี้คือตัวอย่างที่ผิด

การแสดงผล String

 การแสดงผล String โดยใช้ cout ก็จะมีหลักการคล้ายการรับค่า String คือ ถ้าเราแสดงผลโดยใช้ชื่อตัวแปร โดยไม่มีอินเด็กซ์ต่อท้าย โปรแกรมก็จะแสดงจำนวนอักขระทั้งหมดใน String ยกเว้นตำแหน่งสุดท้ายคืออักขระนัล

 เช่น

 char Name[10] = “PUNG”;

 cout << Name;

โปรแกรมจะแสดงข้อความ PUNG

 แต่ถ้าเราใช้ cout แสดงผล String โดยมีอินเด็กซ์ต่อท้ายตัวแปร โปรแกรมก็จะแสดงอักขระที่เก็บในอินเด็กซ์นั้น

 เช่น

 char Name[10] = “PUNG”;

 cout << Name[0];

 cout << Name[2];

โปรแกรมจะแสดงข้อความ PN

 นอกจากนั้นแล้วการใช้ cout แสดงผล String ก็จะไม่ต้องใส่เครื่องหมาย [] หลังชื่อตัวแปรถ้าหากเราไม่ได้กำหนด อินเด็กซ์

โปรแกรมที่ 7-10 ตัวอย่างการแสดงผล String

Source code

1:#include"iostream.h"

2:int main()

3:{

4: char Name[10] ="Somsri";

5: cout << Name;

6: cout << endl;

7: cout << Name[0];

8: cout << Name[1];

9:  cout << Name[2];

10:

11: return 0;

12:}

Output

Somsri

Som

อธิบาย Source code

บรรทัดที่ 4: char Name[10] ="Somsri"; มีความหมายว่าเป็นการประกาศตัวแปรชื่อ Name เป็น array ของ char และก็มีการกำหนดค่าเริ่มต้นให้ด้วย โดยในที่นี้

 Name[0] จะเท่ากับ ‘S’

 Name[1] จะเท่ากับ ‘o’

 Name[2] จะเท่ากับ ‘m’

 …

บรรทัดที่ 5: cout << Name; มีความหมายว่าให้แสดงอักขระทั้งหมดตั้งแต่ตำแหน่งที่ 0 จะถึงตำแหน่งสุดท้ายก่อนอักขระ นัล ซึ่งก็คือให้แสดง Name[0] ถึง Name[5] เพราะว่าอักขระ นัล อยู่ที่ Name[6]

บรรทัดที่ 7,8,9:เป็นการใช้ cout แสดงผลตัวแปร Name[0],Name[1],Name[2] ตามลำดับเป็นการแสดงทีละ 1 อักขระเท่านั้น Source code ในส่วนนี้แตกต่างจาก บรรทัดที่ 5 คือ บรรทัดที่ 5 ไม่มีการกำหนด index หลังตัวแปร



โปรแกรมที่ 7-11 ตัวอย่างการรับค่า String

Source code

1:#include"iostream.h"

2:int main()

3:{

4: char Name[10];

5: cout << "What 's your name :";

6: cin >> Name;

7: cout << "Hello ";

8: cout << Name;

9:

10: return 0;

11:}

Output

ข้อมูลที่ใส่คือ Bank

What 's your name :Bank

Hello Bank

อธิบาย Source code

บรรทัดที่ 6:เป็นการใช้ cin ในการรับข้อมูลแล้วนำมาเก็บให้ตัวแปร Name  และ แสดงผลออกมาในบรรทัดที่ 8

การกำหนดค่าให้กับ String

 เราสามารถกำหนดค่าให้กับตัวแปร int โดยใช้เครื่องหมาย = ได้แต่กับ String เราไม่สามารถกำหนดได้เว้นแต่ว่าเราจะกำหนดเป็นค่าเริ่มต้น เราไม่สามารถเขียน Source code แบบนี้ได้

 char Name[10];

 Name = “Krirk”;

 แบบนี้โปรแกรมจะ Compile ไม่ผ่าน ถ้าหากเราอยากกำหนดค่าให้กับ String เราอาจจะใช้วิธีการกำหนดให้ทีละ index ก็ได้ เช่น

 Name[0] = ‘K’;

 Name[1] = ‘r’;

 Name[2] = ‘i’;

 …

 แต่ถ้าเราทำแบบนี้ก็จะค่อนข้างยุ่งยาก C++ จึงได้เตรียม Function ที่ใช้กับ String ให้เพื่อความสะดวกในการเขียนโปรแกรม ถ้าเราจะกำหนดค่าให้กับ String ก็ขอให้ดูในส่วนต่อไปเกี่ยวกับ Function ที่ใช้กับ String

Function ที่ใช้กับ String

 C++ ได้เตรียม Header file ที่รวบรวม Function ที่ใช้กับ String ไว้ชื่อ string.h

ตัวอย่าง Function

strcpy  ใช้สำหรับการกำหนด String

รูปแบบ char* strcpy(char* dest,const char* src);

Function นี้จะมีการทำงานคือ copy ค่าของ src ไปใส่ไว้ใน dest

strlen  ใช้หาความยาวของ String

รูปแบบ size_t strlen(const char*s);

Function นี้จะคืนค่าจำนวนตัวอักษรที่อยู่หน้าเครื่องหมาย นัล ของ String



โปรแกรมที่ 7-12 ตัวอย่างโปรแกรมที่ใช้ Function strcpy และ Function strlen

Source code

1:#include"iostream.h"

2:#include"string.h"

3:int main()

4:{

5: char Name[20];

6:

7: strcpy(Name,"Krirk");

8:

9: cout << Name;

10: cout << endl;

11: cout << strlen(Name);

12:

13: return 0;

14:}

Output

Krirk

5

อธิบาย Source code

บรรทัดที่ 7:เราได้ใช้ Function strcpy ในการกำหนดข้อความ “Krirk” ให้กับ String ชื่อ Name

บรรทดที่ 11: เราได้ใช้ Function strlen ในการหาความกว้างของ String ชื่อ Name ซึ่ง Name นั้นต้อนประกาศเราได้ประกาศ ให้กว้าง 20 ตำแหน่ง แต่ตอนนี้ข้อความที่อยู่ก่อนอักขระนัล มีอยู่ 5 ตำแหน่งเท่านั้น



โปรแกรมที่ 7-13

โจทย์คือให้เขียนโปรแกรมแสดง การกลับหลังไปหน้าของ String โดยให้รับข้อมูลชื่อ และหลังจากนั้นก็แสดงข้อมูลชื่อจากหลังไปหน้าเช่น

 ชื่อ Krirk

 แสดง krirK

 ชื่อ Somchai

 แสดง iahcmoS

 โดยเราอาจจะใช้การวน loop และพิมพ์ออกมาที่ละตำแหน่ง เช่น

 ชื่อ Pung  เก็บไว้ในตัวแปร Name

 โปรแกรมจะเก็บในลักษณะนี้

 P  u n  g

  Name[0]   Name[1]   Name[2]   Name[3]

 สิ่งที่เราต้องแสดงคือ

 g n  u P

  Name[3]   Name[2]   Name[1]   Name[0]

จะเห็นได้ว่าให้เราแสดงจากตำแหน่งสุดท้ายมาที่ตำแหน่งที่ 0 โดยเราจะใช้การวน loop ก็ได้

เราจะหาว่าความกว้างของ String กว้างเท่าไหร่เราสามารถใช้ Function strlen ในการหาได้แต่อย่างในกรณีที่ข้อความ Pung  Function strlen จะคืนค่ากลับคือ 4 แต่ในขณะที่ตำแหน่งสุดท้ายของข้อความคือ อินเด็กซ์ที่ 3 เพราะ array เริ่มจาก 0 เพราะฉะนั้นตอนวน loop เราก็ควรกำหนดค่าเริ่มต้นของตัวแปรที่ใช้ในการวน loop เท่ากับ ความกว้างของ String –1 ไปจนถึง 0

Source code

1:#include"iostream.h"

2:#include"string.h"

3:int main()

4:{

5: char Name[20];

6: int i,Len;

7: cout << "What 's your name :";

8: cin >> Name;

9: cout << "This is reverse:";

10: Len = strlen(Name);

11: for(i=Len-1;i>=0;i--)

12: {

13: cout << Name[i];

14: }

15:

16: return 0;

17:}

Output

ชื่อที่จะใส่ในตอน รันคือ Pung

What 's your name :Pung

This is reverse:gnuP

อธิบาย Source code

บรรทัดที่ 8:เป็นการรับค่า String Name ทางคีย์บอร์ด

บรรทัดที่ 10:เป็นการใช้ ตัวแปร Len เป็นประเภท int ในการเก็บความกว้างของตัวแปร Name

บรรทัดที่ 11 ถึง บรรทัดที่ 14:เป็นการวนloop for โดยใช้ตัวแปร i โดยค่าเริ่มต้นของตัวแปร i จะเท่ากับความกว้างของ Name – 1 จากตัวอย่างการรันโปรแกรมตัวแปร i จะมีค่าเริ่มต้นคือ 3 และจะทำไปเรื่อยๆตราบเท่าที่ตัวแปร i ยังมากกว่าหรือเท่ากับ 0 และในทุกๆรอบค่าของตัวแปร i จะลดลงทีละ 1

 บรรทัดที่ 13:เป็นการสั่งให้แสดงผลตัวแปร Name อินเด็กซ์ i ในที่นี้

รอบแรกจะมีความหมายเท่ากับ cout << Name[3];

 ซึ่งจะแสดงตัว ‘g’

รอบ 2 จะมีความหมายเท่ากับ cout << Name[2];

 ซึ่งจะแสดงตัว ‘n’



ไปจนถึงรอบที่ 4 ตัวแปร i จะเป็น 0 และโปรแกรมจะแสดงตัว ‘P’

การเรียงลำดับ

 การเรียงลำดับเป็นเรื่องที่สำคัญมาก เนื่องจากข้อมูลที่อยู่ในเครื่องคอมพิวเตอร์เราควรที่จะมีการเรียงลำดับเพื่อที่จะให้ผู้ใช้ดูข้อมูลได้ง่าย และอาจจะทำให้ค้นหาข้อมูลเร็วขึ้น ตัวอย่างการเรียงลำดับข้อมูลเช่น

เรามีจำนวนอยู่ 6 จำนวนคือ

5 9 23 18 3 6

ถ้าจะทำให้มีการเรียงลำดับข้อมูลเราก็ต้องเลือกว่าจะให้เรียงจากมากไปน้อยหรือน้อยไปมาก

ถ้าเราเรียงจากมากไปน้อยก็จะได้

23 18 9 6 5 3

ถ้าเราเรียงจากน้อยไปมากก็จะได้

3 5 6 9 18 23

 สาเหตุที่กล่าวถึงเรื่องการเรียงลำดับในบทนี้ก็เพราะว่าส่วนใหญ่เราจะนิยมนำตัวแปร array มาใช้ในการเรียงลำดับและใช้ในการแสดงผล

 การสลับค่าของข้อมูล

 ถ้าเราจะเขียนโปรแกรมเพื่อเรียงลำดับข้อมูลเราก็ควรที่จะลองเขียนโปรแกรมเพื่อสลับข้อมูลก่อนเช่น

ถ้าหากเรามีตัวแปร 2 ตัวชื่อ A กับ B

 A = 10;

 B = 19;

 ที่เราต้องการคือ ให้ A เท่ากับ 19 และ B = 10 ซึ่งเราจะต้องทำให้ A เท่ากับ B แล้ว B เท่ากับ A

แต่เราจะเขียน ในลักษณะนี้ก็ไม่ได้

A = B;

B = A;

ถ้าเราเขียนแบบนี้ทั้ง 2 ตัวจะเป็น 19 ทั้งคู่เนื่องจากเมื่อเรากำหนดให้ A เท่ากับ B แล้ว A ก็จะเท่ากับ 19 และเมื่อเรากำหนดให้ B เท่ากับ A ค่า B ก็จะได้ 19 เท่าเดิม

ในที่นี้เราควรที่จะสร้างตัวแปรที่ทำหน้าที่พักข้อมูลชั่วคราวขึ้นมาก่อน แล้วก็ให้ตัวแปรนั้นเก็บค่าของ A

ก่อน เช่น

int A = 10,B = 19,temp;

temp = A;

A = B;

B = temp;

นี่คือวิธีการสลับค่าขั้นพื้นฐานที่ ใครๆก็นิยมใช้กัน

การหาค่ามากสุดหรือค่าน้อยสุด

 ในการหาค่ามากที่สุดหรือค่าน้อยที่สุด ในกรณีที่จะหาค่ามากที่สุดเรามักจะใช้วิธีการวน loop ตั้งแต่ตำแหน่งแรกของข้อมูลจนถึงตำแหน่งสุดท้าย และทำการเช็คในแต่ละรอบว่า ค่าของข้อมูลมากกว่าค่าของตัวแปร Max ที่เราเตรียมไว้ก็ให้เรากำหนดค่าของตัวแปร Max ให้เท่ากับข้อมูลใน รอบนั้นและก็วน loop ต่อไปเรื่อยๆจนถึงตัวสุดท้าย

 เช่น

 เราต้องสร้างตัวแปร Max ขึ้นมาก่อนและอาจจะกำหนดให้เป็น 0 ก็ได้

ข้อมูลมี 23 65 96 33

 รอบแรก 2 ค่าของข้อมูลคือ 3 ตอนนี้ Max เท่ากับ 0

 เช็คเงื่อนไขว่า มากกว่า Max หรือเปล่า ซึ่งคำตอบที่ได้คือไม่จริงก็ทำรอบต่อไป

 รอบที่ 2 ค่าของข้อมูลคือ 65 ตอนนี้ Max เท่ากับ 0

 เช็คเงื่อนไขว่า มากกว่า Max หรือเปล่า ซึ่งคำตอบที่ได้จริงก็ทำการกำหนดค่า Max ให้เท่ากับ 65

 รอบที่ 3 ค่าของข้อมูลคือ 96 ตอนนี้ Max เท่ากับ 65

 เช็คเงื่อนไขว่า มากกว่า Max หรือเปล่า ซึ่งคำตอบที่ได้จริงก็ทำการกำหนดค่า Max ให้เท่ากับ 96

 รอบที่ 4 ค่าของข้อมูลคือ 33 ตอนนี้ Max เท่ากับ 96

 เช็คเงื่อนไขว่า มากกว่า Max หรือเปล่า ซึ่งคำตอบที่ได้คือไม่จริงก็ทำรอบต่อไปเนื่องจากนี่เป็นข้อมูลชุดสุดท้ายแล้ว จึงไม่ต้องทำต่อ ค่าของ Max จึงได้เท่ากับ 96

โปรแกรมที่ 7-14 ตัวอย่างการหาค่ามากที่สุด

Source code

1:#include"iostream.h"

2:int main()

3:{

4: int Num[10];

5: int Max;

6: int i;

7:

8: Num[0]=5;

9: Num[1]=11;

10: Num[2]=55;

11: Num[3]=20;

12: Num[4]=40;

13: Num[5]=3;

14: Num[6]=2;

15: Num[7]=99;

16: Num[8]=65;

17: Num[9]=32;

18: Max = Num[0];

19: for(i=1;i<=9;i++)

20: {

21: if (Num[i] > Max)

22: Max = Num[i];

23: }

24: cout << Max;

25:

26:

27:

28: return 0;

29:}

Output

99

อธิบาย Source code

 โปรแกรมนี้ได้มีการหาค่ามากที่สุดของชุดข้อมูลหนึ่งชุด ซึ่งอัลกอริทึ่มของการหาค่ามากที่สุดได้อธิบายไปแล้ว

 การเรียงลำดับข้อมูลด้วยวิธี Selection Sort

 เป็นการเรียงลำดับข้อมูลที่มีอัลกอริทึ่มค่อนข้างง่าย วิธีการก็คือ

 ถ้าหากเราต้องการเรียงจากน้อยไปมาก

 1.ทำการวน loop เพื่อที่จะเรียงลำดับโดยจำนวนรอบของการวน loop คือ จำนวนทั้งหมด –1

 2.ในแต่ละรอบของการวน loop ให้ทำการหาค่าที่น้อยที่สุดตั้งแต่ตำแหน่งของรอบจนถึงตำแหน่งสุดท้าย แล้วให้ทำการสลับตำแหน่งข้อมูลของรอบกับข้อมูลที่น้อยที่สุด

 เช่น ถ้าข้อมูลคือ

Num[0]=5; Num[1]=11;  Num[2]=55; Num[3]=20; Num[4]=40; Num[5]=3

Num[6]=2; Num[7]=99; Num[8]=65; Num[9]=32;

 รอบที่ 0 หมายเลขรอบคือ 0

 ให้ทำการหาค่าที่น้อยที่สุดตั้งแต่ Num[0] ถึง Num[9] ซึ่งค่าที่น้อยที่สุดคือ Num[6] เท่ากับ 2

 จากนั้นก็ทำการสลับค่าระหว่าง Num[0] กับ Num[6]

 ตอนนี้ข้อมูลก็จะเป็นแบบนี้

Num[0]=2 Num[1]=11 Num[2]=55 Num[3]=20 Num[4]=40 Num[5]=3

Num[6]=5 Num[7]=99 Num[8]=65 Num[9]=32

 รอบ 1หมายเลขรอบคือ 1

 ให้ทำการหาค่าที่น้อยที่สุดตั้งแต่ Num[1] ถึง Num[9] ซึ่งค่าที่น้อยที่สุดคือ Num[5] เท่ากับ 3

 จากนั้นก็ทำการสลับค่าระหว่าง Num[1] กับ Num[5]

 ตอนนี้ข้อมูลก็จะเป็นแบบนี้

Num[0]=2 Num[1]=3 Num[2]=55 Num[3]=20 Num[4]=40 Num[5]=11

Num[6]=5 Num[7]=99 Num[8]=65 Num[9]=32

 รอบ 2 หมายเลขรอบคือ 2

 ให้ทำการหาค่าที่น้อยที่สุดตั้งแต่ Num[2] ถึง Num[9] ซึ่งค่าที่น้อยที่สุดคือ Num[6] เท่ากับ 5

 จากนั้นก็ทำการสลับค่าระหว่าง Num[2] กับ Num[6]

 ตอนนี้ข้อมูลก็จะเป็นแบบนี้

Num[0]=2 Num[1]=3 Num[2]=5 Num[3]=20 Num[4]=40 Num[5]=11

Num[6]=55 Num[7]=99 Num[8]=65 Num[9]=32

 รอบ 3หมายเลขรอบคือ 3

 ให้ทำการหาค่าที่น้อยที่สุดตั้งแต่ Num[3] ถึง Num[9] ซึ่งค่าที่น้อยที่สุดคือ Num[5] เท่ากับ 11

 จากนั้นก็ทำการสลับค่าระหว่าง Num[3] กับ Num[5]

 ตอนนี้ข้อมูลก็จะเป็นแบบนี้

Num[0]=2 Num[1]=3 Num[2]=5 Num[3]=11 Num[4]=40 Num[5]=20

Num[6]=55 Num[7]=99 Num[8]=65 Num[9]=32

 จะเห็นได้ว่าในแต่ละรอบของการทำงานเราก็จะเรียงลำดับข้อมูลไปเรื่อยๆ จนถึงรอบสุดท้ายข้อมูลก็จะถูกเรียงลำดับจนหมด

โปรแกรมที่ 17-15 ตัวอย่างการใช้ Selection Sort

Source code

1:#include"iostream.h"

2:int main()

3:{

4: int Num[10];

5: int i;

6: int j;

7: int temp;

8: int Min=0;

9: int tempPosition = 0;

10: // Input

11: for(i=0;i<=9;i++)

12: {

13:   cout << "Please enter Num " << i << " :";

14:  cin >> Num[i];

15: }

16:

17: // Selection Sort

18: for(i=0;i<=8;i++)

19: {

20: Min = Num[i];

21: for(j=i;j<=9;j++)

22: {

23:

24: if(Num[j] < Min)

25: {

26: Min = Num[j];

27: tempPosition = j;

28:

29: }

30: }

31: temp = Num[i];

32: Num[i] = Num[tempPosition];

33: Num[tempPosition] = temp;

34: }

35:

36:

37: // Display

38: for(i=0;i<=9;i++)

39: {

40: cout << Num[i] << endl;

41: }

42:

43: return 0;

44:}

Output

Please enter Num 0:1

Please enter Num 1:9

Please enter Num 2:6

Please enter Num 3:7

Please enter Num 4:5

Please enter Num 5:26

Please enter Num 6:33

Please enter Num 7:18

Please enter Num 8:55

Please enter Num 9:43

1

5

9

6

7

18

26

33

44

55

อธิบาย Source code

 โปรแกรมนี้ได้มีการใช้ Selection Sort ซึ่งได้อธิบาย อัลกอริทึ่มไปก่อนหน้านี้แล้ว

บรรทัดที่ 11 ถึง บรรทัดที่ 15:เป็นการรับข้อมูล

บรรทัดที่ 18 ถึง บรรทัดที่ 34:เป็นการวน loop เพื่อที่จะทำ Selection Sort

ซึ่งจะแบ่งการทำงานภายในได้เป็น 2 ส่วน

1.บรรทัดที่ 21 ถึง บรรทัดที่ 30 เป็นการวน loop เพื่อหาค่าที่น้อยที่สุด

2.บรรทัดที่ 31 ถึง บรรทัดที่ 33 เป็นการสลับตำแหน่งของข้อมูล

การเรียงลำดับข้อมูลด้วยวิธี Bubble Sort

เป็นวิธีการเรียงลำดับที่จะทำการเปรียบเทียบข้อมูลที่อยู่ในตำแหน่งที่ติดกัน ถ้าข้อมูลไม่อยู่ในตำแหน่งที่ถูกต้องก็จะทำการสลับตำแหน่งของข้อมูล

การเปรียบเทียบจะต้องเปรียบเทียบตั้งแต่ตำแหน่งแรกจนถึง ตำแหน่งสุดท้าย-1 ถ้ามีข้อมูล A[0] ถึง A[9] ก็จะต้องเปรียบเทียบตั้งแต่ A[0] ถึง A[8]

การเปรียบเทียบจะเริ่มที่ A[0] เปรียบเทียบกับ A[1] จากนั้นจึง

เปรียบเทียบ A[1] กับ A[2]

เปรียบเทียบ A[2] กับ A[3]

 จะเห็นได้ว่าถึงแม้ A[1] จะเคยถูกเปรียบเทียบกับ A[0] แล้วก็ตาม แต่เมื่อถึงคราว A[1] ก็ต้องนำ A[1] ไปเปรียบเทียบกับ A[2] อยู่ดี

เช่น ถ้าข้อมูลคือ

Num[0]=5; Num[1]=11;  Num[2]=55; Num[3]=20; Num[4]=40; Num[5]=3

Num[6]=2; Num[7]=99;  Num[8]=65; Num[9]=32;

เริ่มต้น   แสดงวิธีการทำงานอขงรอบที่ 1

Num[0] 5 5 กับ 11 ไม่ต้องสลับที่

Num[1] 11 11 กับ 55 ไม่ต้องสลับที่

Num[2] 55 55 กับ 20 ต้องสลับที่ ตอนนี้ Num[3] จะเท่ากับ 55

Num[3] 20 55 กับ 40 ต้องสลับที่ ตอนนี้ Num[4] จะเท่ากับ 55

Num[4] 40 55 กับ 3 ต้องสลับที่ ตอนนี้ Num[5] จะเท่ากับ 55

Num[5] 3 55 กับ 2 ต้องสลับที่ ตอนนี้ Num[6] จะเท่ากับ 55

Num[6] 2 55 กับ 99 ไม่ต้องสลับที่

Num[7] 99 99 กับ 65 ต้องสลับที่ ตอนนี้ Num[8] จะเท่ากับ 99

Num[8] 65 99 กับ 32 ไม่ต้องสลับที่

Num[9] 32

รอบที่ 1 รอบที่2 รอบที่3 รอบที่4 รอบที่5 รอบที่6

Num[0] 5 5 5 5 3 2

Num[1] 11 11 11 3 2 3

Num[2] 20 20 3 2 5 5

Num[3] 40 3 2 11 11 11

Num[4] 3 2 20 20 20 20

Num[5] 2 40 40 32 32 32

Num[6]  55 55 32 40 40 40

Num[7] 65 32 55 55 55 55

Num[8] 32 65 65 65 65 65

Num[9] 99 99 99 99 99 99

โปรแกรมที่ 7-16 ตัวอย่างการใช้ Bubble Sort เรียงข้อมูลจากมากไปน้อย

Source code

1:#include"iostream.h"

2:int main()

3:{

4: int Num[10];

5: int i;

6: int j;

7: int temp;

8: // Input

9: for(i=0;i<=9;i++)

10: {

11: cout << "Please enter Num " << i << " :";

12: cin >> Num[i];

13: }

14:

15: // bubble Sort

16: for(i=0;i<=8;i++)

17: {

18: for(j=0;j<=8;j++)

19: {

20: if(Num[j] < Num[j+1])

21: {

22: temp = Num[j];

23: Num[j] = Num[j+1];

24: Num[j+1] = temp;

25: }

26: }

27: }

28:

29: // Display

30: for(i=0;i<=9;i++)

31: {

32: cout << Num[i] << endl;

33: }

34:

35: return 0;

36:}

Output

Please enter Num 0:1

Please enter Num 1:9

Please enter Num 2:6

Please enter Num 3:7

Please enter Num 4:5

Please enter Num 5:26

Please enter Num 6:33

Please enter Num 7:18

Please enter Num 8:55

Please enter Num 9:43

55

43

33

26

18

9

7

6

5

1

อธิบาย Source code

 โปรแกรมนี้ได้มีการใช้ Bubble Sort ซึ่งได้อธิบาย อัลกอริทึ่มไว้ก่อนหน้านี้แล้ว

บรรทัดที่ 16 ถึง บรรทัดที่ 27:เป็นการวน loop เพื่อใช้ Bubble Sort โดยใช้ตัวแปร i เป็นจำนวนรอบของการทำงาน โดยการทำงานภายในคือ บรรทัดที่ 18 ถึง บรรทัดที่ 25 เป็นการวน loop เพื่อเปรียบเทียงสมาชิกทุกตัวกับสมาชิกตัวถัดไป เพื่อใช้ในการเปรียบเทียบ ถ้าหากสมาชิกตัวถัดไปมากกว่าจริงก็ให้ทำการสลับที่

 การเรียงลำดับข้อมูลด้วยวิธี Insert Sort

 เป็นการเรียงลำดับข้อมูลแบบที่จะทำการแทรกข้อมูลโดยมีอัลกอริทึ่มคือ

 1.อ่านข้อมูลเข้ามาทีละ 1 ตัวแล้วก็ให้หาตำแหน่งที่ข้อมูลควรอยู่

 2.ตำแหน่งของข้อมูลไม่ได้อยู่ลำดับสุดท้ายก็ให้ทำการย้ายข้อมูลชุดที่อยู่ตรงตำแหน่งของข้อมูลจนถึงชุดสุดท้ายไปอีก 1 ตำแหน่ง

 3.ทำการกำหนดข้อมูลให้กับตำแหน่งของข้อมูล

 เช่นข้อมูลคือ

Input[0]=5; Input[1]=11;  Input[2]=55; Input[3]=20; Input[4]=40; Input[5]=3

Input[6]=2; Input[7]=99;  Input[8]=65; Input[9]=32;

 ในที่นี้ได้ใช้ Inputในการเก็บข้อมูลแทน Num เพราะ Num จะใช้ในการเรียงข้อมูลอีกที

 ข้อมูลตัวที่ 1 ข้อมูลตัวที่ 2 ข้อมูลตัวที่ 3 ข้อมูลตัวที่ 4

Num[0]   5   5  5 5

Num[1]    11 11 11

Num[2]   55 20

Num[3]    55

รอบที่ 0 ข้อมูลตัวที่ 0 คือ 5  ให้เราทำการวน loop ดูข้อมูลทั้งหมดว่าใน Num มีจำนวนที่มากกว่า 5 รึเปล่าซึ่งปรากฎว่าไม่มีก็ให้ Num[รอบที่] เท่ากับ 5 ในที่นี้คือ Num[0]

รอบที่ 1 ข้อมูลตัวที่ 1 คือ 11 ให้เราทำการวน loop ดูข้อมูลทั้งหมดว่าใน Num มีจำนวนที่มากกว่า 11 รึเปล่าซึ่งปรากฎว่าไม่มีก็ให้ Num[รอบที่] เท่ากับ 11 ในที่นี้คือ Num[1]

รอบที่ 2 ข้อมูลตัวที่ 2 คือ 55 ให้เราทำการวน loop ดูข้อมูลทั้งหมดว่าใน Num มีจำนวนที่มากกว่า 55  รึเปล่า

ซึ่งปรากฎว่าไม่มีก็ให้ Num[รอบที่] เท่ากับ 55  ในที่นี้คือ Num[2]

รอบที่ 3 ข้อมูลตัวที่ 3 คือ 20 ให้เราทำการวน loop ดูข้อมูลทั้งหมดว่าใน Num มีจำนวนที่มากกว่า 20 รึเปล่า

ซึ่งปรากฎว่ามีนั่นคือ ข้อมูลตัวที่ 2 นั่นก็คือ 55 ให้เราทำการขยับข้อมูลตั้งแต่ตัวที่ 2 ไปไว้ที่ตัวที่ 2+1 นั่นก็คือ

ให้ Num[3] เท่ากับ 55 เนื่องจากในตอนนี้เรามีข้อมูลถึงแค่ตัวที่ 3 เท่านั้นจึงไม่ต้องขยับที่เหลือแล้ว แล้วจึงกำหนดให้ Num[2] เท่ากับ 20

 จนถึงในรอบสุดท้ายข้อมูลจะถูกเรียงลำดับจนหมด

โปรแกรมที่ 7-17 ตัวอย่างการใช้ Insert Sort ในการเรียงลำดับข้อมูล

Source code

1:#include"iostream.h"

2:#include"conio.h"

3:int main()

4:{

5: int Num[10],Input[10];

6: int i=0;

7: int j=0;

8: int k=0;

9: int temp;

10: int tempPosition = 0;

11: // Input

12: Input[0]=5;

13: Input[1]=11;

14: Input[2]=55;

15: Input[3]=20;

16: Input[4]=40;

17: Input[5]=3;

18: Input[6]=2;

19: Input[7]=99;

20: Input[8]=65;

21: Input[9]=32;

22:

23: // Prepare Data

24: for(i=0;i<=9;i++)

25: {

26: Num[i] = 0;

27: }

28:

29: // Input

30: for(i=0;i<=9;i++)

31: {

32: cout << "Please enter Input " << i << " :";

33: cin >> Input[i];

34: }

35:

36: // Insert Sort

37: for(i=0;i<=9;++i)

38: {

39:

40: tempPosition = i;

41: for(j=0;j<i;++j)

42: {

43: if(Num[j] > Input[i])

44: {

45: tempPosition = j;

46: break;

47: }

48: }

49:

50:

51: for(k=i;k>tempPosition;--k)

52: {

53: Num[k] = Num[k-1];

54: }

55:

56:

57: Num[tempPosition] = Input[i];

58:

59:

60: }

61:

62:

63:

64:

65: // Display

66: for(i=0;i<=9;i++)

67: {

68: cout << Num[i] << endl;

69: }

70: getch();

71: return 0;

72:}

Output

Please enter Input 0:1

Please enter Input 1:6

Please enter Input 2:9

Please enter Input 3:2

Please enter Input 4:5

Please enter Input 5:4

Please enter Input 6:3

Please enter Input 7:90

Please enter Input 8:3

Please enter Input 9:7

1

2

3

3

4

5

6

7

9

90

อธิบาย Source code

บรรทัดที่ 37 ถึง บรรทัดที่ 60:เป็นการใช้ Insert Sort ซึ่งมีการทำงานภายในคือ

 เราจะใช้ตัวแปร i ในการวน loop สำหรับในการที่จะนำข้อมูลมาเรียงทีละ 1 ตัว

ตัวแปร tempPosition เป็นตัวแปรที่จะเอาไว้เก็บตำแหน่งที่ข้อมูลควรอยู่ในตอนแรกกำนหนดให้เท่ากับ i

 บรรทัดที่ 34 ถึง 48:เป็นการใช้ loop for ที่ใช้ตัวแปร j หาค่าว่าในจำนวนทั้งหมดที่มีอยู่มีจำนวนไหนมากกว่าตัวที่นำเข้ามาใหม่หรือเปล่า ถ้ามีก็กำหนดให้ tempPosition เท่ากับ j

 บรรทัดที่ 51 ถึง 54:เป็นการย้ายจำนวนตั้งแต่จำนวนสุดท้ายจนถึงจำนวนที่เท่ากับ tempPosition ไปอีก 1 ตำแหน่ง

 บรรทัดที่ 57:เป็นการกำหนดที่อยู่ของข้อมูลให้กับข้อมูลที่นำเข้า





 นอกจากนี้แล้วการเรียงลำดับยังมีอีกหลายอัลกอริทึมเช่น Quick Sort ,Shell Sort , Heap Sort ซึ่งถ้าหากผู้อ่านสนใจขอให้ศึกษาเรื่องนี้ได้ในตำราเกี่ยวกับ Data Structru