Menu
CoddyTech

Pengikatan Terstruktur

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 88 dari 104.

Binding terstruktur, yang diperkenalkan di C++17, memungkinkan kamu membongkar beberapa nilai dari array, pair, tuple, atau struct menjadi variabel bernama secara terpisah dalam satu deklarasi. Ini membuat kodemu lebih rapi dan mudah dibaca saat bekerja dengan data komposit.

Sintaks menggunakan auto dengan tanda kurung siku yang berisi nama variabel baru:

#include <iostream>
#include <map>
#include <tuple>

int main() {
    // Membongkar pair
    std::pair<std::string, int> person{"Alice", 25};
    auto [name, age] = person;
    std::cout << name << " is " << age << "\n";
    
    // Membongkar tuple
    std::tuple<int, double, char> data{42, 3.14, 'X'};
    auto [num, pi, letter] = data;
    
    // Membongkar nilai dalam for loop berbasis rentang
    std::map<std::string, int> scores{{"Bob", 90}, {"Carol", 85}};
    for (const auto& [student, score] : scores) {
        std::cout << student << ": " << score << "\n";
    }
}

Structured bindings juga berfungsi dengan array dan struct kustom yang memiliki member publik:

struct Point {
    double x;
    double y;
};

Point getOrigin() { return {0.0, 0.0}; }

int main() {
    auto [x, y] = getOrigin();
    
    int arr[3] = {1, 2, 3};
    auto [a, b, c] = arr;
}

Kamu bisa menggunakan auto& atau const auto& untuk mengikat dengan referensi, sehingga menghindari penyalinan dan memungkinkan kamu memodifikasi nilai asli saat diperlukan. Fitur ini sangat berguna saat melakukan iterasi pada container STL atau menangani fungsi yang mengembalikan beberapa nilai.

challenge icon

Tantangan

Mudah

Mari buat penganalisis nilai siswa yang menunjukkan keunggulan structured bindings. Kamu akan membuat sistem yang memproses catatan siswa dan data mata pelajaran, menggunakan structured bindings untuk membongkar pair, tuple, dan struct dengan rapi di seluruh kodemu.

Kamu akan mengatur kodemu dalam tiga file:

  • Student.h: Definisikan struct Student dengan anggota publik untuk nama siswa (std::string), ID (int), dan GPA (double). Buat juga fungsi bernama createStudent yang menerima nama, ID, dan GPA, lalu mengembalikan struct Student.
  • GradeUtils.h: Buat fungsi utilitas untuk memproses nilai.

    Definisikan fungsi getGradeInfo yang menerima nilai numerik (integer) dan mengembalikan std::tuple yang berisi tiga nilai: nilai huruf (std::string), poin nilai (double), dan apakah siswa lulus (bool). Gunakan skala penilaian berikut:

    • 90+ : "A", 4.0, true
    • 80-89: "B", 3.0, true
    • 70-79: "C", 2.0, true
    • 60-69: "D", 1.0, true
    • Di bawah 60: "F", 0.0, false

    Definisikan juga fungsi makeScorePair yang menerima nama mata pelajaran (std::string) dan nilai (int), lalu mengembalikan std::pair yang berisi kedua nilai tersebut.

  • main.cpp: Baca empat input:
    1. Nama siswa (string)
    2. ID siswa (integer)
    3. Nama mata pelajaran (string)
    4. Nilai (integer)

    Gunakan structured bindings di seluruh fungsi main-mu:

    1. Panggil createStudent dengan nama, ID, dan GPA placeholder sebesar 0.0. Gunakan structured bindings untuk membongkar struct yang dikembalikan menjadi variabel-variabel tersendiri, lalu cetak: Student: [name] (ID: [id])
    2. Panggil makeScorePair dengan nama mata pelajaran dan nilai. Gunakan structured bindings untuk membongkar pair, lalu cetak: Course: [course], Score: [score]
    3. Panggil getGradeInfo dengan nilai. Gunakan structured bindings untuk membongkar ketiga elemen tuple, lalu cetak:
      Grade: [letter]
      Points: [points]
      Passing: [yes/no]
      (Cetak "yes" jika siswa lulus bernilai true, "no" jika false)

Contohnya, dengan input Alice, 1001, Math, dan 85:

Student: Alice (ID: 1001)
Course: Math, Score: 85
Grade: B
Points: 3
Passing: yes

Dengan input Bob, 2002, Physics, dan 55:

Student: Bob (ID: 2002)
Course: Physics, Score: 55
Grade: F
Points: 0
Passing: no

Ingat untuk menyertakan <tuple> dan <utility> jika diperlukan. Inti pentingnya adalah structured bindings memungkinkan kamu membongkar tipe komposit, pair, tuple, dan struct menjadi variabel bernama dalam satu deklarasi yang mudah dibaca.

Coba sendiri

#include <iostream>
#include <string>
#include "Student.h"
#include "GradeUtils.h"

int main() {
    // Baca input
    std::string studentName;
    int studentId;
    std::string courseName;
    int score;
    
    std::cin >> studentName;
    std::cin >> studentId;
    std::cin >> courseName;
    std::cin >> score;
    
    // TODO: Panggil createStudent dengan nama, id, dan GPA sementara bernilai 0.0
    // Gunakan binding terstruktur untuk menguraikan struct: auto [name, id, gpa] = ...
    // Cetak: Student: [name] (ID: [id])
    
    
    // TODO: Panggil makeScorePair dengan nama kursus dan skor
    // Gunakan binding terstruktur untuk menguraikan pair: auto [course, sc] = ...
    // Cetak: Course: [course], Score: [score]
    
    
    // TODO: Panggil getGradeInfo dengan skor
    // Gunakan binding terstruktur untuk menguraikan tuple: auto [letter, points, passing] = ...
    // Cetak:
    // Grade: [letter]
    // Points: [points]
    // Lulus: [yes/no] (cetak "yes" jika passing bernilai true, "no" jika false)
    
    
    return 0;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online