Implementasi Search And Insert (Opening Ceremony) FIFA World Cup 2014

Posted on Updated on

FIFA World Cup 2014 Logo

Pada tahun 2014 nanti, World Cup akan dilaksanakan di Brazil. Tim yang ikut dalam turnament telah menjalani seleksi yang sangat berat di benua masing-masing. Dari 5 Benua (Amerika, Eropa, Asia, Afrika dan Australia), dipilih 32 negara yang akan bertanding satu sama lain untuk memperebutkan mahkota tertinggi dalam dunia sepak bola. Indonesia, sebagai salah satu wakil Asia di World Cup juga tidak mau kalah.

World Cup dimulai dengan upacara pembukaan yang dilaksanakan di Stadion Kota Rio De Janiero. Ternyata, barisan dalam upacara pembukaan diurutkan sesuai nomor yang didapatkan saat pengundian dan dilakukan secara acak. Indonesia mendapatkan nomor urut 5, di sebelah Italia dengan nomor urut 4 dan Jepang di urutan 6.

Bentuk barisan yang terbentuk adalah seperti ini

Urutan Barisan

Tapi sayang, jadwal World Cup kali ini bertepatan dengan musim hujan yang sering mengakibatkan badai di seluruh penjuru Brazil. Saat hari upacara tiba, masih banyak tim yang belum datang ke lokasi karena terjebak hujan badai di perjalanan. Akibatnya, barisan yang semula sudah diatur sedemikian rupa, menjadi tidak tertata. Padahal, barisan harus tetap dengan urutan yang telah ditetapkan, yaitu dari urutan paling awal sampai terakhir. Karena pengaturan formasi diatur oleh sistem yang sudah terotomatisasi. Mau tidak mau, sang programer harus membuat sistem untuk menghadapi kemungkinan terburuk seperti ini.

Hari upacara pun tiba, akan tetapi itu bertepatan dengan hujan badai. Banyak tim yang belum datang ke lokasi upacara. Selang waktu 5 menit kemudian, Tim Indonesia datang. Tim Indonesia merupakan tim yang pertama hadir di lokasi. Ilustrasi barisan menjadi seperti ini.

indonesia

Beberapa waktu kemudian, tim Italia datang ke lokasi. Karena tim Italia adalah tim nomor 4 sementara tim Indonesia adalah tim nomor 5, maka dalam barisan tim Italia yang didahulukan. Illustrasinya sebagai berikut.

italia_indonesia

Selang 5 menit, tim Jepang pun datang (tim Jepang adalah tim dengan nomor urut 6). Ilustrasinya menjadi seperti berikut

italia_indonesia_jepang

Kemudian tim 10 pun datang, ilustrasinya menjadi seperti berikut

italia_indonesia_jepang_10

Demikian seterusnya, sampai dengan semua tim hadir dan upacara pembukaan berlangsung dengan meriah.

Implementasi program menggunakan C/C++ dan di sini masih bersifat CUI (Command User Interface). Tapi setidak-tidaknya ini sudah bisa merepresentasikan cara yang digunakan untuk menyelesaikan masalah tersebut.

Source code

/*
Teknik Informatika
Institut Teknologi Sepuluh Nopember
Fadlika Dita Nurjanto
5110100132
E-mail  :   fadlikadn@gmail.com
Blog    :   fadlikadn.wordpress.com

Opening Ceremony in FIFA World Cup 2014
*/

#include <stdio.h>
#include <iostream.h>

typedef struct Node
{
    int Value;
    struct Node *Next;
    struct Node *Prev;
};
typedef struct Node Linked;

//fungsi untuk membuat node baru
void make_node(int X, Linked **P)
{
    *P = (Linked *) malloc (sizeof(Linked));
    if(*P != NULL)
    {
        (*P)->Value = X;
        (*P)->Next  = NULL;
        (*P)->Prev  = NULL;
    }
    else
        printf("Make new node has failed !\n");
}

//fungsi pertama kali yang dipanggil, untuk membuat First dan Last menjadi NULL
void Initial(Linked **F_loc, Linked **L_loc)
{
    *F_loc = NULL;
    *L_loc = NULL;
    //printf("F and L set to NULL\n");
    printf("Tim Awal dan Tim Akhir diset NULL\n");
}

//insert first, F & L dalam keadaan NULL
void insert_first(Linked **F_loc, Linked **L_loc, Linked **P_loc)
{
    (*P_loc)->Next = NULL;
    (*P_loc)->Prev = NULL;
    *F_loc = *P_loc;
    *L_loc = *P_loc;
    //printf("Initial first has change F=%d and L=%d\n",(*F_loc)->Value,(*L_loc)->Value);
    printf("Tim awal adalah tim nomor %d dan tim akhir adalah tim nomor %d\n",(*F_loc)->Value,(*L_loc)->Value);
}

void search_value(int X, Linked **P_loc, Linked **Q_loc, Linked **F_loc, Linked **L_loc)
{
    *Q_loc = *F_loc;
    while((*Q_loc)->Next!=NULL)
    {
        if((*Q_loc)->Value == (*P_loc)->Value)
        {
            //printf("Value has found, nothing to do\n");
            printf("Tim ditemukan, tidak perlu melakukan apa-apa\n");
            break;
        }
        else
        {
            if((*Q_loc)->Value < (*P_loc)->Value)
            {
                *Q_loc = (*Q_loc)->Next;
            }
            else if((*Q_loc)->Value > (*P_loc)->Value)
            {
                //printf("Value not found, insert into sorted list\n");
                if((*Q_loc)->Prev != NULL)
                {
                    (*P_loc)->Prev = (*Q_loc)->Prev;
                    ((*Q_loc)->Prev)->Next = *P_loc;
                    (*Q_loc)->Prev = *P_loc;
                    (*P_loc)->Next = *Q_loc;
                }
                else if((*Q_loc)->Prev == NULL)
                {
                    (*P_loc)->Next = *Q_loc;
                    (*Q_loc)->Prev = *P_loc;
                    *F_loc = *P_loc;
                }
                //printf("Insert into sorted list has successfully\n");
                printf("Tim berhasil dimasukkan\n");
                break;
            }
        }
    }
    if((*Q_loc)->Next==NULL)
    {
        if((*Q_loc)->Value == (*P_loc)->Value)
        {
            //printf("Value has found, nothing to do\n");
            printf("Tim ditemukan, tidak perlu melakukan apa-apa\n");
        }
        else
        {
            if((*Q_loc)->Value < (*P_loc)->Value)
            {
                //printf("%d lebih kecil dari %d\n",(*Q_loc)->Value,(*P_loc)->Value);
                //*Q_loc = (*Q_loc)->Next;
                (*Q_loc)->Next = *P_loc;
                (*P_loc)->Prev = *Q_loc;
                (*P_loc)->Next = NULL;
                //printf("Insert into sorted list has successfully\n");
                printf("Tim berhasil dimasukkan\n");
            }
            else if((*Q_loc)->Value > (*P_loc)->Value)
            {
                //printf("%d lebih besar dari %d\n",(*Q_loc)->Value,(*P_loc)->Value);
                if((*Q_loc)->Prev != NULL)
                {
                    (*P_loc)->Prev = (*Q_loc)->Prev;
                    ((*Q_loc)->Prev)->Next = *P_loc;
                    (*Q_loc)->Prev = *P_loc;
                    (*P_loc)->Next = *Q_loc;
                    //printf("Insert into sorted list has successfully\n");
                    printf("Tim berhasil dimasukkan\n");
                }
                else if((*Q_loc)->Prev == NULL)
                {
                    //printf("Element only one\n");
                    printf("Tim hanya satu\n");
                    (*P_loc)->Next = *Q_loc;
                    (*Q_loc)->Prev = *P_loc;
                    *F_loc = *P_loc;
                    //printf("F = %d, L= %d\n",(*F_loc)->Value, (*L_loc)->Value);
                    //printf("Insert into sorted list has successfully\n");
                    printf("Tim berhasil dimasukkan\n");
                }
            }
        }
    }
}

//fungsi utama, akan memanggil fungsi-fungsi yang lain
void main_process(int X, Linked **P_loc, Linked **Q_loc, Linked **F_loc, Linked **L_loc)
{
    if(*F_loc == NULL && *L_loc == NULL) //jika list masih kosong
    {
        make_node(X,&*P_loc);
        insert_first(&*F_loc,&*L_loc,&*P_loc);
    }
    else //jika list sudah berisi
    {
        make_node(X,&*P_loc); //alokasi memori dulu
        //proses search
        search_value(X,&*P_loc,&*Q_loc,&*F_loc,&*L_loc);
        //void search_value(int X, Linked **P_loc, Linked **Q_loc, Linked **F_loc, Linked **L_loc)
    }
}

void list_print_all(Linked **Q_loc, Linked **F_loc)
{
    if(*F_loc!=NULL)
    {
        *Q_loc = *F_loc;
        int valid = 1;
        while(valid == 1)
        {
            printf("%d ",(*Q_loc)->Value);
            if((*Q_loc)->Next==NULL) break;
            else *Q_loc = (*Q_loc)->Next;
        }
        printf("\n");
    }
    //else printf("List haven't created\n");
    else printf("Barisan belum terbentuk\n");
}

int main()
{
    Linked *P, *F, *L, *Q;
    int val;
    Initial(&F,&L);
    printf("Opening Ceremony FIFA World Cup 2014, Brazil\n");
    printf("Type 0 to exit\n");
    printf("Type 1 to insert country number to list\n");
    printf("Type 2 to check country list\n");
    int ch;
    while(scanf("%d",&ch) && ch != 0)
    {
        if(ch==1)
        {
            printf("Type country number\n");
            scanf("%d",&val);
            //void main_process(int X, Linked **P_loc, Linked **Q_loc, Linked **F_loc, Linked **L_loc)
            main_process(val,&P,&Q,&F,&L);
        }
        else if(ch==2)
        {
            //void list_print_all(Linked **Q_loc, Linked **F_loc)
            list_print_all(&Q,&F);
        }
    }
    return 0;
}

Tulisan lengkap bisa didownload di sini

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s