โครงสร้างข้อมูล

Data structures

Data structure หรือโครงสร้างข้อมูลเป็นกลุ่มของตัวแปรที่สามารถรวมอยู่ในตัวแปรตัวเดียว เราเรียกว่า structure ตัวแปรที่อยู่ข้างในประเภทข้อมูลนี้เรียกว่า members หรือสมาชิกของ structure ซึ่งสมาชิกของมันสามารถเป็นประเภทอื่นๆ และมีขนาดต่างๆ ในภาษา C++ เราสามารถสร้างโครงสร้างข้อมูลจากรูปแบบตามนี้:

struct struct_name
{
    member_type1 member_name1;
    member_type2 member_name2;
    member_type3 member_name3;
    .
    .
} object_names;

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

struct person
{
    string name;
    int age;
    float money;
};
person student, teacher, doctor;

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

struct person {
    string name;
    int age;
    float money;
} student, teacher, doctor;

Assign and reading structure members

เราได้สร้างโครงสร้างออบเจ็คของโครงสร้างข้อมูล person ซึ่งแต่ละออบเจ็คจะมีสมาชิกของ person ข้างในมัน เราสามารถเข้าถึงสมาชิกของ structure ได้โดยการใช้เครื่องหมายจุด (.) และตามด้วยชื่อของสมาชิก เช่น student.name ต่อไปเราจะดูตัวอย่างของการใช้โครงสร้างข้อมูล

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

struct person
{
    string name;
    int age;
    float money;
};

int main ()
{
    person student, teacher;

    student.name = "Mateo";
    student.age= 14;
    student.money = 50.4;

    cout << "Enter teacher name: ";
    cin >> teacher.name;
    cout << "Enter teacher age: ";
    cin >> teacher.age;
    cout << "Enter teacher money: ";
    cin >> teacher.money;

    cout << "Student's info" << endl;
    cout << student.name << " is " << student.age;
    cout << " year old and has $" << student.money << endl;
    cout << "Teacher's info" << endl;
    cout << teacher.name << " is " << teacher.age;
    cout << " year old and has $" << teacher.money << endl;

    return 0;
}

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

Enter teacher name: John
Enter teacher age: 30
Enter teacher money: 1043
Student's info
Mateo is 14 year old and has $50.4
Teacher's info
John is 30 year old and has $1043

หลังจากนั้นเราได้ทดลองรันโปรแกรม และนี่เป็นผลลัพธ์การทำงานของโปรแกรม โดยเราได้กำหนดข้อมูลของนักเรียนในโค้ดและข้อมูลของอาจารย์นั้นรับค่าเข้ามาทางคีย์บอร์ด

การใช้ Struct กับอาเรย์และฟังก์ชัน

Struct นั้นเป็นโครงสร้างข้อมูลและมันถือว่าเป็นข้อมูลประเภทหนึ่งในภาษา C++ เพราะมันเป็นข้อมูลแบบ Valued type ตัวอย่างต่อไปจะเป็นการใช้งาน Struct กับอาเรย์

#include <iostream>
#include <cstdlib> // srand()
#include <ctime> // time()
#include <cmath> // pow(), sqrt()

using namespace std;

struct point
{
    int x;
    int y;
    int z;
};

// find distance between two points in 3D
double distance3D(point a, point b)
{
    return sqrt(pow(b.x - a.x, 2) +
                pow(b.y - a.y, 2) +
                pow(b.z - a.z, 2));
}

// random number between min and max
int getRandomNumber(int min, int max)
{
    return rand() % (max - min) + min;
}

int main()
{
    const int SIZE = 10;

    //initialize random seed
    srand(time(NULL));

    // declare array of struct
    point p1[SIZE];
    point p2[SIZE];

    for (int i = 0; i < SIZE; i++)
    {
        p1[i].x = getRandomNumber(0, 10); // random  0 to 10
        p1[i].y = getRandomNumber(0, 10);
        p1[i].z = getRandomNumber(0, 10);

        p2[i].x = getRandomNumber(0, 10);
        p2[i].y = getRandomNumber(0, 10);
        p2[i].z = getRandomNumber(0, 10);
    }

    for (int i = 0; i < SIZE; i++)
    {
        cout << "[";
        cout << p1[i].x << ", " << p1[i].y << ", " << p1[i].z;
        cout << "] to [";
        cout << p2[i].x << ", " << p2[i].y << ", " << p2[i].z;
        cout << "] = " << distance3D(p1[i], p2[i]) << endl;
    }

    return 0;
}

ในตัวอย่าง เราได้ประกาศ struct point สำหรับเก็บพิกัดในสามมิติ และเราได้สร้างอาเรย์ของ struct มาสองตัวคือ p1 และ p2 อาเรย์เหล่านี้ถูกกำหนดขนาดให้เป็น 10 โดยโปรแกรมของจะทำการสุ่มค่าพิกัดในสามมิติจากที่มีค่าในจุดต่างๆ ระหว่าง 0 - 10 ลงในอาเรย์ทั้งสองอย่างละ 10 พิกัด หลังจากสุ่มค่าเสร็จสิ้นแล้ว เราทำการหาระยะห่างของทั้งสองจุดที่เป็นคู่อันดับกันไปในอาเรย์

double distance3D(point a, point b)
{
    return sqrt(pow(b.x - a.x, 2) +
                pow(b.y - a.y, 2) +
                pow(b.z - a.z, 2));
}

ฟังก์ชัน distance3D() เป็นฟังก์ชันในการหาระยะห่างของจุดสองจุดในสามมิติของเรา ในฟังก์ชันนั้นมีพารามิเตอร์เป็น struct โดยเราได้ให้ตัวอย่างในการใช้งาน struct กับฟังก์ชัน โดยเราได้ส่งจุดสองจุดสำหรับหาระยะห่างเข้ามาจากสูตร

[5, 7, 0] to [9, 8, 1] = 4.24264
[4, 4, 1] to [2, 5, 8] = 7.34847
[3, 8, 5] to [8, 1, 0] = 9.94987
[2, 4, 1] to [8, 0, 9] = 10.7703
[3, 3, 4] to [8, 8, 7] = 7.68115
[9, 3, 8] to [9, 4, 0] = 8.06226
[8, 7, 6] to [3, 9, 6] = 5.38516
[1, 3, 2] to [9, 5, 6] = 9.16515
[7, 7, 3] to [3, 2, 9] = 8.77496
[8, 4, 9] to [1, 6, 5] = 8.30662

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

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