Aritmetika pada Pointer

Aritmetika pada Pointer

Variabel pointer merupakan variabel yang memungkinkan kita untuk menyimpan alamat memori dan Aritmetika adalah operasi dasar dari matematika. Pada pointer kita dimungkinkan untuk menggunakan operator aritmetika pada nilai pointer. Yang penulis maksud bukanlah nilai dari variabel yang ditunjuk oleh pointer tapi nilai pointer itu sendiri, nilai yang berbentuk alamat memori.

Di dalam C/C++ kita dimunkinkan untuk mengoperasi nilai dari pointer, tapi operator yang dimungkinkan hanyalah penambahan dan pengurangan (+/-/++/--) nilai dari pointer.

Contoh Penulisan
pInt++;
++pDouble;
--pChar;
//juga bisa
pInt = pInt + 5;

Contoh Program
#include <iostream>
using namespace std;

int main()
{
    int var = 2;
    int *pVar = &var;

    cout<<pVar<<endl;
    pVar++;
    cout<<pVar<<endl;

    return 0;
}

Penulis pernah memberitahu pada artikel sebelumnya dan juga pada artikel ini. Bahwa tindakan ini tidaklah aman. Jika pointer mengarah ke variabel biasa dan melakukan operasi, kemungkinan memori itu bukan milik program anda, sebelum mengakses nilai(mengubah nilai) dari memori pastikan memori itu milik program anda. Karena biasanya tindakan melakukan operasi pada nilai pointer hanya dilakukan pada variabel larik.

Pada contoh di atas memberikan keluaran 2 alamat memori yang berbeda dari nilai pointer, alamat memori pertama adalah alamat memori dari variabel ‘var’ dan kedua adalah alamat memori setelah dilakukan operasi peningkatan, hasil dari operasi menghasilkan alamat memori sebelumnya meningkat sebesar 4 tingkat.

Melakukan operasi pada pointer tidak sama seperti kita melakukan operasi pada variabel biasa. Jika operator peningkatan atau pengurangan dilakukan pada nilai dari variabel biasa maka nilai dari variabel tersebut akan ditambah atau dikurangi satu ‘1’ angka/tingkat. Tapi hal itu akan berbeda pada nilai pointer.

Peningkatan atau penurunan pada nilai pointer tergantung pada ukuran memori tipe data yang digunakan. Jika variabel pointer menggunakan integer maka alamat akan bertambah atau berkurang 4 tingkat, jika char maka akan bertambah atau berkurang 1 tingkat. Semua itu tergantung pada tipe data yang digunakan.

Aritmetika pada Pointer

Tapi semua itu sebenarnya hanya meningkat atau menurun sebanyak 1. Satu ‘1’ disini bukan merupakan tingkatan angka tapi merupakan 1 tingkatan memori. Jadi peningkatan dan penurunan nilai pointer tetaplah meningkat atau menurun 1 tingkat memori (bukan angka). Dan besar memori itu tergantung pada besar tipe data.

Hal di atas cukup jelas jika kita melakukan penambahan atau pengurangan pada nilai pointer menggunakan bilangan. Apa yang akan terjadi adalah peningkatan atau penurunan memori sebanyak bilangan yang disebutkan.

Pointer

Pointer C/C++

Pengertian Pointer

Pointer adalah variabel yang menunjuk pada variabel lainnya. Sebelumnya pernah dijelaskan mengenai variabel, menyatakan bahwa. Variabel merupakan sebuah memori perwakilan dari alamat memori pada komputer.

Hal yang sebenarnya terjadi adalah pointer itu menyimpan alamat memori yang dia tunjuk. Pada pointer kita dimungkinkan untuk menunjuk suatu memori, mengubah nilai dan menyalin nilai memori tersebut secara tidak langsung (perantara melalui variabel pointer).

Sebelum kita mempelajari pointer, ada dua hal yang perlu anda ketahui. Dalam pointer terdapat dua macam operator yang akan kita gunakan, yaitu Address-of (&) dan Dereference operator (*).

Macam-macam Operator pada Pointer

Address-of Operator (&), adalah operator yang memungkinkan kita untuk mendapatkan/melihat alamat memori yang dimiliki oleh variabel tersebut. Cara menggunakanya adalah dengan meletakan tanda & di depan identitas saat pemanggilan variabel. Hal itu akan membuat compiler memberikan alamat memori bukan isi/nilai dari memori tersebut.

Contoh Program
#include <iostream>
using namespace std;

int main()
{
    int var = 2;

    cout<<&var<<" memiliki nilai "<<var<<endl;

    return 0;
}

Dereference Operator (*), adalah operator yang memungkinkan mendapatkan isi/nilai dari sebuah memori berdasarkan alamat memori.

Contoh Program
#include <iostream>
using namespace std;

int main()
{
    int var = 2;

    cout<<var<<endl;
    cout<<&var<<endl;
    cout<<*&var<<endl;

    return 0;
}

Pointer adalah sebuah variabel yang menyimpan alamat memori dari variabel lainnya, kita dimungkinkan untuk mengubah nilai dari variabel yang ditunjuk oleh pointer dan menyalin. Selama program berjalan kita bebas mengubah tujuan dari pointer, mengubah untuk menunjuk ke alamat memori variabel lain atau menunjuk ke alamat memori yang bukan merupakan variabel.
Pointer C/C++

Mendirikan Pointer

Setelah anda mengerti fungsi-fungsi dari dua operator yang telah di jelaskan di atas. Sekarang anda dapat mendirikan pointer dengan menggunakan dua operator tersebut.

Bentuk Penulisan
tipeData *identitas;
//atau
tipeData *identitas = &var;

Contoh Penulisan
int *pInt;
double *pDouble = &myVar;

pada umumnya pointer sebenarnya adalah variabel, peraturan yang dimiliki variabel juga berlaku pada pointer, jadi tidak jauh beda dengan variabel. pointer hanya mendapatkan beberapa perbedaan yaitu penambahan dua operator yang akan membuat variabel menjadi variabel pointer.

Untuk mendirikan sebuah variabel pointer kita hanya menambahkan dereference operator sebelum identitas. Operator dereference tidak harus melekat pada identitas, operator tersebut juga bisa di letakan setelah tipe data atau di antara tipe data dan identitas. dari berbagai cara penulisan tersebut memiliki makna yang sama yaitu satu operator dereference hanya akan berlaku pada saru variabel.

