30204-2004 การเขียนโปรแกรม

C++ Arrays & Structures

Let's Thinking . .

  • ให้นักศึกษาเขียนโปรแกรม เพื่อเก็บข้อมูล ระเบียนนักศึกษาในชั้นเรียน ให้ครบทุกคน

string student1 = "ชื่อ-สกุล คนที่ 1";
string student2 = "ชื่อ-สกุล คนที่ 2";
string student3 = "ชื่อ-สกุล คนที่ 3";
string student4 = "ชื่อ-สกุล คนที่ 4";
// . . .
string studentX = "ชื่อ-สกุล คนที่ X";

Let's Thinking . .

  • ให้นักศึกษาเขียนโปรแกรม เพื่อเก็บข้อมูล ระเบียนนักศึกษาในชั้นเรียน ให้ครบทุกคน

  • นักศึกษาทุกคนจะต้องมีข้อมูล ชื่อ-นามสกุล และ ชื่อเล่น

string student1_name = "ชื่อ-สกุล คนที่ 1";
string student1_nickname = "ชื่อเล่น คนที่ 1";
string student2 = "ชื่อ-สกุล คนที่ 2";
string student2_nickname = "ชื่อเล่น คนที่ 2";
// . . .
string studentX = "ชื่อ-สกุล คนที่ X";
string studentX_nickname = "ชื่อเล่น คนที่ X";

สมมติมีจำนวนนักศึกษา

50 คน

อาร์เรย์ (Array)

ประเภทตัวแปร

  1. อาเรย์มีวัตถุประสงค์ใช้เก็บชุดข้อมูล (Series/Collection of Data) ในตัวแปรชุดเดียวกัน . .แทนที่จะแยกเก็บข้อมูลในตัวแปรเดี่ยว ๆ ทีละตัว

  2. หลักการใช้งานตัวแปรประเภทอาเรย์ เหมือนกับการสร้างตัวแปรทั่วไป: กำหนด ชื่อ ประเภทข้อมูล จำนวนข้อมูล

string student[3]= {"ชื่อสกุลคนที่ 1", "ชื่อสกุลคนที่ 2", "ชื่อสกุลคนที่ 3"};

ลองทำดู

สร้างตัวแปร Array และกำหนดข้อมูลให้กับตัวแปร

string student[3]= {"ชื่อสกุลคนที่ 1, ชื่อสกุลคนที่ 2, ชื่อสกุลคนที่ 3"};
string student[3];
student[0] = "ชื่อสกุลคนที่ 1";
student[1] = "ชื่อสกุลคนที่ 2";
student[2] = "ชื่อสกุลคนที่ 3";

แบบที่ 1

แบบที่ 2

ลองทำดู

สร้างตัวแปร Array และกำหนดข้อมูลให้กับตัวแปร

string student[3];
student[0] = "ชื่อสกุลคนที่ 1";
student[1] = "ชื่อสกุลคนที่ 2";
student[2] = "ชื่อสกุลคนที่ 3";
student[3] = "ชื่อสกุลคนที่ 4";

ERROR! ERROR! ERROR!

อาร์เรย์: โครงสร้าง

  • อาเรย์คือชุดข้อมูล

  • กำกับโดยอินเด็กซ์ (Index) การกระทำกับตัวแปรอาเรย์ จะใช้ Index เป็นตัวนำทาง (Pointer)

  • สมมติให้ตัวแปรอาร์เรย์ มีสมาชิก 9 ข้อมูล (Elements)

  • เก็บข้อมูลประเภทอักขระ (String) ตัวอักษร A, B, C, . ., I


     

  • ตัวแปรอาร์เรย์ดังกล่าวมีสมาชิกข้อมูล 9 ตัว (Index - 1)

Index 0 1 2 3 4 5 6 7 8
ข้อมูล "A" "B" "C" "D" "E" "F" "G" "H" "I"

การทำงานกับอาร์เรย์

  • กำหนด Array ชื่อ student[3] มีข้อมูลดังนี้

Index 0 1 2
ข้อมูล "กฤษณ์" "Krit" "กิจ"
  • อัปเดตข้อมูล สมาชิกตัวแรก (index=0) ให้เท่ากับ "สมชาย"

student[0] = "สมชาย";
Index 0 1 2
ข้อมูล "สมชาย" "Krit" "กิจ"
  • แสดงข้อมูล สมาชิกลำดับที่ 3 (index=2)

  • อัปเดตข้อมูล สมาชิกลำดับที่ 2 ให้เท่ากับ "Somchai"

student[1] = "Somchai";
Index 0 1 2
ข้อมูล "สมชาย" "Somchai" "กิจ"

การทำงานกับอาร์เรย์

cout << student[2];
Index 0 1 2
ข้อมูล "สมชาย" "Krit" "กิจ"
  • ใช้การวนรอบ (Loop) สำหรับการทำงานกับตัวแปรอาร์เรย์

การทำงานกับอาร์เรย์ - วนรอบ (Array with Loop)

string cars[5] = {"โตโยต้า", "ฮอนด้า", "มาสด้า", "เทสล่า", "บีวายดี"};
for (int i = 0; i < 5; i++) {
	cout << "Index ที่ " << i << " มีข้อมูลคือ " << cars[i] << "\n";
}
int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i = 0; i < 5; i++) {
    cout << myNumbers[i] << "\n";
}
  • ตรวจสอบขนาดของอาร์เรย์
    คำสั่ง sizeof(ตัวแปรอาร์เรย์) ***หน่วยที่ได้เป็น bytes

คำสั่งอื่น ๆ ที่เกี่ยวกับอาร์เรย์

int myNumbers[5] = {10, 20, 30, 40, 50};
cout << sizeof(myNumbers); // ได้ 20
  • คำสั่งด้านบนได้เท่ากับ 20 bytes (ไบต์)

  • C++ ตัวแปรประเภท Integer ใช้พื้นที่เก็บข้อมูล 4 bits

cout << sizeof(int); // ได้ 4
  • ต้องการหาจำนวนสมาชิกในอาร์เรย์

cout << (sizeof(myNumber) / sizeof(int));
  • แสดงข้อมูลอาร์เรย์ ด้วยคำสั่ง sizeof()

คำสั่งอื่น ๆ ที่เกี่ยวกับอาร์เรย์

int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i = 0; i < sizeof(myNumbers) / sizeof(int); i++) {
	cout << myNumbers[i] << "\n";
}
int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i : myNumbers) {
	cout << i << "\n";
}

ให้ผลลัพธ์เหมือนกัน

  • ศึกษา Code ต่อไปนี้

อาร์เรย์หลายมิติ (Multidimensional Array)

string letters[2][4] = {
  { "A", "B", "C", "D" },
  { "E", "F", "G", "H" }
};

cout << letters[0][2] << endl; // "C"
cout << letters[1][3] << endl; // "H"
cout << letters[1][0] << endl; // "E"

อาร์เรย์ 2 มิติ

อาร์เรย์หลายมิติ (Multidimensional Array)

string letters[2][2][2] = {
  {
    { "A", "B" },
    { "C", "D" }
  },
  {
    { "E", "F" },
    { "G", "H" }
  }
};

cout << letters[1][0][1] << endl; // "F"

อาร์เรย์ 3 มิติ

การวนรอบกับอาร์เรย์หลายมิติ

for (int i = 0; i < 2; i++) {
  for (int j = 0; j < 2; j++) {
    for (int k = 0; k < 2; k++) {
      cout << letters[i][j][k] << "\n";
    }
  }
}

จากตัวแปรสไดล์ก่อนหน้า

ฟังก์ชั่น (Function)

void myFunction() {
  // ชุดคำสั่งภายในฟังก์ชั่น
}

  • ชื่อฟังก์ชั่นคือ myFunction

  • void หมายถึง ฟังก์ชั่นนี้ไม่มีการคืน ค่า/ข้อมูล ใด ๆ

พื้นที่เฉพาะที่กำหนดขึ้นมา เพื่อทำงานเฉพาะ โดยพื้นที่ดังกล่าวจะไม่ถูกเรียกใช้งานทันที จนกว่าจะมีการเรียกใช้งาน . .การเรียกใช้งานฟังก์ชั่นสามารถเรียกใช้ซ้ำได้บ่อยเท่าที่ต้องการ

ฟังก์ชั่น (Function)

* C++ จะต้องมีฟังก์ชั่นชื่อ main เสมอ และเริ่มต้นทำงานที่นี่
ฟังก์ชั่น main จะต้องสร้างในลำดับสุดท้ายเสมอ

// สร้างฟังก์ชั่นชื่อ myFunction
void myFunction() {
  cout << "ฟังก์ชั่นถูกเรียกใช้งาน\n";
}

// พื้นที่ทำงานหลัก (ฟังก์ชั่นชื่อ main)
int main() {
  myFunction(); // เรียกใช้งานฟังก์ชั่น
  return 0;
}

