Wednesday, January 18, 2023

Rangkuman Praktikum Sistem Operasi


A. Profil Laboratorium

Visi Laboratorium

"Mewujudkan Laboratorium Sistem Operasi yang bermutu Tingkat Nasional 2020 di Bidang Informatika dan Komputasi, serta menjadi Unit Pendukung Kegiatan di unit kerja lain di lingkungan UMSIDA".

Misi Laboratorium

1.     Menyelenggarakan praktikum berkualitas, dan pembimbingan berdasarkan kurikulum yang terintegrasi dan berkelanjutan untuk seluruh mahasiswa Informatika. 

2.     Menyediakan sarana dan prasarana untuk kegiatan penelitian, pengembangan dan inovasi dalam bidang Informatika dan Komputer. 

3.     Memberikan pelayanan laboratorium yang baik dan bermutu. 

4.     Meningkatkan kerja sama dengan instansi pemerintah/swasta/masyarakat di bidang Informatika dan Komputer di Tingkat Nasional.

Sasaran Laboratorium

1.     Tersedianya sarana dan prasarana untuk penunjang kegiatan praktikum.

2.     Tersedianya asisten laboratorium dan asisten praktikum yang professional dan sesuai dengan tugasnya. 

3.     Adanya koordinasi atau kerja sama yang baik antara unit-unit yang terkait.

4.     Meningkatnya pengelolaan data akademik. 

5.     Meningkatnya pelayanan administrasi Laboratorium.

Tujuan Laboratorium

1.     Mengembangkan sumber daya laboratorium terpadu untuk peningkatan kualitas pelayanan praktikum, penelitian, pembelajaran dan pengembangan masyarakat. Mengembangkan          sumber-sumber pendanaan           laboratorium yang berkelanjutan.

2.     Pengembangan Sistem Manajemen Laboratorium yang sehat dan harmonis.

3.     Mengembangkan kelembagaan laboratorium yang kuat dan dinamis serta meningkatkan kapabilitas dan kompetensi SDM.

Manfaat Laboratorium Sistem Operasi

1.     Diharapkan dapat memfasilitasi pengembangan mata pelajaran TIK (Teknologi Informasi Komputer) sebagai bagian dasar pemanfaatan teknologi untuk mempersiapkan mahasiswa yang memadai agar di masa depan dapat berperan sebagai kontribusi dari penguasaan komputer.

2.     Untuk menunjang proses pembelajaran yang bermutu, teratur dan berkelanjutan.

3.     Meningkatkan pengalaman dan keterampilan dalam mengimplementasikan penguasaan komputer pada mata pelajaran lainnya.

4.     Memberikan dampak kepada mahasiswa untuk lebih terampil mengkomunikasikan teori dengan praktik (dalam proses belajarmengajar).

5.     Memberikan pengalaman langsung kepada mahasiswa melalui praktikpraktik lapangan


SOP

SOP (Standard Operasional Prosedur) adalah suatu pedoman tertulis yang dipergunakan untuk memperlancar kegiatan praktikum teknik Informatika. 

Tujuan

1.     Meningkatkan    efisiensi           pelaksanaan    kegiatan          praktikum    di laboratorium Teknik Informatika. 

2.     Memberikan sanksi bagi pengguna laboratorium yang tidak memenuhi aturan. 

Pihak Terkait

1.     Mahasiswa; 

2.     Dosen; 

3.     Laboran;  4. Asisten; dan 

5. Kalab 

Waktu Dan Tempat Pelaksanaan 

Waktu praktikum sesuai dengan jadwal yang telah ditentukan. Tempat pelaksanaan praktikum di Laboratorium Informatika. 

c.1 Jumlah tatap muka

Jumlah tatap muka praktikum Sistem Operasi di Laboratorium Sistem Operasi menetapkan 6 kali tatap muka. 

c.2 Lama praktikum setiap tatap muka 

Lama praktikum untuk setiap tatap muka adalah 2 jam dengan pertimbangan bahwa setengah jam pertama untuk persiapan peralatan sedangkan satu setengah jam berikutnya untuk materi praktikum. Jeda waktu antar praktikum 15 menit dengan pertimbangan bahwa diperlukan waktu kurang lebih 15 menit bagi asisten untuk mempersiapkan pelaksanaan praktikum berikutnya. 

PROSEDUR PENGGUNAAN LABORATORIUM 

1. Tidak menginstal software pada komputer yang digunakan.

a.      Tidak menginstal dan menghapus.

b.     Tidak membuat akun, di direktori.

c.      Tidak menambah atau mengurangi data yang ada, kecuali yang dibutuhkan.

2.     Pelanggaran atas aturan ini dikenakan sanksi tidak dapat mengikuti praktikum berikutnya. 

3.     Asisten harus melaporkan terjadinya pelanggaran ke laboran dan mencatat pelanggaran yang terjadi 

4.     Kerusakan karena kelalaian praktikkan menjadi tanggung jawab praktikkan yang bersangkutan. 

5.     Tidak membawa makanan dan minuman ke dalam laboratorium.  

PROSEDUR PELAKSANAAN PRAKTIKUM 

1.     Laboran menyiapkan laboratorium dan perlengkapannya. 

2.     Asisten menyiapkan materi praktikum berdasarkan modul praktikum. 

3.     Mahasiswa melaksanakan praktikum didampingi asisten dan dosen pembimbing 

4.     Mahasiswa membuat laporan dan diserahkan kepada asisten pada pertemuan berikutnya. 

5.     Asisten memeriksa dan menandatangani asistensi laporan praktikum mahasiswa 

6.     Laporan yang telah diperiksa diserahkan kembali kepada mahasiswa 

7.     Pada akhir praktikum, Dosen memberikan tes/ujian yang harus diikuti oleh semua mahasiswa. 

8.     Dosen menyerahkan nilai hasil tes/ujian praktikum yang dilaksanakan mahasiswa ke Kepala Laboratorium. 

9.     Asisten merekap nilai praktikum (20% tugas + 40 % pelaksanaan praktikum) 

10.  Asisten menyerahkan nilai ke Kepala laboratorium. 

11.  Kepala laboratorium merekap nilai praktikum (20% tugas + 40 % pelaksanaan praktikum + 30 % ujian praktikum + 10 % laporan praktikum) 

12.  Kepala laboratorium menyerahkan nilai praktikum ke BAA.

13.  Kalab membuat kartu peserta (lampiran) dengan ketentuan nilai: 

Dinyatakan lulus praktikum jika nilai minimal praktikum C. 


A.    Analisis Materi / Instruksional (TIU, TIK) 

Mahasiswa diharapkan dapat: 

1.     Mereview Komponen Sistem Komputer 

2.     Mengetahui dan memahami Struktur Sistem Operasi dan konsepnya 

3.     Menentukan sistem operasi dengan fungsinya, dan jenisnya, serta komponen dasar umumnya. 

4.     Memahami bagaimana kerja Sistem Operasi 

5.     Menggunakan sistem operasi dengan fungsi dasar umumnya  

B.    Silabus Praktikum 

Silabus Praktikum Sistem Operasi: 

1.          Pengenalan Sistem Komputer dan Sistem Operasi Linux.

2.          Struktur Sistem Operasi Linux.

3.          Manajemen I/O & Manajemen Memori.

4.          Proses Thread dan Deadlock.

5.          Manajemen File dan Disc.    Sistem Operasi Tersebar. 

PENGENALAN SISTEM KOMPUTER DAN SISTEM OPERASI LINUX

 

PENDAHULUAN 

Pada pokok bahasan ini akan dibahas mengenai struktur sistem komputer serta sistem operasi Linux yang pembahasannya meliputi komponen dan fungsi sistem operasi Linux tersebut. Linux tersebut. Sehingga setelah mempelajari bab ini diharapkan mahasiswa mampu: 

a.      Mengetahui asal muasal dan alasan dibuatnya komputer 

b.     Mengetahui komponen-komponen yang membangun sistem komputer dan bagaimana komponen-komponen tersebut saling bekerjasama untuk melayani kebutuhan pengguna 

c.      Mengetahui pembagian perangkat lunak menjadi aplikasi dan sistem operasi. 

d.     Mengetahui fungsi-fungsi utama sistem operasi 

PENYAJIAN (TUTORIAL) SISTEM KOMPUTER 

Komputer merupakan alat elektronik yang pada awalnya dirancang untuk aktivitas komputasi. Namun pada saat ini penggunaan komputer telah berkembang mengikuti perkembangan zaman di tambah juga mencakup pada manipulasi, simulasi, animasi, dan komunikasi-informasi. 

Sebagaimana layaknya sebuah perangkat elektronik, komputer merupakan sistem Input Process and Output, sehingga memerlukan masukan untuk diolah yaitu berupa data dan akan menghasilkan suatu keluaran yaitu informasi. 

Secara teknis, kriteria yang dijadikan dasar untuk mengklasifikasikan, antara lain: a. Arsitektur 

b.     Kecepatan pemrosesan 


c.      Besarnya memori 

d.     Kemampuan penyimpanan 

e.      Jumlah pengguna 

f.      Biaya dan ukuran. 


 SISTEM OPERASI 

Sistem operasi adalah program yang bertindak sebagai perantara antara user dengan perangkat keras komputer. Sistem operasi digunakan untuk mengeksekusi program user dan memudahkan menyelesaikan permasalahan user. Selain itu dengan adanya sistem operasi membuat sistem komputer nyaman digunakan. Sistem operasi mempunyai tujuan untuk menggunakan perangkat keras komputer secara efisien. 

Secara umum komponen sistem komputer terdiri dari: 

1.     Perangkat Keras, merupakan sumber daya utama untuk proses komputasi. Perangkat keras komputer terdiri dari : CPU, memory dan perangkat input output. 

2.     Sistem Operasi, mempunyai tugas untuk melakukan control dan koordinasi penggunaan perangkat keras pada berbagai program aplikasi untuk user-user yang berbeda. 

3.     Program Aplikasi, menentukan cara sumber daya sistem digunakan untuk menyelesaikan permasalahan komputasi dari user, contohnya compiler, sistem basis data, video games, program bisnis dan lain-lain. 

4.     User yang menggunakan sistem, terdiri dari orang, mesin atau komputer lain. 

Hubungan antara komponen-komponen sistem komputer diatas dapat dilihat pada Gambar.


umsida.ac.id 

fst.umsida.ac.id 

Monday, July 25, 2022

Rangkuman Modul Praktikum Algoritma dan Struktur Data

PENYAJIAN (TUTORIAL)

A.     Konsep Dasar Struktur Data

Struktur data adalah sebuah bagian dari ilmu pemrograman dasar yang mempunyai karakteristik yang terkait dengan sifat dan cara penyimpanan sekaligus penggunaan atau pengaksesan data.

Struktur data bertujuan agar cara merepresentasikan data dalam membuat program dapat dilakukan secara efisien dalam pengolahan di memori dan pengolahan penyimpanan dari program ke strorage juga lebih mudah dilakukan.

B.    Konsep Dasar Array