Pointer tidak hanya berlaku pada variabel, kita juga dapat melakukanya pada function, objek dan lain-lain. Dan cara implementasi pointer selain pada variabel, caranya masih sama seperti kita melakukanya pada variabel.

Cara Mengakses Pointer

Variabel pointer adalah variabel yang memiliki alamat memori sebagai nilai dari variabel pointer tersebut. Dan pada pointer kita dimungkinkan untuk mengakses nilai dari pointer itu sendiri dan mengakses nilai dari alamat memori yang dimiliki(ditunjuk) oleh pointer.

Pointer merupakan variabel, untuk mengakses pointer tidak jauh beda dengan cara mengakses variabel. Untuk mengakses nilai dari pointer kita hanya cukup memanggil identiatas dari pointer tersebut.

pInt

pemanggilan itu akan menghasilkan nilai dari pointer yang berupa alamat memori dari variabel yang ditunjuk oleh pointer tersebut.

Karena pointer hanya dapat mememiliki nilai berupa alamat memori, untuk mengubah nilai dari pointer atau mengubah tujuan dari pointer kita membutuhkan operator address-of (&) pada operand sumber.

pInt = &myVar

operand sumber akan menghasilkan alamat memori dari myVar, dan hal itu merupakan nilai yang dibutuhkan oleh variabel pointer.

Sebelum anda mempraktikan untuk mengubah nilai dari variabel pointer ada satu hal yang perlu anda tau. Bahwa variabel pointer hanya dapat meneriman alamat memori dari variabel yang memiliki tipe data yang sama.

Contoh Program :
#include <iostream>
using namespace std;

int main()
{
    int var1 = 2, var2 = 5;
    int *pVar = &var1;

    cout<<"var1 = "<<&var1<<endl;
    cout<<"pVar = "<<pVar<<endl;
    cout<<"====="<<endl<<endl;
    pVar=&var2;
    cout<<"var2 = "<<&var2<<endl;
    cout<<"pVar = "<<pVar<<endl;

    return 0;
}

Variabel pointer dapat menyimpan alamat memori bukan berarti anda dapat bebas memberi alamat memori secara langsung pada pointer.

int *pInt = 0x012345;

Hal di atas tidak dimungkinkan untuk dilakukan.

Karena isi/nilai dari variable pointer merupakan sebuah alamat memori maka untuk mengakses nilai dari variabel yang dutunjuk oleh pointer kita membutuhkan operator dereference (*).

*pInt

Dalam pointer kita dimugkinkan untuk menyalin dan mengubah nilai pada variabel yang ditunjuk oleh pointer.

*pInt = 2

Sebelum anda mencoba mengubah nilai dari memori yang ditunjuk oleh pointer anda harus yakin bahwa memori itulah yang ingin anda ubah nilainya. Jangan pernah mengubah memori yang bukan milik program anda, karena hal itu terlalu memiliki resiko yang cukup serius untuk komputer anda. Dan satu hal yang perlu anda ingat adalah, berilah nilai awal di saat deklarasi pointer. Itu dapat menimalisir kemungkinan kecelakaan, hal itu harus dilakukan karena saat deklarasi variabel pointer tanpa inisialisasi maka pointer akan memiliki nilai sampah.

Contoh Program :
#include <iostream>
using namespace std;

int main()
{
    int var = 2;
    int *pVar = &var;

    cout<<"var = "<<var<<endl;
    cout<<"pVar = "<<*pVar<<endl;
    cout<<"====="<<endl<<endl;
    *pVar= 109;
    cout<<"var = "<<var<<endl;
    cout<<"pVar = "<<*pVar<<endl;

    return 0;
}


Ukuran pointer
Setiap kita medirikan pointer, pointer itu akan membutuhkan memori. Dan besar memori itu sama pada setiap tipe data yang digunakan.

Besar memori dari pointer tergantung pada mesin kompiler. jika kompiler merupakan 32bit maka pointer akan memakan memori sebanyak 4 bytes, Jika menggunakan 64bit maka pointer memakan memori sebanyak 8 bytes.

#include <iostream>
using namespace std;

int main()
{
    int var = 2;
    int *pVar = &var;

    cout<<sizeof(pVar)<<endl;

    return 0;
}

C-Style String

C-Style String

String adalah kumpulan dari beberapa karakter. Dalam C++ terdapat dua jenis string, yaitu std::string dan C-Style string yang masing-masing memiliki fungsi untuk membuat penyimpanan yang dapat menyimpan text.

C-style string merupakan string yang berasal dari bahasa pemrograman C untuk menangani penyimpanan text. dan std::string berasal dari standar perpustakan C++, yang merupakan evolusi c-style string yang lebih mudah digunakan. Dalam artikel ini kita akan membahas mengenai C-style string.

Bentuk Penulisan C-style String
char indentitas[ukuran] = inisialisasi;

C-style string adalah kumpulan array dari karakter yang diakhiri dengan null terminator. Setiap kita melakukan penyimpanan pada C-style string, setiap satu karakter akan menduduki satu elemen dari array, dan banyaknya array ditentukan oleh seberapa banyak karakter dari dalam string tersebut tapi kita juga dimungkinkan untuk memesan seberapa besar array untuk c-style string.

Setiap string dari c-style string yang telah kita dirikan akan diakhiri oleh sebuah karakter spesial yaitu /0 atau null, dalam kode ASCII memiliki kode 0. di dalam c-style string karakter tersebut diberi nama Null terminator. Dan null terminator berfunsi untuk mengindikasi akhir dari sebuah string.

Dari pengertian di atas, C-Style String juga biasa disebut sebagai Null Terminated String.

Contoh Penulisan
char myString[] = “string”;

C-style string pada dasarnya memang merupakan array. Semua peraturan pada array yang telah dijelaskan penulis berlaku juga pada C-style string.

Pada contoh di atas kita mendirkian sebuah string, dengan inisialisasi dan tanpa menyertakan jumlah elemen, hal itu dimungkinkan pada peraturan array. Pada pemesanan variabel string di atas, besar dari memori (atau jumlah elemen) akan otomatis ditentukan oleh CPU berdasarkan panjang dari nilai inisialisasi ditambah satu null terminator pada akhir string.

Pada variabel di atas memiliki panjang 7 elemen. 6 elemen yang berisi masing-masing karakter dari kata “string” dan satu null terminator pada akhir string. Gambar di abawah merupakan ilustrasi dari alokasi memori dari variabel C-style string.

Bentuk C-Style String

Jika kita mendirikan variable c-style string dengan menyertakan penentuan jumlah elemen berdasarkan seberapa yang kita butuhkan, Kita wajib menyiapkan satu elemen untuk null terminator.

Contoh Program :
#include <iostream>
#include <cstring> //untuk strlen
using namespace std;

int main(){
    char myString[] = "string";

    int panjangElemen = sizeof(myString) / sizeof(myString[0]); //mendapakan jumlah elemen
    int panjangKalimat = strlen(myString); //mendapatkan jumlah karakter sebenarnya

    cout<<"======== "<<myString<<" : ========"<<endl;

    cout<<"Panjang Elemen : "<<panjangElemen<<endl;
    cout<<"Panjang Kalimat : "<<panjangKalimat<<endl;

    cout<<endl<<"=> ASCII code"<<endl;
    for (int i = 0; i < panjangElemen; ++i){
        cout<<myString[i]<<" : "<< static_cast<int>(myString[i]) <<endl; //Melihat Kode ASCII
    }

    return 0;
}


Cara Mengakses dan Memberi nilai C-Style string

C-style string tidak memiliki banyak perbedaan dengan variable array biasa. Hanya saja saat mengakses sebuah c-style string kita bisa langsung melakukanya dengan memanggil identitas dari variable tersebut menggunakan atau tanpa menggunakan operator subscript.

Pada artikel sebelumnya, jika ketika kita mengakses variable array biasa tanpa menggunakan operator subscript, kita hanya akan mendapatkan alamat memori elemen awal dari variable array tersebut. Tapi berbeda dengan c-style string, ketika kita tidak menggunakan operator subscript apa yang akan kita dapatkan adalah nilai keseluruhan dari array yang membuatnya menjadi sebuah string, Dan ketika kita menggunakan operator subscript pada c-style string, kita akan mendapatkan satu nilai elemen dari karakter pada string tersebut.

Contoh Program :
#include <iostream>
using namespace std;

int main(){
    char myString[] = "string";

    cout<<myString<<endl;
    cout<<myString[1]<<endl;

    return 0;
}

dan peraturan lainnya yang perlu kamu tau adalah C-style string tidak bisa diberi nilai menggunakan Assignment Operator (=) secara langsung tanpa menggunakan subscript operator. Pada contoh di atas kita bisa mencetak sebuah string hanya memanggil nama dari variabel tanpa subscript operator, dan kita juga bisa inisialisasi tanpa menggunakan tanda koma untuk memisahkan masing-masing nilai elemen.

char myString[] = “string” //Ok
cout<<myString; //Ok
myString = “new change”; //Error
myString[2] = ‘a’; //Ok
cin>>myString; //Ok

meskipun kita tidak bisa mengubah nilai menggunakan operator penugasan, tapi kita masih bisa mengubah nilai string menggunakan perintah seperti input cin, merubah nilai setiap elemen satu demi satu atau  kita bisa menggunakan manipulasi string seperti strcpy(). Dan di bawah ini adalah contoh program salah satu cara kita mengubah nilai dari C-style string menggunakan input cin.

Contoh Program
#include <iostream>
using namespace std;

int main()
{
    char nama[] = "Belajar C++";
    cout<<"Sebelum : "<<nama<<endl;
    std::cout << "Ubah : ";cin>>nama;
    cout << "Sesudah : " << nama <<endl;

    return 0;
}

contoh di atas adalah salah satu cara kita untuk mengubah nilai dari C-Stryle String, dan masih ada banyak cara untuk mengubah nilai dari c-style string, hal itu akan penulis jelaskan pada artikel selanjutnya.

Setelah penjelasan di atas, ada beberapa masalah yang perlu kalian kalian tau. Contoh program di atas meminta kita untuk memasukan nilai baru pada variabel ‘nama’, dan nilai yang akan kita inputkan hampir tidak di batasi, dan kita tau bahwa c-style string selalu terbatas. Masalahnya adalah jika kita mengubah nilai c-style string lebih dari ukuran maka otomatis kita juga mengubah alamat memori setelah lokasi memori c-syle string, seperti yang telah dijelaskan pada artikel sebelumnya bahwa hal itu sangat tidak disarankan. Dan ada satu masalah lagi yang lebih buruk dari hal tersebut, yaitu jika Null terminator berubah maka CPU akan terus membaca hingga CPU menemukan Null terminator, tidak peduli seberapa jauh itu.

Meskipun kita mencoba memesan memori pada subscript c-syle string sebanyak apapun, hal itu masih tidak cukup untuk mengatasi masalah tersebut di masa depan. Dan juga kemungkinan kita akan membuat program yang memakan memori cukup besar pada komputer.

Dimana ada masalah pasti ada solusi. Untuk mengatasi masalah tersebut kita dapat menggunakan fungsi cin.getline, merupakan fungsi yang memungkian kita mengatur batas banyak karakter yang akan dimasukan dalam variabel.

Contoh Program :
#include <iostream>
#include <cstring>
using namespace std;

int main(){
    char nama[25] = "Nama Anda belum di isi";
    cout<<"Nama :";cin.getline(nama, sizeof(nama)-1);
    cout<<"Nama anda adalah : "<<nama<<endl;

    return 0;
}

selain masalah itu, cin.getline juga dapat memungkinkan kita memasukan karakter sepasi. pernahkah anda mencoba untuk menginputkan sepasi dengan input cin biasa atau printf ke dalam c-style string. CPU tidak memasukan sepasi (dalam ASCII adalah 32) melainkan sebagai Null terminator (0). saat pembacaan itu dapat menyebabkan string terpotong.

Kesimpulan :
C++ merupakan evolusi dari bahasa pemrograman C. dan dalam C++ kita masih dimungkinkan untuk menggunakan fitur dari C. kita tau bahwa kita masih dimungkinkan menggunakan C-Style string, tapi bagi punulis menyarankan untuk menggunakan string dari C++. Pembuat bahasa membuatnya agar lebih mudah untuk digunakan dan juga C++ string memiliki banyak kelebihan dari pada C-style string.

Penulis menyarankan untuk tidak menggunakan bukan berarti untuk dilupakan atau dihindari. Penulis menyarankan jika ingin menggunakan c-style string sebaiknya anda benar-benar memiliki tujuan untuk menggunakanya.

Array Multidimensi

Array Multidimensi

Array adalah fitur dari bahasa pemrograman c++ yang memungkinkan kita untuk memesan banyak memori yang memiliki tipe data yang sama dengan hanya menggunakan satu identitas. Dalam variabel kita dimungkinkan untuk menggunakan array lebih dari satu buah, dan hal itu disebut sebagai Array Multidimensi.

Untuk mengubah variabel biasa menjadi variabel array adalah dengan menambahkan operator subscript dengan ukuran di dalamnya, dalam C++ kita dimungkinkan untuk menggunakan banyak subscript, hal itu akan membuat variabel tersebut menjadi array multidimensi.

Bentuk Penulisan
tipeData identifier[array-1][array-2]….[array-n];

Array Dua Dimensi
Untuk membuat sebuah variabel dengan array dua dimensi, kita membutuhkan dua buah operator subscript ( [] ) dengan masing-masing ukuran array.

Bentuk Penulisan
tipeData identifier[size1][size2];

Contoh Penulisan
string nama[2][3];

array dua dmensi memungkinkan anda untuk menggunakan array di dalam array, setiap array memiliki array di dalamnya. Bagi penulis jujur saya sulit untuk menjelaskan array multidimensi. Tapi untuk array dua dimensi bisa digambarkan seperti sebuah tabel yang mempunyai baris dan kolom.

Kita dapat membayangkan sebuah array dua dimensi seperti sebuah table yang memiliki baris dan kolom, untuk array atau subscript pertama adalah baris dan subscript kedua adalah kolom.

Array Dimensi Dua

Inisialisasi Array Dua Dimensi
Untuk menginisialisasi array dua dimensi adalah dengan cara menggunakan tanda kurung kurawal di dalam tanda kurung kurawal.

string nama[3][2]={
{“joko”, “dadang”}, //baris ke satu dengan 2 kolom
{“fajar”, “nick”}, // baris ke dua dengan 2 kolom
{“laksono”, ”eren”} // baris ke tiga dengan 2 kolom
}

Tanda kurung kurawal pertama akan menyatakan keseluruhan array dari variabel, di dalamnya terdapat 3 sepasang kurung kurawal yang dipisahkan dengan tanda koma, yang menyatakan array dari subscript pertama. Di dalam masing-masing tanda subscript pertama berdiri 2 nilai sesuai ukuran array subscript kedua, masing-masing nilai dipisahkan dengan tanda koma.

Untuk bentuk penulisan bebas menurut keinginan anda, seperti anda bisa menulis dalam satu baris atau seperti di atas, hal yang penting adalah penggunaan tanda-tanda baca dan cara penulisanya harus benar seperti di atas, bentuk penulisan di atas dibentuk seperti halnya sebuah tabel hanya untuk mempermudah kita dalam membaca nilai-nilai tersebut.

Jika anda tidak mengisi salah satu cell atau semua cell maka anda akan menginisialisasi array dalam variabel array tersebut menjadi bernilai 0 atau kosong.

string nama[3][2]={
{“joko”, “dadang”}, //baris ke satu dengan 2 kolom [1][1] = “joko”, [1][2]=”dadang”
{“fajar”}, // baris ke dua dengan 2 kolom, [2][1] = “fajar”, [2][2] “” 
{} // menginisialisasi satu baris dengan angka 0,  [3][1] = “”, [3][2]=””
}

dan juga bisa seperti ini
string nama[3][2]={}

Deklarasi Variabel Array Multidimensi Tanpa Ukuran
array multidimensi adalah array, kita masih dimungkinkan untuk mendeklarasi variabel array tanpa menyertakan ukuran dari array tersebut, ukuran otomatis akan terhitung berdasarkan jumlah nilai pada proses inisialisasi.

Mengakses Array Dua Dimensi
nama[2][1]

untuk mengakses sebuah cell pada array dimensi dua, sama seperti kita mengakses array dimensi satu. Tapi disini kita membutuhkan dua subscript sebagai alamat cell tersebut.

untuk dapat megakses setiap cell di dalam array dua dimensi dengan dinamis anda dapat menggunakan pernyataan pengulangan nested (nested loop).

Contoh Program
#include <iostream>
using namespace std;

const int MAX_ROW = 3;
const int MAX_COL = 3;

int main ()
{
    string nama[MAX_ROW][MAX_COL]={
        {"joko", "dadang", “aziz”},
        {"fajar", "nick"},
        {"laksono", "eren"}
    };

    for(int i=0;i<MAX_ROW;++i){
        for(int j=0;j<MAX_COL;++j){
            cout<<"["<<(i+1)<<"]["<<(j+1)<<"]. "<<nama[i][j]<<endl;
        }
    }

    return 0;
}

Array Tiga Dimensi ke atas
Jika pembaca sudah mengerti mengenai konsep dari array, anda akan dengan mudah untuk memodifikasi array, menambahkan beberapa subscript untuk menjadikanya array multidimensi.
Secara garis besar, pembuatan, penggunaan, pengaksesan array multi dimensi memiliki konsep yang sama seperti apa yang telah penulis jelaskan di atas pada array dua dimensi.

Pembekakan memori
Pada artikel belajarcpp.com sebelemunya telah penulis sampaikan bahwa array bisa memakan banyak memori, terutama array multi dimensi. Karena apa yang kita pesan adalah berkali-kali lipat lebih besar dari variabel biasa.

Misalnya anda mendirikan variabel array satu dimensi “int nomer[5]”, besar memori untuk membuat variabel integer adalah 4 byte (di beberapa komputer bisa berbeda-beda), dikali dengan jumlah elemen yaitu 5 elemen, berarti apa yang telah anda pesan adalah variabel dengan jumlah memori 20 byte.
dan ada yang lebih memakan memori adalah saat anda memesan variabel array multi dimensi, misalnya anda memesan variabel empat dimensi “int nomer[3][4][5][2]”, dengan hitungan :

int * 10 * 40 * 50 * 20
4 byte * 10 * 40 * 50 * 20 = 1600000 byte

Jumlah itu merupakan jumlah yang tidak kecil, anda bisa membebani pogram anda dengan pembekakan memori, jadi saran penulis adalah ketika anda mendirikan variabel array berhati-hatilah dalam memesan jumlah elemen pada array tersebut, pesanlah sesuai yang anda butuhkan, jangan memesan memori terlalu banyak yang nantinya bisa menjadi memori yang tidak digunakan.

Array

Array / Larik

Array atau Larik adalah sebuah variabel yang memiliki serangkaian elemen dari jenis tipe data yang sama. Elemen-elemen tersebut dirangkai di dalam memori yang berdekatan dengan elemen lainya. konsep ini mirip seperti struct dan class yang dapat merupakan kumpulan dari variabel, perbedaan dengan mereka adalah array merupakan kumpulan variabel dengan satu indentifier dan satu tipe data yang sama, dan dalam istilah-istilah array kumpulan dari variabel tersebut adalah elemen.

Bayangkan bahwa jika pembaca sedang bekerja membuat program untuk suatu organisasi sekolah, tepatnya digunakan untuk mendata nilai-nilai dari siswa pada suatu kelas, dan dalam satu kelas terdapat 50 anak. Dengan arti kita membutuhkan 50 tempat penyimpanan (variabel).

double nilai1, nilai2, nilai3 …….nilai50;

mungkin untuk pembaca yang baru mengenal dunia programmer akan berpikiran untuk membuat 50 variabel secara individu seperti pernyataan di atas. Cara di atas adalah sangat-sangat tidak efektif atau salah.  Bagaimana jika satu kelas tidak selalu memiliki 50 anak, mungkin di masa depan akan memiliki murid lebih dari 50 anak di dalam kelas. Dengan arti program itu akan selalu membutuhkan modifikasi, bukan hanya pada variabel tersebut tapi keseluruhan program, seperti input, proses dan output. Untungnya, dalam bahasa pemrograman C++ dan hampir semua bahasa pemrograman, menyediakan fitur yang bernama “Array” atau “Larik”.

Array memungkinkan kita untuk membuat sebuah variabel yang dapat menyimpan banyak nilai. Di dalam array terdapat banyak elemen yang merupakan tempat untuk penyimpanan setiap nilai.

Bentuk Penulisan
tipeData identifier[ukuran];

untuk mendirikan sebuah variabel array sama seperti kita mendirikan sebuah variabel biasa yang dimana membutuhkan tipe data, identifier, dan titik koma. Untuk merubah variabel biasanya menjadi variabel array adalah dengan menambahkan operator subscript ( [] ).

Untuk parameter di dalam operator subscript disebut sebagai index atau subscript, tempat dimana kita memberitahukan compiler berapa jumlah variabel yang akan di alokasi sesuai yang kita inginkan. dan dalam array, istilah dari banyak variabel yang dialokasi itu disebut sebagai elemen.

Contoh Penulisan
int nilai[50];

Di atas adalah contoh penulisan dari penggunaan array, variabel di atas memiliki identifier “nilai” bertipe data integer sebanyak 50 elemen.  Tersebut memungkinkan kita untuk menyimpan 50 nilai berbeda dalam satu identifier variabel “nilai”.

Pernyataan di atas dinamakan Array statis atau Fixed array, karena kita mendirikan variabel array dengan menggunakan konstanta bernilai 50 sebagai index saat punulisan program. Dan pemberian index hanya dapat dilakukan menggunakan konstanta dan dilakukan sebelum kompilasi (Compile-time), tidak  saat program berjalan (Runtime).

Untuk mendirikan sebuah variabel array dibutuhkan tipe data, identifier dan index di dalam subscript. Setiap tipe data untuk mendirikan variabel, dimungkinkan untuk digunakan pada array. untuk identifier kita bebeas dalam memberikan identitas tapi harus di bawah peraturan pembuatan identitas yang telah penulis jelaskan. Untuk index adalah tempat dimana sebuah konstanta diletakan sebagai penentu banyaknya elemen.

Inisialisasi Array
Saat mendirikan variabel array kita juga dimungkinkan untuk memberi nilai saat deklarasi variabel array secara bersamaan, inisialisasi array disebut sebagai “Initializer list”. apa yang kita butuhkan untuk inisialisasi sebuah variabel array adalah sepasang tanda kurung kurwal yang mengapit semua nilai tersebut.

Contoh Penulisan
int grade[50] = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};

di atas adalah contoh dari cara inisialiasi sebuah variabel array yang memiliki 50 elemen. Untuk melakukan inisialisasi kita membutuhkan tanda sama dengan setelah itu nilai dari setiap elemen. Nilai-nilai setiap elemen akan di kurung di dalam sepasang tanda kurung kurawal. Setiap nilai dipisahkan dengan tanda koma.

Contoh di atas adalah pernyataan yang valid, meskupun variabel tersebut memesan 50 elemen tetapi penulis hanya memberikan 10 nilai. Dari 10 nilai tersebut akan mengisi elemen pertama hingga ke sepuluh. Untuk elemen 10 sampai 50 akan di inisialisasi dengan nilai “0” atau kosong.

Inisialisasi adalah sebuah pilihan, kita bebas untuk membuat variabel dengan inisialisasi atau tanpa inisialisasi. seperti apa yang telah penulis jelaskan pada artikel tentang “Inisialisasi”. inisialisasi variabel itu penting meskipun tidak wajib. Jika variabel array di atas tidak melakukan inisialisasi maka otomatis setiap elemen akan mengandung nilai acak yang berasal dari pengguna memori sebelumnya.

Mendeklarasikan tanpa ukuran array
Pada bahasa pemrograman C++ dalam mendirikan sebuah variabel array kita dimungkinkan untuk mendirikan variabel array tanpa menyertakan ukuran, hanya operator subscript tanpa nilai di dalamnya. Tapi untuk melakukan hal itu, kita diwajibkan untuk menyertai dengan inisialisasi. bukan berarti jika variabel array tidak menggunakan ukuran akan memiliki elemen yang dinamis. Variabel array denngan cara tersebut masih dalam golongan variabel array statis. Dan compiler selalu akan membutuhkan ukuran array untuk alokasi (elemen) yang dibutuhkan.

Ketika kita mendeklarasikan sebuah variabel array tanpa ukuran array, maka ukuran dari variabel array tersebut otomatis akan dihitung berdasarkan jumlah nilai pada proses inisialisasi.

Contoh Penulisan
int nilai[]={2,4,7,9}

pada contoh penulisan di atas compiler akan mendeklarasikan sebuah variabel array yang memiliki 4 elemen yang dihitung berdsarkan jumlah nilai pada proses inisialisasi.

