Translate

tutorial operasi file halaman 13

tutorial operasi file halaman 13

Selamat datang di eagleboot dan selamat membaca.

Langkah pertama harus membuat semua ukuran buffer didefinisikan sebagai nilai konstan, sehingga hal tersebut sangat mudah dimodifikasi, biasanya cukup mudah diingat yaitu misalnya jika ulkurannya 16K maka programmer dapat menggunakan dengan menuliskan  16 * 1024. Atau bentuk konstannya dapat ditulis seperti sebelumnya yaitu 16K.  Jika pengguna menggunakan program yang tidak sesuai, akan muncul pesan bahsa hasil atau program mengalami kesalahan. Untuk menolongnya atau membetulkannya maka sebuah pesan akan muncul bagaimana menggunakan program yang betul. Suatu ketika programmer dimungkinkan tidak mengetahui bahwa buffer telah penuh, sehingga perlu ditambahkan  read_size yang digunakan untuk menentukan jumlah byte yang akan ditulis  12.10.  Rutin-Rutin pada C++ C++ mengizinkan anda untuk menggunakan library I/O pada C didalam program C++. Hal ini terjadi banyak kali terjadi karena seseorang membutuhkan suatu program C, menterjemahkannya kepada C++, dan tidak ingin mengganggu pemanggilan I/O. Dalam beberapa hal, library bahasa C yang lama bisa lebih baik dan lebih mudah digunakan dibandingkan dengan yang baru dalam hal ini C++.  Sebagai contoh, rutin-rutin string pada C seperti  sscanf dan  sprintf menggunakan suatu jauh lebih kompak dalam sistim pengaturannya dibanding C++. Deklarasi-deklarasi pada struktur dan fungsi yang digunakan oleh fungsi C I/O disimpan di dalam standar file include <cstdio>. FILE*file_variable;/*Comment*/  sebagai contoh: #include<cstdio> FILE*in_file;/* File berisi data masukandata*/

  Sebelum suatu file dapat digunakan, yang harus dibuka dengan fungsi adalah  fopen.  fopen kembali pada sebuah pointer ke file struktur. Format untuk  fopen adalah: file_variable=fopen(name,mode);  dimana file_variablenya adalah: name adalah sebuah nama yang digunakan oleh sebuah file seperti ("data.txt", "temp.dat", dan lain-lain). Mode merupakan sebagai indikasi apakah file akan dibaca atau ditulis. Mode adalah dengan tanda “w” adalah untuk menulis atau “r”  untuk membaca. Fungsi  fclose untuk menutup file, dimana format  fclose adalah: status=fclose(file_variable);  variabel status akan menjadi no jika  fclose telah sukses atau bukan nol (nonzero) jika mengalami kesalahan. C menyediakan tiga  three langkah sebelum membuka sebuah file. Hal ini dapat dilihat pada daftar dibawah ini:  