Array adalah kumpulan elemen – elemen data. Kumpulan elemen  tersebut mempunyai susunan tertentu yang teratur. Jumlah elemen terbatas, dan semua elemen mempunyai tipe data yang sama. Jenis-jenis array:

1.    Array satu dimensi

Struktur array satu dimensi dapat dideklarasikan dengan bentuk umum berupa: tipe_var nama_var [ukuran];

Dengan:

-        Tipe_var : untuk menyatakan jenis elemen array (misalnya int, char, unsigned)

-       Nama_var : untuk menyatakan nama variable yang dipakai.

-       Ukuran : untuk menyatakan jumlah maksimal elemen array.

Contoh : float nilai_ujian [5];

2.    Array Dua Dimensi

Tipe data array dua dimensi biasa digunakan untuk menyimpan, mengolah maupun menampilkan suatu data dalam bentuk tabel atau matriks. Untuk mendeklarasikan array agar dapat meyimpan data adalah :

tipe_var  nama_var [ukuran1][ukuran2];

Dimana

-       Ukuran1 menunjukkan jumlah/nomer baris.

-       Ukuran2 menunjukkan jumlah/nomor kolom.

Jumlah elemen yang dimiliki array dua dimensi dapat ditentukan dari hasil perkalian :

ukuran1 x ukuran2

Seperti halnya pada array satu dimensi, data array dua dimensi akan ditempatkan pada memori secara berurutan.

Array Multidimensi/Dimensi Banyak.

Array berdimensi banyak atau multidimensi terdiri dari array yang tidak terbatas hanya dua dimensi saja. Bentuk umum pendeklarasian array multidimensi adalah : tipe_var nama_var[ukuran1][ukuran2]…[ukurann];

Contoh : int data_angka [3][6][6];

Yang merupakan array tiga dimensi.

Mengakses Elemen Array :

Dalam Bahasa C++, data array akan disimpan dalam memory pada alokasi yang berurutan.

Elemen pertama biasanya mempunyai indeks bernilai 0. Contoh :

Float nilai_tes[5];

Jika pada contoh di atas, variable nilai_tes mempunyai 5 elemen, maka elemen pertama mempunyai indeks sama dengan 0, elemen kedua mempunyaiindeks 1, dan seterusnya. Bentuk umum pengaksesan suatu elemen variable array adalah :

Nama_var[indeks];

Gambar berikut memperlihatkan urutan komponen array memori.

Untuk variable array nilai_tes :

Gambar 1.1 Struktur Array Satu Dimensi

Inisialisasi Array :

Array dapat diinisialisasikan secara langsung saat pertama kali dideklarasikan (efisien

untuk array berdimensi sedikit).

Contoh : int x[2]={1,2};

Array dapat dideklarasikan terlebih dahulu, baru kemudian diisi elemennya.

Contoh :

Int x[2];

X[0]=1;

X[1]=2;

A.     Konsep Dasar Pointer

Pointer adalah sebuah variable yang berisi lamat variable yang lain. Suatu pointer dimaksudkan untuk menunjuk ke suatu alamat memori sehingga alamat dari suatu variable dapat diketahui dengan mudah. Deklarasi pointer :

Operator pointer :

Operator ‘&’ : untuk mendapatkan alamat memori operand / variabel pointer ‘*’ : untuk mengakses nilai data operand / variable pointer.

B.     Konsep Dasasr Struktur

Struktur adalah koleksi dari variabel yang dinyatakan dengan sebuah nama, dengan sifat setiap variabel dapat memiliki tipe yang berlainan. Struktur biasa dipakai untuk mengelompokkan beberapa informasi yang berkaitan menjadi sabuah satu kesatuan. Contoh sebuah struktur adalah informasi data tanggal, yang berisi tanggal, bulan, dan tahun.

Mendeklarasikan Struktur :

Contoh pendefinisian tipe data

Struktur adalah : struct

Data_tanggal

{int tanggal;

Masing-masing tipe dari elemen struktur dapat berlainan. Adapun variable_struktur1 sampai dengan variabel_struktur M menyatakan bahwa variablel struktur yang dideklarasikan bisa lebih dari satu.jika ada lebih dari satu variable, antara variabel struktur dipisahkan dengan tanda koma.

Mengakses Elemen Struktur :

Elemen dari struktur dapat diakses dengan menggunakan bentuk :

Variable_struktur.nama_field

Antara variabel_struktur dan nama_field dipisahkan dengan operator titik (disebut operator anggota struktur). Contoh berikut merupakan instruksi

 

Tgl_lahir.tang

Gal=30 int

Bulan;

Int tahun;

}

Yang mendefinisikan tipe struktur Bernama data_tanggal, yang terdiri dari tiga buah elemen berupa tanggal, bulan, dan tahun. Bentuk umum dalam mendefinisikan dan mendeklarasikan struktur adalah :

Struct nama_tipe_struktur

{

Tipe

Field1

; Tipe

Field2

; Tipe

Field3

;

}variabel_struktur1.... variabel_strukturM;

 

LEMBAR KERJA DAN TUGAS

1.     Program pangkat dengan array dimensi satu.

#include <stdio.h>

#include <iostream>

#include <conio.h>

using namespace std ;

int main()

{

            int square[100]; // --> Array 1 dimensi dengan tempat yang dipesan sebanyak 100

            int i;

            int k;

           

            //perhitungan

            for (i = 0; i  < 10; i++) // angka yang ditampilkan 1-10

            {

                                    k = i + 1;

                                    square[i] = k * k;

                        printf("\n Pangkat dari %d adalah %d", k, square[i]);

            }

            _getch();

}

 

2.     Array dimensi dua

#include <stdio.h>

#include <iostream>

#include <conio.h>

using namespace std ;

void printArray(int [][3]);//-->penulisan array 2 dimensi

int main()

{

            //pengisian elemen array

            int

matrik1[2][3]={{1,2,3},{4,5,6}},matrik2[2][3]={1,2,3,4,5},matrik3[2][3]={{1,2},{4}};

            printArray(matrik1);

            printArray(matrik2);

            printArray(matrik3);

            _getch();

}

//prosedur tampilan array

void printArray(int a[][3])

{

            int i, j;

            for (i = 0; i<=1; i++)

            {

                        for (j = 0; j<=2; j++)

                        printf("%d ", a[i][j]);;

                        printf("\n");

            }

}

 

 

3.     Program pointer

#include <stdio.h>

#include <iostream>

#include <conio.h>

 

using namespace std ;

//cetak p dan *p

int main(void)

{

            int

            v = 7, *p; //untuk mengakses nilai data

            p = &v; //untuk mendapatkan alamat memori

            cout<<"Nilai v = " <<v;

            cout<<endl;

            cout<<endl;

            cout<<"Nilai *p = " <<*p;

            cout<<endl;

            cout<<endl;

            cout<<"Alammatnya = "<<p;

            _getch() ;

}

 

4.     Mendaklarasikan struktur, memasukkan struktur, dan menampilkan data struktur.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <iostream>

#include <conio.h>

 

using namespace std ;

#define MAX 10 //--> max untuk nilai

struct dtnilai //--> prosedur sstructur

{

            char nim[12];

            char name[20];

            double nilai[MAX];

};

int main()

{

            struct dtnilai data;

            int i, jml;

            char strnilai[5], strjum[5];

            printf("NIM : ");

            gets(data.nim);

            cout<<endl;

            printf("Nama : ");

            gets(data.name);

            cout<<endl;

            printf("Jumlah Test : ");

            gets(strjum);

            jml = atoi(strjum);

            cout<<endl;

                        for(i = 0; i<jml; i++)

                        {

                                    printf("Nilai Test %d : ", i+1);

                                    gets(strnilai);

                                    data.nilai[i] = atof(strnilai);

                        }

                                    cout<<endl;

printf("DATA MAHASISWA YANG TELAH DIINPUTKAN : \n");

                                    cout<<endl;

                                    printf("NIM : %t\n", data.nim);

                                    cout<<endl;

                                    printf("Nama : %s\n", data.nama);

                                    cout<<endl;

                        for(i = 0; i<jml; i++)

                        {

                                    printf("Nilai Test %d : %lf\n", i+1, data.nilai[i]);

                        }

                        _getch();

}

 

5.     Memesan tempat memory, mendeklarasikan member nilai, mengcopy alamat pointer.

#include <stdio.h>

#include <stdlib.h>

#include <iostream>

#include <conio.h>

 

using namespace std ;

void p(void) ;

int *a, *b;

int main()

{

            p();

}

void p(void)

{

            a = (int *)malloc(sizeof(int));

            b = (int *)malloc(sizeof(int));

            *a = 19;

            *b = 5;

            a = b;

            *b = 8;

            printf("Alamat a = %x\t Isi a = %d\n", a, *a);

            printf("Alamat b = %x\t Isi b = %d\n", b, *b);

            _getch;

}

 

TUGAS

1.     Buatlah program menggunakan POINTER untuk merubah karakter yang dimasukkan dari huruf kecil menjadi huruf besar.

2.     Buatlah program untuk perhitungan karakter dengan ARRAY.

3.     Buatlah program array dalam struktur, yang menampilkan judul film dan tahun terbit dari data yang telah diinputkan. Data yang dimasukkan sebanyak.

Jawab :

1.     Program

#include <stdio.h>

#include <ctype.h>

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <cstdlib>

#include <string.h>

 

using namespace std;

 

int main ()

{

  int a=0;

  char nama[100];

  char b;

  cout<<"MASUKKAN HURUF BESAR YANG AKAN DIRUBAH MENJADI HURUF KECIL\n"<<endl;

  gets(nama);

  system("CLS");

  cout<<"HURUF VERSI lowercase (HURUF KECIL) dari "<<nama<<"\n"<<endl;

  while (nama[a])

   {

   b=nama[a];

   if (isupper(b)) b=tolower(b);

   putchar (b);

   a++;

   }

}

2.     Perhitungan karakter dengan ARRAY.

#include <stdio.h>

#include <string.h>

int main()

{

  char kalimat[100];

  int jumlah;

  printf("Masukkan sebuah string: " );

  fgets(kalimat, sizeof(kalimat), stdin);

  jumlah = strlen(kalimat)-1;

  printf("Jumlah karakter adalah %d\n", jumlah);

  return 0;

}

3.     Program array dalam struktur.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <iostream>

#include <conio.h>

using namespace std;

#define MAX 10 //-->mx untuk nilai

 

struct dtnilai//-->prosedur structur

{

      char film[20];

      char tahun[5];

      char film1[20];

      char tahun1[5];

      char film2[20];

      char tahun2[5];

      double nilai[MAX];

};

 

int main()

