954,496 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

URGENT: Please help test scientific calculator and report bugs

I have to give this in around 10 hours and i still have lots to do.
Please report any bugs;

Its a scientific calculator, also supports sin, cos,tan and log
Take care to put the entire expression under brackets

For example, a valid input will be:-

(5+4*-3+sin(43+7)+cos(90/2))

I've attached the .exe as well.

Please try as many different combinations as you can.

#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <math.h>

class expsolver
{
	char inputstring[100],str[100],exp[100], prec[10],subexp[20];
	int pos[100],posl, no[5], neighbours[2], step,pass,neg, no_ops;
	double t1,t2,ta;

	public:
	expsolver()
	{
		strcpy(prec,"^/*+-");
		step=0;
		pass=1;
		neg=0;
		no_ops=0;
		display();
	}
	void display();
	void manager();
	void master();
	void neighbourset(int);
	void pos_setter();
	void copier(char*,char*,int ,int);
	void convertno(char*,double &t);
	void operation(double,double,int);
	void convertalpha(double);
	void replacer(char*,char*,int,int);
	void endcopier(char*,char*,int);
	void negbugfix();
};

void expsolver::display()
{
	
	char ch;
	do
	{
			clrscr();
			cout<<"Enter the expression to be evaluated\n";
			gets(inputstring);
			strcpy(str,inputstring);
			manager();
			cout<<"\n\nTry again? :";
			cin>>ch;

	}
	while (ch!='n');
}

void expsolver::manager()
{
	int i,lcount=0,rcount=0,li=0,ri=0;
	for (i=0; i<strlen(str); i++)
	{
		if(str[i]=='(')
			lcount+=1;
		if(str[i]==')')
			rcount+=1;
	}
	for(int j=0;j<lcount;j++)
	{
	if (lcount==rcount)
	{
		for (i=0; i<strlen(str); i++)
		{
			if (str[i]=='(')
			{
				li=i;
			}
			if (str[i]==')')
			{
				ri=i;
				break;
			}
		}
	}
	copier(exp,str,li+1,ri-1);
	cout<<"\nPass "<<pass;
	master();
	replacer(str,exp,li,ri);
	cout<<"\nAfter the operation, result is "<<str<<endl;
	pass++;
	}
	cout<<"\nResult -"<<str;
}
void expsolver::master()
{
	for (int i=0; i<4; i++)
	{
		no[i]=0;
		for (int j=1; j<(strlen(exp)); j++)
			if (exp[j]==prec[i])
			{			
				no[i]+=1;
				no_ops++;
			}
	}

	if(no_ops==0)
	{
		convertno(exp,ta);
		convertalpha(ta);
		replacer(exp,subexp,0,strlen(exp));
	}			

	for(int i=0; i<4; i++)
	{
		if(i==3)
			negbugfix();		
		for (int j=0; j<no[i]; j++)
		{
			pos_setter();
			
			if(pos[0]!=32767)
				for (int k=1; k<(strlen(exp)); k++)
					{
						if (exp[k]==prec[i])
						{
							neighbourset(k);
							char *a =new char [k-neighbours[0]];
							char *b =new char [neighbours[1]-k];
							copier (a,exp,neighbours[0],(k-1));
							copier (b,exp,(k+1),neighbours[1]);
							convertno (a,t1);
							convertno (b,t2);
							operation (t1,t2,i);
							convertalpha (ta);
							replacer (exp,subexp,neighbours[0],neighbours[1]);
							cout<<"\nStep "<<++step<<"- Do "<<prec[i]<<endl;
							puts(exp);
							break;
						}
					}

		}

	}
}
void expsolver::pos_setter()
{
	unsigned int i=1,j=0;
	for (;exp[i]!='\0';i++)
	{
		if((exp[i]=='^')||(exp[i]=='/')||(exp[i]=='*')||(exp[i]=='+')||((exp[i]=='-')&&(neg)))
		{
				pos[j]=i;
				j++;
		}
		pos[j]=32767;
		posl=j;
	}
}
void expsolver::neighbourset (int k)
{
	for (int i=0; pos[i]!=32767; i++)
	{
		if (k==pos[i])
		{
			neighbours[0]=pos[i-1]+1;
			neighbours[1]=pos[i+1]-1;
			if (i==0)
				neighbours[0]=0;
			if(i==posl-1)
				neighbours[1]=((strlen(exp))-1);
		}
	}
}
void expsolver::copier(char* a,char* b,int m,int n)
{
	int i,j;
	for(i=m,j=0;i<=n ;i++,j++)
	{a[j]=b[i];
		}
	a[j]='\0';
}
void expsolver::endcopier(char* x,char* y,int start)
{
	int i,j;
	for (i=start,j=0;x[i]!='\0' ;i++,j++ )
		y[j]=x[i];
	y[j]='\0';
}

