1.7.52

Pointer Set and String

DTS 03-01-07-2552

พอยเตอร์ เซต และสตริง
วันนี้ได้เรียน 3 เรื่อง
-Pointer
-Set and String

Pointer

Pointer คือ ตัวแปรชนิดหนึ่งที่อ้างอิงไปยังตำแหน่งของหน่วยความจำ (Address) เป็นการใช้ตัวชี้จะทำให้โปรแกรมรวดเร็วและ มีขนาดเล็ก
การประกาศตัวแปรPointer
ต้องมีระบุตัวดำเนินการ (Operator) เพื่อบอกว่าตัวแปรดังกล่าวเป็นตัวแปรแบบตัวชี้ โดยตัวดำเนินการที่ใช้คือ * และ & เช่น จะประกาศตัวแปรชนิดPointer คือ int *countPtr; ในที่นี้หมายถึง ตัวแปร countPtr ถูกประกาศให้เป็นตัวแปรชนิด Pointer และทำหน้าที่ชี้ (เก็บ Address) ไปยังตำแหน่งที่เก็บค่าจำนวนเต็ม(เป็นชนิดเดียวกับที่เราประกาศไว้ ในที่นี้คือ Integer)
ในการประกาศตัวแปร pointer จะต้องนำหน้าด้วยเครื่องหมาย * ดังเช่น
int y;
int *x; // เป็น pointer
char *z; // เป็น pointer

pointer มีประโยชน์หลายอย่างดังนี้
-ช่วยประหยัดหน่วยความจำ ไม่ต้องประกาศตัวแปรหลายๆ ครั้งเพื่อ ส่งค่าไปมา โดยเฉพาะการส่งค่าไปมาระหว่างฟังก์ชัน ถ้าเราใช้ pointer มาช่วยในการส่งค่าแบบอ้างอิง ทำให้ใน function ที่รับค่า ไม่จำเป็นต้องประกาศตัวแปรแบบเดียวกันซ้ำอีก จะเห็นได้ชัดเจนในตัวแปรแบบ array
-ช่วยประหยัดเวลา เพราะการส่งค่าไปมาแล้วเปลี่ยนแปลงค่าที่ส่งหากันระหว่างฟังก์ชันจะทำให้เสียเวลามากกว่า แต่ถ้าเราใช้ตัวแปร pointer เลย ก็จะทำให้เข้าถึงหน่วยความจำในตำแหน่งเดียวกันเลย ทำให้ไม่ต้อง copy ค่าดังกล่าวอีก


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

1.โครงสร้างแบบเชิงเส้น (linear) เป็นโครงสร้างที่ข้อมูลมีความสัมพันธ์แบบหนึ่งต่อหนึ่ง (one-to-one relationship) นั่นคือเราสามารถระบุถึงข้อมูลตัวถัดไปของข้อมูลได้
2.โครงสร้างแบบต้นไม้หรือแบบลำดับขั้น (tree or hierarchical) เป็นโครงสร้างที่ข้อมูลมีความสัมพันธ์กันแบบหนึ่งต่อหลาย (one-to-many relationship) นั่นคือ ข้อมูลตัวหนึ่งสามารถมีความสัมพันธ์กับข้อมูลในลำดับรองลงไปได้หลายตัว
3.โครงสร้างแบบกราฟหรือเครือข่าย (graph or network) เป็นโครงสร้างที่ข้อมูลมีความสัมพันธ์กันแบบหลายต่อหลาย (many-to-many relationship) นั่นคือ ข้อมูลตัวหนึ่ง ๆ อาจจะมีความสัมพันธ์กับข้อมูลตัวอื่น ๆ กี่ตัวก็ได้


โครงสร้างข้อมูลแบบสตริง (String)สตริง เป็นข้อมูลประกอบไปด้วย ตัวอักษร ตัวเลขหรือเครื่องหมาย ที่เรียงต่อๆกันไป รวมทั้งช่องว่างด้วยสตริงกับอะเรย์ สตริงคือ อะเรย์ของอักขระ

เช่น Char name[15]

อาจจะเป็นอะเรย์ขนาด 15 ช่องอักขระ หรือเป็นสตริงขนาด 15 อักขระก็ได้ โดยจุดสิ้นสุดขอบ สตริง จะจบด้วย \0 หรือ null character

เช่น char b[] = {'S' ,'A ','W', 'A' ,'S ','D' ,'E' ,'E' ,'\0'};

หรือ char b[] = "SAWASDEE";

การกำหนดตัวแปรสตริง อาศัยหลักการของอะเรย์ เพราะสตริงคืออะเรย์ของอักขระที่เปิดท้ายด้วย (\0) และมีฟังก์ชันพิเศษสำหรับการทำงานของสตริงโดยเฉพาะ

ฟังก์ชัน scanf ( )ใช้ในการรับค่าข้อมูลต่าง ๆ ที่ป้อนเข้ามาทางแป้นพิมพ์ รูปแบบการใช้ฟังก์ชัน scanf ( )scanf ( " รหัสรูปแบบ " , &ชื่อตัวแปร ) ;โดย รหัสรูปแบบ ใช้ชุดเดียวกันกับฟังก์ชัน printf ( )ชื่อตัวแปร จะต้องนำหน้าด้วยเครื่องหมาย & ยกเว้นตัวแปร สตริงที่ใช้ในการจัดเก็บข้อความไม่ต้องมีเครื่องหมาย &

ฟังก์ชัน getchar ( ) และ getch ( )getchar( ) คือ ฟังก์ชันที่ใช้รับข้อมูลเพียง 1 ตัวอักขระจากคีย์บอร์ด getch( ) เป็น ฟังก์ชันที่ใช้รับข้อมูลเพียง 1 ตัวอักขระเหมือนกับฟังก์ชัน getchar()

ฟังก์ชัน puts() ใช้ในการพิมพ์สริงออกทางจอภาพ โดยผ่านค่าแอดเรสของสริงไปให้เท่านั้น

อะเรย์ของสตริงที่ยาวเท่ากัน

อะเรย์ในักษณะนี้จะถือว่าเป็นอะรย์ที่แท้จริง และไมาสามารถกำหนดได้ทั้งหมดเมื่อมีการให้ค่าเริ่มต้น แลเมื่อกำหนดเป็นตัวแปรโดยดำเนินการแบบการกำหนดอะเรย์ 2 มิติ การกำหนดตัวแปรในลักษณะนี้ จะแตกต่างจากการกำหนดตัวแปรแแบความยาวไม่เท่ากัน คืด ในแบบความยาวไม่เท่ากันท้ายของสตริงจะเติม (\0) ให้เพียงตัวเดียวแต่ในแบบความยาวเท่ากันนั้น จะเติม (\0) ให้ครบทุกๆช่อง เพื่อที่จะให้มีความยาวเท่าๆกัน

Introduction

DST 01 -17-06-2552

Data Structure

โครงสร้างข้อมูล คือ หน่วยข้อมูลย่อยๆ (Data Elements)
เช่น การเลือกใช้ค่า n โดยชนิดของข้อมูล char ch; เป็นการกำหนดให้คอมพิวเตอร์จัดเตรียมหน่วยความจำขนาด 8 บิต int i; เป็นการกำหนดให้คอมพิวเตอร์จัดเตรียมหน่วยความจำขนาด16 บิต float average; เป็นการกำหนดให้คอมพิวเตอร์จัดเตรียมหน่วยความจำขนาด 32 บิต

ประเภทของโครงสร้างข้อมูล
1. โครงสร้างข้อมูลทางกายภาพ
(Physical Data Structure)
เป็นโครงสร้างข้อมูลทั่วไปที่มีใช้ในภาษาคอมพิวเตอร์ ซึ่งแบ่งออกเป็น 2 ประเภทตามลักษณะข้อมูล ดังนี้
1.2 ข้อมูลเบื้องต้น (primitive data types) เป็นข้อมูลพื้นฐานซึ่งมีโครงสร้างข้อมูลไม่ซับซ้อนจะต้องมีในภาษาคอมพิวเตอร์ทุกภาษา ตัวอย่างของข้อมูลประเภทนี้ เช่น
- จำนวนเต็ม (integer)
- จำนวนจริง (real)
- ตัวอักขระ (character)

2. โครงสร้างข้อมูลทางตรรกะ
(Logical Data Structure) เป็น โครงสร้างข้อมูลที่เกิดจากจินตนาการของผู้ใช้เพื่อใช้แก้ปัญหาในโปรแกรมที่สร้างขึ้น จำแนกได้เป็น 2 ประเภท ดังนี้
2.1 โครงสร้างข้อมูลแบบเชิงเส้น (linear data structures) เป็นชนิดข้อมูลที่ความสัมพันธ์ของข้อมูลเรียงต่อเนื่องกัน โดยข้อมูลตัวที่ 2 อยู่ต่อจาก ข้อมูลตัวที่ 1 ข้อมูลตัวที่ 3 อยู่ต่อจากข้อมูลตัวที่ 2 และข้อมูลตัวที่ n อยู่ต่อจากข้อมูลตัวที่ n - 1 ตัวอย่างโครงสร้างข้อมูลแบบเชิงเส้น เช่น
- ลิสต์ (list)
- สแตก (stack)
- คิว (queue)
- ดีคิว (deque)
- สตริง (string)
2.2 โครงสร้างข้อมูลแบบไม่ใช่เชิงเส้น (non-linear data structures) เป็นชนิดข้อมูลที่ข้อมูลแต่ละตัวสามารถมีความสัมพันธ์กับข้อมูลอื่นได้หลายตัว (ดูรายละเอียดเพิ่มเติมได้ในบทที่ 7) ตัวอย่างโครงสร้างข้อมูลแบบไม่ใช่เชิงเส้น
- ทรี (tree)
- กราฟ (graph)

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

28.6.52

เขียน Structure

DTS 02 28-06-2552

#include
int main() {
struct date {
int day;
int month;
int year;
};
struct person {
char name[20];
int age;
float salary;
struct date bday;
};
struct person emp1={"samchai", 25, 7500,{25, 11, 28}}, emp2;
printf("Enter Data of Employee \n");
printf("Name :");
scanf("%[^\n]",emp2.name);
printf("Age :");
scanf("%d",&emp2.age);
printf("salary : ");
scanf("%f",&emp2.salary);
printf("Birthday (dd/mm/yy) :");
scanf("%d/%d/%d", &emp2.bday.day, &emp2.bday.month, &emp2.bday.year);
printf("\n\nList of Employ\n");
printf("---------------------------------------------------------------------\n");
printf(" Employ NO. Name Age salary Birthday\n");
printf("---------------------------------------------------------------------\n");
printf(" 1 %-20s %d %f %2d/%2d/%2d\n", emp1.name,emp1.age,emp1.salary,emp1.bday.day,emp1.bday.month,emp1.bday.year);
printf(" 2 %-20s %d %f %2d/%2d/%2d\n", emp2.name,emp2.age,emp2.salary,emp2.bday.day,emp2.bday.month,emp2.bday.year);
printf("---------------------------------------------------------------------\n");

return 0;
}