Compiler dan editor sudah siap; sekarang saatnya menulis program C++ pertama yang lebih kaya dari sekadar “Hello World”. Pada Chapter ini kita akan membongkar anatomi program C++ modern, mulai dari #include, fungsi main(), hingga pemakaian std::vector untuk menyimpan dan mengolah data. Tujuannya adalah memastikan kita paham setiap bagian kode sebelum melangkah ke struktur data yang lebih kompleks di Section berikutnya. Program yang kita buat akan menghitung statistik sederhana dari sekumpulan nilai ujian — sebuah contoh ringkas namun nyata yang menggabungkan input, struktur data, dan operasi aritmetika.

Anatomi Program C++ #

Setiap program C++ memiliki struktur yang relatif konsisten. Bagian-bagian tersebut adalah:

Penjelasan tiap bagian:

BagianContohKegunaan
Preprocessor directive#include <iostream>Menyertakan header/library
Deklarasi fungsiint hitungTotal(int a, int b);Memberitahu compiler tentang fungsi
Definisi fungsiint hitungTotal(int a, int b) { ... }Implementasi fungsi
Fungsi main()int main() { ... }Titik masuk yang dipanggil OS
Statementint x = 5;Instruksi yang dieksekusi
Komentar// catatan atau /* ... */Dokumentasi; diabaikan compiler

Hello World Sederhana #

Sebelum program statistik, mari kita mulai dari program paling sederhana: mencetak teks ke layar. Buat berkas hello.cpp:

cpp
#include <iostream>

int main() {
    std::cout << "Halo, DSA!\n";
    return 0;
}

Output yang Dihasilkan:

text
Halo, DSA!

Penjelasan singkat:

  1. #include <iostream>: menyertakan header yang menyediakan std::cout dan std::cin.
  2. int main(): titik masuk program. Tipe kembalian int memberi sinyal sukses/gagal ke sistem operasi.
  3. std::cout << "...": operator << mengirim teks ke stream keluaran standar.
  4. return 0;: mengembalikan 0 ke OS, artinya program selesai tanpa error.

Program dengan std::vector #

Sekarang kita akan menulis program yang memproses sekumpulan data nyata. Program berikut menghitung total, rata-rata, nilai tertinggi, dan nilai terendah dari sebuah std::vector<int> yang berisi nilai ujian. Kode ini memakai beberapa fitur yang akan sering kita pakai sepanjang Course: std::vector, range-based for loop, static_cast, dan loop dengan size_t.

Aturan dan Mekanisme #

std::vector<int> menyimpan elemen int secara berurutan di blok memori kontigu. Kita mengakses elemen pertama dengan nilai[0], terakhir dengan nilai.back() atau nilai[nilai.size()-1]. Range-based for loop for (int v : nilai) menjelajah seluruh elemen dari awal sampai akhir. Karena total bisa sangat besar (untuk data besar), kita pakai tipe long long yang menampung rentang nilai lebih luas daripada int.

Kode Program #

cpp
#include <iostream>
#include <vector>

int main() {
    // Daftar nilai ujian (data sudah ada di kode, bukan dari input)
    std::vector<int> nilai = {85, 92, 78, 90, 65};

    // Hitung total dengan loop biasa
    long long total = 0;
    for (int v : nilai) {
        total += v;
    }

    // Hitung rata-rata
    double rata = static_cast<double>(total) / static_cast<double>(nilai.size());

    // Cari nilai tertinggi dan terendah
    int tertinggi = nilai[0];
    int terendah  = nilai[0];
    for (size_t i = 1; i < nilai.size(); ++i) {
        if (nilai[i] > tertinggi) tertinggi = nilai[i];
        if (nilai[i] < terendah)  terendah  = nilai[i];
    }

    // Tampilkan hasil
    std::cout << "--- Rekap Nilai ---\n";
    std::cout << "Jumlah data  : " << nilai.size() << "\n";
    std::cout << "Total         : " << total << "\n";
    std::cout << "Rata-rata    : " << rata << "\n";
    std::cout << "Tertinggi    : " << tertinggi << "\n";
    std::cout << "Terendah     : " << terendah << "\n";

    return 0;
}

Output yang Dihasilkan:

text
--- Rekap Nilai ---
Jumlah data  : 5
Total         : 410
Rata-rata    : 82
Tertinggi    : 92
Terendah     : 65

Bedah Kode Baris-per-Baris #

Mari kita telaah bagian-bagian penting dari program di atas:

  1. Baris 1–2 (#include): menyertakan <iostream> untuk std::cout dan <vector> untuk std::vector.
  2. Baris 6 (std::vector<int> nilai = {85, 92, 78, 90, 65};): membuat std::vector dengan 5 elemen awal. Ini disebut initializer list construction.
  3. Baris 9 (long long total = 0;): tipe long long (minimal 64-bit) menampung hasil penjumlahan banyak elemen tanpa overflow seperti yang mungkin terjadi pada int.
  4. Baris 10 (for (int v : nilai)): range-based for loop yang menyalin tiap elemen ke variabel v. Untuk efisiensi pada tipe besar, kita bisa pakai const int& v untuk menghindari penyalinan.
  5. Baris 15 (static_cast<double>(total)): type cast eksplisit. static_cast lebih aman dan terlihat jelas di kode dibanding cast gaya C (double)total. Cast ke double diperlukan karena pembagian dua long long di C++ menghasilkan pembulatan bilangan bulat.
  6. Baris 19 (int tertinggi = nilai[0];): inisialisasi dengan elemen pertama. Strategi ini aman asalkan vector tidak kosong. Pada produksi, kita harus memeriksa nilai.empty() terlebih dahulu.
  7. Baris 21 (for (size_t i = 1; i < nilai.size(); ++i)): pakai size_t (unsigned) untuk indeks agar konsisten dengan tipe kembalian std::vector::size() dan menghindari peringatan signed/unsigned mismatch.
  8. Baris 25–26 (if (nilai[i] > tertinggi) ...): pembandingan ketat memastikan kita memperbarui tertinggi hanya bila menemukan nilai yang benar-benar lebih besar.
  9. Baris 31–35 (std::cout << ...): kombinasi teks literal dengan variabel. Operator << dapat dirantai karena mengembalikan referensi ke stream.

Mengenal Operator dan Tipe Data #

Program di atas memakai beberapa tipe dan operator yang akan sering kita temui. Berikut ringkasannya:

TipeUkuran tipikalRentang (kasar)Kegunaan
int4 byte±2,1 miliarBilangan bulat umum
long long8 byte±9,2 × 10¹⁸Hasil penjumlahan besar
double8 byte±1,7 × 10³⁰⁸Bilangan desimal
size_t8 byte (64-bit)0 hingga 2⁶⁴-1Indeks dan ukuran container
bool1 bytetrue / falseKondisi logika
char1 byte-128 hingga 127Karakter ASCII

Penanganan Kasus Kosong #

Program sebelumnya mengasumsikan vector tidak kosong. Pada kode produksi, kita harus memeriksa nilai.empty() sebelum mengakses nilai[0]. Berikut modifikasi minimal:

cpp
if (nilai.empty()) {
    std::cerr << "Tidak ada data untuk dihitung.\n";
    return 1;
}

std::cerr mencetak ke stream error standar (stderr), terpisah dari std::cout (stdout). Memisahkan output normal dan error membantu saat kita mengarahkan output program ke file: ./program > hasil.txt tetapi pesan error tetap muncul di terminal.

Ringkasan #

Pada Chapter ini kita telah menulis program C++ pertama yang lebih dari sekadar “Hello World”:

  • Anatomi program: preprocessor directive, main(), statement, return 0.
  • std::vector: container standar untuk menyimpan data berurutan.
  • Tipe data: int, long long, double, size_t dengan kegunaan masing-masing.
  • static_cast: cara aman untuk konversi tipe eksplisit.
  • Range-based for loop: iterasi container yang ringkas.
  • Penanganan kasus kosong: cek empty() sebelum akses elemen.

Pada Chapter berikutnya kita akan membongkar proses yang terjadi ketika compiler mengubah kode sumber menjadi binary — mulai dari preprocessing, kompilasi, assembling, hingga linking. Pemahaman ini akan sangat berguna ketika kita menghadapi error linker atau masalah header.