Tuesday, May 13, 2014

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. :D
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 namaalamat dannomor telepon. Variabel kontak dalam hal ini biasa disebut sebagai record dengan tiga buah field yakni namaalamatdan nomor telepon.
Nah, langsung saja, mari kita simak kode program berikut ini.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include
#include
#include
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 yaituTKontak. 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 idkontaknamaalamat dantelepon.
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 perintahprintf("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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include
#include
#include
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:
1
2
3
4
5
6
void swap_kontak(TKontak *a, TKontak *b)
{
    TKontak temp = *a;
    *a = *b;
    *b = temp;
}
Dan dengan mengganti tiga baris perintah pertukaran data berikut ini,
1
2
3
temp = kontak1;
kontak1 = kontak2;
kontak2 = temp;
dengan perintah pemanggilan fungsi swap_kontak() seperti di bawah ini,
1
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 padaBagian 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include
#include
#include
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 intfloat, 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.
1
#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! :D
Mengapa macro seperti itu bisa berfungsi dengan baik? Karena macro C dapat menerima parameter berupa tipe data. Inilah rahasianya.

0 comments:

Post a Comment

Followers

  © Blogger template 'A Click Apart' by Ourblogtemplates.com 2008

Back to TOP