Halaman

Sabtu, 14 Desember 2013

Masalah dan Solusi Penggunaan Objek cin di Pemrograman C++

Pada bahasa pemrograman C++, cin (dibaca: see-in) merupakan objek dari kelas istream yang digunakan sebagai standar data masukan dari pengguna yang pada umumnya dilakukan melalui aplikasi console atau terminal (CLI).

Penggunaan objek cin pada kasus tertentu sering menimbulkan masalah terutama saat digunakan untuk membaca data masukan berupa kata yang lebih dari satu atau suatu kalimat (string) dan kombinasi karakter (char) dengan bilangan (int, float, double). Pada artikel ini saya akan menjelaskan sedikit tentang masalah ini dan solusinya.

Penggunaan header file <iostream> dan fungsi standar std
Objek cin memerlukan definisi header #include <iostream> dan penggunaan statement using namespace std untuk menggunakan fungsi-fungsi standar C++. Penggunaan header iostream adalah suatu keharusan dan penggunaan statement using namespace std adalah opsional bila Anda menggunakan fasilitas dari objek-objek input-output stream misalnya seperti cin dan cout. Namun bila tidak menggunakan statemen using namespace std, Anda bisa menuliskannya secara langsung di dalam kode programnya (dan bentuk seperti ini yang disarankan) dengan contoh penulisannya seperti ini: std::cout. Berikut contohnya:
  #include <iostream>
  
  int main() {
    std::cout << "Sedang belajar bahasa pemrograman C++" << std::endl;
    return 0;
  }

Oke, sekarang ke inti permasalahan penggunaan objek cin dan tentu saja dengan solusinya.

Permasalahan 1: Input kata lebih dari satu atau input sebuah kalimat
Objek cin bermasalah saat misalnya digunakan untuk menginputkan data berupa suatu kalimat atau kata lebih dari satu, misalkan nama provinsi yakni Jawa Tengah. String "Jawa Tengah" dapat dipisahkan menjadi tiga bagian yakni "Jawa", kemudian karakter spasi ' ', dan yang terakhir adalah "Tengah". Bagaimana objek cin membaca data masukan seperti ini? Silakan lihat kode program berikut beserta hasil keluarannya:
  #include <iostream>
  #include <string>
  
  int main() {
    string provinsi;
    int jumlahKab = 0;
    
    std::cout << "Masukan suatu provinsi: ";
    std::cin >> provinsi;
    std::cout << "Jumlah kabupatennya: ";
    std::cin >> jumlahKab;
    std::cout << "Provinsi " << provinsi << " memiliki " 
              << jumlahKab << " kabupaten" << std::endl;
    return 0;
  }
  

Berikut ini adalah salah satu contoh hasil keluaran dari kode program di atas:

Permasalahan objek cin menerima masukan kata lebih dari satu


Terlihat hasil keluarannya menjadi berantakan, yakni user tidak memiliki kesempatan untuk memasukan data kedua yakni jumlah kabupaten dan hasilnya langsung ditampilkan di sebelahnya.

Solusi untuk hal ini adalah dengan menggunakan fungsi standar C++ yakni getline(). Saat dipanggil, fungsi ini membutuhkan dua argumen yang perlu Anda sediakan, yakni argumen pertama adalah objek cin dan yang kedua adalah variabel dengan tipe data string. Header fungsi getline() memiliki bentuk:
  istream& getline(istream& istreamObject, string& stringObject);
  

Untuk mengatasi masalah di atas, kode programnya sedikit mengalami perubahan menjadi:
    #include <iostream>
    #include <string>

    int main() {
      std::string provinsi;
      int jumlahKab;

      std::cout << "Masukan suatu provinsi: ";
      std::getline(std::cin, provinsi); // ubah di sini
      std::cout << "Jumlah kabupatennya: ";
      std::cin >> jumlahKab;
      std::cout << "Provinsi " << provinsi << " memiliki " 
                << jumlahKab << " kabupaten" << std::endl;

      return 0;
    }
  