{

      struct dtnilai data;

      int i, jml;

      char strnilai[5], strjum[5];

      printf("Masukkan Judul Film   : ");

      gets(data.film);

      cout<<endl;

      printf("Masukkan Tahun Terbit  : ");

      gets(data.tahun);

      cout<<endl;

      printf("Masukkan Judul Film   : ");

      gets(data.film1);

      cout<<endl;

      printf("Masukkan Tahun Terbit  : ");

      gets(data.tahun1);

      cout<<endl;

      printf("Masukkan Judul Film   : ");

      gets(data.film2);

      cout<<endl;

      printf("Masukkan Tahun Terbit  : ");

      gets(data.tahun2);

      cout<<endl;

      cout<<endl;

      printf("Film yang menjadi favorit kamu : \n");

      cout<<endl;

      printf(data.film);

      cout<<" (";

      printf(data.tahun);

      cout<<")";

      cout<<endl;

      printf(data.film1);

cout<<" (";

      printf(data.tahun1);

      cout<<")";

      cout<<endl;

      printf(data.film2);

cout<<" (";

      printf(data.tahun2);

      cout<<")";

      cout<<endl;

      cout<<

      cout<<endl;

 

      _getch();

}

POKOK BAHASAN 2

Linked List (Senarai)

PENDAHULUAN

Pada pokok bahasan ini akan dibahas mengenai sruktur data senarai (list) yang pembahasannya meliputi definisi dan representasi list, jenis-jenis list serta oerasi- operasi dasar pada list. Sehingga setelah mempelajari bab ini diharapkan maahasiswa mampu :

a.     Menjelaskan definisi dan representasi list.

b.     Mengetahui jenis-jenis list.

c.     Memahami operasi-operasi pada list.

PENYAJIAN (TUTORIAL)

Linked list adalah sejumlah objek atau elemen yang dihubungkan satu dengan lainnya sehingga membentuk suatu list. Sdangkan objek atau elemen itu sendiri adalah merupakan gabungan beberapa data (variabel) yang dijadikan satu kelompok atau structure atau record yang dibentuk dengan perintah struct. Untuk menggabungkan objek satu dengan lainnya, diperlukan paling tidak sebuah variabel yang bertipe pointer. Syarat linked list adalah harus adapat diketahui alamat simpul pertama atau biasa dipakai variabel First/Start/Header. Struktur dasar sebuah list seperti gambar berikut :

Gambar 2.1 List Tunggal

 

Istilah - istilah dalam linked list :

-       Simpul

Simpul terdiri dari dua bagian yaitu :

a.     Bagian data

b.     Bagian pointer yang menunjuk ke simpul berikutnya

-       First/Header

Variabel First/Header berisis alamat (pointer)/acuan (reference) yag menunjuk lokasi simpul pertama linked list, digunakan sebagai awal penelusuran linked list.

-       Nil/Null

Tidak bernilai, digunakan untuk menyatakan tidak mengacu ke manapun.

-       Simpul Terakhr (Last)

Simpul terakhir linked list berari tidak menunjuk simpul berikutnya. Tidak terdapat alamat disimpan di field pointer (bagian kedua dari simpul). Nilai null atau nil disimpan di field pointer di simpul terakhir.

Jenis - jenis linked list:

List kosong

List kosong hanya terdiri dari sebuah petujuk elemen yang berisi NULL (kosong), tidak memiliki satu buah elemen pun sehigga hanya berupa penunjuk awal elemn berisi NULL.

List Tunggal

List tuggal adalah list yang elemenya hanya menyimpan informasi elemen setelahnya (next), sehingga jalanya pengaksessan list hanya dapat dilakukan secara maju. List tuggal terbagi menjadi tiga jenis yaitu list tunggal dengan kepala first), list tunggal kepala first) dan ekor (tail), serta list tunggal yang berputar.

 

Gambar 2.2 List Tunggal dengan Kepala dan Ekor, List Tunggal Berputar

List Ganda

List ganda adalah sebuah list yang elemenya menyimpan informasi elemen sebelumnya dan informasi elemen setelahnya, sehingga proses penelusuan list dapat dilakukan secara maju dan mundur. List ganda terbagi menjadi tiga jenis yaitu list ganda engan kepala (first), list ganda dengan kepala (first) dan ekor (tail), serta list ganda yag berputar.

 

Gambar 2.3 List ganda dengan Kepala, List ganda dengan Kepala dan
Ekor

Operasi Dasar pada Linked List :

IsEmpty : Fungsi ini menentukan apakan linked list kosong atau tidak.

Size : operasi untuk mengirim jumlah elemen di linked list.

Create : operasi untuk penciptaan list baru yang kosong.

Insertfirst: operasi penyisipan simpul sebagai simpul pertama.

Insertafter : operasi untu penyisispan simpul setelah simpul tertentu.

Insertlast: operasi untuk penyisipan simpul sebagai simpul terakhir.

Insertbefore : operasi untuk penyisipan simpul sebelum simpul tertentu.

Deletefirst: operasi penghapusan simpul pertama.

Deleteafter : operasi penghapusan setelah simpul tertentu.

Deletelast: operasi penghapusan simpul terakhir.


LEMBAR KERJA DAN TUGAS

1.     Contoh program sisip senarai.

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

using namespace std;

typedef struct nod

{

            int data;

            struct nod *next;

}NOD, *NODPTR;

void CiptaSenarai(NODPTR *s)

{

            *s = NULL;

}

NODPTR NodBaru(int m)

{

            NODPTR n;

            n = (NODPTR) malloc (sizeof(NOD));

            if (n != NULL)

            {

                        n->data=m;

                        n->next = NULL;

            }

            return n;

}

void SisipSenarai(NODPTR *s, NODPTR t, NODPTR p)

{

            if(p==NULL)

            {

                        t->next=*s;

                        *s=t;

            }

            else

            {

                        t->next=p->next;

                        p->next=t;

            }

}

void CetakSenarai(NODPTR s)

{

            NODPTR ps;

            for (ps=s; ps!=NULL; ps=ps->next)

            printf("%d --> ", ps->data);

            printf("NULL\n");

}

int main()

{

            NODPTR pel;

            NODPTR n;

            CiptaSenarai(&pel);

            n=NodBaru(55);

            SisipSenarai(&pel, n, NULL);

            n=NodBaru(75);

            SisipSenarai(&pel, n, NULL);

            CetakSenarai(pel);

            _getch();

}

HASIL :

 

2.     Single linked list.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <iostream>

#include <conio.h>

 

using namespace std ;

 

struct dtnilai *tampung;

struct dtnilai *ujung;

struct dtnilai *awal;

int j;

char strnilai[5], jawab[6];

 

struct dtnilai

{

            char nim[10];

            char nama[20];

            double nilai;

            struct dtnilai *next;

};

int main()

{

            printf("DATA MAHASISWA : \n");

     printf("==================================\n");

            printf("\n");

            while(1)

            {

                        if(j==0)

                        {

                                    awal=(struct dtnilai*)malloc(sizeof(struct dtnilai));

                                    printf("NIM : ");

                                    gets(awal->nim);

                                    printf("\n");

                                    printf("Nama : ");

                                    gets(awal->nama);

                                    printf("\n");

                                    printf("Nilai Test : ");

                                    gets(strnilai);

                                    printf("\n");

                                    awal->nilai = atof(strnilai);

                                    tampung=awal;

                                    tampung->next=NULL;

                        }

                        else

                        {

                                    ujung=(struct dtnilai*)malloc(sizeof(struct dtnilai));

                                    tampung->next=ujung;

                                    printf("NIM : ");

                                    gets(ujung->nim);

                                    printf("\n");

                                    printf("Nama : ");

                                    gets(ujung->nama);

                                    printf("\n");

                                    printf("Nilai Test : ");

                                    gets(strnilai);

                                    printf("\n");

                                    ujung->nilai = atof(strnilai);

                                    tampung=ujung;

                                    tampung->next=NULL;

                        }

                        printf("Masukkan Data Lagi ? (IYA/TIDAK) : ");

                        gets(jawab);

                        printf("\n");

                        if(strcmp(jawab, "iya")==0 || strcmp(jawab, "IYA")==0)

                        {

                                    j++;

                                    continue;

                        }

                        else if(strcmp(jawab, "tidak")==0 || strcmp(jawab, "TIDAK")==0)

                                    break;

            }

}

HASIL:

3.     Menghapus data pada simpul tertentu.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <iostream>

#include <conio.h>

 

using namespace std ;

 

struct dtnilai

{

            char nim[15];

            char nama[20];

            double nilai ;

            struct dtnilai *next;

};

int main ()

{

            printf("DATA MAHASISWA : \n");

            printf("=======================\n");

            struct dtnilai *tampung;

            struct dtnilai *ujung;

            struct dtnilai *awal;

            struct dtnilai *tanda;

            struct dtnilai *tanda2;

            char strnilai[10];

            char jawab[5];

            char hapus[5];

            int j=0;

            while (1)

            {

                        if(j==0)

                        {

                                    awal=(struct dtnilai*)malloc(sizeof(struct dtnilai));

                                    printf("NIM : ");

                                    gets(awal->nim);

                                    printf("\n");

                                    printf("Nama : ");

                                    gets(awal->nama);

                                    printf("\n");

                                    printf("Nilai Test : ");

                                    gets(strnilai);

                                    printf("\n");

                                    awal->nilai = atof(strnilai);

                                    tampung=awal;

                                    tampung->next=NULL;

                        }

                        else

                        {

                                    ujung=(struct dtnilai*)malloc(sizeof(struct dtnilai));

                                    tampung->next=ujung;

                                    printf("NIM : ");

                                    gets(ujung->nim);

                                    printf("\n");

                                    printf("Nama : ");

                                    gets(ujung->nama);

                                    printf("\n");

                                    printf("Nilai Test : ");

                                    gets(strnilai);

                                    printf("\n");

                                    ujung->nilai=atof(strnilai);

                                    ujung->next=NULL;

                                    tampung=ujung;

                        }

                        printf("Masukkan Data Lagi? (y/t) : ");

                        gets (jawab);

                        printf("\n");

                        if(strcmp(jawab,"Y")==0||strcmp(jawab,"y")==0)

                        {

                                    j++;

                                    continue;

                        }

                        else if((strcmp(jawab,"T")==0||strcmp(jawab,"t")==0))

                        break;

}

            printf("\nData Mahasiswa yang Diinputkan : \n");

printf("=========================================\n");

            printf("NIM \tNama \tNilai\n");

            ujung=awal;

            while (ujung!=NULL)

{

            printf("%s\t%s\t%6.2f\n",ujung->nim,ujung->nama,ujung->nilai);

            ujung=ujung->next;

}

while(1)

{

            printf("\n");

            printf ("NIM yang akan dihapus (NIM/(t/T)) : \n");

            gets (hapus) ;

            if ((strcmp (hapus, "t")==0 ||strcmp(hapus,"T")==0))

            {

                        printf ("Masukkan NIM\n");

                        continue;

            }

            else

            break;

}

            if (strcmp(awal -> nim,hapus)==0)

            {

                        tanda=awal->next;

                        free (awal);

            awal=tanda;

            }

            else

            {

                        tanda2=awal;

                        tanda=tanda2->next;

                        while (tanda!=NULL)

            {

            if (strcmp(tanda->nim,hapus)==0)

            {

                        if(tanda->next!=NULL)

                        tanda2->next=tanda->next;

                        else

                        tanda2->next=NULL;

                        free (tanda);

                        break;

            }

tanda2=tanda;

tanda=tanda->next;

}

}

printf("\n");

printf ("Data Mahasiswa yang telah Dihapus (FIFO):\n");

printf("===============================================\n");

printf ("NIM \tNama \tNilai\n");

ujung=awal;

while (ujung!=NULL)

{

            printf ("%s\t%s\t%6.2f\n", ujung ->nim, ujung -> nama,ujung ->nilai);

            ujung=ujung -> next;

}

_getch();

}

