Menu
Coddy logo textTech

Yapılandırılmış Bağlamalar

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 88 / 104.

C++17 ile tanıtılan yapılandırılmış bağlamalar (structured bindings), diziler, çiftler (pairs), demetler (tuples) veya yapılardan (structs) birden fazla değeri tek bir bildirimde ayrı ayrı adlandırılmış değişkenlere açmanıza olanak tanır. Bu, bileşik verilerle çalışırken kodun daha temiz ve okunabilir olmasını sağlar.

Söz dizimi, yeni değişken adlarını içeren köşeli parantezlerle birlikte auto kullanır:

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

int main() {
    // Bir pair'i ayrıştırma
    std::pair<std::string, int> person{"Alice", 25};
    auto [name, age] = person;
    std::cout << name << " is " << age << "\n";
    
    // Bir tuple'ı ayrıştırma
    std::tuple<int, double, char> data{42, 3.14, 'X'};
    auto [num, pi, letter] = data;
    
    // Aralık tabanlı for döngülerinde ayrıştırma
    std::map<std::string, int> scores{{"Bob", 90}, {"Carol", 85}};
    for (const auto& [student, score] : scores) {
        std::cout << student << ": " << score << "\n";
    }
}

Structured bindings ayrıca dizilerle ve genel (public) üyelere sahip özel yapılarla da çalışır:

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;
}

Kopyalamayı önlemek ve gerektiğinde orijinal değerlerin değiştirilmesine izin vererek referans ile bağlamak için auto& veya const auto& kullanabilirsiniz. Bu özellik, özellikle STL konteynerleri üzerinde döngü kurarken veya birden fazla değer döndüren fonksiyonları işlerken kullanışlıdır.

challenge icon

Görev

Kolay

Yapılandırılmış bağlamaların (structured bindings) gücünü gösteren bir öğrenci not analizörü oluşturalım. Kodunuz boyunca çiftleri (pairs), demetleri (tuples) ve yapıları (structs) zarif bir şekilde açmak için yapılandırılmış bağlamaları kullanarak öğrenci kayıtlarını ve kurs verilerini işleyen bir sistem oluşturacaksınız.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • Student.h: Öğrencinin adı (std::string), kimliği (int) ve GNO'su (double) için genel üyelere sahip bir Student yapısı (struct) tanımlayın. Ayrıca bir ad, kimlik ve GNO alan ve bir Student yapısı döndüren createStudent adlı bir fonksiyon oluşturun.
  • GradeUtils.h: Not işleme için yardımcı fonksiyonlar oluşturun.

    Sayısal bir puan (tam sayı) alan ve üç değer içeren bir std::tuple döndüren bir getGradeInfo fonksiyonu tanımlayın: harf notu (std::string), başarı puanı (double) ve geçip geçmediği (bool). Bu not ölçeğini kullanın:

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

    Ayrıca bir kurs adı (std::string) ve puan (int) alan ve bu değerlerin bir std::pair yapısını döndüren bir makeScorePair fonksiyonu tanımlayın.

  • main.cpp: Dört girdi okuyun:
    1. Öğrenci adı (string)
    2. Öğrenci kimliği (integer)
    3. Kurs adı (string)
    4. Puan (integer)

    Ana fonksiyonunuz boyunca yapılandırılmış bağlamaları kullanın:

    1. Ad, kimlik ve 0.0 değerinde bir yer tutucu GNO ile createStudent fonksiyonunu çağırın. Döndürülen yapıyı ayrı değişkenlere açmak için yapılandırılmış bağlamaları kullanın, ardından şunu yazdırın: Student: [name] (ID: [id])
    2. Kurs adı ve puan ile makeScorePair fonksiyonunu çağırın. Çifti açmak için yapılandırılmış bağlamaları kullanın, ardından şunu yazdırın: Course: [course], Score: [score]
    3. Puan ile getGradeInfo fonksiyonunu çağırın. Üç demet öğesinin tamamını açmak için yapılandırılmış bağlamaları kullanın, ardından şunu yazdırın:
      Grade: [letter]
      Points: [points]
      Passing: [yes/no]
      (Eğer passing true ise "yes", false ise "no" yazdırın)

Örneğin, Alice, 1001, Math ve 85 girdileriyle:

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

Bob, 2002, Physics ve 55 girdileriyle:

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

Gerektiğinde <tuple> ve <utility> kütüphanelerini dahil etmeyi unutmayın. Buradaki temel nokta, yapılandırılmış bağlamaların bileşik türleri (çiftler, demetler ve yapılar) tek bir okunabilir bildirimde adlandırılmış değişkenlere nasıl açmanıza olanak tanıdığıdır.

Kopya kağıdı

Yapılandırılmış bağlamalar (C++17), dizilerden, çiftlerden (pairs), demetlerden (tuples) veya yapılardan (structs) birden fazla değerin tek bir bildirimde ayrı ayrı adlandırılmış değişkenlere açılmasını sağlar.

Temel sözdizimi, köşeli parantezlerle birlikte auto kullanır:

auto [var1, var2, ...] = composite_object;

Bir std::pair yapısını açma:

std::pair<std::string, int> person{"Alice", 25};
auto [name, age] = person;

Bir std::tuple yapısını açma:

std::tuple<int, double, char> data{42, 3.14, 'X'};
auto [num, pi, letter] = data;

std::map gibi kapsayıcılarla aralık tabanlı for döngülerinde yapılandırılmış bağlamaların kullanımı:

std::map<std::string, int> scores{{"Bob", 90}, {"Carol", 85}};
for (const auto& [student, score] : scores) {
    std::cout << student << ": " << score << "\n";
}

Genel (public) üyelere sahip yapıları (structs) açma:

struct Point {
    double x;
    double y;
};

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

auto [x, y] = getOrigin();

Dizileri açma:

int arr[3] = {1, 2, 3};
auto [a, b, c] = arr;

Kopyalamayı önlemek ve orijinal değerlerin değiştirilmesine izin vermek için referansla bağlama yapmak üzere auto& veya const auto& kullanın:

auto& [x, y] = point;  // Orijinali değiştirebilir
const auto& [name, age] = person;  // Salt okunur referans

Kendin dene

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

int main() {
    // Girdileri oku
    std::string studentName;
    int studentId;
    std::string courseName;
    int score;
    
    std::cin >> studentName;
    std::cin >> studentId;
    std::cin >> courseName;
    std::cin >> score;
    
    // TODO: createStudent fonksiyonunu name, id ve 0.0 olan yer tutucu bir GPA ile çağır
    // Struct yapısını açmak için structured bindings kullanın: auto [name, id, gpa] = ...
    // Yazdır: Student: [name] (ID: [id])
    
    
    // TODO: makeScorePair fonksiyonunu course name ve score ile çağır
    // Pair yapısını açmak için structured bindings kullanın: auto [course, sc] = ...
    // Yazdır: Course: [course], Score: [score]
    
    
    // TODO: getGradeInfo fonksiyonunu score ile çağır
    // Tuple yapısını açmak için structured bindings kullanın: auto [letter, points, passing] = ...
    // Yazdır:
    // Grade: [letter]
    // Points: [points]
    // Passing: [yes/no] (eğer passing true ise "yes", false ise "no" yazdır)
    
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler