PDA

View Full Version : سوال: اولویت بندی در ماشین حساب



lolojoon
دوشنبه 08 تیر 1388, 20:10 عصر
با سلام . من یک کد برای ماشین حساب مهندسی نوشتم . با C
در این ماشین حساب باید اولویت پرانتز رعایت شه . مثلا 2+(5+1)*2 را تشخیص بده ( اولویت داخل پرانتز )

کد را می زارم اگر ممکنه دوستانی که می تونن کمک کنن . چون اصلا وقت ندارم و باید یک برنامه تشخیص صدا را برسونم .

پیشاپیش از کمک همه دوستان ممنونم .

البته هنوز وقت نکردم به ++C تبدیل کنم /

کد :




# include<stdio.h>
# include<dos.h>
# include<stdlib.h>
# include<conio.h>
# include<string.h>
# include<math.h>
double power(int xx,int yy);
double sin1(double xx);
double cos1(double xx);
void main(void)
{
char sum[20],key,key1='+';
int len=0;
double num1=0,num2=0,num_1,num_2;
clrscr();
gotoxy (20, 5);printf (" ---------------------------------------- ");
gotoxy (20, 6);printf ("| |");
gotoxy (20, 7);printf ("|----------------------------------------|");
gotoxy (20, 8);printf ("| |");
gotoxy (20, 9);printf ("| 1 2 3 + Sin x^2 |");
gotoxy (20,10);printf ("| 4 5 6 - Cos x^3 |");
gotoxy (20,11);printf ("| 7 8 9 * Tan x^y |");
gotoxy (20,12);printf ("| % 0 . / Cot sqrt |");
gotoxy (20,13);printf ("|----------------------------------------|");
gotoxy (20,14);printf ("| S ===> Sin M ===> x^2 |");
gotoxy (20,15);printf ("| C ===> Cos X ===> x^3 |");
gotoxy (20,16);printf ("| T ===> Tan Q ===> Sqrt |");
gotoxy (20,17);printf ("| O ===> Cot |--------------------------|");
gotoxy (20,18);printf ("| | Enter ===> New Number |");
gotoxy (20,19);printf (" ---------------------------------------- ");
gotoxy (22,6);
do{
key=getch();
if (key=='=')
{
gotoxy (18,6);printf (" ");
}
if (key=='+' || key=='-' || key=='*' || key=='/' || key=='%' || key=='^' )
{
gotoxy (18,6);printf ("%c",key);
}
if (key=='s')
{
num2=atof(sum);
gotoxy (22,6);
printf ("%f",sin1(num2));
itoa(num2,sum,20);
len=strlen(sum);
num2=num1;
continue;
}
if (key=='c')
{
num2=atof(sum);
gotoxy (22,6);
printf ("%f",cos1(num2));
itoa(num2,sum,20);
len=strlen(sum);
num2=num1;
continue;
}
if (key=='t')
{
num2=atof(sum);
gotoxy (22,6);
printf ("%f",sin1(num2)/cos1(num2));
itoa(num2,sum,20);
len=strlen(sum);
num2=num1;
continue;
}
if (key=='o')
{
num2=atof(sum);
gotoxy (22,6);
printf ("%f",cos1(num2)/sin1(num2));
itoa(num2,sum,20);
len=strlen(sum);
num2=num1;
continue;
}
if (key=='q')
{
num_1=atof(sum);
num_2=sqrt(num_1);
gotoxy (20, 6);printf ("| |");
gotoxy (22,6);printf ("%f",num_2);
strcat (sum,"");
itoa (num_2,sum,20);
len=strlen (sum);
continue;
}
if (key=='m')
{
num_1=atof(sum);
num_2=(num_1*num_1);
gotoxy (20, 6);printf ("| |");
gotoxy (22,6);printf ("%f",num_2);
strcat (sum,"");
itoa (num_2,sum,20);
len=strlen (sum);
continue;
}
if (key=='x')
{
num_1=atof(sum);
num_2=(num_1*num_1*num_1);
gotoxy (20, 6);printf ("| |");
gotoxy (22,6);printf ("%f",num_2);
strcat (sum,"");
itoa (num_2,sum,20);
len=strlen (sum);
continue;
}
if (key==13)
{
strcat (sum,"");
len=0;
gotoxy (20, 6);printf ("| |");
//num1=0;
//num2=0;
gotoxy (22,6);
continue;
}
if (key=='=' || key=='^' || key=='+' || key=='-'|| key=='*' || key=='/' || key=='%')
{
if (key1=='%')
{
num2=atof(sum);
num1=(num2*num1)/100;
gotoxy (20, 6);printf ("| |");
gotoxy (22,6);printf ("%f",num1);
key1=key;
strcat (sum,"");
len=0;
continue;
}
if (key1=='^')
{
num2=atof(sum);
num1=power(num1,num2);
gotoxy (20, 6);printf ("| |");
gotoxy (22,6);printf ("%f",num1);
key1=key;
strcat (sum,"");
len=0;
continue;
}
if (key1=='+')
{
num2=atof(sum);
num1=num2+num1;
gotoxy (20, 6);printf ("| |");
gotoxy (22,6);printf ("%f",num1);
key1=key;
strcat (sum,"");
len=0;
continue;
}
if (key1=='*')
{
num2=atof(sum);
num1=num2*num1;
gotoxy (20, 6);printf ("| |");
gotoxy (22,6);printf ("%f",num1);
key1=key;
strcat (sum,"");
len=0;
continue;
}
if (key1=='/')
{
num2=atof(sum);
num1=num1/num2;
gotoxy (20, 6);printf ("| |");
gotoxy (22,6);printf ("%f",num1);
key1=key;
strcat (sum,"");
len=0;
continue;
}
if (key1=='-')
{
num2=atof(sum);
num1=num1-num2;
gotoxy (20, 6);printf ("| |");
gotoxy (22,6);printf ("%f",num1);
key1=key;
strcat (sum,"");
len=0;
continue;
}
}
sum[len]=key;
sum[len+1]=NULL;
gotoxy (20, 6);printf ("| |");
gotoxy (22,6);printf ("%s",sum);
len=len+1;
}while (key!=27);
}
//********************** POWER **********************\\
double power(int xx,int yy)
{
int ii;
double pow=1;
for (ii=1;ii<=yy;ii++)
pow*=xx;
return (pow);
}
//********************** SIN **********************\\
double sin1(double xx)
{
xx=(xx*3.14)/180;
return (xx - (power(xx,3)/6) + (power(xx,5)/120) - (power(xx,7)/5040) + (power(xx,9)/362880));
}
//********************** COS **********************\\
double cos1(double xx)
{
xx=(xx*3.14)/180;
return (1 - (power(xx,2)/2) + (power(xx,4)/24) - (power(xx,6)/720) + (power(xx,8)/40320) );
}