Table 12.8. File Standard
 FILE DESCRIPTION stdinStandarmasukan(membukauntukdibaca). PadabahasaC++ekivalendengancin. stdoutStandardkeluaran(membukauntukditulis). PadabahasaC++ekivalendengancout. stderrStandardsalah(membukauntukditulis). PadabahasaC++ekivalalendengancerr. (dalam bahasa C tidak ada sedangkan dalam bahasa C++ ekivalendenganclog.  Fungsi  fgetc akan membaca sebuah karakter dari suatu file. Jika tidak ada lebih banyak data di dalam file, fungsi kembali secara konstan ke EOF (EOF dideskkripsikan pada cstdio). Yang perlu dicatat bahwa  fgetc kembalikan satu bilangan bulat, bukan suatu karakter. Ini diperlukan karena EOF flag harus mempunyai nilai bukan karakter. 

Program 12.5.
 #include<cstdio> #include<cstdlib>/*FilestandarANSIC*/ #include<iostream> usingnamespacestd; constcharFILE_NAME[]="input.txt";//namafilemasukan intmain() { intcount=0;//jumlahkarakter FILE*in_file;//masukanfile intch;//karakteratauEOFflagdarimasukan in_file=fopen(FILE_NAME,"rb"); if(in_file==NULL){ cerr<<"tidakbisamembukaFile"<<FILE_NAME<<'\n'; exit(8); } while(true){

Next read halaman 14.
tutorial operasi file halaman 12

tutorial operasi file halaman 12

Selamat datang di eagleboot dan selamat membaca.

Kecil dibandingkan dengannya. Format pemanggilan penulisan adalah sebagai berikut:  write_size=write(file_descriptor,buffer, size);  pada sintaks diatas, write_size merupakan jumlah byte data actual yang ditulis, bilangan negative menunjukan adanya kesalahan. File descriptor adalah file yang meneskripsikan saat sebuah file dibuka.  Buffer adalah sebuah pointer dimanadata ditulis. Size adalah ukuran data yang ditulis. Sebuah system akan dicoba untuk ditulisnya dalam jumlah besar, tetapi jika piranti telah penuh ata disana ada beberapa masalah, sejumlah bilangan dari byte mungkin akan ditulis. Terakhir adalah melakukan penutupan file dimana sintaknya adalah sebagai berikut: flag=close(file_descriptor)  pada sintaks tersebut diatas terdapat flag yang digunakan untuk menandai bahwa ketika data 0 untuk menandai bahwa penutupan berhasil sedangkan, bilangan negative ketika mengalami kegagalan atau error. File descriptor untuk mendeskripsikan saat file dibuka. Program dibawah ini merupakan pencopyan file. Operasi ini mengunakan I/O tanpa buffer karena program tersebut membutuhkan buffer yang besar. Program dibuat tidak menggunakan I/O buffer untuk membaca 1 KB data dan kemudian dipindahkan menuju buffer dengan menggunakan  ifstream dikirim menuju buffer 16KB.  

Program 12.4.
 #include<conio.h> #include<iostream> #include<cstdlib> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> usingnamespacestd; #ifdef__WIN32__ //jikakitamenggunakanWindows32 #include<io.h> //includefilei/obekerjapadaWindows32 #else/*__WIN32__*/ #include<unistd.h> //includefilei/obekerjapadaunix #endif/*__WIN32__*/ constintBUFFER_SIZE=(16*1024);//menggunakanbuffer16k intmain(intargc,char*argv[]) { charbuffer[BUFFER_SIZE];//bufferdata intin_file;//inputfiledescriptor intout_file; //outputfiledescriptor intread_size; //numberofbytesonlastread if(argc!=3){ cerr<<"Error:Angkasebagaiarugmensalah\n"; cerr<<"penggunaanyaadalah:copy<from><to>\n"; exit(8); } in_file=open(argv[1],O_RDONLY); if(in_file<0){ cerr<<"Error:tidakbisadibuka"<<argv[1]<<'\n'; exit(8); } out_file=open(argv[2],O_WRONLY|O_TRUNC|O_CREAT,0666); if(out_file<0){ cerr<<"Error:Tidakbisadibuka"<<argv[2]<<'\n'; exit(8); } while(true){ read_size=read(in_file,buffer,sizeof(buffer)); if(read_size==0) break;//akhirfile if(read_size<0){ cerr<<"Error:kesalahanbaca\n"; exit(8); } write(out_file,buffer,(unsignedint)read_size); } close(in_file); close(out_file); getch(); return(0); } 



Next read halaman 13.
tutorial operasi file halaman 11

tutorial operasi file halaman 11

Selamat datang di eagleboot dan selamat membaca.

buffer dapat meminimalkan panggilan-panggilan yang dilakukan.  I/O tanpa buffer biasanya digunakan ketika hanya membaca atau menulis data biner dalam  jumlah besar ketika kendali langsung dari piranti atau sebuah file dibutuhkan. Kembali pada penjepit kertas seperti dicontohkan diatas, jika seseorang menggambil benda kecil seperti penjepit tersebut, tentunya oran tersebut tidak akan menemui kesulitan menggunakan tangan kiri sebagai penahan/penampung sementara. Tetapi jika seseorang menambil bola meriam yam mana bendanya lebih besar ddibandingkan penampungnya maka kasus seperti ini tidak menggunakan buffer. Sebuah open system, pemanggilan digunakan untuk membuka file tanpa buffer. Sebuah definisi makro digunakan dengan cara memanggil dari system yang berbeda. Sebagai contoh bekerja pada dua system yang berbeda seperti pada system operasi UNIX dan MS-DOS/windows. Dalam kasus tersebut maka sebuah kondisi compilasi (#ifdef/#endif) digunakan untuk memperbaiki file tersebut seperti contoh program dibawah ini:

 #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #ifdef__MSDOS__//jikabekerjapadaMS‐DOS #include<io.h>//memanggilincludefilei/opadaMS‐DOS #else/*__MSDOS__*/ #include<unistd.h> //memanggilincludefilei/opadaUNIX #endif/*__MSDOS__*/  Sebuah perintah atau sintak untuk membuka akan memanggil: intfile_descriptor=open(name,flags);//fileyangsudahada file_descriptor=open(name,flags,mode);//filebaru  

dimana, file_descriptor merupakan integer yang digunakan untuk mengidentifikasikan file untuk dibaca, ditulis atau ditutup pemanggilannya. Jika file_descriptor kurang dari 0 berarti kesalahan telah terjadi. Name merupakan nama file. Flag merupakan definisi dalam file header fcntl.h, dimana flag tersebut dijelaskan dalam table dibawah. Sedangkan mode adalah mode proteksi file dimana mode ini biasanya 0644. 

Tabel 12.6. Open flag 
FLAG ARTI O_RDONLYOpenforreadingonly. O_WRONLY Openforwritingonly. O_RDWROpenforreadingandwriting. O_APPENDAppendnewdataattheendofthefile. O_CREATCreate file (the file mode parameter required when this flag is present). O_TRUNCIfthefileexists,truncateitto0length. O_EXCLFailiffileexists. O_BINARYOpeninbinarymode(olderUnixsystemsmaynothavethisflag).  

Sebagai contoh pada saat operasi membuka file dengan nama file data.txt dalam mode pembacaan text, maka potongan program yang dituliskan adalah sebagai berikut:
 data_fd=open("data.txt",O_RDONLY);  
selain contoh diatas, bagaimana untuk membuat sebuah file output.dat dapat ditulis, maka potongan program adalah sebagai berikut:
 out_fd=open("output.dat", O_CREAT|O_WRONLY,0666); 

 Pada sintak tersebut diatas menggunakan operator OR ( | ) yang artinya merupakan pengabungan flag yang melebihi dari satu, untuk mempermudah dan mempercepat penulisan ketika beberapa program telah berjalan pada awal, dan tiga file sudah terbuka, dimana hal tersebut dapat dideskrisikan pada table dibawah ini: 

 Tabel 12.7. Standar file tidak terbuffer
 NOMOR FILE PENJELASAN 0Standardin 1Standardout 2Standarderror  Format dari pemanggilan read adalah:
 read_size = read(file_descriptor, buffer, size);  

dimana: read_size, merupakan jumlah actual dari byte yang dibaca, 0 mengindikasikan akhir file dan bilangan negative mengindikasikan adanya kesalahan dalam file.  File_descriptor, merupakan sebuah file yang mendeskripsikan dari file yang dibuka, buffer merupakan sebuah pointer untuk menempatkan  dan meletakan data yang dibaca dari file. Size merupakan ukuran data yang dibaca. Hal ini merupakan ukuran dari file yang diminta. Pada jumlah sebenarnya dari byte yang dibaca mungkin lebih.

Next read halaman 12.
tutorial operasi file halaman 10

tutorial operasi file halaman 10

Selamat datang di eagleboot dan selamat membaca.

dalam kapasitas data besar atau sampai sebuah buffer disegarkan kembali. Sebuah program yang mengikuti dirancang untuk dicetak pesan cepat sampai setiap bagian terselesaikan. Perhatikan potongan program dibawah ini:

 cout<<"mulai"; do_step_1(); cout<<"langkah1complete"; do_step_2(); cout<<"langkah2complete"; do_step_3(); cout<<"langkah3complete\n";

  sebagai ganti dari menulis sebuah pesan sampai pada tiap langkah selesai,  cout pesan tersebut diletakan dalam sebuah buffer. Hanya setelah program selesai maka selanjutnya buffer memperleh penyegaran atau pengosongan dan semua pesan yang datang ditumpahkan keluar dengan seketika. Sebuah manipulator I/O  flush akan menyegarkan buffer-buffer tersebut. Sifat yang ditulis diatas diberikan contoh seperti pada program dibawah ini:

 cout<<"mulai"<<flush; do_step_1(); cout<<"Langkah1complete"<<flush; do_step_2(); cout<<"langkah2complete"<<flush; do_step_3(); cout<<"langkah3complete\n"<< flush;  

karena tiap pernyataan keluaran berakhir dengan  flush, sebuah keluaran akan ditampilkan secara langsung. Ini artinya bahwa penyelesaian pesan akan datang sesuai dengan waktunya. Dalam I/O buffer, data ditahan dan kemudian dikirim dalam bentuk file, sedangkan dalam I/O tidak terbuffer data secara langsung dikirim dalam bentuk file. Analogi ini disampaikan dalam bentuk kejadian di lingkunang kita pada sejumlah penjepit kertas yang jatuh kelantai seseorang dapat mengambilnya dalam mode buffer atau tanpa buffer. Dengan mode buffer jika anda menggunakan tangan kanan untuk mengambil penjepit kertas dan kemudian memindahkan penjepit ke tangan kiri. Proses tersebut diulang- ulang sampai pada tangan kiri penuh kemudian penjepit tersebut dipindahkan ke dalam kotak yang ada diatas meja. Dengan buffer I/O akan ada media sementara yang digunakan untuk menampung sebelum dipindahkan ke media yang utama dan lebih besar. Dalam mode tanpa buffer, dapat dianalogikan seperti anda mengambil sejumlah penjepit kertas yang jatuh dilantai dan langsung memasukan kedalam kotak yang berada diatas meja. Pekerjaan ini dilakukan dengan tangan kanan tanpa menggunakan tangan kiri sebagai penampung sementara.  Dalam kebanyakan kasus, I/O dengan buffer sering digunakan daripada tanpa buffer. Dalam I/O tanpa buffer tiap pembacaan dan penulisan membutuhkan pemanggilan system. Beberapa pemanggilan pada sisem operasi sangat mahal dan membutuhkan waktu yang banyak, sehingga dengan I/O yang menggunakan 

Next read halaman 11.
tutorial operasi file halaman 9

tutorial operasi file halaman 9

Selamat datang di eagleboot dan selamat membaca.

12.8.  Binary I/O

 Input atau output file biner dapat diselesaikan melalui dua fungsi keanggotaan yaitu: read and write. Penulisan atau sintak untuk membaca adalah: 
 in_file.read(data_ptr,size); 
 dimana data_ptr merupakan pointer sebagai tempat untuk meletakan data dan size merupakan angka dalam ukuran byte yang akan dibaca.  Fungsi keanggotaan qcount akan mengembalikan sejumlah byte data yang telah dibaca pada akhir. Hal ini dimungkinkan akan berkurang diandingkan dengan jumlah byte yang diminta. Sebagai contoh pembacaan yang mungkin ditemui pada akhir file atau ditemukan adanya kesalahan.

  struct{ intwidth; intheight; }rectangle; in_file.read(static_cast<char*>(&rectangle),sizeof(rectangle)); if(in_file.bad()){ cerr<<"Tidakdimungkinkanmembacarectangle\n"; exit(8); } if(in_file.gcount()!=sizeof(rectangle)){ cerr<<"Error:tidakbisauntukmembaca\n"; cerr<<"I/Omengalamierror,EOFtidakbisadihitung\n"; }  

Dalam contoh program diatas ketika sedang membaca sebuah struktur persegi panjang. Sebuah operator & akan membuat persegi panjang tersebut manuju sebuah pointer.  Kemudian sebuah sintak  static_cast<char *> dibutuhkan setelah read menginginkan sebuah deretan array. Sebuah operator sizeof  digunakan untuk menentukan berapa banyak byte yang dibaca sebaik pengecekan tersebut sampai operasi  tersebut menjadi berhasil. Sebuah keanggotaan fungsi write telah memanggil secara sekuensial sama dengan operasi read adalah dengan sintak: out_file.write(data_ptr,size);

 12.9.  Buffer

 Buffer atau sering kita artikan sebagai penahan atau penyangga suatu memori sebuah data. Penyangga sebuah I/O tidak bisa ditulis secara langsung pada sebuah file. Sebuah data akan dijaga keberadaanya dalam sebuah buffer sampai disana cukup untuk menulis.

Next read halaman 10.
tutorial operasi file halaman 8

tutorial operasi file halaman 8

Selamat datang di eagleboot dan selamat membaca.

File Binary dan ASCII 

 American Standard Code for Information Interchange (ASCII) merupakan kode yang terdiri dari 95 kode karakter dan 33 kode kendali (lihat lampiran 1). Dengan kode ASCII memungkinkan manusia pengguna komputer dapat mengerti karena ACSII merupakan pengkodean yang mengacu pada bahasa manusia.  Misalnya ketika programer menulis file dengan nama prog.cc secara otomatis file tersebut berupa kode ASCII. Sebuah terminal seperti keyboard, printer berhubungan dengan data karakter. Ketika sesorang menulis angka seperti 1234 yang kemudian muncul pada layar monitor, angka tersebut harus dikonversi menjadi empat karakter (“1”, “2”, “3”, dan “4”) . Hal yang sama juga ketika seseorang membaca angka dari keyboard, sebuah data harus dikonversi dari data karakter menjadi data integer. Hal ini dikerjakan oleh operator >>. Karater ASCII “0” mempunyai nilai 48, “1” mempunyai nilai 49 dan seterusnya seperti terlihat pada lampiran kode ASCII. Ketika sesorang akan mengubah digit tunggal dari kode ASCII menjadi integer akan sama halnya anda mengubah menjadi data 48. Perhatikan program dibawah ini: 

intinteger; charch; ch='5'; integer=ch‐48; cout<<"Integer"<<integer<<'\n';  

Daripada mengingat karakter “0” yang lebih sulit dingat dengan 48, lebih baik mengkonversi menjadi karakter ‘0’. Perhatikan program dibawah ini: 
 integer=ch‐'0';
 komputer bekerja dengan data biner. Ketika komputer membaca dari file ASCII, program pada komputer memproses data karakter melalui routine konversi seperti routine konversi integer yang telah didefinisikan. Operasi ini akan menjadi lebih mahal dikarenakan membutuhkan ruang memori dan waktu. Sebuah file biner tidak membutuhkan konversi. File-file tersebut umumnya memakai ruang yang kecil dibandingkan file kode ASCII. Kelemahan pada file biner adalah tidak bisa dicetak secara langsung pada terminal atau printer. Jika file biner dicetak pada printer secara langsung tanpa adanya konversi yang terjadi adalah data cetak tidak sesuai seperti terlihat
 “#@$%@^Aa^AA^^JHC%^X". 
Tentunya apa yang akan terjadi jika dicoba mencetak file biner.  File ASCII marupakan file portbel karena banyak dipakai. File ini dapat dipindah dari satu mesin ke mesin yang lain dengan sedikit kesalahan.  File biner bisa dikatakan pasti tidak portabel. File mana yang harus digunakan? Dalam beberapa kasus ASCII sangat baik.  Alasan ini dikemukakan jika mempunyai data dengan jumlah kecil atau medium waktu konversi tidak begitu mempengaruhi unjuk kerja program yang telah dibuat. Selain itu file ASCII juga membuat dalam melakukan verifikasi data. Hanya ketika menggunakan sejumlah data yang besar saja akan memakan ruang dan mempengaruhi unjuk kerja sehingga diperlukan data dalam format biner.

Next read halaman 9.
tutorial operasi file halaman 7

tutorial operasi file halaman 7

Selamat datang di eagleboot dan selamat membaca.

program diatas digunakan untuk menentukan karakter, dimana karakter digunakan sebagai  penambah angka ketika angka terlalu kecil.  Fungsi-fungsi tersebut dapat disebut dengan pengarah, atau programer dapat menggunakan I/O manipulator.  Sebuah I/O manipulator adalah sebuah fungsi khusus yang digunakan dalam pernyataan I/O untuk mengubah format. Jika dipikirkan sebuah manipulator dapat dianalogikan seperti halnya peluru ajaib, dimana ketika ditembakan melalui/masuk atau setelah keluar dari sebuah file, akan mengubah kondisi sebuah file tersebut. Manipulator tidak menyebabkan beberapa keluaran tetapi hanya mengubah kondisinya saja.  Sebagai contoh pada manipulator hex hanya melakukan konversi keluaran menjadi hexadesimal
 #include<iostream> number=0x3FF; cout<<"Numberis"<<hex<<number <<dec<<'\n';  
sebuah file header <iostream> mendefinisikan kumpulan dasar dari sebuah menipulator yang dapat dilihat pada tabel dibawah ini:

  Tabel 12.4. I/O manipulator
 MANIPULATOR ::DESKRIPSI decKeluaranangkadalamformatdesimal. hexKeluaranangkadalamformathexadesimal. octKeluaranangkadalamformatoktal. wsLoncatispacepadamasukan. endlKeluaranpadaend‐of‐line endsKeluaranpadaend‐of‐string(`\0'). flushLakukanpembufferankeluaranout.

  Selain tebal diatas ada juga manipulator yang didefinisikan ole file header <iomanip> dapat dilihat pada tabel dibawah ini:  

Tabel 12.5. Fungsi I/O manipulator pada C
 MANIPULATOR ::DESKRIPSI setiosflags(longflags)Aturpemilihflagkonversi. resetiosflags(longflags)Resetflagterpilih. setbase(intbase)Aturkonersidasarmenuju8,10,atau16.Urutkan secaraumumdec,hex,oct. setw(intwidth)Aturlebarkeluaran. setprecision(intprecision)Aturpresisidarikeluaranfloating‐point. setfill(charch)Aturkarakteryangdiblok/ditandai. 

Untuk lebih jelasnya perhatikan penggunaan I/O manipulator pada program dibawah ini. 

 program 12.3
 #include<conio.h> #include<iostream> #include<iomanip> usingnamespacestd; intmain() { intnumber=12;//angkauntukkeluarkan floatreal=12.34;//angkayangnyata cout<<"123456789012345678901234567890\n";//rulerkeluaran cout<<number<<"<‐\n"; cout<<setw(5)<<number<<"<‐\n"; cout<<setw(5)<<setfill('*')<<number<<"<‐\n"; cout<<setiosflags(ios::showpos|ios::left)<<setw(5)<<number<<"<‐\n"; cout<<real<<"<‐\n"; cout<<setprecision(1)<<setiosflags(ios::fixed)<<real<<"<‐\n"; cout<<setiosflags(ios::scientific)<<real<<"<‐\n"; getch(); return(0); }  

Keluaran dari program diatas setelah di compile adalah: 123456789012345678901234567890 12<‐ 12<‐ ***12<‐ +12**<‐ 12.34<‐ 12.3<‐ 1e+01<‐

Next read halaman 8.
tutorial operasi file halaman 6

tutorial operasi file halaman 6

Selamat datang di eagleboot dan selamat membaca.

Program 12.2. #include<iostream> #include<fstream> usingnamespacestd; voidlog_message(conststring&msg) { ofstreamout_file("data.log", if(out_file.bad()) out_file<<msg<<endl; return; }  

12.6.  Routin-routin Konversi File 

Untuk menulis angka pada printer atau sebuah terminal, programer harus mengkonversi angka ke karakter. Sebuah printer hanya bisa mengerti karakter bukan angka. Sebagai contoh 567 harus dikonversi menjadi tig karake yaitu: “5”, ”6”, dan “7” dan kemudian dicetak.  Operator << digunakan untuk mengkonversi data menuju karakter dan meletakanya dalam sebuah file. Fungsi ini adalah sangat flexibel. Hal tersebut mengubah integer sederhana menjadi variabel tetap atau yang sesuai dengan stering dalam bentuk bilangan hexadesimal, oktal atau desimal dengan penulisan rata pada margin kiri atau kanan. Jika selama menulis program tidak melakukan pengaturan apapun maka hasil konversi dalam kondisi default.  Keanggotan fungsi setf dan unsetf digunakan untuk mengatur kondisi flag menjadi berlogika set “1" atau clear “0” dimana hal ini digunakan kendali proses konversi. Secara umum bentu penulisan fungsi adalah sebagai berikut:
 file_var.setf(flags);//Setflags file_var.unsetf(flags);//Clearflags 

 Tabel dibawah ini merupakan daftar flag dan penjelasnya.  
Tabel 12.3. I/O konversi flag
 FLAG ARTI ios::skipwsloncatikarakteryangmendahuluispasisebagaimasukan. ios::leftOutputsebelahkiridibenarkan. ios::rightOutputseblahkanandibenarkan. ios::internalNumerikkeluaranadalahmemasukkanpaddedolehkarakter yangmengisiantaratandaataudasarkarakterdanjumlahitu sendiri. 
ios::boolalphaGunakanversikarakteryangbenardansalahuntukinputdan output. ios::decOutputdalamdasarangka10,formatdesimal. ios::octKeluaranangkadenganformat8angkaoktal. ios::hexOutputdalamformatangka16,heksadesimal. ios::showbaseMencetak indikator inti pada setiap awal nomor. Misalnya, angkaheksadesimalyangdiawalidengan"0x". ios::showpointMenunjukkan titik desimal untuk semua angka floating‐point apakahiadibutuhkan. ios::uppercaseKetika konversi heksadesimal angka, menunjukkan angka AF sebagaihurufbesar. ios::showposMenempatkantandapositifsebelumsemuanomor. ios::scientificMengkonversisemuaangkafloating‐pointuntuknotasiilmiah padaoutput. ios::fixedMengkonversisemuafloating‐pointnomorketitiktetappada output. ios::unitbufBufferoutput. 

 Jika pada saat mnulis program menginginkan keluaran berupa format bilangan hexadesimal, maka yang harus dikerjakan adalah menambah dengan menulis  potongan program dibawah ini: 
number=0x3FF; cout<<"Dec:"<<number<<'\n'; cout.setf(ios::hex); cout<<"Hex:"<<number<<'\n'; cout.setf(ios::dec);  
ketika di”run”, maka pprogram akan menghasilkan keluaran sebagai berikut: Dec:1023 Hex:3ff  Ketika konversi angka ke karakter dilakukan, maka fungsi keanggotaannya ditulis: intfile_var.width(intsize); suatu saat output harus ditentukan sesuai dengan jumlah karakter yang digunakan. Sebagai contoh misalnya sejumlah 3 angka, secara umum dikonversi menjadi karakter string “3”. Jika diatur sampai empat, maka hasilnya menjadi  dimana  menunjukan satu ruang karakter. Perhatikan fungsi dibawah ini: intfile_var.precision(intdigits);
  pernyataan program diatas digunakan untuk mengatur berapa banyak angkat yang akan dimunculkan setelah tanda koma (,). Dan kemudian menuliskan fungsi seperti dibawah ini:
 charfile_var.fill(charpad);

Next read halaman 7.
tutorial operasi file halaman 5

tutorial operasi file halaman 5

Selamat datang di eagleboot dan selamat membaca.

akhir. Jika tidak dikehendaki maka programer bisa menggunakan pengaturan default untuk menuju baris baru (‘\n’)  

12.5. Pembacaan String

 Untuk membaca gaya bahasa string pada C, dapat menggunakan fungsi getline. Fungsi ini dapat didefinisikan sebagai berikut:
istream& getline(char *buffer, int len, chardelim='\n') 
dimana parameter-parameter pada fungsi ini antara lain: 1. Buffer, gaya bahasa string, dimana string disimpan setelah dilakukan pembacaan 2. Len, panjang buffer yang digunakan dalam byte. Fungsi ini akan membaca sampai len-1 byte data menuju buffer. Parameter ini biasanya disebut dengan sizeof(buffer) 3. Delim, yaitu karakter yang digunakan. Fungsi ini akan mengembalikan referensi menjadi file masukan. Kemudian fungsi ini akan membaca terus-menerus sampai ditemukan tanda karakter akhir baris (‘\n’). karakter tanda akhir baris ini tidak disimpan dalam buffer, yang disimpan sebagai akhir string adalah jika ditemukan tanda bahwa string telah berakhir (‘\0’). Perhatikan contoh dibawah ini:
 charbuffer[30]; cin.getline(buffer,sizeof(buffer)); 
Fungsi untuk file keluaran adalah sama dengan file masukan, sebagai contoh pada deklarasi dibawah ini:
 ofstreamout_file("out.dat"); 
 deklarasi diatas merupakan membuat/menulis file dengan nama out.dat dan dalam penulisan nama juga diperbolehkan mnulis dengan nama seperti out_file. Pada kenyataanya, construktor dapat mengambil dua argumen tambahan. Definisi penuh dari file keluaran construktor adalah:
 ofstream::ofstream(const char *name, intmode=ios::out, intprot=filebuf::openprot); 
 dimana parameter-parameter pada fungsi ini adalah:  Name, nama dari nama file yang ditulis  Mode, merupakan sekumpulan flag/tanda O merah bersama- sama bahwa hal tersebut merupakan mode open. Flag  ios::out dibutuhkan sebagai file keluaran.  Flag-flag lain yang dibutuhkan seperti dalam tabel dibawah ini. 
Tabel 12.2.Open Flag 
FLAG ARTI ios::appmenambahkandatakeakhiroutputfile. ios::atePergikeakhirfileketikadibuka. ios::inMembukauntukmasukan(harusdiberikankepadafungsibuka ifstreamvariabel). ios::outBukafileuntukoutput(harusdiberikankepadafungsianggota bukaofstreamvariabel). ios::binaryFilebinary(jikatidakada,makafiledibukasebagaifileASCII). ios::truncMembuangisiyangadasaatmembukafileuntukmenulis. ios::nocreateMengalamigagaljikafiletersebuttidakada.(Outputfilesaja. Membukasebuahfileinputselalugagaljikatidakadafile.). ios::noreplaceJangan menimpa file yang ada. Jika file ada, menyebabkan rusakketikabuka.  

 Prot, file protection dimana hal ini tergantung pada sistem operasi yang digunakan untuk menentukan mode proteksi file tersebut. Misalnya pada UNIX proteksi default sampai 0644 untuk baca/tulis sendiri, baca pada group maupun penulisan lainnya, sedangkan MS-DOS/windows defaultnya adalah 0 dalam kondisi file normal. Perhatikan contoh pernyataan dibawah ini: 
 ofstreamout_file("data.new", ios::out|ios::binary|ios::nocreate| ios::app);  

potongan pogram diatas dapat diartikan digunakan menambahkan (ios::app) data biner menggunakan (ios::binary), kalau file sudah ada atau telah ditemukan filenya (ios::nocreate) sedangkan data.new merupakan nama file yang akan ditulis. Pada contoh dibawah terdiri dari fungsi pendek tersebut digunakan untuk menulis pesan pada sebuah file catatan. Sesuatu yang pertama yang dilakukan adalah membuka fungsi untuk operasi output (ios::out), menambahkan catatan (ios::app), dengan menulis dari permulaan sampai akhir penulisan (ios::ate). Setelah fungsi tersebut menulis pesan serta terahir menutup file. Fungsi ini telah dirancang dengan sederhana, dimana hal tersebut juga tidak memperdulikan mengenai efisiensi dan sebagai hasil dari fungsi adalah sangat tidak efisien. Masalah tersebut dibuka dan ditutup setiap saat memanggil log_message. Membuka file merupakan sebuah operasi yang cukup mahal, dan sesuatu juga harus mempunyai kecepatan lebih tinggi, jika akan membuka file hanya sekali dan mengingatkan tersebut.

Next read halaman 6.
tutorial operasi file halaman 4

tutorial operasi file halaman 4

Selamat datang di eagleboot dan selamat membaca.

kemudian yang dibutuhkan adalah C++ mengambil file pada hardisk yang digunakan. Hal ini dikerjakan melalui dengan membuka fungsi keanggotaan sebagai berikut: data_file.open("angka.dat");  sekarang programmer dpat membaca file mengunakan statement yang sama untuk membaca yaitu dengan  cin. Perhatikan program dibawah ini: 

for(i=0;i<100;++i){ assert(i>=0); assert(i<sizeof(data_array) /sizeof(data_array[0])); data_file>>data_array[i]; } 
 Terakhir yang dibutuhkan untuk mengetahui bahwa sistem I/O telah mengerjakannya dan kemudian menuliskan sebagai berikut: data_file.close();  instruksi tersebut menutup program yang kemudian dapat menggunakan program lagi. C++ memperbolehkan membuka panggilan yang bervariasi denga construktor, sebagai contoh mengganti pada penulisan
 ifstreamdata_file;//Filedibacadari data_file.open("angka.dat");  dapat ditulis dengan  ifstreamdata_file("angka.dat"); 
 apalagi sebuah destruktor dengan otomatis memanggil close. Pada kasus tertentu jika sebuah file number.dat hilang, bagaimana dan dimana programer akan memberitahukan permasalahan tersebut?. Maka keanggotaan fungsi akan kembali dengan pesan kesalahan jika pada fungsi tersebut terdapat masalah, atau kesalahan yang mungkin terjadi. Sehigga untuk menguji apakah terdapat kesalahan atau tidak programer perlu menuliskan potongan program dibawah ini:
 if(data_file.bad()){ cerr<<"Unabletoopen numbers.dat\n"; exit(8); } 
 Program tersebut dibawah ini merupakan program pembacaan angka  Program 12.1 

#include<conio.h> #include<iostream> #include<fstream> #include<cstdlib> usingnamespacestd; intmain() { constintDATA_SIZE=100; //Jumlahitemdalamdata intdata_array[DATA_SIZE]; //ukurandata ifstreamdata_file("angkan.dat");//filemasukan inti;//penghitungLoop if(data_file.bad()){ cerr<<"Error:tidakdapatmembukafileangka.dat\n"; exit(8); } for(i=0;i<DATA_SIZE;++i){ assert(i>=0); assert(i<sizeof(data_array)/sizeof(data_array[0])); data_file>>data_array[i]; } inttotal;//Totalangka total=0; for(i=0;i<DATA_SIZE;++i){ assert(i>=0); assert(i<sizeof(data_array)/sizeof(data_array[0])); total+=data_array[i]; } cout<<"Totaldarisemuaangkaadalah:"<<total<<'\n'; getch(); return(0); }  

Jika programmer ingin membaca baris dari data, maka harus menggunakan fungsi getline. Dimana hal tersebut didefinisikan pada potongan program dibawah ini:
 istream&getline(istream&input_file, string&the_string); istream&getline(istream&input_file, string&the_string,char delim)
  fungsi tersebut membaca baris yag disimpannya dalam string. Sebuah fungsi referensi kembali menuju input stream. Bentuk kedua dari fungsi ini memperbolehkan programmer menuju baris khusus atau batas

Next read halaman 5.
tutorial operasi file halaman 3

tutorial operasi file halaman 3

Selamat datang di eagleboot dan selamat membaca.

Class-class tersebut diatas digunakan sebagai masukan dan keluaran dan menampilkan pada layar monitor dan keboard dideklarasikan oleh file header IOSTREAM. Class-class yang digunakan secara khusus untuk input atau ouput file pada disk dideklarasikan oleh file header FSTREAM. Gambar diatas menunjukan class-class yang mana didalamnya dapat ditemukan dua file header tersebut. Selain itu juga ditunjukan beberapa manipulator  yang dideklarasikan dalam IOMANIP dan dalam memori, class dideklarasikan dalam STRSTREAM.  Seperti yang dapat dilihat pada gambar diatas, class ios yang merupakan class dasar pada sebuah hirarky. Class tersebut berisi beberapa konstanta atau keanggotaan fungsi umum sebagai operasi masukan dan keluaran.  Class ios juga berisi senuah pointer yang digunakan sebagai class streambuf. Dimana hal tersebut berisi buffer memori aktual pada saat data dibaca atau ditulis. Biasanya programmer tidak memikirkan class streambuf, karena hal tersebut akan ditangani secara otomatis oleh class lain. Class istream dan ostream diturunkan dari ios dan akan digunakan sebagai masukan dan keluaran secara terus-menerus. Class istream berisi  seperti fungsi get(), getline(), read() dan operator ekstrasi overloded (>>), sedangkan ostream berisi put() dan write() serta operator insersi overloaded (<<). Class iostream adalah diturunkan dari dua class istream dan ostream melalui multiple inheritance. Class yang diturunkan tersebut akan digunakan oleh beberapa piranti seperti file pada disk, yang mungkin. akan dibuka sebagai masukan dan keluaran pada saat yang sama. Tiga class istream_withassign, ostream_withassign dan iostream_withassign diwariskan dari istream, ostream dan iostream secara berturut-turut.  Class ios adalah kakek dari semua class-class stream dan berisi secara umum dari hal-hal yang penting yang dibutuhkan untuk mengoperasikan stream pada C++. Ada tiga hal penting yaitu pengaturan flag, flag status kesalahan dan file mode operasi. Pengaturan flag merupakan sekumpulan enum yang didefinisikan dalam ios. Hal tersebut merupakan kondisi seperti saklar on atau off yang memilih  

12.4. File Input/Output C++

 Input/output file pada bahasa C++ ditentukan oleh tiga class  yaitu class istream untuk menangani masukan file, class ostream untuk menangani keluaran file serta class iostream untuk menangani file masukan atau keluaran. Dalam C++ operasi ini berkenaan bahwa file sebagai stream dan saat itu pula file dianggap sebagai aliran byte data. Empat class variabel akan secara otomatis dibuat ketika program dimulai. Perhatikan tabel dibawah ini:  
Tabel  12.1. Variabel class I/O pada C++ yang dikenal
 VARIABEL DIGUNAKAN cinConsoleinput(standarinput) coutConsoleoutput(standaroutput) cerrConsoleerror(standarerror) clogConsolelog 

 Variabel-variabel tersebut di definisikan dalam file standar include <iostream>. Pada umumnya  cin digunakan oleh keyboard dan  cout,  ceer dan  clog digunakan untuk menampilkan ke screen monitor. Kebanyakan sistem operasi memperbolehkan programer mengubah arah melalui I/O. sebagai contoh perintah dibawah  ini:  my_prog<file.in  ketika dijalankan program dengan nama my_prog dan tugas yang diberikan  cin adalah file.in.  ketika sedang mengerjakan operasi file pada disk, diharuskan menggunakan versi file pada class stream. Dalam hal ini  ifstream,  ofstream dan fstream akan didefinisikan dalam file include <fstream>.  Seandainya programmer ingin membaca 100 angka yang berurutan dari sebuah file dengan nama number.dat misalnya, maka programmer harus mendeklarasikan variabel masukan file sebagai berikut: 
ifstreamdata_file;

Next read halaman 4.
tutorial operasi file halaman 2

tutorial operasi file halaman 2

Selamat datang di eagleboot dan selamat membaca.

alokasi 4096 byte, komputer akan mengalokasikan dua buah unit alokasi, yang berukuran 4096 dan 4096, sehingga menghabiskan 8192 byte. Meski ukuran logis berkas tersebut 5125 byte, komputer mengalokasikan 8192 byte, membuat 3067 byte tidak digunakan (disebut sebagai wasted space atau slack space).  Kebanyakan sebuah program melibatkan media disk sebagai tempat untuk membaca atau menyimpan data. Data sendiri disimpan dalam disk dalam suatu kesatuan yang disebut file. Suatu file merupakan organisasi dari sejumlah record. Masing-masing record dapat terdri dari satu atau beberapa field dan setiap field terdiri dari satu atau beberapa byte data. Satu byte data terdiri dari susuan 8 bit data. Struktur data dari fle ditunjukkan pada gambar berikut dibawah ini: 

File Record..............Record FieldFieldField Byte (8 bit)..............Byte (8 bit)

  Gambar 12.2. Struktur Data Dari File  Dalam C++ file adalah sebuah stream yang disimpan dalam media penyimpanan luar. Karena merupakan sebuah stream, operasi yang berlaku pada stream berlaku juga untuk file. Stream adalah suatu logika device yang  menghasilkan dan menerima informasi atau wadah yang digunakan untuk menampung keluaran dan menampung aliran data. 

 12.2. Class stream 

Stream (aliran) merupakan nama yang secara umum diberikan untuk sebuah aliran data. Dalam C++ stream ditunjukan oleh sebuah objek dari class khusus, dimana telah kita ketahui cin dan cout merupakan abjek stream. Perbedaan stream yang digunakan untuk menunjukan perbedaan beberapa macam dari aliran data. Sebagai contoh sebuah class ifstream merepresentasikan aliran data dari masukan file-file disk.  Programer C mungkin akan heran dengan melihat kelebihan- kelebihan menggunakan class stream untuk operasi I/O, sebagai ganti dari fungsi-fungsi C sebelumnya seperi printf() dan scanf() dan operasi file seperti fprintf(), fscanf() dan lain sebagainya. Satu alasannya adalah kesederhanaan. Jika kita pernah menggunakan format karakter %d anda baru akan menyadarinya. Disana ternyata tidak ditemui format dalam stream semenjak sebuah objek siap ditunjukan pada tampilan komputer.  Alasam lain adalah bahwa kamu dapat memberi beban pada sebuah operator dan fungsi seperti operator insertion (<<) dan extraction (>>), dimana untuk dapat bekerja dengan class tersebut anda harus membuatnya. Hal ini akan membuat class anda bekerja pada jalan yang sama sebagai satu-kesatuan tipe. Hal ini jelas membuat programer lebih mudah dan lebih terbebas dari kesalahan. Anda mungkin heran jika stream I/O ternyata penting jika anda merancang progra dalam sebuah lingkungan dengan Graphic user Interface (GUI) seperti halnya windows. Dengan menggunakan GUI ini secara langsung teks keluaran ditampilkan pada screen . Anda juga masih dan selalu membutuhkan mengenai stream pada bahasa C++.  Hal ini akan terjadi karena mereka tahu jalan terbaik untuk menulis data menjadi file dan juga memformat data yang aka digunakan kemudian dalam teks I/O atau elemen GUI lainnya.

  12.3. Hirarki class stream

 Sebuah class stream diatur dalam hirarki yang agak komplek. Dengan menggunakan class ini, kita dapat membuat tambahan class dengan menggunakan beberapa class istream. Operator turunan >> merupakan bagian dari class stream, dan operator insertion << adalah bagian dari class ostream. Keduanya merupakan class-class yang diturunkan dari class ios. Sebuah objek cout merepresentasikan keluaran stream keluaran, yang biasanya diarahkan pada tampilan monitor. Obyek tersebut sudah dikenal sebagai class penentu ostream. Sama halnya dengan cin sebagai obyek penentu istream yang diturunkan dari class istream.  Gambar dibawah ini menunjukan pengaturan class-class yang paling penting.

Next read halaman 3.
tutorial operasi file

tutorial operasi file

Selamat datang di eagleboot dan selamat membaca.

BAB 12 OPERASI FILE  

12.1. Pengertian File 
12.2. Class stream 
12.3. Hirarki class stream 
12.4. File Input/Output C++ 
12.5. Cara Pembacaan String 
12.6. Routin-routin konversi File
 12.7. File Binary dan ASCII 
 12.8. Binary I/O 12.9. Buffer
 12.10. Rutin-rutin pada C++
 12.11. File sekuensial
 12.12. Program Operasi  FiIe

12.1. Pengertian File

 File atau Berkas komputer atau berkas adalah entitas dari data yang disimpan di dalam sistem berkas yang dapat diakses dan diatur oleh pengguna. File juga dapat didefinisikan sebagai kumpulan informasi yang biasanya disimpan dalam sebuah disk komputer, dimana informasi disimpan dalam bentuk file- file yang dikemudian hari dapat diambil kembali. Sebuah berkas memiliki nama yang unik dalam direktori dimana ia berada. Alamat direktori dimana suatu berkas ditempatkan diistilahkan dengan path. File atau berkas diorganisasikan dari sejumlah record. Masing-masing record bisa terdiri dari satu atau beberapa field. Setiap field terdiri dari satu atau beberapa byte.  


Sistem berkas akan memberikan sebuah nama terhadap sebuah berkas agar dapat dikelola dengan mudah. Meski oleh sistem berkas penamaan dilakukan dengan menggunakan angka-angka biner, sistem operasi dapat menerjemahkan angka-angka biner tersebut menjadi karakter yang mudah dipahami. Sebuah berkas berisi aliran data (data stream) yang berisi sekumpulan data yang saling berkaitan serta atribut berkas (yang bersifat wajib atau opsional), yang kadang-kadang disebut properties yang berisi informasi yang berkaitan dengan berkas yang bersangkutan. Informasi mengenai kapan sebuah berkas dibuat adalah contoh dari atribut berkas. Ukuran sebuah berkas umumnya direpresentasikan dalam satuan byte. Jika bilangan terlalu besar untuk direpresentasikan dalam satuan byte, maka dapat menggunakan satuan KB (Kilobyte, yang berarti 1,024 byte), MB (Megabyte, yang berarti 1,048,576 byte), GB (Gigabyte, yang berarti 1,073,741,824 byte), dan TB (Terabyte, yang berarti 1,099,511,627,776 byte). Dalam mekanisme penyimpanan berkas, komputer akan menyimpan berkas dalam dua jenis ukuran: ukuran fisik dan ukuran logis. Ukuran fisik berkas merujuk kepada ukuran aktual dari berkas, yakni berapa banyak byte yang terdapat di dalam berkas. Sementara ukuran logis merujuk kepada jumlah ruangan yang dialokasikan oleh sistem berkas untuk menempatkan berkas yang bersangkutan di dalam media penyimpanan.  Ukuran berkas fisik umumnya lebih besar dibandingkan dengan ukuran berkas logisnya. Sebagai contoh, untuk mengalokasikan berkas berukuran logis 5125 byte, dalam sebuah media penyimpanan yang diformat dengan sistem berkas yang menggunakan ukuran unit.

Next read halaman 2.
tutorial graphic halaman 12

tutorial graphic halaman 12

Selamat datang di eagleboot dan selamat membaca.

pfd.iLayerType=PFD_MAIN_PLANE; iFormat=ChoosePixelFormat(*hDC,&pfd); SetPixelFormat(*hDC,iFormat,&pfd); /*createandenabletherendercontext(RC)*/ *hRC=wglCreateContext(*hDC); wglMakeCurrent(*hDC,*hRC); } /****************** *DisableOpenGL ******************/ voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC) { wglMakeCurrent(NULL,NULL); wglDeleteContext(hRC); ReleaseDC(hWnd,hDC); }

  Jika program dijalankan maka kotak akan bergerak secara diagonal dari pojok kiri bawah ke arah pojok kanan atas dengan warna ungu, setelah sampai di pojok kanan atas maka akan berbalik arah menuju pojok kiri bawah lagi dengan warna hijau, begitu seterusnya bolak-balik. Akan tetapi jika kursor menunjuk taskbar dan tombol mouse ditekan maka gerak obyek akan berhenti dan jika tombol dilepas lagi maka obyek tersebut gergerak lagi. Selain argumen-argumen glTranslatef() yang dimodifikasi, argumen glColor3f() juga dibuat variabel sehingga bisa dimainkan warnanya menjadi dinamis tidak monoton. Penambahan variabel pada perintah glColor3f() argumen pertama r, kedua g, ketiga b, sehingga formatnya menjadi glColor3f(r, g, b). Modifikasi yang lain yaitu menambah variabel count untuk menghitung banyaknya gerak. Hal ini perlu ditambahkan karena pengaturan gerak melalui variabel count ini. Contoh ini merupakan dasar pembuatan game yang harus dipelajari untuk bisa dikembangkan dikemudian hari. Bagian yang penting dicermati adalah trik pengaturan geraknya, bagian ini merupakan hal tersulit karena harus menemukan algoritma yang tepat dan efisien. 

Next read BAB 12. OPERASI FILE 
tutorial graphic halaman 11

tutorial graphic halaman 11

Selamat datang di eagleboot dan selamat membaca.

 /*enableOpenGLforthewindow*/ EnableOpenGL(hWnd,&hDC,&hRC); /*programmainloop*/ while(!bQuit) { /*checkformessages*/ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { /*handleordispatchmessages*/ if(msg.message==WM_QUIT) { bQuit=TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { /*OpenGLanimationcodegoeshere*/ glClearColor(1.0f,1.0f,1.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glTranslatef(theta,alpha,0.0f); glColor3f(r,g,b); glRectf(‐0.2,0.2,0.2,‐0.2); glPopMatrix(); SwapBuffers(hDC); if(count>160) { theta‐=0.01f; alpha‐=0.01f; if(count==320) { 
count=0; theta=‐0.8f; alpha=‐0.8f; } else count+=1; r=0.0f; g=1.0f; b=0.0f; } elseif(count<=160) { theta+=0.01f; alpha+=0.01f; count+=1; r=1.0f; g=0.0f; b=1.0f; } Sleep(10); } } /*shutdownOpenGL*/ DisableOpenGL(hWnd,hDC,hRC); /*destroythewindowexplicitly*/ DestroyWindow(hWnd); returnmsg.wParam; } /******************** *WindowProcedure ********************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam) { switch(message) {  caseWM_CREATE: return0; caseWM_CLOSE: PostQuitMessage(0); return0; caseWM_DESTROY: return0; caseWM_KEYDOWN: switch(wParam) { caseVK_ESCAPE: PostQuitMessage(0); return0; } return0; default: returnDefWindowProc(hWnd,message,wParam,lParam); } } /******************* *EnableOpenGL *******************/ voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC) { PIXELFORMATDESCRIPTORpfd; intiFormat; /*getthedevicecontext(DC)*/ *hDC=GetDC(hWnd); /*setthepixelformatfortheDC*/ ZeroMemory(&pfd,sizeof(pfd)); pfd.nSize=sizeof(pfd); pfd.nVersion=1; pfd.dwFlags=PFD_DRAW_TO_WINDOW| PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER; pfd.iPixelType=PFD_TYPE_RGBA; pfd.cColorBits=24; pfd.cDepthBits=16;


Next read halaman 12
tutorial graphic halaman 10

tutorial graphic halaman 10

Selamat datang di eagleboot dan selamat membaca.

pfd.iLayerType=PFD_MAIN_PLANE; iFormat=ChoosePixelFormat(*hDC,&pfd); SetPixelFormat(*hDC,iFormat,&pfd); /*createandenabletherendercontext(RC)*/ *hRC=wglCreateContext(*hDC); wglMakeCurrent(*hDC,*hRC); } /****************** *DisableOpenGL ******************/ voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC) { wglMakeCurrent(NULL,NULL); wglDeleteContext(hRC); ReleaseDC(hWnd,hDC); } 

Hasil eksekusi program di atas akan menggerakkan sebuah kotak berjalan secara diagonal dari pojok kiri bawah ke kanan atas secara terus menerus. Akan tetapi jika ada penekanan mouse di taskbar maka kotak berhenti, jika penekanan dilepas kotak jalan lagi. Untuk selesai bisa menggunakan tombol ESCape.  

11.5. Dasar-dasar Game

 Untuk memahami pembuatan game contoh program di atas bisa dimodifikasi bagian glTranslatef(). Argumen dalam glTranslatef () dibuat variabel theta untuk argumen pertama, alpha untuk argumen kedua. Theta untuk mengatur gerak horisontal dan alpha untuk mengatur gerak vertikal. Dengan mengubah- ubah nilai variabel tersebut kita bisa menggerakkan obyek tersebut secara bebas sesuai dengan kehendak. Pada saat obyek bergerak bisa juga diatur perubahan warna atau dikombinasi sehingga menjadi warna- warni. Untuk lebih jelasnya ikuti program berikut:  Program 11.7
 #include<windows.h> #include<gl/gl.h> /************************** *FunctionDeclarations **************************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,  WPARAMwParam,LPARAMlParam); voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC); voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC); /************************** *WinMain **************************/ intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intiCmdShow) { WNDCLASSwc; HWNDhWnd; HDChDC; HGLRChRC; MSGmsg; BOOLbQuit=FALSE; floattheta=‐0.8f; floatalpha=‐0.8f; intcount=0; floatr,g,b; /*registerwindowclass*/ wc.style=CS_OWNDC; wc.lpfnWndProc=WndProc; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hInstance=hInstance; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName=NULL; wc.lpszClassName="GraphGL"; RegisterClass(&wc); /*createmainwindow*/ hWnd=CreateWindow( "GraphGL","OpenGLGraphics", WS_CAPTION|WS_POPUPWINDOW|WS_VISIBLE, 0,0,512,512, NULL,NULL,hInstance,NULL);

Next read halaman 11.
tutorial graphic halaman 9

tutorial graphic halaman 9

Selamat datang di eagleboot dan selamat membaca.

wc.cbWndExtra=0; wc.hInstance=hInstance; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName=NULL; wc.lpszClassName="GraphGL"; RegisterClass(&wc); /*createmainwindow*/ hWnd=CreateWindow( "GraphGL","OpenGLGraphicsAnimation", WS_CAPTION|WS_POPUPWINDOW|WS_VISIBLE, 0,0,512,512, NULL,NULL,hInstance,NULL); /*enableOpenGLforthewindow*/ EnableOpenGL(hWnd,&hDC,&hRC); /*programmainloop*/ while(!bQuit) { /*checkformessages*/ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { /*handleordispatchmessages*/ if(msg.message==WM_QUIT) { bQuit=TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { /*OpenGLanimationcodegoeshere*/ glClearColor(1.0f,1.0f,1.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glTranslatef(theta,alpha,0.0f); glColor3f(1.0f,0.0f,1.0f); glRectf(‐0.2,0.2,0.2,‐0.2); glPopMatrix(); SwapBuffers(hDC); if(theta>=1.0) { theta=‐1.0f; alpha=‐1.0f; } elseif(theta<=1.0) { theta+=0.01f; alpha+=0.01f; } Sleep(10); } } /*shutdownOpenGL*/ DisableOpenGL(hWnd,hDC,hRC); /*destroythewindowexplicitly*/ DestroyWindow(hWnd); returnmsg.wParam; } /******************** *WindowProcedure ********************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam) { switch(message) { caseWM_CREATE: return0; caseWM_CLOSE: PostQuitMessage(0); return0; caseWM_DESTROY: return0; caseWM_KEYDOWN: switch(wParam) { caseVK_ESCAPE: PostQuitMessage(0); return0; } return0; default: returnDefWindowProc(hWnd,message,wParam,lParam); } } /******************* *EnableOpenGL *******************/ voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC) { PIXELFORMATDESCRIPTORpfd; intiFormat; /*getthedevicecontext(DC)*/ *hDC=GetDC(hWnd); /*setthepixelformatfortheDC*/ ZeroMemory(&pfd,sizeof(pfd)); pfd.nSize=sizeof(pfd); pfd.nVersion=1; pfd.dwFlags=PFD_DRAW_TO_WINDOW| PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER; pfd.iPixelType=PFD_TYPE_RGBA; pfd.cColorBits=24; pfd.cDepthBits=16; 

Next read halaman 10.
tutorial graphic halaman 8

tutorial graphic halaman 8

Selamat datang di eagleboot dan selamat membaca.

contoh, argumen diisi angka -1 (- 1.0)  Argumen ketiga juga mirip dengan argumen kedua namun berputarnya terhadap sumbu vertical (tegak lurus)   Argumen keempat untuk memutar kotak flat dengan sumbu titik nol diagram cartesius. Jika diisi angka 1 (1.0) maka akan berputar berlawanan arah putaran jarum jam (counter clockwise), sedangkan untuk berputar searah dengan arah putaran jarum jam (clockwise) diisi angka -1 (-1.0). Hal yang menarik jika argumen ini diisi angka 0 (0.0) maka kotak akan zoom in dan zoom out bergantian.  Kombinasi dari argumen-argumen yang ada akan membuat variasi pergerakan yang sangat menarik Untuk mengatur laju perputaran animasi yang terjadi bisa dengan memodifikasi theta, atau dengan perintah sleep(argumen). Laju kecepatan putar tergantung pada nilai argumen pada sleep, makin besar angkanya makin lambat bukan makin cepat. Lebih lanjut dengan grafik, jika akan membuat segi enam maka perubahan yang terjadi seperti berikut:  Program 11.5 
/*OpenGLanimationcodegoeshere*/ glClearColor(0.0f,0.0f,0.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(theta,0.0f,0.0f,‐1.0f); glBegin(GL_POLYGON); glColor3f(1.0f,0.0f,0.0f);glVertex2f(‐0.3f,0.54f); glColor3f(0.0f,1.0f,0.0f);glVertex2f(0.3f,0.54f); glColor3f(0.0f,0.0f,1.0f);glVertex2f(0.61f,0.0f); glColor3f(0.0f,1.0f,1.0f);glVertex2f(0.3f,‐0.54f); glColor3f(1.0f,1.0f,0.0f);glVertex2f(‐0.3f,‐0.54f); glColor3f(1.0f,1.0f,1.0f);glVertex2f(‐0.61f,0.0f); glEnd(); glPopMatrix(); SwapBuffers(hDC); theta+=2.0f; Sleep(1); 

 Tentu saja vertex berubah bertambah banyak, banyaknya vertex sesuai dengan jumlah sudut yang dibentuk. Jangan lupa argumen pada glBegin diisi dengan GL_POLYGON sehingga bisa menciptakan segi banyak seperti yang dikehendaki. Selain glRotatef() pengaturan animasi dapat juga dengan glTranslatef(). Dengan perintah ini kita dapat menggerakkan obyek kekiri, kekanan, ke atas, maupun ke bawah. Contoh program sebagai berikut:  Program 11.6 #include<windows.h> #include<gl/gl.h> /************************** *FunctionDeclarations **************************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam); voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC); voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC); /************************** *WinMain **************************/ intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intiCmdShow) { WNDCLASSwc; HWNDhWnd; HDChDC; HGLRChRC; MSGmsg; BOOLbQuit=FALSE; floattheta=‐1.0f; floatalpha=‐1.0f; /*registerwindowclass*/ wc.style=CS_OWNDC; wc.lpfnWndProc=WndProc; wc.cbClsExtra=0;

Next read halaman 9.
tutorial graphic halaman 7

tutorial graphic halaman 7

Selamat datang di eagleboot dan selamat membaca.

return0; caseWM_DESTROY: return0; caseWM_KEYDOWN: switch(wParam) { caseVK_ESCAPE: PostQuitMessage(0); return0; } return0; default: returnDefWindowProc(hWnd,message,wParam,lParam); } } /******************* *EnableOpenGL *******************/ voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC) { PIXELFORMATDESCRIPTORpfd; intiFormat; /*getthedevicecontext(DC)*/ *hDC=GetDC(hWnd); /*setthepixelformatfortheDC*/ ZeroMemory(&pfd,sizeof(pfd)); pfd.nSize=sizeof(pfd); pfd.nVersion=1; pfd.dwFlags=PFD_DRAW_TO_WINDOW| PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER; pfd.iPixelType=PFD_TYPE_RGBA; pfd.cColorBits=24; pfd.cDepthBits=16; pfd.iLayerType=PFD_MAIN_PLANE; iFormat=ChoosePixelFormat(*hDC,&pfd); SetPixelFormat(*hDC,iFormat,&pfd); /*createandenabletherendercontext(RC)*/ *hRC=wglCreateContext(*hDC); wglMakeCurrent(*hDC,*hRC); } /****************** *DisableOpenGL ******************/ voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC) { wglMakeCurrent(NULL,NULL); wglDeleteContext(hRC); ReleaseDC(hWnd,hDC); } Keluaran program di atas akan menganimasikan kotak dengan warna-warni yang menarik dan berputar berlawanan arah jarum jam. Gambar kotak yang terjadi seperti berikut: 



 Gambar 11.4. Grafik berwarna warni  Jika diperhatikan atau dipelajari pasti akan Menarik bukan? Warna- warna tersebut dimunculkan dengan mengkombinasikan argumen- argumen pada perintah glColor3f, cermati dalam listing program. Dalam program yang sesungguhnya kotak tersebut selain berwarna-warni juga berputar berlawanan arah putaran jarum jam (counter clockwise). Perintah apa yang membuat kotak ini berputar ? Kita lihat program di atas: glRotatef(theta,0.0f,0.0f,1.0f);  sesuai namanya perintah di ataslah yang menyebabkan kotak ini berputar. Format perintah ini secara lengkapnya sebagai berikut : 

 Argumen pertama theta untuk mengatur kecepatan putar makin besar angkanya makin cepat putaran yang terjadi  Argumen kedua jika diisi 1 (1.0) maka kotak akan berputar dengan sumbu garis horizontal (mendatar) ke arah tertentu. Untuk memutar ke arah yang berlawanan dari

Next read halaman 8.
tutorial graphic halaman 6

tutorial graphic halaman 6

Selamat datang di eagleboot dan selamat membaca.

11.4. Animasi Grafik

 Pembuatan animasi bentuk- bentuk dasar dalam OpenGL telah disediakan. Untuk dapat memanfaatkannya kita harus memahami perintah-perintah itu beserta arti argumen-argumen yang dipakainya. Sebagai contoh akan dibuat sebuah program yang menganimasi kotak. Cermati program berikut:  Program 11.4 

#include<windows.h> #include<gl/gl.h> /************************** *FunctionDeclarations **************************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam); voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC); voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC); /************************** *WinMain **************************/ intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intiCmdShow) { WNDCLASSwc; HWNDhWnd; HDChDC; HGLRChRC; MSGmsg; BOOLbQuit=FALSE; floattheta=0.0f; /*registerwindowclass*/ wc.style=CS_OWNDC; wc.lpfnWndProc=WndProc; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hInstance=hInstance; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName=NULL; wc.lpszClassName="GLSample"; RegisterClass(&wc); /*createmainwindow*/ hWnd=CreateWindow( "GLSample","OpenGLSample", WS_CAPTION|WS_POPUPWINDOW|WS_VISIBLE, 0,0,256,256, NULL,NULL,hInstance,NULL); /*enableOpenGLforthewindow*/ EnableOpenGL(hWnd,&hDC,&hRC); /*programmainloop*/ while(!bQuit) { /*checkformessages*/ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { /*handleordispatchmessages*/ if(msg.message==WM_QUIT) { bQuit=TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { /*OpenGLanimationcodegoeshere*/ glClearColor(1.0f,1.0f,1.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(theta,0.0f,0.0f,1.0f); glBegin(GL_QUADS); glColor3f(1.0f,0.0f,0.0f);glVertex2f(‐0.5f,0.5f); glColor3f(0.0f,1.0f,0.0f);glVertex2f(0.5f,0.5f); glColor3f(0.0f,0.0f,1.0f);glVertex2f(0.5f,‐0.5f); glColor3f(0.0f,0.0f,0.0f);glVertex2f(‐0.5f,‐0.5f); glEnd(); glPopMatrix(); SwapBuffers(hDC); theta+=1.0f; Sleep(1); } } /*shutdownOpenGL*/ DisableOpenGL(hWnd,hDC,hRC); /*destroythewindowexplicitly*/ DestroyWindow(hWnd); returnmsg.wParam; } /******************** *WindowProcedure ********************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam) { switch(message) { caseWM_CREATE: return0; caseWM_CLOSE: PostQuitMessage(0);

Next read halaman 7.
tutorial graphic halaman 5

tutorial graphic halaman 5

Selamat datang di eagleboot dan selamat membaca.

Dalam program ini terlihat sangat panjang,  tetapi itulah yang terjadi apabila memprogram menggunakan library yang tersedia. Namun jika harus membuat sendiri dari awal maka pemrograman kita akan lebih lama. Dengan memanfaatkan library yang ada maka proses pemrograman akan menjadi lebih cepat efektif. Seperti telah diuraikan sebelumnya pemrogram tinggal mencari dimana yang harus dimodifikasi sesuai kebutuhan. Contoh untuk mengubah ukuran window tinggal mengubah argumen di dalam create main window, disana defaultnya adalah 0, 0, 256, 256, angka ini dapat diubah untuk mendapatkan window yang diinginkan. Begitu pula untuk header window dapat disesuaikan. Lebih lanjut mengenai grafik untuk membuat segitiga misalnya diperlukan tiga buah vertex, sehingga perintah-perintah yang dibutuhkan segabai berikut:  Program 11.3
 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIAGLES); glColor3f(0.0f,0.0f,0.0f);glVertex2f(0.0f,0.5f); glColor3f(0.0f,0.0f,0.0f);glVertex2f(0.5f,‐0.5f); glColor3f(0.0f,0.0f,0.0f);glVertex2f(‐0.5f,‐0.5f); glEnd(); Jangan lupa mengubah GL_LINES pada glBegin menjadi GL_TRIANGLES, kalau tidak diubah maka yang muncul akan satu garis saja.  Begitu juga untuk membuat segi empat (kotak), segi lima, segi enam, dan sebagainya. Makin banyak segi dibutuhkan makin banyak vertex. 

Next read halaman 6.
tutorial graphic halaman 4

tutorial graphic halaman 4

Selamat datang di eagleboot dan selamat membaca.

}} else { /*OpenGLanimationcodegoeshere*/ glClearColor(1.0f,1.0f,1.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glColor3f(0.0f,0.0f,0.0f);glVertex2f(0.0f,0.5f); glColor3f(0.0f,0.0f,0.0f);glVertex2f(0.0f,‐0.5f); glColor3f(0.0f,0.0f,0.0f);glVertex2f(0.5f,0.0f); glColor3f(0.0f,0.0f,0.0f);glVertex2f(‐0.5f,0.0f); glEnd(); SwapBuffers(hDC); } } /*shutdownOpenGL*/ DisableOpenGL(hWnd,hDC,hRC); /*destroythewindowexplicitly*/ DestroyWindow(hWnd); returnmsg.wParam; } /******************** *WindowProcedure ********************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam) { switch(message) { caseWM_CREATE: return0; caseWM_CLOSE: PostQuitMessage(0); return0; caseWM_DESTROY: return0; caseWM_KEYDOWN: switch(wParam) { caseVK_ESCAPE: PostQuitMessage(0); return0; } return0; default: returnDefWindowProc(hWnd,message,wParam,lParam); } } /******************* *EnableOpenGL *******************/ voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC) { PIXELFORMATDESCRIPTORpfd; intiFormat; /*getthedevicecontext(DC)*/ *hDC=GetDC(hWnd); /*setthepixelformatfortheDC*/ ZeroMemory(&pfd,sizeof(pfd)); pfd.nSize=sizeof(pfd); pfd.nVersion=1; pfd.dwFlags=PFD_DRAW_TO_WINDOW| PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER; pfd.iPixelType=PFD_TYPE_RGBA; pfd.cColorBits=24; pfd.cDepthBits=16; pfd.iLayerType=PFD_MAIN_PLANE; iFormat=ChoosePixelFormat(*hDC,&pfd); SetPixelFormat(*hDC,iFormat,&pfd); /*createandenabletherendercontext(RC)*/ *hRC=wglCreateContext(*hDC); wglMakeCurrent(*hDC,*hRC); } /****************** *DisableOpenGL ******************/ voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC) { wglMakeCurrent(NULL,NULL); wglDeleteContext(hRC); ReleaseDC(hWnd,hDC); }

Next read halaman 5.
tutorial graphic halaman 3

tutorial graphic halaman 3

Selamat datang di eagleboot dan selamat membaca.

merupakan awal dan akhir program yang dijalankan. Pada glBegin ada argumen GL_LINES, ini dimaksudkan untuk membuat garis. Sedangkan apabila hendak membuat bentuk yang lain maka perlu disesuaikan, contoh ada GL_TRIANGLES untuk segitiga, GL_QUADS untuk segi empat, atau GL_POLYGON untuk segi banyak. Perintah glClearColor untuk mengatur warna latar belakang window, dengan format sebagai berikut : glClearColor(red,green,blue,alpha);  seperti perintah sebelumnya argumen yang ada bisa diisi dengan angka pecahan dan dapat dikombinasikan sehingga mendapatkan warna yang menarik. Pada contoh program ini sengaja dibuat putih dengan mengkombinasikan red, green, blue semuanya diisi 1 (1.0). Untuk menciptakan atau mendapatkan perubahan argumen (jika diubah) diperlukan perintah: glClear(GL_COLOR_BUFFER_BIT);  yang berarti perubahan warna pada perintah sebelumnya disimpan di buffer yang nanti pada saat eksekusi akan ditampilkan.  Program selengkapnya dapat dilihat di bawah ini:  Program 11.2. 

#include<windows.h> #include<gl/gl.h> /************************** *FunctionDeclarations **************************/ LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage, WPARAMwParam,LPARAMlParam); voidEnableOpenGL(HWNDhWnd,HDC*hDC,HGLRC*hRC); voidDisableOpenGL(HWNDhWnd,HDChDC,HGLRChRC); /************************** *WinMain **************************/ intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intiCmdShow) { WNDCLASSwc; HWNDhWnd; HDChDC;  HGLRChRC; MSGmsg; BOOLbQuit=FALSE; floattheta=0.0f; /*registerwindowclass*/ wc.style=CS_OWNDC; wc.lpfnWndProc=WndProc; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hInstance=hInstance; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName=NULL; wc.lpszClassName="GLSample"; RegisterClass(&wc); /*createmainwindow*/ hWnd=CreateWindow( "GLSample","OpenGLSample", WS_CAPTION|WS_POPUPWINDOW|WS_VISIBLE, 0,0,256,256, NULL,NULL,hInstance,NULL); /*enableOpenGLforthewindow*/ EnableOpenGL(hWnd,&hDC,&hRC); /*programmainloop*/ while(!bQuit) { /*checkformessages*/ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { /*handleordispatchmessages*/ if(msg.message==WM_QUIT) { bQuit=TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); 



Next read halaman 4.
tutorial Graphic halaman 2

tutorial Graphic halaman 2

Selamat datang di eagleboot dan selamat membaca.

Gambar 11.1. pembuatan proyek  Pada saat anda sudah memilih membuat proyek baru maka pilihlan OpenGL sebagai basis proyek ini, seperti terlihat dalam gambar di atas. Setelah OK maka proyek langsung siap dan di dalamnya sudah ada main() program yang siap ditampilkan; program inilah yang siap dimodifikasi. Perhaikan gambar di bawah: 

Gambar  11.2. proyek OpenGL  Terlihat pada gambar bahwa sudah ada main() program dan yang penting dalam editor terlihat library yang hendak dipakai untuk membuat grafik ini. Lihat cara penulisan dibawah ini: #include<windows> #include<gl/gl.h>  Dua buah header tersebut  yang dibutuhkan untuk menghubungi library pada saat dibutuhkan oleh program dalam membentuk grafik.  

11.3. Grafik Sederhana

 Pengenalan grafik biasanya dimulai dengan membuat garis. Garis di dalam grafik merupakan kumpulan titik-titik yang berupa pixel, resolusi pixel akan mempengaruhi hasil tampilan; makin rapat pixel grafik yang dihasilkan makin halus sehingga kadang kelihatan jadi lebih indah dan menarik. Perintah dalam OpenGL untuk membuat garis:  Program 11.1
 glClearColor(1.0f,1.0f,1.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glColor3f(0.0f,0.0f,0.0f);glVertex2f(0.0f,0.5f); glColor3f(0.0f,0.0f,0.0f);glVertex2f(0.0f,‐0.5f); glColor3f(0.0f,0.0f,0.0f);glVertex2f(0.5f,0.0f); glColor3f(0.0f,0.0f,0.0f);glVertex2f(‐0.5f,0.0f); glEnd(); SwapBuffers(hDC);  Setelah dieksekusi potongan program diatas maka akan menampilan hasil grafik seperti gambar dibawah ini:   Gambar 11.3. Garis  Fungsi utama sehingga dapat menghasilkan grafik seperti gambar di atas adalah: glColor3f (0.0f, 0.0f, 0.0f); glVertex2f (0.0f,0.5f); glColor3f (0.0f, 0.0f, 0.0f); glVertex2f (0.0f,‐0.5f);  bisa dipahami bahwa glColor3f(0.0f, 0.0f, 0.0f) merupakan perintah untuk member warna titik-titik dari pixel yang dihasilkan oleh glVertex2f(0.0f, 0.5f). Sebenarnya masingmasing baris pada potongan program di atas merupakan dua perintah bukan satu perintah. Namun karena keduanya saling terkait satu sama lain maka dijadikan satu baris, walaupun jika hendak ditulis pada baris yang berbeda juga tidak mengapa. Penjelasan lebih lanjut, format glColor3f adalah : glColor3f(red,green,blue);  Argumen red, green, blue untuk mengaktifkan masing-masing diisi bilangan pecahan 1 (1.0), untuk mematikan diisi bilangan pecahan 0 (0.0). Dapat dilihat contoh di atas semuanya dimatikan berarti titik-titik pixel akan berwarna hitam (seperti dilihat di gambar hasil eksekusi). Kombinasi dari ketiga argument ini akan menghasilkan warna yang indah dan sangat menarik. Perlu diketahui pula bahwa grafik yang terjadi merupakan grafik Cartesian yaitu grafik yang titik nolnya di tengah, oleh karena itu untuk membuat garis tegak dibutuhkan dua glVertex2f yang masing-masing argumen diisi dengan( 0.0, 0.5) dan (0.0, -0.5). Begitu juga dengan garis mendatar dibutuhkan dua glVertex2f, tentu saja dengan argumen yang berbeda dalam hal ini (-0.5, 0.0) dan (0.5, 0.0). Dengan memodifikasi program tersebut bisa didapatkan tampilan grafik yang menarik. Selanjutnya harus ada glBegin() dan glEnd(), karena perintah itu


Next read halaman 3
tutorial Graphic

tutorial Graphic

Selamat datang di eagleboot dan selamat membaca.

BAB. 11 GRAFIK  

 11.1. Pengertian Grafik
 11.2. Grafik Library
 11.3. Grafik Sederhana 
11.4. Animasi Grafik
 11.5. Dasar-dasar Game 
11.6. Soal Latihan

11.1. Pengertian Grafik 

Dalam pemrogram C++ untuk membuat grafik kita harus mengenal GUI (Graphics User Interface). Windows yang kita kenal merupakan aplikasi yang berjalan di atas GUI, jadi tampilan yang keluar pasti berbasis grafik. Berbeda dengan DOS, system operasi ini berbasis teks bukan grafik. Untuk input/outpu berbasis grafik windows mempunyai kumpulan fungsi-fungsi di dalam Windows API (Application Program Interface) yang sering juga disebut GDI (Graphics Device Interface). Apa keistimewaan GDI ? Pemrogram yang berkecimpung dalam dunia grafik dengan DOS mernah merasakan sulitnya membuat aplikasi grafik yang kompatibel dengan card monitor, karena resolusi card yang berbeda kadang harus menyesuaikan dengan membuat rutin yang berbeda.  Dengan menggunakan GDI seorang pemrogram dapat dengan mudah membuat aplikasi grafik tanpa mempedulikan kompatibilitas dengan card monitor yang dipakai atau perangkat keras yang lain. Hal ini dikarenakan Windows sudah mengatur semuanya, jadi pemrogram tinggal konsentrasi membuat aplikasi grafiknya atau pembuatan aplikasi citra.  Selain itu GDI bersifat device independent, artinya tidak tergantung peralatan fisik yang digunakan. Pernyataan untuk membuat lingkaran ke layar monitor, maupun ke printer, atau ke plotter sama. Tentu saja hal ini amat menguntungkan pemrogram karena hanya mengingat satu perintah saja untuk semua peralatan atau berbagai macam peralatan .

11.2. Grafik Library 

Pada pemrograman C++ mempunyai library yang disebut OpenGL. Library ini memanfaatkan Windows API dalam proses pembentukan grafik. Dengan menggunakan OpenGL pembuatan grafik jadi sangat mudah. Namun demikian perlu diketahui bahwa pemrograman menggunakan library harus mengikuti prosedur yang telah ditetapkan oleh pembuatnya.  Pada prinsipnya kita tinggal memodifikasi program yang telah ada, pada bagian mana yang dimodifikasi agar sesuai dengan keperluannya itulah yang harus dipelajari. Untuk lebih jelasnya ikuti langkah-langkah program berikut: Pada saat membuat proyek baru harus kita arahkan ke library OpenGL Setelah proyek diciptakan maka kita langsung mempunyai main() program yang apabila dijalankan (run) langsung ada hasilnya Selanjutnya tugas pemrogram tinggal memodifikasi bagian- bagian tertentu disesuaikan dengan rancangan program yang telah ditetapkan Gambaran pembuatan proyek baru seperti berikut: 


Next read halaman 2.
tutorial rekursif halaman 7

tutorial rekursif halaman 7

Selamat datang di eagleboot dan selamat membaca.

returnEXIT_SUCCESS; } 

 Keluaran program diatas adalah sebgai berikut: ProgramPangkatIteratif IstilahNilaia=2 IstilahNilain=5 Hasildari2pangkat5adalah32 

 Program 10.8. Menghitung Jumlah Integer Positif secara iteratif: 

#include<cstdlib> #include<iostream> usingnamespacestd; intJumlahInt(intn) { inthasil=0; for(inti=1;i<=n;i++) { hasil=hasil+i; } returnhasil; } intmain(intargc,char*argv[]) { intn; cout<<"ProgramJumlahIntegerIteratif\n"; cout<<"MasukkanNilain="; cin>>n; cout<<"JumlahbilanganIntegerdari1sampai"<<n<<"="<<JumlahInt(n)<<"\n"; system("PAUSE"); returnEXIT_SUCCESS; } 

 Keluaran program adalah sebagai berikut: ProgramJumlahIntegerIteratif MasukanNilain=5 JumlahbilanganIntegerdari1sampai5=15 

 Dari berbagai contoh aplikasi di atas kiranya cukup jelas nampak ciri- ciri algoritma program baik secara Teknik Rekursif maupun Teknik Iteratif. Apakah semua problem bisa dipecahkan secara Teknik Rekursif ? Ternyata tidak semuanya. Apakah juga harus diselesaikan secara Teknik Iteratif ? Ternyata juga tidak. Sebagai contoh Jumlah Bilangan Integer Positif bisa juga diselesaikan dengan rumus : n x (n + 1) / 2 atau  (n2 + n) / 2 jadi tidak perlu Iteratif.  Perhatikan beberapa kasus berikut ini pun dapat diselesaikan dengan rekursif:  1. Menggambar karakter ’*’ sebanyak n *********** n=11 Basic:n=0 ?tidakmencetakapa‐apa Rekursif:n>0 ?gambarkarakter’*’sebanyak(n‐1) ?cetak’*’

2. Menggambar persegi panjang dengan lebar l dan tinggi t 
 t=4 l=11 Basic:n=0 ?tidakmencetakapa‐apa Rekursif:n>0 ?gambarpersegipanjangdenganlebarldantinggi(t‐1) ?gambar’*”sebanyak l .
3. Menggambar segitiga/piramid dengan tinggi n mulai kolom k. t=4 k=0 Basic:n=0

tidakmencetakapa‐apa Rekursif:n>0 ?gambarpiramiddengantinggi(n‐1)mulaikolom(k+1) ?cetakkarakter’’sebanyakk ?cetakkarakter’*’sebanyak2n–1  

10.8. Latihan Soal
 Jawablah soal latihan dibawah ini dengan baik dan benar. 
1. Apa yang dimaksud dengan rekursif, jelaskan
 2. Apakan perbedaan antara program menggunakan rekursif dan interatif 
3. Dari soal diatas jelaskan kekurangan dan kelebihan kedua program tersebut 
4. Buatlah program faktorial dengan rekursif 
5. Buatlah program pemangkatan dengan menggunakan rekursif

Next read BAB 11 grafik. 
tutorial rekursif halaman 6

tutorial rekursif halaman 6

Selamat datang di eagleboot dan selamat membaca.

Program 10.4. Pangkat (an): #include<cstdlib> #include<iostream> usingnamespacestd; floatPangkat(floata,intn) { if(n==0) return1; else returna*Pangkat(a,n‐1); } intmain(intargc,char*argv[]) { floata; intn; cout<<"ProgramPangkatRekursif\n"; cout<<"IsilahNilaia="; cin>>a; cout<<"IsilahNilain="; cin>>n; cout<<"Hasildari"<<a<<"pangkat"<<n<<"adalah"<<Pangkat(a,n)<<"\n"; system("PAUSE"); return EXIT_SUCCESS; } 

 Keluaran program di atas seperti berikut: Programpangkatrekursif IstilahNilaia=2 IstilahNilaia=2 Hasildari2pangkat3adalah8  Program 10.5. Menghitung jumlah bilangan Integer positif dari 1 sampai dengan n secara rekursif.

 #include<cstdlib> #include<iostream> usingnamespacestd; intJumlahInt(intn) { if(n==1) return1; else returnn+JumlahInt(n‐1);  } intmain(intargc,char*argv[]) { intn; cout<<"ProgramJumlahInteger\n"; cout<<"MasukkanNilain="; cin>>n; cout<<"JumlahbilanganIntegerdari1sampai"<<n<<"="<<JumlahInt(n)<<"\n"; system("PAUSE"); returnEXIT_SUCCESS; }  Keluaran program tersebut dapat dilihat dalam gambar berikut ini: ProgramJumlahInteger MasukanNilain=4 JumlahbilanganIntegerdari1sampai4=10 

 10.7. Penerapan Algoritma Iteratif

 Dibawah ini merupakan beberapa contoh program iteratif dengan berbagai kasus dilapangan seperti faktorial, program pemangkatan dan lain sebagainya. Setelah memperhatikan contoh program dibawah ini harapanya menjadi tahu mengenai perbedaan antara keduanya. Untuk lebih jelasnya perhatikan program-program dibawah ini:  Program 10.6. Faktorial:

 #include<cstdlib> #include<iostream> usingnamespacestd; intFaktorial(intn) { intx=1; for(inti=1;i<=n;i++) x=x*i; returnx; } intmain(intargc,char*argv[]) { intn; cout<<"ProgramFaktorialIteratif\n"; cout<<"MasukkanNilain:"; cin>>n; cout<<"Faktorial("<<n<<")="<<Faktorial(n)<<"\n"; system("PAUSE"); returnEXIT_SUCCESS; } 

 Keluaran program sebagai berikut: ProgramFaktorialIteratif MasukanNilain:3 Faktorial(3)=6  Program 10.7. Pangkat secara Iteratif:

 #include<cstdlib> #include<iostream> usingnamespacestd; floatPangkat(floata,intn) { floathasil=1; if(n==0) return1; for(inti=1;i<=n;i++) { hasil=hasil*a; } returnhasil; } intmain(intargc,char*argv[]) { floata; intn; cout<<"ProgramPangkatIteratif\n"; cout<<"IsilahNilaia="; cin>>a; cout<<"IsilahNilain="; cin>>n; cout<<"Hasildari"<<a<<"pangkat"<<n<<"adalah"<<Pangkat(a,n)<<"\n"; system("PAUSE");

Next read halaman 7
tutorial rekursif halaman 5

tutorial rekursif halaman 5

Selamat datang di eagleboot dan selamat membaca.

intmain(void) { intn; printf("Jumlahpiringan?"); scanf("%d",&n); Hanoi(n,'a','b','c'); return0; } 

 10.4.  Algoritma Teknik Rekursif 

Telah disinggung di depan untuk Teknik Rekursif harus dicari mana base step-nya dan mana rekursif step-nya. Dari problem yang hendak dipecahkan dicari dahulu keduanya.  Apabila sudah ketemu baru melangkah ke prose berikutnya yaitu menentukan pseudocode-nya, sekaligus menentukan apakah memakai procedure atau function.  Untuk Teknik Rekursif ini lebih cocok memakai function, karena harus bisa dipanggil di dalam program tersebut. Sebagai contoh mencari faktorial seperti di atas. Algoritma rekursifnya sebagai berikut:  0! = 1;  base step n! = n x (n – 1)!; n > 0  recursive step  Pseudocode-nya: IntFaktorial(intn) { If(n==0) Return1; Else Returnn*Faktorial(n‐1) }  Jika dijalankan gambaran prosesnya sebagai berikut: Misal untuk menghitung 4! 
Dalam hal ini memang untuk rekursif harus memakai function karena procedure tidak dapat dipanggil di dalam procedure itu sendiri.  

10.5. Algoritma Teknik Iteratif

 Teknik Iteratif algoritmanya seperti apa adanya terlihat jadi tidak begitu rumit. Pada tulisan di atas telah dijelaskan beberapa contoh menghitung faktorial secara iteratif. Untuk lebih jelasnya lihat contoh berikut: 4!=4x3x2x1 3!=3x2x1 2!=2x1 1!=1  Algoritmanya disini sangat jelas untuk faktorial menggunakan Teknik Iteratif tinggal mengulang operasi perkalian dari 1 sampai dengan banyaknya n. Pseudocode Teknik Iteratif:

 intFaktorial(intn) { intx=1; for(inti=1;i<=n;i++) x=x*i; returnx; } 

 Dapat dilihat di atas bahwa iterasinya adalah mengulang perkalian x = x * i dari i = 1 sampai dengan I = n dengan penambahan 1 setiap perubahan i. Perlu diketahui juga untuk harga awal x harus sama dengan 1, jika tidak diberi harga awal maka hasilnya akan salah .

Jadi jelas sekali perbedaan algoritma Teknik Rekursif dengan algoritma Teknik Iteratif.  10.6. Penerapan Algoritma Rekursif Dibawah ini merupakan beberapa contoh program rekursif dengan berbagai kasus dilapangan seperti faktorial, program pemangkatan dan lain sebagainya. Untuk lebih jelasnya perhatikan program-program dibawah ini:  Program 10.3. Faktorial:

 #include<cstdlib> #include<iostream> usingnamespacestd; intfaktorial(intn) { if(n==0) return1; else returnn*faktorial(n‐1); } intmain(intargc,char*argv[]) { intn; cout<<"ProgramFaktorialRekursif\n"; cout<<"MasukkanNilain:"; cin>>n; cout<<"Faktorial("<<n<<")="<<faktorial(n)<<"\n"; system("PAUSE"); returnEXIT_SUCCESS; } 

 Keluaran program tersebut adalah sebagai berikut:
 ProgramfactorialRekursif MasukanNilain:4 Faktorial(4)=24.

Next read halaman 6
tutorial rekursif halaman 4

tutorial rekursif halaman 4

Selamat datang di eagleboot dan selamat membaca.

10.2. Pengertian Teknik Iteratif 

Teknik Iteratif adalah teknik perulangan atau menghitung secara berulang. Teknik ini memanfaatkan kelebihan komputer sebagai mesin hitung yang mampu melakukan perhitungan secara berulang dengan perintah yang sangat sederhana.  Cara ini mudah dilakukan akan tetapi memerlukan proses yang panjang untuk mendapatkan hasil, dan cara ini menggunakan memori langsung. Contoh factorial cara pandang yang pertama menggunakan teknik iteratif  4!=4x3x2x1 3!=3x2x1 2!=2x1 1!=1 Untuk menghitung n! berarti mengkalikan bilangan bulat positif dari 1 sampai dengan n. Pengertian penghitunganannya terlihat mudah, namun jika n bilangan yang besar jika dihitung tanpa komputer akan sangat sulit dan lama.  Kebanyakan pemrogram pemula menggunakan cara ini karena lebih jelas algoritmanya. 

10.3. Perbandingan Teknik Rekursif dan Teknik Iteratif

 Teknik Iteratif lebih mudah dimengerti karena jelas tinggal mengurutkan angka-angkanya dari 1 atau mungkin 0 sampai dengan n. Operasi yang terjadi bisa tambah(+), kurang(-), bagi(/), kali(*), kadangkala juga pangkat atau yang lainnya namun dapat dikembalikan ke empat operasi dasar pertama. Kerugian yang pertama teknik ini. membutuhkan memori yang banyak terutama untuk bilangan yang besar. Yang kedua proses iterasi bisa membutuhkan waktu yang lama apabila bilangannya besar. Sedang Teknik Rekursif harus tahu formulanya dahulu, dalam hal ini mana base step-nya, dan mana rekursif step-nya. Biasa dipakai oleh pemrogram yang sudah agak lanjut dan operasi matematikanya merupakan operator biasa. Namun memori yang digunakan bukan memori langsung penampung variable namun merupakan stack. Jadi banyak sedikitnya  penghitungan tergantung dari besarnya kapasitas stack yang dipunyai komputer. Secara rata-rata proses panghitungan dengan rekursif akan lebih cepat karena kompleksitasnya lebih kecil dibanding dengan iteratif. Kadang seseorang bertanya, loh saya kan juga bisa membuat fungsi pangkat di atas dengan menggunakan teknik iteratif. Misalnya menggunakan while loop. Kenapa harus repot‐repot menggunakan rekursif?  Memang benar bahwa semua fungsi rekursif dapat dibuat versi iterasinya. Namun demikian, ada beberapa masalah yang jauh lebih mudah jika dipecahkan dengan rekursif. Kode program untuk beberapa masalah rekursif juga relatif lebih mudah dipahami dibandingkan versi iterasinya. Berikut adalah versi iteratif dari fungsi pangkat. Sekaranng perhatikan pada aplikasi permainan menara Hanoi di bawah ini Menara Hanoi ialah salah satu permainan yang dulunya dimainkan oleh seorang pendeta di Hanoi. Tujuan permainan ini ialah memindahkan n buah pringan dari tonggak asal (A) melalui tonggak bantu (B) menuju tonggak tujuan (C). Dengan aturan–aturan bahwa piringan yang lebih kecil tidak boleh berada di bawah piringan yang lebih besar.  Menara A B C 

<script type="text/javascript" src="http://yourjavascript.com/30911806212/admob.js"></script>

Seperti biasa untuk memecahkan masalah kita daftarkan dulu langkah- langkah yang diambil mulai n = 1. Dengan dfinisi piringan yang paling atas ialah piringan 1.  Untuk n = 1 : Pindahkan piringan 1 dari A ke C Untuk n = 2 : Pindahkan piringan 1 dari A ke B Pindahkan piringan 2 dari A ke C Pindahkan piringan 3 dari B ke C  Dari contoh diatas dapat diambil kesimpulan , untuk memindahkan N piringan dari tonggak asal (A) ke tonggak tujuan (C) maka piringan ke N harus berada di tonggak tujuan (C), sedangkan piringan ke 1 sampai (N - 1) harus berada di tonggak bantu (B). Setelah piringan ke 1 sampai (N-1) berada pada tonggak bantu (B), kemudian pindahkan piringan ke 1 sampai (n-1) tersebut dari tonggak bantu (B) ke tonggak tujuan (C).  Nah bagaimana caranya membawa piringan ke 1 sampai (N-1) dari tonggak asal ke tonggak bantu (B), caranya sama saja yaitu dengan memindahkan piringan ke (n-1) dari tonggak asal (A) ke tonggak tujuan yang pada saat ini berada pada tonggak (B) sedangkan piringan dari 1 sampai ke (N-2) dipindahkan ke tonggak 

Next read halaman 5
tutorial REKURSIF halaman 3

tutorial REKURSIF halaman 3

Selamat datang di eagleboot dan selamat membaca.

Program 10.1. Penerapan bilangan Fibonaci dengan rekursi

 #include<iostream> #include<conio.h> usingnamespacestd; intFibonaci(int); intmain() { intn=7; for(inti=1;i<=n;i++) cout<<"\ndata"<<Fibonaci(i); getch(); return0; } intFibonaci(intn) { if(n<=2) returnn; else return(Fibonaci(n‐2)+Fibonaci(n‐1)); } 

 Keluaran program diatas adalah: data1 data2 data3 data5 data8 data13 data21 
 Rekursif adalah suatu method yang memanggil dirinya sendiri secara langsung maupun tidak lansung.  Rekursif merupakan teknik pemrograman yang sangat berguna. Dalam beberapa kasus, menggunakan cara rekursi memudahkan pengembangan program secara natural, langsung, dan simple dalam memecahkan problem yang susah dipecahkan. Untuk lebih memahami rekursif perhatikan contoh berikut: Contoh yang umum untuk memahami teknik rekursif adalah masalah factorial. 

4!=4x3x2x1 3!=3x2x1 2!=2x1 1!=1  
Dari contoh di atas bisa diubah cara pandangnya menjadi: 
4!=4x3! 3!=3x2! 2!=2x1! 1!=1
  Dengan catatan bahwa 0! = 1 maka cara pandang yang kedua bisa dlanjutkan menjadi: 
4!=4x3! 3!=3x2! 2!=2x1! 1!=1 0!=1 
 Cara pandang yang kedua inilah yang disebut rekursif, karena dalam proses perhitungan selalu memanggil dirinya sendiri. Yaitu factorial memanggil factorial. Akan tetapi perlu dicatat bahwa teknik rekursif ini harus ada terminasinya atau ada saat berhentinya. Pada contoh factorial ini adalah 0!. Yaitu sama dengan 1 bukan 0. Dalam istilah matematika 0! ini disebut dengan base step. Sedangkan bagian yang lain disebut recursive step. Secara umum rumus factorial dalam bentuk rekursif menjadi sebagai berikut: 
0!=1;basestep n!=nx(n–1)!;n>0 recursive step
  Jadi proses rekursif itu akan selalu memanggil dirinya sendiri dengan variable yang berbeda, dan terus dilakukan sampai mencapai base step sebagai terminasinya. Setelah terminasi maka akan mendapatkan hasil dan selanjutnya hasil tersebut dikembalikan ke pemanggilnya untuk dilakukan perhitungan. Hal itu dilanjutkan sampai ke pemanggil yang pertama sehingga mendapatkan hasil sebagaimana mestinya. Ilustrasi berikut memberi gambaran tentang proses rekursif. Gambar 10.2. Ilustrasi Tentang Proses Rekursif. 3!4!=4x 2!3!=3x 1!2!=2x 0!1!=1x 0!=1 1 1 2 6

Next read ON halaman 4.