28 กรกฎาคม, 2552

DTS 05-22/07/2552

สรุป
สแตก(Stack)เป็นโครงสร้างข้อมูลแบบลิเนียร์ลิสต์(linear list) ที่มีคุณสมบัติว่า การเพิ่มหรือลบข้อมูลในสแตกจะทำได้ด้านเดียวเรียกว่า Top ของสแตก (Top Of Stack) ซึ่งคุณสมบัติที่สำคัญของสแตกคือ ข้อมูลที่ใส่หลังสุดจะถูกนำออกมา จากสแตกเป็นอันดับแรกสุด เรียกคุณสมบัตินี้ว่า LIFO (Last In First Out)
ส่วนประกอบของสแตก
การนำสแตกไปใช้งานนั้นไม่ว่าจะเป็นโครงสร้างสแตกแบบแถวลำดับ (array) หรือ แบบลิงค์ลิสต์
(link list) เราจะมีตัวแปรตัวหนึ่งที่ใช้เป็นตัวชี้สแตก (stack pointer ) เพื่อเป็นตัวชี้ข้อมูลที่อยู่บนสุดของสแตก ซึ่งจะทำให้สามารถจัดการข้อมูล ที่จะเก็บในสแตกได้ง่าย ดังนั้นโครงสร้างข้อมูลแบบสแตกจะแบ่งออกเป็น 2 ส่วนที่สำคัญ คือ
1. ตัวชี้สแตก ( Stack Pointer ) ซึ่งมีหน้าที่ชี้ไปยังข้อมูลที่อยู่บนสุดของ สแตก ( Top stack )
2. สมาชิกของสแตก ( Stack Element ) เป็นข้อมูลที่จะเก็บลงไปในสแตก ซึ่งจะต้องเป็นข้อมูลชนิดเดียวกัน เช่น ข้อมูลชนิดจำนวนเต็ม เป็นต้น
การทำงานของสแตก
โครงสร้างข้อมูลของสแตกจะใช้กันในเรื่องของการทำอินเตอร์รัพต์หรือการเรียกใช้โปรแกรมย่อย เนื่องจากการทำงานเช่นนี้ ต้องมีการเก็บตำแหน่งการทำงานเดิมเอาไว้ก่อนที่จะกระโดดไปทำงานโปรแกรมย่อยอื่น และหากต้องการกลับมาทำงานในโปรแกรมย่อยเดิมได้อย่างเป็นลำดับ เพราะ สแตกมีการใช้แสดงลำดับการประมวลผลของข้อมูล เมื่อต้องการข้ามขั้นตอน บางขั้นตอนไปกระทำขั้นตอนอื่น ให้จบก่อน แล้วจึงกลับมาทำซ้ำขั้นตอนเดิม
ตัวอย่าง
1. สมมติเมื่อเรากำลังประมวลผลข้อมูล A อยู่ เราต้องการข้ามไปประมวลผลข้อมูล B ให้เสร็จก่อน แล้วนำ ข้อมูลที่ได้มาใช้งานกับข้อมูล A เราจะต้องเก็บข้อมูล A ลงในสแตกก่อน (push A) จากนั้นจึงข้ามไปทำ การประมวลผลข้อมูล B
2. ในขณะที่ประมวลผลข้อมูล B อยู่เราต้องข้ามไปทำข้อมูล C เพื่อนำผลที่ได้มาทำงานกับข้อมูล B เราก็จะต้อง ทำการเก็บ B ลงในสแตก (push B) แล้วจึงจะข้ามไปทำข้อมูล C
3. เมื่อทำข้อมูล C เสร็จ เราก็จะดึงข้อมูล B ออกจากสแตก (pop B) เพื่อทำการประมวลผล
4. เมื่อเราประมวลผลข้อมูล B เสร็จ เราก็จะดึงข้อมูล A ออกจากสแตก (pop A) เพื่อทำการประมวลผล เป็นอันสิ้นสุดการประมวลผล

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

21 กรกฎาคม, 2552

DTS 04-15/07/2552

สรุป

ลิงค์ลิสต์เป็นการจัดเก็บชุดข้อมูลเชื่อมโยงต่อเนื่องกันไปตามลำดับ ซึ่งอาจอยู่ในลักษณะแบบเชิงเส้นตรง (linear) หรือ ไม่เป็นเส้นตรง (nonlinear) ก็ได้ ซึ่งในลิสต์จะประกอบไปด้วยข้อมูลที่เรียกว่าโหนด (node) ในหนึ่งโหนดจะประกอบด้วยส่วนของข้อมูลที่ต้องการจัดเก็บ เรียกว่าส่วน Info และส่วนที่เป็นพอยน์เตอร์ที่ชี้ไปยังโหนดถัดไป (Link) หรือชี้ไปยังโหนดอื่นๆที่อยู่ในลิสต์ หากไม่มีโหนดที่อยู่ถัดไป ส่วนที่เป็นพอยน์เตอร์หรือ Link จะเก็บค่า NULL หรือ NILL ใช้สัญลักษณ์ ^

Linked List เป็นวิธีการเก็บข้อมูลอย่างต่อเนื่องของอิลิเมนท์ต่างๆโดยมีพอยเตอร์เป็นตัวเชื่อมต่ออิลิเมนต์ คือ ชื่อตัวเเปรที่มาเก็บค่าแต่ละอิลิเมนท์ เรียกว่าโนด (Node) จะประกอบไปด้วย 2 ส่วน คือ Data และ Link Fieldโนด (Node) คือ การเชื่อมต่อโครงสร้างข้อมูลเเบบลิงค์ลิสต์ เเบ่งเป็น 2 ส่วน คือ Head Structure เเละ Data Node Strureโนดเเรกของลิงค์ลิสต์จะมีตัวแปรสำหรับชี้ตำเเหน่งของลิสต์ซึ่งจะเก็บตำเเหน่งเริ่มต้นของลิสต์ถ้าลิสต์ไม่มีข้อมูล ข้อมูลก็จะเป็นNull


ฟังก์ชัน stdio.h และ iostream.h


ใส่จำนวนนักเรียนที่ต้องการ แล้วใส่ค่าของคะแนน เพื่อหาผลรวมของคะแนนทั้งหมด