ฟังก์ชั่น (Function)

void myFunction() {
  cout << "ฟังก์ชั่นถูกเรียกใช้งาน\n";
}

int main() {
  myFunction(); 
  myFunction(); 
  myFunction(); 

return 0;
}

ฟังก์ชั่นกับการส่งผ่านตัวแปร (Parameters)

การทำงานของฟังก์ชั่นสามารถส่งผ่านตัวแปรเพื่อความยืดหยุ่นในการเขียนโปรแกรม

void functionName(parameter1, parameter2, parameter3) {
  // code to be executed
}

  • ฟังก์ชั่นชื่อ functionName

  • ตัวแปรส่งผ่านมีทั้งหมด 3 ตัวแปร ได้แก่ parameter1, . .

ตัวอย่าง

void myFunction(string fname) {
  cout << fname "\n";
}

int main() {
  myFunction("กฤษณ์");
  myFunction("Krit");
  myFunction("กิจ");
  return 0;
}

ตัวแปรส่งผ่านและค่ามาตรฐานของฟังก์ชั่น

void myFunction(string country = "Norway") {
  cout << country << "\n";
}

int main() {
  myFunction("Sweden");
  myFunction("India");
  myFunction(); // Norway
  myFunction("USA");
  return 0;
}

ส่งผ่านตัวแปรหลายตัว

void myFunction(string fname, int age) {
  cout << fname << " มีอายุ " << age << " ปี \n";
}

int main() {
  myFunction("กฤษณ์", 20);
  myFunction("สมชาย", 35);
  return 0;
}

ฟังก์ชั่นที่มีการส่งข้อมูลกลับมา (return)

int myFunction(int x) {
  return 5 + x;
}

int main() {
  cout << myFunction(2);
  return 0;
}
  • เรียกใช้งานฟังก์ชั่น myFunction โดยส่งข้อมูล 2

  • myFunction ทำงานพร้อมกับส่งข้อมูล 5+x = 7 กลับมา

การส่งผ่านตัวแปรแบบ Reference

void swapNums(int &x, int &y) {
  int z = x;
  x = y;
  y = z;
}

int main() {
  int firstNum = 10;
  int secondNum = 20;

  cout << "ก่อนเรียกใช้งานฟังก์ช่ัน: " << "\n";
  cout << firstNum << secondNum << "\n";

  // เรียกใช้งานฟังก์ชั่นเพื่อสับเปลี่ยนข้อมูล
  swapNums(firstNum, secondNum);

  cout << "หลังเรียกใช้งานฟังก์ช่ัน: " << "\n";
  cout << firstNum << secondNum << "\n";

  return 0;
}

การส่งผ่านตัวแปรแบบ Reference

void swapNums(int &x, int &y) {
  int z = x;
  x = y;
  y = z;
}

int main() {
  int firstNum = 10;
  int secondNum = 20;

  cout << "ก่อนเรียกใช้งานฟังก์ช่ัน: " << "\n";
  cout << firstNum << secondNum << "\n";

  // เรียกใช้งานฟังก์ชั่นเพื่อสับเปลี่ยนข้อมูล
  swapNums(firstNum, secondNum);

  cout << "หลังเรียกใช้งานฟังก์ช่ัน: " << "\n";
  cout << firstNum << secondNum << "\n";

  return 0;
}

การส่งผ่านแบบ Reference จะส่งผลกับตัวแปรดั้งเดิม (นอกฟังก์ชั่น) . .การทำงานในฟังก์ชั่น จะส่งผลต่อตัวแปรภายนอกทันที

Overloading

int plusFunc(int x, int y) {
  return x + y;
}

double plusFunc(double x, double y) {
  return x + y;
}

int main() {
  int myNum1 = plusFunc(8, 5);
  double myNum2 = plusFunc(4.3, 6.26);
  cout << "Int: " << myNum1 << "\n";
  cout << "Double: " << myNum2;
  return 0;
}

ฟังก์ชั่นสามารถมีชื่อเหมือนกันได้ โดยจะถูกเรียกใช้งานตามประเภทพารามิเตอร์ที่ส่งผ่าน

Recursion

int sum(int k) {
  if (k > 0) {
    return k + sum(k - 1);
  } else {
    return 0;
  }
}

int main() {
  int result = sum(10);
  cout << result;
  return 0;
}

ฟังก์ชั่นเรียกใช้งานฟังก์ชั่นเอง (. . วนรอบ)

Aj. Krit Th.

https://www.kritth.com