Seri Tutorial Bahasa C – Bagian 10: Membuat Keluaran-keluaran Tertentu

Bagian ini menunjukkan pada Anda bagaimana program-program C dapat bermanfaat untuk menangani berkas-berkas, menggunakan sistem waktu, membangkitkan bilangan acak, dan membuat antarmuka grafis berupa sebuah jendela sederhana.

Catatan:

  • Silahkan Anda mengeklik icon menu     untuk berpindah subbagian.
  • Video pelengkap dalam tutorial ini akan lebih jelas dilihat dengan resolusi 720p dan mode Full screen.

10.1. Membuat Sebuah Berkas

10.1. Membuat Sebuah Berkas
10.2. Membaca dan Menulis Karakter
10.3. Membaca dan Menulis Baris
10.4. Membaca dan Menulis Berkas
10.5. Memindai Aliran Berkas (Filestream)
10.6. Melaporkan Kesalahan-kesalahan
10.7. Menggunakan Tanggal dan Waktu
10.8. Menjalankan Pencacah Waktu (Timer)
10.9. Membangkitkan Bilangan Acak
10.10. Menampilkan Sebuah Jendela
10.11. Ringkasan

Sebuah tipe data khusus untuk menangani berkas didefinisikan dalam berkas header stdio.h. Ia dinamakan “penunjuk berkas” atau “file pointer” dan memiliki sintaks FILE *p__berkas. Dalam sebuah program C, sebuah penunjuk berkas yang dinamakan “ptr_berkas” bisa dibuat dengan deklarasi FILE *ptr_berkas ;.

Sebuah penunjuk berkas menunjuk pada sebuah struktur terdefinisi dalam berkas header stdio.h yang berisi informasi tentang berkas. Termasuk di dalamnya, detail tentang karakter terkini dan status apabila berkas sedang dibaca atau ditulis.

Sebelum sebuah berkas bisa dibaca atau ditulis, pertama kali harus selalu dibuka dengan fungsi fopen(). Ia mengambil dua argumen untuk menentukan nama dan lokasi berkas, dan sebuah “mode” untuk membuka berkas. Fungsi fopen() memberikan keluaran sebuah pointer berkas apabila operasinya berhasil atau sebaliknya sebuah nilai NULL saat gagal.

Sekali sebuah berkas berhasil dibuka maka ia bisa dibaca, atau ditambahkan, atau sebuah teks baru bisa ditulis ke dalam berkas. Itu bergantung pada mode yang ditentukan dalam pemanggilan fungsi fopen(). Sejalan dengan hal tersebut, berkas yang dibuka harus kemudian selalu ditutup dengan memanggil fungsi fclose(), dan menentukan pointer berkas sebagai masukan atau argumen tunggalnya.

Tabel berikut memberi daftar semua mode berkas yang bisa diberikan sebagai argumen kedua pada fungsi fopen():

Tabel 10.1.1. Mode Operasi Berkas fopen() dalam Bahasa C

Mode Berkas Operasi
r Membuka sebuah berkas untuk dibaca.
w Membuka sebuah berkas untuk ditulis. Membuat sebuah berkas baru jika belum ada atau membuka sebuah berkas yang sudah ada dan mengosongkan isi sebelumnya.
a Merangkai teks. Membuka atau membuat sebuah berkas teks untuk menulis pada bagian akhir berkas.
r+ Membuka sebuah berkas untuk membaca dari atau menulis ke berkas tersebut. Tidak membuat berkas baru atau tidak mengosongkan berkas yang sudah ada.
w+ Membuka sebuah berkas untuk menulis ke atau membaca dari berkas tersebut. Berkas baru dibuat jika belum ada, namun jika sudah ada maka berkas tersebut dikosongkan terlebih dahulu.
a+ Membuka sebuah berkas untuk membaca dari atau menulis ke bagian akhir berkas tersebut. Berkas baru dibuat jika belum ada, tidak mengosongkan isi berkas terlebih dahulu.

Mode Operasi Berkas fopen()  dalam Bahasa C
Gambar 10.1.1. Mode Operasi Berkas fopen() dalam Bahasa C.

  1. Mulailah membuat sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah penunjuk berkas.

    int main()
    {
        FILE *p__berkas ;
    }
  3. Selanjutnya dalam blok fungsi main(), cobalah untuk membuat sebuah berkas untuk ditulisi.

    p__berkas = fopen( "data.txt" , "w" ) ;
  4. Sekarang, tampilkan sebuah pesan untuk memberi konfirmasi bahwa upaya tersebut berhasil, kemudian tutup berkas dan berikan keluaran sebuah bilangan bulat nol seperti yang disyaratkan dalam deklarasi fungsi.

    if( p__berkas != NULL )
    {
        printf( "Berkas telah dibuat.\n" ) ;
        fclose( p__berkas ) ;
    
        return 0 ;
    }
  5. Terakhir, sebagai pesan alternatif apabila upaya tersebut gagal.

    else
    {
        printf( "Tidak bisa membuat berkas.\n" ) ;
    
        return 1 ;
    }
  6. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk mencoba membuat sebuah berkas teks.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.1 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.1. Membuat Sebuah Berkas dalam Bahasa C.

10.2. Membaca dan Menulis Karakter

Masukan standar

Fungsi scanf(), yang digunakan pada contoh-contoh sebelumnya, merupakan versi sederhana fungsi fscanf() yang membutuhkan sebuah filestream sebagai argumen atau masukan pertamanya. Hal tersebut menandakan sebuah sumber dari mana serangkaian karakter akan diperkenalkan ke dalam program.

Dalam pemrograman C, filestream bernama stdin mewakili papan ketik (keyboard) dan sumber bawaan untuk fungsi scanf(). Pemanggilan fungsi scanf(...) sama seperti fscanf( stdin , … ).

Keluaran standar

