Job Sheet Pemrograman Terstruktur
Job Sheet Pemrograman Terstruktur
DASAR-DASAR BAHASA C
2. Program C Dasar
Berikut ini adalah contoh potongan program sederhana yang ditulis dalam
bahasa C untuk menampilkan kalimat hallo world pada layar monitor
#include <stdio.h>
main()
{
printf(“hallo world”);
}
1
Dalam hal ini main() adalah sebuah fungsi yang harus selalu ada pada
setiap program C. sedangkan program utama diletakan didalam tanda brace {}.
Pada dasarnya program utama ini berupa pemanggilan fungsi-fungsi standar yang
tersedia pada library (misal dalam hal ini printf adalah fungsi library yang
digunakan untuk menampilkan hasil pada layar) atau fungsi-fungsi yang dibuat
oleh programmer.
Komponen-Komponen Program bahasa C
Setiap program C terdiri dari beberapa komponen yang dikombinasikan
dengan susunan tertentu. Untuk mendapatkan pemahaman yang menyeluruh
berkaitan dengan struktur program C dan komponen-komponen programnya,
dibawah ini akan diberikan program yang relative lengkap walaupun ukurannya
kecil
2
compilasi. Pengarah #include pada contoh program diatas berarti “tambahkan
isi file stdio.h”. Umumnya program C selalu membutuhkan satu atau lebih
file header.
Definisi Variabel (baris 4)
Varibel adalah sebuah nama yang digunakan sebagai petunjuk lokasi
tempat simpan data. Dalam C, sebuah varibel harus didefinisikan terlebih
dahulu sebelum digunakan. Sebuah definisi varibabel menginformasikan
pada compiler nama varibel dan tipe data yang bisa disimpan. Dalam
program contoh, definisi varibel baris 4 int a,b,c mendefinisikan tiga variable
dengan nama a, b dan c yang masing-masing akan menyimpan tipe data
integer.
Prototipe Fungsi (baris 6)
Prototipe Fungsi berguna untuk menginformasikan pada compiler C
nama dan argument-argumen fungsi yang ada pada program. Prototype ini
harus ditulis sebelum fungsi tersebut digunakan, harus ditekankan disini
bahwa prototype fungsi ini berbeda dengan definisi fungsi (function
definition).
Statemen-Statemen Program (baris 11,12,15,16,19,20,22, dan 28)
Perintah – perintah operasi yang dijalankan suatu program C pada
dasarnya merupakan statemen-statemen program: Statemen-stamen ini dapat
berupa operasi matematika, pemanggilan fungsi, membaca input keyboard,
menampilkan informasi pada layar, dan lain-lain. Perlu diingat disini bahwa
akhir statemen pada C harus selalu diakhiri oleh tanda baca semicolon.
printf()
Statemen printf() (baris 11, 15, dan 20) adalah fungsi library untuk
menampilkan informasi pada layar monitor. Statemen ini dapat menampilkan
text sederhana (seperti pada baris 11 dan 15), atau pesan dan nilai satu atau
lebih variable program (seperti pada baris 20)
scanf()
statemen scanf() (baris 12 dan 16) adalah fungsi library juga yang
berguna untuk membaca data dari keybord dan memberikan data tersebut
pada satu atau lebih variable program.
Statemen program pada baris 19 adalah pemanggilan fungsi kali().
Dengan kata lain statemen ini mengeksekusi fungsi kali, dan mengirimkan
argument a dan b pada fungsi, setelah fungsi selesai dipanggil, kali()
mengembalikan return sebuah nila pada program yang selanjutnya disimpan
pada variable c.
return
Pada baris 22 dan 28 terdapat statemen return, statemen return pada
baris 28 merupakan bagian dari fungsi kali(). Yaitu untuk menghitung
perkalian x dan y dan mengembalikan hasil pada statemen program yang
memanggil kali(). Statemen return pada baris 22 mengembalikan nilai 0 pada
system operasi setelah program selesai dilaksanakan.
3
Definisi Fungsi
Fungsi adalah bagian program yang bersifat independent yang ditulis
atau dibuat untuk melakukan tugas-tugas tertentu. Setiap fungsi harus
memiliki nama yang unik yang mencerminkan tugas yang akan dilaksanakan
oleh fungsi tersebut.
Fungsi dengan nama kali(), pada baris 26 sampai 29, adalah fungsi
yang didefinisikan programmer (user-defined function).
Bahasa C juga telah menyediakan fungsi-fungsi library yang sering
digunakan oleh programmer, misal untuk operasi-operasi input/output,
operasi matematika, dll. Yang perlu dilakukan oleh programmer untuk
menggunakan fungsi-fungsi library ini adalah cukup meng include-kan file
header yang berisi informasi fungsi-fungsi yang tersedia beserta argumennya,
misal untuk memanggil fungsi trigonometri seperti sin, cos, dan lain-lain
pada awal program harus kita tulis : #include <math.h>
Komentar Program
Komentar program bertujuan untuk dokumentasi listing sumber.
Komentar pada C harus dimulai dengan /* dan diakhiri dengan */. Setiap
bagian program yang berada diantara tanda tersebut tidak akan dicompile
oleh compiler (tidak mempengaruhi ukuran file exe).
Braces (Baris 9, 23, 27, dan 29)
Setiap fungsi yang dibuat pada C harus berada didalam tanda kurung
kurawal (brace), hal ini juga termasuk fungsi main(). Satu atau lebih
statemen yang berada dalam tanda kurung kurawal dinamakan block.
3. TIPE DATA
Selanjutnya int, float, double dan char dapat dikombinasikan dengan pengubah
(modifier) signed, unsigned, long dan short. Hasil kombinasi tipe data tersebut
secara keseluruhan adalah sebagai berikut :
4
Lebar Jangkauan Nilai
Tipe
Dalam Bit Dari Sampai Dengan
Int
Signed int
16 -32768 32767
Short int
Signed short int
Unsigned int
16 0 65535
Unsigned short int
Long int
32 -2147483648 2147483649
Signed long int
Unsigned long int 32 0 4294967296
Float 32 3.4E-38 3.4E+38
Double 64 1.7E-308 1.7E+308
Long double 80 3.4E-4932 3.4E+4932
Char
8 -128 127
Signed char
Unsigned char 8 0 255
Pengubah signed berarti nilai variabel dapat mempunyai tanda, sehingga dapat
bernilai positif atau negatif.
4. VARIABEL
Variabel adalah suatu pengenal yang digunakan untuk menyimpan suatu nilai
dan nilai dari variabel tersebut dapat berubah-ubah selama proses program.
a. Mendeklarasikan Variabel
Variabel belum dapat digunakan didalam program sebelum
dideklarasikan terlebih dahulu. Dengan kata lain, deklarasi variabel
harus dilakukan terlebih dahulu sebelum variabel tersebut digunakan.
Deklarasi variabel berarti memberitahukan kepada C tentang tipe data
dari suatu variabel, sehingga C dapat mempersiapkan terlebih dahulu
tempat dari variabel tersebut di memori.
Bentuk umum deklarasi
typedata namavariabel;
5
Contoh :
int jumlah;
float rata_rata;
char nama;
b. Menentukan tipe data variabel
Untuk menentukan tipe dari pada variabel tergantung dari jenis
data yang akan di tampung pada variabel.
c. Penugasan variabel
Memberikan nilai awal kepada suatu variabel
Bentuk umum
Namavariabel = nilai;
Contoh :
jumlah = 5;
rata_rata = 2.5;
5. KONSTANTA
6
a Konstanta Bernama
Konstanta bernama adalah suatu pengenal yang berhubungan dengan
nilai tetap (variabel konstan). C++ memungkinkan pendefinisian suatu
konstanta bernama. Hal ini dilakukan dengan menggunakan kata kunci const.
Bentuk umum :
const tipe_data nama_konstanta = nilai;
Contoh :
const int bulan = 12;
const float phi = 3.14285;
Keterangan :
1 variabel bulan adalah konstanta bernama bertipe integer
dengan nilai 12.
2 variabel phi adalah konstanta bernama bertipe float dengan
nilai 3.141592.
Konstanta bernama berbeda dengan variabel, suatu konstanta
bernama nilai yang ada padanya tidak dapat diubah setelah
didefinisikan.
Keuntungan pemakaian konstanta bernama adalah untuk
menghindari salah tulis terhadap nilai yang terkandung didalam
variabel.
Contoh :
#include <stdio.h>
main( )
{
const float phi = 3.14285;
float luas, jari_jari;
printf (“ Masukkan Nilai Jari-jari? = “);
scanf(“%f”,&jari_jari);
luas = 2 * phi * jari_jari;
printf(“ Luas lingkaran = %f \n”,luas);
}
b Konstanta Karakter dan Konstanta String
Konstanta karakter merupakan nilai sebuah karakter yang ditulis diantara tanda
petik tunggal (‘ ‘), Contoh : ‘a’, ‘7’, dll. Konstanta string (literal string)
merupakan nilai sebuah atau lebih karakter yang ditulis diantara tanda petik
ganda (“ “), Contoh : “a”, “bahasa c”, dll.
c Konstanta Karakter Escape
Konstanta karakter escape banyak digunakan di statemen-statemen untuk
menampilkan hasil, misal menggeser kursor ke baris berikutnya (ganti baris
7
baru) , membuat kursor kembali ke kolom pertama (carriage return) atau
membunyikan bel dan lain sebagainya. Suatu konstanta karater escape diawali
dengan karakter atau tanda ‘ \’.
8
8. Alt+C, compile to EXE
9. Alt+R
c. Komentar program
1. Pilih menu program accesoris command prompt
2. Jalankan progam turbo C
3. Alt + F, pilih New
4. Ketik :
/*------------------------------*
* Program Prl_3.c *
* Dibuat oleh : Raras *
* Tanggal : 17 desember 2011 *
*------------------------------*/
#include<stdio.h>
main()
{
clrscr();
printf("Pemberian Komentar\n");
printf("Tidak dieksekusi\n");
getch();
}
IV. PERTANYAAN
9
BAB 2
1) if
Bentuk IF Sederhana Pernyataan IF dipakai untuk mengambil
keputusan berdasarkan suatu syarat/kondisi.
Kondisi yang digunakan berupa kondisi ungkapan yang
melibatkan operator relasi atau operator logika.
Bentuk Penulisan:
if (kondisi)
Pernyataan
Keterangan :
Kondisi digunakan untuk menentukan penganbilan
keputusan.
Pernyataan dapat berupa sebuah pernyataan atau
statement. Bagian pernyataan akan dijalankan/ diproses
hanya jika kondisi bernilai benar.
2) if else
Kondisi adalah ungkapan bernilai Boolean maka untuk menyeleksi
kondisi tersebut perlu tanda-tanda operasi (pembanding).
Operator relasi
10
Tanda Arti
= Sama dengan
!= atau <> Tidak sama dengan
>= Lebih besar atau sama dengan
<= Lebih kecil atau sama dengan
> Lebih besar dari
< Lebih kecil dari
Operator Logika
Tanda Arti
&& DAN (logical AND)
|| ATAU (logical OR)
! BUKAN (logical NOT)
If(syarat) Else
{
Perintah 1; {
Perintah 2; Perintah 2a;
Perintah 3; Perintah 2b;
... ... ... ... ... ... ... ...
Perintah1; Perintah 2a;
} }
Keterangan:
11
3) nested if
Nested if atau struktur if bersyarang atau struktur if dalam if
digunakan untuk menyelesaikan masalah-masalah yang memiliki lebih
dari dua cabang. Seperti halnya struktur if atau if else, alternative-
alternatif dalam nested if dapat berupa alternative hanya terdiri dari
satu perintah (tunggal) atau alternative yang terdiri dari sejumlah
perintah (jamak) ataupun kombinasi antar keduanya.
Bentuk umum nested if :
if (kondisi 1) else/*JIkatidak*/
{ {
proses 1b; proses 1a;
if(kondisi 3) if(kondisi 2)
proses 3b; proses 2b;
else else
proses 3a; proses 2a;
proses 3c; proses 2c;
} }
Perhatian :
Bila perintah if atau else perintah tidak diapit tanda {} maka
hanya satu perintah setelah if atau else yang diuji berdasarkan syarat
atau kondisi dalam percabangan tersebut.
clrscr();
12
printf(“Total pembelian anda : Rp “);
scanf(“%lf”, &total_pembelian);
korting = 0”;
clrscr();
printf(“Total Pembelian = Rp
%.2lf\n”,total_pembelian);
getch();
13
main()
{
int nilaiujian;
clrscr();
printf(“Masukkan nilai ujian anda : “);
scanf(“%d”, &nilaiujian);
/* proses seleksi kondisi */
14
{
printf(“Bilangan %d habis dibagi 2\n”,
bilangan);
puts(“Karena itu termasuk sebagai bilangan
Genap”);
}
}
d. Kasus nested if
1. Pilih menuprogramaccesoriscommand prompt
2. Jalankan program turbo C
3. Alt+F, pilih new
4. Ketik :
/*-------------------------------------------*
* Program Lat4d.c *
* Untuk seleksi calon menantu *
* Hanya guyoo..n waton lhoooo *
*--------------------------------------------*/
#include <stdio.h>
#include <conio.h>
main()
{
float gaji;
int tinggi, usia;
char kerja, agama, nama[20];
clrscr;
puts(“\t\tData pribadi saya”);
puts(“===============================”);
printf(“Masukkan nama anda :”);
scanf(“%s”,&nama);
15
clrscr();
gaji = 0;
/* proses seleksi kondisi */
if (((agama ==’T’) :: (agama == ‘t’)) && ((kerja
==’S’):: (kerja == ‘s’)))
if ((usia >= 25) & (tinggi >= 160))
{
puts(“Syarat menantu pertama sudah
terpenuhi”);
puts(“Eeeee tapi jangan bangga dulu,
masih ada syarat lain lhoooo”);
printf(“\n\nSebutin berapa gaji mas %s dulu
: “,nama);
scanf(“%f”, &gaji); clrscr();
}
IV. PERTANYAAN
1. Apa yang dimaksud dengan perintah jamak dan tunggal? Jelaskan dengan
singkat dan jelas.
2. Sebuah toko membuka usaha fotocopy dengan ketentuan, jika jumlah total
lembar yang difotocopy >= 100, maka harga perlembar Rp. 50, tetapi jika
kurang dari 100, maka harga perlembar Rp. 60. Buatlah flowchart dan
programnya.
3. Pengambangan dari soal di atas, ternyata perusahaan itu cukup maju dan
mempunyai banyak langganan. Untuk langganan biaya fotocopynya adalah
16
Rp. 50. Modifikasilah flowchart dan program d atas sehingga ketentuan
tersebut bisa dipenuhi.
4. Diketahui persamaan uadrat ax² + bx +c = 0. Buatlah program untuk
menghitung nilai-nilai akarnya dengan ketentuan nilai deskriminasinya sebagai
berikut :
D = b² – 4ac
−b
D = 0, maka nilai akarnya x1 = x2 = 2𝑎
√D
D>0, maka nilai akarnya x1 = -b + 𝑥 = 2𝑎
√D
x2 = -b - 2𝑎
D < 0, maka akarnya imajiner (Tampilkan keterangan “Akar imajiner”).
17
BAB 3
STRUKTUR PERCABANGAN
BERTINGKAT
I. TUJUAN
Mengetahui dan menjelaskan tentang struktur algoritma percabangan bersyarat
( if-then-else bertingkat, case ).
Membuat algoritma dalam bentuk flowcharts dan pseudocode yang melibatkan
permasalahan-permasalahan percabangan bersyarat( if-then-else bertingkat,
case )dimana komputer harus melakukan pemilihan untuk menuju ke salah
satu cabang berdasarkan kondisi tertentu.
Mengimplementasikan algoritma yang telah dibuat ke dalam bahasa
pemrograman dengan menggunakan bahasa Pascal.
18
Catatan :
KONDISI adalah ungkapan yang digunakan untuk menyatakan suatu yang
disyaratkan (ungkapan akan bernilai boolean( kondisi true atau false))
2. Pernyataan Switch
Pernyataan switch merupakan pernyataan yang dirancang khusus untuk
menangani pengambilan keputusan yang melibatkan sejumlah alternative.
Struktur diagram alir :
Switch (ungkapan)
Case konstanta_1;
Pernyataan_1;
19
Break;
Case konstanta_2;
Pernyataan_2;
Break;
……………
Case konstanta_n;
Pernyataan_n;
Break;
Default;
Pernyataan_m
Keterangan :
Ungkapan atau ekpresi dapat berupa ungkapan bernilai integer atau bertipe karakter.
Setiap konstanta-I (konstanta_1, konstanta_2, konstanta_3…… konstanta_n) dapat berupa
konstanta integer atau karakter. Setiap pernyataan_I ( pernyataan_1, pernyataan_2,
pernyataan _3 …. Pernyataan_n) dapat berupa pernyataan tunggal atau pernyataan jamak.
Seperti halnya pengujian dalam IF-ELSE, pengujian dalam SWITCH juga dimulai
dari konstanta_1 . Bila suatu nilai ungkapan sesuai dengan nilai konstanta, maka proses yang
ada dalam konstanta tersebut yang akan dikerjakan dan diakhiri dengan kata kunci break
(berakhir). Bila nilai ungkapan tidak ada yang cocok dengan semua nilai konstanta maka
proses default yang dikerjakan.
20
*----------------------------------------------*/
#include <stdio.h>
main()
{
int kode_hari;
puts("=================================================");
puts("Menentukan hari ");
puts("1=SENIN 2=SELASA 3=RABU 4=KAMIS ");
puts("5=JUM'AT 6=SABTU 7=MINGGU ");
puts("=================================================");
printf("Masukkan kode hari (1..7) : ");
scanf("%d", &kode_hari);
if (kode_hari == 1)
puts("Hari SENIN");
else
if (kode_hari == 2)
puts("Hari SELASA");
else
if (kode_hari == 3)
puts("Hari RABU");
else
if (kode_hari == 4)
puts("Hari KAMIS");
else
if (kode_hari == 5)
puts("Hari JUM'AT");
else
if (kode_hari == 6)
puts("Hari SABTU");
else
if (kode_hari == 7)
puts("Hari MINGGU");
else
puts("Kode yang anda masukkan salah!");
getch();
}
21
7. Alt+C, compile to OBJ
8. Alt+C, compile to EXE
9. Alt+R
IV. PERTANYAAN
1. Buatlah program yang dapat digunakan untuk menjumlahkan atau megalikan atau
mengurangkan atau membagi dua bilangan. (sekali dijalankan hanya mengerjakan
salah satunya).
2. Anda serang mengetahui perintah if – else secara bertingkat. Coba terangkan
jalannya eksekus program jika menemui instruksi (perintah tersebut).
3. Demikian juga untuk perintah switch, coba terangkan jalannya eksekusi program
jika menemui instruksi (perintah tersebut).
4. Menurut pendapat anda mengapa semua permasalahan percabangan yang dapat
diselesaikan dengan struktur if-else tidak mesti dapat diselesaikan menggunakan
struktur switch? Jelaskan dengan singkat dan jelas dan sertai pula dengan contoh
programnya.
22
BAB 4
STRUKTUR PERULANGAN
I. TUJUAN
1. Mengetahui dan memahami tentang perintah perulangan (loop/repitive) dalam
bahasa C.
2. Menjelaskan tentang bentuk umum atau struktur dari perintah-perintah
perulangan tersebut.
3. Membuat progrma yang melibatkan permasalahan-permasalahan yang
membutuhkan proses perulangan.
Salah
keluar loop
Catatan :
KONDISI adalah ungkapan yang digunakan untuk menyatakan suatu
yang diisyaratkan (ungkapan akan bernilai boolean (kondisi true atau
false))
Pernyataan adalah perintah-perintah yang dikerjakan selama loop
berlangsung. Biasanya perulangan dalam d0-while pasti berupa
pernyataan jamak.
23
Contoh penggunaan do-while, untuk mengunci pemakai agar yang
ditekan hanya tombol ‘Y’, ‘y’, ‘T’, atau ‘t’ (bila tombol lain yang ditekan
maka loop akan berjalan terus):
cacah1 { inisialisasi variable counter }
do
output (“Selamat Belajar Algoritma”)
cacahcacah+1 {increment variabel counter}
while(cacah ≤ 100)
2. Pernyataan while
Berbeda dengan do-while, pada pernyataan while pengujian terhadap loop
dilakukan dibagian awal ( sebelum tubuh loop), untuk lebih jelasnya perhatikan
flow chart dan bentuk umum pernyataan while berikut :
while(kondisi)
Kondisi ?
aksi/tubuh perulangan
Pernyataan
Keterangan :
Contoh 1. Penggunaan WHILE untuk proses perulangan yang jumlah perulangannya dapat
diketahui.
cacah1 { inisialisasi variable counter }
while(cacah ≤ 100)
24
output (“Selamat Belajar Algoritma”)
endwhile
Contoh 2 penggunaan WHILE, untuk kasus yang sama seperti permasalahan di atas:
while(NOT sdh_bnr)
Endwhile
3. Struktur REPEAT
Secara prinsip kerja struktur REPEAT sama dengan struktur Do-WHILE.
Perbedaan mendasar antara keduanya adalah pada masalah logika pengulangan,
yaitu perulangan dalam struktur REPEAT akan berjalan selama kondisi bernilai
salah sedang pada struktur Do-WHILE adalah sebaliknya.
4. Struktur FOR
Struktur perulangan yang lain adalah struktur FOR. Bentuk umum dan flow
chart dari struktur FOR adalah sebagai berikut :
Ungkapan 1 aksi
endfor
Keterangan :
Ungkapan 2
● pencacah: dipakai sebagai variabel pengendali loop
Benar
(variabel counter).
● Nilai_awal: diberikan untuk nilai awal variabel
Pernyataan
Salah counter
● Nilai_akhir: dipakai sebagai terminator proses
Ungkapan 3 perulangan
Kata kunci to untuk perulangan menaik dan downto untuk
25
perulangan menurun.
keluar loop
Contoh pemakaian FOR untuk kasus di atas:
endfor
3 3 6 9 12 15 18 21 24 output(hasil_kali)
4 4 8 12 16 20 24 28 32 enfor
baris */
6 6 12 18 24 30 36 42 48
endfor
7 7 14 21 28 35 42 49 56
8 8 16 24 32 40 48 56 64
26
main()
{
int pencacah;
pencacah=0;
do
{
puts("TURBO C");
pencacah++;
}
while(pencacah < 10);
printf("\nSelesai..........");
getch();
}
do
{
pilihan = getch (); /*baca tombol*/
sudah_benar = (pilihan=='Y') || (pilihan=='y') ||
(pilihan=='T') || (pilihan=='t');
}
while(!sudah_benar);
27
case 'Y' :
case 'y' :
puts("\nPilihan anda adalah Y");
break;
case 'T' :
case 't' :
puts("\nPilihan anda adalah T");
break;
}
getch();
}
main()
{
char karakter;
int jumkar = 0;
int jumspasi = 1;
clrscr();
puts("Ketikkan sebuah kalimat dan akhiri dengan ENTER");
puts("Saya akan menghitung jumlah karakter dan kata pada
kalimat tersebut\n");
while( (karakter = getche ()) !=ENTER)
{
jumkar++;
if(karakter ==SPASI)jumspasi++;
}
printf("\nJumlah karakter : %d",jumkar);
28
printf("\nJumlah kata : %d",jumspasi);
getch();
}
for(i=1;i<=n;i++)
{
printf("Bilangan ke %d : ",i);
scanf("%f",&bil);
total+=bil;
}
rata=total/n;
printf("Rata-rata bilangan tersebut : %f",rata);
e. Membuat tabel perkalian studi kasus nested loop dengan struktur for :
1. Start Program Accesories Command Prompt
29
2. Jalankan turbo C
3. Alt+F New
4. Ketik :
/* -------------------------------------*
* Program Lat6g.c *
* contoh pemakaian nested loop *
* membuat tabel perkalian *
*--------------------------------------*/
#include <stdio.h>
#include <conio.h>
main()
{
int baris, kolom, hasil_kali, maks = 0;
clrscr();
printf("masukkan jumlah maksimal baris / kolomnya : ");
scanf("%d",&maks);
/*kalang nested loop*/
for(baris = 1;baris <=maks ; baris++)
{
for(kolom = 1;kolom <=maks ; kolom++)
{
hasil_kali = baris * kolom;
printf("%2d", hasil_kali);
}
printf("\n"); /*pindah baris*/
}
getch();
}
30
char x ='1',ket;
float bil1,bil2.hasil;
int i;
clrscr();
while(1)
{
/*Cetak menu*/
for(i=1;i<20;++i)
printf("\xDB");
printf("\n\n");
printf("\n\n");
for(i=1;i<20;++i)
printf("\xDB");
if(x=='5');
break;
clrscr();
switch(x)
{
case '1':
hasil=bil1+bil2;
ket='+';
break;
case '2':
hasil=bil1-bil2;
31
ket='-';
break;
case '3':
hasil=bil1*bil2;
ket='*';
break;
case '4':
hasil=bil4:bil2;
ket=:';
break;
}
/*Cetak hasil*/
print("\n\n%f %c %f = %f",bil1,ket,bil2,hasil);
printf("\n\nTekan sembarang tombol");
getch();
clrscr();
}
}
5. Alt+F, save dengan nama Lat4h.c
6. Alt+O, pada directories change semua menjadi C:\TC,lalu esc
7. Alt+C compile to OBJ
8. Alt+C compile to EXE
9. Alt+R
IV. PERTANYAAN
1. Apa yang anda ketahui tentang iterasi? Jelaskan dengan singkat dan jelas !
2. Penyataan do-while dan while mempunyai kesamaan yaitu sama-sama
mengetes kondisi. Jelaskan perbedaan keduanya dan disertai dengan contoh
program!
3. Jelaskan tentang kinerja pernyataan break dan continue yang dilibatkan dalam
struktur perulangan!
4. Apa yang kamu ketahui tentang label? Jelaskan dan disertai pula dengan
contoh programnya !
5. Apa guna dari fungsi exit() ?
sedang pada struktur WHILE adalah sebaliknya. Di antara struktur tersebut kita
dapat memilih struktur mana yang tepat untuk menyelesaikan masalah kita.
Apabila masalah kita dapat diselesaikan dengan beberapa struktur yang ada,
maka kita tinggal memilih struktur mana yang lebih simple atau lebih
sederhana.
32
BAB 5
FUNGSI
I. TUJUAN
1. Melakukan pemanggilan fungsi dengan nilai dan referensi.
2. Menggolongkan variabel berdasarkan kelas penyimpanan.
3. Menerapkan fungsi rekursi
Penentu tipe digunakan untuk menentukan tipe keluaran fungsi, defaultnya int.
a) Melewatkan Parameter
Ada 2 cara melewatkan parameter ke dalam fungsi :
1. Pemanggilan dengan nilai (call by value)
2. Pemanggilan dengan referensi (call by reference)
33
b) Penggolongan Variabel Berdasarkan Kelas Penyimpanan
Suatu variabel disamping dapat digolongkan berdasarkan jenis/tipe data juga
dapat diklasifikasikan berdasarkan kelas penyimpanan berupa :
Variabel lokal
Variabel eksternal
Variabel statis
Variabel register
Variabel lokal adalah variabel yang dideklarasikan dalam fungsi.
Contoh:
Void fung_x(void)
{
x adalah
Int x;variabel lokal x adalah variabel lokal bagi fung_x()
.......
.......
Contoh :
34
Variabel register adalah variabel yang nilainya disimpan dalam register bukan pada
memori RAM. Diterapkan pada variabel yang lokal atau parameter formal, yang
bertipe char atau int.
main()
{
int a, b;
a = 88;
b = 77;
tukar(a, b);
35
}
main()
{
int a, b;
a = 88;
b = 77;
36
}
main()
{
int x;
37
if( m == 1 )
return(1);
else
return(m * faktorial(m-1));
IV. PERTANYAAN
1. Apa yang dimaksud dengan call by value dan call by reference?
2. Jelaskan tentang penggolongan variabel berdasarkan kelas penyimpanan!
3. Buat program menggunakan fungsi untuk mnyelesaikan soal berikut dan
simpan dalam file lat5d.c :
Menampilkan menu untuk menghitung :
1) Rumus Phytagoras
2) Rumus abc
3) Keluar
Gunakan struktur case dan masing-masing perhitungan dibuat fungsinya
sehingga bisa dipanggil dengan kode program di dalam struktur case!
38
BAB 6
PENGENALAN ARRAY
I. TUJUAN
1. Mengetahui dan memahami tentang larik (array) dalam bahasa C.
2. Mendeklarasikan dan mengakses elemen larik.
3. Membuat program yang melibatkan permasalahan-permasalahan yang
membutuhkan pengaman tipe data menggunakan larik.
Contoh :
nilai tes : array[1..5] of float
Deklarasi di atas menyatakan bahwa array nilai tes mengandung 5 elemen
bertipe float.
CATATAN :
Elemen aaray akan disimpan dalam memori secara berurutan dengan indeks
pertama 0 (nol), elemen kedua nomor indeksnya 1 (satu), dan seterusnya.
b. Mengakses elemen array
39
nilai_tes[0]
tipe float
nilai_tes[1]
nilai_tes[2]
total 5 elemen
nilai_tes[3]
nilai_tes[4]
40
Data tersimpan dalam array berdimensi dua :
0 1 2 indeks ke-2
( tahun)
0 24 24 22
1 22 22 20
2 23 21 20
3 24 23 22
indeks ke-1
( kelas)
cara mengakses array berdimensi dua adalah dengan bentuk berikut :
data_siswa[indeks ke-1][indeks ke-2]
c. Inisialisasi array berdimensi dua
Contoh :
Static int data_siswa[4][3] =
{ 24, 24, 22,
22, 22, 20,
23, 21, 20,
24, 23, 22 };
41
contoh inisialisasi array berdimensi banyak :
static int data_matrik[2][4][4] =
{ 10, 20, 15, 20,
12, 30, 22, 35,
21, 45, 32, 50,
45, 28, 12, 55,
90, 60, 65, 75,
72, 25, 80, 26,
99, 35, 62, 78,
33, 66, 88, 99 }
atau dapat juga ditulis
static int data_matrik[2][4][4] =
{{{ 10, 20, 15, 20 },
{ 12, 30, 22, 35 },
{ 21, 45, 32, 50 },
{ 45, 28, 12, 55 },
},
{{ 90, 60, 65, 75 },
{ 72, 25, 80, 26 },
{ 99, 35, 62, 78 },
{ 33, 66, 88, 99 }}};
42
skala [1] bernilai 2
skala [2] bernilai 4
dan seterusnya
contoh lain:
char konversi[][2] = { ‘A’, ‘T’
‘E’, ’M’
‘I’, ‘V’
‘O’, ‘S’
‘U’, ‘J’ };
Contoh array di atas berarti :
konversi[0][0] bernilai ‘A’
konversi[0][1] bernilai ‘T’
konversi[1][0] bernilai ‘E’
......
III. LANGKAH KERJA
a. Langkah untuk menentukan rata-rata nilai tes siswa :
10. Start Program Accesories Command Prompt
11. Jalankan turbo C
12. Alt+F New
13. Ketik :
/*-------------------------------------------------- *
* Program Lat10a.c *
* Contoh pemakaian array berdimensi satu *
* Untuk menghitung rata rata nilai siswa *
*--------------------------------------------------- */
#include <stdio.h>
#define MAKS_TES 5
main ()
{
int i;
float total_nilai, rerata;
float nilai_tes[MAKS_TES];
clrscr ();
for (i=0; 1<MAKS_TES; i++)
{
printf ("Nilai tes ke- %d: ", i+1);
scanf ("%f", &nila_tes [i]);
}
total_nilai = 0
for (i=0; i<MAKS_TES; i++)
total_nilai += nilai_tes[i];
43
printf ("Nilai rata rata = %.2f", rerata);
getch();
}
#include <stdio.h>
main ()
{
static jum_hari[12] =
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int bulan, tahun, jhari;
clrscr();
puts("======================================================");
puts(" 1 = JANUARI 2 = FEBRUARI 3 = MARET 4 = APRIL
");
puts(" 5 = MEI 6 = JUNI 7 = JULI 8 = AGUSTUS ");
puts(" 9 = SEPTEMBER 10 = OKTOBER 11 = NOVEMBER 12 = DESEMBER
");
puts("========================================================"
);
if (bulan == 2)
if((tahun % 4 == 0) && (tahun % 100 != 0))
jhari = 29;
else
jhari = 28;
else
jhari = jum_hari[bulan];
44
printf(" Jumlah hari bulan %d tahun %d = %d", bulan, tahun,
jhari);
/*prototipe fungsi*/
void entri_data_matrik(int matriks[][], int, int);
void jumlah_dua_matrik(int matriks1[][],int matriks2[][],
int mat_hasil[][], int, int);
void tampil_data_matrik(int matriks[][], int, int);
main()
{
int jum_kolom,jum_baris;
int mat1[maks_baris][maks_kolom],/*deklarasi array dimensi 2*/
mat2[maks_baris][maks_kolom],
mat_hasil[maks_baris][maks_kolom];
clrscr();
puts("=====================================================");
puts(" Operasi penjumlah dua buah matrik ");
puts("-----------------------------------------------------");
printf("Banyak baris dari elemen matrik(...%d):",maks_baris);
scanf("%d", &jum_baris);
printf("Banyak kolom dari elemen matrik(...%d):",maks_kolom);
scanf("%d", &jum_kolom);
45
puts("\nPenjumlahan Dua Matrik\n");
jumlah_dua_matrik(mat1,mat2,mat_hasil,jum_baris,jum_kolom);
puts("\nPenampilan hasil jumlahan Dua Matrik\n");
tampil_data_matrik(mat_hasil,jum_baris,jum_kolom);
getche();
}
46
3. Alt+F New
4. Ketik :
/*--------------------------------------------*
*Program Lat10c.c *
*contoh penggunaan array berdimensi dua *
*Untuk menjumlahkan dua buah array *
*--------------------------------------------*/
#include<stdio.h>
#define ENTER 13
#define jum_kolom 2
main()
{
static char konversi[][jum_kolom]={'A','T',
'a','t',
'E','M',
'e','m',
'I','V',
'i','v',
'O','S',
'o','s',
'U','J',
'u','j'};
char kalimat[256],karakter;
int i=0,j=0, jum_kar,jum_sandi;
clrscr();
puts("=========================================================
======");
puts(" Masukkan sebuah kalimat dan akhiri dengan ENTER !
");
puts(" Maka kalimat tersebut akan saya sandikan ");
puts("------------------------------------------------------
---------");
/*proses memasukkan kalimat*/
while((kalimat[i]=getche())!=ENTER)
i++;
47
break;/*keluar dari for terdalam*/
}
}
putchar(karakter);
}
puts(" ");
}
IV. PERTANYAAN
1. Berikan ulasan terhadap program lat6c.c, tentang model array yang dipakai,
proses pelewatan array sebagai parameter dan kinerja program tersebut.
2. Buatlah program yang dapat digunakan mengalikan atau mengurangkan dua buah
matrik.
3. Suatu array dalam fungsi main() dideklarasikan sebagai berikut :
static int grafik[8] = {10, 5, 8, 12, 15, 20, 25, 30};
berdasarkan array di atas, nuatlah program yang menghasilkan tampilan sebagai
berikut :
10 | **********
5 | *****
8 | ********
12 | ************
15 | ***************
20 | ********************
25 | *************************
30 | ******************************
48
BAB 7
STRUKTUR
I. TUJUAN
Contoh :
49
struct data_tunggal
{
int tanggal;
int bulan;
int tahun;
};
keterangan :
data_tanggal :nama tipe struktur
tgl_lahir :variabel struktur
struct data_tanggal
{
int tanggal;
int bulan;
int tahun;
}
Keterangan :
tgl_lahir merupakan variabel struktur
Suatu struktur juga dapat digunakan dalam pendefinisian suatu struktur lain.
Contoh :
struct data_tanggal
{
int tanggal;
int bukan;
in tahun;
}
struct data_mhs
{
char nama[20];
struct data_tanggal tgl_lahir;
}info mhs;
50
Keterangan :
Suatu elemen data struktur dapat diakses dengan bentuk umum sebagai berikut :
Variabel_struktur.nama_filed
2 Inisialisasi Struktur
Suatu struktur juga bisa diinisialisasikan pada saat pendeklarsiannya. Contoh
deklarsi struktur berikut melibatkan proses inisialisasi pada saat
pendeklarsiannya.
struct zodiak
{ char nama[11]
int tgl_awal;
int bln_awal;
int tgl_akhir;
int bln_akhi;
};
51
...............
struct data_mhs larik_mhs[maks];
Setelah array larik_mhs dideklarasikan maka ruang yang disediakan sperti
ilustrasi gambar berikut :
#define MAKS 20
main()
{
struct data_tanggal /*definisi tipe data tanggal*/
{ int tanggal;
int bulan;
int tahun;
};
struct data_mhs /*definisi tipe data_mhs*/
{ char nama [21];
struct data_tanggal tgl_lahir;
};
struct data_mhs info_mhs[MAKS]; /*deklarasi array struktur*/
char tombol;
int i, jum_mhs = 0;
52
jum_mhs++;
main()
{
struct zodiak
{ char nama[11];
int tgl_awal;
int bln_awal;
int tgl_akhir;
int bln_akhir;
};
53
clrscr();
printf("Tanggal lahir anda (XX-XX-XXXX): ");
scanf("%d-%d-%d", &tg_lhr, &bl_lhr, &th_lhr);
Pengembangan 7b.c
1. Pilih menu program accesoris command prompt
2. Jalankan progam turbo C
3. Alt + F, pilih New
4. Ketik :
#include<stdio.h>
main()
{
struct zodiak /* definisi tipe struktur */
{
char nama[11];
int tgl_awal;
int bln_awal;
int tgl_akhir;
int bln_akhir;
};
54
{"SCORPIO" ,23, 10, 22, 11},
{"SAGITARIUS" ,23, 11, 21, 12},
};
int i, tg_lhr, bl_lhr, th_lhr;
Pengembangan 7e.c
1. Pilih menu program accesoris command prompt
2. Jalankan progam turbo C
3. Alt + F, pilih New
4. Ketik :
#include<stdio.h>
main()
{
struct zodiak
{
char nama[11];int tgl_awal;
int bln_awal;int tgl_akhir;int bln_akhir;
};
struct zodiak btg1={"Capricorn",22,12,20,1};
struct zodiak btg2={"Aquarius",21,1,19,2};
struct zodiak btg3={"Pisces",20,2,20,3};
struct zodiak btg4={"Aries",21,3,19,4};
struct zodiak btg5={"Taurus",20,4,20,5};
struct zodiak btg6={"Gemini",21,5,21,6};
struct zodiak btg7={"Cancer",22,6,23,7};
struct zodiak btg8={"Leo",24,7,23,8};
struct zodiak btg9={"Virgo",24,8,23,9};
struct zodiak btg10={"Libra",24,9,22,10};
struct zodiak btg11={"Scorpio",23,10,22,11};
struct zodiak btg12={"Sagitarius",23,11,21,12};
int tg_lhr,bl_lhr,th_lhr;
clrscr();
puts("\t\t\tRAMALAN BINTANG");
55
printf("\n\n\tTanggal Lahir Kamu [xx-xx-xxxx] : ");
scanf("%d-%d-%d",&tg_lhr,&bl_lhr,&th_lhr);
clrscr();
puts("\t\t\tRAMALAN BINTANG");
if((tg_lhr>=btg1.tgl_awal)&&(bl_lhr==btg1.bln_awal)||
(tg_lhr<=btg1.tgl_akhir)&&(bl_lhr==btg1.bln_akhir))
{
printf("\n\tBintang Kamu adalah %s\n",btg1.nama);
printf("\n\tKamu lahir pada %d-%d-
%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Keinginanmu tercapai bulan ini");
puts("\n\tKesehatan : Kuncinya di jadwal dan waktu");
puts("\n\tKeuangan : Hati-hati dengan proyek dana
bersama");
puts("\n\tCinta : Misunderstanding");
}
else
if((tg_lhr>=btg2.tgl_awal)&&(bl_lhr==btg2.bln_awal)||
(tg_lhr<=btg2.tgl_akhir)&&(bl_lhr==btg2.bln_akhir))
{
printf("\n\tBintang Kamu adalah %s\n",btg2.nama);
printf("\n\t Kamu lahir pada %d-%d-
%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\tPeruntungan : Krisis percaya diri");
puts("\n\tKesehatan : Prima");
puts("\n\tKeuangan : Banyak uang");
puts("\n\tCinta : Masih mau menuggu");
}
else
if((tg_lhr>=btg3.tgl_awal)&&(bl_lhr==btg3.bln_awal)||
(tg_lhr<=btg3.tgl_akhir)&&(bl_lhr==btg3.bln_akhir))
{
printf("\n\tBintang Kamu adalah %s\n",btg3.nama);
printf("\n\t Kamu lahir pada %d-%d-
%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Pelan tapi pasti");
puts("\n\tKesehatan : Pertahankan pola makan sehat kamu");
puts("\n\tKeuangan : Yang penting gak berhutang!");
puts("\n\tCinta : Malu atau nyerah");
}
else
if((tg_lhr>=btg4.tgl_awal)&&(bl_lhr==btg4.bln_awal)||
(tg_lhr<=btg4.tgl_akhir)&&(bl_lhr==btg4.bln_akhir))
{
printf("\n\tBintang Kamu adalah %s\n",btg4.nama);
printf("\n\tKamu lahir pada %d-%d-
%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Nggak konsisten");
puts("\n\tKesehatan : Tubuh udah kasih alarm");
puts("\n\tKeuangan : Kantong tebal");
puts("\n\tCinta : Masih kikuk tapi kalian serasi");
}
else
if((tg_lhr>=btg5.tgl_awal)&&(bl_lhr==btg5.bln_awal)||
(tg_lhr<=btg5.tgl_akhir)&&(bl_lhr==btg5.bln_akhir))
{
printf("\n\tBintang Kamu adalah %s\n",btg5.nama);
56
printf("\n\tKamu lahir pada %d-%d-
%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Mempersiapkan sesuatu yang baru
");
puts("\n\tKesehatan : Tidur tepat waktu");
puts("\n\tKeuangan :Butuh budget banyak buat liburan");
puts("\n\tCinta : Hunting season is on");
}
else
if((tg_lhr>=btg6.tgl_awal)&&(bl_lhr==btg6.bln_awal)||
(tg_lhr<=btg6.tgl_akhir)&&(bl_lhr==btg6.bln_akhir))
{
printf("\n\tBintang Kamu adalah %s\n",btg6.nama);
printf("\n\tKamu lahir pada %d-%d-
%d",tg_lhr,bl_lhr,th_lhr); puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Ada yang baru");
puts("\n\tKesehatan : Butuh olahraga");
puts("\n\tKeuangan : Butuh uang");
puts("\n\tCinta : Adem ayem");
}
else
if((tg_lhr>=btg7.tgl_awal)&&(bl_lhr==btg7.bln_awal)||
(tg_lhr<=btg7.tgl_akhir)&&(bl_lhr==btg7.bln_akhir))
{
printf("\n\tBintang Kamu adalah %s\n",btg7.nama);
printf("\n\tKamu lahir pada %d-%d-
%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Labil");
puts("\n\tKesehatan : Makan yang berserat");
puts("\n\tKeuangan : Berbagi");
puts("\n\tCinta : Curi pandang");
}
else
if((tg_lhr>=btg8.tgl_awal)&&(bl_lhr==btg8.bln_awal)||
(tg_lhr<=btg8.tgl_akhir)&&(bl_lhr==btg8.bln_akhir))
{
printf("\n\tBintang Kamu adalah %s\n",btg8.nama);
printf("\n\tKamu lahir pada %d-%d-%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Wajar kalau bosan");
puts("\n\tKesehatan : Gangguan tenggorokan");
puts("\n\tKeuangan : Pas-pasan");
puts("\n\tCinta : Plenty fish in the sea and one for you");
}
else
if((tg_lhr>=btg9.tgl_awal)&&(bl_lhr==btg9.bln_awal)||
(tg_lhr<=btg9.tgl_akhir)&&(bl_lhr==btg9.bln_akhir))
{
printf("\n\tBintang Kamu adalah %s\n",btg9.nama);
printf("\n\tKamu lahir pada %d-%d-%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Good month");
puts("\n\tKesehatan : Jaga pola makan");
puts("\n\tKeuangan : Banyak pemasukan");
puts("\n\tCinta : mood mirip roller coaster");
}
else
if((tg_lhr>=btg10.tgl_awal)&&(bl_lhr==btg10.bln_awal)||
(tg_lhr<=btg10.tgl_akhir)&&(bl_lhr==btg10.bln_akhir))
57
{
printf("\n\tBintang Kamu adalah %s\n",btg10.nama);
printf("\n\tKamu lahir pada %d-%d-%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Banyak kegiatan");
puts("\n\tKesehatan : Istirahat cukup");
puts("\n\tKeuangan : Boros");
puts("\n\tCinta : Belajar sabar");
}
else
if((tg_lhr>=btg11.tgl_awal)&&(bl_lhr==btg11.bln_awal)||
(tg_lhr<=btg11.tgl_akhir)&&(bl_lhr==btg11.bln_akhir))
{
printf("\n\tBintang Kamu adalah %s\n",btg11.nama);
printf("\n\tKamu lahir pada %d-%d-%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Exciting month");
puts("\n\tKesehatan : Ketagihan makanan enak");
puts("\n\tKeuangan : Hemat dong");
puts("\n\tCinta : Tunjukkin kalu suka");
}
else
{
printf("\n\tBintang Kamu adalah %s",btg12.nama);
printf("\n\tKamu lahir pada %d-%d-%d",tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : karma");
puts("\n\tKesehatan : Fit");
puts("\n\tKeuangan : Banyak godaan");
puts("\n\tCinta : Tke it easy");
}
getch();
}
Pengambangan 7d.c
1. Pilih menu program accesoris command prompt
2. Jalankan progam turbo C
3. Alt + F, pilih New
4. Ketik :
#include<stdio.h>
main()
{
struct zodiak
{
char nama[11];int tgl_awal;
int bln_awal;int tgl_akhir;int bln_akhir;
};
struct zodiak btg1={"Capricorn",22,12,20,1};
struct zodiak btg2={"Aquarius",21,1,19,2};
struct zodiak btg3={"Pisces",20,2,20,3};
struct zodiak btg4={"Aries",21,3,19,4};
58
struct zodiak btg5={"Taurus",20,4,20,5};
struct zodiak btg6={"Gemini",21,5,21,6};
struct zodiak btg7={"Cancer",22,6,23,7};
struct zodiak btg8={"Leo",24,7,23,8};
struct zodiak btg9={"Virgo",24,8,23,9};
struct zodiak btg10={"Libra",24,9,22,10};
struct zodiak btg11={"Scorpio",23,10,22,11};
struct zodiak btg12={"Sagitarius",23,11,21,12};
int tg_lhr,bl_lhr,th_lhr;
clrscr();
puts("\t\t\tRAMALAN BINTANG");
printf("\n\n\tTanggal Lahir Kamu [xx-xx-xxxx] : ");
scanf("%d-%d-%d",&tg_lhr,&bl_lhr,&th_lhr);
clrscr();
puts("\t\t\tRAMALAN BINTANG");
if((tg_lhr>=btg1.tgl_awal)&&(bl_lhr==btg1.bln_awal)||
(tg_lhr<=btg1.tgl_akhir)&&(bl_lhr==btg1.bln_akhir))
{
printf("\n\nTanggal lahir kamu adalah : %d-%d-%d",
tg_lhr, bl_lhr, th_lhr);
printf("\n\tBintang Kamu adalah %s\n",btg1.nama);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Keinginanmu tercapai bulan
ini");
puts("\n\tKesehatan : Kuncinya di jadwal dan waktu");
puts(“\n\tKeuangan : Hati-hati dengan proyek dana
bersama”);
puts(“\n\tCinta : Misunderstanding”);
}
else
if((tg_lhr>=btg2.tgl_awal)&&(bl_lhr==btg2.bln_awal)||
(tg_lhr<=btg2.tgl_akhir)&&(bl_lhr==btg2.bln_akhir))
{
printf("\n\nTanggal lahir kamu adalah : %d-%d-%d",
tg_lhr, bl_lhr, th_lhr);
printf("\n\tBintang Kamu adalah %s\n",btg2.nama);
puts("\n\tPeruntungan : Krisis percaya diri");
puts("\n\tKesehatan : Prima");
puts(“\n\tKeuangan : Banyak uang”);
puts(“\n\tCinta : Masih mau menuggu”);
}
else
if((tg_lhr>=btg3.tgl_awal)&&(bl_lhr==btg3.bln_awal)||
(tg_lhr<=btg3.tgl_akhir)&&(bl_lhr==btg3.bln_akhir))
{
printf("\n\nTanggal lahir kamu adalah : %d-%d-%d",
tg_lhr, bl_lhr, th_lhr);
printf("\n\tBintang Kamu adalah %s\n",btg3.nama);
printf("\t Kamu lahir pada %d-%d-
%d”,tg_lhr,bl_lhr,th_lhr);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Pelan tapi pasti");
puts("\n\tKesehatan : Pertahankan pola makan sehat
kamu");
puts(“\n\tKeuangan : Yang penting gak berhutang!”);
puts(“\n\tCinta : Malu atau nyerah”);
}
else
if((tg_lhr>=btg4.tgl_awal)&&(bl_lhr==btg4.bln_awal)||
59
(tg_lhr<=btg4.tgl_akhir)&&(bl_lhr==btg4.bln_akhir))
{
printf("\n\nTanggal lahir kamu adalah : %d-%d-%d",
tg_lhr, bl_lhr, th_lhr);
printf("\n\tBintang Kamu adalah %s\n",btg4.nama);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Nggak konsisten");
puts("\n\tKesehatan : Tubuh udah kasih alarm");
puts(“\n\tKeuangan : Kantong tebal”);
puts(“\n\tCinta : Masih kikuk tapi kalian serasi”);
}
else
if((tg_lhr>=btg5.tgl_awal)&&(bl_lhr==btg5.bln_awal)||
(tg_lhr<=btg5.tgl_akhir)&&(bl_lhr==btg5.bln_akhir))
{
printf("\n\nTanggal lahir kamu adalah : %d-%d-%d",
tg_lhr, bl_lhr, th_lhr);
printf("\n\tBintang Kamu adalah %s\n",btg5.nama);
60
puts("\n\tPeruntungan : Wajar kalau bosan");
puts("\n\tKesehatan : Gangguan tenggorokan");
puts(“\n\tKeuangan : Pas-pasan”);
puts(“\n\tCinta : Plenty fish in the sea and one for you”);
}
else
if((tg_lhr>=btg9.tgl_awal)&&(bl_lhr==btg9.bln_awal)||
(tg_lhr<=btg9.tgl_akhir)&&(bl_lhr==btg9.bln_akhir))
{
printf("\n\nTanggal lahir kamu adalah : %d-%d-%d",
tg_lhr, bl_lhr, th_lhr);
printf("\n\tBintang Kamu adalah %s\n",btg9.nama);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Good month");
puts("\n\tKesehatan : Jaga pola makan");
puts(“\n\tKeuangan : Banyak pemasukan”);
puts(“\n\tCinta : mood mirip roller coaster”);
}
else
if((tg_lhr>=btg10.tgl_awal)&&(bl_lhr==btg10.bln_awal)||
(tg_lhr<=btg10.tgl_akhir)&&(bl_lhr==btg10.bln_akhir))
{
printf("\n\nTanggal lahir kamu adalah : %d-%d-%d",
tg_lhr, bl_lhr, th_lhr);
printf("\n\tBintang Kamu adalah %s\n",btg10.nama);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Banyak kegiatan");
puts("\n\tKesehatan : Istirahat cukup");
puts(“\n\tKeuangan : Boros”);
puts(“\n\tCinta : Belajar sabar”);
}
else
if((tg_lhr>=btg11.tgl_awal)&&(bl_lhr==btg11.bln_awal)||
(tg_lhr<=btg11.tgl_akhir)&&(bl_lhr==btg11.bln_akhir))
{
printf("\n\nTanggal lahir kamu adalah : %d-%d-%d",
tg_lhr, bl_lhr, th_lhr);
printf("\n\tBintang Kamu adalah %s\n",btg11.nama);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : Exciting month");
puts("\n\tKesehatan : Ketagihan makanan enak");
puts(“\n\tKeuangan : Hemat dong”);
puts(“\n\tCinta : Tunjukkin kalu suka”);
}
else
{
printf("\n\nTanggal lahir kamu adalah : %d-%d-%d", tg_lhr,
bl_lhr, th_lhr);
printf("\n\tBintang Kamu adalah %s",btg12.nama);
puts("\n\n\tRamalan Minggu Ini : ");
puts("\n\tPeruntungan : karma");
puts("\n\tKesehatan : Fit");
puts(“\n\tKeuangan : Banyak godaan”);
puts(“\n\tCinta : Tke it easy”);
}
getch();
}
61
7. Alt+C, compile to OBJ
8. Alt+C, compile to EXE
9. Alt+R
IV. PERTANYAAN
1. Apa yang anda ketahui tentang data/informasi, filed, record, dan struktur ?
jelaskan dengan singkat dan jelas !
2. Berikanlah penjelasan dari deklarasi struktur berikut ini :
62
BAB 8
OPERASI I/O
I. TUJUAN
Setiap karakter akan menempati memori sebesar 1 byte dan byte terkahir
otomatis akan berisi karakter NULL.
a) Variabel String
Variabel string digunakan untuk menyimpan data string. Misalnya :
char nama[15];
Contoh di atas merupakan instruksi untuk mendeklarasikan variable tipe string
dengan panjang maksimal mengandung 15 karakter (termasuk karakter NULL).
Deklarasi di atas sebenarnya alah deklarasi array bertipe char. Untuk
memasukkan data string ke dalam suatu variabel dapat dilakukan dengan
menggunakan instruksi gets(), dengan bentuk umum pemakaiannya adalah :
gets(nama_array);
Jika menggunakan statement scanf(), maka instruksinya akan menjadi:
scanf(“%”,nama_array);
63
Di depan nama array tidak perlu ada operator &(operator alamat), karena nama
array tanpa kurung siku sudah menaytakan alamat. Jika menggunakan scanf(),
data string tidak bisa mengandung spasi. Prorotipe gets() terdapat pada file
stdio.h.
/* -------------------------------------------- */
/* File program : nama.c */
/* Contoh memasukkan data string dari keyboard */
/* -------------------------------------------- */
#include <stdio.h>
main()
{
char nama[15];
printf("Nama anda : ");
gets(nama) ;
printf("Halo, %s. Selamat datang di Elektro.\n",nama);
}
Pada program di atas, setelah deklarasi char nama[15], maka komputer akan
menyediakan uang pada memori sebanyak 15 arakter. Setelah pengguna
memasukkan data nama : ABUL SALAM, maka data string yang dimasukkan
akan diletakkan pada area memori yang sudah dipesan. Karena data yang
dimasuukan kurang dari 15 katakter, maka otomatis setelah karakter terakhir akan
diisi dengan karakter NULL.
ruang memori yang disediakan setelah : char nama[15]
A B D U L S A L A M \0
Instruksi gets() akan membaca seluruh karakter yang diketik pada keyboard
sampai tombol ENTER ditekan. Dalam ha ini tidak ada pengecekan terhadap
batasan dari array yang merupakan argumennya. Jika string yang dimasuukan
melebihi ukuran array, mak sisa string (panjang string dikurangi ukuran array
plus karakter NULL) akan ditempatkan kelokasi sesudah bagian akhir array.
64
b) Inisiaisasi String
Suatu variabel string dapat diinisialisasi seperti hanya variabel array yang lain,
namun pada elemen terakhir harus berupa karakter NULL. Sebagai contoh :
char kota[]=
{‘Y’, ‘o’, g‘’, y‘’, ‘a’, ‘k’, ‘a’, ‘r’, ‘t’, ‘a’, ‘\0’,};
Contoh di atas menyatakan baha variabel kota dalah variabel string dengan
nilai awal berupa string “Yogyakarta”.
Bentuk inisialisasi yang lebih singkat adalah:
char kota[] = “Yogyakarta”;
Pada bentuk ini, karakter NULL tidak perlu ditulis, karena secara implisit akan
disisipkan oleh kompiler.
main()
{
bentuk1();
bentuk2();
}
void bentuk1(void)
{
char kota[]=
{'Y','o','g','y','a','k','a','r','t',a'','\0'};
puts(kota);
}
void bentuk2(void)
{
char kota[] = "Solo";
puts(kota);
}
d) Mengakses Elemen String
65
Variabel string merupakan bentuk khusus dari array bertipe char. Oleh karena
itu, elemen dari variabel string dapat diakses seperti halnya pengaksesan elemen
pada array.
Program berikut menunjukkan cara mengakses elemen array untuk
menghitung total karakter dari string yang dimasukkan melalui keyboard.
/* -------------------------------------- */
/* File program : hitkar.c */
/* Contoh menakses elemen string */
/* -------------------------------------- */
#include<stdio.h>
#define maks 256
main()
{
int i, jumkar;
char teks[maks];
puts("Masukkan suatu kalimat.");
puts("Saya akan menghitung jumlah karakternya.");
gets(teks);
jumkar = 0
for(i=0;teks[i];i++)
jumkar++;
printf("Jumlah karakter = %d\n", jumkar);
}
Penghitungan jumlah karakter dari string teks dapat dilakukan dengan
memeriks elemen dari string dimulai dari posisi yang pertama (indeks sama
dengan 0) sampai ditemukannya karakter NULL. Elemen yang ke-I dari teks
dinyatakan dengan :
teks[i]
Pemeriksaan terhadap teks[i] selama tidak berupa karakter NULL (dimulai
dari indeks bernilai 0) dilakukan melalui:
for(i=0;teks[i];i++)
jumkar++;
Kondisi teks[i] pada for mempunai makan yang secara implisit berupa:
teks[i] != ’\0’
atau “karakter yang k-i dari teks tidak sama dengan karakter NULL”.
Contoh program berikut memperlihatkan cara penyalinan nilai ke suatu
variabel string.
/* -------------------------------------- */
/* File program : SALINSTR.c */
/* Contoh menyalin suatu string */
/* -------------------------------------- */
#include<stdio.h>
main()
{
66
int i;
char keterangan[] = "Saya menyukai bahasa C";
char kalimat[30];
i = 0 ;
while(keterangan[i] !='\0')
{
kalimat[i] = keterangan[i];
i++;
}
kalimat[i] = '\0'; /*Beri karakter NULL*/
isalnum()
Mempunyai bentuk:
int isalnum(int c);
Merupakan makro yang akan menghasilkan nilai benar (bukan nol) jika c
adalah sebuah huruf (huruf kapital maupun huruf kecil) atau berupa sebuah
karakter angka (0 sampai dengan 9).
isalpaha()
67
Mempunyai bentuk:
int isalpaha(int c);
Merupakan makro yang akan menghasilkan nilai benar (bukan nol) jika c
adalah sebuah huruf (huruf kapital maupun huruf kecil)
isdigit()
Mempunyai bentuk:
int isdigit(int c);
Merupakan makro yang akan menghasilkan nilai benar (bukan nol) jika c
adalah sebuah karakter angka (0 sampai dengan 9).
islower()
Mempunyai bentuk:
int islower(int c);
Merupakan makro yang akan menghasilkan nilai benar (bukan nol) jika c
adalah sebuah huruf kecil (‘a’ sampai dengan ‘z’)
isupper()
Mempunyai bentuk:
int isupper(int c);
Merupakan makro yang akan menghasilkan nilai benar (bukan nol) jika c
adalah sebuah huruf kecil (‘A’ sampai dengan ‘Z’)
tolower()
Mempunyai bentuk:
int totlower(int c);
Jika c adalah huruf kapital,maka hasil fungsi berupa huruf kecilnya. Apabila c
tidak berupa huruf kapital, keluaran fungsi sama dengan c.
toupper()
Mempunyai bentuk:
int toupper(int c);
Jika c adalah huruf kecil,maka hasil fungsi berupa huruf kapitalnya. Apabila c
tidak berupa huruf kecil, keluaran fungsi sama dengan c.
strcpy()
Mempunyai bentuk:
strcpy(tujuan,asal);
Fungsi ini digunakan untuk menyalin variabel string asal ke variabel string
tujuan. Dalam hal ini, variabel tujuan haruslah mempunyai ukuran yang dapat
digunakan untuk menampung seluruh karakter dari string. Contoh :
strcpy(pepatah,”Kalau ada kemauan pasti ada jalan”);
merupakan instruksi untuk menyalin string ”Kalau ada kemauan pasti ada
jalan” kevariabel string pepatah.
strlen()
68
Mempunyai bentuk:
strlen(var_string);
Digunakan untuk memperoleh julah karakter dalam variabel string yang
merupakan argumennya. Karakter NULL tidak ikut dihitung.
strcat()
Mempunyai bentuk:
strcat(tujuan,sumber);
fungsi ini diggunakan untuk menambahkan variabel string sumber ke bagian
akhir dari variabel string tujuan
strcmp()
Mempunyai bentuk:
var_int = strcmp(str1,str2);
Fungsi ini digunakan untuk membandingkan variabel string str1 dengan string
str2. Hasil fungsi bertipe int berupa nilai
Negatif, jika str1 kurang dari str2
Nol , jika str1 sama dengan str2
Positif , jika str1 lebih dari str2
Absolut hasil fungsi (kecuali jika bernilai nol) menyatakan selisih nilai ASCII
dari karakter yang menyebabkan str1 berbeda dengan str2. Pembandingan
dilakukan untuk karakter pada posisi yang sama dari dan str2, dimulai dari
karakter terkiri. Acuan pembandingan dari dua buah karakter didasarkan oleh
ASCII-nya. Misal karakter ‘A’ lebih kecil dari karakter ‘B’ dan karakter ‘B‘
lebih kecil dari karakter. Contoh : string “HALO” lebih kecil dari string
“HELO”, karena karakter ‘A’ mempunai nilai yang lebih kecil daripada
karakter ‘E’. Apabila salah satu string mempunyai panjang yang lebih pendek,
an sampai karakter yang terkahir dari string yang terpendek ternyata karakter
antara str1 dengan str2 sama, maka string yang lebih pendek mempunyai nilai
yang lebih kecil dibandingkan dengan string yang lebih panjang.
#include <stdio.h>
main()
69
{
char nama[15];
printf("Nama anda : ");
gets(nama) ;
printf("Halo, %s. Selamat datang di Elektro.\n",nama);
}
main()
{
bentuk1();
bentuk2();
}
void bentuk1(void)
{
char kota[]=
{'Y','o','g','y','a','k','a','r','t',a'','\0'};
puts(kota);
}
void bentuk2(void)
{
char kota[] = "Solo";
puts(kota);
}
70
9. Alt+R
c. Latihan 3 : mengakses elemen string
1. Pilih menu program accesoris command prompt
2. Jalankan progam turbo C
3. Alt + F, pilih New
4. Ketik :
/* ------------------------------------ */
/* File program : hitkar.c */
/* Contoh menakses elemen string */
/* ------------------------------------ */
#include<stdio.h>
#define maks 256
main()
{
int i, jumkar;
char teks[maks];
puts("Masukkan suatu kalimat.");
puts("Saya akan menghitung jumlah karakternya.");
gets(teks);
jumkar = 0;
for(i=0;teks[i];i++)
jumkar++;
printf("Jumlah karakter = %d\n", jumkar);
}
#include<stdio.h>
main()
{
int i;
char keterangan[] = "Saya menyukai bahasa C";
char kalimat[30];
71
i = 0 ;
while(keterangan[i] !='\0')
{
kalimat[i] = keterangan[i];
i++;
}
kalimat[i] = '\0'; /*Beri karakter NULL*/
e.2. /*str52.c*/
1. Pilih menu program accesoris command prompt
2. alankan progam turbo C
3. Alt + F, pilih New
4. Ketik :
/* str52.c */
#include<stdio.h>
#include<string.h>
#define PJG 15
main()
{
72
char str1[PJG], str2[PJG];
strcpy(str1, "sala"); /* str1 diisi "sala" */
strcpy(str2, "tiga"); /* str2 diisi "tiga" */
strcat(str1, str2); /* tambahkan str2 ke akhir str1 */
printf("str1 --> %s str2 --> a %s\n", str1, str2);}
e.3. /*str53.c*/
1. Pilih menu program accesoris command prompt
2. alankan progam turbo C
3. Alt + F, pilih New
4. Ketik :
/* str53 */
#include<stdio.h>
#include<string.h>
main()
{ char str1[]="HALO"; char str2[]="Halo"; char
str3[]="HALO";
printf("Hasil pembandingan %s dengan %s --> %d\n",
str1, str2, strcmp(str1, str2));
printf("Hasil pembandingan %s dengan %s --> %d\n",
str2, str1, strcmp(str2, str1));
printf("Hasil pembandingan %s dengan %s --> %d\n",
str1, str3, strcmp(str1, str3));
}
73
PO
P
IV. PERTANYAAN
1 Ketikkan sebuah kalimat melalui keyboard dengan menggunakan gets() (atau
fgets()) kemudian didapatkan keluaran berupa laporan tentang jumah huruf kecil
dan dan huruf kapital dalam kalimat tsb.
2 Masukkan nama Anda, rubah ke dalam huruf besar semua, balikkan urutan
hurufnya, selanjutnya tampilkan hasilnya di layar.
3 Ketikkan sebuah kalimat, hitung dan tampilkn jumlah kata dan karakternya.
4 Buatlah program utuk menguji apakah suatu kalimat itu termasuk polindrom atau
bukan.
Catatan : kalmat dikatakan polindrom jika kata atau kalimat tersebut dibaca dari
depan atau belakang sama bunyinya.
5 Buatlah kesimpulan dari praktik yang telah anda lakukan !
74
BAB 9
POINTER
I. TUJUAN
zzz 1000
px menunjuk
alamat
1000 ?
75
Agar suatu pointer menunjuk ke variabel yang lain, mula – mula pointer haus
diisi dengan alamat dari variabel yang akan ditunjuk. Untuk menyatakan alamat
dari suatu variabel yang akan ditunjuk. Untuk menyatakan alamat dari suatu
variabel, dapat digunakan operator & (operator alamat, yang bersifat unaray),
dengan cara menempatkan operator di depan nma variabel. Sebagai contoh, jika x
dideklarsikan sebagai variabel bertipe int, maka &x , berarti “alamat dari variabel
x”. Adapun contoh pemberian alamat ke suatu variabel pointer px (yang
dideklarasikan sebagai pointer yang menunjuk ke data bertipe int) yaitu:
Px = &x;
Pernyataan di atas berarti bahwa px diberi nilai berupa alamat dari variabel x,
setelah pernyataan tersebut dieksekusi barulah dapat dikatakan bahwa px
menunjuk ke variabel x.
c. Mengakses Isi Suatu Variabel Melalui Pointer
Jika suatu variabel sudah ditunjuk oleh pointer, maka variabel tersebut dapat
diakses melalui variabel itu sendiri (disebut sebagau pengaksesan tak langsung),
ataupun melalui pointer (isebut pengaksesan langsung). Pengaksesan tak
langsung dilakukan dengan menggunakan operator inderection berupa simbol *
(bersifat unaray), seperti contoh berikut: *px yang menyatakan “isi atau nilai
variabel/data yang ditunjuk oleh pointer px”. Sebagai contoh jika y bertipe int,
maka sesudah dua penyataan berikut:
px = &x;
y = *px;
y akan berisi nilai yang sesusi dengan nilai x. Contoh program berikut
memperlihatkan pemakaian variabel pointer
d. Tipe Variabel Pointer dan Tipe Obyek yang Ditunjuk
Antara tipe pointer (sesuai dengan pendeklarasian pointer) dan tipe obyek
yang kan ditunjuk oleh pointer haruslah sejenis. Jika misalnya pointer pu
dimaksudkan untuk menunjuk data bertipe int maka data yang akan ditunjuk oleh
pointer pu juga harus bertipe int. suatu kesalahan akan terjadi jika misalnya
pointer float digunakan untuk menunjuk data bertipe int.
e. Mengubah Isi Suatu Variabel Melalui Pointer
Contoh berikut memberikan gambaran tentang pengubahan isi sutu variabel
secara tak langsung (yaitu melalui pointer). Mula-mula pd dideklarasikan sebagi
pointer yang menunjuk ke suatu data bertipe float dan d sebagai variabel bertipe
float. Selanjutnya dengan ungkapan
d = 54.6;
digunakan untuk mengisikan nilai 54.6 secara langsung ke variabel d. Perintah
pd = &d; Digunakan untuk memberikan alamat dari d ke pd. Dengan demikian pd
menunjuk ke variabel d. Sedangkan pernyataan berikut:
*pd = *pd + 10; (atau: *pd += 10;)
Merupakan instruksi untuk mengubah nilai variabel d secara tak langsung.
Perintah di atas berarti “jumlahkan isi variabel yang ditunjuk oleh pd dengan nilai
10 dan simpan hasilnya ke variabel tersebut”, atau identik dengan pernyataan:
D = d + 10;
76
Namun seandainya tidak ada instruksi
Pd = &d;
Maka pernyataan:
*pd = *pd + 10;
Tidak sama dengan
d = d + 10
/*----------------------------------*/
/* File program : Pointer3.c */
/* Pointer yang menunjuk array */
/* ---------------------------------*/
#include <stdio.h>
main()
{
static int tgl_lahir[] = {24, 6, 1965};
int *ptgl;
ptgl = tgl_lahir; /* ptgl berisi alamat array */
Jika ingin menampilkan seluruh elemen array tgl_lahir, maka dapat digunakan
perintah
for(i=0; i<3; i++)
77
printf(“%s%,tgl_lahir[i]”);
jika diimplementasikan dengan menggunkan pointer
tgl_lahir[i]
dapat digantikan menjadi
*(ptgl + i)
Dengan terlebih dahulu mengatur ptgl agar menunjuk ke array tgl_lahir,
sehingga penulisan instruksi penampilan isi array tgl_lahir dapat diubah menjadi:
ptgl = tgl_lahir;
for(i=0; i<3;i++0)
printf(“%d”, *(ptgl + i));
Secara umum operasi pointer dapat diterangkan sebagi berikut. Misalkan a
adalah suatu array, dan pa adalah pointer yang menunjuk array a, maka
*(pa + i)
Akan menyatakan lemen array dengan indeks sama dengan i. Jadi
*(pa + 0) identik dengan a[0]
*(pa + 1) identik dengan a[1]
*(pa + 2) identik dengan a[2]
Ungkapan seperti
pa + i;
memiliki arti “tambahkan nilai pa (berisi alamat) dengan i kali ukuran dari
obyek yang ditunjuk oleh pa”.
Jika pa dideklarasikan sebagai
int *pa;
maka obyek dari pa adalah data int(berukuran 2 byte). Cara lain dalam
menampilkan isi suatu array yaitu dengan menaikkan isi variabel pointer dengan
menggunakan opertor ++.
*(ptgl + i)
dapat diganti menjadi
ptgl++
Misalkan suatu instruksi :
int *pa;
int a[3];
Sesudah pernyataan: pa = a;
Sesudah pernyataan: pa = ++;
78
{“Senin”,”Selasa”,”Rabu”,”Kamis”,”Jumat”,”Sabtu”,”Minggu”};
Pada contoh di atas,
namahari[0] menunjuk ke string “Senin”
namahari[1] menunjuk ke string “Selasa”
namahari[2] menunjuk ke string “Rabu”
dan seterusnya
i. Pointer Menunjuk Pointer
Suatu pointer bisa saja menunjuk ke pointer lain. Gambar di bawah
memperlihatkan contoh mengenai hal ini.
Untuk membentuk rantai pointer seperti gambar di atas, diperlukan
pendeklarasian sebagai berikut :
int var_x;
int *ptr1;
int **ptr2;
Fungsi di atas dimaksudkan agar jika dipanggil, variabel yang berkaitan
dengan parameter aktual dapat diubah nilainya, yaitu masing-masing dinaikkan
sebesar 2. Perhatikan pada deklaasi di depan:
Contoh pemanggilan fungsinya adalah
var_x adalah variabel bertipe int. naikkan_nilai(&a, &b);
ptr1 adalah variabel pointer yang menunjuk ke data bertipe int.
ptr2 adalah variabel pointer yang menunjuk ke pointer bertipe int.
(itulah sebabna deklarasi berupa : int **ptr2;)
Perhatikan bahwa dalam hal ini variabel a dan b harus ditulis diawali
dengan operator alamat (&) yang berarti menyatakan alamat variabel,
sebab parameter fungsi dalam pendefinisian berupa pointer.
Agar ptr1 menunjuk ke variabel var_x,perintah yang diperlukan berupa
ptr1 = &var_x
Sedangkan supaya ptr2 menunjuk ke ptr1, instruksi yang diperlukan adalah :
Program 9-5
Ptr2 = &ptr1;
79
*y = *y + 2;
}
Fungsi di atas dimaksudkan agar jika dipanggil variabel yang brkaitan
dengan parameter aktua dapat diubah nilainya, yaitu masing-masing dinaikkan
sebesar 2.
Contoh pemanggilan fungsinya adalah
naikkan_nilai(&a, &b);
Perhatikan bahwa dalam hal ini variabel a dan b harus ditulis diawali
dengan operator alamat (&) yang berarti menyatakan alamat variabel, sebab
parameter fungsi dalam pendefinisian berupa pointer.
main()
{
int x,y; /* x dan y bertipe int */
int*px; /* px pointer yang menunjuk obyek bertipe int */
x = 87;
px = &x; /* px berisi alamat dari x */
y = *px; /* y berisi nilai yang citunjuk px */
printf("Alamat x = %p\n",&x);
printf("Isi px = %p\n",px);
printf("Isi x = %d\n",x);
printf("Nilai yang ditunjuk px = %d\n",*px);
printf("Nilai y = %d\n",y);
}
5. Alt+F, pilih save ketik nama pemakaia.c
6. Alt+O, pilih directories, ganti semua dengan C:\TC, lalu esc
7. Alt+C, compile to OBJ
8. Alt+C, compile to EXE
80
9. Alt+R
void main()
{
static int tgl_lahir[] = { 13,9,1982 };
int*ptgl;
ptgl = tgl_lahir;/* ptgl berisi alamat array */
printf("Diakses dengan pointer");
printf("Tanggal = %i\n",*ptgl);
printf("Bulan = %i\n",*(ptgl + 1));
printf("Tahun = %i\n",*(ptgl + 2));
81
{
int var_x = 234; /*variabel int*/
int *ptr1; /*pointer int*/
int **ptr2; /*pointer menunjuk pointer int*/
ptr1 = &var_x; /*ptr1 berisi alamat var_x*/
ptr2 = &ptr1; /*ptr2 berisi alamat ptr1*/
/*Mengakses nilai var_x melalui ptr1*/ printf("Nilai var_x =
%d\n",*ptr1);
/*Mengakses nilai var_x melalui ptr2*/ printf("Nilai var_x =
%d\n",**ptr2);
getche();
}
#include<stdio.h>
char*nama_bulan(int n);
main()
{
int bl;
printf("Bulan(1..12):");
scanf("%d", &bl);
printf("%s", nama_bulan(bl));
}
char*nama_bulan(int n)
{
static char*bulan[] =
{"Kode bulan
salah","Januari","Pebruari","Maret","April","Mei","Juni","Juli"
,"Agustus",
"September","November","Desember"};
82
5. Alt+F, pilih save ketik nama luar.c
6. Alt+O, pilih directories, ganti semua dengan C:\TC, lalu esc
7. Alt+C, compile to OBJ
8. Alt+C, compile to EXE
9. Alt+R
83
* ------------------------------------ */
#include<stdio.h>
#include<conio.h>
char *nama1 = "POLITECNIC";
char *nama2 = "SEMARANG";
char *nama3 = "STATE";
void main()
{
char nama;
clrscr;
puts("Kalimat Semula : ");
printf("%s %s %s \n \n", nama1, nama2, nama3);
/* penukaran string yang ditunjuk oleh pointer nama1 dan nama2
*/
printf("Kalimat Kini : ");
printf("%s %s %s \n \n", nama3, nama2, nama1);
getch()
}
IV. PERTANYAAN
1 Apa yang tercetak dari program-program berikut ini?
a. Program pertama
#include<stdio.h>
void misteri2(const char *);
main()
{
char *string = "polines";
misteri2(string);
putchar('\n');
return0;
}void misteri2(const char *s) {
for (; *s !='\0'; s++)
putchar(*s);
}
b. Program kedua
#include<stdio.h>
int misteri3(const char *);
void main()
{
char string[80];
printf("Ketik sebuah string : "); scanf("%s", string);
84
printf("%d\n", misteri3(string));
}
int misteri3(const char *s) {
int x = 0;
for(; *s !='\0' ; s++)
++x;
return x ;
}
85
BAB 10
OPERASI FILE
I. TUJUAN
Bentuk deklarasi:
FILE *fopen(char *namafile, char *mode);
Keterangan :
namafile berupa nama dari file yang akan diaktifkan
mode berupa jenis oprasi yang akan dilakukan terhadap file
prototipe ada pada file stdio.h
86
3) a untuk membukanfile yang sudah ada untuk ditambah dengan data, jika file
belum ada akan dibuat yang baru
4) r+ sama dengan “r” tetapi selain file dapat dibaca, file juga dapat ditulisi.
5) w+ sama dengan “w” tetapi selain file dapat ditulisi, file juga dapat dibaca.
6) a+ sama dengan “r” tetapi selain file dapat ditulisi, file juga dapat dibaca.
7) Berhasil tidaknya operasi pengaktifan file dapat dilihat pada keluaran fungsi
fopen().
8) Jika keluaran fungsi berupa NULL (suatu makro yang didefinisikan pada file
stdio.h), berarti operasi pengaktifan file gagal misal membuka file dengan
mode “r” tapi filenya belum ada
9) Contoh :
Keterangan :
- pf akan diisi dengan keluaran dari fungsi fopen().
- Jika nilainya NULL, maka akan mencetak “File tidak dapat diciptakan”,
setelah itu program dihentikan
c) Menutup File
1) Apabila sudah tidak diproses lagi, maka file tersebut ditutup, karena adanya
keterbatasan jumlah file yang dapat dibuka secara serentak.
2) Perintah yang digunakan : fclose();
3) Bentuk deklarasi :
int fclose(FILE*pf);
4) Bentuk deklarasi yang lain :
int fcloseall(void) fcloseall();
Prototype yang digunakan : stdio.h
87
kar berupa karakter yang kan disimpn dalam file.
Contoh :
“rt” : mode file teks dan file hendak dibaca
“rt+” : mode file teks dan file bisa dibaca dan ditulisi.
Bisa juga ditulis : “r+t”
“rb” : mode file biner dan file hendak dibaca
Kegunaan :
_getw() untuk membaca sebuah data bertipe int dari file
_putw() untuk menyimpan sebuah data bertipe int ke file
88
h) Operasi Baca dan Tulis File Per-Blok
1) Fungsi : untuk menyimpan atau membaca data file dalam bentuk kesatuan
blok(sejumlah byte), misal float atau struct.
2) Perintah yang digunakan : fread() dan fwrite();
3) Bentuk deklarasi :
int fread(void *buffer, int n, FILE *ptr_file);
int fwrite(void *buffer, int jum_byte, FILE *ptr_file);
dengan :
buffer : pointer yang menunjuk ke alamat memori
jum_byte : jumlah byte yang akan dibaca atau disimpan
n : banyaknya blok data berukuran jum_byte yang akan
ditulis/dibaca
ptr_file : pointer-ke-FILE yang berisi nilai keluaran dari fopen()
Kegunaan:
fputs() : menyimpan string str ke dalam file.
fgets() : membaca string dari file sampai ditemukannya karakter baris baru
‘\n’ atau setelh (n-1) karakter, dengan n adalah panjang maksimal string
yang dibaca per waktu-baca.
Note :
Saat simpan, fputs() tidak menambahkan karakter baris-baru(‘\n’)
dengan sendirinya, dan karakter tidak ikut disimpan.
Baik fgets() maupun fputs digunakan untuk file teks.
dengan :
ptr_file adalah pointer yang berasal dari keluaran fopen()
offset menyatakan jumlah byte terhadap posisi
posisi dapat diisi suatu nilai tertera pada tabel
89
Konstanta Nilai Lokasi file
SEEK_SET 0 Awal file
SEEK_CUR 1 Posisi penunjuk file saat ini
SEEK_END 2 Akhir file
Prototype : stdio.h
/* Ciptakan file */
if((pf=fopen("COBA.TXT","w")) == NULL)
{
printf("file tak dapat diciptakan!\r\n");
exit(1);
}
/*Masukkan karakter per karakter sampai ditekan ENTER*/
while((kar=getchar())!='\n')
fputc(kar, pf);
90
fclose(pf); /* tutup file */
}
27. Alt+R
91
main()
{
FILE *pf; /* Pointer-ke-FILE */
char kar;
/* Ciptakan file */
if((pf = fopen("COBA.TXT","r+")) == NULL )
{
printf("file tak dapat diciptakan !\r\n");
exit(0);
}
while((kar=fgetc(pf)) !=EOF) /* baca kar dari file */
putchar(kar);
9. Alt+R
92
putw(nilai, pf); /* baca bilangan ke file */
}
printf("\nOke.Data sudah disimpan dalam file.\n");
fclose(pf); /* menutup file */
}
struct
{
char judul[20];
char pengarang[20];
int jumlah;
} buku; /* variabel buku bertipe struktur */
93
printf("File tidak dapat diciptakan!\n");
exit(1);
}
do
{
fflush(stdin); /* Hapus isi penampung keyboard */
printf("Judul buku :");
gets(buku.judul);
printf("Nama pengarang :");
gets(buku.pengarang);
printf("Jumlah buku :");
scanf("%d", &buku,jumlah);
fflush(stdin); /* Hapus isi penampung keyboard */
/* Rekam sebuah data betipe struktur */
fwrite(&buku,sizeof(buku), 1, f_struktur);
printf("\nMau merekam data lagi[Y/T]?");
jawaban = getchar();
printf("\n");
}while(jawaban == 'Y'|| jawaban == 'y');
fclose(f_struktur); /* Tutup file */
}
94
while(fread(&buku, sizeof(buku), 1, f_struktur) == 1)
printf("%2d. %-30s %-30s %4d\n", i++,buku.judul,
buku.pengarang, buku.jumlah);
printf("\n");
fclose(f-struktur); /* Tutup file */
}
95
7. Alt+C, compile to OBJ
8. Alt+C, compile to EXE
9. Alt+R
96
if((pf=fopen("latihan.txt","r"))==NULL)
{
printf("File gagal dibuka...!\n");
exit(1);
}
/* baca file per string sampai ditemui EOF */
while(fgets(nama,6,pf))
printf("%s\n",nama);
fclose(pf);
getch();
}
97
} /* Tutup file */
98
1. Pilih menu program accesoris command prompt
2. Jalankan progam turbo C
3. Alt + F, pilih New
4. Ketik :
#include<stdio.h>
#include<stdlib.h>
#define PJG 65
main()
{
int kode;
char namafile[PJG];
99
}
IV. PERTANYAAN
FILE *pf;
pf =fopen(“LATIHAN.TXT”, “w+”);
100
LINKED LIST
Tujuan Pembelajaran
Linked List
Jika dari 100 struktur tersebut hanya digunakan 50, berarti sisanya berupa
pemborosan memori karena tidak dipergunakan. Oleh sebab itu masalah
pencatatan dann perekaman data terstruktur, sangat jarang sekali menggunakan
array struktur, karena penggunaan memori tidak dinamik mengikuti kebutuhan.
Kaitan tersebut dijalin menggunakan pointer pada salah satu (atau lebih) elemen
struktur-nya untuk mencatat adress struktur yang terletak berikutnya atau terletak
sebelumnya.
Contoh bentuk paling sederhana suatu struktur yang dapat dikaitkan dalam linked
list adalah sebagai berikut :
Struct catatan_murid {
101
Unsigned long Nomor_pokok;
Char nama[50];
Wujud Next adalah suatu elemen struktur (member of struktur) berupa pointer.
Artinya, Next dapat diisi address struktur sebelumnya, atau address struktur
berikutnya sehingga terjalin mata rantai struktur untuk mencatat sejumlah data
terstruktur secara berderet, dengan letak urutan yang pasti.
Bentuk inilah yang menjadi bentuk dasar pencatat atau perekam data terstruktur
pada lingkup data base. Bentuk paling sederhana adalah singly linked list (one
way linked list), dengan referensi struktur awal ke arah struktur akhir secara urut.
Bentuk ini cukup hanya dilengkapi satu elemen pointer di dalam strukturnya.
Bentuk struktur yang dilengkapi 2 elemen pointer disebut Doubly Linked List
(Two way linked list), karena satu elemen pointer dapat digunakan mencatat
address dari rah struktur awal ke struktur akhir, dan elemen pointer lainnya dapat
digunakan mencatat address dari arah struktur akhir ke struktur awal.
Jumlah elemen pointer didalam suatu struktur dapat ditentukan sesuai dengan
keperluan. Pemanfaatannya tidak lain untuk menjalin pencatatan address structure
berikutnya atau sebelumnya. Kaitanjalinan inilah yang disebut link dan dapat
disususn menjadi jala-jala pencatatan sejumlah besar data terstruktur.
Namun lingkup pencatatan data terstruktur menggunakan jala-jala kaitan pointer,
termasuk lingkup lanjut dan memerlukan bidang sendiri. Bidang ini pada
umumnya mencakup bidang yang khususmenelaah pengolahan data-data
terstruktur, terutama bentuk data bertipe struktur.
Lingkup penjelasan didalam buku ini, hanya akan meletakkan dasar-dasar pokok
tentang pencatatan data terstruktur.
102
Agar deretan sejumlah struktur berstruktur sama dapat dijalin menjadi mata rantai
catatan, maka susunan jalinan itu harus mempunyai awal dan mempunyai akhir.
Artinya perlu ditentukan pointer awal dan pointer akhir, sehingga struktur awal
dan struktur akhir secara pasti dapat diketahui posisinya secara pasti.
Bentuk kaitan paling sederhana hanya menggunakan satu elemen pointer didalam
struktur. Rincian mengaitkan dapat dilakukan dengan 2 macam cara:
1. Kaitan Last In First Out atau kaitan LIFO.
2. Kaitan First In First Out atau kaitan FIFO.
Kaitan LIFO berarti struktur yang disimpan terakhir (Last In) hanya dapat
dimunculkan berada di urutan teratas (First Out) bilamana dilakukan pembacaan
atau penyajian kembali.
Kaitan LIFO seringkali disebut STAC, karena keadaannya analog seperti
tumpukan keping kayu atau tumpukan buku. Setelah keping-keping ditumpuk,
maka keping teratas yang dapat diambil tanpa mengganggu keping lainnya.
Kaitan FIFO erarti struktur yang disimpan pertama kali (First Out) juga akan
muncul menjadi berada di posisi pertama (First Out) bilamana dibaca dan
disajikan kembai. Kaitan FIFO seringkali disebut QUE (antrian).
Tujuan 1 Setelah bekerja melalui modul ini, mahasiswa diharapkan dapat membuat,
mengkompile dan menjalankan proghram C sederhana menggunakan Singly linked list LIFO
103
NIM : 2288009
Nama : Dwi Kedua
NIM : 2388009
Nama : Tri Ketiga
NIM : 2488009
Nama : Opat Keempat
Jika data murid itu dimasukkan secara LIFO, kemudian dibaca dari memori dan
disajikan kkembali di layar maka hasilnya akan menyajikan data terakhir menjadi
urutan sajian pertama, diakhiri dengan data pertama menjadi urutan sajian
terakhir sebagai berikut:
NIM Nama
2488009 Opat Keempat
2388009 Tri Ketiga
2288009 Dwi Kedua
2188009 Iji Pertama
Berkat adanya elemen pointer didalam masing-masing struktur, maka array
struktur bukan array statik melainkan array struktur dinamik.
Jumlah array dapat secara dinamik mengikuti kebutuhan pemasukan data.
Pelaksanaan program berwujud dinamik mengikuti jumlah struktur pencatat data
terstruktur yang dibutuhkan, dan dapat dituliskan sebagai berikut:
Memasukkan Data Murid.
NIM : 2188009
Nama : Iji Pertama
Dilanjutkan? (Y/T): Y
NIM : 2288009
Nama : Dwi Kedua
Dilanjutkan? (Y/T): Y
NIM : 2388009
Nama : Tri Ketiga
Dilanjutkan? (Y/T): Y
NIM : 2488009
Nama : Opat Keempat
Dilanjutkan? (Y/T): T
Hasil memasukkan disajikan kembali di layar:
104
NIM Nama
2188009 Iji Pertama
2288009 Dwi Kedua
2388009 Tri Ketiga
2488009 Opat Keempat
Program sederhana untuk mewujudkan pelaksanaan itu dapat disusun
menggunakan cara Singly Linked List, yaitu menggunakan struktur dengan salah
satu elemennya (satu member) berupa pointer.
Pertama kali agar mudah dimengerti, maka susunan program dibuat non-modular
terlebih dahulu. Simaklah program non-modular ini hingga dipahami benar
langkah-langkah penjalinan Linked List. Susunan program berikutnya
dikembangkan, dimodifikasi menjadi program modular menggunakan sejumlah
vvoid function dan function yang sesuai, dan variabel pointer ke struktur
dideklarasikan global.
Setelah itu dikembangkan lagi menjadi program modular menggunakan deklarasi
variael pointer ke struktur ditempatkan pada deklarasi lokal. Susunan ini
merupakan susunan canggih untuk melatih beriap ke arah kemampuan
modularsasi dan strukturisasi penyusunan program.
Deklarasi untuk menampung struktur data perihal catatan murid dengan unsur
NIM dan Nama seperti tersebut diata, sukup sederhana, yaitu:
struct catatan_murid
{
Unsigned long nomor_pokok;
Char nama[50];
Struct catatan_murid *next;
}
Dengan demikian terjalin pemasukan struktur data Structure catatan_murid dalam
bentuk kaitan LIFO. Kaitan Linked List LIFO seringkali juga disebut STACK.
Adapun susunan program seutuhnya sebagai berikut:
Contoh LIFO_1 :
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<stdlib.h>
#define YA 1
#define TIDAK 0
#define NULL 0
struct catatan_murid
{
char Nama[80];
unsigned long NIM;
105
struct catatan_murid *next;
};
main()
{
struct catatan_murid *tampung;
struct catatan_murid *ujung;
char *p;
int jawab;
puts("Memasukkan data catatan: \n");
ujung = (struct catatan_murid*)malloc(sizeof(struct
catatan_murid));
printf("NIM : "); scanf("%lu", &ujung->NIM);
printf("Nama : "); scanf("%s", &ujung->Nama);
ujung->next = NULL;
tampung = ujung;
puts("\n");
while (YA)
{
ujung = (struct catatan_murid*)malloc(sizeof(struct
catatan_murid));
ujung->next = tampung;
printf("NIM : "); scanf("%lu", &ujung->NIM);
printf("Nama : "); scanf("%s", &ujung->Nama);
tampung=ujung;
puts("\n");
printf("Dilanjutkan? (Y/T) ");
jawab = getche(); puts("\n");
if((jawab=='T')||(jawab=='t')) break;
else if ((jawab=='Y')||(jawab=='y')) continue;
else
{
puts("Jawaban harus (Y,y) atau (T,t)\n");
continue;
}
}
puts("Hasil masukan disajikan kembali di layar\n");
puts("NIM Nama\n");
while(ujung!=NULL)
{
p=&(ujung->Nama[0]);
printf("%-10lu %s\n", ujung->NIM,p);
ujung=ujung->next;
}
}
Hasilnya :
106
Hal yang sangat perlu disimak dalam contoh program tersebut adalah penggunaan
2 variabel pointer TAMPUNG dan UJUNG sebagai sarana. Pemilihan jumlah
variable pointer diperbolehkan berapa saja sesuai dengan kebutuhan, dan dalam
penyelesaian Linked List LIFO itu cukup dipergunakan 2 variabel pointer saja.
Program non modular hanya sekedar contoh agar masalahnya dapat dimengerti.
Susunan program berbentuk non-modular, akan susah dan payah jika menggarap
masalah yang besar. Susunannyamenjadi ruwet dan banyak menggunakan GOTO
kemana saja asal dapat menghimpun susunan penyelesaian masalah.
Oleh karena itu, sejak masalahnya masih sederhana, maka penyelesaiannya harus
telah menggunakan susunan progam modular menggunakan function dan void
function yang sesuai, dilengkapi dengan pass parameter (pass argumen) yang
teapt dan efisien. Susunan program modular untuk menyelesaikan perihal tersebut
diatas berupa modifikasi program LIFO_1.C menjadi progam LIFO_2.C
menggunakan deklarasi global bagi pointer variable TAMPUNG dan UJUNG.
Contoh LIFO_2 :
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<stdlib.h>
#define YA 1
#define TIDAK 0
#define NULL 0
struct catatan_murid
{
char nama[80];
unsigned long nim;
107
struct catatan_murid *next;
};
struct catatan_murid *tampung;
struct catatan_murid *ujung;
108
puts("Hasil masukan disajikan kembali dilayar: \n");
sajikan_hasil();
}
Hasilnya :
struct catatan_murid
{
109
char nama[80];
unsigned long nim;
struct catatan_murid *next;
};
struct catatan_murid *catat(struct catatan_murid *ujung, struct
catatan_murid *tampung)
{
printf("NIM : "); scanf("%lu", &ujung->nim);
printf("Nama : "); scanf("%s", &ujung->nama);
puts("\n");
if(tampung==0)
{
ujung->next=NULL;
tampung=ujung;
}
else
{
ujung->next = tampung;
tampung = ujung;
}
return(tampung);
}
dilanjutkan_ya_tidak()
{
char jawab;
int j;
printf("Dilanjutkan? (Y/T) ");
if ((toupper(jawab=getche()))=='T')j=0;
else if(toupper(jawab)=='Y') j=1;
else
{
puts("\nJawaban harus (Y,y) atau (T,t)\n");
j=1;
}
puts("\n");
return(j);
}
110
ujung=(struct catatan_murid*)malloc(sizeof(struct
catatan_murid));
tampung = catat(ujung, tampung);
jawab = dilanjutkan_ya_tidak();
}
puts("Hasil masukan disajikan kembali dilayar: \n");
sajikan_hasil(ujung);
}
Hasilnya :
Function dan void function beserta pass argumen-nya perlu dikaji lebih cermat,
terutama bentuk syntax dan jalinan informasi yang dikandungnya.
Terutama bentuk pointer ke function :
Struct catatan_murid *catat
{
Struct catatan_murid *UJUNG;
Struct catatan_murid *TAMPUNG;
}
Function tersebut adalah *catat (), sedangkan catat adalah pointernya, dan pointer
catat inti bertype pointer ke structure catatan_murid. Oleh karena itu function
*catat () menghasilkan (mengembalikan) harga berupa pointer pada :
return (TAMPUNG) ;
Jika kita menginginkan agar suatu function untuk mengembalikan pointer ke
structure, maka perlu digunakan pointer ke function dengan struktur pointer ke
structure. Hal yang perlu dikerjakan hanya menyusun syntax yang benar.
Agar lebih jelas simaklah kembali :
Struct catatan_murid *catat
{
111
struct catatan_murid *UJUNG;
struct catatan_murid *TAMPUNG;
}
{
cputs(“NIM :”); scanf(“%lu”, &UJUNG->NIM);
cputs(“Nama :”); cgets(UJUNG->Nama);
puts(“\n”);
if(TAMPUNG==0)
{
UJUNG->Next = NULL; TAMPUNG=UJUNG;
}
Else
{
UJUNG->Next=TAMPUNG; TAMPUNG=UJUNG;
}
return (TAMPUNG);
}
Tujaun 2 Setelah bekerja melalui modul ini, mahasiswa diharapkan dapat membuat,
mengkompile dan menjalankan proghram C sederhana menggunakan Singly Linked List
FIFO
112
sebab itu lazim disebut QUEUE dan tampak lebih wajar dalam urutan, tidak
janggal seperti pada kaitan LIFO yang lazim disebut STACK.
Contoh realisasi pemasukan data dan penyajiaannya kembali sebagai berikut:
Memasukkan Data Murid.
NIM : 2188009
Nama : Iji Pertama
Dilanjutkan? (Y/T): Y
NIM : 2288009
Nama : Dwi Kedua
Dilanjutkan? (Y/T): Y
NIM : 2388009
Nama : Tri Ketiga
Dilanjutkan? (Y/T): Y
NIM : 2488009
Nama : Opat Keempat
Dilanjutkan? (Y/T): T
Hasil memasukkan disajikan kembali di layar:
NIM Nama
2188009 Iji Pertama
2288009 Dwi Kedua
2388009 Tri Ketiga
2488009 Opat Keempat
Dari gambaran itu tampak bahwa pointer ke structure_1 harus diketahui secara
pasti menggunakan pointer AWAL. Demikian pula elemen pointer *Next pada
structure_4 sebagai structure ujung akhir, harus diisi NULL sehingga secara pasti
diketahui bahwa structure_4 adalah ujung akhir.
Pointer AWAL bertugas sangat khusus, yaitu hanya mencatat address structure
paling pertama saja, agar structure awal dapat selalu diketahui secara pasti
bilamana diperlukan sebagai referensi awal dari kaitan Linked List.
113
Dalam Singly Linked List FIFO ini pointer AWAL memang hanya mencatat
address structure_1 (struktur paling pertama) saja. Pointer UJUNG dipilih
menjadi variabel pointer struktur UJUNG agar dapat mengikuti pertambahan
posisi struktur terujung. Kemudian pointer TAMPUNG akan secara sementara
menampung struktur UJUNG menyongsong adanya pertambahan struktur baru
yang akan menjadi struktur UJUNG yang baru. Hal yang sulit dimengerti ini sulit
pula menerangkannya, apalagi menjelaskan hanya berdasar kalimat.
Perihal sangat penting adalah pengisian elemen pointer *Next pada setiap
struktur. Pengisian ini harus menjalin kaitan address antara struktur yang satu
dengan struktur lainnya, sehingga terjadi kaitan address berikutan.
Contoh FIFO_1 :
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<stdlib.h>
#define YA 1
#define TIDAK 0
#define NULL 0
struct catatan_murid
char nama[80];
};
main()
char *p;
int jawab;
114
puts("Memasukkan data catatan: \n");
awal=(struct catatan_murid*)malloc(sizeof(struct
catatan_murid));
tampung=awal;
tampung->next=awal->next;
puts("\n");
while (YA)
ujung=(struct catatan_murid*)malloc(sizeof(struct
catatan_murid));
tampung->next = ujung;
ujung->next=NULL;
tampung=ujung;
puts("\n");
jawab=getche();puts("\n");
if((jawab=='T')||(jawab=='t'))break;
else if((jawab=='Y')||(jawab=='y'))continue;
else
ujung=awal;
while(ujung!=NULL)
p=&(ujung->nama[0]);
115
ujung=ujung->next;
Hasilnya :
Contoh hasil pelaksaan eksekusi program, akan tepat berbentuk seperti yang telah
dilukiskan diatas.
Program FIFO_1.C diawali dengan mengisi data pada struktur pertama yaitu
struktur yang addressnya akan dicatat oleh pointer AWAL sebagai berikut :
awal=(struct catatan_murid*)malloc(sizeof(struct
catatan_murid));
tampung=awal;
tampung->next=awal->next;
while (YA)
116
ujung=(struct catatan_murid*)malloc(sizeof(struct
catatan_murid));
tampung->next = ujung;
ujung->next=NULL;
tampung=ujung;
puts("\n");
Demikian seterusnya, dan elemen pointer struktur ujung akhir harus diisi NULL
seperti pada pernyataan UJUNG -> Next = NULL.
Namun anda tidak boleh puas hanya dengan program non modular saja, karena
bila demikian maka anda tidak akan mampu menggarap masalah-masalah besar.
Oleh karena itu maka program FIFO_1.C tersebut dimodifikasi menjadi modular
dan sebagai tahapan termudah adalah menggunakan deklarasi global bagi pointer
AWAL, TAMPUNG, dan UJUNG.
Contoh FIFO_2 :
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#define YA 1
#define TIDAK 0
#define NULL 0
struct catatan_murid
char nama[80];
};
117
struct catatan_murid *catat()
puts("\n");
ujung->next=NULL;
if(awal==0)
awal=ujung; tampung=awal;
else
tampung->next=ujung;tampung=ujung;
return (tampung);
dilanjutkan_ya_tidak()
char jawab;
int j;
jawab=getche(); puts("\n");
if((jawab=='T')||(jawab='t')) j=0;
else
return (j);
void sajikan_hasil()
char *p;
118
puts("NIM Nama\n");
ujung=awal;
while(ujung!=NULL)
p=&(ujung->nama[0]);
ujung=ujung->next;
main()
int jawab;
awal=NULL;
jawab=YA;
while(jawab==YA)
ujung=(struct catatan_murid*)malloc(sizeof(struct
catatan_murid));
tampung=catat();
jawab=dilanjutkan_ya_tidak();
sajikan_hasil();
Hasilnya :
119
Agar susunan program menjadi lebih andal menghadapi lingkungan
pemrograman lebih kompleks, maka program FIFO_2 dapat dimodifikasi
berbentuk tetap modular dan menggunakan deklarasi variabel pointer AWAL,
TAMPUNG, dan UJUNG menjadi variabel local di main ().
Pass argument (pas parameter) hanya bersyntax agak rumit akan tetapi
mekanisme kerjanya sangat sederhana. Jalan kerjanya hanya mengirim address
yang dikandung pointer. Susunan program seutuhnya sebagai berikut :
Contoh FIFO_3 :
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<ctype.h>
#define YA 1
#define TIDAK 0
#define NULL 0
struct catatan_murid
char nama[80];
120
struct catatan_murid *next;
};
printf("\n");
ujung->next=NULL;
if(tampung==NULL)
tampung = ujung;
else
tampung->next=ujung;
tampung=ujung;
return (tampung);
dilanjutkan_ya_tidak()
char jawab;
int j;
if ((toupper(jawab=getche()))=='T')j=0;
else if (toupper(jawab)=='Y')j=1;
else
j=1;
121
printf("\n");
return (j);
char *p;
printf("NIM Nama\n");
ujung=awal;
while(ujung!=NULL)
p=&(ujung->nama[0]);
ujung=ujung->next;
main()
int jawab;
awal=NULL;
tampung=NULL;
jawab=YA;
while(jawab==YA)
if (awal==NULL)
awal=catat(tampung, ujung);
tampung=awal;
122
}
jawab = dilanjutkan_ya_tidak();
sajikan_hasil(ujung, awal);
return 0;
Hasilnya :
Kebalikan malloc ( ) adalah free ( ). Artiny, free ( ) akan membuat isi pointer
menjadi NULL dan memori yang dicakup oleh penunjukkan pointer tersebut
menjadi bebas digunakan oleh pemakai lain.
123
Ambillah contoh program FIFO_3. C dengna contoh pemasukan data sebagai
berikut :
124
2288009 Dwi Kedua
2488009 Opat Keempat
Penghapusan satu struktur ddidalam deretan struktur yang berkaitan linked list
harus menjada kaitan pointernya agar jalinan kaitan itu tidak rusak.
Setelah itu baru dapat dilakukan penghapusan structure_e dengan free (P) dan
jalinan linked list tetap terkait dari structure_1 ke structure_2, dari structure_2 ke
structure_4
Function seutuhnya harus dapat mencari mulai dari structure_1 hingga struktur
terakhir. Oleh karena itu penggarapannya harus menggunakan loop.
Akan tetapi sebelum loop dilakukan, terlebih dahulu harus diperiksa apakah
structure_1 yang akan dihapus. Oleh karena itu structure_1 yang dicatat
addressnya menggunakan pointer AWAL mendapat perlakuan khusus, karena
posisi awal sangat menentukan.
Dengan demikian susunan program harus dua tahap. Tahap pertama menggarap
structure_1, karena memang harus digarap secara khusus. Tahap kedua membuat
loop pencarian dan penghapusan struktur yang diinginkan.
unsigned long h;
scanf("%lu", &h);
125
if(awal->nim==h)
p=awal->next;
free(awal);
awal=p;
else
p=awal;
while(p!=NULL)
ujung=p;
p=p->next;
if(p->nim==h)
ujung->next=p->next;
free(p); p=ujung->next;
return 0;
126
Pertanyaan ini harus dijawab dengan mengetikkan angka NIM, maka kemudian
NM dan Nama yang disebut akan dihapus. Secara sepintas akan tampak bahwa
penghapusan itu sangat mudah.
Kemudahan itu memang benar asal cara-cara katian pengisian elemen pointer
*Next dikuasai secara mantap. Susunan program seutuhnya adalah berupa
pengembangan program FIFO_3.C ditambagi function Menu_Hapus, function
Pilihan, dan Function Hapus_1_Catatan.
Contoh FIFO_H :
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<ctype.h>
#define YA 1
#define TIDAK 0
#define NULL 0
struct catatan_murid
char nama[80];
};
printf("\n");
ujung->next=NULL;
if (tampung==NULL)
127
{
tampung=ujung;
else
tampung->next=ujung;
tampung=ujung;
return (tampung);
dilanjutkan_ya_tidak()
char jawab;
int j;
if((toupper(jawab=getche()))=='T')j=0;
else if (toupper(jawab)=='Y')j=1;
else
j=1;
printf("\n");
return(j);
char *p;
printf("\nNIM Nama");
ujung=awal;
while(ujung!=NULL)
p=&(ujung->nama[0]);
128
printf("\n%-10lu %s\n", ujung->nim, p);
ujung=ujung->next;
unsigned long h;
scanf("%lu", &h);
if(awal->nim==h)
p=awal->next;
free(awal);
awal=p;
else
p=awal;
while(p!=NULL)
ujung=p;
p=p->next;
if(p->nim==h)
ujung->next=p->next;
free(p); p=ujung->next;
return 0;
void menu_hapus()
129
{
printf("\nPILIHAN: ");
char p;
while((tolower(p=getche()))!='e')
switch(p)
case 'h' :
hapus_1_catatan(ujung);
sajikan_hasil(ujung);
menu_hapus(); break;
default :
break;
main()
130
int jawab;
awal=NULL;
tampung=NULL;
jawab=YA;
while(jawab==YA)
if (awal==NULL)
awal=catat(tampung, ujung);
tampung=awal;
jawab=dilanjutkan_ya_tidak();
sajikan_hasil(ujung);
menu_hapus();
pilihan(ujung);
return 0;
Hasilnya :
131
Program FIFO_3.C juga dapat dikembangkan untuk melayani sisipan struktur
kedalam deretan struktur yang telah terjalin pada kaitan linked list. Contoh
realisasi pelaksanaan dapat dilukiskan sebagai berikut :
132
2388009 Tri Ketiga
2488009 Opat Keempat
Menyisipkan salah satu catatan.
Pilihan :
S atau s : Sisipkan satu catatan
E atau e : Selesai dan exit
S
Disisipkan setelah NIM: 23880009
NIM dan Nama murid yang
disisipkan:
NIM : 2188888
Nama : Tambahan Sisipan
NIM Nama
2188009 Iji Pertama
2288009 Dwi Kedua
2388009 Tri Ketiga
2188888 Tambahan Sisipan
2488009 Opat Keempat
Agar supaya dapat menampung sisipan, maka harus memesan struktur baru
menggunakan pointer TAMPUNG.
P->Next = TAMPUNG;
133
P->Next = TAMPUNG akan mengutipkan address_structure_sisip kedalam P-
>Next, yaitu *Next_structure_3, sehingga structure_3 mengait ke structure_sisip.
Urutan tersebut sama sekal tidak boleh terbalik atau dibalik, sebab jalinan
kaitannya unik, dengan demikian maka structure_3 mengait ke structure_sisip,
dan structure_sisip mengait ke structure_4, dan jalinan linked list terjamin benar.
Susunan langkah pernataan program berikut ini akan berbicara sendiri tentang
bagaimana proses penyisipan dilaksakan :
p=awal;
while(p!=NULL)
if(p->nim==h)
tampung=(struct catatan_murid
*)malloc(sizeof(*tampung));
printf("");
tampung->next=p->next;
p->next=tampung;
p=tampung;
p=p->next;
Contoh FIFO_S :
134
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<ctype.h>
#define YA 1
#define TIDAK 0
#define NULL 0
struct catatan_murid
char nama[80];
};
printf("\n");
ujung->next=NULL;
if(tampung==NULL)
tampung=ujung;
else
tampung->next=ujung; tampung=ujung;
return(tampung);
dilanjutkan_ya_tidak()
135
{
char jawab;
int j;
if((toupper(jawab=getche()))=='T')j=0;
else if(toupper(jawab)=='Y')j=1;
else
printf("\n");
return(j);
char *p;
printf("\nNIM Nama\n");
ujung=awal;
while(ujung!=NULL)
p=&(ujung->nama[0]);
ujung=ujung->next;
unsigned long h;
p=awal;
while(p!=NULL)
136
{
if(p->nim==h)
tampung=(struct catatan_murid
*)malloc(sizeof(*tampung));
printf("");
tampung->next=p->next;
p->next=tampung;
p=tampung;
p=p->next;
void menu_sisip()
printf("PILIHAN:\n");
char p;
while((tolower(p=getche()))!='e')
switch(p)
case 's':
sisipkan_1_catatan(ujung);
137
sajikan_hasil(ujung);
menu_sisip(); break;
default:
main()
int jawab;
awal=NULL;
tampung=NULL;
jawab=YA;
while (jawab==YA)
if(awal==NULL)
awal=catat(tampung,ujung); tampung=awal;
jawab=dilanjutkan_ya_tidak();
sajikan_hasil(ujung);
138
menu_sisip();
pilihan(tampung);
return 0;
Hasilnya :
139
2. Menyusun deklarasi variabel yang sesuai dan andal. Yaitu sesedikit
mungkin dekalrarsi variabel global, dan mengusahakan sedapat mungkin
menggunakan deklarasi variabel lokal.
3. Menggunakan pass parameter (pass argument) yang tepat dengan pedoman
bahwa pass parameter pada umumnya adalah pointer (address) dan value
parameter.
Berikut ini adalah hasil olahan perkembangan program, sejak pertama kali
membahas Linked List struktur hingga pokok dasar Data Base dapat terwujud
sederana seperti program FIFO_HS.C
Akan tetapi wujud ini baru merupakan permulaan yang paling awal dan paling
sederhana, namun jika dapat dikuasai pendalamannya, akan terasa mendapatkan
landasan dasar yang sangat kuat.
Contoh olahan gabungan program Linked List FIFO yang telah dibahas dapat
diwujukan menjadi program FIFO_HS.C sebagai berikut :
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<ctype.h>
#define YA 1
#define TIDAK 0
#define NULL 0
struct catatan_murid
char nama[80];
};
140
struct catatan_murid *catat(struct catatan_murid *tampung, struct
catatan_murid *ujung)
printf("\n");
ujung->next=NULL;
if(tampung==NULL)
tampung=ujung;
else
tampung->next=ujung; tampung=ujung;
return(tampung);
disajikan_ya_tidak()
char jawab;
int j;
printf("Dilanjutkan? (Y/T)\n");
if((toupper(jawab=getche()))=='T')j=0;
else if(toupper(jawab)=='Y')j=1;
else
printf("\n");
return(j);
141
char *p;
printf("\nNIM Nama\n");
ujung=awal;
while(ujung!=NULL)
p=&(ujung->nama[0]);
ujung=ujung->next;
unsigned long h;
p=awal;
while(p!=NULL)
if(p->nim==h)
tampung=(struct catatan_murid
*)malloc(sizeof(*tampung));
printf("");
p=p->next;
142
unsigned long h;
if(awal->nim==h)
else
p=awal;
while(p!=NULL)
ujung=p; p=p->next;
if(p->nim==h)
ujung->next=p->next;
free(p);
p=ujung->next;
return 0;
menu_sisip_hapus()
printf("PILIHAN:\n");
return 0;
143
{
char p;
while((toupper(p=getche()))!='e')
switch (p)
case 's' :
sisipkan_1_catatan(ujung);
sajikan_hasil(ujung);
menu_sisip_hapus(); break;
case 'h' :
hapus_1_catatan(ujung);
sajikan_hasil(ujung);
menu_sisip_hapus(); break;
case 'e' :
default :
main()
144
struct catatan_murid *ujung;
int jawab;
awal=NULL;
tampung=NULL;
jawab=YA;
while(jawab==YA)
if(awal==NULL)
awal=catat(tampung,ujung); tampung=awal;
jawab=disajikan_ya_tidak();
sajikan_hasil(ujung);
menu_sisip_hapus();
pilihan(tampung);
Hasilnya :
145
146
IV. DAFTAR PUSTAKA
147