Ceriwis  

Go Back   Ceriwis > HOBI > Komputer & Teknologi > Programming

Programming Share, tanya jawab, saling bantu antar programmer dengan berbagai macam bahasa pemrograman.

Reply
 
Thread Tools
  #1  
Old 20th November 2011
Permenkaret Permenkaret is offline
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...



Reply With Quote
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


 


All times are GMT +7. The time now is 10:05 PM.


no new posts