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!

😀

Iklan
Perihal

Cek situs kami di http://teknikelektrolinks.com. Blog Raspberry Pi: http://raspi.teknikelektrolinks.com

Tagged with: , , ,
Ditulis dalam C/C++, Software/Programming

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

Blog Stats
  • 1,298,580 hits

Bergabunglah dengan 2.490 pengikut lainnya

NEO STARDUINO
USB Relay USB-2REL
USB Relay USB-4REL
Water Level Control WLC-02
Serial Relay SER-4REL
NEO STARDUINO SMS ALARM

Alarm SMS Berbasis NEO STARDUINO

1 PC – 6 Unit USB-2REL

Testing 6 USB-2REL Pada 1 Komputer

Standard Pengujian USB-2REL

Pengujian USB-2REL Sebelum Dikirim

LPT-4REL on Knoppix 7.0.5

Testing LPT-4REL on Knoppix Linux

T101 Inkubator Telur

T101 Inkubator Penetas Telur

KONTROL PERALATAN LISTRIK VIA PORT LPT KOMPUTER

Demo Kontrol Kontaktor via Port LPT

STARDUINO meets ANDROID

Demo Kontrol Bluetooth Relay Android

STARDUINO SMS RELAY

Kontrol Relay Via SMS Dengan Starduino

STARDUINO WEB RELAY

Demo Kontrol Relay Via Web/Internet

JustBASIC USB-2REL Control

Demo Kontrol USB-2REL + JustBASIC

STARDUINO + GPS + LCD

Demo Starduino GPS Dengan LCD

USB-2REL EXTREME TEST

Demo Kontrol On/Off Lampu USB-2REL

THERMOSTAT T101 IN ACTION

Demo Thermostat T101 Pada SV=37.5°C

WATER LEVEL CONTROL WLC-02

Demo Kontrol Level Air Tandon WLC-02

HUMIDITY CONTROLLER H103

Demo Kontrol Kelembaban H103 (DHT11)

%d blogger menyukai ini: