Login to Website

Login dengan Facebook

 

Post Reply
Thread Tools
  #1  
Old 20th November 2011
Permenkaret
Ceriwiser
 
Join Date: Nov 2011
Posts: 351
Rep Power: 14
Permenkaret mempunyai hidup yang Normal
Default [HELP] Notasi Polish dengan bahasa C

gan ane kan dikasih tugas struktur data buat bikin program ngerubah statement infix jadi postfix...

detailnya gini :


Quote:





  1. pertama user memasukan statement dalam bentuk infix (contoh : a + b)
  2. terus keluar statement postfix-nya (jadi a b +)
  3. terus user memasukan nilai variabelnya... misal :

    kalo variabel-nya (a,b) tampilannya gini :


    Quote:





    masukan nilai a :

    masukan nilai b:





    kalo variabel-nya (c,d) tampilannya gini :


    Quote:





    masukan nilai c :

    masukan nilai d :





    kalo variabel-nya (c,d,e) tampilannya gini :


    Quote:





    masukan nilai c :

    masukan nilai d :

    masukan nilai e :





  4. keluar hasil perhitungan (a + b) pake cara menghitung statement aritmatika dalam notasi polish...





nah langkah 1 sampe 2 udah beres gan... ini source code-nya :


Code:

#include
#include
#define MAX 10
#define Kosong -1

struct stack
{
char data[MAX];
int top;
};

int cekKosong(struct stack *s);
void KosongkanStack(struct stack* s);
void push(struct stack* s,int item);
char pop(struct stack* s);
void tampil(struct stack s);
int cekOperator(char e);
int cekPrioritas(char e);
void konversi(char* infix, char* postfix, int spasi);

int main()
{
char infix[50],postfix[50];

strcpy(&postfix[50],"");
printf("Masukan Statement Hitungan : ");
fflush(stdin);
gets(infix);
konversi(&infix[0],&postfix[0],1);
printf("Bentuk Postfix dari Statement Hitungan diatas adalah : %s\n",&postfix[0]);

getch();
return 0;
}

//fungsi untuk mengecek kosong atau tidaknya stack
int cekKosong(struct stack *s)
{
if(s->top == Kosong)
return 1;
else
return 0;

}

// fungsi untuk mengosongkan stack
void KosongkanStack(struct stack* s)
{
s->top=Kosong;
}

// fungsi untuk memasukan data ke stack
void push(struct stack* s,int item)
{
if(s->top == (MAX-1)) // jika topnya ke max - 1, berarti stack penuh
{
printf("\nStack Penuh, silakan pop atau hapus stack");
}
else //jika tidak
{
++s->top; // naikan stack s, lalu pindahkan topnya
s->data[s->top]=item; // list data dari top diisi dari item
}
}

char pop(struct stack* s)
{
char ret=(char)Kosong; // inisialisasi variabel ret = 0 jadi char
if(!cekKosong(s)) // mengecek kosong atau tidak, bila tidak ?
{
ret= s->data[s->top]; //tempatkan ret pada list s di posisi top
--s->top; // lalu mundurkan list s satu list dan jadikan top
// ini berarti ret berada di list paling belakang
}

return ret; // keluarkan si ret
}

void tampil(struct stack s)
{
while(s.top != Kosong) // selama s gak kosong
{
printf("\n%d",s.data[s.top]); // tampilkan data list s pada posisi top
s.top--; // mundurkan list ke posisi sebelumnya
}
}

// fungsi untuk mengecek operator
int cekOperator(char e)
{
if(e == '+' || e == '-' || e == '*' || e == '/' || e == '^')
{
return 1; // jika operatornya + , - , * , / , ^(pangkat) , berarti OK
}
else
{
return 0;
}

}

// fungsi untuk mengecek prioritas suatu operator
int cekPrioritas(char e)
{
int pri = 0; // inisialisasi nilai variabel pri

if (e == '^')
pri = 3; // jika terdapat tanda pangkat (^), dia menjadi prioritas no wahid
else
{
if(e == '*' || e == '/')
pri = 2; // jika * atau / maka jadi prioritas ke 2
else
{
if(e == '+' || e == '-')
pri = 1; // jika + atau - jadi prioritas ke 3
}
}

return pri; // ngeluarin nilai variabel prioritas

}

// Fungsi proses konversinya
void konversi(char* infix, char* postfix, int spasi)
{
char *i,*p;
struct stack X;
char n1;
int j;

KosongkanStack(&X);
i = &infix[0];
p = &postfix[0];

j=0;
cekOperator(*i);

while(*i)
{
while(*i == ' ' || *i == '\t') // melewatkan spasi dan tab
{
i++;
}

if( isdigit(*i) || isalpha(*i) )
{
while( isdigit(*i) || isalpha(*i))
{
*p = *i;
p++;
i++;
}
/*SPACE CODE*/
if(spasi)
{
*p = ' ';
p++;
}
/*END SPACE CODE*/
}

if( *i == '(' )
{
push(&X,*i);
i++;
}

if( *i == ')')
{
n1 = pop(&X);
while( n1 != '(' )
{
*p = n1;
p++;
/*SPACE CODE*/
if(spasi)
{
*p = ' ';
p++;
}
/*END SPACE CODE*/
n1 = pop(&X);
}
i++;
}

if( cekOperator(*i))
{
if(cekKosong(&X))
push(&X,*i);
else
{
n1 = pop(&X);
while(cekPrioritas(n1) >= cekPrioritas(*i))
{
*p = n1;
p++;
/*SPACE CODE*/
if(spasi)
{
*p = ' ';
p++;
}
/*END SPACE CODE*/
n1 = pop(&X);
}
push(&X,n1);
push(&X,*i);
}
i++;
}

}
while(!cekKosong(&X))
{
n1 = pop(&X);
*p = n1;
p++;
/*SPACE CODE*/
if(spasi)
{
*p = ' ';
p++;
}
/*END SPACE CODE*/
}
*p = '';
}

ane mohon bantuannya buat yg nomor 3 sama 4-nya dong gan kalo ada kesalahan mohon pencerahannya gan

ntar ane kasih 2 deh...



Sponsored Links
Space available
Post Reply

Thread Tools



Switch to Mobile Mode

no new posts