Jumat, 22 Maret 2019

Queue Dalam Algoritma Pemrograman C++

| | 0 komentar

QUEUE

TI Politala Algoritma Pemrograman 2B

A. Pengertian Queue


     Queue dalam struktur data atau yang diartikan sebagai antrian merupakan sekumpulan data dimana saat menambahkan elemen hanya bisa dilakukan pada suatu ujung disebut sisi belakang (rear) dan penghapusan (pengambilan elemen) dilakukan lewat ujung lain/sisi depan(front). Berbeda dengan stack yang bersifat LIFO maka queue bersifat FIFO (First In First Out), yaitu data yang pertama masuk maka akan menjadi yang pertama kali keluar begitu pun sebaliknya.
       Tumpukan disebut juga dengan "Waiting Line" yaitu suatu penambahan elemen baru dilakukan pada bagian belakang dan penghapus elemen dilakukan dilakukan pada bagian depan. Elemen-elemen dicdalam antrian dapat bertipe integer, real, record dalam bentuk sederhana atau terstruktur. Queue merupakan salah satu contoh aplikasi dari pembuatan double linked list yang cukup sering ditemui di kehidupan sehari-hari, midalnya saat pengantrian tiket. Istilah yang cukup sering dipakai adalah enqueue yaitu apabila seseorang masuk dalam sebuah antrian. Sedangkan dequeue adalah istilah yang dipakai saat seseorang keluar dari antrian.

B.  Deklarasi Queue dengan Array

      Proses pendeklarasian antrian adalah proses pembuatan struktur antrian dalam memori. Struktur antrian terdiri dari data dalam array, head untuk menunjukkan ujung dari antrian dan tail untuk menunjukkan akhir dari antrian.
#define MAX 5
#include <iostream>
using namespace std;
typedef struct
{
    int data [MAX];
    int head;
    int tail;
}Queue;

C. Inisialisasi Queue

     Inisialisasi antrian adalah proses pembuatan suatu antrian kosong. Proses inisialisasi untuk antrian yang menggunakan array adalah dengan mengisi nilai field head dan tail dengan nilai 0 (nol) jika elemen pertama diawali dengan nomor 1. Kalau elemen pertama array dimulai dengan nilai 0 (nol) maka head dan tail diisi dengan nilai -1.
void Create()
{
    antrian.head=antrian.tail=-1;
}

D. Operasi-Operasi pada Queue

1. Create Queue (Q)
    Untuk menciptakan dan menginisialisasi Queue, dengan cara membuat Head dan Tail = -1
    Berikut deklarasi prosedur create pada queue :
    void create()
   {
       antrian.HEAD = -1;
       antrian.TAIL = -1;
    }

2. Make NullQ (Q)
    Mengosongkan antrian Q, jika ada elemen maka semua elemen dihapus.

3. EnQueue
    Untuk menambahkan elemen ke dalam Antrian, penambahan elemen selalu ditambahkan di elemen paling belakang. Penambahan elemen selalu menggerakan variabel Tail dengan cara increment counter Tail terlebih dahulu.
    Berikut deklarasi prosedur EnQueue:
    void enqueue()
   {
       if (IsEmpty())
       {
           antrian.HEAD=antrian.TAIL=0;
           cout<<”Masukkan data : “;
           cin>>antrian.data[antrian.TAIL];
        }
       else
       if(IsFull())
      {
          cout<<”ANTRIAN SUDAH PENUH!”;
      }
   }

4. DeqQueue
   Digunakan untuk menghapus elemen terdepan/pertama (head) dari Antrian. Dengan cara menggeser semua elemen antrian kedepan dan mengurangi Tail dgn 1. Penggeseran dilakukan dengan menggunakan looping.
      Berikut deklarasi fungsi DeQueue:
      int Dequeue()
     {
          int i;
          int e = antrian.data[antrian.HEAD];
          for(i=antrian.HEAD;i<=antrian.Tail-1;i++)
         {
                antrian.data[i]=antrian.data[i+1];
          }Antrian.TAIL--;
          Return e;
      }

5. Clear
     Untuk menghapus elemen-elemen Antrian dengan cara membuat Tail dan Head = -1
Penghapusan elemen-elemen Antrian sebenarnya tidak menghapus arraynya, namun hanya mengeset indeks pengaksesan-nya ke nilai -1 sehingga elemen-elemen Antrian tidak lagi terbaca.
     Berikut deklarasi fungsi clear:
     void clear()
    {
         antrian.HEAD = -1;
         antrian.TAIL = -1
         cout<<"Antrian sudah dikosongkan! ";
     }

6. IsEmpty
    Untuk memeriksa apakah Antrian sudah penuh atau belum. Dengan cara memeriksa nilai Tail, jika      Tail = -1 maka empty. Kita tidak memeriksa Head, karena Head adalah tanda untuk kepala antrian (elemen pertama dalam antrian) yang tidak akan berubah-ubah. Pergerakan pada Antrian terjadi dengan penambahan elemen Antrian kebelakang, yaitu menggunakan nilai Tail.
    Berikut deklarasi fungsi IsEmpty :
    int IsEmpty()
   {
       if (antrian.HEAD=antrian.TAIL==-1)
      {
       return 1;
       }
       else
      {
       return 0;
       }
    }

7. IsFull
    Untuk mengecek apakah Antrian sudah penuh atau belum
    Dengan cara mengecek nilai Tail, jika Tail >= MAX-1 (karena MAX-1 adalah batas elemen array        pada C) berarti sudah penuh.
    Berikut deklarasi fungsi IsFull :
    int IsFull()
   {
       if (antrian.TAIL == max-1)
      {
          return 1;
      }
      else
     {
          return 0;
      }
   }

Contoh Program Queue



DAFTAR PUSTAKA

http://atokise.blogspot.com/2016/11/program-queue.html
http://suputradwipratama274.blogspot.com/2015/06/penjelasan-tentang-queue-contoh-program.html
http://sekilaslihat.blogspot.com/2015/06/rangkuman-materi-queue.html
http://blog-arul.blogspot.com/2012/01/queue-pada-struktur-data.html
https://blognyonyait.blogspot.com/2017/05/makalah-sistem-antrian-queue-dengan.html

Read more...

Stack Dalam Algoritma Pemrograman C++

| | 0 komentar

TI Politala Algoritma Pemrograman 2B

A. Pengertian Stack (Tumpukan)

    Stack (tumpukan) merupakan sebuah cara dalam mengorganisasikan data-data yang dimiliki. Stack digunakan sebagai penyimpanan data di dalam memori. Stack merupakan suatu tumpukan dari benda dengan konsep utamanya adalah LIFO (Last In First Out). Dalam artian benda yang masuk terakhir dalam stack akan menjadi benda pertama yang dikeluarkan dari stack.

B. Operasi Dasar Stack

Ada beberapa operasi-operasi dalam stack:
1. Push yaitu  untuk menambahkan item pada tumpukan paling atas.
    Langkah-langkah operasi stack yaitu:
    a. Memeriksa tumpukan apakah penuh atau tidak
   b. Jika tumpukan penuh dan tak ada ruang untuk memasukkan data, maka cukup tampilkan pesan bahwa tumpukan sudah penuh.
    c. Jika tumpukan tidak penuh dan masih ada ruang, maka tambahkan satu nilai pada tumpukan atas (top) untuk menunjukkan ke ruang kosong selanjutnya.
    d. Tambahkan data pada ruang kosong yang ditunjukan oleh top
    Contoh potongan program operasi push
    If (top < n-1)
   { 
       top = top + 1;
       S[top] = x;
    }
    Else
   {
       Cout<<”stack Penuh”;
   }

2. Pop yaitu untuk  mengambil item yang paling atas.
    Langkah-langkah operasi pop yaitu:
    a. Memeriksa tumpukan apakah kosong atau tidak
   b. Jika tumpukan kosong dan sudah tidak ada data untuk dihapus, maka cukup tampilkan pesan bahwa tumpukan kosong
    c. Jika tumpukan tidak kosong, maka akses data yang paling atas (top).
    d. Kemudian kurangi nilai dengan petunjuk dari top
    Contoh potongan program operasi pop :
    If (top > -1)
    { 
        x = S[top];
        Top= top-1;
     }
    Else
    {
        Cout<<”stack kosong”;
     }
