สารบัญ
หน้าที่ 6 - อาเรย์ (Arrays)
5. ตารางอาเรย์ (Arrays)
ตารางอาเรย์ เป็นตัวแปรสำหรับรวบรวมข้อมูลชนิดเดียวกัน ลงในตัวช่องรับข้อมูลที่ติดกันตั้งแต่ 2 ช่องขึ้นไป ซึ่งข้อมูลในตารางอาเรย์ดังกล่าวสามารถเข้าถึงได้ พร้อมกันหลายช่อง โดยใช้ตัวแปรตัวเดียวในการเข้าถึง
การสร้างตารางอาเรย์ จะต้องมีการประกาศค่าตั้งต้นภายในตารางอาเรย์ที่จะใช้ดังต่อไปนี้
Type ArrayName[size]; // Format of Blank array
Type ArrayNameInitialized[size] = {
}; // Format of initialized array
int a[5] = {0,0,0,0,0};
double air[5];
char vowel[] = {A,E,I,O,U};
ในกรณีใช้ตัวแปรดัชนี้ชี้ตำแหน่งข้อมูลในตาราง ค่าของตัวแปรที่จะชี้จะต้องอยู่ในช่วงระหว่าง 0 กับ N-1 โดยที่ N คือขนาดตารางอาเรย์ ดังตัวอย่างที่แสดงในภาพที่ 5.1
ถ้าค่าดัชนีน้อยกว่า 0 หรือมากกว่า N 1 แล้วโปรแกรมจะทำงานผิดพลาดหรือหยุดทำงาน
การแยกแยะช่องตาราง (Array subscription) ทำได้โดย การใช้ชื่อตัวแปรอาเรย์ ตามด้วย วงเล็บเหลี่ยมที่มีค่าดัชนี (เช่น Data[i], i = 0, 1, 2,
N-1 )
การประกาศค่าตั้งต้นให้ตัวแปรอาเรย์สามารถทำได้โดยใช้เครื่องหมายปีกกา ( { } ) หรือจะยกประกาศค่าตั้งต้นที่ละช่องตารางก็ได้ตามความต้องการของผู้ใช้ โดยส่วนที่ ไม่ได้ใส่ค่าตั้งต้นจะมีค่าเป็นศูนย์ (กรณีตารางอาเรย์แบบ int, double, หรือ float) หรือเป็นค่าว่าง ดังตัวอย่างต่อไปนี้
int a[4] = {9, 8, 7}; ซึ่งจะได้ค่าออกมาตรงกัย a[0] = 9; a[1] = 8; a[2] = 7; และ a[3] = 0;
กรณีที่ตารางมีหลายมิติ จะมีการเรียกใช้ตามรูปแบบตารางมิติเดียวต่อไปนี้
ตาราง 2 มิติ: type arrayname2D[size1][size2];
ตาราง 3 มิติ: type arrayname3D[size01][size02][size03];
การค้นข้อมูลในตารางอาเรย์นั้น สามารถเข้าถึงได้อย่างรวดเร็วไม่ว่าตารางจะใหญ่เพียงไหน เช่น
const int SIZE = 100; // #define SIZE 100 for C
float A[SIZE],B[SIZE],C[SIZE];
for(i = 0; i <= SIZE-1; i++)
{
C[i] = B[i] A[i];
}
ในการใช้ตัวแปรอาเรย์เป็นอาร์กิวเมนต์ให้ฟังก์ชันนั้น แบ่งได้หลายกรณีได้แก่
1) กรณีที่จะเอาข้อมูลเฉพาะช่องตาราง จะมีการส่งผ่านข้อมูลในตารางอาเรย์ดังนี้
void main()
{
float X[10], X[0] = 123.23, X[1] = 24.56, X[2] = 45.67;
float total = sum_element(X[0],X[1],X[2]);
}
float sum_element(float A, float B, float C)
{
return (A+B+C);
}
2) กรณีที่ใช้ข้อมูลทั้งตารางอาเรย์ การส่งผ่านข้อมูลในตารางลงในฟังก์ชันจะเป็นดังนี้
void main()
{
float X[10], X[0] = 123.23, X[1] = 24.56, X[2] = 45.67;
float total = sum_element_array(X)
}
float sum_element_array(float A[])
{
int index; float Sum = 0;
for(index =0; index <= 3-1; index++)
{
Sum +=A[index];
}
return Sum;
}
3) กรณีที่ใช้ข้อมูลทั้งตารางเพื่อให้ได้ผลลัพธ์ออกมาเป็นตารางอาเรย์ให้ทำดังนี้
void add_arrays(float ar1[], // input array 1
float ar2[], // input array 2
float ar_sum[], // Output array
int N) // Array Size
{
for(int i = 0; i <= N-1; i++)
{
ar_sum[i] = ar1[i] + ar[2];
}
}
การค้นหาข้อมูลในตาราง (Array searching)
ในการค้นข้อมูลนั้นมักใช้ linear search หาข้อมูลในตารางตามที่ต้องการ โดยกำหนดเงื่อนไขว่า
1) ถ้าหาข้อมูลพบ ให้แสดงดัชนีของค่าที่ค้นพบ ก่อนออกจากวงรอบการค้นหา
2) ถ้าหาข้อมูลไม่พบ ให้ออกจากโปรแกรมแล้วคืนค่า ที่อยู่นอก ขอบเขต 0 N-1, N คือ ขนาดตารางอาเรย์ (โดยมากให้คืนค่า -1)
การสับเรียงข้อมูลในตาราง (Array Sorting)
การสับเรียงข้อมูลมีหลายวิธี ซึ่งจะกล่าวถึงในที่นี้พอสังเขปดังนี้
1) Bubble Sort ซึ่งเขียนใช้งานง่ายแต่ สับตำแหน่งข้อมูลได้ผลช้าที่สุด ซึ่งมีกลไกดังนี้
void BubbleSort(float list[], int N)
{
int i,j;
float temp;
for(i = N-1; i>=0; i--)
{
for(j = 1; j <=i; j++)
{
if(list[j-1] > list[j])
{
temp = list[j-1];
list[j-1] = list[j];
list[j] = temp;
}
}
}
}
2) Selection Sort ซึ่งจะเลือกค่าที่ยังไม่ได้สับเปลี่ยนที่น้อยที่สุดเป็นหลัก ในการสลับที่
void SelectSort(float list[], int N)
{
int i,j, MinIndex;
float temp;
for(i = 0; i<=N-2; i--)
{
MinIndex = I;
for(j = i+1; j <=N-1; j++)
{
if(list[j] < list[MinIndex])
{
minIndex = j
}
temp = list[j-1];
list[j-1] = list[j];
list[j] = temp;
}
}
}
3) Insertion Sort ซึ่งจะเติมข้อมูลลงในตำแหน่งที่เหมาะสมในขั้นสุดท้าย ซึ่งจะต้องมีตัวแปรอาเรย์ อย่างน้อย 2 ตัว โดยที่อาเรย์ตัวแรกทำหน้าที่ เป็น List เก็บข้อมูล ต้นฉบับ (Source List) และอาเรย์ตัวหลังทำหน้าที่รับข้อมูลที่ผ่านการสับตำแหน่งแล้ว (Sorted List) ในการสับที่กันนั้น จะให้ข้อมูลปัจจุบันเคลื่อนผ่านข้อมูลที่ผ่านการสับตำแหน่งแล้ว จากนั้นจึงลงมือสลับข้อมูลอีกครั้งจนกว่าข้อมูลทั้งหมดจะเข้าที่
void insert_sort(float data[], int Size)
{
int i,j;
float DatElement;
for(i=1;i<=Size-1;i++)
{
DatElement = data[i];
j = i;
while((j >= 1) && data[j-1] >DatElement)
{
data[j-1] = data[j];
j = j-1;
}
data[j] = DatElement;
}
}
*หมายเหตุ
งานเขียนชิ้นนี้ ได้รับการคุ้มครองสิทธิตามพระราชบัญญัติคุ้มครองสิทธิทางปัญญา โดยลิขสิทธิเป็นของผู้เขียน ที่ให้เกียรตินำเผยแพร่ผ่าน วิชาการ.คอม เรามีความยินดีและอนุญาตให้ทำซ้ำหรือเผยแพร่ต่อเพื่อประโยชน์ทางการศึกษาเท่านั้น กรุณาให้เกียรติผู้เขียน โดยอ้างชื่อผู้เขียนและ วิชาการ.คอม (www.vcharkarn.com) ทุกครั้งที่ทำการเผยแพร่ต่อ ห้ามนำส่วนหนึ่งส่วนใดไปเผยแพร่ต่อในสื่อที่เอื้อประโยชน์ทางธุรกิจก่อนได้รับอนุญาต ขอขอบคุณที่ร่วมกันช่วยสร้างให้สังคมไทยเป็นสังคมแห่งปัญญา
จำนวน 36 ความเห็น, หน้า่ |
1| -
2-
ความเห็นเพิ่มเติมที่ 19 19 ธ.ค. 2550 (20:29) ตอบ ค.ห. ที่ 18 อ่ะคับ
ที่คอมไพล์ไม่ผ่านก็คงจะมาจากการเขียนรูปแบบของโปรแกรมผิด
ซึ่งอันที่จริงมันก็คงจะเป็นแค่เส้นผมบังภูเขาอยู่เท่านั้นแล
ค่อยๆหาจุดผิดพลาดนะคับ แล้วความผิดพลาดในคร้งนี้จะทำให้คุณจำมันจนขึ้นใจ
เป็นกำลังใจให้คับ
ความเห็นเพิ่มเติมที่ 20 22 ธ.ค. 2550 (12:17) ความเห็นที่ 18 นั้น ที่เขียนไม่ผ่าน อยู่บรรทัดแรกเลยครับ
#include
ตามจริงจะต้องเป็น
#include<ชื่อไดเรกทอรี่>
ชื่อไดเรกทอรี่ ก็มีเยอะ แต่ที่สำคัญที่สุดก็ stdio.h
ส่วนอื่นๆก็ยังมีอีกเยอะ ลองใช้ help ใน Turbo C ดูครับ (แบบDosนะ)
แบบDos จะใช้ง่ายที่สุดแล้ว ที่ผมเขียนมา
ความเห็นเพิ่มเติมที่ 21 24 ธ.ค. 2550 (23:19) เขียนโปรพอได้บ้างครับแต่ติดที่ภาษาแบบ งง ม๊ากมากทำงัยดี
ความเห็นเพิ่มเติมที่ 22 30 ธ.ค. 2550 (23:11) ขอบคุณมากๆครับ เพิ้งหัดศึกษา
ความเห็นเพิ่มเติมที่ 23 10 ม.ค. 2551 (04:00) คห ที่ 14
ใช้ software จาก หุ่นยนต์นั้นแหละ ง่ายที่สุด ครับ
เพราะผมก็ทำเหมือนกัน มันก็ละเอียดเช่นกันครับ
ปัญหาของหุ่นยนต์อยู่ที่ตัวแปรของอุปสรรคที่ไม่คงที่ครับเช่น
กำหนดให้ แสงน้อยเดินซ้าย ปรากฏว่า บริเวณนั้น มีหลอดไฟส่องอยู่ไม่ตรงตามที่กำหนดไว้
หุ่นยนต์ก็ผ่านไปครับ
เล็งแม่นๆ ตั้งค่าให้กว้างที่สุดเท่าที่จะทำได้
สำคัญอีกส่วนการออกแบบ ครับต้องให้เซ็นเซอร์ เสถียรไว้ก่อน ไม่โยกไปมา เพราะอ่านค่าแปลกไปครับ
ผมลองมาแล้ว ถ้าแสงบนสนามไม่เสถียรแล้วไม่แก้ไขหละก้อ
ดวงล้วนๆ ครับ
ความเห็นเพิ่มเติมที่ 24 21 ก.พ. 2551 (10:38) เติมตัวเลขเข้าไป ๒ จำนวน แล้วรายงานได้ว่าตัวเลขนั้นเท่ากันหรือไม่เท่ากัน
เขียนอย่างไรครับ
ความเห็นเพิ่มเติมที่ 25 16 มี.ค. 2551 (10:15)
ต้องขอขอบคุณเป็นอย่างมากเลยครับ ผมเคยเรียนมานานมากแล้ว ไม่รู้ว่าในสมองจะเหลือความจำบ้างหรือเปล่า ขอบคุณอีกครั้ง
ความเห็นเพิ่มเติมที่ 26 31 มี.ค. 2551 (15:56) ก็น่าสนใจน๊ะครับ แต่ถ้ายังไงผมแนะนำให้ไปดูเพิ่มเติมที่
citecclub.org แล้วจะได้อะไรเพิ่มขึ้นอีกมายมายมากกว่าที่คุณคิดน๊ะครับ
แค่คุณคิดจาสมัครก็ไม่ธรรมดาแล้ว แต่เนื้อหาแน่นน่าชมอย่างงมาก
เชื่อว่าคุณๆ จะต้องไม่ผิดหวังครับ
Os
ร่วมแบ่งปันความรู้และความเห็นแล้ว 1 ครั้ง - ได้รับดาวแล้ว 150 ดวง - โหวตเพิ่มดาว
ความเห็นเพิ่มเติมที่ 27 23 เม.ย. 2551 (15:21) ขอบคุณมากครับ
ความเห็นเพิ่มเติมที่ 28 15 พ.ค. 2551 (01:24) คุณ ช่วยแจ้งลบความเห็นนี้แล้ว ขอบคุณค่ะ ขอบคุณมากค่ะ ได้ความรู้มากเลย
ตอนนี้มีเรียนเรื่องนี้อยู่แต่เพิ่งเปิดเทอมยังไม่ได้ซื้อหนังสือเลยค่ะ ><"
ความเห็นเพิ่มเติมที่ 29 17 พ.ค. 2551 (13:08) ไม่เคยเข้าไปชมเว็บ ก็ดีครับ
ความเห็นเพิ่มเติมที่ 30 17 พ.ค. 2551 (13:26) ช่วยแนนำตัวprogram run ภาษา ซี
ความเห็นเพิ่มเติมที่ 31 20 พ.ค. 2551 (12:19) ตอบคำถาม นะครับ
คำถามที่ 16 ภาษา C เป็นภาษาโครงสร้างครับ แต่ java ถ้าจะให้ถูกหลักต้องเขียนเป็น OOP ครับ
คำถาม 17 ตัวแปรเกิดจากผู้เขียน สร้างขึ้นมาเองนะครับ ดังนั้น การสร้างขึ้นมาผู้เขียนโปรแกรมต้องจำได้สิครับ ที่คุณว่าหมายถึงคำสั่งป่ะครับ
คำถามที่ 18 คุณเขียนแค่นั้นไม่ได้หรอกครับ คุณต้องใช้ <Stdio.h> ตามหลัง include ด้วยครับ เพราะคุณมีการเรียกใช้ คำสั่งในการแสดงผล printf
คำถามที่ 30 ตัวโปรแกรม TC3 ครับ หรือ Turbo C++ ก็ได้ TC3 นี่ไม่ต้อง install Copy ลงไปแล้วเซ็ตาค่านิดหน่อยใช้ได้เลย ส่วน Turbo C++ install ใช้เหมือนโปรแกรมทั่วไป
goah
ร่วมแบ่งปันความรู้และความเห็นแล้ว 1 ครั้ง - ได้รับดาวแล้ว 50 ดวง - โหวตเพิ่มดาว
ความเห็นเพิ่มเติมที่ 32 4 มิ.ย. 2551 (10:19) การรัน คอมไพเลอร์ ระบบ boardland และระบบ turbo c อันไหนดีก่ากันคับ
ความเห็นเพิ่มเติมที่ 33 4 มิ.ย. 2551 (10:44) ผมก็เพิ่งเคยเขียนภาษา C
ผมจะลองเขียนให้ดูง่ายๆนะคับผิดตรงไหนก็ต้องขอโทษด้วยจริงๆ
#include<stdio.h>
void main()
{
int num1,num2,num3;
char[20] no1;
printf("\t\t\t\============\n");
printf("\t\t\t\t\TEST\n");
printf("\t\t\t\============\n");
printf("NUMBER 1 : ");
scanf("%d",num1);
printf("PLEASE + - * / ");
scanf("%d",no1);
printf("NUMBER 2 : ");
scanf("%d",num2);
{
if no1="+"
printf("ANSWER IS : ",num1+num2);
elseif no1="-"
printf("ANSWER IS : ",num1-num2);
elseif no1="*"
printf("ANSWER IS : ",num1*num2);
else
printf("ANSWER IS : ",num1/num2);
}
ผมว่าน่าจะผิดเยอะช่วยหาที่ผิดหน่อยนะคับ
ความเห็นเพิ่มเติมที่ 34 5 มิ.ย. 2551 (13:39)
ผมเด็กใหม่ แต่อยากเรียนภาษา c คับ ช่วยสอนผมหน่อยอยากเขียนโปรแกรมเป็นคับ "."
ความเห็นเพิ่มเติมที่ 35 9 มิ.ย. 2551 (16:34) กระผมขอขอบคุณเป็นอย่างมากๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ
ถ้ากระผมเข้าใจกระผมจะไม่ลืมพระคุณเลยขอรับ
ความเห็นเพิ่มเติมที่ 37 17 มิ.ย. 2551 (16:55) สวัสดีครับพี่ๆช่วยผมหน่อยนะครับ ผมอยากเขียนภาษา c
เป็นครับ audsadee@hotmail.com
ความเห็นเพิ่มเติมที่ 38 17 มิ.ย. 2551 (23:32) <P>#include<stdio.h></P>
<P>#include<conio.h></P>
<P>main(){</P>
<P> printf("Hello\nMy name is DotA.\n");</P>
<P> //printf();</P>
<P> printf("Good Bye");</P>
<P> getch();</P>
<P> }</P>
<P> </P>
<P>พอได้ป่าวคับ :)</P>