iostream.h
#include
int main()
{
int numstd;
cout << "Number of students: ";
cin >> numstd;
float *scores = new float[ nu mstd ];
int i;
for(i=0;i<>
{
cout << "Score of student " <<>
cin >> scores [ i ];
}
cout << "\nThe scores are ";
float total = 0;
for(i=0;i <>
{
cout <<>
total = total + scores[i];
}
cout << "\nTotal scores of all students is " <<>
delete []scores;
return 0;
}


stdio.h

#include
main()
{

int std;
printf ("Number of students: ");
scanf("%d",&std);
float *score = new float[std];
int i;
for(i=0;i
{
printf ("Score of student: ",i+1);
scanf ("%f",&score[i]);
}
printf ("\nThe score are %d",std);
float total=0;
for(i=0;i
{
printf("score[i]");
total = total + score[i];
}
printf("\nTotal scores of all students is:%f ",total);
delete[]score;
return 0;
}

14 กรกฎาคม, 2552

DTS 03-01/07/2552

สรุป
พอยน์เตอร์ (pointer) พอยน์เตอร์เป็นตัวแปรที่ใช้เก็บตำแหน่ง (แทนที่จะเก็บค่า) ของข้อมูลเช่น ตัวแปรหรือสมาชิกของอะเรย์ พอยเตอร์ในภาษาซีมีประโยชน์มากมาย เช่น เราสามารถใช้พอยน์เตอร์ในการ ส่งข้อมูลไปมาระหว่างฟังก์ชันกับจุดที่เรียกใช้ ฟังก์ชัน พอยน์เตอร์ทำให้ฟังก์ชันสามารถส่งค่ากลับคืนมาได้หลายค่าโดยผ่านอาร์กิวเมนต์ของฟังก์ชัน นอกจากนั้นเรายังใช้พอยน์เตอร์ในการเรียกใช้ฟังก์ชันที่ถูกส่งมาเป็นอาร์กิวเมนต์ของอีกฟังก์ชันหนึ่งนั่นคือ เราสามารถส่งฟังก์ชันหนึ่งเป็นอาร์กิวเมนต์ให้อีกฟังก์ชันหนึ่งได้
พอยน์เตอร์มีความใกล้เคียงกับอะเรย์ และเป็นวิธีหนึ่งที่เราจะอ้างถึงสมาชิกของอะเรย์ได้ยิ่งไปว่านั้น พอยต์เตอร์ยังจัดเตรียมวิธีการที่สะดวกสบาย ในการใช้อะเรย์หลายมิติ โดยแทนที่อะเรย์หลายมิติ 1 ตัวด้วยอะเรย์ของพอยน์เตอร์ที่มีมิติน้อยลง คุณลักษณะนี้ทำให้เราเก็บสตริงหลายๆ ตัวไว้ในอะเรย์เพียงตัวเดียวได้แม้ว่าสตริงเหล่านั้นจะมีความยาวไม่เท่ากัน
เครื่องหมายที่ใช้ในการทำงานกับตัวแปรพอยน์เตอร์
-เครื่องหมาย & เป็นเครื่องหมายที่ใช้เมื่อต้องการให้เอาค่าตำแหน่งที่อยู่ (address) ของตัวแปรที่เก็บไว้ในหน่วยความจำออกมาใช้
-เครื่องหมาย * เป็นเครื่องหมายที่จะใช้เมื่อต้องการให้นำค่าที่อยู่ในตำแหน่งที่ตัวแปรพอยน์เตอร์นั้นชี้อยู่ออกมาแสดงให้ดู

แบบฝึกหัด

1.ให้นักศึกษากำหนดค่าของ Array 1 มิติ และ Array 2 มิติ
ตอบ Array 1 มิติ คือ float nettotal[4];
และ Array 2 มิติ คือ int name[5][6];

2.ให้นักศึกษาหาค่าของ A[2] , A[6] จากค่าA={2,8,16,24,9,7,3,8,}
ตอบ A[2] คือ 16
A[6] คือ 3

3.จากค่าของ int a [2][3] = {{6,5,4},{3,2,1}}; ให้นักศึกษาหาค่าของ a[1][0]และa[0][2]
ตอบ a[1][0] คือ 3
a[0][2] คือ 4

4.ให้นักศึกษากำหนด structure ที่มีค่าของข้อมูลจากน้อย 6 Records
ตอบ struct STD
{
char code[11];
char name[10];
char lastname[20];
int midterm;
int final;
char grade;
}student;

5. ให้นักศึกษาบอกความแตกต่างของการกำหนดตัวชนิด Array กับตัวแปร Pointer ในสภาพของการกำหนดที่อยู่ของข้อมูล
ตอบ array หมายถึง ตัวแปรชุดที่ใช้เก็บตัวแปรชนิดเดียวกันไว้ด้วยกัน เช่น เก็บ ข้อมูล char ไว้กับ char เก็บ int ไว้กับ int ไม่สามารถเก็บข้อมูลต่างชนิดกันได้ เช่น char กับ int เรียก array อีกอย่างว่าหน่วยความจำแบ่งเป็นช่อง การกำหนดสมาชิกชิกของ array จะเขียนภายในเครื่องหมาย [ ]
pointer หมายถึง ตัวเก็บตำแหน่งที่อยู่ของหน่วยความจำ (Address) หรือเรียกว่า ตัวชี้ ตำแหน่งที่อยู่ สัญลักษณ์ของ pointer จะแทนด้วยเครื่องหมาย *