Sama halnya, fungsi printf() merupakan versi sederhana sebuah fungsi yang bernama fprintf() yang membutuhkan sebuah keluaran filestream sebagai argumen pertamanya. Hal tersebut menandakan sebuah tujuan tempat serangkaian karakter akan dikeluarkan dari program.

Filestream yang bernama stdout mewakili monitor dan sumber bawaan untuk fungsi printf(). Pemanggilan fungsi printf(...) sama seperti fprintf( stdout , ... ).

Fungsi-fungsi standar lainnya juga memiliki hal setara yang mengizinkan sebuah filestream alternatif untuk ditentukan. Itu bisa digunakan untuk membaca sebuah berkas dengan menentukan sebuah pointer berkas sebagai alternatif untuk membaca dari filestream stdin.

  • Fungsi fputc() bisa digunakan untuk menulis ke sebuah filestream satu karakter per satu waktu — umumnya dengan perulangan melalui sebuah larik char. Pasangannya, yaitu fgetc() bisa digunakan untuk membaca berkas dari sebuah filestream satu karakter per satu waktu.

  • Fungsi fputs() bisa digunakan untuk menulis sebuah filestream satu baris per satu waktu dan pasangannya, yaitu fgets() bisa digunakan untuk membaca sebuah filestream satu baris per satu waktu.

  • Fungsi fread() bisa digunakan untuk membaca keseluruhan filestream dan pasangannya, yaitu fwrite() bisa menulis keseluruhan filestream.

  • Fungsi fscanf() dan fprintf() bisa digunakan untuk membaca dan menulis filestream dengan kalimat-kalimat dan bilangan-bilangan.

  1. Mulailah membuat sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah pointer berkas, sebuah variabel pencacah perulangan, dan sebuah larik karakter yang terinisialisasi.

    int main()
    {
        FILE *p__berkas ; int i ;
        char v__larik_karakter[30] = "Teks, satu karakter per waktu." ;
    }
  3. Selanjutnya, dalam blok fungsi main(), cobalah untuk membuat sebuah berkas untuk ditulisi.

    p__berkas = fopen( "karakter.txt" , "w" ) ;
  4. Sekarang tampilkan sebuah pesan untuk mengonfirmasi bahwa upaya tersebut berhasil, menulis setiap karakter dari larik, kemudian tutup berkas dan berikan keluaran sebuah bilangan bulat nol seperti yang disyaratkan.

    if( p__berkas != NULL )
    {
        printf( "Berkas karakter.txt telah dibuat.\n" ) ;
        for( i = 0; v__larik_karakter[i]; i++ ) {
            fputc( v__larik_karakter[i] , p__berkas ) ;
        }
        fclose( p__berkas ) ;
    
        return 0 ;
    }
  5. Terakhir, tampilkan sebuah pesan alternatif jika upaya tersebut gagal.

    else { printf("Tidak bisa membuat berkas.\n") ; return 1 ; }
  6. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk mencoba menulis sebuah berkas teks.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.2 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.2. Membaca dan Menulis Karakter dalam Bahasa C.

10.3. Membaca dan Menulis Baris

Fungsi fgetc() bukanlah cara yang paling efisien untuk membaca teks ke dalam sebuah program mengingat ia harus dipanggil berulang kali untuk membaca setiap karakter. Alangkah lebih baik untuk menerapkan fungsi fgets() yang membaca seluruh baris dalam teks dalam satu waktu.

Fungsi fgets() membutuhkan tiga argumen atau masukan. Argumen yang pertama menentukan sebuah pointer char atau larik char tempat teks akan disematkan. Argumen kedua harus berupa sebuah bilangan bulat yang menentukan banyak karakter maksimum yang dibaca per baris. Argumen ketiga merupakan sebuah pointer berkas yang menentukan dari mana berkas dibaca.

Demikian pula, fungsi fputc(), yang menulis teks satu karakter per waktu, kurang efisien dibandingkan fungsi fputs() yang menulis teks baris demi baris. Fungsi fputs() membutuhkan dua argumen untuk menentukan teks yang hendak ditulis dan sebuah pointer berkas yang menandakan berkas yang hendak ditulis.

Sebuah karakter baris baru (newline) ditambahkan oleh fputs() setelah sebuah baris ditulis. Fungsi tersebut mengeluarkan nilai nol saat operasinya berhasil, atau sebuah konstanta EOF ketika sebuah kesalahan muncul atau akhir berkas dijumpai.

  1. Mulailah membuat sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran dan fungsi kalimat standar.

    #include <stdio.h>
    #include <string.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah berkas pointer dan sebuah larik karakter yang tak terinisialisasi.

    int main()
    {
        FILE *p__berkas ;
        char v__larik_karakter[30] ;
    }
  3. Selanjutnya di dalam blok fungsi main(), cobalah untuk membuka sebuah berkas teks lokal untuk dibaca dan ditambahkan sesuatu.

    p__berkas = fopen( "bulan.txt" , "r+a" ) ;
  4. Sekarang tampilkan sebuah pesan untuk mengonfirmasi apabila upaya tersebut berhasil.

    if( p__berkas != NULL )
    {
        printf( "Berkas bulan.txt telah dibuka.\n" ) ;
    }
  5. Selanjutnya, dalam blok if, lakukan pembacaan dan tampilkan semua baris dari berkas.

    while ( fgets( v__larik_karakter , 30 , p__berkas) ) { printf( "%s" , v__larik_karakter ) ; }
  6. Sekarang dalam blok if, salinlah sebuah kalimat baru ke larik kemudian rangkaikan kalimat tersebut ke berkas teks.

    strcpy( v__larik_karakter , ".. oleh Neil Armstrong" ) ;
    fputs( v__larik_karakter , p__berkas ) ;
  7. Terakhir dalam blok if, tutuplah berkas dan berikan keluaran sebuah bilangan bulat nol seperti yang disyaratkan dalam deklarasi fungsi.

    fclose( p__berkas ) ;
    return 0 ;
  8. Tambahkan sebuah pesan alternatif jika upaya tersebut gagal.

    else { printf( "Tidak bisa membuka berkas.\n" ) ; return 1 ; }
  9. Simpan berkas program kemudian kompilasi dan jalankan program untuk membuka berkas dan menambahkan kalimat teks.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.3 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.3. Membaca dan Menulis Baris dalam Bahasa C.

10.4. Membaca dan Menulis Berkas

Keseluruhan isi berkas bisa dibaca dengan fungsi fread() dan ditulis dengan fungsi fwrite(). Kedua fungsi tersebut memiliki empat argumen yang sama. Pertama merupakan sebuah variabel char tempat teks bisa disimpan. Argumen kedua menentukan ukuran penggalan (chunks) teks untuk dibaca atau ditulis dalam satu waktu — umumnya ia bernilai 1. Argumen ketiga menentukan banyak seluruh karakter yang hendak dibaca atau ditulis, dan argumen keempat merupakan sebuah pointer berkas untuk berkas yang hendak diproses.

Fungsi fread() memberikan keluaran objek-objek yang telah dibaca, mencacah karakter, spasi-spasi, dan baris-baris baru (newlines) yang masing-masing sebagai sebuah objek. Sama halnya, fwrite() memberikan keluaran banyak objek yang telah ditulis.

  1. Mulailah membuat sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dua pointer berkas, sebuah variabel larik karakter, dan sebuah variabel bilangan bulat.

    int main()
    {
        FILE *p__berkas_asli ;
        FILE *p__berkas_salinan ;
        char v__larik_sangga[1000] ;
        int v__banyak_objek ;
    }
  3. Selanjutnya dalam blok fungsi main(), cobalah untuk membuka sebuah berkas lokal yang ada untuk dibaca dan berkas lain untuk ditulis.

    p__berkas_asli = fopen( "berkas_asli.txt" , "r" ) ;
    p__berkas_salinan = fopen( "berkas_salinan.txt" , "w" ) ;
  4. Sekarang ujilah kedua berkas apabila telah berhasil dibuka.

    if( ( p__berkas_asli != NULL ) && ( p__berkas_salinan != NULL ) )
    {
    
    }
  5. Dalam blok if, lakukan pembacaan isi berkas asli ke dalam larik karakter, mencacah setiap objek yang dibaca, kemudian menulis isi larik ke dalam berkas kedua.

    v__banyak_objek = fread( v__larik_sangga , 1 , 1000 , p__berkas_asli ) ;
    fwrite( v__larik_sangga , 1 , v__banyak_objek , p__berkas_salinan ) ;
  6. Ingatlah untuk menutup kedua berkas teks saat proses selesai.

    fclose( p__berkas_asli ) ;
    fclose( p__berkas_salinan ) ;
  7. Terakhir dalam blok if tampilkan sebuah konfirmasi, termasuk cacah objek, berikan keluaran sebuah bilangan bulat nol seperti yang disyaratkan pada deklarasi fungsi.

    printf( "Selesai: berkas_asli.txt sudah disalin ke berkas_salinan.txt" ) ;
    printf( "\n%d objek disalin.\n" , v__banyak_objek ) ;
    return 0 ;
  8. Tambahkan sebuah pesan alternatif untuk apabila upaya tersebut gagal.

    else
    {
        if( p__berkas_asli == NULL ) printf( "Tidak bisa membuka berkas berkas_asli.txt.\n" ) ;
        if( p__berkas_salinan == NULL ) printf( "Tidak bisa membuka berkas berkas_salinan.txt\n" ) ;
        return 1 ;
    }
  9. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk membuka sebuah berkas dan menyalin isinya ke sebuah berkas baru.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.4 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.4. Membaca dan Menulis Berkas dalam Bahasa C.

10.5. Memindai Aliran Berkas (Filestream)

Fungsi scanf(), yang digunakan untuk memperoleh masukan dari pengguna, merupakan versi sederhana dari fungsi fscanf() dengan filestream bawaannya secara konstan diatur ke stdin. Fungsi scanf() mengizinkan Anda untuk menjadikan filestream yang hendak dibaca sebagai argumen pertamanya.

Hal tersebut juga memiliki kelebihan saat membaca berkas-berkas yang hanya berisi bilangan-bilangan, mengingat bilangan dalam sebuah teks hanya dilihat sebagai sebuah untaian karakter. Namun, saat dibaca menggunakan fscanf() mereka akan dikonversi menjadi tipe bilangan mereka.

Demikian pula, fungsi printf() yang digunakan untuk keluaran, merupakan sebuah versi sederhana fungsi fprintf() dengan filestream bawaannya secara konstan diatur ke stdout. Fungsi fprintf() mengizinkan Anda untuk menjadikan filestream yang hendak ditulis sebagai argumen pertamanya.

Jadi, fscanf() dan fprintf() menawarkan fleksibilitas yang sangat besar dalam memilih apakah memilih membaca dari stdin atau dari sebuah berkas, dan apakah hendak menulis ke stdout atau ke sebuah berkas.

  1. Mulailah membuat sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dua pointer berkas, sebuah variabel larik bilangan bulat, dan dua variabel bilangan bulat biasa.

    int main()
    {
        FILE *p__berkas_bilangan , *p__berkas_tulis ;
        int v__larik_bilangan[20] , i , j ;
    }
  3. Selanjutnya dalam blok fungsi main(), cobalah untuk membuka sebuah berkas lokal yang ada untuk dibaca dan berkas lainnya untuk ditulis.

    p__berkas_bilangan = fopen( "berkas_bilangan.txt" , "r" ) ;
    p__berkas_tulis = fopen( "berkas_tulis.txt" , "w" ) ;
  4. Sekarang ujilah kedua berkas, apakah dibuka dengan berhasil.

    if( ( p__berkas_bilangan != NULL ) && ( p__berkas_tulis != NULL ) )
    {
    
    }
  5. Dalam blok if, lakukan pemindaian bilangan bulat dari berkas ke anggota larik bilangan bulat.

    for( i = 0; !feof( p__berkas_bilangan ); i++ )
    {
        fscanf( p__berkas_bilangan , "%d" , &v__larik_bilangan[i] ) ; 
    }
  6. Selanjutnya, dalam blok if keluarkan nilai-nilai anggota larik.

    fprintf( stdout , "\nBanyak seluruh bilangan yang ditemukan: %d\n" , i ) ;
    for( j = 0; j < i; j++ ){ fprintf( stdout , "%d" , v__larik_bilangan[j] ) ; } ;
  7. Sekarang tulis nilai-nilai anggota larik ke dalam sebuah berkas.

    fprintf( p__berkas_tulis , "fscanf dan fprintf begitu fleksibel\n" ) ;
    for( j = 0; j < i; j++ ){ fprintf( p__berkas_tulis , "%d" , v__larik_bilangan[j] ) ; }
  8. Terakhir, pada blok if, tutuplah kedua berkas ketika operasinya sudah selesai.

    fclose( p__berkas_bilangan ) ;
    fclose( p__berkas_tulis ) ;
  9. Tambahkan sebuah pesan alternatif untuk apabila upaya tersebut gagal.

    else
    {
        fprintf( stdout , "Tidak dapat membuka berkas.\n" ) ; return 1 ;
    }
  10. Simpanlah berkas program kemudian kompilasi dan jalankan untuk membuka sebuah berkas, mengeluarkan dan menulis isinya.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.5 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.5. Memindai Aliran Berkas (Filestream) dalam Bahasa C.

10.6. Melaporkan Kesalahan-kesalahan

Bahasa C menyediakan sebuah fungsi bernama perror() dalam berkas header stdio.h yang dapat digunakan untuk menampilkan pesan-pesan penjelasan kesalahan. Ia membutuhkan sebuah kalimat sebagai argumen tunggal dengan mana perror() menambahkan sebuah tanda titik dua yang diikuti dengan sebuah penjelasan mengenai kesalahan yang sedang terjadi.

Sebagai tambahan, berkas header errno.h menentukan sebuah ungkapan bilangan bulat bernama “errno” yang menyematkan sebuah kode nomor kesalahan ketika kesalahan muncul. Kode nomor kesalahan dimasukkan sebagai argumen pada sebuah fungsi strerror() dari berkas header string.h untuk mengeluarkan pesan kesalahan yang sesuai.

  1. Mulailah sebuah program baru dengan instruksi prapemroses untuk mengikutsertakan fungsi-fungsi masukan/keluaran standar, penanganan pesan kesalahan, dan fungsi-fungsi kalimat.

    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah pointer berkas dan sebuah variabel bilangan bulat.

    int main()
    {
        FILE *p__berkas ;
        int i ;
    }
  3. Selanjutnya dalam blok fungsi main(), cobalah untuk membuka sebuah berkas yang belum ada atau belum dibuat.

    p__berkas = fopen( "berkas_tidak_ada.txt" , r ) ;
  4. Keluarkan sebuah pesan konfirmasi atau kesalahan saat upaya tersebut gagal.

    if( p__berkas != NULL ) { printf( "Berkas telah dibuka\n" ) ; }
    else{ perror( "Ada kesalahan" ) ; } 
  5. Sekarang tambahkan sebuah perulangan untuk mengeluarkan pesan-pesan kesalahan yang bersesuaian dengan kode nomor kesalahan.

    for( i = 0; i < 44; i++ )
    {
        printf( "Kesalahan %d : %s\n" , i , strerror( i ) ) ;
    }
  6. Pada akhir blok fungsi main() keluarkan sebuah bilangan nol seperti yang disyaratkan dalam deklarasi fungsi.

    return 0 ;
  7. Simpanlah berkas program, kemudian kompilasi dan jalankan untuk melihat pesan-pesan kesalahan.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.6 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.6. Melaporkan Kesalahan-kesalahan dalam Bahasa C.

10.7. Menggunakan Tanggal dan Waktu

Waktu sistem terkini dihitung sebagai banyak detik yang terlewati sejak diukur (Epoch) pada 1 Januari 1970 pukul 00:00:00 GMT. Banyak seluruh hitungan mewakili tanggal dan waktu terkini berdasarkan kalender Gregorian dan disebut sebagai “Waktu Kalender”. Fungsi khusus yang menangani tanggal dan waktu disediakan oleh berkas header time.h bersama dengan sebuah struktur tipe data bernama tm untuk menyimpan komponen tanggal dan waktu seperti pada tabel berikut:

Tabel 10.7.1. Struktur Data tm untuk Komponen Tanggal dan Waktu dalam Bahasa C

Komponen Deskripsi
int tm_sec Detik setelah menit, normalnya 0-59
int tm_min Menit setelah jam, 0-59
int tm_hour Jam sejak tengah malam, 0-23
int tm_mday Hari dalam bulan, 1-31
int tm_mon Bulan sejak Januari, 0-11
int tm_year Tahun sejak 1900
int tm_wday Hari-hari sejak Minggu, 0-6
int tm_yday Hari sejak 1 Januari, 0-365
int tm_isdst Mengenakan efek Daylight Saving Time

Hitungan lewatan detik terkini dikeluarkan oleh sebuah fungsi time(NULL) sebagai sebuah tipe data time_t. Itu kemudian dapat digunakan sebagai argumen dalam fungsi localtime() untuk dikonversi menjadi beragam komponen struktur tm.

Komponen-komponen struktur dapat dikeluarkan dalam sebuah format tanggal dan waktu standar menggunakan fungsi asctime(). Sebagai alternatif, komponen-komponen individu dapat dikeluarkan nilainya menggunakan penentu format waktu khusus menggunakan fungsi strftime().

Fungsi tersebut membutuhkan empat argumen, pertama berupa masukan sebuah larik char yang berfungsi untuk menyimpan untaian tanggal terformat, kemudian banyak untaian karakter maksimum, penentu format dan teks untuk mengekstrak komponen-komponen yang diperlukan, dan struktur tm yang digunakan.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar juga fungsi-fungsi tanggal dan waktu.

    #include <stdio.h>
    #include <time.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah variabel larik karakter, sebuah variabel bertipe data time_t, dan sebuah struktur tm.

    int main()
    {
        char v__larik_sangga[100] ; // buffer
        time_t v__lewatan_waktu ;
        struct tm *p__sekarang ;
    }
  3. Selanjutnya dalam blok fungsi main(), ambil hitungan lewatan detik terkini sejak Epoch.

    v__lewatan_waktu = time(NULL) ;
  4. Kemudian lakukan konversi hitungan tersebut ke komponen waktu lokal.

    p__sekarang = localtime( &v__lewatan_waktu ) ;
  5. Keluarkan tanggal dan waktu dalam format standar.

    printf( "%s\n" , asctime( p__sekarang ) ) ;
  6. Lalu keluarkan komponen-komponen tanggal dan waktu secara tersendiri.

    strftime( v__larik_sangga , 100 , "Hari sekarang %A, %B %d.\n" , p__sekarang ) ;
    printf( "%s" , v__larik_sangga ) ;
    strftime( v__larik_sangga , 100 , "Waktu sekarang %I:%M %p.\n" , p__sekarang ) ;
    printf( "%s" , v__larik_sangga ) ;
  7. Terakhir, keluarkan sebuah bilangan bulat nol yang disyaratkan kemudian simpan berkas program, kompilasi dan jalankan program untuk melihat informasi tanggal dan waktu saat ini.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.7 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.7. Menggunakan Tanggal dan Waktu dalam Bahasa C.

10.8. Menjalankan Pencacah Waktu (Timer)

Memperoleh waktu terkini untuk waktu sebelum dan sesudah sebuah kejadian bermakna bahwa durasi kejadian bisa dihitung berdasarkan perbedaan keduanya. Berkas header time.h mengandung sebuah fungsi difftime() untuk tujuan khusus tersebut. Fungsi itu membutuhkan dua masukan yang keduanya bertipe data time_t. Ia mengurangkan masukan kedua dengan masukan pertama dan mengeluarkan hasil bedanya yang diungkap dalam satuan detik bertipe data double.

Cara lain dalam menggunakan waktu ditawarkan oleh fungsi clock() yang ada dalam berkas header time.h. Ia mengeluarkan waktu pemroses yang digunakan sejak program mulai berjalan. Fungsi ini dapat digunakan untuk menghentikan sementara (pause) jalannya sebuah program dengan menjalankan sebuah perulangan kosong hingga sebuah titik pada waktu depan dicapai.

  1. Mulailah sebuah program baru dengan instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar juga fungsi-fungsi tanggal dan waktu.

    #include <stdio.h>
    #include <time.h>
  2. Berikutnya, deklarasikan sebuah prototipe fungsi untuk melakukan operasi pause pada program.

    void f__tunggu( int vf__banyak_detik ) ;
  3. Tambahkan sebuah fungsi main() yang mendeklarasikan dua variabel bertipe data tim_t dan sebuah variabel bilangan bulat.

    int main()
    {
        time_t v__mulai , v__berhenti ;
        int i ;
    }
  4. Selanjutnya dalam blok fungsi main(), dapatkan waktu saat ini dan keluarkan sebuah pesan.

    v__mulai = time(NULL) ;
    printf( "Mulai menghitung mundur...\n\n" ) ;
  5. Tambahkan sebuah perulangan untuk mengeluarkan nilai cacah hitung dan panggil fungsi lain pada setiap iterasi.

    for( i = 10; i > -1 ; i--)
    {
        printf( "- %d" , i ) ;
        f__tunggu( 1 ) ;
    }
  6. Berikutnya pada blok fungsi main(), dapatkan waktu terkini sekali lagi kemudian gunakan waktu yang diambil untuk menjalankan perulangan.

    v__berhenti = time(NULL) ;
    printf( "\nDurasi: %.0f detik\n" , difftime( v__berhenti , v__mulai ) ) ;
  7. Terakhir, pada blok fungsi main(), keluarkan sebuah bilangan bulat nol seperti yang disyaratkan dalam deklarasi fungsi.

    return 0 ;
  8. Setelah blok fungsi main(), mulailah definisi fungsi dengan menginisialisasi sebuah variabel bertipe data clock_t pada sebuah titik waktu depan melampaui waktu lewatan saat ini yang sedang berjalan.

    void f__tunggu( int vf__banyak_detik )
    {
        clock_t v__akhir_tunggu = ( clock() + ( vf__banyak_detik * CLOCKS_PER_SEC ) ) ;
    }
  9. Dalam blok fungsi f__tunggu(), tambahkan sebuah perulangan kosong yang dihentikan saat waktu kini mencapai sebuah titik waktu depan, yang kemudian mengembalikan kendali ke perulangan dalam fungsi main().

    while( clock() < v__akhir_tunggu ) {}
  10. Simpanlah berkas program kemudian kompilasi dan jalankan program untuk melihat pencacah waktu hitungan mundur dan jalannya waktu.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.8 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.8. Menjalankan Pencacah Waktu (Timer) dalam Bahasa C.

10.9. Membangkitkan Bilangan Acak

