Anda di halaman 1dari 11

STRUCT-3

A. TUJUAN PEMBELAJARAN
1. Memahami penggunaan Struktur pada pointer (pointer to stuct)
B. DASAR TEORI
Jika sebuah struktur mengandung banyak field dan diputuskan bahwa keseluruhan
field-nya akan diubah oleh fungsi, maka cara yang efisien adalah dengan melewatkan
(passing) alamat dari struktur. Dengan demikian pada pendefinisian fungsi, parameter
formalnya berupa pointer yang menunjuk ke struktur.
Masalah pointer ke struktur dapat diterapkan dalam program sebelumnya.
Argumen dari fungsi tukar_xy() dapat disederhanakan menjadi satu argumen saja,
yakni sebagai berikut :
void tukar_xy(struct koordinat *pos_xy)
{
int z;

z = (*pos_xy).x;
(*pos_xy).x = (*pos_xy).y;
(*pos_xy).y = z;
}
Pada definisi fungsi di atas,
struct koordinat *pos_xy
menyatakan bahwa pos_xy adalah pointer yang menunjuk ke obyek bertipe struktur
koordinat. Adapun penulisan :
(*pos_xy).x
menyatakan : elemen bernama x yang ditunjuk oleh pointer pos_xy

Perlu diperhatikan bahwa penulisan tanda kurung seperti pada contoh(*pos_xy).x


merupakan suatu keharusan.
Sebab
*pos_xy.x

mempunyai makna yang berbeda dengan


(*pos_xy).x
Ungkapan *pos_xy.x mempunyai makna yaitu : "yang ditunjuk oleh pos_xy.x"
(sebab operator titik mempunyai prioritas yang lebih tinggi daripada operator *).

#include <stdio.h>

struct koordinat
{
int x;
int y;
};
void tukar_xy(struct koordinat *);

main(
{
struct koordinat posisi;
printf("Masukkan koordinat posisi (x, y) : ");
scanf("%d, %d", &posisi.x, &posisi.y);
printf("x, y semula = %d, %d\n", posisi.x,posisi.y);
tukar_xy(&posisi);
printf("x,y sekarang= %d, %d\n", posisi.x,posisi.y);
}
void tukar_xy(struct koordinat *pos_xy)
{
int z;

z = (*pos_xy).x;
(*pos_xy).x = (*pos_xy).y;
(*pos_xy).y = z;
}

Contoh eksekusi :
Masukkan koordinat posisi (x, y) : 34, 21
x, y semula = 34, 21
x, y sekarang = 21, 34

Bentuk semacam :
(*pos_xy).x
dapat ditulis dengan bentuk lain menjadi
pos_xy->x
Dalam C operator -> (berupa tanda minus - diikuti dengan tanda lebih dari >) disebut
sebagai operator panah. Dengan menggunakan operator panah, maka fungsi
tukar_xy() dalam program posisi2.c dapat ditulis menjadi
void tukar_xy(struct koordinat *pos_xy)
{
int z;

z = pos_xy->x;
pos_xy->x = pos_xy->y;
pos_xy->y = z;
}

C. PERCOBAAN
1. Untuk semua program yang ada di modul teori Struktur 2 :
o Ketikkan kembali program-program tsb
o Jalankan programnya
o Analisis & buatlah kesimpulan terhadap program-program tsb
a. Listing program
#include <stdio.h>
#include <stdlib.h>

struct koordinat
{
int x;
int y;
};
void tukar_xy(struct koordinat *);
int main()
{
struct koordinat posisi;

printf("Masukkan koordinat posisi (x, y) : ");


scanf("%d, %d", &posisi.x, &posisi.y);

tukar_xy(&posisi);

printf("x, y sekarang = %d, %d\n", posisi.x, posisi.y);


return 0;
}
void tukar_xy(struct koordinat *pos_xy)
{
int z;

z = (*pos_xy).x;
(*pos_xy).x = (*pos_xy).y;
(*pos_xy).y = z;
}
b. Capture

2. Dengan menggunakan typedef, buatlah tipe data struct untuk menyimpan informasi
pegawai (misal tipe pegawai) berupa : no ID, nama, tgl lahir, jenis kelamin (L/P)
dan gaji/bulan.
o di main() deklarasikan sebuah var bertipe array of pegawai (missal
emp[])
o panggil fungsi input() untuk memasukkan data-datanya dengan
pengiriman parameter secara pass by reference
o panggil fungsi tampil() untuk menampilkan semua data yang telah
o diinputkan dengan pengiriman parameter secara pass by reference
Petunjuk :
o Untuk no id, gunakan auto increment (tanpa input) perhatikan contoh tampilan
o Jika diperlukan, gunakan fungsi strcpy() dari <string.h>
o Contoh input bisa dilihat pada gambar 31.1 dengan output pada gambar 31.2

a. Listing program
#include <stdio.h>
#include <stdlib.h>

#define MAX 35

struct dob
{
int day, month, year;
};
struct data
{
struct dob birthday;
char name[MAX];
char gender;
int id;
float salary;
};
typedef struct data karyawan;
void input(karyawan *);
void tampil(karyawan *);
int jml_data;
void title_program();

int main()
{
karyawan data[MAX];

title_program();

printf("Berapa jumlah pegawai? ");


scanf("%d", &jml_data);

input(data);
tampil(data);
return 0;
}
void input(karyawan *data)
{
int i;

for(i=0; i<jml_data; i++)


{
printf("\nData pegawai ke-%d\n", i+1);
fflush(stdin);
printf("Nama\t\t\t: ");
scanf("%s", (*data).name);
fflush(stdin);
printf("Tgl lahir(dd-mm-yyyy)\t: ");
scanf("%d-%d-%d", &(*data).birthday.day,
&(*data).birthday.month, &(*data).birthday.year);
fflush(stdin);
printf("Jenis kelamin [L/P]\t: ");
scanf("%c", &(*data).gender);
fflush(stdin);
printf("Gaji/bln\t\t: ");
scanf("%f", &(*data).salary);
fflush(stdin);
data++;
}
printf("\n");
}
void tampil(karyawan *data)
{
int i;

printf("Data pegawai yang telah diinputkan\n");


for(i=0; i<jml_data; i++)
{
printf("\nNo. id\t\t: %d\n", i+1);
printf("Nama\t\t: %s\n", (*data).name);
printf("Tgl lahir\t: %d-%d-%d\n", (*data).birthday.day,
(*data).birthday.month, (*data).birthday.year);
if((*data).gender=='L' || (*data).gender=='l')
printf("Jenis kelamin\t: Laki-Laki\n");
else if ((*data).gender=='P' || (*data).gender=='p')
printf("Jenis kelamin\t: Perempuan\n");
else
(*data).gender=0;
printf("Gaji/bln\t: Rp. %0.2f,-\n", (*data).salary);
data++;
}
}
void title_program()
{
puts("\tPROGRAM PENYIMPAN INFORMASI");
puts("\t PARA PEGAWAI");
puts("");
}
b. Capture
3. Modifikasi program dari modul STRUCT 2 soal no 1.
o Ubah nama tipe data dengan menggunakan typedef
o Panggillah fungsi input() dan tampil() dengan cara pass by reference
Petunjuk :
o Untuk soal nomor 2 & 3, perhatikan cara membaca array dengan
menggunakan pointer, buka kembali modul teori pointer to array
a. Listing program
#include <stdio.h>
#include <stdlib.h>

#define MAX 35

void title_program();
struct data{
char nama[MAX];
float n_tugas, n_uts, n_uas;
};
typedef struct data mahasiswa;
void input(mahasiswa *);
void tampil(mahasiswa *);
int jml_mhs;

int main()
{
mahasiswa nilai[MAX];

title_program();

printf("Berapa jumlah mahasiswa? ");


scanf("%d", &jml_mhs);

input(nilai);
tampil(nilai);
return 0;
}
void title_program()
{
puts("\t MENGHITUNG NILAI AKHIR");
puts("\tMATA KULIAH KONSEP PEMROGRAMAN");
puts("");
}
void input(mahasiswa *nilai)
{
int i;

printf("\nMasukkan DATA Mahasiswa\n");


for(i=0; i<jml_mhs; i++)
{
printf("Mahasiswa ke-%d\n", i+1);
fflush(stdin);
printf("Nama\t\t: ");
gets((*nilai).nama);
fflush(stdin);
printf("Nilai tugas\t: ");
scanf("%f", &(*nilai).n_tugas);
fflush(stdin);
printf("Nilai uts\t: ");
scanf("%f", &(*nilai).n_uts);
fflush(stdin);
printf("Nilai uas\t: ");
scanf("%f", &(*nilai).n_uas);
fflush(stdin);
nilai++;
}
}
void tampil(mahasiswa *nilai)
{
int j;
float akhir;
char grade;

printf("\n\t\t\tDAFTAR NILAI\n");
printf("\t\tMATAKULIAH KONSEP PEMROGRAMAN\n");

printf("=========================================================
====\n");
printf("No\tNama\t\tTugas\tUTS\tUAS\tAkhir\tGrade\n");

printf("=========================================================
====");
for(j=0; j<jml_mhs; j++)
{

akhir=(0.2*(*nilai).n_tugas)+(0.4*(*nilai).n_uts)+(0.4*(*nilai).n
_uas);
if(akhir>=80)
grade='A';
else if((akhir<80)&&(akhir>=70))
grade='B';
else if((akhir<70)&&(akhir>=60))
grade='C';
else if((akhir<60)&&(akhir>=50))
grade='D';
else if(akhir<50)
grade='F';
else
grade=0;

printf("\n%d\t%s\t%2.0f\t%2.0f\t%2.0f\t%0.2f\t%c", j+1,
(*nilai).nama, (*nilai).n_tugas, (*nilai).n_uts, (*nilai).n_uas,
akhir, grade);
nilai++;
}

printf("\n=======================================================
======");
printf("\nTotal Mahasiswa\t= %d\n", jml_mhs);
}
b. Capture

4. Untuk soal no 3 diatas, pada tampilan output, tambahkan


informasi : nama & nilai akhir mahasiswa yang tertinggi
(lihat contoh)
Petunjuk:
o buatlah tipe data struct baru misal dengan nama
maks dengan 2 field : nama & nilai untuk
menyimpan informasi mahasiswa dengan nilai
tertinggi.
o Sertakan <string.h> agar bisa menggunakan
fungsi strcpy() untuk mengcopy nama
o Contoh input bisa dilihat pada gambar 31.3 dengan output pada gambar 31.4
a. Listing program
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 35

void title_program();
struct data{
char nama[MAX];
float n_tugas, n_uts, n_uas;
};
struct maksimal
{
char nama[MAX];
float nilaimaks;
};
typedef struct data mahasiswa;
void input(mahasiswa *);
void tampil(mahasiswa *);
int jml_mhs;

int main()
{
mahasiswa nilai[MAX];

title_program();

printf("Berapa jumlah mahasiswa? ");


scanf("%d", &jml_mhs);

input(nilai);
tampil(nilai);
return 0;
}
void title_program()
{
puts("\t MENGHITUNG NILAI AKHIR");
puts("\tMATA KULIAH KONSEP PEMROGRAMAN");
puts("");
}
void input(mahasiswa *nilai)
{
int i;

printf("\nMasukkan DATA Mahasiswa\n");


for(i=0; i<jml_mhs; i++)
{
printf("Mahasiswa ke-%d\n", i+1);
fflush(stdin);
printf("Nama\t\t: ");
gets((*nilai).nama);
fflush(stdin);
printf("Nilai tugas\t: ");
scanf("%f", &(*nilai).n_tugas);
fflush(stdin);
printf("Nilai uts\t: ");
scanf("%f", &(*nilai).n_uts);
fflush(stdin);
printf("Nilai uas\t: ");
scanf("%f", &(*nilai).n_uas);
fflush(stdin);
nilai++;
}
}
void tampil(mahasiswa *nilai)
{
int j;
float akhir;
char grade;
struct maksimal nilaimahasiswa;

printf("\n\t\t\tDAFTAR NILAI\n");
printf("\t\tMATAKULIAH KONSEP PEMROGRAMAN\n");

printf("=========================================================
====\n");
printf("No\tNama\t\tTugas\tUTS\tUAS\tAkhir\tGrade\n");

printf("=========================================================
====");
for(j=0; j<jml_mhs; j++)
{

akhir=(0.2*(*nilai).n_tugas)+(0.4*(*nilai).n_uts)+(0.4*(*nilai).n
_uas);

if(j==0 || nilaimahasiswa.nilaimaks<akhir)
{
strcpy(nilaimahasiswa.nama, (*nilai).nama);
nilaimahasiswa.nilaimaks=akhir;
}

if(akhir>=80)
grade='A';
else if((akhir<80)&&(akhir>=70))
grade='B';
else if((akhir<70)&&(akhir>=60))
grade='C';
else if((akhir<60)&&(akhir>=50))
grade='D';
else if(akhir<50)
grade='F';
else
grade=0;

printf("\n%d\t%s\t%2.0f\t%2.0f\t%2.0f\t%0.2f\t%c", j+1,
(*nilai).nama, (*nilai).n_tugas, (*nilai).n_uts, (*nilai).n_uas,
akhir, grade);
nilai++;
}
printf("\n=======================================================
======");
printf("\nTotal Mahasiswa\t= %d\n", jml_mhs);
printf("NILAI TERTINGGI\n");
printf("Nama mahasiswa\t: %s\n", nilaimahasiswa.nama);
printf("Nilai\t\t: %0.2f\n", nilaimahasiswa.nilaimaks);
}
b. Capture

D. LAPORAN RESMI
1. Untuk setiap listing program dari percobaan-percobaan di atas, ambil capture
outputnya.
2. Tuliskan kesimpulan dari percobaan yang telah anda lakukan.
E. KESIMPULAN
1. Jika sebuah struktur mengandung banyak field dan diputuskan bahwa keseluruhan
field-nya akan diubah oleh fungsi, maka cara yang efisien adalah dengan melewatkan
(passing) alamat dari struktur. Dengan demikianlah pada pendefinisian fungsi,
parameter formalnya berupa pointer yang menunjuk ke struktur (pointer to struct).

Anda mungkin juga menyukai