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:
| Bagian | Contoh | Kegunaan |
|---|---|---|
| Preprocessor directive | #include <iostream> | Menyertakan header/library |
| Deklarasi fungsi | int hitungTotal(int a, int b); | Memberitahu compiler tentang fungsi |
| Definisi fungsi | int hitungTotal(int a, int b) { ... } | Implementasi fungsi |
Fungsi main() | int main() { ... } | Titik masuk yang dipanggil OS |
| Statement | int 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:
#include <iostream>
int main() {
std::cout << "Halo, DSA!\n";
return 0;
}Output yang Dihasilkan:
Halo, DSA!Penjelasan singkat:
#include <iostream>: menyertakan header yang menyediakanstd::coutdanstd::cin.int main(): titik masuk program. Tipe kembalianintmemberi sinyal sukses/gagal ke sistem operasi.std::cout << "...": operator<<mengirim teks ke stream keluaran standar.return 0;: mengembalikan0ke 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 #
#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:
--- Rekap Nilai ---
Jumlah data : 5
Total : 410
Rata-rata : 82
Tertinggi : 92
Terendah : 65Bedah Kode Baris-per-Baris #
Mari kita telaah bagian-bagian penting dari program di atas:
- Baris 1–2 (
#include): menyertakan<iostream>untukstd::coutdan<vector>untukstd::vector. - Baris 6 (
std::vector<int> nilai = {85, 92, 78, 90, 65};): membuatstd::vectordengan 5 elemen awal. Ini disebut initializer list construction. - Baris 9 (
long long total = 0;): tipelong long(minimal 64-bit) menampung hasil penjumlahan banyak elemen tanpa overflow seperti yang mungkin terjadi padaint. - Baris 10 (
for (int v : nilai)): range-based for loop yang menyalin tiap elemen ke variabelv. Untuk efisiensi pada tipe besar, kita bisa pakaiconst int& vuntuk menghindari penyalinan. - Baris 15 (
static_cast<double>(total)): type cast eksplisit.static_castlebih aman dan terlihat jelas di kode dibanding cast gaya C(double)total. Cast kedoublediperlukan karena pembagian dualong longdi C++ menghasilkan pembulatan bilangan bulat. - Baris 19 (
int tertinggi = nilai[0];): inisialisasi dengan elemen pertama. Strategi ini aman asalkan vector tidak kosong. Pada produksi, kita harus memeriksanilai.empty()terlebih dahulu. - Baris 21 (
for (size_t i = 1; i < nilai.size(); ++i)): pakaisize_t(unsigned) untuk indeks agar konsisten dengan tipe kembalianstd::vector::size()dan menghindari peringatan signed/unsigned mismatch. - Baris 25–26 (
if (nilai[i] > tertinggi) ...): pembandingan ketat memastikan kita memperbaruitertinggihanya bila menemukan nilai yang benar-benar lebih besar. - 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:
| Tipe | Ukuran tipikal | Rentang (kasar) | Kegunaan |
|---|---|---|---|
int | 4 byte | ±2,1 miliar | Bilangan bulat umum |
long long | 8 byte | ±9,2 × 10¹⁸ | Hasil penjumlahan besar |
double | 8 byte | ±1,7 × 10³⁰⁸ | Bilangan desimal |
size_t | 8 byte (64-bit) | 0 hingga 2⁶⁴-1 | Indeks dan ukuran container |
bool | 1 byte | true / false | Kondisi logika |
char | 1 byte | -128 hingga 127 | Karakter 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:
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_tdengan 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.