Monday, October 29, 2007

Jawaban Tugas Kelas A

//file header.h
#include
#include
#include
#include

#define Max 10

typedef int address;
typedef int infotype;
typedef struct
{
infotype T[Max];
address Head;
address Tail;
}Queue;

void createEmpty(Queue *Q);
int isEmpty(Queue Q);
int isFull(Queue Q);
int isOneElmt(Queue Q);
void Add(Queue *Q,infotype val);
void Del(Queue *Q);
int panjangAntrian(Queue Q);
void PrintQueue(Queue Q);


//file function.c
#include"header.h"

void createEmpty(Queue *Q)
{
(*Q).Head=(*Q).Tail=-1;
}

int isEmpty(Queue Q)
{
return(Q.Head==-1 && Q.Tail==-1);
}

int isFull(Queue Q)
{
return((Q.HeadQ.Tail && Q.Head-Q.Tail==1));
}

int isOneElmt(Queue Q)
{
return(Q.Head==Q.Tail && Q.Head!=-1);
}

void Add(Queue *Q,infotype val)
{
if(!isFull(*Q))
{
if(isEmpty(*Q))
{
(*Q).Head=(*Q).Tail=0;
(*Q).T[(*Q).Head]=val;
}
else
{
if((*Q).Tail==Max-1)
(*Q).Tail=0;
else
(*Q).Tail++;
(*Q).T[(*Q).Tail]=val;
}
}
else
printf ("Antrian penuh\n");
}

void Del(Queue *Q)
{
//infotype temp=(*Q).T[(*Q).Head];
if(!isEmpty(*Q))
{
if(isOneElmt(*Q))
createEmpty(&(*Q));
else
{
if((*Q).Head==Max-1)
(*Q).Head=0;
else
(*Q).Head++;
}
// printf("Elemen yang dihapus :%c",temp);
}
else
printf("Antrian kosong\n");
}

int panjangAntrian(Queue Q)
{
int iPanjang = 0,i;
if(!isEmpty(Q))
{
if(Q.Head<=Q.Tail)
{
for(i=Q.Head;i<=Q.Tail;i++)
iPanjang++;
}
else
{
for(i=Q.Head;i<=Max-1;i++)
iPanjang++;
for(i=0;i<=Q.Tail;i++)
iPanjang++;
}
}
return iPanjang;
}

void PrintQueue(Queue Q)
{
address i;
if(!isEmpty(Q))
{
if(Q.Head<=Q.Tail)
{
for(i=Q.Head;i<=Q.Tail;i++)
printf("%d ",Q.T[i]);
}
else
{
for(i=Q.Head;i<=Max-1;i++)
printf("%d ",Q.T[i]);
for(i=0;i<=Q.Tail;i++)
printf("%d ",Q.T[i]);
}
}
else
printf("Queue kosong");
printf("\n");
}


//file main.c
#include"header.h"

main()
{
Queue Q[4];
int iPilih,iInput = 0,iRandom,i,iTerpendek,iIndeks,iJumlahTerpendek = 0,iTemp[4];
int iHapus,flag = 0,iVIP = 0,iBiasa = 0;
srand((unsigned)time(NULL));
for(i=0;i<4;i++)
createEmpty(&Q[i]);
do
{
system("cls");
printf("==== PROGRAM PEMBELIAN TIKET KONSER ====\n\n");
printf("MENU\n");
printf("1.Add Queue\n");
printf("2.Del Queue\n");
printf("3.Jumlah Pembeli\n");
printf("0.Keluar\n");
printf("Pilihan : ");
scanf("%d",&iPilih);
switch(iPilih)
{
case 1 :
iRandom = rand () % 2;
if(iRandom == 0)
{
printf("Tiket yang dibeli: Tiket Biasa\n");
if(isFull(Q[0]) && isFull(Q[1]) && !isFull(Q[3]))
{
Add(&Q[3],++iInput);
iBiasa++;
}
else
{
if(panjangAntrian(Q[0]) <= panjangAntrian(Q[1]))
{
Add(&Q[0],++iInput);
iBiasa++;
}
else
{
Add(&Q[1],++iInput);
iBiasa++;
}
}
}
else
{
printf("Tiket yang dibeli: Tiket VIP\n");
if(!isFull(Q[2]))
{
Add(&Q[2],++iInput);
iVIP++;
}
else if(!isFull(Q[3]))
{
Add(&Q[3],++iInput);
iVIP++;
}
}

for(i=0;i<4;i++)
{
printf("Loket %d = ",i+1);
PrintQueue(Q[i]);
}
getch();
break;
case 2 :
iJumlahTerpendek = 0;
printf("Antrian loket sebelum penghapusan:\n");
for(i=0;i<4;i++)
{
printf("Loket %d = ",i+1);
PrintQueue(Q[i]);
}

//mengeset queue tidak kosong pertama sebagai queue dengan antrian terpendek
//proses ini digunakan untuk menghindari untuk mengeset queue kosong sebagai queue terpendek
for(i=0;i<4;i++)
{
if(!isEmpty(Q[i]))
{
iTerpendek = panjangAntrian(Q[i]);
iIndeks = i;
break;
}
}

//membandingkan panjang antrian sehingga dapatkan queue dengan antrian terpendek
//variabel iIndeks digunakan untuk menampung indeks queue dengan antrian terpendek
for(i=iIndeks;i<4;i++)
{
if(!isEmpty(Q[i]))
{
if(panjangAntrian(Q[i]) < iTerpendek)
{
iTerpendek = panjangAntrian(Q[i]);
iIndeks = i;
}
}
}

//menghitung banyaknya queue dengan antrian terpendek yang sama, sekaligus menyimpan
//indeks queue yang terpendek tersebut
for(i=0;i<4;i++)
{
if(iTerpendek == panjangAntrian(Q[i]))
{
iTemp[iJumlahTerpendek++] = i;
}
}

//bila iJumlahTerpendek == 1 maka berarti hanya terdapat 1 buah queue terpendek
if(iJumlahTerpendek == 1)
{
printf("\nLoket dengan antrian terpendek: ");
printf("Loket %d\n\n",iIndeks+1);
Del(&Q[iIndeks]);
}
//queue terpendek berjumlah lebih dari 1
else
{
flag = 0;
printf("\nLoket dengan antrian terpendek: ");
for(i=0;i {
printf("\nLoket %d",iTemp[i]+1);
}

do
{
printf("\nPilih loket yang antriannya ingin dihapus: ");
scanf("%d",&iHapus);
//mencari indeks queue terpendek yang sama dengan nilai iHapus
//dari beberapa queue terpendek
for(i=0;i<=iJumlahTerpendek;i++)
{
if(iHapus == iTemp[i]+1)
{
flag = 1;
break;
}
}
}while(flag == 0);
Del(&Q[iHapus-1]);
}

printf("Antrian loket setelah penghapusan:\n");
for(i=0;i<4;i++)
{
printf("Loket %d = ",i+1);
PrintQueue(Q[i]);
}
getch();
break;
case 3:
printf("Jumlah pembeli tiket biasa = %d\n", iBiasa);
printf("Jumlah pembeli tiket VIP = %d\n", iVIP);
getch();
break;
}
}while(iPilih!=0);
}

No comments: