Latihan C++ BAGIAN V



Latihan 40 : Membuat Sebuah File Text

Untuk membuatnya dapat menggunakan 'ofstream' dengan memanggil file header <fstream>. Berikut kodenya:

#include <iostream>
#include <fstream>

using namespace std;

int main(){
//perintah ofstream untuk membuka file
ofstream teks;
teks.open("C:/tesdoang.txt");

//proses merekam
teks<<"Lagi nyoba bikin file teks dengan C++ \n";
teks<<"Ternyata ngk terlalu sulit bikin teks \n";
teks<<"dengan C++ hehehehe.";

//menutup teks
teks.close();

cout<<"\n\n";
system("pause");
return 0;
}

Hati-hati jika kita menulis data ke sebuah file karena jika file yang ditunjuk sudah ada maka kemungkinan dapat menimpa seluruh data pada file menjadi data yang telah ditentukan oleh program. Pada saat merekam jika file belum ada maka secara otomatis akan dibuat.
Latihan 41 : Menambahkan dan Mengecek Text

Untuk mengecek suatu text ada atau belum dapat menggunakan perintah 'ifstream' dan untuk menambahkan text menggunakan 'ios::app' dengan bentuk:

variabel.open(sumber, ios::app);
Berikut contoh programnya :

#include<iostream>
#include<conio.h>
#include<fstream>

using namespace std;

int main(){
//ofstream untuk membuat / merubah file
ofstream tambah;

//ada sebagai penanda apa yang akan dilakukan selanjutnya
//bool menampung nilai true dan false
bool ada = true;
char pilih, sumber[50] = "C:/tesdoang.txt";

//ifstream untuk mengecek file
ifstream cek;

cek.open(sumber);
if(cek.fail()){
ada = false;
cout<<"Text belum ada\nIngin dibuat ? (Y/N) : ";
pilih = getch();
switch(pilih){
case 'y':;
case 'Y':ada=true;break;
default:;break;
}
}

if(ada==true){
tambah.open(sumber, ios::app);
cout<<"Text sudah ada dan sedang ditambahkan";
tambah<<"Lagi latihan nambahin data\n";
tambah<<"Dengan C++.\n\n";
}

//menutup teks
tambah.close();
cek.close();

//proses terakhir
cout<<"\n\n";
system("pause");
return 0;
}
Latihan 42 : Bilangan Random dengan srand()

Kalau pada Latihan sebelumnya yaitu membuat bilangan random (Latihan 12 : Membuat Bilangan Random) 
dengan kode mirip seperti berikut :

/*

Membuat Bilangan Random

*/
#include <iostream>
using namespace std;

int x,y;

void acak()
{
y=rand()%x;
}

int main(int argc, char *argv[])
{
bool keluar = false;

/*
proses pengulangan selama user
tidak memasukkan angka 0
*/
while (keluar == false)
{
cout<<"Masukkan bilangan yang akan dirandomkan : ";
cin>>x;
if (x==0)
{
keluar = true;
}
else
{
acak();
cout<<"Bilangannya : "<<y<<endl;
}
}

cout<<"\n\n";
system("pause");
return 0;
}

hasil yang diperoleh akan seperti berikut:


Jika kita menutup program dan menjalankannya lalu memasukkan lagi bilangan yang sama (dalam hal ini 10, 10, dst..), maka akan didapatkan hasil yang sama pula. Seperti berikut:




Jadi kita perlu sedikit modifikasi kode, dan modifikasi seperti kode berikut:

/*
Bilangan Random dengan srand()
*/
#include <iostream>

/*
jika time tidak dikenali pada
srand((unsigned)time(NULL))
*/
#include <time.h>

using namespace std;

int x,y;

void acak()
{
y=rand()%x;
}

int main(int argc,char *argv[])
{
srand((unsigned)time(NULL));

bool keluar = false;

/*
proses pengulangan selama user
tidak memasukkan angka 0
*/
while (keluar == false)
{
cout<<"Masukkan bilangan yang akan dirandomkan : ";
cin>>x;
if (x==0)
{
keluar = true;
}
else
{
acak();
cout<<"Bilangannya : "<<y<<endl;
}
}

//proses terakhir
printf("\n\n");
system("pause");
return 0;

}

Jangan tanya kenapa karena gw juga ngk tau fungsinya srand((unsigned)time(NULL));

Tapi yang pasti kita mendapat program yang menghasilkan nilai yang berbeda dari sebelumnya.

Latihan 43 : Tak Hanya void dan int

Kalau sebelumnya kita sudah terbiasa membuat fungsi dengan tipe data int dan void, kali ini kita akan membuat dengan tipe data lainnya. Berikut programnya :


#include <iostream>

using namespace std;

//kembaliannya berupa kalimat
string kalimat()
{
return "Masukkan bilangan antara 1-10 : ";
}

//sama kaya yang diatas
char *kalimatError()
{
return "\nMaaf tidak dapat dilanjutkan";
}

//fungsi untuk menghitung nilai faktorial
long faktorial(int x)
{
long tampung=1;
for (int b=1;b<=x;b++)
{
tampung = tampung*b;
}

//kembaliannya pas nih
return tampung;
}

int main(int argc, char *argv[])
{
int a=0;
cout<<kalimat();
cin>>a;

/*
jika user bandel masukkin yang diminta >;)
apalagi sampe mau masukkin bilangan negatif
*/
if ((a>10)||(a<=0))
{
cout<<kalimatError();
}
else
{
cout<<"\n"<<a<<"! = "<<a;

//biar outputnya rame hehehe..

for (int c=a-1;c>0;c--)
{
cout<<" x "<<c;
}
cout<<" = "<<faktorial(a);
}

//proses akhir (Happy Ending)
cout<<"\n\n";
system("pause");
return 0;
}

Latihan 44 : Memanggil Source Code (.cpp) Yang Lain

Kalau biasanya di baris #include selalu <iostream> atau <conio.h>, kali ini
yang dipanggil adalah source code lainnya.

Setiap kali kita membuat sebuah program dengan C++ minimal kita harus membuat sebuah fungsi utama yaitu fungsi main.

Yang pada C++ modern harus ditulis:
int main(){
}
Jangan sampai terdapat 2 / lebih fungsi utama pada saat kita memanggil source code lainnya, karena dapat terjadi konflik.

Untuk memanggilnya cukup dengan menulis nama file tersebut berserta formatnya. Berikut contoh programnya:

Buat file Segitiga.cpp. Dan tuliskan kode berikut:
using namespace std;

//menghitung volume kotak
long luasSegitiga(int alas, int tinggi)
{
return (alas*tinggi)/2;
}

//jika parameter yang dimasukkan kurang
long luasSegitiga(int alas)
{
int tinggi;
cout<<"Tolong masukkan tinggi = ";
cin>>tinggi;
return (alas*tinggi)/2;
}

//kedua fungsi diatas merupakan contoh Overload pada fungsi

Buat sebuah folder dengan nama Kotak dan buat file baru dengan nama Volume.cpp, serta tuliskan kode berikut:
int tinggi = 0;
int panjang = 0;

using namespace std;

//menghitung volume kotak
long volumeKotak(int lebar, int panjang, int tinggi)
{
return (lebar*panjang*tinggi);
}

//jika parameter yang dimasukkan kurang
long volumeKotak(int lebar, int panjang)
{

cout<<"Tolong masukkan tinggi = ";
cin>>tinggi;
return (lebar*panjang*tinggi);
}

//sama kaya yang diatas
long volumeKotak(int lebar)
{
cout<<"Tolong masukkan panjang = ";
cin>>panjang;
cout<<"Tolong masukkan tinggi = ";
cin>>tinggi;
return (lebar*panjang*tinggi);
}

//ketiga fungsi diatas merupakan contoh Overload pada fungsi

Berikut file yang berisi fungsi utama:
#include <iostream>

//memanggil file satu direktori dengan fungsi utama
#include "Segitiga.cpp"

//memanggil file dalam folder Kotak
#include "Kotak/Volume.cpp"

using namespace std;

