Rabu, 22 Desember 2010

STRING DALAM BAHASA C


 Dalam bahasa pemrograman C,  string adalah array bertipe karakter (char). Untuk menampilkan string yang dikandung oleh sebuah array, karakter format yang yang dipergunakan adalah "%s". Ketika kita menginstruksikan komputer untuk menampilkan string,  komputer akan memeriksa satu per satu elemen array dan menampilkannya ke layar monitor.  Komputer akan berhenti memeriksa elemen array yang selanjutnya jika menemukan null character ('\0').  Perhatikan program di bawah ini:

#include <stdio.h>
void main()
{
   char nama[20];
   nama[0]='B';
   nama[1]='u';
   nama[2]='d';
   nama[3]='i';
   nama[4]='m';
   nama[5]='a';
   nama[6]='n';
   nama[7]='\0';
   printf("%s\n",nama);
     /* output : Budiman */
  nama[4]='\0';
  printf("%s\n",nama);
     /* output : Budi ---- karena elemen 4 berisi null */
}

      String juga bisa dideklarasikan dan sekaligus diinisialisasi dengan cara sebagai berikut:

char namaSaya[20]="Budiman";
char namaDia[]="Wati";
char *namaNya="Indah";
char namaKu[]={'B','u','d','i','m','a','n','\0'};

      Berbeda dengan Bahasa Pascal,  Bahasa C tidak mengijinkan diisinya sebuah nilai string secara langsung, sehingga statement berikut ini akan menimbulkan compile error:

namaKu[]="Budiman"; /* ERROR */
namaKu="Budiman"; /* JUGA ERROR */

Untuk mengisi string dengan sebuah nilai secara langsung,  kita harus menggunakan fungsi strncpy (singkatan dari string-n-copy) atau fungsi sprintf (singkatan dari string-print-format). Untuk menggunakan fungsi strncpy dibutuhkan file header <string.h>. Berikut ini adalah bentuk pemanggilan kedua fungsi tersebut:
strncpy (string tujuan, string asal, jumlah karakter string asal yang akan disalin);
sprintf (string tujuan, "format string", var1, var2, var3, ...);

#include <stdio.h>
#include <string.h>
void main()
{
   char namaKu[256]="Budiman";
   char namaSaya[256]="12345678901234567890";
   int umurSaya=35;
   strncpy(namaSaya,"Bukan Budiman",13);
   printf("%s\n",namaSaya);
     /* output : Bukan Budiman4567890
      "Bukan Budiman" = 13 huruf + 1 karaker NULL.
      Jika disalin sebanyak 13 huruf ke string namaSaya,
      maka karakter NULL tidak dikopi ke dalam string namaSaya
      */
  strncpy(namaSaya,"Adi",4);
   printf("%s\n",namaSaya);
      /* ouput : Adi
      "Adi" = 3 huruf + 1 karakter NULL.
      Jika dikopi sebanyak 4 huruf, maka karakter NULL
      ikut terkopi ke dalam string namaSaya
      */  
   strncpy(namaSaya,namaKu,256);
   /* cara paling baik menggunakan fungsi strncpy, yaitu
      menuliskan jumlah karakter yang akan dikopi sebanyak
      ukuran maksimum string tujuan.
   */
   printf("%s\n",namaSaya);
     /* output : Budiman */
   sprintf(namaSaya, "%s adalah %s dan berumur %d tahun",
        namaKu, namaKu, umurSaya);
   printf(namaSaya);
     /* output : Budiman adalah Budiman dan berumur 35 tahun
     */
}


      Untuk mengisi variabel string dari keyboard, Bahasa C menyediakan fungsi fgets dan fflush. Kombinasi kedua fungsi ini akan menghasilkan efek yang sama dengan instruksi readln dalam Bahasa Pascal. Perhatikan cara penggunaannya dalam program di bawah ini:

/* Contoh penggunaan FGETS dan FFLUSH untuk membaca string
      dari keyboard */
#include <stdio.h>
#include <string.h>
void main()
{
   char nama[11];
   printf("Silakan masukkan nama anda:");
  fgets(nama,11,stdin);
  fflush(stdin);
  printf("Selamat pagi, %s.\n",nama);
   printf("%s mempunyai 2 e-mail pagi ini.",nama);
}

Dalam program di atas,  jika nama yang diketikkan lebih dari 10 karakter,  maka karakter ke-11 dan seterusnya akan diabaikan. Tetapi jika nama yang dimasukkan 9 karakter atau kurang,  maka string akan diakhiri dengan NEWLINE-CHARACTER dan NULL-CHARACTER ("\n\0"). Dalam contoh program di atas,  jika nama yang dimasukkan adalah "Sukmawati" (9 karakter),  maka output yang dihasilkan adalah:

Selamat pagi, Sukmawati
.
Sukmawati
 mempunyai 2 e-mail pagi ini.

