Anda di halaman 1dari 4

Modul 5 | Shannon-Fano Coding dengan C++

Penjelasan Singkat – Shannon-Fano Coding


Algoritma Shannon-Fano coding ditemukan oleh Claude Shannon (bapak teori informasi) dan
Robert Fano pada tahun 1949. Pada dasarnya metode ini menggantikan setiap simbol dengan
sebuah alternatif kode biner yang panjangnya ditentukan berdasarkan probabilitas dari simbol
tersebut. Di bidang kompresi data, Shannon-Fano coding adalah teknik untuk membangun
sebuah kode awalan didasarkan pada seperangkat simbol dan probabilitas (diperkirakan atau
diukur).

Algoritma inilah yang akan diimplementasikan dalam sebuah aplikasi sederhana. Pada
praktikum ini, bahasa pemrograman yang digunakan adalah C++, dengan software compilernya
menggunakan Dev C++.

Membuat Aplikasi Shannon-Fano Coding dengan C++


Pada praktikum ini akan dibuat source code untuk mengimplementasikan Shannon-Fano
Coding, langkahnya adalah sebagai berikut :
1. Jalankan Dev C++
2. Ketikkan source code berikut :

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;

struct simpul{
char simbol[100];
float prob;
int arr[200];
int top;
}s[20];

typedef struct simpul simpul;

void prints(int l,int h,simpul s[]){


int i;
for(i=l;i<=h;i++){
printf("\n%s\t%f",s[i].simbol,s[i].prob);
}
}
void shannon_fano(int l,int h,simpul s[]){
float pack1=0,pack2=0,diff1=0,diff2=0;
int i,d,k,j;
if((l+1)==h || l==h || l>h){
if(l==h || l>h)
return;
s[h].arr[++(s[h].top)]=0;
s[l].arr[++(s[l].top)]=1;
return;
}else{
for(i=l;i<=h-1;i++)
pack1=pack1+s[i].prob;
pack2=pack2+s[h].prob;
diff1=pack1-pack2;
if(diff1< 0)
diff1=diff1*-1;
j=2;
while(j!=h-l+1){
k=h-j;
pack1=pack2=0;
for(i=l;i<=k;i++)
pack1=pack1+s[i].prob;
for(i=h;i>k;i--)
pack2=pack2+s[i].prob;
diff2=pack1-pack2;
if(diff2< 0)
diff2=diff2*-1;
if(diff2>=diff1)
break;
diff1=diff2;
j++;
}
k++;
for(i=l;i<=k;i++)
s[i].arr[++(s[i].top)]=1;
for(i=k+1;i<=h;i++)
s[i].arr[++(s[i].top)]=0;
shannon_fano(l,k,s);
shannon_fano(k+1,h,s);
}
}
int main(){
int n,i,j;
float x,total=0;
char ch[10];
simpul temp;
system("cls");
printf("Masukkan Jumlah Simbol Yang Akan Dikodekan\t: ");
scanf("%d",&n);
for(i=0;i< n;i++){
printf("Masukkan Simbol %d ---> ",i+1);
scanf("%s",ch);
strcpy(s[i].simbol,ch);
}
for(i=0;i< n;i++){
printf("\n\tMasukkan Probabilitas Untuk %s ---> ",s[i].simbol);
scanf("%f",&x);
s[i].prob=x;
total=total+s[i].prob;
if(total>1){
printf("\t\tJumlah total probabilitas lebih dari 1. Coba lagi");
total=total-s[i].prob;
i--;
}
}
s[i].prob=1-total;
for(j=1;j<=n-1;j++){
for(i=0;i< n-1;i++){
if((s[i].prob)>(s[i+1].prob)){
temp.prob=s[i].prob;
strcpy(temp.simbol,s[i].simbol);
s[i].prob=s[i+1].prob;
strcpy(s[i].simbol,s[i+1].simbol);
s[i+1].prob=temp.prob;
strcpy(s[i+1].simbol,temp.simbol);
}
}
}
for(i=0;i< n;i++)
s[i].top=-1;
shannon_fano(0,n-1,s);

printf("---------------------------------------------------------------");
printf("\n\n\n\tSimbol\tProbabilitas\tCodeword");
for(i=n-1;i>=0;i--){
printf("\n\t%s\t%f\t",s[i].simbol,s[i].prob);
for(j=0;j<=s[i].top;j++)
printf("%d",s[i].arr[j]);
}
printf("\n---------------------------------------------------------------");
getch();
}
3. Simpan dengan nama bebas, kemudian jalankan dengan meng-klik menu ‘run’ atau
menekan tombol F10 pada keyboard.
4. Masukkan simbol yang akan dikodekan satu per satu, format bebas. Contoh :
1607048002ArizonaFirdonsyah
5. Jika syntax programnya sudah benar, maka akan dihasikan tampilan seperti di bawah ini

Tugas
Kodekan nama dan NIM sekelas serta 3 nama mahasiswa masing-masing angkatan 2,3,4 MTI
lengkap dengan NIM-nya dalam bentuk excel, sertakan pada laporan Anda beserta persetujuan
dari mahasiswa angkatan 2,3,4 yang anda inputkan.

Anda mungkin juga menyukai