Menu
CoddyTech

Algoritma STL

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

Algoritma STL adalah fungsi template yang bekerja pada rentang yang ditentukan oleh iterator. Algoritma ini terdapat di header <algorithm> dan <numeric>, serta bekerja dengan container apa pun yang menyediakan iterator yang kompatibel.

std::sort mengurutkan elemen dalam urutan menaik secara default:

#include <algorithm>
#include <vector>

std::vector<int> nums = {5, 2, 8, 1};
std::sort(nums.begin(), nums.end());
// nums: {1, 2, 5, 8}

std::find mencari nilai dan mengembalikan iterator ke kecocokan pertama, atau end() jika tidak ditemukan:

auto it = std::find(nums.begin(), nums.end(), 5);
if (it != nums.end()) {
    std::cout << "Found at index: " << (it - nums.begin());
}

std::transform menerapkan operasi pada setiap elemen dan menyimpan hasilnya dalam rentang tujuan:

std::vector<int> doubled(nums.size());
std::transform(nums.begin(), nums.end(), doubled.begin(),
               [](int x) { return x * 2; });
// doubled: {2, 4, 10, 16}

std::accumulate dari <numeric> menggabungkan semua elemen menjadi satu nilai:

#include <numeric>

int sum = std::accumulate(nums.begin(), nums.end(), 0);
// sum: 16 (1 + 2 + 5 + 8)

Algoritma ini menerima rentang iterator, bukan container secara langsung, sehingga cukup fleksibel untuk bekerja pada rentang parsial atau berbagai jenis container dengan kode yang sama.

challenge icon

Tantangan

Mudah

Mari buat penganalisis skor yang memproses sekumpulan angka menggunakan algoritma STL. Kamu akan membuat fungsi utilitas yang menunjukkan cara sort, find, transform, dan accumulate bekerja bersama untuk menganalisis data.

Kamu akan mengatur kodemu di dua file:

  • ScoreAnalyzer.h: Definisikan fungsi utilitas yang menggunakan algoritma STL untuk memproses vektor bilangan bulat.

    Buat fungsi bernama sortScores yang menerima std::vector<int>& dan mengurutkannya secara menaik menggunakan std::sort.

    Buat fungsi bernama findScore yang menerima const std::vector<int>& dan nilai target bertipe int. Gunakan std::find untuk mencari target. Jika ditemukan, kembalikan indeksnya (jarak dari begin). Jika tidak ditemukan, kembalikan -1.

    Buat fungsi bernama applyBonus yang menerima const std::vector<int>& dan jumlah bonus bertipe int. Gunakan std::transform untuk membuat dan mengembalikan vektor baru yang setiap skornya ditambahkan dengan bonus tersebut.

    Buat fungsi bernama calculateAverage yang menerima const std::vector<int>& dan mengembalikan rata-rata sebagai double. Gunakan std::accumulate untuk menghitung jumlahnya, lalu bagi dengan ukurannya.

    Buat fungsi bernama printVector yang menerima const std::vector<int>& dan mencetak semua elemennya, dipisahkan oleh spasi, lalu diakhiri dengan baris baru.

  • main.cpp: Baca enam input (masing-masing pada baris terpisah):
    1. Skor pertama (bilangan bulat)
    2. Skor kedua (bilangan bulat)
    3. Skor ketiga (bilangan bulat)
    4. Skor keempat (bilangan bulat)
    5. Skor yang ingin dicari (bilangan bulat)
    6. Jumlah bonus yang akan diterapkan (bilangan bulat)

    Buat vektor berisi empat skor tersebut dan tunjukkan penggunaan algoritmanya:

    1. Cetak Original: diikuti isi vektor
    2. Urutkan skor, lalu cetak Sorted: diikuti vektor yang sudah diurutkan
    3. Cari skor target dalam vektor yang sudah diurutkan. Jika ditemukan, cetak Found <value> at index <index>. Jika tidak ditemukan, cetak <value> not found
    4. Terapkan bonus pada skor yang sudah diurutkan, lalu cetak With bonus: diikuti vektor baru
    5. Hitung dan cetak rata-rata skor awal yang sudah diurutkan (sebelum bonus) sebagai Average: <value> dengan satu angka di belakang koma

Contohnya, dengan input 75, 90, 60, 85, 85, dan 5:

Original: 75 90 60 85 
Sorted: 60 75 85 90 
Found 85 at index 2
With bonus: 65 80 90 95 
Average: 77.5

Dengan input 100, 80, 95, 70, 50, dan 10:

Original: 100 80 95 70 
Sorted: 70 80 95 100 
50 not found
With bonus: 80 90 105 110 
Average: 86.2

Ingat untuk menyertakan <algorithm> untuk sort, find, dan transform, serta <numeric> untuk accumulate. Gunakan std::fixed dan std::setprecision(1) dari <iomanip> untuk memformat rata-rata.

Coba sendiri

#include <iostream>
#include <vector>
#include <iomanip>
#include "ScoreAnalyzer.h"

using namespace std;

int main() {
    // Baca enam input
    int score1, score2, score3, score4;
    int searchTarget, bonusAmount;
    
    cin >> score1;
    cin >> score2;
    cin >> score3;
    cin >> score4;
    cin >> searchTarget;
    cin >> bonusAmount;
    
    // TODO: Buat vector berisi empat skor
    
    // TODO: Cetak "Original:" diikuti isi vector
    
    // TODO: Urutkan skor dan cetak "Sorted:" diikuti vector yang sudah diurutkan
    
    // TODO: Cari skor target dalam vector yang sudah diurutkan
    // Jika ditemukan, cetak "Found <value> at index <index>"
    // Jika tidak ditemukan, cetak "<value> not found"
    
    // TODO: Tambahkan bonus ke skor yang sudah diurutkan dan cetak "With bonus:" diikuti vector baru
    
    // TODO: Hitung dan cetak rata-rata skor yang sudah diurutkan (sebelum bonus)
    // Gunakan fixed dan setprecision(1) untuk memformat output
    // Cetak dengan format "Average: <value>"
    
    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