tdkhakpur
دوشنبه 08 تیر 1388, 23:25 عصر
سلام
خدمت شما عرض کنم برنامه ارسالی شما قادر به انجام خواسته شما نیست و باید تغیرات کلی درش ایجاد بشود.
داخل تالار c در دو یا سه صفحه اول این کار انجام شده یک نگاهی بندازید.

lolojoon
سه شنبه 09 تیر 1388, 17:50 عصر
دوست عزیز، من اصلا وقت ندارم که بخوام برنامه رو درست کنم .
یک برنامه از سایت پیدا کردم ولی خطا می ده .
براتون فایل رو می زارم ، ممنون می شم که کمک کنید و خطاهاش رو برطرف کنید .

بازم از لطفتون ممنونم .

فایل پروژه

tdkhakpur
چهارشنبه 10 تیر 1388, 13:52 عصر
سلام
فکر کنم قسمت اصلی فایل ارسالی شما از نظر الگوریتم حذف شده .
کد زیر را برای شما ارسال میکنم فقط داده های ورودی نباید غیرمعقول باشد مثلا 4**+-2 باشد.


#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
//---------------
struct Caclulate
{
char Operator;
float Num;
}Calc[100];
int MaxOp=0;
//---------------
int PutStrData2St(char *str)
{
int c=0, j;
char buf[20];
char oldsign = '?';
for( int i=0; str[i]!=0;){
switch( str[i] )
{
case '(':
if( oldsign == 'n' || oldsign == ')'){
Calc[c++].Operator = '*';
oldsign = '*';
}
case ')':
case '+':
case '-':
case '*':
case '/':
break;
default:
j = 0;
while( str[i] >= '0' && str[i] <= '9' )
buf[j++] = str[i++];
buf[j] = 0;
Calc[c].Operator = 'n'; // it means that the stack is num vlue
Calc[c].Num = atof(buf) ;
if(oldsign=='-'){
Calc[c].Num = Calc[c].Num*-1;
Calc[c-1].Operator = '+';
}
c++;
oldsign = 'n';
break;
}
}
return c;
}
//---------------
void Remove (int item)
{
MaxOp = MaxOp>0 ? MaxOp-1 : 0;
for( int i=item; i<MaxOp; i++)
Calc[i] = Calc[i+1] ;
}
//---------------
float Calculat (int c)
{
if( c<MaxOp ){
switch(Calc[c].Operator)
{
case '(':
Calc[c].Num = Calculat(c+1);
Remove (c+1);
Calculat(c);
break;
case 'n':
if( Calc[c+1].Operator == ')' || (c+1) == MaxOp )
Remove (c+1);
else{
switch(Calc[c+1].Operator)
{
case '+':
case '-':
if(Calc[c+1].Operator=='+')
Calc[c].Num += Calculat(c+2);
else
Calc[c].Num -= Calculat(c+2);
Remove (c+2);
Remove (c+1);
break;
case '*':
case '/':
if(Calc[c+1].Operator=='*')
Calc[c].Num *= Calculat(c+2);
else
Calc[c].Num /= Calculat(c+2);
Remove (c+2);
Remove (c+1);
Calculat(c);
break;
}
}
break;
}
}
return Calc[c].Num;
}
//---------------
int main()
{
char str[50];
cin>>str;
MaxOp = PutStrData2St(str);
cout<< Calculat (0);
return 0;
}

موفق باشید.

lolojoon
چهارشنبه 10 تیر 1388, 19:52 عصر
با سلام به دوست عزیزم . واقعا ازتون ممنونم .
کمک بسیار زیادی به من کردید . امیدوارم بتونم جبران کنم:لبخندساده: