Permenkaret
20th November 2011, 01:59 AM
gan ane kan dikasih tugas struktur data buat bikin program ngerubah statement infix jadi postfix...
detailnya gini :
Quote:
pertama user memasukan statement dalam bentuk infix (contoh : a + b)
terus keluar statement postfix-nya (jadi a b +)
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 :
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 :p kalo ada kesalahan mohon pencerahannya gan :p
ntar ane kasih 2 :melonndan: deh...
</div>
detailnya gini :
Quote:
pertama user memasukan statement dalam bentuk infix (contoh : a + b)
terus keluar statement postfix-nya (jadi a b +)
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 :
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 :p kalo ada kesalahan mohon pencerahannya gan :p
ntar ane kasih 2 :melonndan: deh...
</div>