Ini adalah masalah dari fungsi fgets yang harus ditangani oleh pemrogram. Untuk menangani masalah tersebut, program harus mampu memeriksa jika elemen array string sebelum NULL-CHARACTER adalah NEWLINE-CHARACTER, kemudian menggantinya "\n" tersebut dengan "\0". Perhatikan program di bawah ini,  yang merupakan perbaikan dari program sebelumnya:

/* Perbaikan untuk mengatasi masalah NEWLINE-CHARACTER */
#include <stdio.h>
#include <string.h>
void main()
{
   char nama[11];
  int i,max=10;
   do {
     printf("Silakan masukkan nama anda:");
     fgets(nama,11,stdin);
     fflush(stdin);
     for (i=0;i<=max;i++){
        if(nama[i]=='\n'){
           nama[i]='\0';
           break;  /*Keluar dari for-loop*/
        }
     }
     if (i>0){
        break;  /*Keluar dari while-loop*/
     } else {
        printf("Anda belum memasukkan nama...\n");
     }
   } while (i==0);

  printf("Selamat pagi, %s.\n",nama);
   printf("%s mempunyai 2 e-mail pagi ini.",nama);
}

Contoh program di atas terdiri dari sebuah do/while-loop dan di dalam do/while-loop tersebut terdapat for-loop. Struktur do/while-loop dalam program di atas berguna untuk memastikan bahwa operator sudah memasukkan namanya, meskipun hanya terdiri dari sebuah karakter.  Sedangkan struktrur for-loop berguna untuk mengganti NEWLINE-CHARACTER dengan NULL-CHARACTER. Struktur perulangan untuk mengganti karakter tersebut dapat disederhanakan dengan menggunakan fungsi yang berguna untuk menentukan lokasi sebuah karakter di dalam sebuah string (fungsi strchr), sehingga:

     for (i=0;i<=max;i++){
        if(nama[i]=='\n'){
           nama[i]='\0';
           break;  /*Keluar dari for-loop*/
        }
     }

dapat diubah menjadi:

     if(strchr(nama,'\n')){
         strchr(nama,'\n')[0]='\0';
      }


      Bahasa Pascal mengijinkan dilakukannya operasi penjumlahan string, misalnya namaLengkap:='Ahmad'+' '+'Dahlan'. Dalam Bahasa C, diperlukan fungsi strcat.

/* Contoh Menjumlahkan String dengan STRCAT */
#include<stdio.h>
#include<string.h>
void main()
{
   char namaLengkap[256];
   char *namaDepan="Kyai";
   char *namaTengah="Ahmad";
   char *namaBelakang="Dahlan";
   strcat(namaLengkap,namaDepan);
   printf("%s\n",namaLengkap);
   /*output: Kyai*/
   strcat(namaLengkap," ");
   strcat(namaLengkap,namaTengah);
   printf("%s\n",namaLengkap);
   /*output: Kyai Ahmad*/ 
   strcat(namaLengkap," ");
   printf("%s\n", strcat(namaLengkap,namaBelakang));
   /*output: Kyai Ahmad Dahlan*/
}


      Untuk mencari terdapat atau tidaknya sebuah string di dalam string lainnya, fungsi yang dipergunakan adalah strstr.

/* Contoh mencari string di dalam string dengan STRSTR */
#include<stdio.h>
#include<string.h>
void main()
{
   char namaLengkap[]="Kyai Ahmad Dahlan";
   char namaDicari[]="Dahlan";
   if (strstr(namaLengkap,namaDicari)){
     printf("%s terdapat dalam %s",namaDicari,namaLengkap);
   }
}

Program di atas akan menghasilkan output:
Dahlan terdapat dalam Kyai Ahmad Dahlan.

Di bawah ini disajikan program Pascal untuk memisahkan digit bilangan integer dengan tanda titik dan mengubah tanda desimal dari titik menjadi koma.

program format_bilangan_dengan_pemisah_angka;
uses wincrt;
function formatstrbil(i:string):string;
var
   j:integer;
begin
j:=pos('.',i);
if j<>0 then begin
   i[j]:=',';
   j:=j-1;
end else
   j := length(i);
while j>3 do begin
   j := j - 3;
   insert ('.', i, j+1);
end;
formatstrbil:=i;
end;
var
   strbil:string;
   bil:real;
   posisiError:integer;
begin
   posisiError := 0;
   repeat
      write('Silakan masukkan sebuah bilangan: ');
      readln(strbil);
      val(strbil, bil, posisiError);
      if posisiError<>0 then
         writeln('Yang anda masukkan bukan bilangan real');
   until posisiError = 0;
   writeln(formatstrbil(strbil));
end.

Hasil penerjemahan program di atas menjadi program Bahasa C dapat dilihat di bawah ini. Program berbahasa C ini sangat intensif menggunakan pointer dan menggunakan fungsi strtod untuk mengkonversi string menjadi bilangan bertipe double.

