Hi Experts!
i need some help now i have written a code but my output is not correct its reading everything from text file but not computing it correctly,,,pls pls help.

here's my code....

#include <iostream>
#include <iomanip>
#include <stack>
#include <fstream>
#include <string>
using namespace std;
using std::string;
using std::cout;
using std::cerr;
#define MAX 20


//global variables
string vars=""; //add the variables to this string as you read them
int vals[26]; //add the values of the variables to this array as you read them
int valA;
int valB;
string pf[MAX];
int num_vars; //number of variables
int num_pfs;
int ndx;
stack<int>s;
int found;
int ops;
int lenops;
char token;
int i;
void process_pf(string pf);


int var2ndx(string var) {  //given a variable it returns its index in vars
//so that its value may be found as vals[index]
ndx=vars.find(var);
if ( (ndx>=0) && (ndx<vars.length()) ) return ndx;
cout << "illegal variable " << var << "n";
return -1; //this signals that the variable is invalid
}



void read_vars_vals(){
string var; int val;
ifstream inf;
inf.open("c:temp575_prog2_data.txt");
if (!inf) { cout << "input data should be in c:temp575_prog2_data.txtn"; exit(0); }
//read the number of variables (global)
inf >> num_vars;
//loop and read this many vars and vals
for (int i=0; i<num_vars; i++) {
inf >> var >> val;
vars=vars+var;
vals=val;
cout<<vars<<" "<<vals<<endl;
}
//then read all the strings of postfx expressions into an array of strings
int i=0;
while (inf >> pf) i++;  //pf is the array of postfix strings (global variable)
num_pfs=i;
inf.close();
}


bool is_operand(string ch) {
found=vars.find(ch); int lenvars=vars.length();
if ( (found>=0) && (found<lenvars) ) return true;
else return false;
}
bool is_operator(string ch) {
string ops="+-^*/"; found=ops.find(ch); lenops=ops.length();
if ( (found>=0) && (found<lenops) ) return true;
else return false;
}


void process_operand(string opnd,int i) {


if (is_operand(opnd))


s.push(vals);


else
cout<<"invalid postfix error" <<endl;
// process_pf(opnd);
}


void process_operator(string op) {
if (is_operator(op))
{
valA = s.top();
s.pop();
valB = s.top();
s.pop();
}
}


void process_pf(string pf) { //pf=a single postfix


// i=0;
token = pf;


//while((i < pf.size()) && (token != '='))
//{
switch(token)
{
case '+': vals = valA + valB;
break;
case '-': vals = valB - valA;
break;
case '*': vals = valA*valB;
break;


case '^':vals = valA^valB;


case '/':
try
{
vals = valA/valB;
}
catch(...)
{
cerr<<"divide by zero error";
}
break;
}
s.push(vals);


//i++;
//token = pf;


cout << pf << " " << vals << endl;


cout << endl;


}


void main() {


read_vars_vals();


for (i=0; i<num_pfs; i++) {
process_operand(pf,i);
process_operator(pf);
process_pf(pf);
}
//footer info like your name etci]
}

Recommended Answers

All 2 Replies

Member Avatar for iamthwee

Before you start doin' the postfix calculations with the stack I would make sure you can read the file in and assign all the variables properly?

Example

#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <fstream>
#include <limits>

using namespace std;

bool myCheck ( string );
bool isNumber ( char ch );
int getIndex ( string ch );

int main()
{
  ifstream read ( "c:\\temp\\575_prog2_data.txt" );
  string crap;

  int vals[26] = {0};

  int placeHolder = 0;
  while ( read >> crap )
  {
    if ( ( myCheck ( crap ) == false )
         && ( crap.length() > 1 ) )
    {
      cout << "Postfix Expression maybe?:" << crap << endl;
    }
    else if ( ( myCheck ( crap ) == false )
              && ( crap.length() == 1 ) )
    {
      cout << "Var:" << crap << endl;
      placeHolder = getIndex ( crap );
    }
    else
    {
      cout << "integer:" << crap << endl;
      istringstream myStream ( crap );
      int j;
      myStream >> j;
      vals[placeHolder] = j;
    }
  }
  read.close();

  string letterz = "abcdefghijklmnopqrstuvwxyz";

  cout << "\n";
  for ( int i = 0; i < 26; i++ )
  {
    cout << letterz[i] << "=" << vals[i] << " ";
  }

  cin.get();
}
bool myCheck ( string t )
{
  int length = t.length();

  int counter = 0;
  for ( int i = 0; i < length; i++ )
  {
    if ( isNumber ( t[i] ) == true )
    {
      counter++;
    }
  }
  if ( counter == length )
    return true;
  else
    return false;
}

bool isNumber ( char ch )
{
  if  ( ( ch >= '0' ) && ( ch <= '9' ) )
    return true;
  else
    return false;
}

int getIndex ( string ch )
{
  string letterz = "abcdefghijklmnopqrstuvwxyz";
  int t = letterz.length();

  for ( int i = 0; i < t; i++ )
  {
    if ( ch == letterz.substr ( i, 1 ) )
    {
      return i;
    }
  }
}

My output

Var:a
integer:4
Var:d
integer:9
Var:z
integer:17
Var:y
integer:0
Var:x
integer:2
Postfix Expression maybe?:aD+
Postfix Expression maybe?:ad+zy-x/*
Postfix Expression maybe?:xz*yd+ad-*+
Postfix Expression maybe?:ab+
Postfix Expression maybe?:ad*yz*+ad*yz*-*
Postfix Expression maybe?:adz*+yx/-
Postfix Expression maybe?:zy/
Postfix Expression maybe?:adx^+

a=4 b=0 c=0 d=9 e=0 f=0 g=0 h=0 i=0 j=0 k=0 l=0 m=0 n=0 o=0 p=0 q=0 r=0 s=0 t=0
u=0 v=0 w=0 x=2 y=0 z=17

thanks for looking into my problem, i think i can go on further now..
thanks again...

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.