Tutorial Pemrograman C/C++: Menukar Data (Swapping) Antara Dua Variabel Bertipedata Struktur (struct) – Bagian 3 (Selesai)


void3 Setelah tutorial Bagian 1 dan Bagian 2 yang memberikan dasar teknik pertukaran data dengan memberikan beberapa contoh program, maka Bagian 3 ini merupakan akhir dari tutorial ini dengan memberikan contoh pertukaran data untuk tipe data struktur (struct). Dan sebagai bonus akan diberikan trik pertukaran data yang mantap.😀

struct dalam bahasa C adalah cara pendeklarasian yang mengelompokkan beberapa variabel dalam satu nama pada satu blok memori. Pengelompokan variabel ini penting untuk menangani data yang memiliki rincian data. Sebagai contoh, variabel kontak memiliki rincian variabel nama, alamat dan nomor telepon. Variabel kontak dalam hal ini biasa disebut sebagai record dengan tiga buah field yakni nama, alamat dan nomor telepon.

Nah, langsung saja, mari kita simak kode program berikut ini.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct { 
    int idkontak; 
    char nama[30]; 
    char alamat[80]; 
    char telepon[20]; 
} TKontak; 

int main() 
{ 
    TKontak kontak; 

    kontak.idkontak= 1; 
    strcpy(kontak.nama, "Teknik Elektro Links"); 
    strcpy(kontak.alamat, "Jl. LA Sucipto 1 No. 17 Malang"); 
    strcpy(kontak.telepon, "0341-9857624"); 
    printf("ID Kontak : %d\n", kontak.idkontak); 
    printf("Nama      : %s\n", kontak.nama); 
    printf("Alamat    : %s\n", kontak.alamat); 
    printf("Telepon   : %s\n", kontak.telepon); 
    printf("\n"); 
    return 0; 
}

Pada program di atas, kita mengelompokkan empat buah variabel dengan satu nama yaitu TKontak. Tipe data TKontak dideklarasikan dengan typedef struct.

Pada fungsi utama program, variabel kontak dideklarasikan dengan tipe TKontak. Dengan demikian, variabel kontak memiliki empat variabel rincian yakni idkontak, nama, alamat dan telepon.

Untuk mengakses field dari struktur, digunakan notasi titik. Perintah kontak.idkontak = 1; berarti mengisi fiedl idkontak dengan nilai 1. Untuk mengisi field nama pada rekord kontak, digunakan perintah strcpy(kontak.nama, "Teknik Elektro Links");. Sedangkan perintah printf("Nama: %s\n", kontak.nama); berfungsi untuk mencetak field nama. Berikut adalah hasil eksekusi program di atas.

image

Sekarang mari kita simak program berikut ini yang akan mendemonstrasikan proses pertukaran data antara dua variabel bertipe struct.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct { 
    int idkontak; 
    char nama[30]; 
    char alamat[80]; 
    char telepon[20]; 
} TKontak; 

int main() 
{ 
    TKontak kontak1, kontak2, temp; 

    kontak1.idkontak= 1; 
    strcpy(kontak1.nama, "Teknik Elektro Links"); 
    strcpy(kontak1.alamat, "Jl. LA Sucipto 1 No. 17 Malang"); 
    strcpy(kontak1.telepon, "0341-9857624"); 
    kontak2.idkontak= 2; 
    strcpy(kontak2.nama, "Chandra MDE"); 
    strcpy(kontak2.alamat, "Jl. A Yani 2 No. 5 Malang"); 
    strcpy(kontak2.telepon, "0341-7297747"); 

    temp = kontak1; 
    kontak1 = kontak2; 
    kontak2 = temp; 

    printf("kontak1\n");        
    printf("----------------------\n"); 
    printf("ID Kontak : %d\n", kontak1.idkontak); 
    printf("Nama      : %s\n", kontak1.nama); 
    printf("Alamat    : %s\n", kontak1.alamat); 
    printf("Telepon   : %s\n", kontak1.telepon); 
    printf("\n"); 
    printf("kontak2\n"); 
    printf("----------------------\n"); 
    printf("ID Kontak : %d\n", kontak2.idkontak); 
    printf("Nama      : %s\n", kontak2.nama); 
    printf("Alamat    : %s\n", kontak2.alamat); 
    printf("Telepon   : %s\n", kontak2.telepon); 
    printf("\n"); 
    return 0; 
}

Variabel kontak1 dan kontak2 adalah variabel bertipe struct TKontak yang masing-masing berisi data kontak Teknik Elektro Links dan Chandra MDE. Variabel temp yang juga bertipe struct TKontak digunakan sebagai variabel penampung data sementara pada proses pertukaran data.

Berikut ini adalah hasil eksekusi kode program di atas.

image

Nampak bahwa data kontak1 dan kontak2 telah berhasil dipertukarkan. Kita dapat membuat fungsi tukar data untuk tipe struct TKontak sebagai berikut:

void swap_kontak(TKontak *a, TKontak *b) 
{ 
    TKontak temp = *a; 
    *a = *b; 
    *b = temp; 
}

Dan dengan mengganti tiga baris perintah pertukaran data berikut ini,

temp = kontak1; 
kontak1 = kontak2; 
kontak2 = temp;

dengan perintah pemanggilan fungsi swap_kontak() seperti di bawah ini,

swap_kontak(&kontak1, &kontak2);

maka akan diperoleh hasil yang sama seperti di atas.

Fungsi swap() Untuk Sembarang Tipedata

Pada contoh-contoh sebelumnya, fungsi swap hanya berlaku secara spesifik untuk tipedata tertentu. Pada Bagian 1 diberikan contoh fungsi swap untuk tipedata int, sedangkan pada Bagian 2 diberikan contoh fungsi swap untuk tipe data array-of-char dan string pointer.

Nah, bagaimana membuat fungsi swap yang bisa digunakan untuk sembarang tipedata?

Mari kita simak kode program berikut ini.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>

typedef struct { 
    int idkontak; 
    char nama[30]; 
    char alamat[80]; 
    char telepon[20]; 
} TKontak;

void void_swap(void *a, void *b, int size) 
{ 
    void *tmp = (void *)malloc(size); 
    memcpy(tmp, a, size); 
    memcpy(a, b, size); 
    memcpy(b, tmp, size); 
    free(t); 
}

int main() 
{ 
    int A, B; 
    float X, Y; 
    TKontak kontak1, kontak2;

    A = 10; 
    B = 20; 
    printf("Sebelum swap: A = %d, B = %d\n", A, B); 
    void_swap(&A, &B, sizeof(int)); 
    printf("Setelah swap: A = %d, B = %d\n\n", A, B); 
    X = 0.341; 
    Y = 3.14; 
    printf("Sebelum swap: X = %f, Y = %f\n", X, Y); 
    void_swap(&X, &Y, sizeof(int)); 
    printf("Setelah swap: X = %f, Y = %f\n\n", X, Y); 
    kontak1.idkontak= 1; 
    strcpy(kontak1.nama, "Teknik Elektro Links"); 
    strcpy(kontak1.alamat, "Jl. LA Sucipto 1 No. 17 Malang"); 
    strcpy(kontak1.telepon, "0341-9857624"); 
    kontak2.idkontak= 2; 
    strcpy(kontak2.nama, "Chandra MDE"); 
    strcpy(kontak2.alamat, "Jl. A Yani 2 No. 5 Malang"); 
    strcpy(kontak2.telepon, "0341-7297747");

    //swap kontak1 dengan kontak2 
    void_swap(&kontak1, &kontak2, sizeof(TKontak));

    printf("kontak1\n");        
    printf("———————-\n"); 
    printf("ID Kontak : %d\n", kontak1.idkontak); 
    printf("Nama      : %s\n", kontak1.nama); 
    printf("Alamat    : %s\n", kontak1.alamat); 
    printf("Telepon   : %s\n", kontak1.telepon); 
    printf("\n"); 
    printf("kontak2\n"); 
    printf("———————-\n"); 
    printf("ID Kontak : %d\n", kontak2.idkontak); 
    printf("Nama      : %s\n", kontak2.nama); 
    printf("Alamat    : %s\n", kontak2.alamat); 
    printf("Telepon   : %s\n", kontak2.telepon); 
    printf("\n"); 
    return 0; 
}

Program di atas mendemonstrasikan fungsi void_swap() yang digunakan untuk mempertukarkan data antara dua variabel bertipe int, float, dan struct TKontak. Walhasil, fungsi void_swap() bekerja dengan sangat baik. Berikut adalah hasil eksekusi dari program di atas.

image

Untuk mengatasi perbedaan ruang memori untuk masing-masing tipedata, maka kita harus memasukkan ukuran tipedata dari variabel yang akan kita pertukarkan datanya. Caranya dengan menggunakan fungsi sizeof().

Di dalam fungsi void_swap(), variabel tmp dideklarasikan sebagai void-pointer dan dialokasikan kepadanya ruang memori sebesar size menggunakan fungsi malloc(). Proses pertukaran data dilakukan dengan menggunakan fungsi memcpy(). Hal ini lebih aman dan lebih fleksibel karena diakui valid baik oleh kompiler C maupun C++.

 

MACRO swap(t, a, b)

Sekarang tibalah kita pada akhir tulisan ini yakni membahas tentang proses pertukaran data dengan tipe data sembarang menggunakan macro. Inilah bonus/tips yang saya janjikan di awal tulisan.

Langsung saja, berikut adalah macro swap yang dapat mempertukarkan data antara 2 variabel dengan tipe sembarang.

#define swap_m(a, b, t) { t tmp = a; a = b; b = tmp; }

Gantilah fungsi void_swap() diatas dengan macro ini dan Anda akan mendapatkan hasil eksekusi yang sama!😀

Mengapa macro seperti itu bisa berfungsi dengan baik? Karena macro C dapat menerima parameter berupa tipe data. Inilah rahasianya.😀

Nah, demikian yang dapat saya sampaikan. Semoga bermanfaat.

Selamat belajar dan selamat berkarya!

😀

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