3. Clear yaitu untuk mengosongkan stack.
4. IsEmpty yaitu fungsi yang digunakan untuk mengecek apakah stack sudah kosong. IsFull yaitu fungsi yang digunakan untuk mengecek apakah stack sudah penuh.
5. Selain operasi-operasi diatas, ada operasi lain yang dapat terjadi dalam stack yaitu:
6. Proses deklarasi yaitu proses pendeklarasian stack.
7. Proses inisialisasi yaitu proses pembuatan stack kosong, biasanya dengan pemberian nilai untuk top.

C. Program STACK

1.  Untuk mendeklarasikan program stack pada c++, dibutuhkan 3 metode yaitu fungsi push( );, pop( );, dan printStack( ); untuk menampilkan data yang ditumpukkan.
2. Selain fungsi diatas, buat 2 fungsi opsional untuk mengecek apakah tumpukan kosong isEmpty( ) dan tumpukan penuh isFull( ).
3. Untuk menyimpan data dapat menggunakan empety array dengan maksimum array yang akan didefinisikan sebagai maksimum tumpukan.
4. Agar data tumpukkan terstruktur kita bisa menggunakan struct sehingga mudah mengakses data top dan array data seperti sebuah object.
5. Karena merupakan program konsole maka juga akan dibuat fungsi main( ).

