An error in my c++ program... please help urgent.


 
Thread Tools Search this Thread
Top Forums Programming An error in my c++ program... please help urgent.
# 1  
Old 03-15-2011
An error in my c++ program... please help urgent.

The following is a program to convert an infix expression to postfix expression.


//Convert an infix expression to postfix expression...

Code:
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
char ifx[50],pfx[50],stk[50];
int top=-1,n;
void push(char ch)
{
    if(top!=n)
    {
        ch=stk[top];
        top++;
        cout<<"\nElement added was "<<ch;
    }
    else
        cout<<"\nThe stack is full.";    
}
void pop()
{
    char rmv;
    if(top!=-1)
    {
        rmv=stk[top];
        top--;
        cout<<"\nElement removed was "<<rmv;
    }
    else
        cout<<"\nThe stack is empty.";
}
char topele()
{
    char t;
    if(top!=-1)
        t=stk[top];
    else
    {
        t='#';
        cout<<"\nThere are no elements in the stack.The stack is: "<<t;
    }
    return t;
}
int chkpres()
{
    char ch;
    switch(ch)
    {
        case '^': return 5;
            break;
        case '*': return 4;
            break;
        case '/': return 3;
            break;
        case '+': return 2;
            break;
        case '-': return 1;
            break;
        default: exit(1);
            break;
    }
}
int main()
{
    char pre,pres,ele,elem,chk,popp,topp;
    cout<<"\nEnter how many elements you want to enter in the infix expression: ";
    cin>>n;
    for(int j=0;j<n;++j)
    {
        cout<<"\nEnter the characters of the infix expression one by one: ";
        cin>>ifx[j];
    }
    topp=topele();
    for(int i=0;ifx[i]='\0';++i)
    {
        if(ifx[i]=='(')
        {
            break;
        }
        if(ifx[i]=='^'||ifx[i]=='*'||ifx[i]=='/'||ifx=='+'||ifx[i]=='-')
        {
            if(topp=='^'||topp=='*'||topp=='/'||topp=='+'||topp=='-')
            {
                pre=ifx[i];
                pres=topp;
                chk=chkpres();
                if(pre>pres)
                {
                    topp=pre;
                    top++;
                }
                else if(pres>=pre)
                    pfx[i]=pres;
            }    
        }
        else if(ifx[i]=')')
        {
            while(topp!='#')
            {
                popp=topp;
                pfx[i]=popp;
            }
        } 
    }
    cout<<"\nThe postfix expression is: ";
    for(int i=0;pfx[i]!='\0';++i)
    {
        cout<<pfx[i];
    }
return 0;
}

Here's the output of the above program :


Code:
lab1.cpp:80: error: ISO C++ forbids comparison between pointer and integer


Please suggest me to resolve this problem...

Last edited by pludi; 03-16-2011 at 05:04 AM.. Reason: code tags, please
# 2  
Old 03-15-2011
Use code tags to post code. Not using them destroyed your formatting.

taking a look.

---------- Post updated at 09:44 AM ---------- Previous update was at 09:43 AM ----------

You forgot to dereference your array in one place: ifx=='+'
This User Gave Thanks to Corona688 For This Post:
# 3  
Old 03-16-2011
Oh... thank you so much... I should have been able to notice that... Well, thank you again.

---------- Post updated 03-16-11 at 10:42 AM ---------- Previous update was 03-15-11 at 09:19 PM ----------

The program is:



Code:
//Convert an infix expression to postfix expression...

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
char ifx[50],pfx[50],stk[50];
int top=-1,n;
char push(char ch)
{
    if(top!=n)
    {
        ch=stk[top];
        top++;
        return ch;
    }
    else
        cout<<"\nThe stack is full.";    
}
void pop()
{
    char rmv;
    if(top!=-1)
    {
        rmv=stk[top];
        top--;
        cout<<"\nElement removed was "<<rmv;
    }
    else
        cout<<"\nThe stack is empty.";
}
char topele()
{
    char t;
    if(top==-1)
        t='#';
    else
        t=stk[top];
    return t;
}
int chkpres()
{
    char ch;
    switch(ch)
    {
        case '^': return 5;
            break;
        case '*': return 4;
            break;
        case '/': return 3;
            break;
        case '+': return 2;
            break;
        case '-': return 1;
            break;
        default: exit(1);
            break;
    }
}
int main()
{
    char pre,pres,ele,elem,chk,popp,topp;
    cout<<"\nEnter how many elements you want to enter in the infix expression: ";
    cin>>n;
    topp=stk[top];
    cout<<"\nEnter the characters of the infix expression one by one: ";
    for(int i=0;i<n;++i)
    {
        cin>>ifx[i];
        //for(int i=0;ifx[i]='\0';++i)
        //{
            if(ifx[i]!='^' && ifx[i]!='*' && ifx[i]!='/' && ifx[i]!='+' && ifx[i]!='-')
                pfx[i]=ifx[i];
            else if(ele=='(')
            {
                ele=ifx[i];
                push(ele);
                top++;
            }
            else if(ifx[i]=='^'||ifx[i]=='*'||ifx[i]=='/'||ifx[i]=='+'||ifx[i]=='-')
            {
                if(topp=='^'||topp=='*'||topp=='/'||topp=='+'||topp=='-')
                {
                    pre=ele;
                    pres=topp;
                    chk=chkpres();
                    if(pre>pres)
                    {
                        topp=pre;
                        top++;
                    }
                    else if(pres>=pre)
                        pfx[i]=pres;
                }    
            }
            else if(ele=')')
            {
                while(topp!='#')
                {
                    popp=topp;
                    pfx[i]=popp;
                }
            }
       // }
    }
    cout<<"\nThe postfix expression is: ";
    for(int i=0;pfx[i]!='\0';++i)
    {
        cout<<pfx[i];
    }
return 0;
}




OUTPUT is:

Code:
Enter how many elements you want to enter in the infix expression: 9

Enter the characters of the infix expression one by one: a
*
(
b
+
c
)
/
d

The postfix expression is: a




Could you please help me to fix it...

Last edited by pludi; 03-16-2011 at 05:05 AM.. Reason: code tags, please
# 4  
Old 03-16-2011
The code you gave didn't even work as you showed it, it went into an infinite loop...

I've tried to clean it up a little, but there's problems I don't know how to fix since I don't know what you were actually trying to do:

Code:
//Convert an infix expression to postfix expression...

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
char ifx[50],pfx[50],stk[50];
int top=-1,n;
char push(char ch)
{
    if(top!=n)
    {
        ch=stk[top];
        top++;
        return ch;
    }
    else
        cout<<"\nThe stack is full.";
}
void pop()
{
    char rmv;
    if(top!=-1)
    {
        rmv=stk[top];
        top--;
        cout<<"\nElement removed was "<<rmv;
    }
    else
        cout<<"\nThe stack is empty.";
}
char topele()
{
    char t;
    if(top==-1)
        t='#';
    else
        t=stk[top];
    return t;
}
int chkpres()
{
    char ch;
    switch(ch)
    {
        case '^': return 5;
            break;
        case '*': return 4;
            break;
        case '/': return 3;
            break;
        case '+': return 2;
            break;
        case '-': return 1;
            break;
        default: exit(1);
            break;
    }
}
int main()
{
    int i;

    char pre,pres,ele,elem,chk,popp,topp;
    cout<<"\nEnter how many elements you want to enter in the infix expression: ";
    cin>>n;
    topp=stk[top];
    cout<<"\nEnter the characters of the infix expression one by one: ";

    // Make this its own loop to simplify the rest
    for(i=0;i<n;++i)
    {
        cin>>ifx[i];
    }
    // You can't assume the array will end in '\0', you have to put it there
    ifx[i]='\0';

    // uncommented this.  It was a good idea, but didn't 
    // work before because you forgot the !
    for(i=0;ifx[i]!='\0';++i)
    {
            // Is this really what you want it to do?  Nothing except letters
            // and brackets will make to the second if-statement.
            if(ifx[i]!='^' && ifx[i]!='*' && ifx[i]!='/' && ifx[i]!='+' && ifx[i]!='-')
                pfx[i]=ifx[i];
            // 'ele' may not even have been set yet, in which case its value will
            // be undefined.  Which could be (.  Or could be \xfe.  What do you
            // want 'ele' to be by default?  set it when you create the var.
            else if(ele=='(')
            {
                ele=ifx[i];
                push(ele);
                top++;
                // Shouldn't you set pfx[i] to something here?  Otherwise it
                // will stay at an undefined value at index i -- possibly \0,
                // possibly garbage
            }
            else if(ifx[i]=='^'||ifx[i]=='*'||ifx[i]=='/'||ifx[i]=='+'||ifx[i]=='-')
            {
                if(topp=='^'||topp=='*'||topp=='/'||topp=='+'||topp=='-')
                {
                    pre=ele;
                    pres=topp;
                    chk=chkpres();
                    if(pre>pres)
                    {
                        topp=pre;
                        top++;
                        // Shouldn't you set pfx[i] to something here?  Otherwise it
                        // will stay at an undefined value at index i -- possibly \0,
                        // possibly garbage
                    }
                    else if(pres>=pre)
                        pfx[i]=pres;
                }
            }
            // There is a huge difference between = and ==.
            // you were changing ele to ')' here.
            // 'ele' may not even have been set yet, either, see above.
            else if(ele==')')
            {
                while(topp!='#')
                {
                    popp=topp;
                    pfx[i]=popp;
                }
            }
       // }
    }

    // You can't assume the array will end in '\0', you have to put it there
    pfx[i]='\0';

    cout<<"\nThe postfix expression is: ";
    for(i=0; pfx[i]!='\0'; ++i)
    {
        cout<<pfx[i];
    }
return 0;
}

So I can't fix it outright but I hope I've given you a better idea of what's going wrong.
This User Gave Thanks to Corona688 For This Post:
# 5  
Old 03-17-2011
Why cannot I assume in my program the arrays ifx[] and pfx[] to end at '\0' ?
Because since these are string arrays, I think we should assume it to end with a null character.
Why we have to specify/initialize that the two arrays would end at null character?
# 6  
Old 03-17-2011
Quote:
Originally Posted by poonam.gaigole
Why cannot I assume in my program the arrays ifx[] and pfx[] to end at '\0' ?
Because any contents you don't initialize yourself are undefined.
Quote:
Because since these are string arrays, I think we should assume it to end with a null character.
You have it exactly backwards. A string doesn't define a NULL -- a NULL defines a string. You've got chars arrays, which are just integers but smaller and have no mysterious auto-setting properties. Would you expect setting a[0] to also set a[1] for int? You were just lucky enough to be using global vars that "usually" default to 0. Try that with stack variables and you're in for a big surprise.
Quote:
Why we have to specify/initialize that the two arrays would end at null character?
If not you, then who?

Last edited by Corona688; 03-17-2011 at 03:23 AM..
# 7  
Old 03-17-2011
Here, 'ele' is the element that we read from the infix expression (ifx[]) and I think i should not have used the 'elem' because its of no use in my program.
The following code compares between the elements present in the two stacks one by one.


Code:
Code:
        else if(ifx[i]=='^'||ifx[i]=='*'||ifx[i]=='/'||ifx[i]=='+'||ifx[i]=='-')
            {
                 if(topp=='^'||topp=='*'||topp=='/'||topp=='+'||topp=='-')
                {
                    pre=ele;
                    // 'pre' is the current (i) element in the infix expression.
         
                    pres=topp;
                    // 'pres' is the topmost element of the stack. 
                    chk=chkpres();
                    // Here I'm checking the precedence of the operators.

                    if(pre>pres)
                    {
                        topp=pre;
                        top++;
                    }
                    else if(pres>=pre)
                         pfx[i]=pres;
                }    
                else
                {
                    ele=ifx[i];
                    push(ele);
                }
                ++i;
            }



Well, I'm trying my level best to solve this hoping to come out with the appropriate result. Thank you very much for your patience.

Last edited by pludi; 03-17-2011 at 08:18 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Urgent help needed.. C++ program to convert decimal to hexa decimal

Hi , seq can be 0...128 int windex = seq / 8; int bindex = seq % 8; unsigned char bitvalue = '\x01' << (7-bindex) ; bpv.bitmapvalue = bitvalue; This is the part of a program to convert decimal to bitmap value of hexadecimal. I want this to change to convert only to... (1 Reply)
Discussion started by: greenworld123
1 Replies

2. Programming

Wrapper for unix program - urgent help needed

Hello all , i need some help asap i have a program that keeps killing the machine when i did google searches and 2 days later i ran strace it seems the programm keeps making a system call to gettimeofday to i guess increment a counter ? gettimeofday({1347986584, 464904}, NULL) = 0... (6 Replies)
Discussion started by: NetworkLearning
6 Replies

3. Programming

urgent help with file manipulation program

Hey, i am trying to write a program that takes multiple files as command line arguments, then outputs them to a single file. i also need the option to read them back out again. essentially what i am trying to create is an archiver, however, a very simple one. The program i have accomplished so far... (1 Reply)
Discussion started by: wezzyb
1 Replies

4. Shell Programming and Scripting

Program Bash VERY URGENT

Hello I have to do a program in Bash, need help because it does not go out for me and go enough time with this!! Five directories(boards of directors) that more occupy, arranged according to size. To measure the size of every directory(board of directors) there must not be included the size... (1 Reply)
Discussion started by: danihj
1 Replies

5. UNIX and Linux Applications

Urgent---Program for getting Exception from a log

Hi Friends, I am new to Unix, Now I am Working with shell scripting in my company Description:-By executing that script I need to get the exception from the log file I need the program for getting the Exceptions from the logfile,,and that program should be generic...I mean if i want to... (5 Replies)
Discussion started by: Anji
5 Replies

6. Solaris

[need help urgent]error cpu messages

hi sun experts, i have problem with my server sun fire v240, if i run application the server will restarting itself and i got some error messages like this: Mar 21 15:15:03 sun ^Mpanic/thread=2a10094bd40: Mar 21 15:15:04 sun unix: BAD TRAP: type=34 rp=2a10094b660 addr=30005566764... (0 Replies)
Discussion started by: bucci
0 Replies

7. AIX

URGENT:Program is not dropping core on customer AIX Machine

hi We have a program which is running on cutomer end,and when its crashing its not dropping core, we asked them to check ulimit,they say that its unlimited. Even when they crash the program manually by using command kill -ABRT <pid> its not dropping the core,on our end when we use same... (1 Reply)
Discussion started by: khan_069
1 Replies

8. SCO

memfs.fs I/O Error - urgent attention please

Hy guys, During installation of machine (Pentium x86, 64MB RAM), well during booting SCO UnixWARE 7.1.1 diskette 1/2 i get following error (after SCO logo) "memfs.fs: I/0 error or unexpected EOF" Bootstrap Command Processor ... _ Please advise! (2 Replies)
Discussion started by: R@LE
2 Replies

9. Shell Programming and Scripting

Very Urgent help required in Shell Program

How do I Ftp, and rename multiple files in one unix script. I have to send it with .tmp extension , then rename it to .txt after FTP is done . I need to do a Mass rename of more than 1 file in a shell script , Urgent help required. (1 Reply)
Discussion started by: Suppandi
1 Replies

10. UNIX for Dummies Questions & Answers

Urgent!! How to write a shell program to execute command to access internet?

hi, I am new ot unix. So, can i write a shell(c shell or korn shell) program to access internet? I mean if I run the program, it can access specified url and then copy the html to a file? Can anyone help me? And how can make the program runs every 1 hr? new comer (2 Replies)
Discussion started by: firebirdonfire
2 Replies
Login or Register to Ask a Question