Mengolah Data Array dengan File Text


Untuk mempelajari pengolahan data array dengan file text, kita akan mencoba membuat aplikasi administrasi data mahasiswa dengan tampilan berikut:

bab10.1
bab10.1a

Gambar 1. Tampilan Aplikasi dan file text inputan

Setelah membuat project baru dengan MFC, langkah pertama adalah membuat tampilan aplikasi dan file mahasiswa.txt seperti pada gambar 1. Seperti yang kita pelajari sebelumnya, file text sebaiknya dibuat pada folder project dimana terdapat file-file lain seperti file .cpp dan file .h. Penempatan pada folder project menjadi penting agar tidak terjadi kesalahan apabila project tersebut anda pindahkan atau salin di tempat berbeda.

Kemudian buatlah variabel untuk masing-masing objek dengan tipe data yang sesuai. Pada contoh ini penggunaan tipe data dari masing-masing variabel dapat dilihat pada tabel berikut:

Jenis Object Nama Variabel Tipe Data
Edit Box edit_nim int
Edit Box edit_nama CString
Edit Box edit_uts int
Edit Box edit_uas int
Edit Box edit_tugas int
Static Text static_total float
Static Text static_grade CString

Tabel 1. Variabel dan tipe data object dialog

Langkah selanjutnya yang kita lakukan adalah membuat array untuk menampung data mahasiswa tersebut. Agar array yang kita buat nantinya berlaku di semua fungsi (global), maka pembuatan array kita lakukan pada file header milik kotak dialog(file header berakhiran Dlg). Pada contoh aplikasi ini file headernya adalah ArrayMahasiswaDlg.h. File header tersebut bergantung pada nama project yang anda gunakan. Masukkan kode deklarasi array berikut pada bagian public dari file header tersebut:

struct Mahasiswa
{
int NIM;
CString Nama;
int UTS;
int UAS;
int Tugas;
};//Deklarasi tipe bentukan mahasiswa
typedef Mahasiswa TabMhs[100];//deklarasi array tipe bentukan TabMhs
TabMhs Mhs;//deklarasi variabel array tipe bentukan Mhs
int i;//menampung indeks array
int n;//menampung jumlah elemen array

Array tersebut akan kita isi dengan data dari file text. Pembacaan data kita lakukan pada awal aplikasi, sehingga perlu dibuat pada fungsi OnInitDialog(). Masukkan kode program berikut setelah “// TODO: Add extra initialization here “ dan “return TRUE”.

FILE *Fin;
fopen_s(&Fin,"mahasiswa.txt","r");
char x[30];
fscanf_s(Fin,"%d\n",&n);
for (i=1;i<=n;i++)
{
fgets(x,30,Fin);
fscanf_s(Fin,"%d",&Mhs[i].NIM);
fscanf_s(Fin,"%d",&Mhs[i].UTS);
fscanf_s(Fin,"%d",&Mhs[i].UAS);
fscanf_s(Fin,"%d\n",&Mhs[i].Tugas);
Mhs[i].Nama = x;
}
fclose(Fin);

Perhatikan bahwa urutan pembacaan berdasarkan urutan data pada file text. Data yang pertama dibaca adalah jumlah elemen array dan dilanjutkan dengan pengisian array menggunakan perulangan for. Setelah data masuk ke dalam variabel array, selanjutnya adalah mengisikan nilai array tersebut kedalam variabel dialog, menghitung nilai dan grade serta menampilkannya di layar. Tentu saja data yang ditampilkan pada awal dialog adalah data array pertama (i=1). Karena proses pengisian array, penghitungan nilai dan grade serta menampilkannya ke layar ini nantinya akan dilakukan beberapa kali, maka buatlah fungsi baru misal dengan nama hitungnilai(). Seperti yang pernah dipelajari sebelumnya, untuk pembuatan fungsi global dengan cara right-click pada class dialog pada class view (pada contoh ini class dialog adalah CArrayMahasiswaDlg), kemudian add function. Ubah return type menjadi void, kosongkan parameter type serta beri nama fungsi pada bagian function name.

bab10.2
bab10.2a

Gambar 2. Membuat fungsi global

Setelah pembuatan fungsi selesai, isikan kode program berikut pada fungsi tersebut:

//mengisikan nilai array ke dalam variabel dialog
EditNomor=i;
EditNim = Mhs[i].NIM;
EditNama= Mhs[i].Nama;
EditUTS = Mhs[i].UTS;
EditUAS = Mhs[i].UAS;
EditTugas = Mhs[i].Tugas;
//menghitung nilai
StaticNilai=0.3*EditUTS+0.4*EditUAS + 0.3*EditTugas;
//menghitung grade
if(StaticNilai>=80)
StaticGrade="A";
else
if((StaticNilai>=65)&&(StaticNilai<80))
StaticGrade="B";
else
if((StaticNilai>=50)&&(StaticNilai<65))
StaticGrade="C";
else
if((StaticNilai>=40)&&(StaticNilai<50))
StaticGrade="D";
else
StaticGrade="E";
UpdateData(FALSE);//mengupdate nilai variabel agar muncul di dialog

Selanjutnya kita kembali pada fungsi OnInitDialog(), tambahkan kode program berikut sebelum “return TRUE”:

//menampilkan data pertama array pada kotak dialog
i=1;
HitungNilai();

Jalankan aplikasi anda, maka data array pertama akan muncul pada dialog. Apabila terjadi kesalahan, cek kembali folder dari file text anda danurutan dari penulisan data pada file text.

Setelah berhasil menampilkan data pertama dari array, untuk dapat melihat data lainnya maka tugas kita selanjutnya adalah membuat fungsi pada tombol next dan previous. Buat fungsi pada tombol next, kemudian isikan kode program berikut:

UpdateData(TRUE);
i=EditNomor;//nilai i diisi dengan edit box edit nomor
if((i>=1)&&(i<n))//isi nilai i dengan i+1
i=i+1;
else
i=n;//isi nilai i dengan n apabila indeks >n
HitungNilai();

Buat juga fungsi pada tombol previous dan isikan dengan kode program berikut:

UpdateData(TRUE);
i=EditNomor;
if((i>1)&&(i<=n))
i=i-1;
else
i=1;//untuk i < 1, isi nilai i dengan 1
HitungNilai();

Jalankan aplikasi anda, coba tombol next dan previous apakah sudah berfungsi sesuai yang kita harapkan.

Agar nantinya proses penambahan tidak dilakukan ketika data ditampilkan di awal ataupun ketika menggunakan tombol next dan previous, maka sebaiknya semua edit box di nonaktifkan (disable). Caranya adalah mengubah masing-masing properties disable dari edit box menjadi true.

Selanjutnya adalah membuat fungsi menambahkan data array mahasiswa. Buat fungsi pada tombol tambah, kemudian isikan dengan kode program berikut:

//mengaktifkan kembali edit box kecuali edit box nomor
GetDlgItem(IDC_EDIT2)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT3)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT4)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT5)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT6)->EnableWindow(TRUE);
//menyembunyikan tombol next dan previous
GetDlgItem(IDC_BUTTON1)->ShowWindow(FALSE);
GetDlgItem(IDC_BUTTON2)->ShowWindow(FALSE);
//mengosongkan kotak dialog dan mengisi edit nomor dengan data baru
UpdateData(TRUE);
EditNomor= n+1;
EditNim=0;
EditNama="";
EditUTS=0;
EditUAS=0;
EditTugas=0;
StaticNilai=0;
StaticGrade="";
UpdateData(FALSE);
GetDlgItem(IDC_EDIT2)->SetFocus();//membuat fokus pada edit box NIM

Untuk menyimpan data ke dalam file text, buat fungsi pada tombol simpan, kemudian isikan kode program berikut:

UpdateData(TRUE);
//mengisi array n dengan variabel pada kotak dialog
n= EditNomor;
Mhs[n].NIM=EditNim;
Mhs[n].Nama=EditNama;
Mhs[n].UTS=EditUTS;
Mhs[n].UAS=EditUAS;
Mhs[n].Tugas=EditTugas;
//menampilkan data baru pada kotak dialog
i=n;
HitungNilai();
//menyimpan data ke file text
FILE *Fout;
fopen_s(&Fout,"mahasiswa.txt","w");
fprintf_s(Fout,"%d\n",n);
for (i=1;i<=n;i++)
{
fwprintf_s(Fout,_T("%s\n"),Mhs[i].Nama);
fprintf_s(Fout,"%d %d %d %d\n",Mhs[i].NIM, Mhs[i].UTS, Mhs[i].UAS, Mhs[i].Tugas);
}
fclose(Fout);
MessageBox(_T("Data berhasil disimpan"),_T("Hasil"),MB_OK|MB_ICONINFORMATION);
//menampilkan kembali tombol next dan previous serta menonaktifkan kembali semua edit box
GetDlgItem(IDC_BUTTON1)->ShowWindow(TRUE);
GetDlgItem(IDC_BUTTON2)->ShowWindow(TRUE);
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT3)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT4)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT5)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT6)->EnableWindow(FALSE);

Jalankan aplikasi, coba masukkan data baru, apabila tidak terjadi kesalahan, kita lanjutkan pada pembuatan fungsi edit data. Pada prinsipnya fungsi edit data mirip dengan fungsi penambahan data. Perbedaannya hanya pada letak dari data array yang diubah, pada proses edit, perubahan dapat dilakukan pada elemen array manapun sedangkan pada penambahan terjadi perubahan pada jumlah elemen array dan pengisinan data terakhir. Kedua proses tersebut diakhiri dengan penyimpanan data ke file text melalui tombol simpan. Untuk itu kita perlu membuat variabel baru untuk menampung nilai variabel pembeda antara proses tambah dan edit. Pada contoh ini variabel tersebut diberi nama tombol dan bertipe integer. Variabel tersebut akan digunakan pada beberapa fungsi sehingga perlu dibuat variabel global. Right-click pada kotak dialog, pilih add variable, kemudian isikan nama variabelnya.

bab10.3
bab10.3a

Gambar 3. Membuat variabel global

