Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

การส่ง Structure ทั้งหมดเป็นอาร์กิวเมนต์ให้ฟังก์ชันในภาษา C

วิธีการส่งข้อมูล Structure ให้ฟังก์ชัน (3 วิธี)

  1. ส่งสมาชิกแต่ละตัว
  2. ส่ง Structure ทั้งหมด (Passing entire structure) - หัวข้อนี้
  3. ส่งที่อยู่ของ Structure

หลักการทำงาน

  • ส่งชื่อตัวแปร structure ไปใน function call
  • ฟังก์ชันรับค่าในพารามิเตอร์ที่เป็น structure variable อีกตัวหนึ่ง (call by value)
  • คอมไพเลอร์จะสร้างสำเนา (copy) ของ structure ทั้งหมด

ข้อเสีย

  • เสียหน่วยความจำและเวลา เพราะต้องสร้างสำเนาของ structure ทั้งหมด
  • การเปลี่ยนแปลงค่าในฟังก์ชันไม่ส่งผลต่อ structure ต้นฉบับ

ตัวอย่างโปรแกรมที่ 1: ส่ง Structure ทั้งตัวให้ฟังก์ชัน display

#include <stdio.h>
struct date {
    int day;
    char month[10];
    int year;
};
void display(struct date d); // รับ structure แบบ pass by value

int main() {
    struct date d;
    printf("ป้อนวัน เดือน ปี: ");
    scanf("%d%s%d", &d.day, d.month, &d.year);
    display(d); // ส่ง structure ทั้งตัว (copy)
    return 0;
}
void display(struct date d) {
    printf("วัน=%d\\n", d.day);
    printf("เดือน=%s\\n", d.month);
    printf("ปี=%d\\n", d.year);
}

ผลลัพธ์

ป้อนวัน เดือน ปี: 18 JAN 2021
วัน=18
เดือน=JAN
ปี=2021

ตัวอย่างโปรแกรมที่ 2: บวกค่าสมาชิกใน Structure

#include <stdio.h>
struct add {
    int var1;
    int var2;
};
void show(struct add a); // รับ structure แบบ pass by value

int main() {
    struct add a;
    printf("ป้อนตัวแปร 1 = ");
    scanf("%d", &a.var1);
    printf("ป้อนตัวแปร 2 = ");
    scanf("%d", &a.var2);
    show(a); // ส่ง structure ทั้งตัว
    return 0;
}
void show(struct add a) {
    int sum = a.var1 + a.var2;
    printf("ผลบวกคือ %d", sum);
}

ผลลัพธ์

ป้อนตัวแปร 1 = 20
ป้อนตัวแปร 2 = 50
ผลบวกคือ 70

ตัวอย่างโปรแกรมที่ 3: คำนวณคะแนนรวมนักศึกษา

#include <stdio.h>
struct student {
    int s1, s2, s3;
} s[5];

void addition(struct student s[]) { // รับ array of structures
    int i, sum;
    for (i = 1; i < 4; i++) {
        sum = s[i].s1 + s[i].s2 + s[i].s3;
        printf("นักศึกษา %d ได้คะแนนรวม %d\\n", i, sum);
    }
}

int main() {
    int i;
    for (i = 1; i < 4; i++) {
        printf("ป้อนคะแนนนักศึกษา %d วิชา 1 = ", i);
        scanf("%d", &s[i].s1);
        printf("ป้อนคะแนนนักศึกษา %d วิชา 2 = ", i);
        scanf("%d", &s[i].s2);
        printf("ป้อนคะแนนนักศึกษา %d วิชา 3 = ", i);
        scanf("%d", &s[i].s3);
    }
    addition(s); // ส่ง array of structures (decay to pointer)
    return 0;
}

ผลลัพธ์

ป้อนคะแนนนักศึกษา 1 วิชา 1 = 25
ป้อนคะแนนนักศึกษา 1 วิชา 2 = 89
ป้อนคะแนนนักศึกษา 1 วิชา 3 = 45
ป้อนคะแนนนักศึกษา 2 วิชา 1 = 12
ป้อนคะแนนนักศึกษา 2 วิชา 2 = 45
ป้อนคะแนนนักศึกษา 2 วิชา 3 = 89
ป้อนคะแนนนักศึกษา 3 วิชา 1 = 12
ป้อนคะแนนนักศึกษา 3 วิชา 2 = 78
ป้อนคะแนนนักศึกษา 3 วิชา 3 = 12
นักศึกษา 1 ได้คะแนนรวม 159
นักศึกษา 2 ได้คะแนนรวม 146
นักศึกษา 3 ได้คะแนนรวม 102

หมายเหตุ: ในตัวอย่างที่ 3 การส่ง array of structures จริงๆ แล้วเป็นการส่ง pointer (address) ไม่ใช่ copy ทั้ง array