Hasil :

 

 

 

 

 

 


TUGAS

1.     Buatlah progam untuk menampilkan 10 bilangan secara menurun yaitu 10,9,8 sampai 1 dengan menggunakan LINKED LIST.

2.     Buatlah sebuah progam yang mengimplementasikan Linked List,dimana data yang di pakai adalah data bukuyang ada dalam sebuah perpustakan (ID Buku,Judul, dan jumlah buku).progam juga mengiplementasikan penambahan dan pengurangan simpul pada Linked List berdasarkan ID buku.

HASIL :

1.     Program

#include <iostream>

using namespace std;

int main()

{  

     int i=10;

     while(i>=1)

     {

                 cout<<" "<< i ;

                 i--;

     }

     cout<<endl;

     system("pause");

}

 

Hasil :

2.     Program

#include<stdio.h>          

#include<string.h>

#include<stdlib.h>

#include<iostream>

#include<conio.h>

 

using namespace std;

 

struct dtjumlah

{

     char ID[15];

     char judul[20];

     double jumlah;

     struct dtjumlah *next;

};

 

int main()

{

     printf("DATA BUKU : \n");

   printf("=====================================\n");

     struct dtjumlah *tampung;

     struct dtjumlah *ujung;

     struct dtjumlah *awal;

     struct dtjumlah *tanda;

     struct dtjumlah *tanda2;

 

     char strjumlah[10];

     char jawab[5];

     char hapus[5];

     int j=0;

     while (1)

     {

                 if(j==0)

                 {

                             awal=(struct dtjumlah*)malloc(sizeof(struct dtjumlah));

                             printf("ID                    : ");

                             gets(awal->ID);

                             printf("\n");

                             printf("judul                : ");

                             gets(awal->judul);

                             printf("\n");

                             printf("Jumlah            : ");

                             gets(strjumlah);

                             printf("\n");

                             awal->jumlah = atof(strjumlah);

                             tampung=awal;

                             tampung->next=NULL;

                 }

                 else

                 {

                             ujung=(struct dtjumlah*)malloc(sizeof(struct dtjumlah));

                             tampung->next=ujung;

                             printf("ID        : ");

                             gets(ujung->ID);

                             printf("\n");

                             printf("Judul   : ");

                             gets(ujung->judul);

                             printf("jumlah    : ");

                             gets(strjumlah);

                             printf("\n");

                             ujung->jumlah=atof(strjumlah);

                             ujung->next=NULL;

                             tampung=ujung;

                 }

                 printf("Masukkan Data lagi? (y/t)      : ");

                 gets(jawab);

                 printf("\n");

                 if(strcmp(jawab, "y")==0||strcmp(jawab,"Y")==0)

                 {

                             j++;

                             continue;

                 }

                 else if((strcmp(jawab,"T")==0||strcmp(jawab,"t")==0))

                             break;

     }

     printf("\nData buku yang Diinputkan : \n");

printf("===========================================\n");

     printf("ID\tjudul\t\tjumlah\n");

     ujung=awal;

     while (ujung!=NULL)

     {

                 printf("%s\t%s\t%6.2f\n",ujung->ID,ujung->judul,ujung->jumlah);

                 ujung=ujung->next;

     }

     while(1)

     {

                 printf("\n");

                 printf("ID yang akan dihapus (ID/(t/T))         : \n");

                 gets (hapus);

                 if ((strcmp (hapus, "t")==0 ||strcmp(hapus,"T")==0))

                 {

                             printf ("Masukkan ID\n");

                             continue;

                 }

                 else

                             break;

     }

     if(strcmp(awal -> ID,hapus)==0)

     {

                 tanda=awal->next;

                 free (awal);

                 awal=tanda;

     }

     else

     {

                 tanda2=awal;

                 tanda=tanda2->next;

                 while (tanda!=NULL)

                 {

                             if (strcmp(tanda->ID,hapus)==0)

                             {

                                         if(tanda->next!=NULL)

                                                     tanda2->next=tanda->next;

                                         else

                                                     tanda2->next=NULL;

                                         free (tanda);

                                         break;

                             }

                             tanda2=tanda;

                             tanda=tanda->next;

                 }

     }

     printf("\n");

     printf("Data Buku yang telah Dihapus (FIFO) : \n");

printf("============================================\n");

     printf("ID\tjudul\t\tjumlah\n");

     ujung=awal;

     while (ujung!=NULL)

     {

                 printf ("%s\t%s\t%6.2fn",ujung ->ID, ujung ->judul,ujung ->jumlah);

                 ujung=ujung -> next;

     }

     getch();

     cout<<endl;

}

POKOK BAHASAN 3

Struktur Pemrograman: Berkondisi

PENDAHULUAN

Pada pokok bahasan ini akan dibahs mengenai struktur datatumpukan atau stack, dimana stack merupakan suatu kumpulan data yang seolah-olah ada data yang diletakkan di ats data yang lain. Setelah mempelajari materi ini diharapkan mahasiswa mampu untuk :

a.     Mengetahui dan memahami definisi stack.

b.     Memahami operasi-operasi dasar stack.

c.     Memahami representasi statis dan dinamis stack.

PENYAJIAN (TUTORIAL)

Stack adalah kumpula elemen-elemen yang tersimpan dalam suatu tumpukan. Aturan penyisispan dan penghapusan elemennya tertentu :

-       Penyisispan selalu dilakukan “di atas “ TOP

-       Penghapusan selalu dilakukan pada TOP

Karena aturan penyisipan dan penghapusan semacam itu, TOP adalah satu- satunya alamat tempat terjadi operasi, elemen yang ditambahkan paling akhir akan menjadi elemen yang akan dihapus. Dikatakan bahwa elemen Stack tersususn secara LIFO (Last In First Out).

Seperti halnya jika kita mempunyai sebuah tumpukan buku, agar tumpukan buku itu tidak ambruk ketika kita mengambil sebuah buku di dalam tumpukan itu amaka harus diambil satu per satu dari tumpukan yang paling atas dari tumpukan.


 

Gambar 3.1 Ilustrasi Stack

Perhatikan bahwa dengan definsi semacam ini, representasi tabel sangat tepat untuk mewakili stack, karena operasi penambahan dan pengurangan hanya dilakukan disalah satu ujung tabel.

Beberapa contoh penggunaan stack adalah pemanggilan prosedur, perhitugan ekspresi aritmatika, rekursifitas, backtracking, peaganan interupsi, dan lain-lain. Karakteristik penting stack sebagai berikut :

1.     Elemen stack yaitu item-item data di elemen stack

2.     TOP (elemen puncak dari stack)

3.     Jumlah elemen pada stack

4.     Status/kondisi stack, yaitu :

-       Penuh

Bila elemen di tumpukan mencapai kapasitas maksimum tumpukan. Pada kondisi ini, tidak mungkin dilakukan penambahan ke tumpukan.Penambahan di elemen menyebabakan kondisi kesalahan Overflow.

-       Bila tidak ada elemen tumpukan. Pada kondisi ini, tidak mungkin dilakukan pengambilan elemen tumpukan. Pengambilan elemen menyebabkan kondisi kesalahan Underflow.

Stack memiliki operasi-operasi pokok sebagai berikut :

Push : Untuk menambahkan item pada tumpukan paling atas.

void Push (itemType x, Stack*S)

{

Printf(“Stack FULL”);

else

{

S->item[S->Count]=x;

++(S->count);

}

}

Pop : Untuk mengambil item teratas

int Pop (Stack S, itemType x)

{

if (Empty (S))

Printf(“Stack Kosong”);

else

{

-(S->Count);

x=s->item(s->Count);

}

}

Clear : Untuk mengosongkan stack

void InitializeStack (Stack S)

{

S->Count=0;

}

IsEmpty : Untuk memerikasa apakah stack kosong

int Empty (Stack *S)

{

return (S->Count==0);

}

IsFull : Untuk memeriksa apakah stack sudah penuh

int Full (Stack S)

{

return(S->Count==MAX S TACK);

}

Representasi stack :

- Representasi statis

Stack dengan representasi statis biasanya diinplementasikan dengan menggunakan array. Sebuah array memiliki tempat yang dialokasikan diawal sehingga sebuah elemen yang dimasukan dalam sebuah array terbatas pada tempat yang ada pada array. Karena menggunakan array maka stack dengan representasi statis dalam mengalami kondisi elemen penuh. Ilustrasi stack dengan representasi statis dapat dilihat pada gambar 3.2 :

Gambar 3.2 Representasi Stack Statis

- Representasi dinamis

Stack dengan representasi dinamis biasanya diimplementasikan dengan menggunakan pointer yang mnunjuk pada elemen-elemen yang dialokasikan pada memori. Illustrasi stack dengan representasi dinamis dapat dilihat pada gambae 3.3 :

Gambar 3.3 Representasi Stack Dinamis

Karena semua operasi pada sebuah stack diawali dengan elemen yang paling atas maka jika menggunakan representasi dinamis saat elemen ditambahkan akan mengguakan penambahan elemenpada awal stack (addfirst) dan saat pengambilan atau penghapusan elemen menggunakan penghapusan di awal stack (delfrst).


LEMBAR KERJA DAN TUGAS

1.     Program stack

#include <stdio.h>

#include <iostream>

#include <conio.h>

 

#define MAXSTACK 3

 

typedef int itemType;

typedef struct

{

            int item[MAXSTACK];

            int jml;

}Stack;

void init(Stack *s)

{

            s->jml=0;

}

int kosong(Stack *s)

{

            return (s->jml==0);

}

int penuh(Stack *s)

{

            return (s->jml==MAXSTACK);

}

int isi(itemType x, Stack *s)

{

            if (penuh(s))

            printf("\nMAAF!!! Data PENUH\n");

            else{

                        s->item[s->jml]=x;

                        ++(s->jml);

            }

}

int ambil(Stack *s, itemType *x){

            if (kosong(s))

            printf("\nMaaf Data Kosong\n");

            else

            {

                        --(s->jml);

                        *x=s->item[s->jml];

                        s->item[s->jml]=0;

                        printf("\nData %i Berhasil Diambil\n",*x);

            }

}

int tampil(Stack *s){

            if (kosong(s))

            printf("\nMaaf Data Masih Kosong\n");

            else

            printf("\n");

            for(int i=s->jml-1; i>=0; i--){

                        printf("Data : %d\n", s->item[i]);

            }

}

int hapus(Stack *s){

            s->jml=0;

            printf("\nSemua Data Berhasil Dihapus\n");

}