Hasil keluarannya adalah seperti yang diharapkan:

Solusi dengan memakai fungsi getline()


Permasalahan 2: Kombinasi objek cin dengan method cin.get()
Pada umumnya method cin.get() digunakan untuk mendapatkan suatu karakter tertentu. Berbeda dengan cin, method cin.get() ini dapat membaca karakter spasi maupun enter. Biasanya cin.get() digunakan untuk menahan aplikasi agar tidak langsung keluar dari sistem. Berikut contoh penggunaannya:
  #include <iostream>

  int main() {
    std::cout << "Untuk keluar program tekan tombol Enter...";
    std::cin.get();
    std::cout << "Keluar program...\n";

    return 0;
  }
  

Penggunaan objek cin dan method cin.get() secara bersamaan dapat menimbulkan masalah yakni saat misalnya setelah memasukan data tertentu melalui objek cin maka karakter '\n' atau newline yang tersimpan dalam keyboard buffer akan langsung dipakai oleh method cin.get() ini. Karakter '\n' atau newline ini dihasilkan saat menekan tombol enter setelah memasukan suatu nilai pada objek cin. Untuk lebih jelasnya silakan lihat kode program berikut:
  #include <iostream>

  int main() {
    char kelasPraktikum;
    int kodeReg;

    std::cout << "Masukan kode bilangan registrasi Anda: ";
    std::cin >> kodeReg;
    std::cout << "Pilih kelas praktikum C++ (A/B/C/D)\n";
    std::cout << "Atau kosongi untuk membatalkan: ";
    std::cin.get(kelasPraktikum);

    if (kelasPraktikum != '\n') {
      std::cout << "Anda telah terdaftar di kelas " << kelasPraktikum << std::endl;
    }
    else {
      std::cout << "Anda membatalkan pemilihan kelas praktikum C++" << std::endl;
    }

    return 0;
  }
  

Hasilnya tidak seperti yang diharapkan yakni data yang dibaca melalui method cin.get() tidak dieksekusi yakni Anda tidak memiliki kesempatan memilih kelas praktikum C++. Berikut contoh keluarannya:

Permasalahan saat objek cin digunakan bersamaan dengan method cin.get()


Solusi untuk masalah ini adalah dengan menggunakan method cin.ignore(). Method ini akan melewatkan karakter newline ('\n') yang tersimpan pada keyboard buffer saat Anda menekan tombol enter sehingga method cin.get() dapat menerima data masukan selanjutnya. Method cin.ignore() ini perlu Anda tuliskan diantara input cin dan cin.get(). Berikut contoh kode programnya hasil revisi kode program di atas:
   #include <iostream>

   int main() {
     char kelasPraktikum;
     int kodeReg;

     std::cout << "Masukan kode bilangan registrasi Anda: ";
     std::cin >> kodeReg;
     std::cin.ignore(); // Tambahkan statemen ini
     std::cout << "Pilih kelas praktikum C++ (A/B/C/D)\n";
     std::cout << "Atau kosongi untuk membatalkan: ";
     std::cin.get(kelasPraktikum);

     if (kelasPraktikum != '\n') {
       std::cout << "Anda telah terdaftar di kelas " << kelasPraktikum << std::endl;
     }
     else {
       std::cout << "Anda membatalkan pemilihan kelas praktikum C++" << std::endl;
     }

     return 0;
   }
 

Hasilnya seperti yang diharapkan yakni Anda memiliki kesempatan memasukan data masukan kedua yakni pemilihan kelas praktikum C++. Tampilannya dapat dilihat pada gambar dibawah ini:

Solusi dengan memakai method cin.ignore()


Demikian tutorial singkat dari saya, semoga bermanfaat dan selamat belajar bahasa pemrograman C++.

© 2013 husnanlabs.blogspot.com

2 komentar:

  1. gan, saya masih kurang paham tentang cin.ignore. mohon penjelasan nya thanks :)

    BalasHapus
  2. kalo ngga pake using namespace std akan repot krn harus mengulang2 menulis "std::"

    BalasHapus