Berkas header stdlib.h menyediakan sebuah fungsi rand() yang membangkitkan sebuah bilangan bulat positif acak semu (pseudorandom) saat dipanggil. Ia secara bawaan akan mengeluarkan sebuah nilai dalam rentang dari 0 hingga 32.767.

Rentang yang spesifik dapat diatur dengan menggunakan operator modulus untuk menentukan sebuah batas maksimum atas. Sebagai contoh, untuk menentukan sebuah rentang dari 0 hingga 10 digunakan ungkapan rand() % 10.

Untuk mengatur sebuah batas minimum paling bawah bagi rentang maka nilainya bisa ditambahkan pada hasil ungkapan tersebut. Sebagai contoh, untuk menentukan sebuah rentang dari 5 hingga 15 digunakan ungkapan ( rand() % 15 ) + 5.

Bilangan yang dibangkitkan oleh fungsi rand() bukanlah bilangan yang benar-benar acak mengingat fungsi tersebut secara berurutan membangkitkan sederet bilangan yang sama setiap kali sebuah program yang menggunakan rand() dijalankan. Dalam hal untuk membangkitkan sederet bilangan berbeda maka “benih” (seed) yang memulai deret harus ditentukan.

Secara bawaan, nilai benih inisial adalah 1. Namun, itu bisa diubah dengan menentukan argumen atau masukan bilangan bulat alternatif pada fungsi srand(), misalnya srand(10). Penggunaannya akan menyebabkan rand() membangkitkan bilangan-bilangan dengan sebuah deret yang berbeda bila dibandingkan dengan bilangan-bilangan yang dibangkitkan dengan benih bawaan.

Untuk membangkitkan deret acak yang berbeda selama proses eksekusi berurut maka masukan yang ditentukan pada srand() harus sesuatu selain sebuah bilangan bulat statis. Solusi umum adalah dengan memberikan benih pada fungsi rand() dengan waktu terkini berupa detik yang telah lewat menggunakan srand( time(NULL) ).

Sekarang, deret bilangan yang dibangkitkan oleh rand() akan berbeda setiap kali sebuah program yang menggunakan rand() dijalankan.

  1. Mulailah sebuah program baru dengan instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar, bilangan acak, waktu, dan untaian karakter.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan variabel-variabel int dan char.

    int main()
    {
        int i , v__nomor_acak , v__bilangan_sementara , v__larik_bilangan[100] ;
        char v__larik_sangga[10] , v__larik_karakter[100] = { "10 angka keberuntungan Anda adalah: " } ;
    }
  3. Dalam blok fungsi main(), pertama berikan benih pada pembangkit bilangan acak dengan nilai detik terkini.

    srand( time(NULL) ) ;
  4. Selanjutnya, isilah larik dengan bilangan dari 0-99 secara berurutan.

    for( i = 0; i < 100; i++ ){ v__larik_bilangan[i] = i ; }
  5. Kemudian kocok deret tersebut sehingga urutannya menjadi acak.

    for( i = 1; i < 100; i++ ){
        v__nomor_acak = ( rand() % 99 ) + 1 ;
    
        v__bilangan_sementara = v__larik_bilangan[i] ;
        v__larik_bilangan[i] = v__larik_bilangan[v__nomor_acak] ;
        v__larik_bilangan[v__nomor_acak] = v__bilangan_sementara ; 
    }
  6. Tambahkan 10 bilangan anggota larik ke sebuah untaian karakter.

    for( i = 1; i < 11; i++ )
    {
        sprintf( v__larik_sangga , "%d" , v__larik_bilangan[i] ) ;
        strcat( v__larik_sangga ,  " ") ;
        strcat( v__larik_karakter , v__larik_sangga ) ;
    }
  7. Kemudian cetak keluaran untaian karakter.

    printf( "\n%s\n\n" , v__larik_karakter ) ;
  8. Pada akhir blok fungsi main() keluarkan sebuah bilangan bulat bernilai nol seperti yang disyaratkan pada deklarasi fungsi.

    return 0 ;
  9. Simpanlah berkas program kemudian kompilasi dan jalankan program secara berulang untuk melihat sebuah pemilihan 10 bilangan acak yang berbeda dalam rentang 1-100 dalam setiap eksekusi.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.9 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.9. Membangkitkan Bilangan Acak dalam Bahasa C.

10.10. Menampilkan Sebuah Jendela

Dalam sistem operasi ragam UNIX maupun Windows, program-program C dapat dengan mudah menghasilkan komponen-komponen antarmuka grafis menggunakan pustaka GTK+. Pada awalnya, pustaka tersebut dibuat untuk tujuan pengembangan program GIMP yang kini umum digunakan dalam proses manipulasi citra. Oleh karena itu, pustaka ini dikenal juga sebagai GIMP Toolkit.

Untuk menggunakan GTK+ dalam program-program C maka Anda perlu mengenal kelas dasar yang digunakan untuk membuat komponen atau widget, yaitu GtkWidget. Ia mengelola siklus, keadaan, dan gaya tampilan komponen-komponen.

Inisialisi GTK+ dalam sebuah fungsi main() dilakukan oleh fungsi gtk_init(). Ia juga akan menyisir (parsing) beberapa opsi baris perintah standar. Jadi, fungsi ini harus dipanggil sebelum Anda menggunakan fungsi-fungsi GTK+ lainnya.

Kemudian ada juga fungsi gtk_window_new(). Ia digunakan untuk membuat GtkWindow, yang tak lain merupakan jendela tingkat teratas yang menampung komponen lainnya. Jendela ini memiliki tipe data GTK_WINDOW_TOPLEVEL, memiliki garis pinggir dan plang judul. Agar komponen-komponen jendela tampil di layar maka perlu untuk memanggil fungsi gtk_widget_show().