/* Format bilangan dengan pemisah angka */
#include <stdio.h>
#include <string.h>
#include <stdlib.h> /* untuk fungsi strtod */

void formatstrbil(char *i)
{
   char *j, *k, temp[256];
   int p, ptemp=0;
   j = k = strchr(i,'.');
   if (j>0){
      p = strlen(i)-1;
      while (p>j-i){
         temp[ptemp++]=i[p];
         p--;
      }
      temp[ptemp++]=',';
      k = --j;
   } else {
      j = k = strchr(i,0) - 1;
   }
   while (j-i>=0){
     temp[ptemp++]= j[0];
      if ((k-j+1)%3==0 && k-j!=0 && j-i!=0){
         temp[ptemp++]= '.';
      }
      j--;
   }
   ptemp--;
   p=0;
   while (ptemp>=0)
      i[p++]=temp[ptemp--];
   i[p]=0;
}

main()
{
   char strbil[256], *error;
   double bil;
   do {
      printf("Silakan masukkan sebuah bilangan: ");
      fgets(strbil, 256, stdin);
      if (strchr(strbil, '\n')) strchr(strbil, '\n')[0]=0;
      bil = strtod(strbil, &error);
      if (*error!=0)
         printf("Yang anda masukkan bukan bilangan double\n");
   } while (*error!=0);
   formatstrbil(strbil);
   printf(strbil);
}


Berikut ini adalah program untuk menampilkan tulisan bergerak seperti dalam "news ticker". Di dalamnya terdapat algoritma untuk melakukan jeda (pause) selama durasi tertentu, dengan ketentuan bahwa 1 durasi sama dengan 1 timer-tick atau 1/18 detik.

/* Program News Ticker */
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <dos.h>  /* dibutuhkan untuk tipe struct time dan fungsi
                        gettime() */
main()
{
   char a[256];
   int i, mulai, durasi;
   struct time tmulai;
   clrscr();
   printf("Silakan masukkan teks untuk ditampilkan:");
   fgets(a, 256, stdin);
   if (strchr(a, '\n')) strchr(a, '\n')[0]=0;
   for (i=80-strlen(a); i>0; i--) strcat(a," ");
   clrscr();
   do {
      a[255]=a[0];
      i=0;
      while (a[i]!=0){
         a[i]=a[i+1];
         i++;
      }
      a[i-1]=a[255];
      a[255]=0;
      gotoxy(1,10);
      printf("%80s",a);
      gettime(&tmulai);
      durasi=3; /* 3 timer-tick */
      do {
         mulai = tmulai.ti_hund;
         do {
           gettime(&tmulai);
         } while (mulai==tmulai.ti_hund);
      } while (--durasi);
  } while (!kbhit());
}

Berikut ini disajikan program untuk menampilkan penyebutan bilangan. Program ini secara intensif menggunakan array di dalam algoritmanya, sehingga terlihat rumit. Di dalamnya terdapat teknik agar sebuah fungsi bisa mengembalikan nilai dalam bentuk string.

/* Program mengubah bilangan integer menjadi string penyebutannya */
#include <stdio.h>
#include <math.h>

char *penyebutan(long double);

void main()
{
   long double x=112456709123450.0;
   printf(penyebutan(x));
}

char *penyebutan(long double b){
   char *unit[]={"trilyun","milyar","juta","ribu",""};
   char *bilangan[]={"se","dua","tiga","empat","lima","enam","tujuh",
   "delapan","sembilan","sepuluh","sebelas","duabelas","tigabelas",
   "empatbelas","limabelas","enambelas","tujuhbelas","delapanbelas",
   "sembilanbelas"};
   static char str[256];
   int a[15],i, belas;
   str[0]=0;
   for (i=0;i<15;i++){
      a[i]=b/pow(10,14-i);
      b=b-a[i]*pow(10,14-i);
   }
   belas=0;
   for (i=0;i<15;i++){
      if (a[i]!=0){
         if (a[i]==1&&i%3==1){
            strcat(str, bilangan[a[i]*10+a[i+1]-1]);
            belas=1;
         } else if (a[i]==1&&(i%3!=0&&i!=9)&&i%3!=1){
            strcat(str, "satu");
         } else {
            strcat(str, bilangan[a[i]-1]);
         }
         if(i%3==0){
            strcat (str, "ratus ");
         } else if(i%3==1&&!belas){
            strcat(str, "puluh ");
         }
      }
      i+=1*belas;
      if (i%3==2&&(a[i-2]!=0||a[i-1]!=0||a[i]!=0)){
         strcat(str, " ");
         strcat(str, unit[i/3]);
         strcat(str, " ");
      }
      i+=1*belas;
      belas=0;
   }
   return str;
}


Sumber :
[BOR97] Borland. 1997. Turbo C++ 5.0 Help. Borland Inc.
.

Tidak ada komentar:

Posting Komentar