int main(int argc, char *argv[])
{
//kita hanya tinggal memanggil fungsi tersebut :)
cout<<"Volume kubus = "<<volumeKotak(10,10,10)<<"\n\n";
cout<<"Volume kubus = "<<volumeKotak(10)<<"\n\n";

cout<<"Luas Segitiga = "<<luasSegitiga(10,10)<<"\n\n";
cout<<"Luas Segitiga = "<<luasSegitiga(10)<<"\n\n";

//proses akhir (Happy Ending)
cout<<"\n\n";
system("pause");
return 0;
}
Jika kita memanggil fungsi, contoh luasSegitiga dengan "luasSegitiga();" maka kompiler menampilkan pesan kesalahan.


Latihan 45 : Perkalian Matriks

Untuk melakukan perkalian atau pemrosesan matriks lainnya kita dapat menggunakan Array Multidimensi, agar lebih memudahkan dalam pengolahannya.

Array Multidimensi adalah array yang terdiri dari beberapa subskrip array. Berikut contoh programnya:

#include <iostream>
/*
JA = Jumlah Array

membuat konstanta agar suatu saat
terjadi perubahan nilai dapat dengan mudah diganti
*/
#define JA 3

using namespace std;

//fungsi buat nampilin nilai pada array
void tampilin_array(int tampung[JA][JA])
{
for (int a=0;a<JA;a++)
{
cout<<"[ ";
for (int b=0;b<JA;b++)
{
cout<<tampung[a][b];
if (b<(JA-1))
{
cout<<", ";
}
}
cout<<" ]\n";
}
}

int main(int argc, char *argv[])
{
int a,b,c;

/*
jika pada array biasa, seperti berikut:

int A[5] = {5,5,5,5,5};

Sedangkan inisialisasi pada array multidimensi
seperti berikut:
*/
int A[JA][JA] = {{1,0,3},{2,1,4},{0,3,5}};

/*
Jika ada array dengan bentuk berikut:

int B[3][5];

bukan berarti jumlah data yang ditampung
sebanyak 8 melainkan sebanyak 15. Jumlah tersebut
didapat dari setiap array pertama ([3]) yang memiliki
5 buah array ([5]).

Seperti buku yang selalu saya baca :D
[3], berarti terdapat 3 buah Bab,
[5], berarti setiap babnya terdapat 5 subbab lagi.
*/
int B[JA][JA] = {{3,1,2},
{5,0,4},
{1,2,1}
};

/*
Dibuat defaultnya 0 (nol)
agar saat proses berikut:

C[a][b]+=A[a][c]*B[c][b];

Tidak terjadi masalah.
*/
int C[JA][JA] = {{0,0,0},
{0,0,0},
{0,0,0}
};

for (a=0;a<JA;a++)
{
for (b=0;b<JA;b++)
{
for (c=0;c<JA;c++)
{
/*
melakukan perkalian A dan B
lalu ditampung oleh C
*/
C[a][b]+=A[a][c]*B[c][b];
}
}
}

//menampilkan nilai-nilai pada array
cout<<"A = \n";
tampilin_array(A);
cout<<"\nB = \n";
tampilin_array(B);
cout<<"\nHasil perkalian A dan B\n";
tampilin_array(C);

//Happy Ending
cout<<"\n\n";
system("pause");
return 0;
}


Latihan 46 : Invers Matriks Ordo 2x2

Berikut rumus untuk mengubah matriks A menjadi A(-1) (Invers A):


 Berikut ini contoh program untuk melakukan invers pada matriks:

#include <iostream>
#include <iomanip>

using namespace std;

/*
buat global soalnya kalau ngk
repot ngakses-nya
*/
float A[2][2] = {{0,0},{0,0}};

/*
fungsi buat melakukan invers
*/
void diInvers()
{
float a;
int b,c;
float tp[2][2]; //tp = tampung

//memperoleh nilai sesuai rumus :siul:
a = 1/((A[0][0]*A[1][1])-(A[0][1]*A[1][0]));

for(b = 0; b<2;b++){
for(c = 0; c<2; c++){
//hanya melakukan perkalian
A[b][c] = a*A[b][c];
}
}

//menampung nilai serta mengubahnya
tp[0][0] = A[1][1];
tp[0][1] = -A[0][1];
tp[1][0] = -A[1][0];
tp[1][1] = A[0][0];

for(b = 0; b<2;b++){
for(c = 0; c<2; c++){
/*
melakukan perpindahan nilai
(repot ya) :D
*/
A[b][c] = tp[b][c];
}
}
}

//fungsi buat nampilin nilai pada array
void tampilin_array(float tampung[2][2])
{
for (int a=0;a<2;a++)
{
cout<<"[ ";
for (int b=0;b<2;b++)
{
//make setw sama setfill biar keliatan rapi
cout<<setw(5)<<setfill(' ')<<tampung[a][b];
if (b<1)
{
cout<<", ";
}
}
cout<<" ]\n";
}
}

//fungsi buat minta user masukkin nilai
void masukin_nilai(){

//cuma pengulangan biasa buat minta duit eh... nilai deh
//jadi ingin pas pergi sekolah minta duit dulu :cry: (soalnya bentar lagi mau lulus :D)
for(int a = 0; a<2;a++){
for(int b = 0;b<2;b++){
cout<<"A["<<a<<"]["<<b<<"] = ";
cin>>A[a][b];
}
}
cout<<endl;
}

//fungsi utama
int main(int argc, char *argv[])
{
//meminta user memasukkan nilai untuk array
masukin_nilai();

cout.precision(3); //buat ngatur presisi
cout<<"Nilai sebelum diInvers\nA = \n";

tampilin_array(A);
diInvers();

cout<<"\nNilai sesudah diInvers\nA(-1) = \n";
tampilin_array(A);

//Happy Ending
cout<<"\n\n";
system("pause");
return 0;
}



Latihan 47 : Memanggil Sebuah File

Kalau sebelumnya membuat sebuah file di direktori tertentu (dalam hal ini C:/)
, bisa juga membuat file satu direktori dengan program dengan seperti berikut:

ofstream dibuat( "test.txt");


Berikut ini kode memanggil sebuah file:

/*

Latihan : Memanggil Sebuah File

*/
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
/*
langsung memanggil file test.txt
di-direktori yang sama dengan program
*/
ifstream Panggil("test.txt");

//jika tidak ada masalah / file yang dipanggil ada
if ( Panggil != NULL)
{
string Kalimat;

//menyimpan baris pertama file lalu menampilkannya
getline(Panggil,Kalimat);
cout<<Kalimat<<endl;

//baris kedua
getline(Panggil,Kalimat);
cout<<Kalimat;

//menutup file
Panggil.close();
}
else
{
/*
Pesan kalau file yang dipanggil ngk ada.

Bagian ini bisa dibuat sesuai keinginan, misalnya
menanyakan user apakah file-nya ingin dibuat atau tidak
(lihat latihan membuat File).
*/
cout<<"Filenya ngk ada Bro!";
}

//Happy Ending
cout<<"\n\n";
system("pause");
return 0;
}

Pastikan file yang dituju terdapat satu direktori dengan program dan memiliki 2 baris atau lebih, jika hanya terdapat satu baris dapat menggunakan fungsi "fail()" untuk memeriksa setiap baris atau pada baris tertentu.

Sehingga dapat seperti berikut:

....
//baris kedua
getline(Panggil,Kalimat);

if(Panggil.fail())
{
kalimat = "Error";
}
cout<<Kalimat;
....


Latihan 48 : Awal-awal Membuat Kelas

Sebetulnya aku bingung darimana dan gimana menjelaskan kelas (maklum ngk suka berteori), tapi yang pasti salah satu kelebihan bahasa C++ daripada pendahulunya (bahasa C) yaitu kemampuan untuk membungkus data-data dan fungsi-fungsi ke dalam sebuah kelas tertentu

Contoh kita akan membuat sebuah kelas titik, contoh:
...
class titik
{
//data private
int x, y;

public:
//Konstruktor (Constructor)
titik();

void ganti(int,int);
void tampil();
};
...

Sekilas membuat kelas sama seperti membuat sebuah tipe data bentukan struct. Pembuatan objeknya pun sama seperti struct, contoh:
...
struct titik{
...
}titikA;

titik titikB;

class Titik{
...
}TitikA;

Titik TitikB;
...

