ALGORITMA DAN PEMROGRAMAN 2
Oleh: Anis Cherid, M.T.I.
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;
}
REFERENSI
[BOR97] Borland. 1997. Turbo C++ 5.0 Help. Borland
Inc.
Created : ass_oryza
Tidak ada komentar:
Posting Komentar