Friday, December 23, 2016

Bab 9. C++ Untuk Pemula



Rekaman (struct)







Pengantar

Pada bab ini, Anda akan belajar bagaimana mengelompokkan beberapa nilai yang berelasi dengan berbagai tipe data. C++ menyediakan sebuah tipe data terstruktur yang lain, dinamakan struct (beberapa bahasa pemrograman menggunakan istilah “rekaman”), untuk mengelompokkan item-item berelasi yang berbeda tipe. Array merupakan struktur data homogen; struct adalah struktur data heterogen.


Rekaman (struct)

Dimisalkan bahwa Anda ingin menuliskan sebuah program untuk memproses data mahasiswa. Rekaman mahasiswa terdiri-dari nama mahasiswa, NIM (ID mahasiswa), IPK, matakuliah yang diambil, dan nilai matakuliah. Jadi, pelbagai komponen berkaitan dengan seorang mahasiswa. Tiap komponen bisa berbeda tipe. Sebagai contoh, nama mahassiwa adalah sebuah string, dan IPK adalah sebuah angka titik-mengambang (pecahan). Karena tiap komponen berbeda tipe, Anda tidak dapat menggunakan sebuah array untuk mengelompokkan item-item yang berkaitan dengan seorang mahasiswa. C++ menyediakan suatu tipe data terstruktur yang dinamai struct untuk mengelompokkan item-item pelbagai tipe. Pengelompokan komponen-komponen yang berelasi tetapi berbeda tipe memiliki beberapa keuntungan. Sebagai contoh, sebuah variabel tunggal dapat melewatkan semua komponen sebagai parameter kepada suatu fungsi.

struct: Sebuah koleksi yang terdiri-dari sejumlah komponen dimana tiap komponen dapat diakses lewat namanya. Setiap komponen bisa berbeda tipe.

Setiap komponen sebuah struct disebut dengan anggota struct. Sintaks umum dari sebuah struct dalam C++ adalah:

struct namaStruct
{
    tipeData1 pengenal1;
    tipeData2 pengenal2;
    .
    .
    .
    tipeDatan pengenaln;
};

Dalam C++, struct merupakan katakunci. Setiap anggota dari struct, meskipun diapit oleh sepasang kurung kurawal (yang membentuk sebuah blok), tidak dipandang sebagai sebuah statemen gabungan. Jadi, sebuah semikolon (yang berada setelah kurung kurawal kanan) sangat penting untuk mengakhiri statemen struct. Semikolon di akhir definisi struct merupakan bagian dari sintaks.

Statemen:

struct tipeKaryawan
{
    string namaPertama;
    string namaAkhir;
    string alamat1;
    string alamat2;
    double gaji;
    string KTP;
};

mendefinisikan sebuah struct tipeKaryawan dengan enam anggota. Anggota namaPertama, namaAkhir, alamat1, alamat2, dan KTP semua bertipe string, dan anggota gaji bertipe double.

Sama seperti sembarang definisi, sebuah struct adalah suatu definisi, bukan deklarasi. Jadi, ia mendefinisikan satu tipe data; tidak ada memori yang dialokasikan.


Gambar 9.1 struct mahasiswaBaru dan struct mahasiswa


Begitu tipe data didefinisikan, Anda dapat mendeklarasikan variabel bertipe data itu. Sekarang, akan didefinisikan sebuah tipe struct, tipeMahasiswa, dan kemudian dideklarasikan dua variabel bertipe data tipeMahasiswa.

struct tipeMahasiswa
{
    string namaPertama;
    string namaAkhir;
    char nilaiMtKuliah;
    int skorUjian;
    int skorPemrograman;
    double IPK;
};

//deklarasi variabel
tipeMahasiswa mahasiswaBaru;
tipeMahasiswa mahasiswa;

Kedua statemen tersebut mendeklarasikan dua variabel struct, mahasiswaBaru dan mahasiswa, yang bertipe tipeMahasiswa. Memori yang dialokasikan cukup besar untuk menyimpan namaPertama, namaAkhir, nilaiMtKuliah, skorUjian, skorPemrograman, dan IPK (lihat Gambar 9.11).

Mengakses Anggota struct
Dalam array, Anda mengakses sebuah komponen menggunakan nama array yang diikuti dengan posisi relatif (indeks) komponen. Nama array dan indeks dipisahkan oleh kurung siku. Untuk mengakses sebuah anggota struktur (komponen), Anda menggunakan nama variabel struct diikuti dengan nama anggota; kedua nama ini dipisahkan oleh sebuah titik. Sintaks untuk mengakses sebuah anggota struct adalah:

namaVariabelStruct.namaAnggota

namaVariabelStruct.namaAnggota sama seperti variabel biasa. Sebagai contoh, mahasiswaBa-ru.nilaiMtKuliah adalah sebuah variabel bertipe char, mahasiswaBaru.namaPertama adalah sebuah variabel string, dan seterusnya. Akibatnya, Anda dapat melakukan apapun terhadap anggota struct seperti yang Anda lakukan terhadap variabel biasa. Anda bisa, misalnya, menggunakannya di dalam statemen penugasan atau di dalam statemen masukan/keluaran.

Dalam C++, dot atau titik (.) merupakan sebuah operator yang dinamakan dengan operator akses anggota atau operator akses keanggotaan.


Gambar 9.2 struct mahasiswaBaru


Dimisalkan bahwa Anda ingin menginisialisasi anggota IPK dari mahasiswaBaru dengan 0.0. Statemen berikut melakukan tugas ini:

mahasiswaBaru.IPK = 0.0;

Sama halnya, statemen:

mahasiswaBaru.namaPertama = "Rico";
mahasiswaBaru.namaAkhir = "Chandra";

menyimpan “Rico” di dalam anggota namaPertama dan “Chandra” di dalam anggota namaAkhir dari mahasiswaBaru.

Setelah ketiga statemen tersebut dieksekusi, mahasiswaBaru menjadi seperti ditunjukkan pada Gambar 9.2.

Statemen:

cin >> mahasiswaBaru.namaPertama;

membaca string berikutnya dari divais masukan standar dan menyimpannya di dalam mahasiswaBaru.namaPertama.

Statemen:

cin >> mahasiswaBaru.skorUjian >> mahasiswaBaru.skorPemrograman;

membaca dua nilai integer dari papanketik dan menyimpannya di dalam mahasiswaBaru.skor-Ujian dan mahasiswaBaru.skorPemrograman.

Dimisalkan bahwa skor adalah sebuah variabel bertipe int. Statemen:

skor = (mahasiswaBaru.skorUjian + mahasiswaBaru.skorPemrograman) / 2;

menugaskan rerata dari mahasiswaBaru.skorUjian dan mahasiswaBaru.skorPemrograman kepada skor.

Statemen berikut menentukan nilai matakuliah dan menyimpannya di dalam mahasiswa-Baru.nilaiMtKuliah:

if (skor >= 90)
    mahasiswaBaru. nilaiMtKuliah = 'A';
else if (skor >= 80)
    mahasiswaBaru. nilaiMtKuliah = 'B';
else if (skor >= 70)
    mahasiswaBaru. nilaiMtKuliah = 'C';
else if (skor >= 60)
    mahasiswaBaru. nilaiMtKuliah = 'D';
else
    mahasiswaBaru.nilaiMtKuliah = 'F';

Penugasan
Anda dapat menugaskan nilai dari satu variabel struct kepada variabel struct lain yang bertipe sama menggunakan sebuah statemen penugasan. Dimisalkan bahwa mahasiswaBaru seperti ditunjukkan pada Gambar 9.3.

Statemen:

mahasiswa = mahasiswaBaru;

menyalin isi dari mahasiswaBaru ke dalam mahasiswa. Setelah statemen penugasan ini dieksekusi, nilai dari mahasiswa ditampilkan pada Gambar 9.4.


Gambar 9.3 struct mahasiswaBaru

Pada kenyataannya, statemen penugasan:

mahasiswa = mahasiswaBaru;

ekivalen dengan beberapa statemen berikut:

mahasiswa.namaPertama = mahasiswaBaru.namaPertama;
mahasiswa.namaAkhir = mahasiswaBaru.namaAkhir;
mahasiswa.skorMtKuliah = mahasiswaBaru.skorMtKuliah;
mahasiswa.skorUjian = mahasiswaBaru.skorUjian;
mahasiswa.skorPemrograman = mahasiswaBaru. skorPemrograman;
mahasiswa.IPK = mahasiswaBaru.IPK;


Gambar 9.4 struct mahasiswa


Perbandingan (Operator Relasional)
Untuk membandingkan variabel-variabel struct, Anda membandingkannya anggota demi anggota. Sebagai contoh, dimisalkan bahwa mahasiswaBaru dan mahasiswa dideklarasikan seperti sebelumnya. Lebih lanjut, dimisalkan bahwa Anda ingin melihat apakah mahasiswa dan mahasiswaBaru merujuk ke mahasiswa yang sama. Sekarang, mahasiswaBaru dan mahasiswa akan merujuk ke mahasiswa yang sama jika keduanya memiliki nama pertama sama dan nama akhir yang sama. Untuk membandingkan nilai-nilai dari mahasiswa dan mahasiswaBaru, Anda harus membandingkannya anggota demi anggota, sebagai berikut:

if (mahasiswa.namaPertama == mahasiswaBaru.namaPertama &&
    mahasiswa.namaAkhir == mahasiswaBaru.namaAkhir)
    .
    .
    .

Meskipun Anda dapat menggunakan sebuah statemen penugasan untuk menyalin isi dari satu struct ke dalam struct lain yang bertipe sama, Anda tidak bisa menggunakan operator relasional pada variabel struct. Oleh karena itu, berikut adalah tindakan ilegal:

if (mahasiswa == mahasiswaBaru) //salah
    .
    .
    .

Masukan/Keluaran
Data di dalam sebuah variabel struct harus dibaca satu anggota per waktu. Sama halnya, isi dari sebuah variabel struct harus ditulis satu anggota per waktu.

Anda telah melihat bagaimana membaca data ke dalam sebuah variabel struct. Sekarang, akan dilihat bagaimana menampilkan sebuah variabel struct. Statemen:

cout << mahasiswaBaru.namaPertama << " " << mahasiswaBaru.namaAkhir
     << " " << mahasiswaBaru.nilaiMtKuliah
     << " " << mahasiswaBaru.skorUjian
     << " " << mahasiswaBaru.skorPemrograman
     << " " << mahasiswaBaru.IPK << endl;

menampilkan isi dari variabel struct, mahasiswaBaru.

Variabel struct dan Fungsi
Ingat bahwa array dilewatkan hanya lewat referensi, dan sebuah fungsi tidak dapat menghasilkan nilai balik berupa sebuah array. Namun:
·         Sebuah variabel struct dapat dilewatkan sebagai parameter baik lewat nilai maupun lewat referensi.
·         Sebuah fungsi dapat menghasilkan nilai balik bertipe struct.
Fungsi berikut membaca dan menyimpan nama pertama, nama akhir, skor ujian, skor pemrograman, dan IPK dari seorang mahasiswa. Fungsi ini juga menentukan nilai matakuliah mahasiswa dan menyimpannya di dalam anggota nilaiMtKuliah.

void baca(tipeMahasiswa& mahasiswa)
{
    int skor;

    cin >> mahasiswa.namaPertama >> mahasiswa.namaAkhir;
    cin >> mahasiswa.skorUjian >> mahasiswa.skorPemrograman;
    cin >> mahasiswa.IPK;

    skor = (mahasiswa.skorUjian + mahasiswa.skorPemrograman) / 2;

    if (skor >= 90)
        mahasiswa.nilaiMtKuliah = 'A';
    else if (skor >= 80)
        mahasiswa.nilaiMtKuliah = 'B';
    else if (skor >= 70)
        mahasiswa.nilaiMtKuliah = 'C';
    else if (skor >= 60)
        mahasiswa.nilaiMtKuliah = 'D';
    else
        mahasiswa.nilaiMtKuliah = 'F';
}

Statemen:

baca(mahasiswaBaru)

memanggil fungsi baca. Fungsi baca menyimpan informasi terkait di dalam variabel mahasiswaBaru.

Sama halnya, Anda dapat menuliskan sebuah fungsi yang akan menampilkan isi dari sebuah variabel struct. Sebagai contoh, fungsi berikut menampilkan isi dari sebuah variabel struct bertipe tipeMahasiswa pada monitor:

void tampilMahasiswa(tipeMahasiswa mahasiswa)
{
cout << mahasiswa.namaPertama << " " << mahasiswa.namaAkhir
     << " " << mahasiswa.nilaiMtKuliah
     << " " << mahasiswa.skorUjian
     << " " << mahasiswa.skorPemrograman
     << " " << mahasiswa.IPK << endl;
}


Array di dalam struct
Senarai merupakan himpunan elemen yang bertipe sama. Jadi, sebuah senarai mempunyai dua hal yang berkaitan dengannya: nilai-nilai (yaitu, elemen-elemen) dan panjang. Karena nilai dan panjang keduanya berkaitan dengan sebuah senarai, Anda dapat mendefinisikan sebuah struct yang memuat kedua item tersebut.

const int UKURAN_ARRAY = 1000;
struct tipeSenarai
{
    int elemSenarai[UKURAN_ARRAY];       //array yang memuat senarai
    int panjangSenarai;                  //panjang senarai
};

Statemen berikut mendeklarasikan intSenarai sebagai sebuah variabel struct bertipe tipeSenarai (lihat Gambar 9.5):

tipeSenarai intSenarai;

Variabel intSenarai mempunyai dua anggota: elemSenarai, sebuah array yang memuat 1000 komponen bertipe int, dan panjangSenarai, bertipe int. Selain itu, intSenarai.elemSenarai mengakses anggota elemSenarai, dan intSenarai.panjangSenarai mengakses anggota panjangSenarai.


Gambar 9.5 Variabel struct intSenarai


Perhatikan beberapa statemen berikut:

intSenarai.panjangSenarai = 0;           //Baris 1
intSenarai.elemSenarai[0] = 12;          //Baris 2
intSenarai.panjangSenarai++;             //Baris 3
intSenarai.elemSenarai[1] = 37;          //Baris 4
intSenarai.panjangSenarai++;             //Baris 5

Statemen pada baris 1 menetapkan nilai dari panjangSenarai menjadi 0. Statemen pada baris 2 menyimpan 2 di dalam komponen pertama dari array elemSenarai. Statemen pada baris 3 menginkremen nilai dari panjangSenarai sebesar 1. Arti dari statemen lain sama. Setelah kelima statemen ini dieksekusi, intSenarai akan seperti yang ditunjukkan pada Gambar 9.6.


Gambar 9.6 intSenarai setelah statemen pada baris 1 sampai baris 5 dieksekusi


Selanjutnya, akan dituliskan algoritma pencarian sekuensial untuk menentukan apakah sebuah item berada di dalam senarai. Jika itemCari ditemukan di dalam senarai, maka fungsi menghasilkan lokasinya di dalam senarai; sebaliknya, fungsi menghasilkan -1.

int cariSek(const tipeSenarai& senarai, int itemCari)
{
    int lok;
    bool ditemukan = false;

    for (lok = 0; lok < senarai.panjangSenarai; lok++)
        if (senarai.elemSenarai[lok] == itemCari)
        {
            ditemukan = true;
            break;
        }

    if (ditemukan)
        return lok;
    else
        return -1;
}

Pada fungsi ini, karena panjangSenarai merupakan sebuah anggota dari senarai, Anda mengaksesnya dengan senarai.panjangSenarai. Sama halnya, Anda dapat mengakses sebuah elemen senarai melalui senarai.elemSenarai[lok].

Perhatikan bahwa daftar parameter formal dari fungsi cariSek dideklarasikan sebagai sebuah parameter referensi konstan. Ini berarti bahwa senarai menerima alamat dari parameter aktual terkait, tetapi senarai tidak dapat memodifikasi parameter aktual tersebut.

Dimisalkan bahwa sebuah struct memiliki beberapa anggota data yang memerlukan memori yang cukup besar untuk menyimpan data, dan Anda perlu melewatkan sebuah variabel bertipe struct dengan nilai. Parameter formal terkait akan menerima salinan dari data dari variabel tersebut. Kompiler kemudian akan mengalokasikan memori untuk parameter formal untuk menyalin nilai dari parameter aktual. Operasi ini akan memerlukan memori yang cukup besar untuk ruang penyimpanan dan waktu komputasi yang signifikan untuk menyalin nilai dari parameter aktual ke dalam parameter formal.

Di sisi lain, jika sebuah variabel dilewatkan dengan referensi, maka parameter formal hanya akan menerima alamat dari parameter aktual. Oleh karena itu, cara efisien dalam melewatkan sebuah variabel sebagai parameter adalah lewat referensi. Jika sebuah variabel dilewatkan dengan referensi, maka ketika parameter formal berubah, maka parameter aktual juga berubah. Kadangkala, Anda tidak ingin fungsi melakukan perubahan terhadap nilai dari parameter aktual. Dalam C++, Anda dapat melewatkan sebuah variabel dengan referensi dan tetap menjaga agar nilainya tidak berubah. Ini dilakukan menggunakan katakunci const di dalam deklarasi parameter formal, seperti yang telah ditunjukkan di dalam definisi fungsi cariSek.

  
struct di dalam Array
Dimisalkan bahwa sebuah perusahaan memiliki 50 karyawan tetap. Anda perlu menampilkan gaji bulanan dan menjejak berapa banyak uang yang telah dibayarkan kepada setiap karyawan. Pertama, akan didefinisikan rekaman seorang karyawan berikut:

struct tipeKaryawan
{
    string namaPertama;
    string namaAkhir;
    int IDPersonal;
    string IDPerusahaan;
    double gajiTahunan;
    double gajiBulanan;
    double totalGaji;
    double bonusBulanan;
};

Setiap karyawan memiliki anggota-anggota (komponen-komponen) berikut: nama pertama, nama akhir, ID personal, ID perusahaan, gaji tahunan, gaji bulanan, total gaji yang telah dibayarkan, dan bonus bulanan.

Karena Anda memiliki 50 karyawan dan tipe data tiap karyawan sama, Anda dapat menggunakan sebuah array yang memuat 50 komponen untuk memproses data karyawan tersebut.

tipeKaryawan karyawan[50];

Statemen ini mendeklarasikan sebuah array karyawan yang memuat 50 komponen bertipe tipeKaryawan (lihat Gambar 9.7). Setiap elemen dari karyawan adalah sebuah struct. Gambar 9.7 juga menunjukkan karyawan[2].



Gambar 9.7 Array karyawan


Dimisalkan bahwa Anda juga memiliki deklarasi berikut:

int kounter;

Lebih lanjut, dimisalkan bahwa data awal setiap karyawan, nama pertama, nama akhir, ID personal, ID perusahaan, dan gaji tahunan, tersedia di dalam sebuah file. Diasumsikan bahwa data setiap karyawan disimpan di dalam sebuah file, katakanlah, karyawan.dat. Kode C++ berikut menempatkan data ke dalam aray karyawan. Diasumsikan bahwa, awalnya, totalGaji adalah 0 dan bahwa bonus bulanan ditentukan berdasarkan kinerja per bulan.

ifstream infile; //variabel aliran masukan

//diasumsikan bahwa file karyawan.dat telah dibukan
for (kounter = 0; kounter < 50; kounter++)
{
    infile >> karyawan[kounter].namaPertama
           >> karyawan[kounter].namaAkhir
           >> karyawan[kounter].IDPersonal
           >> karyawan[kounter].IDPerusahaan
           >> karyawan[kounter].gajiTahunan;
                   
    karyawan[kounter].gajiBulanan =
        karyawan[kounter].gajiTahunan / 12;

    karyawan[kounter].totalGaji = 0.0;
    karyawan[kounter].bonusBulanan = 0.0;
}

Dimisalkan bahwa untuk bulan tertentu, bonus bulanan telah tersimpan di dalam tiap rekaman karyawan, dan Anda perlu menghitung gaji bulanan dan memperbarui totalGaji. Loop berikut menghitung dan menampilkan gaji tiap karyawan:

double gaji; //variabel untuk menghitung gaji

for (kounter = 0; kounter < 50; kounter++)
{
    cout << karyawan[kounter].namaPertama << " "
         << karyawan[kounter].namaAkhir << " ";

    gaji = karyawan[kounter].gajiBulanan +
           karyawan[kounter].bonusBulanan;

    karyawan[kounter].totalGaji =
        karyawan[kounter].totalGaji +
        gaji;

    cout << setprecision(2) << payCheck << endl;
}


struct di dalam struct
Anda telah melihat bagaimana struktur data struct dan array dapat dikombinasikan untuk mengorganisir informasi. Anda juga telah melihat beberapa contoh dimana sebuah anggota struct merupakan sebuah array, dan tipe array adalah sebuah struct. Pada bagian ini, Anda akan belajar tentang beberapa situasi dimana sangat menguntungkan untuk mengorganisir data di dalam sebuah struct menggunakan struct lain.

Sekarang, perhatikan rekaman karyawan berikut:

struct tipeKaryawan
{
    string namaPertama;
    string namaTengah;
    string namaAkhir;
    string IDPersonal;
    string alamat1;
    string alamat2;
    string kota;
    string propinsi;
    string kodePos;
    int bulanKerja;
    int hariKerja;
    int tahunKerja;
    int bulanKeluar;
    int hariKeluar;
    int tahunKeluar;
    string telp;
    string seluler;
    string fax;
    string pager;
    string email;
    string IDPerusahaan;
    double gaji;
};

Seperti yang dapat Anda lihat, banyak informasi yang dapat dimuat ke dalam sebuah struct. Struktur ini memiliki 22 anggota. Beberapa anggota struct ini akan diakses lebih sering daripada yang lain, dan beberapa anggota berelasi lebih dekat dari yang lain. Sebagai contoh, tanggal kerja dan tanggal keluar bertipe data int. Selanjutnya, akan diorganisir-ulang struct ini sebagai berikut:

struct namaTipe
{
    string pertama;
    string tengah;
    string akhir;
};

struct tipeAlamat
{
    string alamat1;
    string alamat2;
    string kota;
    string propinsi;
    string kodePos;
};

struct tipeTanggal
{
    int bulan;
    int hari;
    int tahun;
};

struct tipeKontak
{
    string telp;
    string seluler;
    string fax;
    string pager;
    string email;
};

Anda telah memisahkan tipe nama, tipe alamat, dan tipe kontak karyawan ke dalam sub-sub kategori. Selanjutnya, akan dibangun-ulang rekaman karyawan sebagai berikut:

struct tipeKaryawan
{
    namaTipe nama;
    string IDPersonal;
    tipeAlamat alamat;
    tipeTanggal tanggalKerja;
    tipeTanggal tanggalKeluar;
    tipeKontak kontak;
    string IDPerusahaan;
    double gaji;
};


Gambar 9.8 Variabel struct karyawanBaru

Informasi di dalam struct karyawan ini lebih mudah untuk dikelola daripada yang sebelumnya. Beberapa dari struct ini dapat digunakan-ulang untuk membangun struct lain. Sebagai contoh, dimisalkan bahwa Anda ingin mendefinisikan sebuah rekaman pelanggan. Setiap pelanggan memiliki nama pertama, nama akhir, dan nama tengah, sama seperti alamat dan kontak. Anda dapat membangun rekaman pelanggan menggunakan struct tipeNama, tipeAlamat, tipeKontak, dan lainnya.

Selanjutnya, akan dideklarasikan sebuah variabel bertipe tipeKaryawan dan didiskusikan bagaimana mengakses anggota anggotanya. Perhatikan statemen berikut:

tipeKaryawan karyawanBaru;

Statemen ini mendeklarasikan karyawanBaru sebagai sebuah variabel struct bertipe tipeKaryawan (lihat Gambar 9.8).

Statemen:

karyawanBaru.gaji = 45678.00;

menetapkan gaji dari karyawanBaru menjadi 45678.00. Statemen-statemen:

karyawanBaru.nama.pertama = "Vivian";
karyawanBaru.nama.tengah = "Monica";
karyawanBaru.nama.akhir = "Siahaan";

menetapkan pertama, tengah, dan akhir dari karyawanBaru menjadi “Vivian”, “Monica”, dan “Siahaan”. Perhatikan bahwa karyawanBaru memiliki anggota bernama nama. Anda mengakses anggota ini melalui karyawanBaru.nama. Perhatikan pula bahwa karyawanBaru.nama merupakan sebuah struct dan memiliki tiga anggota. Anda menetapkan akses keanggotaan untuk mengakses anggota pertama dari struct karyawanBaru.nama. Jadi, karyawanBaru.nama.pertama adalah anggota di mana Anda menyimpan nama pertama.

Statemen:

cin >> karyawanBaru.nama.pertama;

membaca dan menyimpan sebuah string ke dalam karyawanBaru.nama.pertama. Statemen:

karyawanBaru.gaji = karyawanBaru.gaji * 1.05;

memperbarui gaji dari karyawanBaru.

Statemen berikut mendeklarasikan karyawan sebagai sebuah array yang memuat 100 komponen, dimana tiap komponen bertipe tipeKaryawan.

tipeKaryawan karyawan[100];

Loop for:

for (int j = 0; j < 100; j++)
    cin >> karyawan[j].nama.pertama >> karyawan[j].nama.tengah
        >> karyawan[j].nama.akhir;

membaca dan menyimpan 100 karyawan di dalam array karyawan. Karena karyawan adalah sebuah array, untuk mengakses sebuah komponen, Anda menggunakan indeks. Sebagai contoh, karyawan[50] merupakan komponen ke-51 dari array karyawan (ingat bahwa indeks array dimulai dari 0). Karena karyawan[50] merupakan sebuah struct, Anda bisa menerapkan kriteria akses keanggotaan untuk mangakses anggota tertentu.


CONTOH PEMROGRAMAN: Analisa Data Penjualan

Sebuah perusahaan memiliki enam penjual. Setiap bulan, mereka berpergian untuk menjual produk perusahaan. Di akhir tiap bulan, total penjualan untuk tiap orang, berikut dengan ID penjual dan bulan, direkam di dalam sebuah file. Di akhir tiap tahun, manajer perusahaan ingin melihat laporan ini dengan format tabular berikut:

--------------- Laporan Penjualan Tahunan ----------------

Penjualan Maks Kategori Penjual: ID = 57373, Jumlah = Rp. 10169.00 (dikali Rp. 10 juta).

Penjualan Maks Kategori Quarter = 3, Jumlah = Rp. 18743.00 (dikali Rp. 10 juta).


Pada laporan ini, QT1 singkatan untuk quarter 1 (bulan 1 sampai 3), QT2 singkatan untuk quarter 2 (bulan 4 sampai 6), QT3 singkatan untuk quarter 3 (bulan 7 sampai 9), dan QT4 untuk quarter 4 (bulan 10 sampai 12).

ID penjual disimpan di dalam suatu file; data penjualan disimpan di dalam file lain. Data penjualan dalam format berikut:

IDPenjual     bulan jumlahPenjualan
.
.
.

Lebih lanjut, data penjualan tidak terurut; dan hanya diurutkan secara ID.

Contoh data penjualan adalah:

12345 1 893
32214 1 343
23422 3 903
57373 2 893
.
.
.

Akan dituliskan sebuah program yang menghasilkan keluaran dalam format tersebut.

Masukan: Suatu file yang memuat ID tiap penjual dan sebuah file yang memuat data penjualan.

Keluaran: Sebuah file yang memuat laporan penjualan tahunan.


Analisa Masalah dan Perancangan Algoritma
Berdasarkan permasalahan, jelaslah bahwa komponen-komponen utama untuk tiap penjual adalah ID penjual, jumlah penjualan per tiga bulan (quarter), total penjualan tahunan. Karena tiap komponen berbeda tipe, Anda dapat mengelomponnya dengan bantuan sebuah struct, yang didefinisikan sebagai berikut:

struct rekamanPenjual
{
    string ID;                    //ID penjual
    double penjualanQuarter[4];   //array untuk menyimpan total
                                  //penjualan untuk tiap quarter
  
    double totalPenjualan; //jumlah penjualan tahunan penjual
};

Karena ada enam penjual, Anda dapat menggunakan sebuah array yang memuat enam komponen, dimana di dalamnya tiap komponen bertipe rekamanPenjual, seperti didefinisikan sebagai berikut:

rekamanPenjual daftarPenjual[JUMLAH_PENJUAL];

dimana nilai dari JUMLAH_PENJUAL adalah 6.

Karena program meminta Anda untuk mencari total penjualan perusahaan untuk tiap quarter, Anda memerlukan sebuah array yang memuat empat komponen untuk menyimpan data. Perhatikan bahwa data ini akan dipakai untuk menentukan quarter dimana penjualan maksimum dicapai. Oleh karena itu, program juga memerlukan array berikut:

double totalPenjualanQuarter[4];

Ingat bahwa dalam C++, indeks array dimulai dari 0. Oleh karena itu, totalPenjualanQuarter[0] menyimpan data untuk quarter 1, totalPenjualanQuarter[1] menyimpan data untuk quarter 2, dan seterusnya.

Array daftarPenjual ditunjukkan pada Gambar 9.9.
  


Gambar 9.9 Array daftarPenjual

Langkah pertama pada program adalah membaca ID penjual ke dalam array daftarPenjual dan menginisialisasi penjualan quarter dan total penjualan untuk tiap penjual dengan 0. Setelah langkah ini, array daftarPenjual ditunjukkan pada Gambar 9.10.


Gambar 9.10 Array daftarPenjual setelah inisialisasi


Langkah berikutnya adalah memproses data penjualan. Pemrosesan data penjualan cukup sederhana. Untuk setiap entri di dalam file yang memuat data penjualan:
1.      Membaca ID penjual, bulan, dan penjualan per bulan.
2.      Melakukan pencarian pada array daftarPenjual untuk mencari lokasi komponen yang terkait dengan penjual tertentu.
3.      Menentukan quarter yang terkait dengan bulan tertentu.
4.      Memperbarui penjualan quarter dengan menambahkan penjualan untuk bulan tertentu.
Setelah file data penjualan diproses:
1.      Menghitung total penjualan tiap penjual.
2.      Menghitung total penjualan tiap quarter.
3.      Menampilkan laporan.
Diskusi ini diterjemahkan menjadi algoritma berikut:
1.      Menginisialisasi array daftarPenjual.
2.      Memproses data penjualan.
3.      Menghitung total penjualan tiap quarter.
4.      Menghitung total penjualan tiap penjual.
5.      Menampilkan laporan.
6.      Menghitung dan menampilkan penjualan maksimum dari secara penjual.
7.      Menghitung dan menampilkan penjualan maksimum dari secara quarter.

Untuk mereduksi kompleksitas program utama, akan dituliskan sebuah fungsi terpisah untuk ketujuh langkah tersebut.


Fungsi inisialisasi
Fungsi ini membaca ID penjual dari file masukan dan menyimpan ID penjual di dalam array daftarPenjual. Ia juga menginisialisasi penjualan tiap quarter dan  menginisialisasi total penjualan untuk tiap penjual dengan 0. Definisi dari fungsi ini adalah:

void inisialisasi(ifstream& indata, rekamanPenjual list[], int ukuranList)
{
    int indeks;
    int quarter;

    for (indeks = 0; indeks < ukuranList; indeks++)
    {
        indata >> list[indeks].ID; //mendapatkan ID penjual
        for (quarter = 0; quarter < 4; quarter++)
            list[indeks].penjualanQuarter[quarter] = 0.0;
        list[indeks].totalPenjualan = 0.0;
    }
} //akhir inisialisasi

Fungsi dapatData
Fungsi ini membaca data penjualan dari file masukan dan menyimpan informasi terkait di dalam array daftarPenjualan. Algoritma untuk fungsi ini adalah:
1.      Membaca ID penjual, bulan, dan penjualan per bulan.
2.      Melakukan pencarian terhadap array daftarPenjual untuk mencari lokasi komponen yang terkait dengan penjual. (Karena ID penjual tidak terurut, akan digunakan pencarian sekuensial untuk melakukan pencarian).
3.      Menentukan quarter terkait untuk bulan tertentu.
4.      Memperbarui penjualan quarter dengan menambahkan penjualan bulan tertentu.

Dimisalkan bahwa entri yang dibaca adalah:

57373 2 350

Di sini, ID penjual adalah 57373, bulan 2, dan jumlah penjualan 350. Dimisalkan bahwa array daftarPenjual ditunjukkan pada Gambar 9.11.


Gambar 9.11 Array daftarPenjual


Sekarang, ID 57373 berkaitan dengan komponen array daftarPenjual[3], dan bulan 2 berkaitan dengan quarter 1. Oleh karena itu, Anda menambahkan 350 kepada 354.80 untuk mendapatkan jumlah penjualan yang baru, 740.80. Setelah memproses entri ini, array daftarPenjual ditampilkan pada Gambar 9.12.

Definisi atas fungsi dapatData adalah:

