Download as pdf or txt
Download as pdf or txt
You are on page 1of 11

LAPORAN RESMI

PRAKTIKUM ALGORITMA & STRUKTUR DATA


QUEUE

Disusun oleh:
Nama : Bagas Prakoso
NRP : 3120510109
Kelas : D3 PJJ IT A

PROGRAM STUDI D3 PJJ TEKNIK INFORMATIKA


DEPARTEMEN TEKNIK INFORMATIKA DAN KOMPUTER
POLITEKNIK ELEKTRONIKA NEGERI SURABAYA
3. Program Parkir Mobil
a. Source code:
#include <stdio.h>
#define FULL 10

typedef int ItemType;


typedef struct
{
ItemType Item[FULL];
int Front;
int Rear;
int Count;
} Queue;

typedef struct
{
ItemType item[FULL];
int count;
} Stack;

//Initialize queue
void initialize_q(Queue *q)
{
q->Front = q->Rear = q->Count = 0;
}

//check if the queue is empty


int isempty_q(Queue *q)
{
return (q->Count == 0);
}

//check if the queue is full


int isfull_q(Queue *q)
{
return (q->Count == FULL);
}

//add elements into queue


void enqueue(Queue *q, ItemType x)
{
if(isfull_q(q))
{
printf("\nAntrean penuh");
}
else
{
q->Item[q->Rear]=x;
q->Rear = (q->Rear+1)%FULL;
q->Count++;
}
}

//remove elements from queue


ItemType dequeue(Queue *q)
{
ItemType temp = -1;
if(isempty_q(q))
{
printf("\nAntrean kosong");
return 0;
}
else
{
temp = q->Item[q->Front];
q->Front = (q->Front+1)%FULL;
q->Count--;
return temp;
}
}

//display the queue


void display(Queue *q)
{
int i = q->Front;
while(i != q->Rear)
{
printf("%d ", q->Item[i]);
i = (i+1)%FULL;
}
}

//initialize stack
void initialize_s(Stack *point)
{
point->count=0;
}

//check if the stack is full


int isfull_s(Stack *point)
{
return (point->count==FULL);
}

//check if the stack is empty


int isempty_s(Stack *point)
{
return (point->count==0);
}
//push elements into the stack
void push(Stack *point, ItemType x)
{
if(isfull_s(point))
printf("Stack penuh\n");
else
{
point->item[point->count]=x;
point->count++;
}
}

//pop elements from the stack


ItemType pop(Stack *point)
{
ItemType temp = -1;
if(isempty_s(point))
return 'X';
else
{
point->count--;
temp=point->item[point->count];
}
return temp;
}

int main()
{
Queue antre;
Stack tumpuk;
int pilihan, nomer_parkir=1, nomer_keluar;
char lagi='y';
initialize_q(&antre);
initialize_s(&tumpuk);
printf("PROGRAM PARKIR MOBIL\n");
printf("====================\n");
while(lagi == 'y' || lagi == 'Y')
{
printf("Pilihan menu:\n");
printf("1. Memasukkan mobil\n");
printf("2. Mengeluarkan mobil\n");
printf("Masukkan pilihan (1/2): ");
scanf("%d", &pilihan);

if(pilihan == 1)
{
enqueue(&antre, nomer_parkir);
nomer_parkir++;
printf("Parkir berhasil!\n");
}
else if(pilihan == 2)
{
printf("Nomer parkir yang keluar: ");
scanf("%d", &nomer_keluar);
if(antre.Item[antre.Front] == nomer_keluar)
printf("Parkir yang keluar: %d\n", dequeue(&antre));
else
{
while(antre.Item[antre.Front] != nomer_keluar)
push(&tumpuk, dequeue(&antre));
nomer_keluar = dequeue(&antre);
while(!isempty_s(&tumpuk))
{
antre.Count++;
antre.Item[(antre.Front-1)%FULL] = pop(&tumpuk);
antre.Front = (antre.Front-1)%FULL;
}
}
}
else
{
printf("INVALID INPUT\n");
return 0;
}

printf("Urutan parkir saat ini:\n");


display(&antre);
printf("\nLagi (y/t) ? ");
fflush(stdin);
scanf("%c", &lagi);
}
return 0;
}
b. Hasil running:

c. Analisis:
Bagian awal program saya isi dengan membangun queue dan stack sekaligus membuat fungsi-fungsi yang
akan digunakan untuk mengolah keduanya. Fungsi main saya awali dengan deklarasi dan inisialisasi
berbagai variabel yang akan saya gunakan pada program ini. Program parkir mobil ini akan terus dirun
selama jawaban user adalah char ‘y’ atau ‘Y’ sehingga saya gunakan while loop. Saya lantas mencetak
pesan pilihan menu. User kemudian diminta untuk memasukkan mobil atau mengeluarkan mobil. Setelah
itu saya gunakan if case. Apabila user memilih memasukkan mobil, maka program melakukan enqueue,
memasukkan elemen mobil ke antrean kemudian mencetak pesan bahwa user sukses memarkir mobil.
Apabila user ingin mengeluarkan mobil dari tempat parkir, maka user ditanyai mobil urutan berapa yang
hendak dikeluarkan. Mobil yang berada di depan mobil yang akan dikeluarkan kemudian dikeluarkan
sementara (di-dequeue), lantas dipush ke dalam stack. Mobil yang hendak dikeluarkan pun sukses di-
dequeue sehingga keluar dari antrean tempat parkir. Mobil yang ada di stack kemudian dipop satu persatu
lalu dikembalikan ke tempat semula di antrean. Mobil yang sebelumnya berada di belakang mobil yang
sudah keluar kini bisa maju satu tempat untuk memberi ruang kepada mobil yang ingin memasuki antrean
parkir. Apabila user menginput pilihan lain, program akan menampilkan pesan error dan menghentikan
program seketika. Seusai proses memasukkan atau mengeluarkan mobil, user akan ditanya apakah ingin
melakukan proses lagi atau tidak. Program akan mengulangi proses di dalam while apabila user menginput
char ‘y’ atau ‘Y’. Sebaliknya, program akan berhenti ketika user memberi inputan lain.
5. Program Ranking Mahasiswa
a. Source code
#include <stdio.h>
#include <string.h>
#define MAX 10

typedef struct
{
int NRP;
char nama[30];
int nilai;
} MHS;

typedef struct
{
MHS Item[MAX];
int Front;
int Rear;
int Count;
} Queue;

//Initialize queue
void initialize(Queue *q)
{
q->Front = q->Rear = q->Count = 0;
}

//check if the queue is empty


int isempty(Queue *q)
{
return (q->Count == 0);
}

//check if the queue is full


int isfull(Queue *q)
{
return (q->Count == MAX);
}

//add elements into queue


void enqueue(Queue *q, MHS x)
{
if(isfull(q))
{
printf("\nAntrean penuh");
}
else
{
q->Item[q->Rear].NRP = x.NRP;
strcpy(q->Item[q->Rear].nama, x.nama);
q->Item[q->Rear].nilai = x.nilai;
q->Rear = (q->Rear+1)%MAX;
q->Count++;
}
}

//remove elements from queue


MHS dequeue(Queue *q)
{
MHS temp;
temp.NRP = -1;
strcpy(temp.nama, " ");
temp.nilai = -1;
if(isempty(q))
printf("\nAntrean kosong");
else
{
temp.NRP = q->Item[q->Front].NRP;
strcpy(temp.nama, q->Item[q->Front].nama);
temp.nilai = q->Item[q->Front].nilai;
q->Front = (q->Front+1)%MAX;
q->Count--;
}
return temp;
}

//display the queue


void display(Queue *q)
{
int i = q->Front, j = 1;
while(i != q->Rear)
{
printf("Mahasiswa ke-%d\n", j);
printf("NRP\t: %d\n", q->Item[i].NRP);
printf("Nama\t: ");
fputs(q->Item[i].nama, stdout);
printf("Nilai\t: %d\n", q->Item[i].nilai);
printf("\n");
i = (i+1)%MAX;
j++;
}
}

//sort the queue based on nilai, biggest to smallest


void sort(Queue *q)
{
MHS temp;
int j = q->Front, i;
for(i = 1; i < q->Count; i++)
{
while(j != q->Rear)
{
if(q->Item[j].nilai < q->Item[(j+1)%MAX].nilai)
{
temp = q->Item[j];
q->Item[j] = q->Item[(j+1)%MAX];
q->Item[(j+1)%MAX] = temp;
}
j = (j+1)%MAX;
}
j = q->Front;
}
}

int main()
{
Queue ant;
char lagi='y';
int pilihan, nomer_dihapus;
MHS kontainer;
initialize(&ant);
printf("PROGRAM DATA MAHASISWA\n");
printf("======================\n");
while(lagi=='y' || lagi=='Y')
{
printf("Pilihan menu:\n");
printf("1. Menambah data\n");
printf("2. Mengurangi data\n");
printf("Pilih menu nomer (1/2) : ");
scanf("%d", &pilihan);
if(pilihan == 1)
{
printf("Masukkan NRP mahasiswa: ");
scanf("%d", &kontainer.NRP);
printf("Masukkan nama mahasiswa: ");
fflush(stdin);
fgets(kontainer.nama, 30, stdin);
printf("Masukkan nilai mahasiswa: ");
scanf("%d", &kontainer.nilai);
enqueue(&ant, kontainer);
}
else if(pilihan == 2)
dequeue(&ant);
else
{
printf("INVALID INPUT\n");
return 0;
}
printf("Data Mahasiswa:\n");
display(&ant);
printf("Lagi (y/t) ? ");
fflush(stdin);
scanf("%c", &lagi);
printf("\n");
}
printf("Ranking mahasiswa berdasarkan nilai:\n");
sort(&ant);
display(&ant);
return 0;
}
b. Hasil running:

Figure 1: Data mahasiswa sebelum disorting berdasarkan nilai


Figure 2: Data mahasiswa setelah disorting berdasarkan nilai

c. Analisis:
Program Ranking Mahasiswa saya awali dengan membangun struktur queue dan membuat fungsi-fungsi
untuk mengolahnya. Kemudian pada fungsi main saya deklarasikan berbagai variabel dan sebagian sekalian
saya inisialisasikan nilai-nilainya. Sama seperti program di nomer 3, di program kali ini saya masih
menggunakan while loop agar user dapat mengisi atau menghapus data mahasiswa secara berulang. Masih
ama dengan program nomer 3, saya memberikan dua pilihan menu untuk user yakni untuk menambah data
atau menghapus data mahasiswa. Apabila user memilih menambah data mahasiswa, user akan diminta
untuk mengisi NRP, nama, dan nilai. Ketiga data tersebut kemudian di-enqueue ke queue ant. Apabila user
ingin menghapus data, maka program melakukan dequeue. Apabila user memasukkan input pilihan selain
dua pilihan di atas, program akan menampilkan pesan error sekaligus menghentikan program seketika.
Selanjutnya user diberi pilihan untuk melakukan proses penambahan atau pengurangan data lagi atau tidak.
Apabila user menginput char ‘y’ atau ‘Y’, maka proses di dalam while loop akan diulang lagi. Apabila user
memberi inputan lain, maka proses looping di dalam while loop akan berhenti. Setelah proses looping
berhenti. Program diminta melakukan proses sorting berdasarkan nilai dari yang tertinggi sampai ke
terendah. Kali ini saya menggunakan teknik bubble sort. Terakhir, program menampilkan data mahasiswa
yang telah diurutkan.

You might also like