0
1.2. Komponen computer
1
Gambar 1.3 Lapisan Lapisan Perangkat
Ketika komputer pertama kali dinyalakan perangkat lunak melakukan
inisialisasi perangkat keras system tersebut untuk mengetahui kondisi
dan mengatur computer pada operasi yang benar. Peangkat lunak ini
bersifat permanen dan disimpan dalam memori komputer. Perangkat
lunak inilah yang dikenal sebagai firmware. Firmware digunakan untuk
meletakan program bootloader.
Bootloader merupakan sebuah program khusus dan dijalankan oleh
prosesor ketika membaca sistem operasi dari disk atau memori
nonvolatile yang kemudian menempatkannya di dalam memori.
Bootloader biasanya dimiliki komputer desktop dan workstation. Lapisan
perangkat lunak di atas firmware, adalah sistem operasi. Perangkat
lunak ini berfungsi mengendalikan operasi komputer, mengorganisir
penggunaan memori dan mengendalikan peralatan seperti keyboard,
mouse, monitor, disk drive, dan sebagainya. Sistem operasi juga
memberikan fasilitas kepada user untuk melakukan antarmuka dengan
piranti lain, menjalankan program aplikasi dan mengakses file memori
luar seperti Compact Disk (CD).
Sistem operasi, secara umum menyediakan satu set tool untuk
program aplikasi, melakukan suatu mekanisme pengaksesan monitor,
disk drive, dan seterusnya.Kenyataan dilapangan sebuah komputer
tidak semua menggunakan sistem operasi. Sering juga computer bersifat
2
sangat sederhana dan langsung menjalankan tugasnya.Pada
permasalahan tertentu, seperti router jaringan, perangkat lunaknya
terintegrasi dan sangat sederhana proses pengembangan. Perangkat
lunak pada lapisan paling tinggi adalah perangkat lunak aplikasi yang
merupakan program yang langsung berhubungan dengan kemampuan
sebuah komputer. Kemampuan sebuah computer sangat tergantung
pada aplikasi perangkat lunak sistem.
3
Gambar 1.4 Blok diagram sebuah system komputer
Instruksi diambil dan dibaca dari memori menuju computer, sedangkan
data dibaca dan ditulis oleh prosesor ke memori, hal ini ditunjukan oleh
gambar 1.5.
4
1.3.1. Central Processing Unit (CPU)
CPU atau yang sering disebut prosesor merupakan bagian terpenting
pada sebuah komputer. Dalam sistem komputer, prosesor menjadi
bagian yang menjalankan komputasi pada komputer tersebut. Prosesor
adalah suatu piranti elektronik yang mampu melakukan manipulasi
data dengan cara yang disesuaikan oleh suatu urutan instruksi.
Instruksi tersebut berfungsi sebagai opcode atau kode mesin. Urutan
instruksi ini dapat diubah dan disesuaikan dengan aplikasi, hal ini
dikarenakan sifat komputer yang programmable. Urutan instruksi
adalah sesuatu yang mendasari sebuah program.
Instruksi pada sebuah computer adalah berupa angka-angka. Angka
yang berbeda, ketika dibaca dan yang dieksekusi oleh suatu prosesor,
akan menyebabkan sesuatu hal yang berbeda pula. Instruksi pada
sebuah mesin menyesuaikan dengan machine code yang sesuai, ini
artinya bahwa setiap prosesor mempunyai instruksi masing-masing
sesuai industri yang memproduksinya. Suatu instruksi yang berbeda
mempunyai arti bahwa mesin yang diprogram juga berbeda.
1.3.2. Memori
Memori digunakan untuk menyimpan perangkat lunak yang berupa
data maupun opcode sebuah prosesor. Memori dapat dikategorikan
menjadi memori yang dapat menyimpan data secara permanen
walaupun listrik yang mengalir pada memori tersebut diputus dan
memori ini sering disebut Nonvolatail memory (tidak mudah berubah
isinya), dan memori yang bersifat sementara atau data yang disimpan
dalam memori tersebut akan hilang jika listrik yang mengalir diputus,
dan jenis memori ini sering disebut dengan Volatail memory.
Kedua jenis memori tersebut mempunyai kelebihan serta
kelemahan masing-masing, sehingga penggunaannyapun disesuaikan
dengan kebutuhan masing-masing. Memori diimplementasikan dalam
bentuk chip yang didalamnya berisi ribuan komponen elektronika.
Memori dapat diilusrasikan dalam blok diagram seperti gambar 1.6
5
Gambar 1.6 Ilustrasi Blok diagram memori sebuah system komputer
Gambar tersebut diatas merupakan memori yang terdiri dari bus alamat
yang dikodekan dengan A0 – A9. Bus alamat ini bersifat satu arah yaitu
sebagai masukan sja. Selain busalamat terdapat juga bus data sebanyak
8 bit yang bersifat dua arah sebagai masukan maupun keluaran. Bus
yang dimiliki memori selain bus alamat dan data adalah bus kendali.
Bus alamat digunakan untuk memilih data yang disimpan pada lokasi
memori, dimana banyaknya lokasi pada tiap blok memori adalah 2n, jika
n = 10 maka jumlah lokasi memori yang mungkin adalah 210 = 1024 bit.
Setiap bit data tersimpan dalam memori dalam bentuk biner 0 atau 1.
Jika banyaknya lokasi dikalikan dengan jumlah banyaknya bit dalam
tiap lokasi, untuk 10 alamat bit maka akan memperoleh kapasistas
memori 1024x8 bit.
6
aliran listriknya terputus. Informasi apapun yang disimpan didalam
RAM harus ditahan atau harus ditulis kembali setiap beberapa waktu
tertentu, walaupun ada RAM Nonvolatile khusus yang mengintegrasikan
battery backup pada sistem. RAM dapat dikategorikan menjadi dua yaitu:
RAM statis yang sering dikenal sebagai SRAM dan RAM dinamik yang
sering dikenal sebagai DRAM.
RAM statis menggunakan gerbang logika yang berpasangan untuk
menjaga masing-masing bit data. SRAM mempunyai keuntungan
mempunyai proses yang lebih cepat dan mudah digunakan, memerlukan
rangkaian pendukung eksternal yang sedikit, dan dengan konsumsi
daya yang relatif rendah. Kelemahan SRAM adalah pada kapasitas
memori SRAM sangat kecil dibandingkan DRAM, serta teknologinya jauh
lebih mahal. Dengan kapasitas SRAM yang rendah, memerlukan lebih
banyak chip untuk digunakan pada penerapan yang sama. Pada
rancangan PC modern penggunaan SRAM hanya pada mesin yang
membutuhkan kinerja yang sangat cepat seperti pada Cache Memory
Prosesor.
DRAM menggunakan kapasitor sebagai komponen utamanya untuk
mempertahankan data tiap-tiap bit. Deretan kapasitor akan menjaga
data hanya dalam waktu yang sangat pendek, selanjutnya data tersebut
akan hilang sesuai dengan sifat kapasitor. DRAM memerlukan
penyegaran berlanjut, tiap-tiap penyegaran tersebut sedikitnya
seperseribu detik. Penyegaran ini dilakukan secara terus-menerus.
Penyegaran tersebut memerlukan komponen pendukung tambahan
yaitu komponen eksternal. DRAM mempunyai kelebihan yaitu dapat
mempuyai kapasitas yang tinggi.
9
menjadi sangat praktis dan effisien. Pemrograman dan penghapusan
data pada EEPROM dapat dilakukan dengan cepat dibandingkan dengan
memori ROM sebelumnya. Hal inilah yang membuat alasan mengapa
EEPROM berkembang pesat.biasanya hanya beberapa kilobyte saja.
Memori ini tidak cocok sebagai firmware, biasanya memori ini digunakan
untuk menyimpan informasi atau data sistem, sehingga ketika listrik
terputus, datanya tidak akan hilang.
17
Computer terdiri dari saklar yang sangat banyak yang menggunakan
transistor yang jumlahnya jutaan sehingga dapat memproses jutaan
angka 0 dan 1 pada saat yang bersamaan, tiap angka 0 dan 1 disebut
bit (binary digit) lihat table berikut
0 1 bit
1 1bit
0110 4bit
10011101 8 bit
System bilangan biner disusun dari angka angka, sama seprti bilangan
decimal. Desimal mengunakan angka 1 s.d 9, sedangkan hanya
menggunakan 0 dan 1.Pengolahan data saat ini menggunakan
pengolahan kata. Saat pengolahan kata kita menggunakan key board.
Ada 101 tobol yang mewakili a,b,c dst.Selain itu juga ditemui karakter
angka 0 sampai dengan 9, dan karakter-karakter lain yang diperlukan,
antara lain: , . - ; ( ) :_ ? ! " # * % & .
Seluruh karakter yang ada pada keyboard harus didigitalkan. Karakter-
karakter tersebut diwakili oleh angka-angka 0 dan 1. Bit yang
digunakan adalah 8 bit biner. 8 bit biner dinamakan Byte. Pada sistem
bilangan biner, banyaknya kombinasi dihitung dengan 2n ≤ m, dimana n
adalah jumlah bit, m adalah kombinasi yang dapat diwakili, sehingga
pada 8 bit biner, dapat mewakili 28=256 kombinasi maksimal. Ketika
mengetik kata “digital” simbol yang digunakan adalah 6 huruf, saat
komputer mengolahnya, 6 huruf tersebut didigitalkan menjadi 6 bytes,
yang kemudian disimpan pada RAM komputer saat mengetik, dan
kemudian disimpan pada harddisk, jika disimpan. Tabel seperti dibawah
menunjukkan perbandingan ukuran unit data
18
Tabel 1.2. Perbandingan Ukuran Unit Data
19
1.6.1. Bilangan Desimal
Sistem bilangan desimal disusun oleh 10 angka atau lambang. Dengan
menggunakan lambang-lambang tersebut sebagai digit pada sebuah
bilangan, maka akan dapat mengekspresikan suatu kuantitas
Kesepuluh lambang tersebut adalah: D = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
Sistem bilangan desimal disebut juga sistem bilangan basis 10 atau
radiks 10 karena mempunyai 10 digit. Sistem bilangan ini bersifat
alamiah karena pada kenyataannya manusia mempunyai 10 jari. Kata
digit itu sendiri diturunkan dari kata bahasa Latin finger.
20
di antara tiga digit yang ada dan disebut digit paling tidak berarti (Least
Significant Digit, LSD).
Bilangan 35,27
Bilangan ini mempunyai arti 3 puluhan ditambah 5 satuan ditambah 2
per sepuluhan. Koma decimal memisahkan pangkat positif dari 10
dengan pangkat negatifnya
35,2 = 3 X 101 + 5 X 100 + 2 X 10‐1
23
dengan 2 secara berulang-ulang sehingga akan dapat diketahui sisa tiap
operasi pembagian. Sisa yang dihasilkan setiap pembagian merupakan
bit yang didapat. Dengan cara mengurutkan bit-bit tersebut dari bawah
ke atas maka dapat diketahui hasil konversi yang telah dilakukan
Sebuah bilangan desimal real
dapat pula dikonversi ke bilangan
real biner. Konversi dilakukan
dengan cara memisahkan antara
bagian bulat dan bagian
pecahannya. Konversi bagian bulat
dapat dilakukan seperti pada
24
dengan mengalikan suatubilangan desimal pecahan dengan 8. Bagian
pecahan dari hasil perkalian ini dikalikan dengan 8. Langkah ini diulang
hingga didapat hasil akhir 0. Bagian bulat dari setiap hasil perkalian
merupakan digit yang didapat. Konversi bilangan oktal ke biner lebih
mudah dibandingkan dengan konversi bilangan oktal ke desimal.Satu
digit oktal dikonversi ke 3 bit biner.
Konversi bilangan biner ke octal lebih
mudah dibandingkan konversi
bilangan desimal ke oktal. Untuk
bagian bulat, kelompokkan setiap tiga
bit biner dari paling kanan, kemudian
konversikan setiap kelompok ke satu
digit oktal. Dan untuk bagian pecahan, kelompokkan setiap tiga bit
biner dari paling kiri, kemudian konversikan setiap kelompok ke satu
digit oktal. Proses ini merupakan kebalikan dari proses konversi
bilangan oktal ke biner.
Konversi bilangan heksadesimal ke
desimal dilakukan dengan menjumlah
kan hasil perkalian semua digit heksa
desimal dengan beratnya.
Konversi bilangan desimal bulat ke
heksadesimal dilakukan dengan cara
membagi secara berulang suatu
bilangan desimal dengan 16.Sisa setiap
pembagian merupakan digit heksa-
desimal yang didapat.
25
Konversi bilangan decimal pecahan ke
heksadesimal dilakukan dengan cara
hampir sama dengan konversi bilangan
desimal pecahan ke biner, yaitu
dengan mengalikan suatu bilangan
desimal pecahan dengan 16. Bagian
pecahan dari hasil perkalian ini dikalikan dengan 16. Langkah ini
diulang hingga didapat hasil akhir 0. Bagian bulat dari setiap hasil
perkalian merupakan digit yang didapat.
Konversi bilangan heksadesimal ke
biner lebih mudah dibandingkan
konversi bilangan heksadesimal ke
desimal. Satu digit heksadesimal
dikonversi ke 4 bit.
271hex = 1001110001bin 1001110001bin = 271hex
Sehingga menjadi Jika dipecah menjadi
1 = 0001 0001 = 1
7 = 0111 0111 = 7
2 = 0010 0010 = 2
1001110001bin 2271hex
Konversi bilangan biner ke heksadesimal lebih mudah dibandingkan
konversi bilangan desimal ke heksadesimal. Untuk bagian bulat,
kelompokkan setiap empat bit biner dari paling kanan, kemudian
konversikan setiap kelompok ke satu digit heksadesimal. Pada bagian
bilangan pecahan, kelompokkan setiap empat bit biner dari paling kiri,
kemudian konversikan setiap kelompok ke satu digit heksadesimal.
Proses ini merupakan kebalikan dari proses konversi bilangan
heksadesimal ke biner.
26
Beberapa aplikasi menggunakan data yang bukan hanya bilangan tetapi
juga huruf dari alfabet dan karakter khusus lainnya. Data semacam ini
disebut dengan data alfanumerik dan mungkin dapat ditunjukkan
dengan kode numerik. Jika bilangan-bilangan dimasukkan dalam data,
maka bilangan-bilangan tersebut juga dapat ditunjukkan dengan kode
khusus. Set karakter alfa numerik secara khusus mencakup 26 huruf
alphabet (termasuk huruf besar dan huruf kecil), angka dalam digit
sepuluh desimal, dan sejumlah simbol seperti +, =, *, $ dan !.
Dua kode alphabet yang paling umum dipakai adalah ASCII
(American Standard Code for Information Interchange) dan EBCDIC
(Extended Binary Coded Decimal Interchange Code). ASCII merupakan
kode 7-bit dan EBCDIC berupa kode 8 bit. Jika suatu komputer
menangani 8-bit (1-byte) kode lebih efisien, versi 8-bit, disebut dengan
ASCII-8 juga telah dikembangkan. Selain itu ada juga beberapa kode
spesial didalam penambahan set karakter alfanumerik.
Kode simpanan ini digunakan sebagai signal komunikasi dalam
aplikasi dimana data transfer terjadi antara komputer yang
dihubungkan melalui baris komunikasi. Misalnya, LF (linefeed) dan CR
(carriage return) dihubungkan dengan printer, BEL digunakan untuk
mengaktifitaskan bell; ACK (acknowledge), NAK (negative acknowledge),
dan DLE (data link escape) berupa signal yang dapat diubah dalam baris
komunikasi. Orang yang sudah cukup lama berkecimpung di dunia
komputer, pasti pernah bekerja dengan ‘kode ASCII’. Dan bagi yang
bekerja dengan mesin-mesin mainframe IBM, pasti pernah menjumpai
‘kode EBCDIC’. Di luar ASCII dan EBCDIC, besar kemungkinan anda
paling tidak pernah mendengar istilah-istilah lain seperti berikut ini:
ISO-8859-1, UCS- 2, UTF-8, UTF-16, atau windows- 1252. Kode-kode
apakah itu? ASCII, EBCDIC, ISO-8859-X, UCS-2, UTFX, dan windows-x
merupakan sebagian dari kumpulan character set (set karakter) yang
ada di dunia computer
27
1.6.7. Kode BCD
Sebelum ASCII dan EBCDIC berkembang terlebih dahulu
dikembangkan Binary Coded Decimal (BCD). Metode ini awalnya
digunakan pada komputer mainframe IBM. Pada grup ini karakter
diwakili oleh 64 - ( 26) lambang. Dengan kode ini, setiap huruf/angka
diberikan kode yang terdiri dari enam bit, dua untuk zone dan empat
untuk angka. Huruf A sampai dengan I diberikan tanda 11 pada tempat
zone. Karena A adalah huruf pertama dalam kelompok ini, maka
kodenya adalah: 0001, B sebagai huruf kedua dengan kode: 0010, C
adalah 0011 dan seterusnya.
Dengan perkataan lain, zone bit yang mempunyai formasi 11 harus
juga disertakan pada kode lengkap masing-masing pada grup ini. Grup
alfabetik kedua adalah J hingga R, ditetapkan kode awalnya 10, yang
juga posisi masing-masing huruf ditentukan oleh angkanya masing-
masing. Huruf S hingga Z dibentuk dengan menambahkan angka bit
0010 hingga 1001 berurutan pada kode 01 dimana pada grup ini hanya
ada delapan huruf. Angka-angka 0 hingga Sembilan diberikan kode 00
di depannya diikuti oleh angka itu sendiri dalam sistim binary. Angka 0
(nol) harus dibedakan dengan tanda kosong (spasi) guna mempermudah
cara penggunaan kode.
1.6.8. Kode EBCDIC
Sistim Extended Binary Coded Decimal Interchange Code (EBCDIC)
merupakan set karakter yang merupakan ciptaan dari IBM. Salah satu
penyebab IBM menggunakan set karakter di luar ASCII sebagai standar
pada komputer ciptaan IBM adalah karena EBCDIC lebih mudah
dikodekan pada punch card yang pada tahun 1960-an masih jamak
digunakan. Penggunaan EBCDIC pada mainframe IBM masih terbawa
hingga saat ini, walaupun punch card sudah tidak digunakan lagi.
Seperti halnya ASCII, EBCDIC juga terdiri dari 128 karakter yang
masingmasing berukuran 7-bit. Bila menggunakan ukuran 8-bit maka
28
karakternya menjadi 256 atau 28. Hampir semua karakter pada ASCII
juga terdapat pada set karakter EBCDIC.
1.6.9. Kode ASCII
ASCII (Sistem American Standard Code for Information Interchange) dan
EBCDIC merupakan awal dari set karakter lainnya. ASCII merupakan
set karakter yang paling umum digunakan hingga sekarang. Set
karakter ASCII terdiri dari 128 – (27) buah karakter yang masing-masing
memiliki lebar 7-bit atau gabungan tujuh angka 0 dan 1, dari 0000000
sampai dengan 1111111. Mengapa 7-bit? Karena komputer pada
awalnya memiliki ukuran memori yang sangat terbatas, dan 128
karakter dianggap memadai untuk menampung semua huruf Latin
dengan tanda bacanya, dan beberapa karakter kontrol. ASCII telah
dibakukan oleh ANSI (American National Standards Institute) menjadi
standar ANSI X3.4- 1986.
29
BAB 2 Pemrograman Dengan C++
1.1 Pengantar
Apa itu program? Bagaimanakah membuatnya? Jika sudah dibuat,
apakah gunanya? Mungkin itu adalah pertanyaan – pertanyaan dari
orang – orang yang baru saja mengenal komputer. Program adalah
semacam sebuah metode penyelesaian masalah yang disediakan dalam
komputer untuk digunakan oleh manusia dalam mempermudah
pekerjaannya / kegiatannya. Kurang lebih itulah pengertian program,
paling tidak menurut saya. Lantas, bagaimana membuatnya?
Pembuatan program adalah dengan memberi “perintah” sedemikian rupa
kepada komputer sehingga “terciptalah” program itu yang kemudian
disimpan dalam memori komputer. Lalu, apa yang “diperintahkan” pada
komputer sehingga program itu dapat terbentuk? Tidak ada yang
berpikiran bahwa dia harus mengatakan kepada komputer: “Buatkan
saya sebuah program yang bagus yang mau dipakai untuk pembukuan
perusahaan saya. Kita, tentu saja, harus “ngobrol” dengan komputer
dengan bahasa yang bisa dimengerti olehnya. Bahasa apa itu? Sudah
banyak dibuat banyak bahasa pemrograman untuk menerjemahkan
logika pemrograman menjadi instruksi yang dapat dimengerti oleh
komputer, untuk kemudian dijalankan (dan dalam hal ini untuk
membuat program). Perintah tersebut di jalankan oleh komputer
untukmembuat sebuah program yang kemudian akan digunakan oleh
manusia / pihak yang berkepentingan.
2.2. Bahasa Pemrograman C++
C++ adalah salah satu bahasa pemrograman yang powerful untuk
membuat sebuah program. C++ adalah sebuah bahasa tingkat
menengah yang merupakan perkembangan dari bahasa C, dimana
bahasa ini merupakan bahasa pemrograman berorentasi objek (tidak
seperti pendahulunya, C). Dikatakan menengah karena bahasa ini
berada di antara bahasa tingkat tinggi dan rendah. Bahasa tingkat tinggi
merupakan bahasa yang lebih “manusawi”, karena perintah – perintah
30
dari bahasa ini lebih berorientasi kepada bahasa manusia. Visual Basic
(VB) dan Pascal adalah dua dari beberapa contoh bahasa tingkat tinggi.
Sedangkan bahasa tingkat rendah adalah bahasa yang lebih berorientasi
kepada bahasa mesin sehingga bahasa ini tidak terlalu “manusiawi” .
Contoh dari bahasa tingkat rendah ini adalah Assembly.
a. Header dan Fungsi main()
Sekarang kita masuk ke dalam pembuatan program. Beberapa bagian
yang harus di perhatikan adalah header dan fungsi. Header adalah
diana kita memasukkan library yang ada dalam C++ kedalam kode
program kita. Fungsi adalah “tempat” dimana kita bisa “bereksperimen”
. Didalamnya terdapat semua statement yang kita buat. Program yang
paling sederhana yang pernah diketahui umat manusia (seram amat
kata-katanya) adalah:
#include <iostream>
using namespace std;
void main () {
cout << “Hello, World!\n”;
}
Pada baris pertama, seperti yang kita lihat, ada perintah #include
<iostream>. Tanda ‘#’ adalah preprocessor directive. Preprocessor
directive adalah perintah – perintah yang diberikan kepada compiler
untuk melakukan definisi, memasukkan file library, dll. Contoh – contoh
dari preprocessor ini adalah:
#define maximum_number 100000
#include “fileku.h”
#ifdef maximum_number
#undef maximum_number
#define maximum_number_2 1000
#endif
31
Itu berarti bahwa kita memasukkan (include) library iostream ke dalam
kode program kita. iostream itu adalah header yang dibutuhkan untuk
“kegiatan” input dan output dari program. Perintah cout sendiri ada
karena kita memasukkan iostream ke dalam kode program kita dan juga
using namespace std; dimana ada member cout di dalamnya.
Berikut beberapa header yang terdapat dalam C++:
ctime = header waktu
cstdio = header untuk perintah C seperti printf dan scanf
cmath = header untuk operasi matematika seperti sin, cos, sqrt, dan
tan
cstring = header untuk memanipulasi string seperti strcpy, strcat, dll
(untuk lebih lengkapnya, lihat http://cplusplus.com/tutorial)
main () adalah fungsi utama (main) yang harus ada dalam setiap
program C++ kita. Di sini yang digunakan adalah dengan main tanpa
nilai kembalian dan tanpa paramater. Apa itu nilai kembalian dan apa
itu paramater? Saksikan setelah pesan – pesan berikut… eh salah, lihat
dalam bab berikutnya . Jika diperhatikan ada perintah \n pada akhir
“kalimat” Hello, World!. Apa itu? ”\n” adalah perintah dalam banyak
bahasa pemrograman sebagai baris baru (new line) jadi yang akan
ditampilkan pada program adalah:
32
Perintah dengan menggunkan backslash (‘\’) juga ada beberapa jenis,
diantaranya:
‘\a’ = untuk menghasilkan bunyi alert
‘\t’= tabulasi
‘\0’ = null terminated dalam array
Tanda ‘{‘ juga harus ada dalam setiap fungsi C++, itu menandakan awal
dari fungsi / program dan ‘}’ menandakan akhir dari fungsi / program.
b. Penulisan Dalam Bahasa C++
Penulisan dalam bahasa C++ adalah case sensitive. Yang berarti, C++
membedakan huruf kecil dan kapital. Yang berarti juga variabel_pertama
tidak sama dengan variabel_Pertama atau mboknya_echi tidak sama
dengan mboknya_Echi. Komentar dalam C++ ditulis dengan ‘//’ untuk
komentar dengan panjang satu baris atau ‘/*’ dan ‘*/’ untuk komentar
lebih dari satu baris, dimana tanda /* merupakan “pembuka” komentar
dan */ adalah “penutup” komentar. Komentar adalah cataatan ang
ditulis oleh programmer untuk sebagai pengingat atau penjelasan ketika
membaca sebuah kode. Kata – kata dalam sebuah komentar tidak akan
dieksekusi oleh compiler.
int int; /*salah karena nama sebuah variabel tidak boleh sama
dengan seuah tipe data (int)*/
int Jam_9; //salah karena nama variabel dimulai dengan huruf besar
int 90jam; /*nah, ini juga salah karena nama sebuah variabel tidak
boleh dimulai dengan bilangan*/
Penulisan yang benar dalam C++ adalah:
33
double bilangan_KeDuA; /*walaupun nama identifiernya aneh, tapi
ini juga betul :) */
Setiap statement dalam C++ harus diberi tanda ‘;’ pada akhir dari
statement. Contoh penulisan statement yang benar dalam C++ adalah:
int a, b, c;
a = 1;
b = 2;
c = a + b;
c. Tipe Data
Tipe – tipe data yang dikenal dalam C++ adalah sebagai berikut:
int
int adalah tipe data bilangan bulat (integer). Contoh penggunaan tipe int
adalah:
int a = 1;
int num1 = 2, num2 = 4;
Perhatikan bahwa dalam nilai – nilai yang masuk di assign (masukkan)
ke dalam variabel – variabel bertipe int adalah angka – angka / bilangan
bulat. Seperti namanya, int hanya bisa bernilai bulat dan bukan
pecahan (desimal). Bagaimana kalau yang tipenya int lalu yang
dimasukkan adalah hasil pembagian yang tidak bulat hasilnya? Maka:
int hasil_bagi_bulat = 5 / 2;
Hasilnya:
2
34
Ini karena 5 dibagi 2 = 2,5 kemudian karena hasil_bagi_bulat adalah
integer (bilangan bulat) 2,5 kemudian dibulatkan menjadi 2.
Untuk bilangan desimal sendiri ada tipe tertentu untuk bilangan ini.
double
adalah tipe yang khusus untuk bilangan yang tidak bulat alias desimal /
pecahan. Contoh penggunaannya adalah:
double mydouble = 5.00;
double pecahan_pertama = 2.5, pecahan_kedua = 9.9;
char
adalah tipe data karakter yang bisa menyimpan mulai dari: a – z, A – Z,
‘!’, ‘@’, dsb. Penggunannya ± sama dengan tipe - tipe yang sebelumnya:
char huruf = ‘c’;
char inisial1 = ‘A’, inisial2 = ‘W’;
char simbol = ‘#’;
bool
adalah tipe yang hanya “menyimpan” nilai “benar” dan “salah” yaitu, true
dan false (boolean). Contoh:
bool benar_atau_salah = true;
string
adalah tipe yang khusus untuk menampung semua masukan dari user
/ gabungan karakter yang sangat panjang. Misalnya:
d. Operator Aritmatika
Operator aritmatika yang sering digunakan dalam C++ adalah:
‘+’ = penjumlahan
‘-‘ = pengurangan
‘*’ = perkalian
‘/’ = pembagian
35
‘%’ = sisa bagi (modulo)
Contoh dari pemakaian operator tersebut adalah sebagai berikut:
#include <iostream>
using namespace std;
void main () {
int satu, dua, tiga, empat, lima;
satu = 1 + 0;
dua = 4 - 2;
tiga = 1 * 3;
empat = 20 / 5;
//mencari sisa bagi dari 25 / 10
lima = 25 % 10;
cout << satu << “\n”;
cout << dua << “\n”;
cout << tiga << “\n”;
cout << empat << “\n”;
cout << lima << “\n”;
}
Hasilnya adalah:
36
BAB 3 Algoritma Pemrograman
B. Uraian Materi
3.1. Pengantar Algoritma Pemrograman
Belajar memprogram adalah belajar tentang strategi pemecahan
masalah, metodologi dan sistematika pemecahan masalah tersebut
kemudian dituangkan dalam suatu notasi yang disepakati bersama.
“lebih bersifat pemahaman persoalan, analisis, sintesis” Belajar bahasa
pemrograman adalah belajar memakai suatu bahasa, aturan sintaks
(tatabahasa), setiap instruksi yang ada dan tata cara pengoperasian
kompilator atau interpreter bahasa yang bersangkutan pada mesin
tertentu. “BELAJAR MEMPROGRAM” TIDAK SAMA DENGAN “BELAJAR
BAHASA PEMROGRAMAN”
3.1.1 Algortima dan pemrograman
Algorimtma berasal dari bahasa ingeris yang diambil
dari nama seorang Arab yaitu Al-Khawarizmi. Dia
adalah seorang ilmuwan Islam yang karya karyanya
dalam bidang matematika, astronomi, astrologi dan
geografi banyak menjadi dasar perkembangan ilmu
modern. Dan dari namanya istilah yang akan kita
37
pelajari dalam bab ini muncul. Dari Al-Khawarizmi kemudian berubah
menjadi algorithm dalam Bahasa Inggris dan diterjemahkan menjadi
algoritma dalam bahasa Indonesia.
3.1.2 Definisi Algortima
Algoritma adalah urutan langkah-langkah logis penyelesaian masalah
yang disusun secara sistematis. Algoritma yang dapat menyelesaikan
suatu permasalahan dalam waktu yang singkat memiliki tingkat
kerumitan yang rendah, sementara algoritma yang membutuhkan waktu
lama untuk menyelesaikan suatu masalah membutuhkan tingkat
kerumitan yang tinggi.
41
3.2. Jenis-Jenis Bahasa Pemrograman
Bahasa Pemrograman Tingkat rendah (Bahasa mesin, Biner)
Bahasa Pemrograman Tingkat tinggi
Contoh-contoh Bahasa Pemrograman yang ada :
1. Prosedural : Algol, Pascal, Fortran, Basic, Cobol, C
2. Fungsional : LOGO, APL, LISP
3. Deklaratif : Prolog Object oriented murni: Smalltalk, Eifel, Java,
PHP, Selengkapnya lihat table berikut
NAMA PENJELASAN
BASIC Beginners All‐purpose Symbolic Instruction Code, bahasa
pemrograman yang biasa digunakan untuk merancang
program sederhana pada programer pemula
FORTRAN Formula Translator, Bahasa pemrograman yang dirancang
untuk menyelesaikan algoritma matematika yang
kompleks
COBOL Common Business‐Oriented Language. Bahasa
pemrograman yang dirancang pada aplikasi bisnis
Pascal Pemrograman terstruktur, bersifat umum, dan biasanya
bahasa pemrogram ini banyak diajarkan
C Pemrogram terstruktur, bersifat umum. Bahasa ini
dikembangkan oleh bell laboratories. Bahasa C ini dapat
digunakan sebagai bahasa aras tinggi dan aras rendah.
C++ Dasar pengembangan C. C++ dapat digunakan sebagai
bahasa berorientasi objek, yang tidak ditemukan pada
bahasa C. Bahasa ini juga dikembangkan oleh
laboratorium Bell
C# C# Bahasa ini ditemukan oleh microsoft untuk
atau “C mengembangkan aplikasi pada aplikasi microsoft .NET
sharp”.
Java Bahasa ini merupakan bahasa berorientasi objek yang
dikembangkan oleh Sum Microsistem. Dengan java
memungkinkan untuk pengembangan program yang
berjalan pada jaringan internet atau pada web browser.
VISUAL Bahasa pemrograman microsoft dimana bahasa ini
BASIC bertujuan untuk pengembangan perangkat lunak yang
dapat memudahkan programmer
dalam membuat aplikasi berbasis windows.
42
3.3. Cara penulisan algortima Ada tiga cara penulisan algoritma,
yaitu
a. Structured English (SE), SE merupakan alat yang cukup baik
untuk menggambarkan suatu algoritma. Dasar dari SE adalah
Bahasa Inggris, namun kita dapat memodifikasi dengan Bahasa
Indonesia sehingga kita boleh menyebutnya sebagai Structured
Indonesian (SI). ”SE atau SI lebih tepat untuk menggambarkan suatu
algoritma yang akan dikomunikasikan kepada pemakai perangkat
lunak”
b. Pseudocode adalah kode yang mirip dengan instruksi kode program
sebenarnya. Pseudocode berdasarkan bahasa pemrograman yang
sesungguhnya seperti BASIC, FORTRAN atau PASCAL. Pseudocode
berbasis bahasa PASCAL merupakan pseudocode yang sering
digunakan. “Pseudo berarti imitasi atau tiruan atau menyerupai,
sedangkan code menunjuk pada kode program”
Contoh Pseudocode :
1. Start
2. READ alas, tinggi
3. Luas = 0.5 * alas * tinggi
4. PRINT Luas
5. Stop
Pada Contoh diatas tampak bahwa algoritma sudah sangat mirip
dengan bahasa BASIC. Pernyataan seperti READ dan PRINT
merupakan keyword yang ada pada bahasa BASIC yang masing-
masing menggantikan kata “baca data” dan “tampilkan”. Dengan
menggunakan pseudocode seperti di atas maka proses
penterjemahan dari algoritma ke kode program menjadi lebih mudah.
43
3.4. Membuat Alur Logika Pemograman
44
1) Hindari pengulangan proses yang tidak perlu dan logika yang
berbelit sehingga jalannya proses menjadi singkat.
2) Jalannya proses digambarkan dari atas ke bawah dan diberikan
tanda panah untuk memperjelas.
3) Sebuah flowchart diawali dari satu titik START dan diakhiri dengan
END.
45
3.5. Struktur Dasar Algoritma
Algoritma berisi langkah-langkah penyelesaian suatu masalah, yang
dapat berupa runtunan aksi (sequence), pemilihan aksi (selection),
pengulangan aksi (iteration) atau kombinasi ketiganya. Struktur
dasar pembangunan algoritma ada tiga, yaitu:
1. Struktur Runtunan / Beruntun : Digunakan untuk program yang
pernyataannya sequential atau urutan.
2. Struktur Pemilihan / Percabangan : Digunakan untuk program
yang menggunakan pemilihan atau penyeleksian kondisi.
3. Struktur Perulangan : Digunakan untuk program yang
pernyataannya akan dieksekusi berulang-ulang.
1. Struktur Algoritma Runtunan / Berurutan :
Ada tiga struktur dasar yang digunakan dalam membuat algoritma
yaitu struktur berurutan (sequencing), struktur pemilihan/
keputusan/percabangan (branching) dan struktur pengulangan
(looping). Sebuah algoritma biasanya akan menggabungkan ketiga
buah struktur ini untuk menyelesaikan masalah. Struktur berurutan
dapat kita samakan dengan mobil yang sedang berjalan pada jalur
lurus yang tidak terdapat persimpangan seperti tampak pada Gambar
disamping Mobil tersebut akan melewati kilometer demi kilometer
jalan sampai tujuan tercapai.
Struktur berurutan terdiri satu atau lebih instruksi. Tiap instruksi
dikerjakan secara berurutan sesuai dengan urutan penulisannya,
yaitu sebuah instruksi dieksekusi setelah instruksi sebelumnya
selesai dieksekusi. Urutan instruksi menentukan keadaan akhir dari
algoritma. Bila urutannya diubah, maka hasil akhirnya mungkin juga
berubah.
46
Tiap instruksi dikerjakan satu persatu
Tiap instruksi dilaksanakan tepat sekali, tidak ada yang diulang
Urutan instruksi yang dilaksanakan pemroses sama dengan urutan
aksi sebagaimana yang tertulis di dalam algoritmanya
Akhir dari instruksi terakhir merupakan akhir algoritma.
Contoh bagan alir logika program berurutan (sequencing)
48
Kondisi pengulangan, yaitu syarat yang harus dipenuhi untuk
melaksanakan pengulangan. Syarat ini biasanya dinyatakan dalam
ekspresi Boolean yang harus diuji apakah bernilai benar (true) atau
salah (false)
Badan pengulangan (loop body), yaitu satu atau lebih instruksi yang
akan diulang
Start A
SUM = SUM + N
SUM = 0
TIDAK Apakah
N == 50 ?
N = 0
YA
Cetak
N = N + 1 SUM
A Selesai
49
Struktur pengulangan dengan For
50
Struktur pengulangan dengan While
LATIHAN 1.
1. Buatkan Flowchart untuk mencari Luas persegi empat ?
2. Buatlah Algoritma dan Flowchart untuk menentukan kelulusan
siswa ?
Dengan ketentuan :
Jika Nilai >= 70 maka Lulus
Jika Nilai <= 70 maka Tidak Lulus
51
BAB 4 Bahasa Pemrograman C
52
1.2. Kelebihan dan Kekurangan Bahasa C
Kelebihan Bahasa C
Bahasa C tersedia hampir di semua jenis computer.
Kode bahasa C sifatnya adalah portable dan fleksibel untuk semua
jenis computer.
Bahasa C hanya menyediakan sedikit kata-kata kunci, hanya
terdapat 32 kata kunci.
Proses executable program bahasa C lebih cepat
Dukungan pustaka yang banyak
C adalah bahasa yang terstruktur
Bahasa C termasuk bahasa tingkat menengah
Kekurangan Bahasa C
Banyaknya Operator serta fleksibilitas penulisan program kadang-
kadang membingungkan pemakai
Bagi pemula pada umumnya akan kesulitan menggunakan pointer
1.3. Pengenalan IDE Dev C++
IDE merupakan singkatan dari Integrated Development Environment,
merupakan Lembar kerja terpadu untuk pengembangan program.
IDE dari Dev C++, dapat digunakan untuk
53
Tampilan IDE Dev C++
55
1.5. Menyimpan File Editor
Penjelasan, Setelah selesai mengetikan naskah program yang baru
pada jendela Text Edit, maka selanjutnya disimpan dengan cara :
a. Kik Menu File Save
b. Menekan Ctrl + S.
Selanjutnya tampil jendela Save File As, seperti dibawah ini
56
Gambar 1.6 Menterjemahkan/compile program
1.7. Menjalankan Program
Penjelasan Proses Run merupakan suatu proses menterjemahkan
program, melakukan proses linking, membuat file eksekusi (.exe )
dan sekaligus menjalankan program. Caranya adalah :
a. Kik Menu Debug Run
b. Menekan HotKey Ctrl + F10 Selanjutnya tampil kotak dialog
Run, seperti dibawah ini
57
Gambar 1.7 Menjalankan program
Catatan Jika program yang dijalankan tidak muncul, untuk
melihat hasil compile dapat dijalankan di command prompt
Contoh-1
#include
58
#include
int main()
{
printf("Bahasa C\n");
}
Output yang akan dihasilkan, dari program 1 diatas adalah:
Bahasa C
1.9. Model Memori
Penjelasan C/C++, mempunyai enam model memori untuk
program dan data. Model-model memori tersebut adalah Model
Tiny, Model Small, Model Medium, Model Compact, Model Large,
Model Huge,
a. Model Tiny, Model memori yang menyediakan jumlah memori
untuk program dan data tidak lebih dari 64 Kb.
b. Model Small, Model memori yang menyediakan jumlah memori
untuk masing-masing program dan data tidak lebih dari 64 Kb.
c. Model Medium, Model memori yang menyediakan jumlah
memori untuk program tidak lebih dari 64 Kb dan data tidak
lebih dari 64 Kb.
d. Model Compact, Model memori yang menyediakan jumlah
memori untuk program lebih dari 64 Kb dan data tidak lebih
dari 64 Kb.
e. Model Large , Model memori yang menyediakan jumlah memori
untuk program dan data lebih dari 64 Kb.
f. Model Huge Penjelasan Model memori yang menyediakan
jumlah memori untuk menyimpan satu jenis data.
59
BAB 5 Bahasa Pemrograman
A. Tujuan Pembelajaran
1. Memahami Tipe Data
2. Memahami Variabel
3. Memahami Operator
4. Memahami Ekspresi
1.1. Tipe Data, Variabel, Konstanta, Operator, dan Ekspresi
Variabel, konstanta dan tipe data merupakan tiga hal yang akan selalu
kita jumppai ketika kita membuat program. Bahasa pemrograman
apapun dari yang paling sederhana sampai yang paling kompleks,
mengharuskan kita untuk mengerti ketiga hal tersebut.
1. Tipe Data, adalah jenis data yang dapat diolah oleh komputer untuk
memenuhi kebutuhan dalam pemrograman komputer. Setiap variabel
atau konstanta yang ada dalam kode program, sebaiknya kita
tentukan dengan pasti tipe datanya. Ketepatan pemilihan tipe data
pada variabel atau konstanta sangat menentukan pemakaian
sumberdaya komputer (terutama memori komputer). Salah satu tugas
penting seorang programmer adalah memilih tipe data yang sesuai
untuk menghasilkan program yang efisien dan berkinerja tinggi. Ada
banyak tipe data yang tersedia tergantung jenis bahasa pemrograman
yang dipakai. Namun secara umum dapat dikelompokkan seperti pada
Gambar dibawah ini
60
2 jenis tipe data :
1. Tipe data primitive adalah tipe data dasar yang tersedia secara
langsung pada suatu bahasa pemrograman.
2. Tipe data composite adalah tipe data bentukan yang terdiri dari dua
atau lebih tipe data primitive.
Tipe data numeric, digunakan pada variabel atau konstanta untuk
menyimpan nilai dalam bentuk bilangan atau angka. Semua bahasa
pemrograman menyediakan tipe data numeric, hanya berbeda dalam
jenis numeric yang diakomodasi. Jenis yang termasuk dalam tipe data
numeric antara lain :
1. integer (bilangan bulat)
2. float (bilangan pecahan).
3. tipe data Single adalah tipe data untuk bilangan pecahan dengan
presisi yang terbatas
61
4. Tipe data Double adalah tipe data untuk bilangan pecahan dengan
presisi yang lebih akurat.
Penentuan tipe data numeric untuk suatu variabel/konstanta harus
sangat berhati-hati. Manual dan petunjuk pada masing-masing bahasa
pemrograman pada bagian tipe data harus diperhatikan dengan
seksama.
Tipe data Ukuran Jangkuan nilai Jumlah Digit
memori
Chart 1 Byte -128 s.d 127
Int 2 Byte -32768 s.d 32767
Short 2 Byte -2,147, 435,648 s.d 2,147,435,647
Long 4 Byte -2,147,435,648 s.d 2,147,435,647
Float 4 Byte 3.4 x 10-38 s.d 3.4 x 10+38 5-7
Double 8 Byte 1.7 x 10-308 s.d 1.7 x 10+308 15-16
long Double 12 Byte 3.4 x 10 -4932 s.d 1.1 x 10 +4932 19
62
z = 'C';
w = 3.45E+20;
printf("Nilai dari x adalah : %i\n", x);
printf("Nilai dari y adalah : %f\n", y);
printf("Nilai dari z adalah : %c\n", z);
printf("Nilai dari w adalah : %lf\n", w);
getch();
}
Dalam bahasa C terdapat lima tipe data dasar, yaitu :
1. char format penulisan : %c
2. int format penulisan : %i, %d
3. float format penulisan : %f
4. double format penulisan : %lf
5. void tidak bertipe
2. Tipe Data, Variabel Variabel adalah tempat, kita dapat mengisi atau
mengosongkan nilainya dan memanggil kembali apabila dibutuhkan.
Setiap variabel akan mempunyai nama (identifier) dan nilai.
Contoh Nama variabel dan nilai.
username = “joni”
Nama = “Udin”
Harga = 2500
HargaTotal = 34000
Pada sebagian besar bahasa pemrograman, variabel harus
dideklarasikan lebih dulu untuk mempermudah compiler bekerja.
Apabila variabel tidak dideklarasikan maka setiap kali compiler bertemu
dengan variabel baru Pemberian nama variabel harus mengikuti aturan
yang ditetapkan oleh bahasa pemrograman yang kita gunakan. Namun
secara umum ada aturan yang berlaku untuk hampir semua bahasa
pemrograman. Aturan-aturan tersebut yaitu :
Nama variabel harus diawali dengan huruf.
Tidak boleh menggunakan spasi pada satu nama variabel. Spasi bisa
diganti dengan karakter underscore (_).
63
Nama variabel tidak boleh mengandung karakter-karakter
khusus,seperti : .,+, -, *, /, <, >, &, (, ) dan lain-lain.
Nama variabel tidak boleh menggunakan kata-kata kunci d bahasa
pemrograman
Contoh penamaan variabel
Penamaan yang benar Penamaan yang salah
namasiswa nama siswa (salah karena menggunakan
spasi)
XY12 12X (salah karena dimulai dengan angka)
harga_ total harga.total (salah karena menggunakan
karakter)
JenisMotor Jenis Motor (salah karena menggunakan
spasi)
alamatRumah for (salah karena menggunakan kata kunci
bahasa pemrograman)
Jenis-jenis Variabel
1) Variabel Numerik, dibagi menjadi menjadi 3 (tiga) macam :
Bilangan Bulat
Bilangan Desimal Berpresisi Tunggal atau Floating Point.
Bilangan Desimal Berpresisi Ganda atau Double Precision.
2) Variabel Text
Character ( Karakter Tunggal )
String ( Untuk Rangkaian Karakter )
Deklarasi Variabel Adalah proses memperkenalkan variabel kepada
bahasa C/C++ dan pendeklarasian tersebut bersifat mutlak karena jika
tidak diperkenalkan terlebih dulu maka bahasa C/C++ tidak menerima
variabel tersebut. Deklarasi Variabel ini meliputi tipe variabel, seperti :
integer atau character dan nama variabel itu sendiri. Setiap kali
pendeklarasian variabel harus diakhiri oleh tanda titik koma ( ; ).
Bentuk penulisannya:
Tipe data nama variabel;
Contoh Deklarasi
64
char nama_siswa;
char grade;
float rata_rata ;
int nilai;
3. Konstanta adalah variabel yang nilai datanya bersifat tetap dan tidak
bisa diubah. Jadi konstanta adalah juga variabel bedanya adalah pada
nilai yang disimpannya. Jika nilai datanya sepanjang program
berjalan tidak berubahubah, maka sebuah varibel lebih baik
diperlakukan sebagai konstanta.
Sebagai contoh, jika kita membuat program perhitungan matematik
yang menggunakan nilai pi (3.14159) yang mungkin akan muncul
dibanyak tempat pada kode program, kita dapat membuat pi sebagai
konstanta. Penggunaan konstanta pi akan lebih memudahkan
penulisan kode program dibanding harus mengetikkan nilai 3.14159
berulang-ulang.
1.2. Penggunaan tipe data numeric.
Kode Program A Hasil eksekusi
Program A
#include “stdio.h” X =12
Y =2.15
int main() { Z =25
int x, z;
float y;
x = 12;
y = 2.15;
z = x * y;
cout << "X =" << x << endl;
cout << "Y =" << y << endl;
cout << "Z =" << z << endl;
return 0; }
#include <iostream>
using namespace std;
int main() {
int pil; //integer pilihan atau tipe data
float Luas,kel,phi=3.14,p,l,r,a,t; // tipe data
float luas dan keliling serta rumusnya
65
char again; // tipe data untuk mengulang eksekusi
cout<<"pilih menu: "<<endl;
cout<<"[1] Luas lingkaran"<<endl; //cout berfunsi untuk
menampilkan pilihan
cout<<"[2] Luas persegi "<<endl;
cout<<"[3] Luas Segitiga "<<endl;
cout<<endl;
cek:
cout<<"masukkan pilihan Anda :";cin>>pil;
cout<<endl;
switch(pil){
67
Character
Bersama dengan tipe data numeric, character merupakan tipe data
yang paling banyak digunakan. Tipe data character kadang disebut
sebagai char atau string. Tipe data string hanya dapat digunakan
menyimpan teks atau apapun sepanjang berada dalam tanda petik
dua (“…”) atau petik tunggal (‘…’)
Perhatikan contoh berikut.
68
Cara mengisi data pada elemen larik dalam pemrograman adalah seperti
contoh berikut,
X[1]:= 4;
X[2]:= 3;
X[3]:= 2;
X[4]:= 1;
Record atau Struct Seperti halnya Array, Record atau Struct adalah
termasuk tipe data komposit. Record dikenal dalam bahasa
Pascal/Delphi sedangkan Struct dikenal dalam bahasa C++. Berbeda
dengan array, tipe data record mampu menampung banyak data dengan
tipe data berbedabeda (heterogen).
Sebagai ilustrasi array mampu menampung banyak data namun dengan
satu tipe data yang sama, misalnya integer saja. Sedangkan dalam
record, kita bisa menggunakan untuk menampung banyak data dengan
tipe data yang berbeda, satu bagian integer, satu bagian lagi character,
dan bagian lainnya Boolean. Biasanya record digunakan untuk
menampung data suatu obyek. Misalnya, siswa memiliki nama, alamat,
usia, tempat lahir, dan tanggal lahir. Nama akan akan menggunakan
tipe data string, alamat bertipe data string, usia bertipe data single
(numeric), tempat lahir bertipe data string dan tanggal lahir bertipe data
date.
Image Image atau gambar atau citra merupakan tipe data grafik
Date Time Nilai data untuk tanggal (Date) dan waktu (Time) secara
internal disimpan dalam format yang spesifik. Variabel atau konstanta
yang dideklarasikan dengan tipe data Date dapat digunakan untuk
menyimpan baik tanggal maupun jam. Tipe data ini masuk dalam
kelompok tipe data composite karena merupakan bentukan dari
beberapa tipe data.
Berikut ini contoh tipe data dalam Visual Basic.
Dim WaktuLahir As Date
WaktuLahir = “01/01/1997”
69
WaktuLahir = “13:03:05 AM”
WaktuLahir = “02/23/1998 13:13:40 AM”
WaktuLahir = #02/23/1998 13:13:40 AM#
Subrange Tipe data subrange merupakan tipe data bilangan yang
mempunyai jangkauan nilai tertentu sesuai dengan yang ditetapkan
programmer. Biasanya tipe data ini mempunyai nilai batas minimum
dan nilai batas maksimum. Tipe data ini didukung dengan sangat baik
dalam Delphi.
Berikut ini contoh deklarasi tipe data subrange dalam Delphi.
Type
BatasIndeks = 1..20
RentangTahun = 1950..2030
Var
Indeks : BatasIndeks
Tahun : RentangTahun
Enumerasi Tipe data ini merupakan tipe data yang mempunyai elemen-
elemen yang harus disebut satu persatu dan bernilai konstanta integer
sesuai dengan urutannya. Nilai konstanta integer elemen ini diwakili
oleh suatu nama variable yang ditulis di dalam kurung. Tipe data ini
juga dijumpai pada Delphi dan bahasa pemrograman deklaratif seperti
SQL.
71
- Pengurangan 6–2
72
bil++)
{ if(bil%2==0)
printf("%5.0i", bil);
}
getch();
}
Operator Penambah dan Pengurang
Masih berkaitan dengan operator pemberi nilai, Bahasa C menyediakan
operator penambah dan pengurang. Dari contoh penulisan operator
pemberi nilai sebagai penyederhanaannya dapat digunakan operator
penambah dan pengurang.
73
/* Penggunaan Notasi Didepan Variabel*/
// nama programmer :.....
#include <stdio.h>
#include <conio.h>
int main() {
int a = 10, b = 5;
printf("Nilai A = %d", a);
printf("\nNilai ++A = %d", ++a);
printf("\nNilai A = %d", a);
printf("\nNilai B = %d", b);
printf("\nNilai --B = %d", --b);
printf("\nNilai B = %d", b);
getch();
}
Output :
Nilai A = 10
Nilai ++A = 11
Nilai A = 11
Nilai B =5
Nilai –B =4
Nilai B =4
74
//Programmer :……
#include "stdio.h"
#include "conio.h"
int main()
{
int b, nilai;
b = 15;
nilai = --b; /* berarti b = b - 1; nilai = b; */
printf("nilai = %d, b = %d\n", nilai, b);
nilai = b--; /* berarti nilai = b; b = b + 1; */
printf("nilai = %d, b = %d\n", nilai, b);
getch();
}
Ouputnya : nilai = 14, b= 14 nilai = 14, b=13
2. Komentar Program
Komentar program hanya diperlukan untuk memudahkan
pembacaan dan pemahaman suatu program (untuk keperluan
dokumentasi program). Dengan kata lain, komentar program
hanya merupakan keterangan atau penjelasan program. Untuk
memberikan komentar atau penjelasan dalam bahasa C
digunakan pembatas /* dan */ atau menggunakan tanda //
untuk komentar yang hanya terdiri dari satu baris. Komentar
program tidak akan ikut diproses dalam program (akan diabaikan).
LATIHAN
1. Sebutkan tipe data yang kamu ketahui ?
2. Buatlah algoritma menggunakan tipe data char/string ?
3. Buatkan program C untuk mencari bilangan ganjil ?
75
BAB 6 Struktur Kontrol Percabangan
76
INFO Bila program tersebut dijalankan dan kita memasukan nilai 80,
maka perintah mencetak perkataan LULUS !!!! akan dilaksanakan,
namun sebaliknya bila kita memasukan sebuah nilai yang kurang dari
65 maka program akan berhenti dan tidak dihasilkan apa-apa
Contoh Program 2 :
/* Program contoh penerapan struktur kondisi if tunggal*/
//Nama programmer :........
#include "stdio.h" #include "conio.h"
int main()
{
int a,b,c,max;
printf("Masukan bil 1 : ");
fflush(stdin); scanf("%i",&a);
printf("Masukan bil 2 : ");
fflush(stdin);
scanf("%i",&b);
printf("Masukan bil 3 : ");
fflush(stdin);
scanf("%i",&c);
if((a>b)&&(a>c)) max=a;
if((b>a)&&(b>c)) max=b;
if((c>a)&&(c>b)) max=c; printf("Bil terbesar : %i \n",max);
if(max>0) printf("Bil tsb adalah bil positif \n");
if(max<0) printf("Bil tsb adalah bil negatif \n"); getch();
}
2. Percabangan Ganda
Percabangan ganda apabila terdapat 2 alternatif instruksi yang
dijalankan. Logika ini memungkinkan kompiler menjalankan salah satu
dari 2 alternatif instruksi yang ada, dan salah satu instruksi pasti
dijalankan.
Notasi algoritmik yang digunkanan :
If (kondisi)
{
Instruksi pertama
}
Else
{
77
Instruksi kedua
}
78
#include <stdio.h>
void main()
{
int nilai;
scanf(“%d”,&nilai);
if (nilai >= 80 && nilai <= 100) print(“Grade A”);
else if (nilai >= 70 && nilai <= 80) printf(“Grade B”);
else if (nilai >= 50 && nilai <= 70) printf(“Grade C”);
else printf(“Grade D”);
}
79
#include <stdio.h>
void main()
{
int tombol;
scanf(“%d”,&tombol);
swicth(tombol)
{
case „32‟: printf(“Anda menekan tombol spasi”);
break;
case ‟36: printf(“Anda menekan tombol $”);
break;
case „37‟ : printf(“Anda menekan tombol %”);
break;
case „38‟: printf(“Anda menekan tombol &”);
break;
default : printf(“Anda tidak mematahui aturan.”);
}
}
80
Bab 7 AlgoritmaPerulangan
Kompetensi Dasar :
1. Memahami struktur algoritma serta menganalisa data dalam suatu
algoritma perulangan
2. Memecahkan permasalahan dengan algoritma perulangan
Pokok Bahasan :
Perulangan dengan kondisi diawal
Perulangan dengan kondisi diakhir
Perulangan dengan kondisi akhir diinputkan user
Perulangan sebagai pencacah naik
Perulangan sebagai pencacah turun.
Tujuan Belajar :
Setelah mempelajari ini, mahasiswa diharapkan mampu
1. Menyimpulkan penerapan algoritma perulangan untuk menyelesaikan
masalah
2. Menganalisa algoritma perulangan dengan Pelbagai macam data
1. Perulangan
Salah satu bagian yang paling membedakan antara manusia dengan
komputer adalah : Komputer mampu mengerjakan instruksi dalam
hitungan ribuan bahkan jutaan kali tanpa mengenal lelah. Dalam
mempelajari algoritma pemrograman, struktur perulangan menjadi
bagian yang sangat penting untuk dipelajari.
Struktur Perulangan
Struktur perulangan terdiri dari 2 bagian, yaitu :
1. Kondisi perulangan, yaitu ekspresi yang dilakukan sebelum
pengulangan dilakukan pertama kali.
2. Body atau tubuh pengulangan, yaitu satu atau lebih instruksi yang
diulang. Selain itu biasanya di perulangan juga terdapat 2 hal
dibawah ini, antara lain : Inisialisasi : aksi yang dilakukan sebelum
81
pengulangan dilakukan pertama kali. Terminasi : aksi yang
dilakukan untuk membuat perulangan berakhir. Biasanya berupa
sebuah kondisi.
Dalam setiap bahasa pemrograman pada umumnya biasanya terdapat
3 jenis perulangan, antara lain :
1. Struktur WHILE – DO
2. Struktur Do – WHILE / REPEAT – UNTIL
3. Struktur FOR.
Ketiga jenis diatas hanyalah sebuah metode dan pada
implementasinya, notasi penulisannya (sintaks) sangat tergantung
dari setiap bahasa pemrograman yang digunakan.
2. Struktur WHILE – DO
Ciri khas dari struktur ini adalah :
Dilakukan pengencekan di awal pada kondisi sebelum menjalankan
instruksi di tubuh perulangan. Ada kemungkinan tubuh perulangan
tidak dijalankan sama sekali. Setiap kali hendak melakukan
perulangan berikutnya, selalu memeriksa kondisi perulangan. Apabila
kondisi perulangan telah memberikan nilai false / salah. Maka
perulangan akan dihentikan.
# include <stdio.h>
void main() {
int nilai_awal = 1; // inisialisasi awal. Sangat penting.
While (nilai_awal <= 100){ Printf(“/n%d”,nilai_awal);
Nilai_awal ++; // memanipulasi variabel awal agar tercapai kondisi
terminasi.
82
}}
Dalam struktur perulangan ini, ada 2 hal yang harus diperhatikan
untuk menghindari terjadinya kesalahan logika pada program.
Inisialisasi variabel awal.
Ini dimaksudkan agar ketika kompiler program melakukan
pemeriksaan terhadap kondisi awal, ditemukan kondisi yang benar.
Pada beberapa bahasa pemrograman tertentu, apabila sebuah variabel
tidak diinisialisasikan maka nilainya bisa berupa random ataupun nol.
(lihat contoh dibawah)
Manipulasi variabel awal.
Banyak terjadi kesalahan pada programmer ketika mereka membuat
program perulangan, memanipulasi variabel kondisi sangat penting
untuk menjaga program tetap sesuai dengan yang diinginkan. Ketika
kita lupa memanipulasi variabel awal, ada kemungkinan program
mengulang terus menerus (looping forever) karena kondisi yang
diinginkan tercapat terus tanpa ada perubahan. (lihat contoh dbawah)
Contoh 1 :
Program menulis angka dari 1 .. 100.
# include <stdio.h>
void main(){
int nilai_awal ; // tidak dilakukan inisialisasi awal.
While (nilai_awal <= 100){ printf(“/n%d”,nilai_awal);
Nilai_awal ++; // memanipulasi variabel awal agar tercapai
kondisi terminasi.
}}
83
kurang dari 100. Maka program bukan mencetak 1 – 100, melainkan
mencetak -1200 – 100.
Contoh 2 :
Program menulis angka dari 1 .. 100.
84
WHILE – DO) sehingga mengakibatkan instruksi dijalankan minimal 1
kali.
Notasi algoritmiknya adalah :
do { repeat Tubuh perulangan atau }
while (KONDISI); until KONDISI
Pada impelemntasinya notasi penulisan struktur perulangan ini juga
bergantung pada bahasa pemgoraman yang digunakan. Pembahasan ini
menggunakan bahasa pemrograman Turbo C dan leih ditekankan
kepada konsep – konsep perulangannya.
Contoh : Program menulis angka dari 1 .. 100.
# include <stdio.h>
void main(){ int nilai_awal = 1; // inisialisasi awal dilakukan
do
{Printf(“/n%d”,nilai_awal); Nilai_awal += 1;// tambahkan
nilai_awal sebanyak 1. }
while(nilai_awal <= 100); }
Program untuk meminta inputan dari keyboard, apabila pengguna
menekan tombol esc maka program akan berhenti.
#include <stdio.h>
#include <conio.h>
void main(){ char tombol;
do
{ tombol = getch(); // peminta penekanan tombol dari keyboard.
// selama
tombol yang ditekan tidak memiliki ASCII = 27
(tombol esc) maka //program akan tetap
berjalan.
}
while (tombol != 27); // program berhenti, karena pengguna telah
menekan tombol escape.
}
85
Kapan menggunakan WHILE – DO atau Do – WHILE ?
Pemilihan antara kedua struktur ini sangat tergantung pada
permasalahan yang dihadapi. Apabila sebuah program memerlukan
instruksi dijalankan dahulu dan baru diperiksa kondisinya maka
strukltur DO – WHILE harus digunakan namun apabila sebuha
program harus memeriksa kondisi perulangan terlebih dahulu dan
baru menjalankan tubuh perulangan, maka kondisi WHILE – DO
harus digunakan
4. Struktur FOR
Struktur perulangan for ini digunakan untuk perulangan yang tidak
perlu memeriksa kondisi apapun dan hanya melaksanakan perulangan
sejumlah kali tertentu. Struktur perulangan ini paling cocok untuk
proses perulangan yang telah diketahui batas akhirnya, karena kompiler
akan mengeksekusi lebih cepat daripada 2 jenis struktur perulangan
diatas.
Notasi algoritmiknya :
For (variabel awal = nilai awal; kondisi ;
faktor penaik){ Tubuh perulangan }
Contoh : Program menulis bilangan genap dari 2 – 100.
#include <stdio.h>
void main(){
int nilai_genap = 2; // inisialisasi awal. for (nilai_genap =2;
nilai_genap <= 100;
nilai_genap+=2) printf(“%d”,&nilai_genap);
}
Program diatas akan melakukan inisialisasi nilai_genap sebanyak 2, dan
setelah itu akan dilakukan pemeriksaan apakan kondisi terpenuhi /
memberikan nilai benar. Apabila kondisi terpenuhi maka tubuh
perulangna akan dijalankan (mencetak nilai dari nilai_genap) dan
kemudian menaikkan nilai_genap sebanyak 2. Setlah itu akan dilakukan
pemeriksaan kondisi sekali lagi, dan apabila kondisi tersebut terpenuhi
86
maka tubuh perulangan akan dijalankan lagi sedangkan apabila kondisi
perulangan tidak terpenuhi maka struktur perulangan akan berakhir.
Inti dari struktur perulangan ini adalah :
Lebih cocok untuk jenis perulangan yang memiliki batas akhir yang
sudah jelas.
Pemeriksaan kondisi awal akan dilakukan di awal. Apabila kondisi
terpenuhi, maka tubuh perulangan akan dilakukan. Apabila tidak,
maka tubuh perulangan tidak akan pernah dilakukan.
Ada kemungkinan tubuh perulangan tidak dijalankan sama sekali.
Memiliki proses yang lebih cepat dibandingkan bentuk DO – WHILE
atau WHLE – DO dalam proses perhitungan matematika.
5. Algoritma pengulangan (While, While bersarang, Repeat)
STATEMEN/PERYATAAN WHILE
Pernyataan while digunakan untuk perulangan yang banyaknya
perulangan tidak diketahui. Peryataan while mirip dengan peryataan if
yang melakukan pemeriksaan ekspresi boolean sebelum sebuah atau
serangkaian peryataan dilakukan.
Bentuk umum: while kondisi do Statemen Kondisi adalah ekspresi
boolean. Jika ekspresi bernilai true statemen dijalankan dan iperiksa
kembali, dan keluar dari perulangan jika bernilai false.
Contoh_While1:
Program deretangka_1; Hasil :
uses crt; 12345678910
var i:integer;
Begin clrscr;
i:=1;
while i <= 10 do begin writeln(i);
i:=i+1;
end;
readln; End.
Contoh_While2:
Program deretangka_2; Hasil :
uses crt; 10987654321
var i:integer;
Begin clrscr;
87
i:=10;
while i > 0 do begin writeln(i);
i:=i-1;
end;
readln;
End.
Contoh_While3:
Program jumlahinteger;
uses crt;
var i,batas,hasil:integer;
Begin clrscr;
write('Masukkan integer positif :');
readln(batas);
hasil:=0;
i:=0;
while i < batas do begin i:=1+1;
hasil:=hasil+1;
end;
write('Jumlah 1 sampai ',batas,'=');
write(hasil);
readln;
End.
While Bersarang
Contoh_While4:
Program bintang2;
uses crt;
var baris, kolom, jumbaris:integer;
Begin clrscr;
write('Jumlah baris : );
readln(jumbaris);
baris:=1;
while baris <= jumbaris do begin write('*' :jumbaris+1-baris);
kolom:=2;
while kolom <= (2*baris-1) do begin write('*');
kolom:=kolom+1;
end; writeln;
baris:=baris+1;
end;
readln;
End.
LATIHAN
Soal-soal peryataan WHILE:
1. Buatlah program untuk menampilkan bilangan 1 sampai dengan
5?
2. Buatlah program untuk menampilkan bilangan 5 sampai
dengan 1 ?
88
BAB 8 POINTER
1. Pengertian
POINTER adalah suatu variabel yang berisi alamat (address) suatu
variable, Ingat bahwa, pada umumnya memori suatu mesin
komputer terdiri dari unit-unit yang berturutan (diberi alamat
terurut) yang dapat dimanipulasi secara individu (per byte) atau
secara kelompok. Biasanya satu byte untuk suatu char, dua byte
berurutan untuk int, empat byte berurutan suatu long, dsb. Suatu
pointer biasanya memerlukan dua byte (di PC) empat byte (di SUN)
Sebelum dipakai, pointer perlu diberi alokasi memaori melalui
suatu deklarasi seperti variabel lainnya.Untuk mendeklarasikan
suatu pointer, diberi tanda * di depan nama pointer itu, mis. Int
*ip;
Mendeklarasikan bahwa variable ip mempunyai tipe int * (yaitu
bahwa, ip adalah suatu pointer ke int). Jadi ip dapat berisi alamat
suatu variable yang bertipe int.
Perhatikan bahwa,
int *ip, ipp;
mendeklarasikan bahwa, ip adalah suatu pointer ke int, ipp
adalah suatu variable bertipe int.
tetapi;
int *ip, *ipp;
mendeklarasikan bahwa, ip dan ipp masing-masing adalah
pointer ke int.
Operator unary * (sebagai operator inderction atau dereferencing)
apabila ditetapkan pada suatu pointer, memberikan objek
(variable) yang ditunjuk oleh pointer tersebut
89
/*contoh penggunaan unary * dan & */
# include <stdio.h>
Main(){
int a,*ip,b;
a=7;
*ip = &a;
printf (“alamat variabel a = %d\n”
“nilai (isi) pointer ip = %p\n\n”,&a, ip);
printf (“alamat variabel a = %d\n”
“nilai (isi) *ip = %d\n\n”, a, *ip);
b = *ip;
*ip= 4;
printf (“Sekarang, nilai b = %d\n”
“nilai a = %d\n dan nilai *ip = %p\n, b, a, *ip);
return(0);
90
/*contoh penggunaan unary * dan & */
# include <stdio.h>
Main(){
char *p, *q, ch1, ch2;
ch1 = ‘a’;
ch2 = ‘b’;
*p = &ch1;
*q = &ch2;
print f{“%c%c%c%c\n”,ch1,ch1,*p,*q}; → abab
*p = *q ;
printf{“%c,%c,%c,%c\n”ch1,ch2, *p,*q}; → abbb
*q = ch1;
*p = *q;
printf{“%c,%c,%c,%c\n”ch1,ch2, *p,*q}; → aaaa
return(0);
}
91
2. Pointer sebagai argumen Fungsi
Semua pemanggilan fungsi dalam bhs C bersifat caal-by-value.
Variabel yang dipakai sebagai agumen aktual suatu fungsi tidak
dapat diubah oleh fungsi tersebut. Karena berdasarkan mekanisme
caal-by-value hanya salinan nilai variabel itu yang dipakai sebagai
nilai awal bagi argumen fungsi tersebut. Seringkali suatu fungsi
perlu mengubah satu atau lebih variabel di luar fungsi tersebut,
misalnya fungsi untuk mempertukarkan nilai dari dua variabel.
Suatu variabel dapat diubah oleh suatu fungsi apabila alamat dari
variabel itu disalurkan sebagai argumen aktual kepada kepada
fungsi tersebut.
92
Suatu fungsi dapat menerima alamat variabel sebagai argumen
aktual, apabila argumen formalnya merupakan pointer. Call-by-
reference merupakan suatu cara untuk menya lurkan alamat
(address/reference) suatu variabel kepada suatu fungsi sehingga
memungkinkan fungsi tersebut mengubah nilai variabel itu. Jadi efek
Call-by-reference dapat diperoleh dalam bahasa C dengan
menggunakan pointer dan operator address-of &, walaupun bahasa C
hanya mengenal call-by- value. Dua contoh program berikut ini
memperlihatkan penggunaan pointer sebagai argumen fungsi
int kali (int * pb1, int *pb2){
Int hasil;
Hasil = (*pb1)*(*pb2);
Return hasil;
93
Call-by-reference dapat dicapai secara tidak langsung dalam bahasa C
dengan jalan:
94
BAB. 9 Shorting (mengurutkan data)
9.1. Pengertian
Shorting merupakan salah satu kegiatan komputasi yang sangat
penting. Aplikasinya banyak sekali, antara lain mengurutkan nilai
ujian , pengurutan kata dalm kamus, bagian dari algoritma yang
lebih rumit. input untuk algoritma shorting adalah suatu barisan
unsur-unsur yang dapat diurut. Outputnya adalah barisan unsur-
unsur terurut berdasarkan kriteria tertentu. Ada bebarapa al;goritma
sorting:
Bubble-sort, Selection-sort, Insertion-sort
Merge-sort, Quick-sort,dll
Untuk mengurutkan data dalam jumlah banyak, perlu
diperhatikan efisiensi. Ada yang efisien (Merge-sort, Quick-sort), ada
yang tidak efisisen (Bubble-sort, Selection sort, Insertion-sort.
9.2. Bubble sort
Sederhana tapi tak efisien tak baik untuk sorting data yang
banyak
Intinya, periksa barisan unsur dari ujung ke ujung, sepasang demi
sepasang, pertukarkan dua unsur berdampingan yang belum
terurut, Ulangi sampai semua unsur berada ditempat yang benar
Dalam satu kali jalan (satu pass), minimal satu unsur diteruh ke
tempat yang benar, Jika ada N unsur ,maka diperlukan maksimal
N-1 pass pertukaran> Dalam pas yang ke dua, diperlukan
maksimal N-1 pertukaran. Dan seterusnya.
# include <stdio.h>
void BubbleSorting(int arrayint[], const int bukuran);
main(){
int i, ukuran, ar [ ] =( 7,3,66,3-5,22,-77,2);
95
ukuran = sizeof (ar)/sizeof (int);
prinf (“data sebelum di sorting:\n”;
for (i=0; i<=ukuran -1;i++) prinf(“%4d”, ar[i]);
prinf (“\n”);
bubbleSort (ar,ukuran);
Contoh bubble-sort
96
Untuk data ini 5 pass cukup
9.3. Selection-sort
• Mau mengurut array
A[awal] A[awal+1] .. A[akhir], sehingga memenuhi kriteria
A[awal] <= A[awal+1] <=… . . . . . . . <= A[akhir]
• Ide algoritma
for (i=Awal; i<=Akhir-1;i++)
• taruh unsur terkecil ke i dalam A[i]arrayI= AWAL
97
maka : p+1 memberikan alamat 3004
p+2 memberikan alamat 3008
p+i memberikan alamat 3004 + i*4
Jika p dan q masing-masing menunju kke unsur-unsur suatu
array dan p>q, maka p-q menghasilkan suatu integer yang
menyatakan banyaknya unsur array anata p dan q.
98
99
MENYALIN STRING DENGAN Notasi Array dan Pointer
# include <stdio.h>
void salin1 (char *S2, const char *S1);
void salin2 (char *S2, const char *S1);
main(){
char string1[10], *string2 =“Hello”,
string3[10], string14[] =“ Apa kabar?”;
salin1(string1, string2);
printf(“string1=%d\n”string1);
salin2(string3, string4);
printf(“string3=%d\n”string3);
return(0); }
/*Salin string S1 ke S2, pakai notasi Array*/
void salin1 (char *S2, const char *S1);
{
int i;
for (i=0; S2[i] = S1[i]; i++);
/*tidak kerja apaapa disini*/
}
/*Salin string S1 ke S2, pakai notasi pointer */
void salin1 (char *S2, const char *S1);
{
int i;
for ( ; *S2 = *S1; S2++),S1++);
/*tidak kerja apaapa disini*/
}
Output
100
BAB. 10 Argumen untuk fungsi main()
10.1. Pengertian
Argumen untuk fungsi main()
Dua argumen argc dan argv, dapat dipakai oleh fungsi main untuk
berkomunikasi dengan Operating system.
101
printf(“argv = [%d]\n”, i, argv[i]);
return 0;
}
• Andaikan program ini di compile menjadi file executable bernama
coba maka perintah berikuit dalam UNIX
• coba saya suka C, menghasilkan respon di layar
102
Argumen pertama fopen adalah suatu string yang menya takan
nama file. Argumen kedua adalah suatu string yang menyatakan
modus/bagaimana file itu akan digunakan.
Fungsi fopen mengembalikan suatu pointer ke FILE. Tipe FILE
didefinisikan dalam <stdio.h>. Pointer ke FILE itu dipakai untuk
baca dari atau tulis ke file.
• Waktu suatu file di buka, file itu dikaitkan dengan suatu stream
yang merupakan saluran komunikasi antara program dengan file
itu.
• Membaca data suatu file pada dasarnya adalah membaca data
streamnya. menulis data ke suatu file pada dasarnya adalah
menulis data ke streamnya.
103
• Jika sutu file yang belum ada dibuka untuk di write atau di-
append, maka file itu akan dibuatkan
• Membuka suatu file yang sudah ada untuk di write akan
menyebabkan isi lamanya hilang
• Membuka suatu file yang sudah ada untuk di append tidak
menyebabkan isi lamanya hilang, data baru akan ditambahkan di
ujung.
• Mencoba membuka suatu file yang tidak ada untuk di read
adalah suatu error, jika terjadi error atau
fopen tidak berhasil membuka suatu file, maka
fopen akan mengembalikan pointer NULL
105
10.4. Fungsi rekursif
• Fungsi yang memanggil dirinya secara langsung atau lewat fungsi
lain disebut fungsi rekursif. Proses pemanggilan diri itu disebut
rekursi (recursion)
• Contoh kita ingin membuat suatu fingsi rekursif untuk
memangkatkan suatu bilangan real tak-nol dengan suatu pangkat
berupa bilangan bulat
106
• Latihan buat fungsi rekursif untuk mengalikan dua bilangan bulat
positif tanpa menggunakan operator perkalian
Jawab
int kali (int x, int N)
if (N==0)
return 0;
else
if (N>0)
return (x+ kali (x, N-1));
107
2. satu atau lebih kasus yang pemecahan masalahnya dilakukan
tanpa menggunakan menggunakan recusive calls, kasus ini
disebut kasus dasar atau kasus penyetop.
Supaya tidak terjadi rekursif yang tak berhingga, setiap langkah
rekursif haruslah mengarah ke kasus penyetop
# include <stdio.h>
# include <stdlib.h>
void tulis langkah (int, int, int, int);
main(int argc, *argv[])
{
int jumlahcakram;
if (argc !=2 || atoi (argv[1]) < 1)
{
fprintf (stderr, “contoh penggunaan : %s 3\n”
argv[0]);
exit (1); }
jumlahCakram = atoi (argv [1]);
printf (“\n***Menara Hanoi***\n”;
printf (“Untuk memindahkan %d cakram dari \npasak 1”
“ke 2, lakukan langkah-langkah ini:\n\n”,
jumlahCakram);
tulislangkah (jumlahcakram, 1, 2, 3);
printf(“\n **** selesai ***\n”);
return 0;
}
/*contoh rekursif untuk problem manara hanoi*/
# include <stdio.h>
# include <stdlib.h>
void tulis langkah (int, int, int, int);
main(int argc, *argv[])
{
int jumlahcakram;
if (argc !=2 || atoi (argv[1]) < 1)
{
fprintf (stderr, “contoh penggunaan : %s 3\n”
argv[0]);
exit (1);
}
jumlahCakram = atoi (argv [1]);
108
printf (“\n***Menara Hanoi***\n”;
printf (“Untuk memindahkan %d cakram dari \npasak 1”
“ke 2, lakukan langkah-langkah ini:\n\n”,
jumlahCakram);
tulislangkah (jumlahcakram, 1, 2, 3);
printf(“\n **** selesai ***\n”);
return 0;
}
void tulislangkah
(int jumlahcakram, int awal, int akhir, int bantu);
{
if (jumlahcakram = =1)
fprintf (“Pindahkan sebuah cakram dari pasak %d ke“
“ %d. \n”,awal, akhir);
else
{
tulislangkah (jumlahcakram-1, awal, bantu, akhir);
printf(“Pindahkan sebuah cakram dari pasak %d ke“
“ %d. \n”,awal, akhir);
tulislangkah (jumlahcakram-1, awal, bantu, akhir);
\ }
}
• Bila program ini di-compile menjadi file executable bernama
hanoi,maka perintah
Hanoi 4
Akan memberikan output sbb:
109
110
BAB. 11 STRUCTURE
1. Pengertian
strukture adalah suatu koleksi dari satu atau lebih variable yang
bertype sama ataupun berbeda, dan dapat diperlakukan sebagai satu
kesatuan, bandingkan dengan array yang harus mempunyai unsur
yang bertipe sama
Contoh. structue mahasiswa {
chart *nama;
int umur;
int semester;
chart NIM;
};
Mendeklarasikan suatu strukture bernama mahasiswa yang terdiri
dari 4 anggota (member)
Strukture adalah keyword bahasa C yang mengawali deklarasi suatu
structure, Suatu deklarasi struct mendefinisikan suatu tipe data baru.
Sructure sering juga dinamakan record. Kombinasi antara pointer
dan structure memungkinkan pembentukan struktur data yang
kompleks yang diperlukan untuk penanganan masalah-maslah dunia
nyata, stuktur dapat berada disebelah kiri maupun sebelaha kanan
assigment, dapat disalurkan sebagai argumen ke fungsi dan dapat
dikembalikan sebagai nilai dari fungsi. Dua struktur tidak dapat
dibandingkan, karena mereka mungkin tidak disimpan pada byte-
byte memori yang berurutan
• Deklarasi
Contoh.
structue mahasiswa m1; (type baru memerlukan alokasi memori)
Menyatakan bahwa m1 adalah suatu variable berftipe struct
mahasiswa dan baginya disediakan memori secukupnya
111
Variabel m1 terdiri dari 4 anggota dengan nama-nama: nama,
umur, semester dan NIM.
/* contoh strukture */
#include <stdio.h>
/* definisi tipe baru: sruct mahasiswa;
tidak ada alokasi memori */
structue mahasiswa {
chart *nama;
int umur;
int semester;
chart NIM;
};
main ()
{
sruct mahasiswa mhs ={“unyil”,12, 1, “1294000001”};
sruct mahasiswa *pm = &mhs;
printf (“%-10s %11s %d %2d\n”,
mhs.nama, mhs.NIM, mhs.umur, mhs.semester);
printf (“%-10s %11s %d %2d\n”,
(*pm).nama, (*pm). NIM, (*pm).umur, (*pm). semester);
112
printf (“%-10s %11s %d %2d\n”,
pm → nama, pm → NIM, pm → umur, pm → semester);
mhs.nama = “melani”;
mhs.NIM = “1293000001”;
mhs.umur = mhs.umur -1;
mhs.semesttre ++;
printf (“%-10s %11s %d %2d\n”,
pm → nama, pm → NIM, pm → umur, pm → semester);
return 0;
}
113
karyawan kar;
mhs daftar [50];
vektor v; atau double v [10];
STRING S = “abc”.
3. Struktur data dinamis
114
Istilah Self-referensial berasal dari kenyataan bahwa pointer Next
itu menunjuk ke structure, dimana next merupakan anggotanya.
Structure-structure Self-referensial dapat digantikan bersama (di-
link) untuk membentuk struktur data seperti link, stack, queue,
dan tree.
/*contoh Link dari structure -structure Self-referensial
#include <stdio.h>
#structure node {
int data;
stucture node *nex;
};
Typedef struct node SIMPUL;
main(){
SIMPUL s1, s2, *psim;
s1.data = 100;
s1.next = &s2; /*data s1 menuju s2,data s2 dimasukan ke s1*/
s2.next = NULL; data s2 tidak menuju ke mana-mana
psim = &s1;
printf (“s1.data = %d\n”, s1.data);
printf (“s2.data = %d\n”, s2.data);
printf (“psim ->data = %d\n”, psim ->data );
printf (“psim ->next ->data = %d\n”, psim ->next->data );
Return 0; }
115
BAB 12. Alokasi Memori Dinamis
1. Pengertian, Alokasi dinamis ialah program yang dapat menggunakan
memori secara dinamis melalui fungsi malloc dan free. Program
dapat melakukan alokasi memori secara dinamis yaitu pada waktu
eksekusi, untuk mendapatkan memori bagi suatu variable (biasanya
structure Self-referensial) dan untuk membebaskan memori yang
sudah tidak dibutuhkan. Banyaknya memori yang dapat dialokasikan
secara dinamis tentu saja tergantung pada jumlah memori primer
yang masih tersedia. Alokasi memori dinamis biasanya melibatkan
fungsi malloc, fungsi free dan operatos sizeof
void * malloc(size_t size);
Pernyataan ini mengalokasikan ruang memori untuk suatu objek
yang ukurannya size byte. Blok memori ini tidak diinisialisasi, jika
sukses, malloc memberikan pointer ke blok memori itu; jika tidak,
malloc memberikan pointer NULL. size_t, merupakan tipe integer
unsigned yang didefinisikan dalam stdlib.h dan stddef.h. Nilai yang
dihasilkan operator sizeof bertipe size_t
void free(void *ptr);
Pernyataan ini membebaskan blok memori yang ditunjuk oleh pointer
ptr, yang tadinya diperoleh melalui fungsi malloc. Blok memori yang
dibebaskan ini dapat dialokasikan lagi untuk keperluan lain
2. Pointer ke void
Suatu pointer dapat diberi nilai dari pointer lain yang setipe. Jika
berlainan tipe, perlu pakai operator cast. Perkecualiannya: Pointer ke
void (yaitu pointer yang bertpe void *) merupakan pointer generik
yang dapat menerima nilai dari pointer apa saja dan pointer apa saja
dapat diberi nilai dari pointer ke void, tanpa operator cast. Pointer ke
void tidak dapat dideference, karena tipe objek nya tidak diketahui.
Pointer dapat diinisialisasi atau diberi nilai berupa 0, NULL, atau
suatu alamat. Pointer dengan nilai NULL tidak menunjuk apa-apa.
116
NULL adalah suatu konstanta simbolik yang didefinisikan dalam
stdio.h.
Outputnya:
117
3. Linked-List
Linked-List merupakan suatu barisan unsur/objek. Tipe objek
merupakan suatu self-referential structure. (disebut juga node/simpul)
yang mengandung alamat (pointer) untuk objek berikutnya . Satu
objek di-Linked (dihubungkan) dengan objek berikutnya oleh pointer
tersebut. Pointer penghubung untuk unsur terakhir biasanya diberi
nilai NULL.
Contoh
118
• Menyisipkan suatu unsur diposisi setelah unsur tertentu
119
/*contoh penggunaan malloc dan free */
#include <stdio.h>
#include <stdlib.h>
struct simpul {
chart data;
struct simpul *next;};
typedef struct simpul SIMPUL;
typedef struct SIMPUL *PtrKeSIMPUL;
void cetakmenu (void);
void sisip(PtrKeSIMPUL*,char);
void cetaklist (PtrKeSIMPUL);
int kosong (PtrKeSIMPUL);
chart hapus (PtrKeSIMPUL*,chart;
main(){
PtrKeSIMPUL list = NULL
int pilihan;
char ch, info, buangan [80];
cetak menu();
pesan (); exit (1);}
printf (“ ? “); scanf (“%d”, &pilihan ); gets (buangan);
while (pilihan !=3){
switch (pilihan){
case 1;
printf (“Ketik satu huruf : “);
scanf(“%c”, &info); gets (buangan));
sisip(&list,info); cetak list (list);
break;.\n”);
}
case 2;
if(! Kosong (list) {
printf (“Ketik satu huruf yang mau dihapus: “);
scanf(“%c”, &info); gets (buangan);
char =hapus (&list,info);
if (ch != ‘\0’){
printf (“&c dihapus.\n”,info;); cetak list (list);}
else printf (“&c tidak ketemu .\n\n”, info);
} else printf (“list kosong .\n\n”);
break;
default;
printf (“Pilihan tidak sah.\n\”);; cetak menu ();
break;
} /* switch */
printf (“?”);
scanf(“%d”, &pilihan); gets (buangan);
} /* while */
printf ( ******selesai*******\n);
return 0;
}
120
void cetakmenu (void){
printf (“Pilihan anda:\n“
“ 1. Sisip satu unsur ke list.\n”
“ 2. hapus satu unsur dari list.\n”
“ 3. Selesai.\n”
}
/*sisip satu huruf dengan menjaga urutan menurut abjad*/
void sisip(PtrKeSIMPUL *plist, char info); {
PtrKeSIMPUL baru, sebelum, kini;
baru = malloc (sizeof(SIMPUL));
If (baru !=NULL) {
baru-> data = info;
baru->next =NULL
sebelum =NULL;
kini=*plist;
/*cari posisi*/
While (kini !=NULL && info > kini_>data){
sebelum = kini->next;
}
If (sebelum == NULL);{
baru->next = *plist;
*plist=baru; }
else {
sebelum->next=baru;
baru -> =kini;
}
} else {
printf (“%c tidak disisipkan,kehabisan memori.\n, info;
}
}
/*cetak list mulai dari unsur yang ditunjukoleh P*/
void cetaklist(PtrKeSIMPUL P){
If (P ==NULL)
Printf(“NULL\n\n);
else {
while (P !=NULL);{
printf(“%c-->”, P-> data);
P =P next;
}
Printf(“NULL\n\n;
}
/*hapus satu huruf dari list */
char hapus (PtrKeSIMPUL *plist, char info);{
PtrKeSIMPUL sebelum, kini, sementara;
if (info == (*plist->data) {
sementara = *plist;
121
*plist= *plist ->next;
Free(sementara);
return info;
}else {
Sebelum *plist;
kini = *plist->next;
while (kini != NULL && kini ->data !=info){
sebelum = kini;
kini = kini->next;
}
If (kini!=NULL;{
sementara = kini;
sebelum ->next=kini->next;
free(sementara);
return info;
}
}
Return ‘\0’;
}
/*contoh penggunaan malloc dan free */ else printf (“&c tidak ketemu .\n\n”, info); sebelum->next=baru;
#include <stdio.h> } else printf (“list kosong .\n\n”); baru -> =kini;
#include <stdlib.h> break; }} else {
struct simpul { default; printf (“%c tidak disisipkan,kehabisan
chart data; printf (“Pilihan tidak sah.\n\”);; cetak menu memori.\n, info; } }
struct simpul *next;}; (); /*cetak list mulai dari unsur yang
typedef struct simpul SIMPUL; break; ditunjukoleh P*/
typedef struct SIMPUL *PtrKeSIMPUL; /* switch */ void cetaklist(PtrKeSIMPUL P){
void cetakmenu (void); printf (“?”); If (P ==NULL)
void sisip(PtrKeSIMPUL*,char); scanf(“%d”, &pilihan); gets (buangan); Printf(“NULL\n\n);
void cetaklist (PtrKeSIMPUL); } /* while */ else {
int kosong (PtrKeSIMPUL); printf ( ******selesai*******\n); while (P !=NULL);{
chart hapus (PtrKeSIMPUL*,chart; return 0; printf(“%c-->”, P-> data);
main(){ } P =P next; }
PtrKeSIMPUL list = NULL void cetakmenu (void){ Printf(“NULL\n\n; }
int pilihan; printf (“Pilihan anda:\n“ /*hapus satu huruf dari list */
char ch, info, buangan [80]; “ 1. Sisip satu unsur ke list.\n” (PtrKeSIMPUL *plist, char info);{
cetak menu(); “ 2. hapus satu PtrKeSIMPUL sebelum, kini, sementara;
pesan (); exit (1);} “ 3. Selesai.\n” if (info == (*plist->data) {
printf (“ ? “); scanf (“%d”, &pilihan ); gets /*sisip satu huruf dengan menjaga urutan sementara = *plist;
(buangan); menurut abjad*/ *plist= *plist ->next;
while (pilihan !=3){ void sisip(PtrKeSIMPUL *plist, char info); { Free(sementara);
switch (pilihan){ PtrKeSIMPUL baru, sebelum, kini; char hapusreturn info;
case 1; baru = malloc (sizeof(SIMPUL)); }else {
printf (“Ketik satu huruf : “); If (baru !=NULL) { Sebelum *plist;
scanf(“%c”, &info); gets (buangan)); baru-> data = info; kini = *plist->next;
sisip(&list,info); cetak list (list); baru->next =NULL while (kini != NULL && kini ->data !=info){
break;.\n”); sebelum =NULL; sebelum = kini;
} kini=*plist; kini = kini->next; }
case 2; /*cari posisi*/ If (kini!=NULL;{
if(! Kosong (list) { While (kini !=NULL && info > kini_>data){ sementara = kini;
printf (“Ketik satu huruf yang mau dihapus: sebelum = kini->next; sebelum ->next=kini->next;
“); If (sebelum == NULL);{ free(sementara);
scanf(“%c”, &info); gets (buangan); baru->next = *plist; return info;
char =hapus (&list,info); *plist=baru; } } }
if (ch != ‘\0’){ else { Return ‘\0’;
printf (“&c dihapus.\n”,info;); cetak list (list);} }
122
BAB 13. enumeration (enum)
123
tipe enum dipakai untuk memperjelas maksud program
contoh program
/*menggunakan tipe enum*/
#include <stdio.h>
enum month { jan =1, Feb, mart, apr, may, jun, jul, aug,
sept, okt, nov, Dec};
typedef enum month bulan;
main()
{
bulan b;
char *namabulan[] = {“Januari”, “Februari”, “Maret”, “April”,
“Mei, “Juni”, ”Ju;li”, “Agustus”, “September”, “Oktober”,
“November”, “Desember”};
for (b = Jan; b <= Des; b++;
printf(“%2d,%11s\n’, b,nama bulan [b]);
return 0;
}
Outputnya
Latihan
Buat versi rekursif dari fungsi cetaklist yang ada pada halaman ……..
Void cetaklist (PtrKeSIMPUL P) {
If (P ==NULL)
printf (“NULL\n\n);
else {
while ( P != NULL) {
printf (“%c --> “, p->data);
p = p ->next; }
printf (“NULL\n\n”);
}}
124
2. Sorting lagi
Mergin ialah proses penggabungan dua barisan terurut menjadi satu
barisan terurut
Contoh
4 7 10 11
di-merge dengan
-2 1 5 8 9
Menghasilkan
-2 1 4 5 7 8 9 10 11
Merge sort
1) Bagi barisan data menjadi dua subbarisan
2) Sort tiap subbarisan secara rekursif
3) Merge ke dua subbarisan yang sudah terurut itu menjadi barisan
terurut
3. Pointer ke fungsi
Nama dari suatu fungsi adalah pointer ke fungsi itu sendiri,
seperti pointer ke variable, pointer ke fungsi dapat diperlakukan
sebagai, Argumen untuk fungsi, Unsur dalam array, Nilai yang
dikembalikan fungsi, dan lain sebagainhya
Contoh Deklarasi
125
double (*pf) (double);
Pernyataan ini menyatakan bahwa pf adalah suatu pointer ke suatu
fungsi yang memerlu-kan satu argumen bertipe double dan
mengembalikan nilai double Pehatikan pernyataan berikut, bahwa
deklarasi diatas berbeda dengan
double *g (double);
Pernyataan ini menyatakan bahwa g adalah suatu fungsi yang
memerlukan satu argumen bertipe double dan mengembalikan
nilai bertipe double * (pointer ke double).
#include <stdio.h>
Define N 5
int min (int *, int);
int jumlah (int *,int);
main(){
int a[N] = {5,7, -5, 3, 6};
pf = jumlah;
printf(“%d ==%d \n” , (*pf) (a,N), jumlah (a,N));
pf = min;
printf(“%d ==%d \n” , min (a,N), (*pf) (a,N));
return 0;
}
int min (int *a, int n); {
int I, m = a[0];
for ( i = n-1; i > 0, i- -;
if (a[i] < m) m = a[i];
return m;
int jumlah(int *a, int n); {
in i, j = a[0];
for ( i = 1; i < n, i++) j += a[i];
return j;
}
OUTPUT:
126
4. tipe-tipe dasar dalam bahasa C
Tipe-tipe Integral terdiri atas
char +unsigned char – signed char
short +unsigned short
int +unsigned
long +unsigned long
Tipe – tipe floting terdiri atas
float double long double
• Bitwise complemnet
ialah operator pembalik setiap bit dari representasi biner
argumennya. Dengan kata lain operator menghasilkan one’s
complement dari argumennya. Bit 0 menjadi 1 dan bit 1 menjadi 0
127
5. left shift and right shift
Operator left shift << menggeser ke kiri bit-bit dari operand
kirinya sebanyak posisi yang dinyatakan oleh operand kanannya. Bit
yang digeser keluar menjadi hilang, bit yang digeser masuk bernilai 0
Contoh
128
/*operator-operator bitwise*/
#include <stdio.h>
void cetakbit (unsigned char c); {
unsigned char bits = 0227; */bilangan oktal*/
unsigned char b1 = 0145;
unsigned char b2 = 0257;
unsigned char hasil;
printf(“bits : %#4o - - >”, bits); cetakbits (bits);
printf(“~bits : %#4o - - >”, hasil = ~bits); cetakbits (hasil);
printf(“bits << 2 : %#4o - - >”, hasil = bits <<2); cetakbits (hasil);
printf(“bits >> 3 : %#4o - - >”, hasil = bits >>3); cetakbits (hasil);
printf(“b1 : %#4o - - >”, b1); cetakbit (b1);
printf(“b2 : %#4o - - >”, b2); cetakbit (b2);
printf(“b1 && b2 : %#4o - - >”, hasail = b1&b2); cetakbit (hasil);
printf(“b1 ^ b2 : %#4o - - >”, hasail = b1^b2); cetakbit (hasil);
printf(“b1 |& b2 : %#4o - - >”, hasail = b1|b2); cetakbit (hasil);
printf(“b1 && b2 : %#4o - - >”, hasail = b1&b2); cetakbit (hasil);
return 0; }
void cetakbit (unsigned char c); {
unsigned char i, maks = 1 << 7; /*10000000*/
for(i =1; i<=8; i++) {
putchar ((c & maks) ? ‘1’ : ‘0’ ); c = c << 1;
}
putchar (‘\n’);
}
Outputnya:
129
6. Union
Union mengikuti sintaks untuk struct, tetapi anggota-anggotanya
menempati bagian memori yang sama. Keyword union dipakai untuk
mendeklara sikan suatu tipe union yang baru
Contoh
Union int_float {
int i;
float f;
};
bahwa tipe Union int_float mempunyai anggota i dan f setelah ada
deklarasi tipe diatas, kita dapat mendelakrasikan variable-variable
bertipe union int_float.
Union int_float a, b;
Deklasari ini mengakibatkan memori dialokasi kan untuk variable a, b.
Masing-masing variable itu mendapat alokasi memori sebanyak yang
diperlukan untuk menyimpan anggota yang terbesar.
#include <stdio.h>
Union int_float {
int i
float f;};
typedef union int_float Bilangan;
main(){
BILANGAN b;
printf(“sizeof (BILANGAN) =%d \n”, size (BILANGAN));
printf(“sizeof (int) =%d \n”, size (int));
printf(“sizeof (float) =%d \n”, size (float));
b.i = 1234;
printf(“i: %10d f:%16.10e\n”, b.i, b.f);
b.f = 1234.;
printf(“i: %10d f:%16.10e\n”, b.i, b.f);
return 0;
};
130
BAB 14. Linier search dan Binary search
1. Pengertian
Untuk melacak suatu nilai tertentu dalam sebuah array yang belum
di-short, kita dapat gunakan pelacakan linier. Jika datanya sudah di-
short, ada cara yang secara umum lebih efisien, yaitu pelacakan niner
Contoh implementasi pelacakan linier;
/*lacak linier:mengembalikan indeks
*N== a[i] jika N ada dalam array a[awal] .. A[akhir];
* mengembalikan -1 jika tidak */
int lacaklinier (int N, int a[], int awal, int akhir) {
int i; enum {tidak, ya} ketemu;
ketemu = tidak; I = awal;
While (i <= akhir && !ketemu)
if (N ==a[]) ketemu = ya ; else i++;
if (ketemu ) return i; elese return -1;
}
0utput di PC 486:
Union dipakai:
a) Apabila diperlukan interpretasi ganda untuk satu bagian memori
tertentu, atau
b) Untuk menghemat memori , dengan membolehkan bagian memori
yang sama dipakai untuk tipe-tipe yang berlainan
131
Contoh implementasi pelacakan linier;
/*lacakbinier:mengembalikan indeks
*N== a[i] jika N ada dalam array a[awal] .. A[akhir] yang
sudah terurut; mengembalikan -1 jika tidak ketemu*/
int lacaklinier (int N, int a[], int awal, int akhir) {
int rendah, tengah, tinggi; enum {tidak, ya}ketemu;
rendah = awal; tinggi = akhir; ketemu = tidak;
While (rendah i <= tinggi && !ketemu)
if (N ==a[tengah]) ketemu = ya ;
else if (N <a [tengah]) tinggi = tengah – 1;
elese rendah = tengah +1; }
If (ketemu) return tengah; else return -1;
}
2. File lanjutan
Suatu file dapat dibuka dengan fungsi fopen dalam berbagai modus
modus arti
“w” Text file for writing
“r” Text file for reading
“a” Text file for appending
“rb” Binary text file for writing
“wb” Binary text file for writing
“ab” Binary text file for appending
“r+” Text file for reading and writing
“w+” Text file for writing and reading
“a+” Text file for writing and reading
“rb+” Binary text file for reading and writing
“wb+” Binary text file for writing and reading
“ab+” Binary text file for appending and reading
Text file:
Diinterpretasikan sebagai suatu sequence dari character-charakter
teks.
Binary file:
Diinterpretasikan sebagai suatu sequence dari byte
132
Text-file lebih portable, tetap binary–file lebih cepat untuk diproses
Untuk file yang dibuka dengan modus yang mengandung +, antara
operasi abaca dan tulis perlu diselingi dengan call ke salah satu
fungsi-fungsi berikut fflush, fseek, fsetpos, rewind.
Suatu yang sedang diproses dikaitkan dengan suatu variable
(indicator posisi file ) yang berisi file-offset, yaitu suatu nilai yang
menyatakan posisi byte yang sedang dibaca atau ditulis gterhadap
posisi awal file.
Biasanya suatu file diproses dari awal file ke akhir file secara
sekuensial. Tetapi file dapat juga diakses secara random, caranya
ialah indicator posisi file itu diberi nilai yang sesuai, dengan
memaki fungsi-fungsi:
- Int fseek (FILE *fp, long offset, int patokan);
- Long ftell (FILE *fp);
- Void rewind (FILE *fp);
- Int fgetpos (FILE *fp, fpos_t *pos);
- Int fgetpos (FILE *fp, const fpos_t *pos);
Fungsi fscanf dan fprintf dipakai untuk memproses file (melakukan
I/O menurut format tertentu. Untuk mempproses file secara
mentah (unformatted I/O, dapat digunakan fungsi fread dan fwrite.
3. Size_t fread (void *ptr, Size_t ukuran, Size_t jumlah, FILE *fp);
Fungsi fread membaca maksimum jumlah * ukuran byte dari file
yang ditunjuk oleh fp dan menyimpannya dalam array yang
ditunjuk oleh ptr. Nilai yang dikembalikan ialah jumlah unsure
yang berhasil ditransfer (bisa kurang dari jumlah, jika end-of-file
muncul). Jika end-of-file dijumpai, maka indicator end-of-file dibuat
on. Jika ukuran atau jumlah bwernilai nol, maka fread tidak
melakukan apa-apa kecuali mengembalikan nilai nol.
133
Size_t fwrie (const void *ptr, Size_t ukuran, Size_t jumlah, FILE *fp);
Fungsi fwrite melakukan kebalikan dari fread. Jika nilai yang
dikembalikan kurang dari jumlah berarti ada error. Jika jumlah
dan ukuran bernilai nol, maka fwrie tidak melakukan apa-apa
kecuali mengembalikan nilai nol.
/*Membuat suatu file untuk diakses secara random*/
#include <stdio.h>
#include <stdlib.h>
#define JMLrecord 1000
typedef
struct {
int nomor;
char nama[20];
char alamat[25];
int nilai;
} MHS;
main() {
int i;
mhs blankrecord = {0, “”, “”, 0};
FILE * fp;
fp = fopen (“mhs.dat”, “wb”);
if ( fp ==NULL) {
fprintf (stdeer, “Tidak berhasil buka file .\n”);
exit (EXIT_FAILURE);
}for ( i=1; i<= JMLrecord; i++;
fwrite (&blankrecord, sizeof (MHS), 1, fp);
fclose (fp);
printf (“ *** selesai***\n);
return 0;
}
134
/*Menulis ke file yang dibuat pakai program sebelum ini*/
#include <stdio.h>
#include <stdlib.h>
#define JMLrecord 100
typedef struct {
int nomor;
char nama[20];
char alamat[25];
int nilai;
} MHS;
main() {
int i;
mhs blankrecord = {0, “”, “”, 0};
FILE * fp;
fp = fopen (“mhs.dat”, “rb+”);
if ( fp ==NULL) {
fprintf (stdeer, “Tidak berhasil buka file .\n”);
exit (EXIT_FAILURE);
}
printf (“ketik nomor mahasiswa”
“(1 s/d %d, 0 untuk berhenti)\n?”, JMLrecord);
Scanf(“%d”, &mahasiswa.nomor);
While (mahasiswa.nomor !=0) {
Printf (“Ketik nama, alamat, nilai\n? “);
Scanf (“%s%s%d”, mahasiswa.nama,
mahasiswa.alamat, &mahasiswa.nilai);
fseek (fp, (mahasiswa.nomor -1) * sizeof(MHS), seek_set);
fwrite (&mahasiswa, sizeof(MHS), 1, FP);
printf (“Ketik nomor mahasiswa\n? “);
Scanf (“%d”, &mahasiswa.nomor);
}
135
fclose (fp);
return 0;
Contoh interaksi
136
}
printf (“%-6s%-21s%-26s%7s\n”, “Nomor”,
“nama Mhasiswa”, “Alamat Mahasiswa”, “Nilai”);
fread (&mahasiswa, sizeof (MHS), 1, fp);
while (!feof(fp)) {
if (mahasiswa.nomor !=0)
printf (“%-6s%-21s%-26s%7s\n”,
mahasiswa.nomor, mahasiswa.nama,
mahasiswa.alamat, mahasiswa.nilai);
fread (&mahasiswa, sizeof (MHS), 1, fp);
}
fclose (fp);
return 0;
}
Output :
137
Program berikut ini memperlihatkan contoh penggunaan fungi tmpfile
#include <stdio.h>
#include <stdlib.h>
main() {
FILE*fp, *pfsem;
Char nama [15];
Int c, bil1, bil2;
fprintf (“Ketik nama file yang akan berisi\n”
“pasangan-pasangan bilangan bulat:\n”;
scanf ( “%s”, nama);
pf = fopen (nama, “r+”);
if (pf ==NULL) {
printf (‘Tidak berhasil buka file %s.\n”, nama)
exit(EXIT FAILURE);
}
pfsem = tmpfile (); /* buka file sementara*/
if (pfsem == NULL
printf (‘Tidak berhasil buka file %s.\n”, nama)
exit(EXIT FAILURE);
}
fsnaf (pf, “%d”, bil1, bil2);
while (!feof(pf)) {
printf (pfsem, “%d + %d = %d\n”, bil1, bil2, bil1 +bil2);
}
rewind (pf‘), rewind (pfsem); /*balik ke awal*/
while ( (c = fgetc(pfsem)) != EOF) {
fput (c, pf);
}
fclose (fp); fclose (pfsem);
return 0;
}
138
Jika file masukan berisi;
-8 105
36 69
225 -25
Maka pelaksanaan program tersebut dengan file masukan akan
mengubah isi file masukan menjadi:
-8 105 = 94
36 69= 105
225 -25 = 200
4. PREPROSESOR
Ada suatu tahap yang dilalui oleh suatu program C sebelum ia
dikompilasi menurut tata bahasa C, yaitu tahap preprocessing yang
dilakukan oleh processor C. Preprocessing mengolah baris-baris
program yang dimulai dari #. # mengawali suatu preprocessor-
directive #include <namafile> atau #include “namafile”. directive
#include menyuruh preprosecessor menaruh salinan dari suatu file
ditempat directive tersebut. Jika nama file diapit tanda <>, maka
preprocessor akan mencari file itu dalam directory-directory baku
tertentu menurut system, misalnya /user/include dalam UNIX. Jika
nama file diapit tanda “ ” maka preprocessor akan mencari file itu
dalam directory yang memuat file yang sedang dikompilasi.
Misalnya,
#include <stdio.h>
#include “msort.h”
#include “abc.c”
Directive #include sangat berguna unutk program besar yang terdiri
dari berbagai >h file dan .c file. Directive dengan #define dapat
muncul dalam 2 bentuk
#define identifier teksPengganti
#define identifier (identifier ….. identifier) teksPengganti
139
Untuk setiap directive #define bentuk pertama, preprosesor
mengganti setiap keberadaan identifier setelah directive itu dengan
teksPengganti sebelum program dikompilasi, misalnya
#define PI 3,14
Menyuruh preprosesor mengganti setiap konstanta simbolik PI yang
muncul setelah directive tersebut dengan 3.14 sebelum program
dikompilasi. Mekanisme ini berguna untuk memperjelas program
dan mnempermudah perubahan konstanta. Tetapi hati-hati, semua
teks yang muncul setelah identifier pertama akan dianggap sebagai
teksPengganti. Macra tanpa argument berlaku sebagai konstanta
simbolik. Untuk macro yang berargumen, argument-argumennya
disubsutusikan dalam teks penggantipada waktu macro itu di-
expand oleh preprocessor (di-expand, maksudnya ialah identifier dan
argument-argumennya digantikan oleh teks pengganti dalam program)
Contoh
#define kuadrat (x) ((x)*(x))
Setelah itu dalam program dapat ditulis
x = kuadrat (a+b);
yang akan di-expand menjadi
x = ((a+b)*(a+b));
Perhatian, defines-definisi berikut mengandung masalah
#define kuadrat (x) x*x
#define kuadrat (x) ((x) * (x))
#define kuadrat (x) (x)*(x)
#define kuadrat (x) ((x)*(x));
Mengapa ?
Macro sering digunakan untuk menggantikan pemanggilan fungsi
dengan inline-code. Inline-code lebih efisien karena tidak perlu
melalui proses pemanggilan fungsi yang cukup memerlukan waktu.
Fungsi-fungsi dari standard library sering didefinisikan sebagai
macro, misalnya getchar dalam stdio.h didefinisikan sebagai berikut
140
#define getchar () getc (stdin)
Contoh
#define min(x,y) (((x) < (y)) ? (x) : (y))
Membuat macro yang dapat dipakai untuk mencari minimum dari
dua nilai. Definisi dari suatu macro dapat dihapus dengan directive:
#undef identifier
Perhatian ! Ekspresi dengan efek sampingan jangan dipakai sebagai
argument dari macro, karena argument macro mungkin dievaluasi
lebih dari satu kali
Contoh, min (i++, j++) /*tidak benar*/, apa yang terjadi
141
142