void expsolver::convertno(char* a,double &t)
{
	char input[20], *endptr;
	double inputval;

	if((strncmpi(a,"sin",3)==0)||(strncmpi(a,"cos",3)==0)||(strncmpi(a,"tan",3)==0)||(strncmpi(a,"log",3)==0))
	{
		if(strncmpi(a,"sin",3)==0)
		{
			endcopier(a,input,3);
			inputval=strtod(input,&endptr);
			t=sin(inputval*(3.1415926535/180));
		}
		if(strncmpi(a,"cos",3)==0)
		{
			endcopier(a,input,3);
			inputval=strtod(input,&endptr);
			t=cos(inputval*(3.1415926535/180));
		}
		if(strncmpi(a,"tan",3)==0)
		{
			endcopier(a,input,3);
			inputval=strtod(input,&endptr);
			t=tan(inputval*(3.1415926535/180));
		}
		if(strncmpi(a,"log",3)==0)
		{
			endcopier(a,input,3);
			inputval=strtod(input,&endptr);
			t=log(inputval);
		}
	}
	else
		t=strtod(a,&endptr);
}
void expsolver::operation(double x,double y,int i)
{
	if (i==0)
		ta=pow(x,y);
	if (i==1)
		ta=x/y;
	if (i==2)
		ta=x*y;
	if (i==3)
		ta=x+y;
	if (i==4)
		ta=x-y;
}
void expsolver::replacer(char* a,char* b,int m,int n)
{
	int j=0,k,i,l,size=(strlen(a)-n);
	char *sub=new char[size];

	for(i=n+1; a[i]!='\0' ;i++)
	{
		sub[j]=a[i];
		j++;
	}
	sub[j]='\0';

	for (i=m,j=0; b[j]!='\0' ; i++,j++,k=i)
		a[i]=b[j];

	for (i=k,j=0; sub[j]!='\0'; i++,j++)
		a[i]=sub[j];
	a[i]='\0';
}
void expsolver::convertalpha(double x)
{
   sprintf ( subexp, "%.2f", x );
}
void expsolver::negbugfix ()
{
	for(int i=1; i<strlen(exp); i++)
		if(exp[i]=='-')
		{
			replacer(exp,"+",i,i-1);
			i++;
			puts(exp);
			no[3]++;
		}
}
void main()
{
	expsolver obj;
	getch();
}
Attachments ExpSolver.zip (68.71KB)
Chetan_
Newbie Poster
7 posts since Nov 2009
Reputation Points: 10
Solved Threads: 0
 

Nothing urgent about it for any of us. You should have started earlier if you think 10 more hours isn't enough.

jwenting
duckman
Team Colleague
8,392 posts since Nov 2004
Reputation Points: 1,662
Solved Threads: 337
 

> You should have started earlier if you think 10 more hours isn't enough.
Well it's down to 5 hours now ;)

As a C++ program, I would score this at 1/10 no matter how bug-free you thought it was.

It's basically a C program with a rudimentary class in it.

> gets(inputstring);
This earns you 0/10.
gets() is totally unsafe; there is no reason at all for being anywhere near this function.

All your allocated memory (new) gets leaked.

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 

Dude i'm a beginner

The rudimentary class is there because its still a WIP.
i'm neither an expert, nor do i claim to be.

anyways i have one more day now.
So please.
It's basically a C program with a rudimentary class in it.
OK, so what do i do about that;gets() is totally unsafe; there is no reason at all for being anywhere near this function.

All your allocated memory (new) gets leaked.
thanks for that
they tell us nothing in class

Chetan_
Newbie Poster
7 posts since Nov 2009
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You