Sabtu, 22 Mei 2010

Program flip cake

/*
Name: Rudy Tri(5109100031), Anak Agung Ngurah Bagus Trihatmaja(5109100040)
Description: Program ini menghitung jumlah flip terbanyak yang harus dilakukan agar sebuah data terurut.
Program ini meminta inputan berupa banyaknya data beserta data-datanya. Output berupa langkah-langkah
yang dilakukan beserta terkhir jumlah langkah-langkah minimal yan harus dilakukan.
*/


/*PREPOSESOR*/
#include
#include
#include
#include

//inisialisasi struct stack yang akan digunakan
struct stack
{
int data;
struct stack *next;
};
stack *top=NULL;
stack *help;//variabel global

//inisialisasi struct queue yang akan digunakan
struct queue
{
int data;
struct queue *next;
struct queue *prev;
};
queue *head=NULL;
queue *tail=NULL;
queue *temp;//variabel global

/*fungsi enqueue sebenarnya sama dengan fungsi addLast pada linked list*/
void enqueue(int no)
{
queue *n=(queue*)malloc(sizeof(queue));
n->data=no;

if(head==NULL)
{
head=tail=n;
n->next=n->prev=NULL;
}
else
{
tail->next=n;
tail=n;
tail->next=NULL;
}
}
/*fungsi ini mengeluarkan isi dari node pertama pada linked list queue namun tidak menghilangkannya, fungsi ini hanya
memindahkan headnya saja*/
int dequeue()
{
int x;
temp=head;

x=temp->data;
head=head->next;
return(x);
}

/*fungsi push sebenarnya sama dengan fungsi addLast pada linked list*/
void push(int no)
{
stack *n=(stack*)malloc(sizeof(stack));
n->data=no;

if(top==NULL)
{
top=n;
top->next=NULL;
}
else
{
n->next=top;
top=n;
}
}

/*fungsi ini mengeluarkan isi dari node terakhir pada linked list queue namun tidak menghilangkannya, fungsi ini hanya
memindahkan topnya saja*/
char pop()
{
char temp;

if(top==NULL)
return 0;
else
{
temp=top->data;
top=top->next; // pindahkan posisi top
return temp;
}
}

/*fungsi untuk mencetak isi dari linked list stack*/
void printS()
{
help=top;

for(help; help!=NULL; help=help->next)//looping untuk membaca
printf("%d\n",help->data);
}

/*fungsi ini berfungsi untuk mengecek spakah stack sudah terurut atau belum*/
int sorted()
{
help=top;

while(help->next!=NULL)
{
if(help->data<=(help->next)->data)help=help->next;//jika data pertama lebih kecil dari data berikutnya maka lanjutkan mengecek
else return 0;//jika data pertama lebih besar dari data berikutnya maka keluar
}

return 1;//jika sudah terurut
}

void flip(int jumlah)//fungsi untuk memflip hingga tersorting.
{
int cek=0, simpan, posisi, posisi2, k;

printf("Langkah-langkahnya yaitu : \n");
while(!sorted())//selama masih tidak urut
{
simpan=0;
posisi=0;
help=top;
for(k=0; k {
posisi++;//counter posisi terus maju
if(help->data>=simpan)//jika ada yang lebih besar gantikan
{
simpan=help->data;
posisi2=posisi; //simpan posisi data maksimum
}
help=help->next;
}
if(sorted())break;//cek lagi sudah tersorting atau belum,jika sudah keluar dari loop
if(posisi2!=1 && posisi2!=jumlah)
{
for(k=0; k enqueue(pop());
for(k=0; k push(dequeue());
cek++;//counter banyak langkah
printf("\n");
printS();//tampilkan langkah
system("PAUSE");
}

if(sorted())break;//cek tersorting/tidak

else if(posisi2!=jumlah)
{
for(k=0; k enqueue(pop());
for(k=0; k push(dequeue());
cek++;//counter langkah
printf("\n");
printS();//tampilkan langkah
system("PAUSE");
}
jumlah--;//kurangi jumlah agar data yang terbesar tadi tidak diflip kembali
}
printf("Langkah minimum yang diperlukan: %d", cek);//tampilkan output
}

main()
{
int jumlah, data, data2;
printf("Input banyak angka: ");
scanf("%d", &jumlah);
for(int r=0; r {
printf("masukkan angka: \n");
scanf("%d", &data);
push(data);
}

flip(jumlah);//panggil fungsi untuk flip

getch();
}

1 komentar:

  1. Hmmm, ada comment, ok2. Yawes.

    NB: Mohon maaf y klo selama asistensi banyak salahnya, sekian asistensi pasd 2010, semoga sukses, wassalamualaikum wr wb. :)

    BalasHapus