int main(){

            int pil;

            Stack tumpukan;

            itemType data;

            init(&tumpukan);

            do{

                        printf("\nMENU: \n 1. Isi (Data Angka)\n 2. Ambil\n 3. Lihat\n 4. Hapus (Hapus Semua Data)\n 5. Keluar\n");

                        printf("\n");

                        printf("Masukkan Pilihan : ");

                        scanf("%i",&pil);

                        switch(pil){

                                    case 1 :

                                    printf("\nMasukkan Data Angka : ");

                                    scanf("%i",&data);;isi(data, &tumpukan);

                                    break;

                                    case 2 :

                                    ambil(&tumpukan,&data);

                                    break;

                                    case 3 :

                                    tampil(&tumpukan);

                                    break;

                                    case 4 :

                                    hapus(&tumpukan);

                                    break;

                        }

}while(pil!=5);

_getch;

}

 

 

 

 

 

 

 

 

Hasil :

2.     Mendeklarasikan, memasukan, dan menampilkan elemen data pada sebuah stack dengan menggunakan array :

#include<stdio.h>

#include<iostream>

#include<conio.h>

#include<stdlib.h>

#include<string.h>

 

using namespace std;

 

#define MAX 10

 

struct ttumpukan

{

            int elm[MAX];

            int puncak ;

};

struct ttumpukan t;

int top;

 

void inisialisasi()

{

            t.puncak=0;

            top=0;

}

void push(int x)

{

            if(t.puncak==MAX)

                        printf("Stack Sudah Penuh");

            else

            {

                        t.puncak=top+1;

                        t.elm[t.puncak]=x;

                        top=t.puncak;

                        printf("PUSH %d : %d\n", t.puncak,t.elm[t.puncak]);

            }

}

void pop()

{

            if(top==0)

                        printf("Stack Kosong\n");

            else

            {

                        printf("\nPOP %d = %d\n", top,t.elm[top]);

                        t.puncak=top-1;

                        top=t.puncak;

            }

}

int main()

{

            int i, jum;char strnilai[5], strjum[5];

            inisialisasi();

            printf("Masukkan Jumlah Data : "); gets(strjum);

            printf("\n");

            jum=atoi(strjum);

            for(i=0;i<jum;i++)

            {

                        printf("Nilai Interger %d : ",1+1);

                        gets(strnilai); push(atoi(strnilai));

                        printf("\n");

            }

            for(i=jum;i>0;i--)

                        printf("Elemen Data : %d\n,", t.elm[i]);for(i=0;i<jum;i++)

                        pop();

            _getch();

}

Hasil :

3.     Merepresentasikan stack menggunakan Linked List :

#include<stdio.h>

#include<iostream>

#include<conio.h>

#include<stdlib.h>

#include<string.h>

 

using namespace std;

 

struct stack

{

            int isi;

            struct stack*next;

};

int x,i=1,j=1;

struct stack*atas,*bantu,*baru;

 

void push (int nilai)

{

            if(j==1)

            {

                        atas=(struct stack*)malloc(sizeof(struct stack));

                        atas->isi=nilai;

                        atas->next=NULL;

            }

            else

            {

                        baru=(struct stack*)malloc(sizeof(struct stack));

                        baru->isi=nilai;

                        baru->next=atas;

                        atas=baru;      

            }

            j++;

}

void pop()

{

            bantu=atas;

            printf("Data yang di POP %d : %d\n" ,i,bantu->isi);

            atas=atas->next;

            i++;

            free(bantu);

}

int main()

{

            char jawab[2],strNilai[5];

            while(1)

            {

                        printf("data yang di PUSH ke %d : ",j);

                        gets(strNilai);

                x=atoi(strNilai);

                push(x);

                printf("Data lagi? <y/t> : ");

                gets(jawab);

                if((strcmp(jawab,"Y")==0)||(strcmp(jawab,"y")==0))

                        continue;

                else

                        break;

            }

            j--;

            printf("Data nilai yang telah diinputkan:\n");

            while(atas!=NULL)

                        pop();

            _getch();

}


TUGAS

1.     Buatlah progam stack statis yang menampilkan data yang di push dan di-pop

2.     Diketahui data-data berikut:T,I,D,dan EBuatlah progam untuk memesukkan data-data di atas sehingga aka muncul tampilan berikut:T,E,D,I.Manfaatkan operasi PUSH dan POP.

Hasil :

1.     Program

#include <iostream>

#include <conio.h>

#define maxstack 5

using namespace std;

 

struct STACK

{

      int top;

      float data[4];

};

float dta;

 

struct STACK stackbaru;

 

bool isfull()

{

      if(stackbaru.top == maxstack)

            return true;

      else

            return false;

}

 

bool isempty()

{

      if(stackbaru.top == -1)

            return true;

      else

            return false;

}

 

 

void push(float dta)

{

     if(isfull() == true)

            puts("Maaf, stack penuh");

 

      else

        {

            stackbaru.top++;

            stackbaru.data[stackbaru.top]=dta;

      }

}

 

void pop()

{

      if(isempty() == true)

      {

            cout<<"Data telah kosong!";

      }

      else

      {

            cout<<"Data yang terambil : " <<stackbaru.data[stackbaru.top]<<endl;

            stackbaru.top--;

      }

}

 

void print()

{

      printf("\nData yang terdapat dalam stack : \n");

      printf("--------------------------------\n");

      for(int i=0; i<=stackbaru.top; i++)

      {

            cout<<stackbaru.data[i]<<"    ";

      }

}

 

 

void clear()

{

      stackbaru.top = -1;

      printf("\nSekarang stack kosong");

}

 

 

int main()

{

      stackbaru.top = -1;

      char menu;

      char ulang;

      do

      {

            system("cls");

            printf("\t PROGRAM STACK\n");

            printf("\t===============\n");

            printf("Menu : ");

            puts("\n1. Pop stack");

            puts("2. Push stack");

            puts("3. Cetak");

            puts("4. Bersihkan stack");

            puts("5. Exit");

          

            cout<<"Menu pilihan Anda : ";

            cin>>menu;

          

            if(menu == '1')

            {

                  pop();

                  ulang = 'y';

                  getch();

            }

            else if(menu == '2')

            {

                  cout<<"\nTambah Data";

                  cout<<"\n-----------";

                  cout<<"\nData yang akan disimpan di stack : ";

                  cin>>dta;

                 push(dta);

                  ulang = 'y';

            }

            else if(menu == '3')

            {

                  print();

                  cout<<"\n\nUlang ? (y/t)";

                  cin>>ulang;

            }

            else if(menu == '4')

            {

                  clear();

                  cout<<"\n\nUlang ? (y/t)";

                  cin>>ulang;

            }

            else if(menu == '5')

            {

                  exit(0);

            }

       }while(ulang == 'Y' || ulang == 'y');

}

Hasil :

2.     Program

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include <iostream>

#include <conio.h>

 

using namespace std;

 

struct sStack 

{

    char isi;

    struct sStack*next;

};

int x,i=1,j=1;

struct sStack*atas, *bantu, *baru;

void push(char nilai)

{

if(j==1)

{

    atas=(struct sStack*)malloc(sizeof(struct sStack));

    atas->isi=nilai;

    atas->next=NULL;

}

else

{

    baru=(struct sStack*)malloc(sizeof(struct sStack));

    baru->isi=nilai;

    baru->next=atas;

    atas=baru;

}

      j++;

}

void pop()

{

    bantu=atas;

    printf("[%c] --> ",*bantu);

    atas=atas->next;

    i++;

    free(bantu);

}

int main()

{

        push('I');

        push('D'); 

        push('E');

        push('T');

    j--;

 

    while(atas!=NULL) 

        pop();

        printf("NULL");

    _getch();

}

 

POKOK BAHASAN 4

Queue (Antrian)

PENDAHULUAN

Pada pokok bahasan ini akan dibahas mengenal antrian atau queue, dimana struktur data ini hamper sama dengan tumpukan atau stack yang merupakan struktur data yang linier. Perbedaannya adalah pada operasi penambahan dan pengurangan pada ujung yang berbeda. Setelah mempelajari materi ini diharapkan mahasiswa mampu:

a.     Mengetahui dan memahami definisi antrian.

b.     Memahami operasi-operasi dasar pada antrian.

c.     Memahami representasi statis dan dinamis pada antrian.

PENYAJIAN (TUTORIAL)

Antrian adalah suatu kumpulan data yang penambahan elemennya hanya bisa dilakukan pada suatu ujung (disebut sisi belakang atau REAR), dan penghapusan atau pengambilan elemen dilakukan lewat ujung yang lain (disebut sisi depan atau FRONT). Prinsip yang digunakan dalam antrian ini adalah FIFO (First In First Out) yaitu elemen yang pertama kali masuk akan keluar pertama kalinya. Penggunaan antrian antara lain simulasi antrian di dunia nyata (antrian pembelian tiket), sistem Jaringan komputer (pemrosesan banyak paket yang datang dari banyak koneksi pada suatu host, bridge, gateway), dan lain-lain.

Gambar 4.1 ilustrasi antrian dengan 8

 

 

 

Elemen Karakteristik penting antrian sebagai berikut:

a. Elemen antrian yaitu item-item data yang terdapat dalam antrian.

b. Head/front (elemen terdepan antrian).

c. Tail/rear (elemen terakhir antrian).

d. Jumlah antrian pada antrian (count).

e. Status/kondisi antrian, ada dua yaitu:

-      Penuh

Bila elemen di antrian mencapai kapasitas maksimum antrian. Pada kondisi ini, tidak mungkin dilakukan penambahan ke antrian. Penambahan di elemen menyebabkan kondisi kesalahan Overflow.

-      Kosong

Bila tidak ada elemen antrian. Pada kondisi ini, tidak mungkin dilakukan pengambilan elemen antrian. Pengambilan elemen menyebabkan kondisi kesalahan Underflow.

Operasi-operasi pokok pada antrian diantaranya adalah :

1.     Create Membuat antrian baru.

NOEL(CREATE(Q)) = 0

FRONT(CREATE(Q)) = tidak terdefinisi

REAR(CREATE(Q)) = tidak terdefinisi

2.     IsEmpty  Untuk memeriksa apakah Antrian sudah penuh atau belum.

ISEMPTY(Q) = True, jika Q adalah queue kosong.

3.     IsFull mengecek apakah Antrian sudah penuh atau belum.

ISFULL(Q)=True, jika Q adalah queue penuh.

4.     Enqueue/Insert menambahkan elemen ke dalam Antrian, penambahan elemen selalu ditambahkan di elemen paling belakang.

REAR (INSERT(A,Q)) = A

 ISEMPTY (INSERT(A,Q)) = FALSE

Algoritma QINSERT:

a.     IF FRONT = 1 AND REAR=N, OR IF FRONT = REAR + 1,

THEN OVERFLOW, RETURN

b.     IF FRONT := NULL, THEN

SET FRONT := 1 AND REAR:=1

ELSE IF REAR=N,

THEN SET REAR

:=1

ELSE

SET REAR :=REAR+1

c.     SET QUEUE[REAR] := ITEM

d.      RETURN

5.     Dequeue/Remove untuk menghapus elemen terdepan/pertama dari Antrian.

Algoritma QDELETE:

a.     IF FRONT:= NULL, THEN UNDERFLOW, RETURN

b.     SET ITEM := QUEUE[FRONT]

c.     [FIND NEW VALUE OF FRONT] IF FRONT= REAR, THEN

SET FRONT:= NULL AND REAR;= NULL ELSE IF FRONT = N, THEN

SET FRONT:=1

ELSE

SET FRONT: FRONT+1

d.     RETURN

Representasi queue:

Representasi statis

Queue dengan representasi statis biasanya diimplementasikan dengan menggunakan array. Sebuah array memiliki tempat yang dialokasikan diawal sehingga sebuah elemen yang dimasukkan dalam sebuah array terbatas pada tempat yang ada pada array. Karena menggunakan array maka queue dengan representasi statis dalam mengalami kondisi elemen penuh. Ilustrasi queue dengan representasi statis dapat dilihat pada gambar :

Gambar 4.2 Representasi Queue Statis

Representasi dinamis

Queue dengan representasi dinamis biasanya diimplementasikan dengan menggunakan pointer yang menunjuk pada elemen-elemen yang dialokasikan pada memori. Ilustrasi queue dengan representasi dinamis dapat dilihat pada gambar :

Gambar 4.3 Representasi Queue Dinamis


LEMBAR KERJA DAN TUGAS

1.     Program queue statis

#include<queue>

#include<iostream>

#include<conio.h>

 

using namespace std;

 

int main()

{

            queue<int>que;

            que.push(10);

            que.push(2);

            que.push(3);

           

            cout<<"Paling Depan : "<<que.front()<<endl;

            cout<<"Paling Belakang : "<<que.back()<<endl;

 

            que.pop();

            cout<<"10 Sudah dikeluarkan"<<endl;

            cout<<"Paling Depan : "<<que.front()<<endl;

            cout<<"Paling Belakang : "<<que.back()<<endl;

 

            que.push(6);

            cout<<"6 Sudah dikeluarkan"<<endl;

            cout<<"Paling Depan : "<<que.front()<<endl;

            cout<<"Paling Belakang : "<<que.back()<<endl;

           

            _getch();

}

 

 

Hasil:

2.     Program Queue

#include <iostream>

 

using namespace std;

 

#define MAX 5

class queue{

            private:

                        int t[MAX];

                        int al;

                        int dl;

                       

            public:

                        queue(){

                                    dl=-1;

                                    al=-1;

                        }

           

            void del(){

                        int tmp;

                        if(dl==-1)

                        {

                                    cout<<"Queue kosong";

                        }

                        else

                        {

                                    for(int j=0; j<=al; j++)

                                    {

                                                if((j+1)<=al)

                                                {

                                                            tmp=t[j+1];

                                                            t[j]=tmp;

                                                }

                                                else{

                                                            al--;

                                                            if(al==-1)

                                                            dl=-1;

                                                            else

                                                            dl=0;

                                                }

                                    }

                        }

            }

           

            void add(int item){

                        if(dl==-1&&al==-1){

                                    dl++;

                                    al++;

                        }

                        else{

                                    al++;

                                    if(al==MAX){

                                                cout<<"Queue penuh\n";

                                                al--;

                                                return;

                                    }

                        }

                        t[al]=item;

            }

           

            void display(){

                        if(dl!=-1){

                                    for(int iter=0; iter<=al; iter++)

                                    cout<<t[iter]<<" ";

                        }

                        else

                        cout<<"Kosong";

            }

};

 

int main(){

            queue a;

            int data[5]={32, 23, 45, 99, 24};

            cout<<"Queue sebelum penambahan elemen : ";

            a.display();

            cout<<endl<<endl;

           

            for(int iter=0; iter<5; iter++){

                        a.add(data[iter]);

                        cout<<"Penambahan Angka : "<<(iter+1)<<" : ";

                        a.display();

                        cout<<endl;

            }

            cout<<endl;

            cout<<"Queue setelah penambahan elemen : ";

            a.display();

            cout<<endl<<endl;

           

            for(int iter=0; iter<5; iter++){

                        a.del();

                        cout<<"Penghapusan Angka : "<<(iter+1)<<" : ";

                        a.display();

                        cout<<endl;

            }

            system("pause");

            return 0;

}

Hasil:

3.     Buatlah program queue untuk memasukkan dan mengeluarkan data berupa huruf dalam antrian.

#include <stdio.h>

#include <iostream>

#include <conio.h>

using namespace std;

typedef char Titem;

#define MAXN 3

typedef enum {NOT_OK, OK} Tboolean;

typedef struct

{

            Titem array[MAXN];

            int first;

            int last;

            int number_of_items;

}Tqueue;

void initialize_queue(Tqueue *Pqueue);

Tboolean enqueue(Tqueue *p, Titem item);

Tboolean dequeue(Tqueue *p, Titem *Pitem);

void print_queue(const Tqueue *Pqueue);

#include <ctype.h>

int main()

{

            Tqueue queue;

            Tboolean succeed;

            char chr;

            initialize_queue(&queue);

            printf("\n# Masukkan Sebuah Huruf Untuk Masuk Dalam Antrian \n");

            printf("\n# Atau Tekan Angka 1 Untuk Mengeluarkan Sebuah Huruf Dalam Antrian \n");

            printf("\n# Atau Tekan x Untuk Keluar : \n");

            printf("\n");

            chr = getche();;

            while(chr !=10 && chr != 13)

            {

                        if (isalpha(chr))

                        {

                                    succeed=enqueue(&queue, chr);

                                    print_queue(&queue);

                                    if (!succeed)

                                                printf("\n Operasi Pemasukan Data Gagal \n");

                        }

                        if(chr == '1')

                        {

                                    succeed = dequeue(&queue, &chr);

                                    if (succeed)

                                    {

                                                printf("\n");

                                                printf("\n Huruf Yang Keluar Dari Antrian adalah : %c ",chr);

                                                print_queue(&queue);

                                    }

                                    else printf("\nOperasi Pengambilan Data Gagal\n");

                        }

                        chr = getche();

            }

            _getch();

}

void initialize_queue(Tqueue *Pqueue)

{

            Pqueue->first=0;

            Pqueue->last=-1;

            Pqueue->number_of_items=0;

}

Tboolean enqueue(Tqueue *Pqueue, Titem item)

{

            if (Pqueue->number_of_items >= MAXN)

                        return(NOT_OK);

            else

            {

                        Pqueue->last++;

            if (Pqueue->last > MAXN -1)

                        Pqueue->last = 0;

            Pqueue->array[Pqueue->last] = item;

            Pqueue->number_of_items++;

            return(OK);

            }

}

Tboolean dequeue(Tqueue *Pqueue, Titem *Pitem)

{

            if(Pqueue->number_of_items == 0)

                        return(NOT_OK);

            else

            {

                        *Pitem = Pqueue->array[Pqueue->first++];

                        if (Pqueue->first > MAXN - 1)

                                    Pqueue->first = 0;

                        Pqueue->number_of_items--;

                        return(OK);

            }

}

void print_queue(const Tqueue *Pqueue)

{

            int i, n;

            printf("\n");

            printf("\n Data Antrian Sekarang : \n\n");

            for (n = 1, i = Pqueue->first; n <= Pqueue->number_of_items; n++)

            {

                        printf("%c", Pqueue->array[i]);

                        i++;

                        if(i > MAXN - 1)

                        i = 0;

            }

            printf("\n\n");

}

 

 

 

 

Hasil:

4.     Program untuk pengurutan data secara ascending menggunakan QUEUE.

#include<stdio.h>

#include<iostream>

#include<conio.h>

#include<queue>

using namespace std;

int main()

{

            queue<int>q;

            for(int i=0 ; i<10 ; i++)

                        q.push(i);

            cout<<"isi : ";

           

            do

            {

                        cout<<" "<<q.front();

                        q.pop();

            }while(!q.empty());

            cout<<"\n";

            _getch;

}

Hasil:


Tugas!

1.     Buatlah program queue untuk memasukkan dan mengeluarkan data berupa angka dalam antrian (Modifikasi program latihan 3).

2.     Buatlah program untuk pengurutan data secara Descending menggunakan QUEUE (Modifikasi program latihan 4)

1.     Queue

#include <iostream>

#include <conio.h>

#include <stdlib.h>

#define MAX 3

using namespace std;

 

int nomer[MAX];

int head=-1, tail=-1;

 

bool IsEmpty(){

   if(tail == -1){

       return true;

   }else{

       return false;

   }

}

bool IsFull(){

   if(tail == MAX-1){

       return true;

   }else{

       return false;

   }

}

void AntrianMasuk(int no){

    if (IsEmpty()){

        head=tail=0;

    }else {

        tail++;

    }

    nomer[tail]=no;

}

void AntrianKeluar(){

    if(IsEmpty()){

        cout<<"Antrian sudah kosong ! ";

        getch();

    } else {

        for(int a=head;a<tail;a++){

            nomer[a]=nomer[a+1];

        }

        tail--;

        if(tail == -1){

            head = -1;

        }

    }

}

void Clear(){

     head=tail=-1;

}

void View(){

     if(IsEmpty()){

         cout<<"Antrian kosong ! ";

 

     }else {

         system("cls");

         for(int a=head;a<=tail;a++){

              cout << "==============================="

                   << "\n >> No. Antri : [" << nomer[a] << "]"

                   << "\n==============================="<< endl;

         }

     }

}

 

int main(){

    int choose, p=1, urut;

    do{

        system("cls");

        cout << "\n\n===== PROGRAM ANTRIAN C++ ====="

             << "\n==============================="

             << "\n|1. Tambah Antrian            |"

             << "\n|2. Panggil Antrian           |"

             << "\n|3. Lihat daftar antrian      |"

             << "\n|4. Format                    |"

             << "\n|5. Exit                      |"

             << "\n===============================";

        cout << "\nChoose ! "; cin >> choose;

        cout << "\n\n";

        if(choose == 1){

            if(IsFull()) {

                cout<<"Antrian sudah penuh, mohon tunggu beberapa saat lagi ";

            }

            else{

                urut=p;

                AntrianMasuk(urut);

                cout << "---------------------------------" << endl;

                cout << "|          NO. ANTRIAN          |" << endl;

                cout << "|               " << p << "              ||" << endl;

                cout << "---------------------------------" << endl;

                cout << "|       Silahkan Mengantri      |" << endl;

                cout << "|      Menunggu " << tail << " Antrian      ||" << endl;

                cout << "---------------------------------" << endl;

                p++;

            }

        }

        else if(choose == 2){

            cout << "=================================" << endl;

            cout << "No. Antri : [" << nomer[head] << "]";

            cout << "\n=================================" << endl;

            AntrianKeluar();

            cout << "Silahkan Dipanggil !" << endl;

        }

        else if(choose == 3){

            View();

        }

        else if(choose == 4){

            Clear();

            cout<<"Antrian dikosongkan ! ";

        }

        else if(choose == 5){

        }

        else{

            cout << "Masukan anda salah ! \n"<< endl;

        }

        getch();

    }while(choose!=5);

}

 

 

 

 

 

 

Hasil:

2.     Queue Descending.

#include <stdio.h>

#include <iostream>

#include <conio.h>

#include <queue>

 

using namespace std;

 

int main()

{

      queue <int> q;

      for(int i=9;i>=0;i--)

                  q.push(i);

      cout<<"Isi : ";

 

      do

      {

                  cout<<' '<<q.front();

                  q.pop();

      }

      while(!q.empty());

 

      cout<<'\n';

      _getch();

}

POKOK BAHASAN 5

Rekursif

PENDAHULUAN

Pada pokok bahasan ini akan dibahas mengenai rekursif. Setelah mempelajari bab ini diharapkan mahasiswa mampu :

a.     Mengetahui dan memahami definisi rekursif.

b.     Memahami sifat-sifat rekursif.

c.     Mengaplikasikan rekursif.

PENYAJIAN (TUTORIAL)

Fungsi rekursif adalah suatu fungsi yang memanggil dirinya sendiri, artinya fungsi tersebut dipanggil di dalam tubuh fungsi itu sendiri. Contoh menghitung nilai factorial. Rekursif sangat memudahkan untuk memecahkan permasalahan yang kompleks. Sifat-sifat rekursif:

Dapat digunakan ketika inti dari masalah terjadi berulang kali.

Sedikit lebih efisien dari iterasi tapi lebih elegan.

Method-methodnya dimungkinkan untuk memanggil dirinya sendiri.

Data yang berada dalam method tersebut seperti argument disimpan sementara ke

dalam stack sampai method pemanggilnya diselesaikan.


LEMBAR KERJA DAN TUGAS

1.     Program bilangan genap dan bilangan ganjil

#include<iostream>

#include<conio.h>

using namespace std;

 

void odd(int a);

void even(int a);

 

int main(void)

{

            int i;

            do

            {

                        cout<<"Masukkan Bilangan 1-9 (0 untuk keluar) : \n";

                        cin>>i;

                        odd(i);

                        cout<<endl;

            }while

            (i=!0);

            _getch();

}

void odd(int a)

{

            if((a%2)==!0)

                        cout<<"Bilangan GANJIL \n";

            else

                        even(a);

}

void even(int a)

{

            if((a%2)==0)

                        cout<<"Bilangan GENAP \n";

            else

                        odd(a);

}

Hasil:

2.     Program Fibonacci.

#include<stdio.h>

#include<iostream>

#include<conio.h>

 

using namespace std;

long fibonacci (long n)

{

            if(n==1 || n== 2)

                        return(1);

            else

                        return fibonacci(n-1)+fibonacci(n-2);

}

int main()

{

            int x;

            printf("mencari Nilai fibonacci \n");

            printf("Masukkan nilai X : ");

            scanf("%d", &x);

            printf("Nilai Fibonacci dari %d = %d \n", x, fibonacci(x));

            system("pause");

            _getch();

}

Hasil:

3.     Program factorial.

#include<stdio.h>

#include<iostream>

#include<conio.h>

using namespace std;

int faktorial (int n)

{

            if(n==1)

                        return(1);

            else

                        return(n*faktorial(n-1));

}

int main()

{

            int x;

            printf("mencari Nilai Faktorial \n");

            printf("Masukkan nilai X : ");

            scanf("%d", &x);

            printf("Nilai Faktorial dari %d = %d \n", x, faktorial(x));

            system("pause");

            _getch();

}

Hasil:

4.     Program penjumlahan kuadrat sejumlah bilangan menggunakan iterasi.

JumKuadrat (m,n) = m2 + (m+1)2 + ……+n2 dengan m<=n.

JumKuadrat (5,9) = 5+ 62 + 72 + 82 + 92 = 225

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<iostream>

#include<conio.h>

 

using namespace std;

int jumkuadrat(int m, int n)

{

            int i, jum=0;

            for(i=m ; i<=n ; i++)

            {

                        jum+=i*i;

                        printf("\n %d Kuadrat = %d dan jumlah Kuadrat : %d \n");

            }

            return jum;

}

int main(void)

{

            char cNilaim[3],cNilain[3],cJawab[2];

            int iNilaim,iNilain,iNilaijumkuadrat;

            while(1)

            {

                        printf("Masukkan nilai m dan n. NILAI HARUS M < N. \n");

                        cout<<endl;

                        printf("Nilai m : ");

                        gets(cNilaim);

                        printf("Nilai n : ");

                        gets(cNilain);

                        cout<<endl;

                        iNilaim=atoi(cNilaim);

                        iNilain=atoi(cNilain);

                        iNilaijumkuadrat=jumkuadrat(iNilaim,iNilain);

            cout<<"============================================";

                        printf("\nJumlah Kuadrat (dari %d dan %d) = %d,",iNilaim,iNilain,iNilaijumkuadrat);

                        cout<<endl;

                        printf("\nCoba Lagi? [Y/T] : ");

                        gets(cJawab);

                        if(strcmp(cJawab,"t")==0||strcmp(cJawab,"T")==0)

                                    break;

            }

}

 

 

 

Hasil:


Tugas

1.     Buatlah program untuk menentukan bilangan yang terbesar dan terkecil dari dua buah bilangan yang diinputkan.

2.     Buatlah program dengan cara rekursi untuk menampilkan perkalian 3 buah bilangan, dimana ketiga bilangan tersebut nilainya diinputkan.

3.     Buatlah program untuk mengurutkan bilangan secara Descending dengan menggunakan Rekursif.

4.     Buatlah program perhitungan gaji karyawan. Dengan ketentuan :

a.     Jika gaji kotor 1.500.000 maka mendapat potongan 10%.

b.     Jika gaji kotor >1.500.000 maka mendapat potongan 15%.

 

1.     Program menentukan bilangan.

# include<stdio.h>

# include<conio.h>

 

int main ()

{

    int data [50];

    int a,b;

    int max,min;

 

     printf("Banyak Bilangan: ");scanf ("%d",&a);

 

     for (b=1;b<=a;b++)

     {

         printf("\nbilangan ke-%d: ",b);scanf("%d",&data [b]);

     }

         max=data[1];

         min=data[1];

         for (b=1;b<=a;b++)

    {

        if (data[b]>=max)

        {

                max=data[b];

        }

        else if (data[b]<=min)

        {

                min=data[b];

         }

                  }

                 printf("\n\nBilangan yang lebih besar adalah\t:%d", max);

                 printf("\n\nBilangan yang lebih kecil adalah\t:%d", min);

 

                 getch();

 

}

Hasil:

2.     Perkalian 3 bilangan.

#include<iostream>

#include<conio.h>

using namespace std;

 

int tambah(int e, int o, int f)

{

     if( f == 0 )

     {

                 return 0;

     }

     if( f == 1 )

     {

                 return (e*o);

     }

     else

                 return ( (e*o) + tambah( e, o, (f-1)));

}

 

int main()

{

     int x, y, z;

     ulang:

     cout<<"Masukkan bilangan pertama : ";

     cin>>x;

     cout<<"Masukkan bilangan kedua   : ";

     cin>>y;

     cout<<"Masukkan bilangan ketiga  : ";

     cin>>z;

 

     cout<<"\nHasil Perkalian 3 angka tersebut: ";

     cout<<tambah(x,y,z);

     cout<<endl;

 

     getch();

}

 

 

 

 

 

Hasil:

3.     Descending rekursif.

#include<iostream>

#include<conio.h>

#define max 20

using namespace std ;

 

void quick_sort(int darr[max], int zero, int ten)

{

     int a;

    int up,down;

    int temp;

 

    if (zero>=ten)

    return;

    a=darr[zero];

    up=ten;

    down=zero;

 

    while (down < up)

    {

                 while (darr[down] <= a)

                 down++;

        while (darr[up]>a)

            up--;

        if(down<up)

                 {

                             temp=darr[down];

                 darr[down]=darr[up];

                 darr[up]=temp;

                 }

   }

   darr[zero]=darr[up];

   darr[up]=a;

 

   quick_sort(darr,zero,up-1);

   quick_sort(darr,up+1,ten);

}

 

int main()

{

 

     int i,n = 10 ,zero,ten;

    int arr []= {1,3,2,6,5,4,8,9,10,7};

     zero=0;

     ten=n;

     quick_sort(arr,zero,ten);

     for(i=n-1; i>=0;i--)

                 cout<<"Proses Rekursif dengan Nilai Counter : "<<arr[i]<<endl;

 

   getch();

}

 

 

 

 

 

Hasil:

4.     Perhitungan Gaji Karyawan.

#include<iostream>

#include<conio.h>

using namespace std;

int main()

{

     int gaji1,pot,gaji2;

     cout<<"Program Menghitung Gaji"<<endl;

     cout<<"\n";

     cout<<"Masukkan Gaji Kotor = ";

     cin>>gaji1;

     if(gaji1<=1500000)

     {

                 pot=(gaji1*10)/100;

                 gaji2=gaji1-pot;

     }

     else if(gaji1>1500000)

     {

                 pot=(gaji1*15)/100;

                 gaji2=gaji1-pot;

     }

     cout<<"Total Gaji Sebelum Potongan = "<<gaji1<<endl;

     cout<<"Total Potongan              = "<<pot<<endl;

     cout<<"Gaji Bersih                 = "<<gaji2<<endl;

     system("PAUSE");

}

POKOK BAHASAN 6

Sorting (Pengurutan)

PENDAHULUAN

Setelah mempelajari bab ini diharapkan mahasiswa mampu :

a.     Menunjukkan beberapa algoritma dalam pengurutan.

b.     Menunjukkan bahwa pengurutan merupakan suatu persoalan yang bisa diselesaikan dengan sejumlah algoritma yang berbeda satu sama lain.

c.     Dapat memilih algoritma yang paling sesuai untuk menyelesaikan suatu permasalahan pemograman.

PENYAJIAN (TUTORIAL)

Pengurutan data (sorting) didefinisikan sebagai suatu proses untuk menyusun kembali himpunan obyek menggunakan aturan tertentu. Ada dua macam urutan yang biasa digunakan dalam proses pengurutan yaitu :

·       Urutan naik (ascending) yaitu dari data yang mempunyai nilai paling kecil sampai paling besar.

·       Urutan turun (descending) yaitu dari kata yang mempunyai nilai paling besar sampai paling kecil.

Contoh : data bilangan 5, 2, 6, dan 4 dapat diurutkan naik menjadi 2, 4, 5, 6 atau diurutkan turun menjadi 6, 5, 4, 2. Pada data yang bertipe char, nilai data dikatakan lebih besar dari yang lain didasarkan pada urutan relatif (collating sequence) seperti dinyatakan dalam tabel ASCII. Keuntungan dari data yang sudah dalam keadaan terurut yaitu :

Data mudah dicari, mudah untuk dibetulkan, dihapus, disisipi atau digabungkan. Dalam keadaan terurutkan, kita mudah melakukan pengecekan apakah ada data yang hilBang. Misalnya kamus bahasa, buku telepon. Mempercepat proses pencarian data yang harus dilakukan berulang kali.

Beberapa faktor yang berpengaruh pada efektifitas suatu algoritma pengurutan antara lain :

Banyak data yang diurutkan. Kapasitas peningkat apakah mampu menyimpan semua data yang kita miliki. Dan tempat penyimpanan data, misalnya piringan, pita atau kartu, dll.

Beberapa algoritma metode pengurutan dan prosedurnya sebagai berikut :

1.     Bubble Sort

Bubble Sort adalah suatu metode pengurutan yang membandingkan elemen yang sekarang dengan elemen berikutnya. Apabila elemen sekarang > elemen berikutnya, maka posisinya ditukar. Kalau tidak, tidak perlu ditukar. Diberi nama “Bubble” karena proses pengurutan secara berangsur-angsur bergerak/berpindah ke posisinya yang tepat, seperti gelembung yang keluar dari sebuah gelas bersoda.

Proses Bubble Sort :

Data paling akhir dibandingkan dengan data di depannya, jika ternyata lebih kecil atau besar maka tukar sesuai dengan ketentuan (descending atau ascending). Dan pengecekan yang sama dilakukan terhadap data yang selanjutnya sampai dengan data yang paling awal

Gambar 6.1 Langkah 1 Bubble Sort

 

Gambar 6.2 Langkah 2 Bubble sort

Gambar 6.3 Langkah 3 Bubble Sort

Algoritma Bubble Sort :

I = 0

Selama (i < N – 1) Kerjakan baris 3 sampai 7

J = N – 1

Selama (j >= i) Kerjakan baris 5 sampai 7

Jika (Data[j-i] > Data[j]) maka tukar Data [j-1] dengan Data [j]

J = j – 1

I = i + 1

Prosedur yang menggunakan metode gelembung :

            Void BubbleSort()

            {

                        Int i, j;

                        For(i=1:i<Max-1;i++)

                        For(j=Max-1; j>=i;j--)

                        If(Data[j-1] > Data[j])

            }

2.     Selection Sort

Metode seleksi melakukan pengurutan dengan cara mencari data yang terkecil kemudain menukarkannya dengan data yang digunakan sebagai acuan atau sering dinamakan pivot. Selama proses, pembandingan dan pengubahan hanya dilakukan pada indeks pembanding saja, pertukaran data secara fisik terjadi pada akhir proses. Proses pengurutan dengan metode seleksi dapat dijelaskan sebagai berikut :

            Langkah pertama dicari data terkecil dari data pertama sampai data terakhir. Kemudian data terkecil ditukar dengan data pertama. Dengan demikian, data pertama sekarang mempunyai nilai paling kecil dibanding data yang lain.

            Langkah kedua dicari data terkecil dari data kedua sampai terakhir. Data terkecil yang kita peroleh ditukar dengan data kedua dan demikian seterusnya sampai semua elemen dalam keadaan terurutkan.

Gambar 6.4 Langkah Selection Sort

Algoritma seleksi dapat dituliskan sebagai berikut :

I = 0

Selama (i < N – 1) Kerjakan baris 3 sampai dengan 9

K = i

J = i + 1

Selama (j < N) Kerjakan baris 6 dan 7

Jika (Data[k] > Data[j]) maka k = j

J = j + 1

Tukar Data[i] dengan Data [k]

I = i + 1

Di bawah ini merupakan prosedur yang menggunakan metode seleksi :

      Void SelectionSort()

      {

                  Int i, j, k;

                  For(i=0; i<Max-1++)

                  {

                  K = i;

                  For (j=i+1; j<Max; j++)

                  If(Data[K] > Data [j]);

                  }

      }

3.     Merger Sort

Algoritma Merge Sort ialah algoritma pengurutan yang berdasarkan pada strategi divide and conquer. Algoritma ini terdiri dari dua bagian utama, pembagian list yang diberikan untuk di-sort ke dalam beberapa sublist yang lebih kecil, dan sort(mengurutkan) dan merge (menggabungkan) sublist-sublist yange lebih kecil ke dalam list hasil yang diurutkan. Pembagian bisa dikatakan cukup mudah karena sublist-sublist tersebut dibagi kedalam dua sublist yang ukurannya adalah setengah dari ukuran semula. Hal ini terus diulang sampai sublist itu cukup kecil untuk di-sort secara efisien (umumnya telah terdiri dari satu atau dua elemen). Dalam langkah merge dua sublist disatukan kembali dan diurutkan pada saat yang sama. Algoritma untuk merge sort ialah sebagai berikut :

A.    Untuk kasus n=1, maka table a sudah terurut sendirinya (langkah solve)

B.    Untuk kasus n>1, maka :

a.     DIVIDE : bagi table a menjadi dua bagian, bagian kiri dan bagian kanan, masing-masing bagian berukuran n/2 elemen.

b.     CONCUER : secara rekursif, terapkan algoritma D-and-C pada masing-masing bagian.

c.     MERGE : gabung hasil pengurutan kedua bagian sehingga diperoleh table a yang terurut.

 


LEMBAR KERJA DAN TUGAS

1.     Program ascending menggunakan bubble sort.

#include <iostream>

#include <conio.h>

#include <iomanip>

using namespace std ;

int main ()

{

            int dataku[] = {5, 34, 32, 25, 75, 42, 2};

            int adaPertukaran;

            int n;

            cout << "Data BELUM diurutkan : \n";

            for (int ctr = 0; ctr<7; ctr++)

            {

                        cout << setw( 3 ) << dataku[ctr];

            }

            cout << endl << endl;

//PENGURUTAN

do

{

            adaPertukaran = 0;

            for (int i = 0; i < 7-1; i++)

            {

                        if (dataku[i+1] < dataku[i])

                        {

                                    n = dataku[i];

                                    dataku[i] = dataku[i+1];

                                    dataku[i+1] = n;

                                    adaPertukaran = 1;

                        }

            }

} while (adaPertukaran == 1);

//MENAMPILKAN HASIL PENGURUTAN

cout << "Data SETELAH diurutkan : \n";

for (int i = 0; i < 7; i++){

            cout << dataku[i];

            cout << " ";

            }

_getch();

}

Hasil:

2.     Program aplikasi array untuk mengurutkan bilangan dengan metode bubble sort.

#include <stdio.h>

#include <iostream>

#include <conio.h>

#define MAX 20

void input(int jum);

void buble(int jum);

void output(int jum);

int n, A[MAX];

using namespace std ;

int main()

{

            printf("Masukkan Jumlah Bilangan : ");

            scanf("%d" ,&n);

            cout<<endl;

            input(n);

            buble(n);

            output(n);

            _getch();

}

void input (int jum)

{

            int i;

            for(i=0;i<jum;i++)

            {

                        printf("Bilangan ke %d : ",i+1);

                        scanf("%d", &A[i]);

                        cout<<endl;

            }

            cout<<endl;

            cout<<"Hasil Pengurutan Secara Ascending : \n";

            cout<<endl;

}

void buble(int jum)

{

            int i,j,temp;

            for(i=1;i<=jum-1;i++)

            {

                        for (j=i;j<n;j++)

                        {

                                    if (A[i-1]>A[j])

                                    {

                                                temp=A[i-1];

                                                A[i-1]=A[j];

                                                A[j]=temp;

                                    }

                        }

            }

}

void output (int jum)

{

            int i;

            for(i=0;i<jum;i++)

            {

                        printf("Bilangan ke %d = %d\n",i+1,A[i]);

                        cout<<endl;

            }

}

Hasil:

3.     Program ascending dengan menggunakan selection sort.

#include <iostream>

#include <conio.h>

using namespace std ;

int data[10],data2[10];

int n;

void Select(int a, int b)

{

            int t;

            t = data[b];

            data[b] = data[a];

            data[a] = t;

}

void selection_sort()

{

            int pos,i,j;

            for(i=1;i<=n-1;i++)

            {

                        pos = i;

                        for(j = i+1;j<=n;j++)

                        {

                                    if(data[j] < data[pos]) pos = j;

                        }

                        if(pos != i) Select(pos,i);

            }

}

int main()

{

            cout<<"===PROGRAM SELECTION SORT==="<<endl;

            cout<<endl;

            //Input Data

            cout<<"Masukkan Jumlah Data : ";

            cin>>n;

            for(int i=1;i<=n;i++)

            {

                        cout<<"Masukkan Data Ke - "<<i<<" : ";

                        cin>>data[i];

                        data2[i]=data[i];

            }

            selection_sort();

            cout<<"\n\n";

            //Menampilkan Data

            cout<<"Data Setelah di Sort : ";

            for( int i=1; i<=n; i++)

            {

                        cout<<" "<<data[i];

            }

            cout<<"\n\n Proses Selesai \n";

            _getch();

}

Hasil:

4.     Program ascending menggunakan merger sort.

#include <stdio.h>

#define MAX 5

int Data[MAX];

int temp[MAX];

// Procedure Merger Sort

void merge(int Data[], int temp[], int kiri, int tengah, int kanan)

{

            int i, left_end, num_elements, tmp_pos;

            left_end = tengah - 1;

            tmp_pos = kiri;

            num_elements = kanan - kiri + 1;

            while ((kiri <= left_end) && (tengah <= kanan))

            {

                        if (Data[kiri] <= Data[tengah])

                        {

                                    temp[tmp_pos] = Data[kiri];

                                    tmp_pos = tmp_pos + 1;

                                    kiri = kiri +1;

                        }

                        else

                        {

                                    temp[tmp_pos] = Data[tengah];

                                    tmp_pos = tmp_pos + 1;

                                    tengah = tengah + 1;

                        }

            }

            while (kiri <= left_end)

            {

                        temp[tmp_pos] = Data[kiri];

                        kiri = kiri + 1;

                        tmp_pos = tmp_pos + 1;

            }

            while (tengah <= kanan)

            {

                        temp[tmp_pos] = Data[tengah];

                        tengah = tengah + 1;

                        tmp_pos = tmp_pos + 1;

            }

            for (i=0; i <= num_elements; i++)

            {

                        Data[kanan] = temp[kanan];

                        kanan = kanan - 1;

            }

}

// Prosedur Kumpulan Data

void m_sort(int Data[], int temp[], int kiri, int kanan)

{

            int tengah;

            if (kanan > kiri)

            {

                        tengah = (kanan + kiri) / 2;

                        m_sort(Data, temp, kiri, tengah);

                        m_sort(Data, temp, tengah+1, kanan);

                        merge(Data, temp, kiri, tengah+1, kanan);

            }

}

void mergeSort(int Data[], int temp[], int array_size)

{

            m_sort(Data, temp, 0, array_size - 1);

}

int main()

{

            int i;

            printf("Masukkan DATA SEBELUM TERURUT : \n");

            for (i = 0; i < MAX; i++)

            {

                        printf ("Data ke %i : ", i+1);

                        scanf ("%d", &Data[i]);

            }

            mergeSort(Data, temp, MAX);

            printf("\n DATA SETELAH TERURUT : ");

            for (i = 0; i < MAX; i++)

            printf("%d ", Data[i]);

            printf("\n");

            scanf("%d");

            return(0);

}

 

umsida.ac.id 

fst.umsida.ac.id 

Rangkuman Praktikum Sistem Operasi

A.   Profil Laboratorium Visi Laboratorium "Mewujudkan Laboratorium Sistem Operasi yang bermutu Tingkat Nasional 2020 di Bidang Informa...