Interaksi antar komponen maupun pengguna program dilakukan melalui sinyal-sinyal yang melibatkan fungsi-fungsi pemanggil balik (callback). Untuk hal tersebut, dalam GTK+ Anda akan diperkenalkan dengan fungsi g_signal_connect(). Misalnya, untuk menutup sebuah jendela, terdapat sinyal “destroy” dan itu harus disambungkan dengan fungsi pemanggil balik gtk_main_quit() yang akan menghentikan jalannya aplikasi.

Guna membuat program tetap tinggal dan menunggu kejadian maka pada bagian akhir program diperlukan pemanggilan fungsi gtk_main(). Untuk bagian terakhir yaitu tahap kompilasi maka perlu diikutsertakan ungkapan yang mengikutsertakan penggunaan pustaka GTK+:

gcc -o program_gtk program_gtk.c `pkg-config --libs --cflags gtk+-2.0`

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan pustaka antarmuka grafis GTK+.

    #include <gtk-2.0/gtk/gtk.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan variabel pointer bertipe GtkWidget.

    int main( int argc, char *argv[] )
    {
        GtkWidget* p__w_jendela_utama ;    
    }
  3. Selanjutnya lakukan inisialisasi GTK+ sehingga fungsi-fungsi GTK+ lainnya nanti bisa dipanggil.

    gtk_init( &argc , &argv ) ;
  4. Di bawah baris inisialisasi GTK+, buatlah sebuah jendela utama yang merupakan jendela tingkat teratas untuk menampung komponen lainnya.

    p__w_jendela_utama = gtk_window_new( GTK_WINDOW_TOPLEVEL ) ;
  5. Selanjutnya, untuk menampilkan jendela utama dilayar bisa dilakukan dengan memanggil fungsi gtk_widget_show().

    gtk_widget_show( p__w_jendela_utama ) ;
  6. Untuk menutup jendela utama, kita tambahkan sebuah sinyal penyambung berupa sinyal “destroy” yang dihubungkan dengan fungsi gtk_main_quit().

    g_signal_connect( p__w_jendela_utama , "destroy" , G_CALLBACK( gtk_main_quit ) , NULL) ;
  7. Untuk membuat program tetap tinggal dan menunggu adanya kejadian (events) maka tambahkan kode berikut untuk memasuki perulangan utama GTK+.

    gtk_main() ;
  8. Pada akhir blok fungsi main(), keluarkan sebuah bilangan bulat nol seperti yang disyaratkan dalam pendeklarasian fungsi.

    return 0 ;
  9. Simpanlah berkas program, kemudian lakukan proses kompilasi dan jalankan program untuk melihat tampilan jendela sederhana.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.10 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.10. Menampilkan Sebuah Jendela dalam Bahasa C.

Untuk menampilkan program bilangan acak pada bagian sebelumnya dalam tampilan antarmuka grafis dengan melibatkan komponen tombol dan label maka Anda bisa mempelajari kode berikut:

Catatan: Untuk melihat baris kode secara utuh, letakkan kursor mouse di dalam area kode, tekan dan tahan tombol Shift kemudian gunakan scroll wheel tengah mouse untuk melakukan scroll horizontal.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <gtk-2.0/gtk/gtk.h>

/* deklarasi tipe data tersuai */
typedef struct {
    GtkWidget* vg__w_label ; // vg: variabel anggota
    GtkWidget* vg__w_tombol ;
    char* vg__pesan ;
} st__data_klik ; // st: struct typedef

static gboolean f__tampilkan_pesan( gpointer pf__data_klik ) ;
void c__clicked_tombol( GtkWidget* pf__w_tombol , gpointer pf__data_klik ) ;

int main( int argc, char *argv[] ) {

    GtkWidget* p__w_jendela_utama ;    
    GtkWidget* p__w_fixed_layout ;
    GtkWidget* p__w_tombol ;
    GtkWidget* p__w_label ;

    gtk_init( &argc , &argv );

    // jendela utama
    p__w_jendela_utama = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_position( GTK_WINDOW( p__w_jendela_utama ) , GTK_WIN_POS_CENTER ); // posisi jendela pada layar
    gtk_widget_set_size_request( p__w_jendela_utama , 300 , 200 );
    gtk_window_set_resizable( GTK_WINDOW( p__w_jendela_utama ) , FALSE );
    gtk_window_set_title( GTK_WINDOW( p__w_jendela_utama ) , "ANGKA KEBERUNTUNGAN ANDA" ) ; // judul jendela

    // fixed layout jendela utama
    p__w_fixed_layout = gtk_fixed_new();
    gtk_container_add( GTK_CONTAINER( p__w_jendela_utama ) , p__w_fixed_layout );

    // label
    p__w_label = gtk_label_new( "Silahkan Anda menekan tombol \"Tampilkan\"!" ) ;
    gtk_fixed_put( GTK_FIXED( p__w_fixed_layout ), p__w_label , 10 , 10 );
    gtk_widget_set_size_request( p__w_label, 250 , 100 );
    gtk_label_set_justify( GTK_LABEL( p__w_label ) , GTK_JUSTIFY_CENTER ) ;

    // tombol
    p__w_tombol = gtk_button_new_with_label( "Tampilkan" ) ;
    gtk_fixed_put( GTK_FIXED( p__w_fixed_layout ) , p__w_tombol , 185 , 135 );
    gtk_widget_set_size_request( p__w_tombol , 80 , 30 );

    // tebal garis tepi jendela utama
    gtk_container_set_border_width( GTK_CONTAINER( p__w_jendela_utama ) , 15 );

    // aksi klik tombol
    st__data_klik vt__data_klik_awal ;
    vt__data_klik_awal.vg__w_label = p__w_label ;
    vt__data_klik_awal.vg__w_tombol = p__w_tombol ;

    g_signal_connect( G_OBJECT( p__w_tombol ), "clicked", G_CALLBACK( c__clicked_tombol ) , &vt__data_klik_awal );

    // tutup jendela utama
    g_signal_connect( p__w_jendela_utama , "destroy" , G_CALLBACK( gtk_main_quit ) , G_OBJECT( p__w_jendela_utama ) );

    // tampilkan jendela utama
    gtk_widget_show_all( p__w_jendela_utama );

    gtk_main();

    return 0;
}

// fungsi pemanggil balik ketika tombol ditekan
void c__clicked_tombol( GtkWidget* pf__w_tombol ,  gpointer pf__data_klik ) {

    int  i , v__nomor_acak , v__bilangan_sementara , v__larik_bilangan[100] ;
    char v__larik_sangga[10] , v__larik_karakter[100] = { "Ini adalah 10 angka keberuntungan Anda:\n\n" } ;

    srand( time(NULL) ) ;

    for( i = 0; i < 100; i++ ) { v__larik_bilangan[i] = i ; }

    // pengacakan nomor
    for( i = 1; i < 100; i++ )
    {
        v__nomor_acak = ( rand() % 99 ) + 1 ;

        v__bilangan_sementara = v__larik_bilangan[i] ;
        v__larik_bilangan[i] = v__larik_bilangan[v__nomor_acak] ;
        v__larik_bilangan[v__nomor_acak] = v__bilangan_sementara ;
    }

    // pilih 10 bilangan
    for( i = 1; i < 11; i++ )
    {
        sprintf( v__larik_sangga , "%d" , v__larik_bilangan[i] ) ;
        strcat( v__larik_sangga , ( i < 10 ) ? ", " : "" ) ;
        strcat( v__larik_karakter , v__larik_sangga ) ;
    }

    // dari masukan
    st__data_klik* vt__data_klik_masuk = ( st__data_klik* ) pf__data_klik ;

    // untuk keluaran
    st__data_klik vt__data_klik_keluar ;

    vt__data_klik_keluar.vg__w_label = vt__data_klik_masuk->vg__w_label ;
    vt__data_klik_keluar.vg__w_tombol = vt__data_klik_masuk->vg__w_tombol ;
    vt__data_klik_keluar.vg__pesan = v__larik_karakter ;

    gtk_widget_set_sensitive( vt__data_klik_masuk->vg__w_tombol , FALSE );

    g_main_context_invoke( NULL , f__tampilkan_pesan , &vt__data_klik_keluar );

}

// fungsi untuk menampilkan pesan
static gboolean f__tampilkan_pesan( gpointer pf__data_klik ) {

    st__data_klik* vt__data_klik = ( st__data_klik* ) pf__data_klik ;

    gtk_label_set_text( GTK_LABEL( vt__data_klik->vg__w_label ) , vt__data_klik->vg__pesan ) ;

    gtk_widget_set_sensitive( vt__data_klik->vg__w_tombol , TRUE );

    return G_SOURCE_REMOVE ;
}

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 10.10-1 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 10.10-1. Menampilkan Bilangan Acak dalam Sebuah Jendela GTK pada Bahasa C.

10.11. Ringkasan

  • Sebuah pointer berkas memiliki sintaks FILE* p__berkas dan dapat digunakan untuk membuka, menulis, dan menutup berkas-berkas.
  • Fungsi fopen() yang membuka berkas-berkas harus menyatakan lokasi dan sebuah mode berkas sebagai masukannya.
  • Setelah menyelesaikan operasi-operasi pada sebuah berkas maka berkas tersebut kemudian harus ditutup dengan menggunakan fungsi fclose().
  • Karakter-karakter tunggal dibaca dan ditulis menggunakan fungsi fgetc() dan fputc() namun untuk membaca dan menulis semua baris digunakan fungsi fgets() dan fputs().
  • Fungsi fread() dan fwrite() dapat membaca dan menulis keseluruhan aliran masuk dan keluar berkas (filestream) dari penyangga-penyangga (buffers) karakter.
  • Fleksibilitas ditawarkan oleh fungsi fscanf() dan fprintf() yang dapat membaca dan menulis ke sebuah filestream , stdin, atau stdout.
  • Pesan-pesan kesalahan dapat ditulis dengan fungsi perror() atau juga strerror() yang dapat menampilkan sebuah pesan yang isinya sesuai dengan kode nomor kesalahan, errno.
  • Banyaknya detik yang lewat sejak Epoch pada tengah malam 1 Januari 1970 diperoleh dengan memanggil fungsi time(NULL).
  • Anggota sebuah tipe data tm_struct diinisialisasikan dengan melakukan konversi hitungan detik yang terlewati menggunakan fungsi localtime().
  • Sebuah format standar tanggal dan waktu disediakan oleh fungsi asctime(), namun komponen tunggal dapat diformat dengan penentu format menggunakan fungsi strftime().
  • Titik-titik waktu selama sebuah program dijalankan dapat dibuat menggunakan fungsi difftime() atau clock().
  • Deret bilangan acak semu (pseudorandom) dibangkitkan oleh fungsi rand() dan paling baik apabila diberi benih dengan menggunakan fungsi srand() dan time(NULL).
  • Mengikutsertakan berkas header gtk.h dalam sebuah program membuat pustaka GTK+ tersedia untuk membuat komponen-komponen grafis.

Daftar Pustaka

  1. Kernighan, Brian W. & Ritchie, Dennis M. (1988). The C Programming Language. New Jersey: Prentice Hall.
  2. Griffiths, David & Griffiths, Dawn (2012). Head First C. California: O’Reilly.
  3. McGarth, Mike (2012). C Programming: Grasp the Nuts and Bolts of Programming. Warwickshire: In Easy Steps Ltd.
  4. Stevanovic, Milan (2014). Advanced C and C++ Compiling: An Engineering Guide to Compiling, Linking, and Libraries using C and C++. California: Apress.

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.