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 kullanıma sunulan yapılandırılmış bağlamalar, tek bir bildirimde dizilerden, ikililerden, demetlerden veya yapıtlardan birden fazla değeri ayrı adlandırılmış değişkenlere açmanıza olanak tanır. Bu, bileşik verilerle çalışırken kodu daha temiz ve okunabilir hâle getirir.

Sözdizimi, 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 açma
    std::pair<std::string, int> person{"Alice", 25};
    auto [name, age] = person;
    std::cout << name << " is " << age << "\n";
    
    // Bir tuple'ı açma
    std::tuple<int, double, char> data{42, 3.14, 'X'};
    auto [num, pi, letter] = data;
    
    // Aralık tabanlı for döngülerinde açma
    std::map<std::string, int> scores{{"Bob", 90}, {"Carol", 85}};
    for (const auto& [student, score] : scores) {
        std::cout << student << ": " << score << "\n";
    }
}

Yapılandırılmış bağlamalar, herkese açık üyelere sahip diziler ve ö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;
}

Kopyaları önleyerek ve gerektiğinde özgün değerlerin değiştirilmesine olanak tanıyarak referansla bağlamak için auto& veya const auto& kullanabilirsiniz. Bu özellik, özellikle STL kapsayıcıları üzerinde yineleme yaparken veya birden çok değer döndüren işlevleri işlerken kullanışlıdır.

challenge icon

Görev

Kolay

Yapılandırılmış bağlamaların gücünü sergileyen bir öğrenci notu analizörü oluşturalım. Öğrenci kayıtlarını ve ders verilerini işleyen, kodunuz boyunca çiftleri, demetleri ve struct'ları zarif bir şekilde açmak için yapılandırılmış bağlamaları kullanan bir sistem oluşturacaksınız.

Kodunuzu üç dosyaya ayıracaksınız:

  • Student.h: Öğrencinin adı (Student), kimliği (std::string) ve GPA'sı (int) için public üyeleri olan bir double struct'ı tanımlayın. Ayrıca ad, kimlik ve GPA alan ve bir createStudent struct'ı döndüren Student adlı bir işlev oluşturun.
  • GradeUtils.h: Not işleme için yardımcı işlevler oluşturun.

    Sayısal bir puan (tamsayı) alan ve üç değer içeren bir getGradeInfo döndüren std::tuple adlı bir işlev tanımlayın: harf notu (std::string), not 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 ders adı (makeScorePair) ve puan (std::string) alan ve bu değerlerden oluşan bir int döndüren std::pair adlı bir işlev tanımlayın.

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

    main işleviniz boyunca yapılandırılmış bağlamaları kullanın:

    1. createStudent işlevini ad, kimlik ve 0.0 yer tutucu GPA değeriyle çağırın. Döndürülen struct'ı tek tek 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. makeScorePair işlevini ders adı ve puanla ç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. getGradeInfo işlevini puanla çağırın. Demetin üç öğesini de 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]
      (geçme durumu true ise "yes", false ise "no" yazdırın)

Örneğin, girdiler Alice, 1001, Math ve 85 olduğunda:

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

Girdiler Bob, 2002, Physics ve 55 olduğunda:

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

Gereken yerlerde <tuple> ve <utility> eklemeyi unutmayın. Temel çıkarım şudur: yapılandırılmış bağlamalar, bileşik türleri, çiftleri, demetleri ve struct'ları tek ve okunabilir bir bildirimde adlandırılmış değişkenlere açmanıza olanak tanır.

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'ı name, id ve yer tutucu GPA 0.0 ile çağır
    // Struct'ı açmak için structured bindings kullan: auto [name, id, gpa] = ...
    // Yazdır: Student: [name] (ID: [id])
    
    
    // TODO: makeScorePair'i course name ve score ile çağır
    // Pair'i açmak için structured bindings kullan: auto [course, sc] = ...
    // Yazdır: Course: [course], Score: [score]
    
    
    // TODO: getGradeInfo'yu score ile çağır
    // Tuple'ı açmak için structured bindings kullan: auto [letter, points, passing] = ...
    // Yazdır:
    // Grade: [letter]
    // Points: [points]
    // Passing: [yes/no] (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

Kendi başına pratik yap: Online C++ derleyicisi