void dapatData(ifstream& infile, rekamanPenjual list[], int ukuranList)
{
    int indeks;
    int quarter;
    string sID;
    int bulan;
    double jumlah;

    infile >> sID; //mendapatkan ID penjual

    while (infile)
    {
        infile >> bulan >> jumlah; //mendapatkan bulan penjualan
                                   //dan jumlah penjualan

        for (indeks = 0; indeks < ukuranList; indeks++)
            if (sID == list[indeks].ID)
                break;

        if (1 <= bulan && bulan <= 3)
            quarter = 0;
        else if (4 <= bulan && bulan <= 6)
            quarter = 1;
        else if (7 <= bulan && bulan <= 9)
            quarter = 2;
        else
            quarter = 3;

               if (indeks < ukuranList)
            list[indeks].penjualanQuarter[quarter] += jumlah;
        else
            cout << "ID penjual tak-valid." << endl;

        infile >> sID;
    } //akhir while
} //akhir dapatData


Gambar 9.12 Array daftarPenjual setelah pemrosesan entri 57373 2 350


Fungsi penjualanPerQuarter
Fungsi bertugas untuk mencari total penjualan perusahaan untuk tiap quarter. Untuk menemukan total penjualan untuk tiap quarter, Anda menambahkan jumlah penjualan tiap penjual pada quarter tersebut. Jelaslah, fungsi ini harus memiliki akses terhadap daftarPenjual dan array totalPenjualanQuarter. Fungsi ini juga perlu mengetahui jumlah baris di dalam tiap array. Jadi, fungsi ini memiliki tiga parameter. Definisi atas fungsi ini adalah:

void penjualanPerQuarter(rekamanPenjual list[], int ukuranList,
                         double totalPenjualanQuarter[])
{
    int quarter;
    int indeks;

    for (quarter = 0; quarter < 4; quarter++)
        totalPenjualanQuarter[quarter] = 0.0;
   
    for (quarter = 0; quarter < 4; quarter++)
        for (indeks = 0; indeks < ukuranList; indeks++)
            totalPenjualanQuarter[quarter] +=
                list[indeks].penjualanQuarter[quarter];
} //akhir penjualanPerQuarter


Fungsi totalPenjualanPerOrang
Fungsi ini mencari total penjualan tahunan tiap penjual. Untuk mencari jumlah penjualan tahunan tiap penjual, Anda menambahkan penjualan tiap penjual untuk empat quarter. Jelaslah bahwa fungsi harus memiliki akses terhadap array daftarPenjual. Fungsi ini juga perlu mengetahui ukuran array. Jadi, fungsi ini memiliki dua parameter. Definisi atas fungsi ini adalah:

void totalPenjualanPerOrang(rekamanPenjual list[], int ukuranList)
{
    int indeks;
    int quarter;

    for (indeks = 0; indeks < ukuranList; indeks++)
        for (quarter = 0; quarter < 4; quarter++)
            list[indeks].totalPenjualan +=
                list[indeks].penjualanQuarter[quarter];
} //akhir totalPenjualanPerOrang

Fungsi tampilLaporan
Fungsi ini menampilkan laporan tahunan dalam format tertentu. Algoritma dalam pseudocode adalah:
1.      Menampilkan kepala, yaitu tiga baris pertama pada keluaran.
2.      Menampilkan data untuk tiap penjual.
3.      Menampilkan baris terakhir pada tabel.

Perhatikan bahwa dua fungsi berikutnya akan menghasilkan dua baris terakhir pada keluaran program.

Jelaslah bahwa fungsi tampilLaporan harus memiliki akses terhadap array daftarPenjual dan array totalPenjualanQuarter. Selain itu, karena keluaran akan disimpan di dalam sebuah file, fungsi ini harus memiliki akses terhadap variabel ofstream yang dikaitkan dengan file keluaran. Jadi, fungsi ini memiliki empat parameter: sebuah parameter yang terkait dengan array daftarPenjual, sebuah parameter yang terkait dengan array totalPenjualanQuarter, sebuah parameter yang menetapkan ukuran array, dan sebuah parameter yang terkait dengan variabel ofstream. Definisi atas fungsi ini adalah:

void tampilLaporan(ofstream& outfile, rekamanPenjual list[],
                   int ukuranList, double penjualanQuarter[])
{
    int indeks;
    int quarter;

    outfile << "–––––––––––--- Laporan Penjualan Tahunan –––––––––--"
            << "––––" << endl;
    outfile << endl;

    outfile << " ID QT1 QT2 QT3 "
            << "QT4 Total" << endl;

    outfile << "_____________________________________________"
            << "_________________" << endl;

    for (indeks = 0; indeks < ukuranList; indeks++)
    {
        outfile << list[indeks].ID << " ";

        for (quarter = 0; quarter < 4; quarter++)
            outfile << setw(10)
                    << list[indeks].penjualanQuarter[quarter];
        outfile << setw(10) << list[indeks].totalPenjualan << endl;
    }
    outfile << "Total ";

    for (quarter = 0; quarter < 4; quarter++)
        outfile << setw(10)<< penjualanQuarter[quarter];
    outfile << endl << endl;
} //akhir tampilLaporan

Fungsi penjualanMaksPerOrang
Fungsi ini menampilkan nama penjual yang menghasilkan jumlah penjualan maksimum. Untuk mengidentifikasi penjual ini, Anda perlu melihat total penjualan untuk tiap penjual dan mencari jumlah penjualan maksimum. Karena total penjualan tiap penjual berada di dalam array daftarPenjual, fungsi ini harus memiliki akses terhadap array daftarPenjual. Selain itu, karena keluaran akan disimpan di dalam sebuah file, fungsi ini harus memiliki akses terhadap variabel ofstream yang dikaitkan dengan file keluaran. Oleh karena itu, fungsi ini memiliki tiga parameter: sebuah parameter yang berkaitan dengan array daftarPenjual, sebuah parameter yang menetapkan ukuran array, dan sebuah parameter yang berkaitan dengan file keluaran.

void penjualanMaksPerOrang(ofstream& outData, rekamanPenjual list[],
                     int ukuranList)
{
    int indeksMaks = 0;
    int indeks;

    for (indeks = 1; indeks <ukuranList; indeks++)
        if (list[indeksMaks]. totalPenjualan <list[indeks].totalPenjualan)
            indeksMaks = indeks;
   
    outData << "Penjualan Maks Kategori Penjual: ID = "
            << list[indeksMaks].ID
            << ", Jumlah = Rp. " << list[indeksMaks].totalPenjualan
            << endl;
} //akhir penjualanMaksPerOrang
Fungsi penjualanMaksPerQuarter
Fungsi ini menampilkan quarter dimana jumlah penjualan maksimum dilakukan. Untuk mengidentifikasi quarter ini, Anda perlu melihat total penjualan untuk tiap quarter dan mencari jumlah penjualan maksimum. Karena total penjualan tiap quarter berada di dalam array penjualanQuarter, fungsi ini harus memiliki akses terhadap array penjualanQuarter. Selain itu, karena keluaran akan disimpan di dalam sebuah file, fungsi ini harus memiliki akses terhadap variabel ofstream yang dikaitkan dengan file keluaran. Oleh karena itu, fungsi ini memiliki dua parameter: sebuah parameter yang berkaitan dengan array penjualanQuarter dan sebuah parameter yang berkaitan dengan file keluaran.

void penjualanMaksPerQuarter(ofstream& outData,
                      double penjualanQuarter[])
{
    int quarter;
    int indeksMaks = 0;

    for (quarter = 0; quarter < 4; quarter++)
        if (penjualanQuarter[indeksMaks] < penjualanQuarter[quarter])
            indeksMaks = quarter;

    outData << "Penjualan Maks Kategori Quarter: Quarter = "
            << indeksMaks + 1
            << ", Jumlah = Rp. " << penjualanQuarter[indeksMaks]
            << endl;
} //akhir penjualanMaksPerQuarter

Program Utuh

//Contoh pemrograman Bab 9.

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

using namespace std;

const int JUMLAH_PENJUAL = 6;

struct rekamanPenjual
{
    string ID;                    //ID penjual
    double penjualanQuarter[4];   //array untuk menyimpan total
                                  //penjualan untuk tiap quarter
  
    double totalPenjualan;        //jumlah penjualan tahunan penjual
};


void inisialisasi(ifstream& indata, rekamanPenjual list[], int ukuranList);
void dapatData(ifstream& infile, rekamanPenjual list[], int ukuranList);
void penjualanPerQuarter(rekamanPenjual list[], int ukuranList,
                         double totalPenjualanQuarter[]);
void totalPenjualanPerOrang(rekamanPenjual list[], int ukuranList);
void tampilLaporan(ofstream& outfile, rekamanPenjual list[],
                  int ukuranList, double penjualanQuarter[]);
void penjualanMaksPerOrang(ofstream& outData, rekamanPenjual list[], int ukuranList);
void penjualanMaksPerQuarter(ofstream& outData, double penjualanQuarter[]);

int main()
{
    ifstream infile;              //variabel aliran masukan
    ofstream outfile;             //variabel aliran keluaran

    string inputFile;             //variabel untuk memuat nama file masukan
    string outputFile;     //variabel untuk memuat nama file keluaran
    double totalPenjualanQuarter[4]; //array untuk memuat penjualan per quarter

    rekamanPenjual daftarPenjual[JUMLAH_PENJUAL]; //array untuk memuat
                                                  //data penjual

    cout << "Masukkan nama file ID penjual: ";
    cin >> inputFile;
    cout << endl;

    infile.open(inputFile.c_str());

    if (!infile)
    {
        cout << "Tidak dapat membuka file masukan."
             << endl;
        return 1;
    }

    inisialisasi(infile, daftarPenjual, JUMLAH_PENJUAL);

    infile.close();
    infile.clear();

    cout << "Masukkan nama file data penjualan: ";
    cin >> inputFile;
    cout << endl;

    infile.open(inputFile.c_str());

    if (!infile)
    {
        cout << "Tidak dapat membuka file masukan."
        << endl;
        return 1;
    }

    cout << "Masukkan nama file keluaran: ";
    cin >> outputFile;
    cout << endl;

    outfile.open(outputFile.c_str());
    outfile << fixed << showpoint
            << setprecision(2);

    dapatData(infile, daftarPenjual, JUMLAH_PENJUAL);

    penjualanPerQuarter(daftarPenjual, JUMLAH_PENJUAL, totalPenjualanQuarter);

    totalPenjualanPerOrang(daftarPenjual, JUMLAH_PENJUAL);

    tampilLaporan(outfile, daftarPenjual, JUMLAH_PENJUAL, totalPenjualanQuarter);

    penjualanMaksPerOrang(outfile, daftarPenjual, JUMLAH_PENJUAL);

    penjualanMaksPerQuarter(outfile, totalPenjualanQuarter);

    infile.close();
    outfile.close();

    return 0;
}

void inisialisasi(ifstream& indata, rekamanPenjual list[], int ukuranList)
{
    int indeks;
    int quarter;

    for (indeks = 0; indeks < ukuranList; indeks++)
    {
        indata >> list[indeks].ID;       //mendapatkan ID penjual
        for (quarter = 0; quarter < 4; quarter++)
            list[indeks].penjualanQuarter[quarter] = 0.0;
        list[indeks].totalPenjualan = 0.0;
    }
} //akhir inisialisasi

void dapatData(ifstream& infile, rekamanPenjual list[], int ukuranList)
{
    int indeks;
    int quarter;
    string sID;
    int bulan;
    double jumlah;

    infile >> sID; //mendapatkan ID penjual

    while (infile)
    {
        infile >> bulan >> jumlah; //mendapatkan bulan penjualan
                                   //dan jumlah penjualan

        for (indeks = 0; indeks < ukuranList; indeks++)
            if (sID == list[indeks].ID)
                break;

        if (1 <= bulan && bulan <= 3)
            quarter = 0;
        else if (4 <= bulan && bulan <= 6)
            quarter = 1;
        else if (7 <= bulan && bulan <= 9)
            quarter = 2;
        else
            quarter = 3;

        if (indeks < ukuranList)
            list[indeks].penjualanQuarter[quarter] += jumlah;
        else
            cout << "ID penjual tak-valid." << endl;

        infile >> sID;
    } //akhir while
} //akhir dapatData

void penjualanPerQuarter(rekamanPenjual list[], int ukuranList,
                         double totalPenjualanQuarter[])
{
    int quarter;
    int indeks;

    for (quarter = 0; quarter < 4; quarter++)
        totalPenjualanQuarter[quarter] = 0.0;
   
    for (quarter = 0; quarter < 4; quarter++)
        for (indeks = 0; indeks < ukuranList; indeks++)
            totalPenjualanQuarter[quarter] +=
                list[indeks].penjualanQuarter[quarter];
} //akhir penjualanPerQuarter

void totalPenjualanPerOrang(rekamanPenjual list[], int ukuranList)
{
    int indeks;
    int quarter;

    for (indeks = 0; indeks < ukuranList; indeks++)
        for (quarter = 0; quarter < 4; quarter++)
            list[indeks].totalPenjualan +=
                list[indeks].penjualanQuarter[quarter];
} //akhir totalPenjualanPerOrang

void tampilLaporan(ofstream& outfile, rekamanPenjual list[],
                   int ukuranList, double penjualanQuarter[])
{
    int indeks;
    int quarter;

    outfile << "-------------- Laporan Penjualan Tahunan -----------"
            << "-------" << endl;
    outfile << endl;

    outfile << " ID     QT1      QT2     QT3 "
            << "QT4      Total" << endl;

    outfile << "_____________________________________________"
            << "_________________" << endl;

    for (indeks = 0; indeks < ukuranList; indeks++)
    {
        outfile << list[indeks].ID << " ";

        for (quarter = 0; quarter < 4; quarter++)
            outfile << setw(10)
                    << list[indeks].penjualanQuarter[quarter];
        outfile << setw(10) << list[indeks].totalPenjualan << endl;
    }
    outfile << "Total ";

    for (quarter = 0; quarter < 4; quarter++)
        outfile << setw(10)<< penjualanQuarter[quarter];
    outfile << endl << endl;
} //akhir tampilLaporan

void penjualanMaksPerOrang(ofstream& outData, rekamanPenjual list[],
                     int ukuranList)
{
    int indeksMaks = 0;
    int indeks;

    for (indeks = 1; indeks <ukuranList; indeks++)
        if (list[indeksMaks]. totalPenjualan <list[indeks].totalPenjualan)
            indeksMaks = indeks;
   
    outData << "Penjualan Maks Kategori Penjual: ID = "
            << list[indeksMaks].ID
            << ", Jumlah = Rp. " << list[indeksMaks].totalPenjualan
            << endl;
} //akhir penjualanMaksPerOrang

void penjualanMaksPerQuarter(ofstream& outData,
                      double penjualanQuarter[])
{
    int quarter;
    int indeksMaks = 0;

    for (quarter = 0; quarter < 4; quarter++)
        if (penjualanQuarter[indeksMaks] < penjualanQuarter[quarter])
            indeksMaks = quarter;

    outData << "Penjualan Maks Kategori Quarter: Quarter = "
            << indeksMaks + 1
            << ", Jumlah = Rp. " << penjualanQuarter[indeksMaks]
            << endl;
} //akhir penjualanMaksPerQuarter

File Masukan: ID Penjual

12345
32214
23422
57373
35864
54654

File Masukan: Data Penjualan

12345 1 893
32214 1 343
23422 3 903
57373 2 893
35864 5 329
54654 9 392
12345 2 999
32214 4 892
23422 4 895
23422 2 492
57373 6 892
35864 10 1223
54654 11 3420
12345 12 322
35864 5 892
54654 3 893
12345 8 494
32214 8 9023
23422 6 223
23422 4 783
57373 8 8834
35864 3 2882

Keluaran Program:





Latihan

1.      Definisikan sebuah struct, akunBank, untuk menyimpan data berikut tentang sebuah akun bank: nama pemiliki (string), nomor akun (int), saldo (double), dan suku bunga (double).
2.      Diasumsikan definisi struct akunBank seperti pada no.1. Deklarasikan sebuah variabel akunBank dan tulis beberapa statemen untuk menyimpan informasi berikut: nama pemilik akun--- Jozen, nomor akun--- 1273348, saldo---2673.474, suku bunga---2.5%.
3.      Perhatikan beberapa statemen berikut:

struct tipeNama
{
    string pertama;
    string akhir;
};

struct tipeTanggal
{
    int bulan;
    int hari;
    int tahun;
};

struct tipeInfoPribadi
{
    tipeNama nama;
    int pID;
    tipeTanggal tanggal;
};

tipeInfoPribadi orang;
tipeInfoPribadi daftarKelas[100];
tipeNama mahasiswa;

Tandailah setiap statemen berikut sebagai valid atau tak-valid. Jika sebuah statemen tak-valid, maka jelaskan alasannya.
a.        orang.nama.pertama. “Jozen”;
b.        cout << orang.nama << endl;
c.        daftarKelas[1] = orang;
d.        daftarKelas[20].pID = 000011100;
e.        orang = daftarKelas[20];
f.         mahasiswa = orang.nama;
g.        cin >> mahasiswa;
h.       for (int j = 0; j < 100; j++)
    daftarKelas[j].pID = 00000000;
i.         daftarKelas.tanggal.hari = 1;
j.         mahasiswa = nama;

4.      Perhatikan beberapa statemen berikut (tipeNama didefinisikan pada no.3):

struct tipeKaryawan
{
    tipeNama nama;
    int kinerja;
    int pID;
    string perusahaan;
    double gaji;
};

tipeKaryawan karyawan[100];
tipeKaryawan karyawanBaru;

Tandailah setiap statemen berikut sebagai valid atau tak-valid. Jika sebuah statemen tak-valid, maka jelaskan alasannya.

a.        karyawanBaru.nama = "Jozen Hinalang";
b.        cout << karyawanBaru.nama;
c.        karyawan[35] = karyawanBaru;
d.        if (karyawan[45].pID == 555334444)
    karyawan[45].kinerja = 1;
e.        karyawan.gaji = 0;

5.      Diasumsikan deklarasi pada no.3 dan no.4. Tulislah statemen c++ yang melakukan hal berikut:
a.       Menyimpan informasi berikut di dalam karyawanBaru:
nama: Jozen Hinalang
pID: 111111
kinerja: 2
perusahaan: UBI
gaji: 3456.78

b.      Di dalam array karyawan, inisialisasilah setiap kinerja dengan 0.
c.       Salin komponen ke-20 dari array karyawan ke dalam karyawanBaru.
d.      Memperbarui gaji dari karyawan ke-50 di dalam array karyawan dengan menambahkan 4536.90 pada nilai sebelumnya.

6.      Asumsikan bahwa Anda memiliki definisi struct berikut:

struct tipeKomponen
{
    string namaKomponen;
    int nomorKomponen;
    double harga;
    int banyakStock;
};

Deklarasikan sebuah array, inventori, yang memuat 100 komponen bertipe tipeKomponen.

7.      Asumsikan definisi dan deklarasi pada no.6. Tulislah definisi atas sebuah fungsi kosong yang dipakai untuk membaca data ke dalam sebuah variabel bertipe tipeKomponen. Selain itu, tulis pula kode C++ yang menggunakan fungsi Anda untuk membaca data ke dalam array inventori.
8.      Dimisalkan bahwa Anda memiliki beberapa definisi berikut:

struct tipeWaktu
{
    int jam;
    int menit;
    int detik;
};

struct tipeTur
{
    string namaKota;
    int jarak;
    tipeWaktu waktuTravel;
};

a.       Deklarasikan variabel destinasi bertipe tipeTur;
b.      Tulislah statemen C++ untuk menyimpan data di dalam destinasi: namaKota---Klaten, jarak---550 KM, waktuTravel---13 jam dan 30 menit.
c.       Tulislah definisi atas sebuah fungsi yang menampilkan data disimpan di dalam sebuah variabel bertipe tipeTur.
d.      Tulislah definisi atas sebuah fungsi penghasil nilai yang membaca data ke dalam sebuah variabel bertipe tipeTur.
e.       Tulislah definisi atas sebuah fungsi kosong dengan sebuah parameter referensi dari tipeTur untuk membaca data disimpan di dalam sebuah variabel bertipe tipeTur.










1 comment: