Rabu, 29 Juni 2016

Pertemuan 9

A.    Konversi Nilai String Menjadi Numerik atau Sebaliknya

Semua nilai yang dimasukan melalui keyboard pada dasarnya adalah karakter atau rangkaian karakter (string). Nilai numerik yang dimasukan menggunakan fungsi standar scanf, cscanf, fscanf, gets dan cin pada dasarnya adalah nilai string yang telah mengalami proses konversi dari string menjadi bilangan bulat integer atau bilangan real (floating point dan double). Agar kita bisa menggunakan fungsi getString yang telah kita buat untuk memasukan data numerik, maka string yang dimasukan melalui fungsi getString harus dikonversi menjadi numerik. Begitu juga sebaliknya, untuk menampilkan data numerik menggunakan fungsi anggota writeString dari class Screen, maka data tersebut harus dikonversi menjadi representasi stringnya. Berikut ini adalah fungsi-fungsi konversi yang dapat kita gunakan.

// Konversi string s menjadi bentuk numerik integer-nya
int atoi(const char *s);
// Konversi string s menjadi bentuk numerik double-nya
double atof(const char *s);
// Konversi numerik double menjadi representasinya dalam bentuk
// null terminated string
char *gcvt(double value, int ndec, char *buf);

Fungsi atoi digunakan untuk mengkonversi nilai numerik integer dalam bentuk representasi string menjadi bilangan numerik integer sebenarnya. Prototype fungsi atoi dideklarasikan pada file header stdlib.h. Fungsi atof digunakan untuk mengubah nilai numerik float dan double dalam bentuk representasi string menjadi nilai numerik double yang sesungguhnya. Prototype fungsi atof dideklarasikan dalam file header math.h. Jika fungsi atoi dan atof digunakan untuk mengkonversi nilai numerik dalam representasi string menjadi nilai numerik sesungguhnya, maka fungsi gcvt digunakan untuk mengubah nilai numerik menjadi representasi stringya.

Untuk lebih memahami ketiga fungsi konversi yang telah dibahas sebelumnya, berikut ini adalah contoh program untuk mempraktekkan ketiga fungsi tersebut. Simpan program berikut ini dengan nama project contoh16.ide pada direktori yang sama dengan file screen.cpp. Pada saat pembuatan project, pilihlah mode Emulation atau Floating Point pada group box Math Support di jendela New Target. Hal ini dilakukan karena pada program contoh16.cpp akan dilakukan perhitungan bilangan numerik real.

contoh16.
#include <math.h> /* Deklarasi prototype atof */
 #include <stdlib.h> /* Deklarasi prototype gcvt */
 #include "screen.cpp" /* Fungsi anggota writeString */

 #define KEY_INT 0x16 /* Nomor interupsi keyboard */
 #define KEY_BACKSPACE 0x08 /* Tombol Backspace */
 #define KEY_RETURN 0x0d /* Tombol Enter */
 #define KEY_TAB 0x09 /* Tombol Tab */
 #define KEY_SPACE 0x20 /* Tombol spasi */

 #define NULL 0x00 /* ASCII 0 */
 #define TRUE 1

 UCHAR *getString(Screen *scr, UCHAR *str, UCHAR max);

 int main(void)
 {
 Screen *layar = new Screen();
 double luas, keliling, jari2;
 UCHAR *str, str2[16];

 layar->setMode(0x03);
 layar->setCursorPos(5, 10);
 layar->writeString("Luas dan Keliling Lingkaran");
 layar->setCursorPos(6, 10);
 layar->writeString("---------------------------");
 layar->setCursorPos(8, 10);
 layar->writeString("Panjang jari-jari ="); 44

 layar->setCursorPos(8, 30);



Perhatikanlah baris 35 pada program contoh16.cpp! Pada baris tersebut, nilai str yang sebelumnya dimasukkan menggunakan fungsi getString diubah menjadi nilai numerik yang sesungguhnya lalu disimpan dalam variabel jari2. Kemudian perhatikan baris 46. Pada baris 46 tertulis gcvt(luas, 10, str). Maksudnya adalah nilai dari variabel luas akan diubah menjadi representasi stringnya yang disimpan pada variabel str. Banyak karakter yang dapat ditampung adalah 10 karakter. Demikian juga yang dilakukan pada baris 54.

B.     Membuat Class untuk Operasi pada Keyboard
Setelah memahami teknik-teknik memasukan data melalui keyboard menggunakan teknik inline assembly, pada sub bab ini akan dibuat pustaka class (class library) yang mengenkapsulasi semua fungsi operasi keyboard yang telah dibuat sebelumnya. Jadi, fungsi getKey, getSpecialKey, getString, getPwdString dan getKeyState akan menjadi fungsi anggota class Keyboard. Class Keyboard akan bertindak seperti class Screen pada file screen.cpp, yaitu menyediakan antarmuka untuk operasi input menggunakan keyboard. Pada class Keyboard akan ditambahkan dua fungsi anggota baru, yaitu fungsi hideCursor (untuk menyembunyikan kursor) dan fungsi showCursor (untuk menampilkan kursor). Karena class Keyboard yang akan dibuat menggunakan class Screen maka file kode program class Keyboard, keyboard.cpp, harus disimpan dalam direktori yang sama. Berikut ini adalah kode program class Keyboard.

keyboard.cpp:
 /*
 keyboard.cpp

*/

 #define KEY_INT 0x16 /* Nomor interupsi keyboard */
 #define KEY_BACKSPACE 0x08 /* Tombol Backspace */
 #define KEY_RETURN 0x0d /* Tombol Enter */
 #define KEY_TAB 0x09 /* Tombol Tab */
 #define KEY_SPACE 0x20 /* Tombol spasi */

 #define STATE_RSHIFT 0x01 /* Status Shift Kanan */
 #define STATE_LSHIFT 0x02 /* Status Shift Kiri */
 #define STATE_CTRL 0x04 /* Status CTRL */
 #define STATE_ALT 0x08 /* Status ALT */
 #define STATE_SCROLL 0x10 /* Status Scroll Lock */
 #define STATE_NUM 0x20 /* Status Num Lock */
 #define STATE_CAPS 0x40 /* Status Caps Lock */
 #define STATE_INS 0x80 /* Status INS */

 #define NULL 0 /* ASCII 0 */
 #define TRUE 1

 class Keyboard
 {
 private:
 Screen *screen;

Untuk mempraktekkan cara menggunakan class Keyboard, berikut ini akan diberikan contoh program. Program berikut ini adalah program sederhana untuk menghitung besar beda potensial dengan mengalikan besar tahanan dengan besar arus listrik. Pengguna hanya harus memasukan nilai kuat arus listrik dan besar tahanan. Simpan project contoh17.ide dan kode program contoh17.cpp berikut ini pada direktori yang sama dengan file screen.cpp dan keyboard.cpp.

contoh17.cpp:
 #include <math.h>
 #include <stdlib.h>
 #include "screen.cpp"
 #include "keyboard.cpp"

 int main(void)
 {
 Screen *layar = new Screen();
 Keyboard *tombol = new Keyboard(layar);

 unsigned long int v, i, r;
 UCHAR *str, str2[16];

 layar->setMode(0x03);
 layar->setCursorPos(5, 14);
 layar->writeString("Menghitung Beda Potensial");
 layar->setCursorPos(7, 14);
 layar->writeString("Besar arus (ampere) =");
 layar->setCursorPos(7, 38);

 str = tombol->getString(str2, 10);
 i = atoi(str);

 layar->setCursorPos(8, 14);
 layar->writeString("Besar tahanan (ohm) =");
 layar->setCursorPos(8, 38);

 str = tombol->getString(str2, 10);
 r = atoi(str);
 v = i * r;
gcvt(v, 10, str2);

 layar->setCursorPos(9, 14);
 layar->writeString("Beda potensial (volt) =");
 layar->setCursorPos(9, 38);
 layar->writeString(str2);
 layar->setCursorPos(11, 14);
 layar->writeString("Tekan SHIFT ...");
 tombol->hideCursor();

 while (TRUE)
 {
 if ((tombol->getKeyState(STATE_RSHIFT)) ||
 (tombol->getKeyState(STATE_LSHIFT)))
 break;
 }

 delete layar; delete tombol;
 return EXIT_SUCCESS;

 }

Tidak ada komentar:

Posting Komentar