Buat fungsi pada tombol edit data, kemudian masukkan kode program berikut pada fungsi tersebut:

tombol=2; //mengisi nilai tombol dengan 2 untuk edit data
//mengaktifkan kembali edit box kecuali edit box nomor
GetDlgItem(IDC_EDIT2)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT3)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT4)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT5)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT6)->EnableWindow(TRUE);
//menyembunyikan tombol next dan previous
GetDlgItem(IDC_BUTTON1)->ShowWindow(FALSE);
GetDlgItem(IDC_BUTTON2)->ShowWindow(FALSE);
//memfokuskan pada edit box NIM
GetDlgItem(IDC_EDIT2)->SetFocus();

Perhatikan pada kode program di atas, terdapat pengisian pada variabel tombol dengan nilai 2 untuk edit data, tambahkan juga pengisian variabel tombol tersebut pada fungsi dari tombol tambah dengan nilai 1. Selanjutnya ubahlah fungsi pada tombol simpan menjadi seperti berikut:

UpdateData(TRUE);
switch(tombol)
{
case 1:
{
//mengisi array n dengan variabel pada kotak dialog
n= EditNomor;
Mhs[n].NIM=EditNim;
Mhs[n].Nama=EditNama;
Mhs[n].UTS=EditUTS;
Mhs[n].UAS=EditUAS;
Mhs[n].Tugas=EditTugas;
//menampilkan data baru pada kotak dialog
i=n;
HitungNilai();
break;
}
case 2:
{
i=EditNomor;
Mhs[i].NIM=EditNim;
Mhs[i].Nama=EditNama;
Mhs[i].UTS=EditUTS;
Mhs[i].UAS=EditUAS;
Mhs[i].Tugas=EditTugas;
i=EditNomor;
HitungNilai();
break;
}
}
//menyimpan data ke file text
FILE *Fout;
fopen_s(&Fout,"mahasiswa.txt","w");
fprintf_s(Fout,"%d\n",n);
for (i=1;i<=n;i++)
{
fwprintf_s(Fout,_T("%s\n"),Mhs[i].Nama);
fprintf_s(Fout,"%d %d %d %d\n",Mhs[i].NIM, Mhs[i].UTS, Mhs[i].UAS, Mhs[i].Tugas);
}
fclose(Fout);
MessageBox(_T("Data berhasil disimpan"),_T("Hasil"),MB_OK|MB_ICONINFORMATION);
//menampilkan kembali tombol next dan previous serta menonaktifkan kembali semua edit box
GetDlgItem(IDC_BUTTON1)->ShowWindow(TRUE);
GetDlgItem(IDC_BUTTON2)->ShowWindow(TRUE);
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT3)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT4)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT5)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT6)->EnableWindow(FALSE);

Jalankan kembali aplikasi anda dan lihat apakah tombol tambah dan edit berfungsi dengan benar. Terakhir adalah membuat fungsi pada tombol hapus. Isikan kode program berikut pada fungsi tersebut:

//message box untuk konfirmasi penghapusan data
int pilihan= MessageBox(_T("Apakah anda yakin untuk menghapus data ini?"),_T("Konfirmasi"),MB_YESNO|MB_ICONQUESTION);
if (pilihan==IDNO)
MessageBox(_T("Penghapusan batal"));
else
{
UpdateData(TRUE);
//elemen array yang akan dihapus ditimpa dengan elemen selanjutnya dari array
//proses dilakukan sampai elemen array n-1
i= EditNomor;
for (i=EditNomor;i<=n-1;i++)
{Mhs[i].NIM=Mhs[i+1].NIM;
Mhs[i].Nama=Mhs[i+1].Nama;
Mhs[i].UTS=Mhs[i+1].UTS;
Mhs[i].UAS=Mhs[i+1].UAS;
Mhs[i].Tugas=Mhs[i+1].Tugas;
}
n=n-1;//jumlah elemen array berkurang 1
//menyimpan data array kedalam file text
FILE *Fout;
fopen_s(&Fout,"mahasiswa.txt","w");
fprintf_s(Fout,"%d\n",n);
for (i=1;i<=n;i++)
{
fwprintf_s(Fout,_T("%s "),Mhs[i].Nama);
fprintf_s(Fout,"%d %d %d %d\n",Mhs[i].NIM, Mhs[i].UTS, Mhs[i].UAS, Mhs[i].Tugas);
}
fclose(Fout);
MessageBox(_T("Data berhasil dihapus"),_T("Hasil"),MB_OK|MB_ICONINFORMATION);
//menampilkan nilai baru dari elemen yang dihapus
UpdateData(TRUE);
if ((i>=1)&&(i<n))
{i=EditNomor;}
if (i==n)
{i=EditNomor-1;}
HitungNilai();
}

Ujilah kembali aplikasi anda, apakah semua fungsi telah berjalan dengan benar. Apabila anda berhasil membuat aplikasi ini maka anda sudah mampu membuat aplikasi yang cukup kompleks. Sebagai bahan latihan, coba gabungkan dengan pembuatan menu pada pembahasan sebelumnya.

 

 

 


Leave a Reply