Secara default jika kita membuat data-data atau fungsi - funsgi dalam kelas tanpa memberi tingkat aksesnya, maka hak aksesnya adalah private. Sedangkan pada struct defaultnya adalah public. Sehingga
kode berikut:
...
class titik
{
//data private
int x, y;
...
};
...
Dapat juga ditulis:
...
private:
int x, y;

public:
...
atau
...
public:
...
private:
int x,y;
...

Konstruktor adalah fungsi khusus yang akan dijalankan secara otomatis ketika kita melakukan inisialisasi atau pembuatan suatu objek. Fungsi ini bisa berisi inisialisasi data-data pada kelas tersebut. Yang harus diperhatikan dalam membuat konstruktor adalah namanya. Namanya harus sama dengan nama kelasnya, contoh:
...
class titik
{
public:
titik(); //sama dengan nama kelasnya
...

Untuk mendefinisikan atau memimplementasikan data atau logaritma
dalam fungsi kita gunakan tanda "::" (tanpa tanda kutip), contoh:
...
//mendefinisikan konstruktor / fungsi khusus
titik::titik()
{
...
}

//Jika pada anggota tipe data fungsi adalah void
//maka saat mendefinisikan fungsi tersebut
//menggunakan void diikuti oleh nama kelas dan "::"
void titik::ganti(int xg, int xy)
{
...
}
...

Untuk memanggil fungsi atau mengakses data dalam sebuah kelas menggunakan "." (tanpa tanda kutip) sama seperti pada struct, contoh:
...
titikA.tampil();
...

Kalau ada yang kurang jelas atau salah mohon maaf yah... :D . Maklum teorinya jelek banget! :hihihi:

Berikut kode selengkapnya:
#include <iostream>

using namespace std;

class titik
{
//data private
int x, y;

public:
//Konstruktor (Constructor)
titik();

//argumen pada fungsi dapat dibuat sebuah variabel
//misal:
//void ganti(int xg, int yg);
//xg = x ganti, yg = y ganti --> misalnya :p
void ganti(int,int);
void tampil();
}A;

titik::titik()
{
x = 0;
y = 0;
}

void titik::ganti(int xg, int yg)
{
x = xg;
y = yg;
}

void titik::tampil()
{
cout<<"("<<x<<", "<<y<<")";
}

int main()
{
titik B;

A.ganti(5,5);

A.tampil();
B.tampil();

//Happy Ending
cout<<"\n\n";
system("pause");
return 0;
}

Latihan 49 : Pointer pada Objek Class

Seperti halnya variabel biasa variabel dengan tipe data class juga dapat menggunakan pointer, tapi sebelumnya kita lihat dulu kode berikut:

#include <stdio.h>
#include <conio.h>

int VariabelGlobal;

void setVariabelGlobal()
{
VariabelGlobal = 10;
}

int main(int argc, char **argv)
{
setVariabelGlobal();

printf("Nilainya = %d\n\n",VariabelGlobal);

printf("\n\nPress any key to continue");
char akhiri;
akhiri = getch();
return 0;
}

Kelemahan kode diatas ( dengan nada sok tahu XD ), adalah deklarasi variabel harus sebelum fungsi atau harus urut (deklarasi baru inisialiasi), sehingga kalau ada kode seperi berikut:

...
void setVariabelGlobal()
{
VariabelGlobal = 10;
}
int VariabelGlobal;
...

Pada saat kompilasi (compile/build), maka kompiler akan menampilkan pesan error.

Karena setiap variabel memiliki nilai dan alamat (di memory), maka disinilah fungsi pointer, sehingga kita tidak perlu membuat banyak variabel global yang cenderung membuat program kita yang sudah kompleks memiliki banyak sekali potensi untuk terjadi-nya error. ( moga-moga nyambung kalimatnya :jedot: ).

Sehingga kode diatas jika menggunakan pointer dapat dirubah menjadi seperti berikut:

#include <stdio.h>
#include <conio.h>

void setVariabelLokal(int *_dirubah)
{
*_dirubah = 10;
}

int main(int argc, char **argv)
{
int VariabelLokal = 0;
//parameter yang dimasukkan adalah alamat VariabelLokal
setVariabelLokal(&VariabelLokal);

printf("Nilainya = %d\n\n",VariabelLokal);

printf("\n\nPress any key to continue");
char akhiri;
akhiri = getch();
return 0;
}

Ok, kita kembali lagi ke 'class'. Pada kelas objek kelas berpointer pemanggilannya tidak menggunakan titik tapi menggunakan '->' ( kaya tanda panah ke kanan :D ). Sehingga kode seperti berikut:


#include <stdio.h>
#include <conio.h>

class Tes
{
int X,Y;
public:
Tes();
void aturXdanY(int,int);
void tampilin();
};

//konstruktor
Tes::Tes()
{
X = 0;
Y = 0;
}

void Tes::aturXdanY(int _X, int _Y)
{
X = _X;
Y = _Y;
}

void Tes::tampilin()
{
printf("Nilai X = %d dan Nilai Y = %d\n",X,Y);
}

void setKelas(Tes *_tes)
{
_tes->aturXdanY(10,10);
}

void setKelas2(Tes &_tes)
{
_tes.aturXdanY(5,5);
}

int main(int argc, char **argv)
{
Tes *tesDoang;
Tes tesLagi;

//memesan memory untuk variabel tesDoang
tesDoang = new Tes();

tesDoang->tampilin();
tesLagi.tampilin();

setKelas(tesDoang);
/*
kalau untuk 'tesLagi' tidak bisa dilewatkan melalui fungsi
'void setKelas(Tes *_tes)' dengan parameter
'setKelas(tesLagi)' atau 'setKelas(&tesLagi)'.

Jangan tanya kenapa karena aku sendiri ngk tahu :sweat:
*/
setKelas2(tesLagi);

printf("\n\n");
tesDoang->tampilin();
tesLagi.tampilin();

//ngebersihin vairabel tesDoang
delete tesDoang;

printf("\n\nPress any key to continue");
char akhiri;
akhiri = getch();
return 0;
}

Latihan 50 : Static Data Member

penggunaan static pada member class / variabel akan membuat variabel tersebut hanya terdapat satu sehingga penggunaannya akan dibagi-bagi kesemua objek kelas yang sama.


Ibarat cewe pasti namanya Mira, MIlik RAme-rame.... Garing Mode On


Berikut kodenya:


#include <stdio.h>
#include <conio.h>
#include <string>

class lewatJalanTol
{
//private langsung
static int jumlahKendaraan;
static std::string kdrnTerakhir;

public:
void tampilkanStatus();
void tambahkan(std::string);
};

// menetapkan nilai
int lewatJalanTol::jumlahKendaraan;
// dapat juga ditulis:
// int lewatJalanTol::jumlahKendaraan = 0;

std::string lewatJalanTol::kdrnTerakhir;

/*
Menambahkan jumlah kendaraan yang lewat
*/
void lewatJalanTol::tambahkan(std::string _last){
jumlahKendaraan++;
kdrnTerakhir = _last;
}

void lewatJalanTol::tampilkanStatus(){
printf("Jumlah kendaraan saat ini = %d\n", jumlahKendaraan);
printf("Kendaraaan terakhir = %s\n",kdrnTerakhir.c_str());
}

int main(){
lewatJalanTol Mobil;
lewatJalanTol Motor, //kebijakan baru jalan tol :D
Becak;

Mobil.tampilkanStatus();

//masing-masing lewat tol
Mobil.tambahkan("Mobil");
Motor.tambahkan("Motor");
Becak.tambahkan("Becak");

lewatJalanTol SiapaSaja;
printf("\n\n");
SiapaSaja.tampilkanStatus();

//Happy Ending
char a;
a = getch();
return 0;
}

Bisa dilihat bahwa terdapat baris:

int lewatJalanTol::jumlahKendaraan;

Yang berfungsi mendefinisikan variabel tersebut.

Kenapa tidak menggunakan static saat inisialisasi/pendefinisian-nya?
Ini karena tidak diijinkan oleh kompiler. Kalau tetep ngotot
pengen nambahkan kata static siap-siap untuk melihat error
kaya begini (error yang atas karena tidak mendifinisikan variabel):







sumber: http://www.videogamesindonesia.com/

Tidak ada komentar:

Posting Komentar

Komentar Anda Menjadi Masukan Buat Saya, untuk Menjadi Lebih Baik...