Mengakses Variabel Array
Untuk mengakses variabel array tidak jauh beda dengan cara mengakses variabel biasa, untuk mengakses variabel array membutuhkan Operator subscript ( [] ) dengan index di dalamnya yang diletakan setelah identitas variabel.

Contoh Penulisan
grade[2];

contoh di atas akan mengakses elemen ketiga dari variabel “grade”. Index yang berada di dalam subscript digunakan untuk mengakses nilai elemen berdasarkan konstanta yang diberikan. Pada contoh di atas kita mencoba untuk mengakses elemen keiga dari variabel “grade”.

Bahasa pemrograman C++ tepatnya pada fitur array selalu menggunakan bilangan cacah (bilangan dimulai dari 0). Dan setiap elemen yang kita pesan akan di nomori berdasarkan urutan dari 0 sampai sebanyak yang kita pesan. Misalnya kita memesan grade[50] maka elemen pertama berada pada urutan nomer 0 dan elemen terakhir berada pada urutan 49.

Elemen pada array

Jika kita menuliskan nomer 10 maka elemen yang akan di akses adalah elemen nomer urut nomer 11.

Contoh Program
#include <iostream>
using namespace std;

int main ()
{
    char grade[3]={};

    grade[0] = 'a';
    grade[1] = 'b';
    grade[2] = 'c';

    cout<<"0 : "<<grade[0]<<endl;
    cout<<"1 : "<<grade[1]<<endl;
    cout<<"2 : "<<grade[2]<<endl;

    return 0;
}

Hati-hati dalam mengakses array, dalam pemrograman C++ kita dimungkinkan untuk mengakses elemen dari array yang bukan merupakan anggota array tersebut. misalnya kita mencoba akses index nomer 50, tetapi variabel array itu sendiri hanya memiliki 10 elemen.

Kita dimungkinkan untuk mengakses index dari array meskipun bukan merupakan anggota dari variabel array tersebut. itu dapat di lakukan tapi hal itu dilarang untuk dilakukan. Karena apa yang coba kita akses bukan merupakan memori milik program anda. Bisa saja memori tersebut dimiliki oleh program lain.

Pengulangan dengan Array
Pada contoh program di atas kita mengunakan pernyataan tunggal untuk mengakses setiap elemen array. jika array memiliki 50 elemen bukan berarti kita harus membuat 50 pernyataan tunggal untuk mengakses setiap elemen tersebut. termasuk penyuntingan ketika anda merubah index array.

Untuk mengakses array secara dinamis, tidak memerlukan banyak waktu untuk membuat pernyataan  menyunting program jika ada perubahan pada array. kita dapat memanfaatkan pernyataan pengulangan.

Contoh Program
#include <iostream>
using namespace std;

int main ()
{
    const int MAX_ARRAY = 5;
    string nama[MAX_ARRAY]={};

    for(int i=0;i<MAX_ARRAY;++i){
        cout<<"Masukan Nama : ";cin>>nama[i];
    }

    cout<<endl<<"=== Daftar Nama ==="<<endl;
    for(int i=0;i<MAX_ARRAY;++i){
        cout<<(i+1)<<". "<<nama[i]<<endl;
    }

    return 0;
}

Pernyataan pengulangan FOR memang merupakan pernyataan yang efektif untuk digunakan dan sering digunakan oleh para programmer dalam mengelolah variabel array. di atas adalah program yang akan meminta 5 nama dan nama tersebut akan di tampilkan di bawahnya sebagai daftar nama. Program di atas mencontohkan program yang cukup efisien. Jika kita ingin mengubah banyak elemen pada array, apa yang harus dilakukan hanyalah mengubah nilai pada variabel konstanta “MAX_ARRAY”.

Array sebagai Parameter Function
Variabel array sebagai parameter di function akan berbeda dengan variabel sebagai parameter pada umumnya. Jika anda mengikuti pembelajaran pada belajarcpp.com, penulis menyadari bahwa materi function belum penulis sampaikan di beberapa materi sebelumnya. Jadi penulis menyarankan anda untuk mengerti hal ini sebagai sebuah teori. Jadi ketika anda bertemu dengan materi function, anda akan tau apa yang akan terjadi ketika parameter dalam function tersebut adalah variabel array.

Sifat parameter pada umumnya adalah menyalin nilai dari variabel yang diajukan sebagai  argument. Jadi di antara variabel parameter dengan variabel asli tidak saling berhubungan. Ketika anda mencoba mengubah nilai pada pada parameter maka variabel asli tidak akan terpengaruh, begitu pula sebaliknya.

Tapi jika parameter itu merupakan array, dan jika anda mencoba untuk mengubah nilai dari salah satu variabel maka keduanya akan terpengaruh. Hal itu terjadi karena variabl array bisa sangat memakan banyak memori, untuk menghindari lamanya proses penyalinan dan pembekakan memori program, C++ membuat parameter array tidak menyalin nilai dari variabel array asli, tapi dia menyalin alamat memori pada variabel asli.

Contoh Program
#include <iostream>
using namespace std;

const int MAX_ARRAY = 5;

void ubah(string str[]){
    for(int i=0;i<MAX_ARRAY;++i){
        str[i]="Berubah";
    }
}

int main ()
{
    string nama[MAX_ARRAY]={};

    for(int i=0;i<MAX_ARRAY;++i){
        cout<<"Masukan Nama : ";cin>>nama[i];
    }

    ubah(nama);

    cout<<endl<<"=== Daftar Nama ==="<<endl;
    for(int i=0;i<MAX_ARRAY;++i){
        cout<<(i+1)<<". "<<nama[i]<<endl;
    }

    return 0;
}

Tambahan : Mengakses hanya menggunakan identitas
Operator subscript dan nilai di dalamnya digunakan untuk mengakses elemen. Jika kita mencoba untuk mengakses sebuah variabel array tanpa menggunakan subscript maka apa yang akan kita dapat adalah alamat memori dari elemen pertama variabel array.

Tapi berbeda dengan array C-Style String, array dengan tipe data char akan menampilkan sebuah string dari keseluruhan nilai pada setiap elemen.

Pernyataan Goto

Pernyataan Goto

Pernyataan GOTO adalah pernyataan yang memungkinkan kita untuk mengatur arahnya aliran pengeksekusian CPU terhadap program kita. GOTO berfungsi untuk memerintahkan CPU melompat ke baris manapun berdasarkan label yang telah dibuat.

Bentuk Penulisan Goto
goto nama_label;

Bentuk penulisan Label Goto
nama_label:

untuk membuat pernayataan goto bekerja, dibutuhkan dua pernyataan yaitu GOTO dan LABEL. Pernyataan GOTO menggunakan keyword “goto” diikuti nama label berfungsi untuk memberi tahu CPU agar melompat ke baris yang miliki label dengan nama tersebut.

Pernyataan LABEL di isi dengan nama label diakhiri dengan tanda titik dua, berfungsi untuk menandai suatu baris program, tempat dimana loncatan CPU karena GOTO mendarat.

Contoh Penulisan Goto
goto labelku;

Contoh Penulisan Label Goto
labelku:

Ketika CPU bertemu dengan pernyataan GOTO maka CPU pada saat itu juga akan melompat ke label dengan nama yang tertera pada pernyataan GOTO. Dan untuk penempatan GOTO beserta label GOTO kita bebas meletakanya dimana saja tetapi harus berada pada satu function scope.

Contoh Program :
#include <iostream>
using namespace std;

int main ()
{
    int angka=0;
    cobaLagi:
    cout<<"Masukan Angka : ";cin>>angka;
    if (angka!=5)goto cobaLagi;

    return 0;
}

Contoh program di atas adalah contoh penggunaan pernyataan GOTO. Program di atas akan meminta pengguna untuk memasukan angka apapun, jika pengguna memasukan angka 5 maka pernaytaan GOTO akan dieksekusi, CPU akan meloncat ke label “cobaLagi” yang diletakan di atas.

Peletakan Label dari GOTO bisa diletakan di baris sebelum pernyataan GOTO, kita juga bisa meletakan Label GOTO di baris setelah dari pernyataan GOTO.

Contoh Program :
#include <iostream>
using namespace std;

int main ()
{
    char loncat=0;

    cout<<"Masukan Angka [y/n] : ";cin>>loncat;
    cout <<"1"<<endl;
    if (loncat=='y')goto loncatan;
    cout <<"2"<<endl;
    loncatan:
    cout <<"3"<<endl;
   
    return 0;
}

Contoh program di atas akan meminta persetujuan anda untuk melompat, jika anda menginputkan ‘n’ maka aliran akan berjalan normal dan menghitung 1 sampai 3, jika anda memilih y maka akan tampil perhitungan 1 dan 3.

Setelah penjelasan mengenai GOTO dan cara penggunaan GOTO, penulis belajarcpp.com sarankan untuk tidak menggunakan pernyataan GOTO jika tidak dibutuhkan. Sebenarnya bukan hanya penulis yang menyarankan, tapi hamper semua programmer menghindari penggunaan pernyataan GOTO.

Pernyataan GOTO dapat menurunkan kualitas program, karena bisa membuat program mempunyai aliran yang sangat tidak jelas. Kadang hal itu bisa menyebabkan kegagalan pada program anda.

Di bahasa pemrograman lainnya, salah satunya seperti bahasa pemrograman BASIC, Goto sangat sering digunakan, hal itu normal di bahasa pemrograman BASIC tapi berbeda pada Bahasa pemrograman C++, semua programmer yang menggunakan bahasa pemrograman C++ sama sekali tidak menggunakan pernyataan GOTO, mereka mengganti pernyataan GOTO dengan memanfaatkan pernyataan lain yang lebih canggih dan aman seperti pernyataan pengulangan, penyeleksian dan lain-lain.

 Dan di bawah ini adalah salah satu contoh program mengapa GOTO tidak disarankan untuk digunakan.

#include <iostream>
using namespace std;

int main ()
{
    goto loncat;
    int var = 2;
    loncat:
    cout<<var;
    return 0;
}

Program di atas tidak akan bisa dijalankan karena CPU akan dilempar langsung ke baris pada label loncat dengan arti deklarasi var tidak pernah di eksekusi, dan CPU tidak bisa menemukan variabel var saat pernaytaan keluaran.

Bayangkan jika anda membuat program dengan kode yang cukup banyak, dan anda menggunakan begitu pernataan GOTO. Kemungkinan yang akan terjadi adalah anda akan bingung bagaimana CPU akan mengalir untuk mengeksekusi program anda, anda sulit untuk menyunting program anda dan kemungkinan program akan mendapatkan kesalahan yang cukup fatal karena aliran program yang tidak jelas.

Pernyataan Continue

Pernyataan Continue

Pernyataan CONTINUE adalah pernyataan yang memungkinkan kita mengatur aliran eksekusi CPU terhadap program buatan kita. Pernyataan CONTINUE adalah keyword yang berfungsi untuk menyelesaikan perulangan saat itu dan melanjutkan ke perulangan selanjutnya dengan mengabaikan sisa pernaytaan pada badan perulangan tersebut. Pernyataan CONTINUE hanya dapat digunakan di dalam pernyataan pengulangan.

Bentuk Penulisan :
continue;

Pernyataan CONTINUE sangat berguna jika kita ingin mengakhiri perulangan pada saat itu dan melanjutkan ke perulangan selanjutnya. Pada saat CPU bertemu dengan pernyataan CONTINUE, CPU akan meloncat mengabaikan pernyataan-pernyataan yang ada di bawah pernyataan CONTINUE menuju ke akhir baris dari pernyataan perulangan, dengan hal itu perulangan selanjutnya akan segera dimulai.

Contoh Program :
#include <iostream>
using namespace std;

int main ()
{
    int jumlah=0;
    cout<<"Jumlah : ";cin>>jumlah;
    for (int i = 1; i <= jumlah; i++){//Perulangan dimulai
        if ((i % 2)==0) continue; //jika tereksekusi CPU akan meloncat
        cout<<i<<endl; //pernyataan ini akan diabaikan
        //CPU akan mendarat di sini
    }

    return 0;
}

Contoh program di atas adalah contoh penggunaan dari pernyataan CONTINUE. Program di atas akan meminta anda untuk memasukan dan akan menampilkan hitungan angka ganjil sebanyak angka yang pengguna masukan.

Dari program di atas dapat menampilkan hitungan ganjil karena jika pernyataan CONTINUE tereksekusi oleh CPU maka CPU akan meloncat ke baris akhir dari pernyataan pengulangan dan jika kondisi perulangan terpenuhi maka perulangan akan melanjutkan perulangan selanjutnya. Loncatan tersebut akan mengabaikan sisa dari badan pernyataan pengulangan, sehingga pernyataan keluaran di bawah pernyataan CONTINUE tidak akan dieksekusi oleh CPU.

Setelah penjelasan di atas memang CONTINUE adalah pernyataan yang sangat berguna, tapi hati-hati dalam menggunakanya, Perhatikan aliran program yang sedang anda buat, jika tidak anda bisa membuat suatu program yang sulit untuk dipahami dan anda juga bisa membuat program yang gagal berfungsi.

Salah satu kasus adalah anda bisa membuat sebuah program dengan pengulangan tak terhinga seperti di bawah ini.

#include <iostream>
using namespace std;

int main ()
{
    int jumlah=0;
    cout<<"Jumlah : ";cin>>jumlah;
    int i  = 1;
    while(i <= jumlah){
        if ( i == 5) continue;
        cout<<i<<endl;
        i++;
    }

    return 0;
}

Di atas adalah program contoh dari kesalahan penggunaan pernyataan CONTINUE, program di atas mempunyai maksud untuk menampilkan penghitungan 1 ke angka yang dimasukan oleh pengguna, dengan melewati angka 5.

Tapi hasil dari program di atas akan memiliki perulangan yang tak terhinga, program di atas jika dijalankan terlihat berhenti dan tidak berakhir. Hal itu karena pernyataan CONTINUE diletakan sebelum penaikan nilai variabel yang digunakan untuk conditional expression oleh pernyataan pengulangan. Hal tersebut akan menyebabkan pernyataan penaikan variabel akan diabaikan.

Ketika variabel “i” bernilai 5 CPU akan mengeksekusi pernyataan CONTINUE, melompat dan mengabaikan penaikan variabel tersebut. di saat evaluasi pernyataan pengulangan, variabel “i” akan bernilai 5 karena pernyataan penaikan variabel tersebut di abaikan. Karena hal itu CPU akan kembali lagi untuk mengeksekusi pernyataan CONTINUE. Dan hal itu akan terjadi berulang-ulang tanpa henti.

Di bawah ini adalah contoh peulisan program yang benar untuk menghindari hal tersebut.

#include <iostream>
using namespace std;

int main ()
{
    int jumlah=0;
    cout<<"Jumlah : ";cin>>jumlah;
    int i  = 1;
    while(i <= jumlah){
        if ( i == 5) {
            i++;
            continue;
        }
        cout<<i<<endl;
        i++;
    }

    return 0;
}

Atau

#include <iostream>
using namespace std;

int main ()
{
    int jumlah=0;
    cout<<"Jumlah : ";cin>>jumlah;
    int i  = 1;
    do{
        if ( i == 5) continue;
        cout<<i<<endl;
    }while(++i <= jumlah);

    return 0;
}

Saat anda menggunakan pernyataan lompatan anda harus berhati-hati dalam penggunaan pernyataan tersebut, dan cermat dalam menganalisis bagaimana aliran program anda.

Pernyataan Break


Pernyataan BREAK adalah pernyataan lompatan yang dapat mengandalikan aliran pengeksekusian CPU. BREAK merupakan keyword berfungsi untuk membuat CPU melompat keluar dari pernyataan pengulangan atau pernyataan SWITCH. Dan BREAK hanya dapat digunakan dalam pernyataan pengulangan dan pernyataan SWITCH.

Bentuk Penulisan :
break;

Break lebih tepatnya digunakan untuk menghentikan suatu pernyataan pengulangan atau pernyataan SWITCH. Ketika CPU bertemu dengan pernaytaan beak di dalam suatu pernyataan pengulangan atau SWITCH CPU akan langsung berhenti untuk mengeksekusi Pernyataan pengulangan tersebut dan kembali ke baris eksekusi di luar dan di bawah dari keseluruhan pernyataan tersebut.

Break sangat berguna untuk menghentikan pernyataan pengulangan, berdasarkan kondisi apa yang diinginkan. Break dapat meningkatkan keamanan dan mengatasi masalah pada program, sebagai contoh adalah terjadinya pengulangan tak diinginkan oleh programmer atau pengguna, maka break dapat menghentikanya.

Contoh Program :
#include <iostream>
using namespace std;

int main ()
{
    int jumlah=0;
    cout<<"Jumlah : ";cin>>jumlah;
    for(int i = 1; i<=jumlah; i++){
        if (i > 50) break;
        cout<<i<<endl;
    }
    return 0;
}

Di atas adalah contoh program penggunaan BREAK pada pernyataan pengulangan for, BREAK juga bisa digunakan pada pernyataan pengulangan lainya. pada program di atas, Program meminta pengguna untuk memberikan angka sebagai jumlah pengulagan. Dan di dalam pernyataan pengulangan terdapat pernyataan BREAK yang berada pada pernyataan penyeleksian if. Break pada program di atas untuk memberikan batas berapa jumlah minimal pengulangan harus terjadi.

Jika pembaca mengikuti pembelajaran pada belajarcpp.com. jika anda ingat bahwa pernyataan BREAK juga digunakan pada pernyataan SWITCH dan juga memiliki fungsi yang sama yaitu untuk menghentikan pengeksekusian pernyataan switch.

Untuk pernyataan penyeleksian BREAK hanya dapat digunakan pada pernyataan penyeleksian SWITCH.

#include <iostream>
using namespace std;

int main ()
{
    int jumlah=0;
    cout<<"Jumlah : ";cin>>jumlah;
    switch(jumlah){
    case 1 :
        cout<<"Nomer tersedia.";
        break ;
    case 2:
        cout<<"Nomer tersedia.";
        break;
    default :
        cout<<"Nomer tidak tersedia.";
        break;
    }

    return 0;
}

Dengan pernyataan BREAK pada pernyataan SWITCH berfungsi untuk menghentikan pernyataan SWITCH setelah CPU menyelesaikan mengeksekusi pernyataan sebagai perintah pada label case tertentu. Jika tidak menggunakan pernyataan BREAK maka akan mengeksekusi apapun pada baris selanjutnya meskpun pernyataan sebagai perintah termasuk dalam label case lain.

Jika anda sudah bisa menggunakan pernyataan BREAK dimohon anda bisa memanfaatkan pernyataan BREAK dengan bijaksana dan Efisien. Jika tidak, anda bisa membuat suatu program memiliki aliran yang sulit untuk dimengerti.