Contoh Program Stack
#include <iostream>
using namespace std;
#define MAXSTACK 5
typedef struct
{
    char item [MAXSTACK];
    int top;
}stack;
void InisialsasiStack (stack &s)
{
    s.top = 0;
}
int IsFull(stack &s)
{
    if (s.top == MAXSTACK)
        return 1;
    else
        return 0;
}
bool push (stack &s, char c)
{
    if (IsFull(s))
    {
        cout<<" Stack Penuh"<<endl;
        return 1;
    }
    else
    {
        s.top++;
        s.item[s.top]=c;
        return 0;
    }
}
bool IsEmpty(stack &s)
{
    if (s.top == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}
char pop (stack &s)
{
    char c =' ';
    if (!IsEmpty(s))
    {
        c = s.item[s.top];
        s.item[s.top]=' ';
        s.top=s.top-1;
    }
    return c;
}
int main()
{
    stack stack;
    InisialsasiStack(stack);
    push(stack, 'A');
    push(stack, 'D');
    push(stack, 'F');
    push(stack, 'C');
    push(stack, 'A');
    push(stack, 'X');
    push(stack, 'Y');
    push(stack, 'Z');
    cout<<" Urutan teratas     : "<<stack.top<<endl;
    cout<<" Isi urutan teratas : "<<stack.item[stack.top]<<endl;
    cout<<" Urutan yang keluar : "<<pop(stack)<<endl;
    return 0;
}
Hasil Running :

Download juga contoh program Stack lainya pada link dibawah ini :

DAFTAR PUSTAKA

http://www.klikartikel.com/2014/12/mengenal-stack-pada-c.html
https://bekti.net/blog/implementasi-stack-di-cpp/
https://primaangelsnote.blogspot.com/2019/03/algoritma-dan-pemrograman-2-stuck.html
Read more...

Kamis, 21 Maret 2019

Pointer Dalam Algoritma Pemrograman C++

| | 0 komentar

Pointer

TI Politala Algoritma Pemrograman 2B

A. Pengertian Pointer

  Pointer adalah variabel yang menunjuk pada variabel lainnya. Pointer dapat menyimpan alamat    memori yang ditunjuk. Pada pointer kita dapat menunjuk menunjuk suatu memori, mengubah nilai dan menyalin nilai memori tersebut secara tidak langsung (perantara melalui variabel pointer).

B. Fungsi Pointer

     Adapun fungsi dari pointer sendiri  yaitu :
  1. Menyimpan alamat memori dari sebuah variabel (tipe data atau objek dari kelas).
  2. Menyimpan alamat dari sebuah fungsi (function pointer).
  3. Mengirim "Paramerer yang berupa variabel" ke dalam fungsi, artinya nilai variabel bisa diubah di dalam fungsi.
  4. Untuk membuat variabel dinamis.

C. Macam-Macam Operator Pada Pointer

     Dalam pointer terdapat dua macam operator yang dapat kita gunakan, yaitu :
1.    Operator Deference  (&)
Address-of Operator(&) adalah operator yang digunakan untuk mendapatkan atau melihat alamat memori yang dimiliki oleh variabel tersebut. Cara menggunakannya adalah dengan meletakkan tanda '&' pada depan identitas saat pemanggilan variabel. Lokasi variabel akan ditentukan otomatis oleh kompiler dan operating system pada saat run-time.
2.    Operator Reference (*)
Dereference Operator(*) adalah operator yang digunakan untuk mengakses nilai yang tersimpan secara langsung dengan memberikan awalan arterisk '*' pada identifier pointer. Sama dengan simbol Address-of Operator, peletakkan simbolnya diletakkan diawal variabel.

Contoh Program :

#include <iostream>
using namespace std;

int main()
 {
     int var = 20; 
     int *ip;

     ip = &var; 
     *ip = 30; 

     cout<<" Value of var variable             : "<<var<<endl;
     cout<<" Address stored in ip variable : "<<ip<<endl;
     cout<<" Value of *ip variable              : "<<*ip<<endl;
     return 0;
 }

Hasil Running :

D. Mendeklarasi Variabel Pointer

     Pointer dapat dinyatakan dalam C++ menggunakan penulisan seperti berikut :
                                      tipe_data*nama_pointer;
     Keterangan :
Ø  tipe_data dapat berupa sembarang tipe seperti halnya pada pendefenisian variabel bukan pointer.
Ø  nama_variabel adalah nama variabel pointer.
    Ada dua cara yang dapat dilakukan dilakukan untuk alokasi space di memori di pointer, yaitu:
1.      Menempati space variabel lain yang sudah punya space
   Variabel lain tersebut dapat  berupa variabel biasa (bukan pointer) atau pointer yang tentunya sudah punya alokasi space di memori.
Penulisannya:
                                      var_pointer=&var_biasa;
2.      Dialokasikan tersendiri di memori (memori dinamis).
   Pointer tidak menempati space variabel lain, tetapi dialokasikan space tersendiri di memori dengan instruksi new.
Penulisannya:
                                      var_pointer=new tipe_data-pointer;

E. Pointer Pada Array

     Hubungan antara pointer dan array pada C sangatlah erat. Sebab sesungguhnya array secara internal akan diterjemahkan dalam bentuk pointer. Konsep array diantaranya adalah banyak loncatan dari pointer satu ke pointer lain karena secara internal array juga menyatakan alamat, yaitu pengenal array sama dengan alamat pada elemen pertama, pada array. Misalnya dideklarasikan sebagai berikut:
int A[5]= {0, 3, 5, 4,7}: dan int *pntArray;
Contoh program : 

#include <iostream>
using namespace std;
int main()
 {
     int bil[10] = {1,2,3,4,5,6,7,8};  
     int *p;
     p = bil;
     cout<<"Alamat 'angka' adalah : "<<bil<<endl;
     cout<<"Alamat 'p' adalah     : "<<p<<endl;
     cout<<"Indeks bil ke 4       : "<<bil[4]<<endl;
     cout<<"Indeks p ke 4         : "<<*(p+4)<<endl;  // sama dengan bil[4]
     return 0;
 }

Running :

F. Pointer Sebagai Parameter Suatu Fungsi

    Seperti halnya dengan array, pointer dapat digunakan sebagai parameter suatu fungsi. Karena sifat pointer yang hanya sebagai penunjuk, maka setiap perubahan yang terjadi pada parameter, sebenarnya terjadi pada variabel yang ditunjuk bukan pada variabel pointer. Penerapan pointer sebagai parameter yaitu jika diinginkan agar nilai suatu variabel internal dapat diubaholeh fungsi yang dipanggil. Sebagai contoh dapat dilihat pada fungsi yang dipanggil. Sebagai contoh dapat dilihat pada fungsi berikut :

void tambah (int *angka)
{
*angka = *angka +30;
}

Fungsi diatas dimaksudkan agar kalau dipanggil variabel yang bersangkutan dengan parameter aktual dapat diubah nilainya menjadi dinaikkan sebesar 30.
Contoh program :

#include <iostream>
using namespace std;
void penambahan(int &x)
{
     x = x+1500;
 }
void pengurangan(int *y)
 {
    y = y-2;
 }
int main()
{
     int bil1 = 10;
     int bil2 = 5;
     int *p;

     p = &bil2;
     penambahan(bil1);
     pengurangan(p);
     cout<<bil1<<endl;
     cout<<bil2<<endl;
     return 0;
 }

Running :

F. Pointer To Pointer

   Tidak terbatas menunjuk alamat dari suatu variabel, pointer dapat pula menunjuk ke pointer lainnya. Didalam pendeklarasianya, hanya menambahkan pointer reference ( * ) pada variabel yang akan ditunjuk.
Contoh program :
#include <iostream>
using namespace std;

int main()
 {
     int bil1 = 10;
     int *p;
     int **ptp;
     int ***ptp2;

     p = &bil1;
     ptp = &p;
     ptp2 = &ptp;
     cout<<"Alamat 'bil' adalah   : "<<bil1<<endl;
     cout<<"Alamat 'p' adalah     : "<<p<<endl<<endl;
     return 0;
 }
Running :


DAFTAR PUSTAKA

https://ajikamaludin.blogspot.com/2017/05/belajar-c-struktur-data-pointer-dan.html
https://www.belajarcpp.com/tutorial/cpp/pointer/
https://zoneblog123.blogspot.com/2017/11/pengertian-lengkap-pointer-dan-macam.html
http://catatanflo.blogspot.com/2017/04/cara-deklarasi-pointer-pada-array-c.html
Read more...

Stuck Array Dalam Algoritma Pemrograman C++

| | 0 komentar


Politala Algoritma Pemrograman 2B

A.   Pengertian Struck Array

      Array adalah sekumpulan data sejenis yang disimpan ke dalam variabel dengan nama yang  sama, dengan memberikan indeks untuk dapat membedakan satu dengan yang lainnya.  Array adalah alokasi memori statis. Dapat mengalokasikan memori untuk tipe data yang sama dan berurutan. Menyimpan nilai-nilai dalam memori dengan ukuran yang tetap.Struktur array yang statis mempunyai satu nama tetapi memiliki banyak tempat. Setiap tempat harus dibedakan dengan sebuah petunjuk yang berupa tipe data yaitu karakter (char), integer (int),string, dll.

B.   Deklarasi Struktur Array

       Cara pendeklarasian array adalah sebagai berikut :
       1.    Objek berbentuk array
              Struct nama_struktur
             {
                  tipe_data 1 elemen 1 ;
                  tipe_data 2 elemen 2 ;
                   ….
              }nama_objek[10];
       2.    Elemen dan objek berbentuk array
              Struct nama_struktur
             {
                     tipe_data 1 elemen 1 [5];
                     tipe_data 2 elemen 2 [5];
                      ….
              }nama_objek[10];

C.   Penyimpanan dan Pengambilan Nilai

       Bahasa pemrograman menyediakan sintaks tertentu untuk penyimpanan dan pengambilan nilai elemen pada posisi tertentu di array.
Contoh :
       A[12] = 67, berarti penyimpanan nilai 67 ke posisi ke-12 dari array A.
       D = A[12], berarti pengambilan nilai elemen posisi ke-10 dari array A.

Contoh Program Struck Array

    Program untuk menghitung jumlah nilai akhir mahasiswa menggunakan struktur dengan ketentuan Nilai akhir = (30%*nilai tugas) + (30%*nilai UTS) + (40%*nilai UAS). Merdasarkan mata kuliah yang diambil. 
      Nilai Huruf :
      1. Nilai akhir > 80                 :     A
      2. 80 >= nilai akhir > 75        :     B+
      3. 75 >= nilai akhir > 70        :     B
      4. 70 >= nilai akhir > 65        :     C+
      5. 65 >= nilai akhir > 60        :     C
      6. 60 >= nilai akhir > 50        :     D+
      7. 50 >= nilai akhir > 40        :     D
      8. Nilai akhir <=40                :     E

#include <iostream>
using namespace std;
struct mahasiswa
{
    string nama, alamat, huruf[10], namamk[10];
    float nilaitugas[10], nilaiUTS[10], nilaiUAS[10], NA[10];
    int mk[10], sks[10], nim;
}a[10];
int main()
{
 int i, n, m[10], j;
 cout<<" Masukkan Jumlah Mahasiswa : "; cin>>n;
cout<<" =================================================================================================="<<endl;
 cout<<" ===============================                                       ============================"<<endl;
 cout<<" |                                 PERHITUNGAN NILAI AKHIR MAHASISWA                              |"<<endl;
 cout<<" ===============================                                       ============================"<<endl;
 cout<<" =================================================================================================="<<endl;
 for(i=1; i<=n; i++)
 {
 cout<<" Mahasiswa ke-"<<i<<endl;
 cout<<" Nama             : " ;cin>>a[i].nama;
 cout<<" NIM              : " ;cin>>a[i].nim;
 cout<<" Alamat           : " ;cin>>a[i].alamat;
 cout<<" Banyak Matkul    : " ;cin>>m[i];
 cout<<endl;
 for(j=1; j<=m[i]; j++)
 {
 cout<<" Mata Kuliah ke-"<<j<<endl;
 cout<<" Nama Mata Kuliah : " ;cin>>a[i].namamk[j];
 cout<<" Jumlah SKS       : " ;cin>>a[i].sks[j];
 cout<<" Nilai Tugas      : " ;cin>>a[i].nilaitugas[j];
 cout<<" Nilai UTS        : " ;cin>>a[i].nilaiUTS[j];
 cout<<" Nilai UAS        : " ;cin>>a[i].nilaiUAS[j];

 a[i].NA[j]=0.3*a[i].nilaitugas[j]+0.3*a[i].nilaiUTS[j]+0.4*a[i].nilaiUAS[j];

 cout<<" NIlai Akhir      : " <<a[i].NA[j]<<endl<<endl;

 if (a[i].NA[j] >= 80)
    {
        a[i].huruf[j]= "A";
    }
 else if (a[i].NA[j] >=75 && a[i].NA[j] < 80)
    {
        a[i].huruf[j]= "B+";
    }
 else if (a[i].NA[j] >=70 && a[i].NA[j] < 75)
    {
        a[i].huruf[j]= "B";
    }
 else if (a[i].NA[j] >=65 && a[i].NA[j] < 70)
    {
        a[i].huruf[j]= "C+";
    }
 else if (a[i].NA[j] >=60 && a[i].NA[j] < 65)
    {
        a[i].huruf[j]= "C";
    }
 else if (a[i].NA[j] >=50 && a[i].NA[j] < 60)
    {
        a[i].huruf[j]= "D+";
    }
  else if (a[i].NA[j] >=40 && a[i].NA[j] < 50)
    {
        a[i].huruf[j]= "D";
    }
  else
    {
        a[i].huruf[j]= "E";
    }
 }
 }
cout<<" =================================================================================================="<<endl;
 cout<<" =======================================     MAHASISWA    ========================================="<<endl;
 cout<<"| NAMA          | NIM            | Mata Kuliah          |  TUGAS  |  UTS   | UAS  |  NA  | HURUF  |"<<endl;
 cout<<" --------------------------------------------------------------------------------------------------"<<endl;

 for( i=1; i<=n; i++)
 {
     cout<<"  "<<a[i].nama << "\t\t" << a[i].nim;
     for( j=1; j<=m[i]; j++)
     {
      cout<< "\t\t" << a[i].namamk[j]<< "\t\t\t" <<a[i].nilaitugas[j]<< "\t" << a[i].nilaiUTS[j];
      cout<< "\t" << a[i].nilaiUAS[j] << "\t" << a[i].NA[j]<< "\t" << a[i].huruf[j]<<endl;
     }
 }
}

Jika ingin contoh program struck array yang lainnya, silahkan download pada link :
https://drive.google.com/open?id=1bDRdaDowOyqwHjQq9Uoyf_rZXPcpLYeY

DAFTAR PUSTAKA

Yuliana. Praktikum 1 Array, Pointer dan Struktur. Diakses pada tanggal 22 Maret 2019 pukul 13.14 WITA dari http://yuliana.lecturer.pens.ac.id/Struktur%20Data%20C/Prak%20SD%20-%20pdf/Praktikum%201.pdf
Purwanto, Timur Dali. 2013. PEMROGRAMAN C++. Diakses pada tanggal 22 Maret 2019 pukul 13.25 WITA dari https://www.coursehero.com/file/27467441/pak-timur-modul-cpdf/



Read more...
animasi  bergerak gif

Popular Posts

Blogger templates

Blogroll

About

Diberdayakan oleh Blogger.

Cari Blog Ini

Postingan lain

Translate

Blogger templates

Pages

Pages

Popular Posts

 

Designed by: Compartidísimo
Images by: DeliciousScraps©