misaq
كاربر تک ستاره
ارسالها: 35
موضوعها: 17
تاریخ عضویت: مهر ۱۳۸۶
تشکرها : 0
( 2 تشکر در 2 ارسال )
|
RE: ماشین حساب
بازم سلام
تقریبا همه ی محاسباتی ها رو درست کردم
الان علاوه بر کارهای قبلی قابلیت رسم نمودار هم داره
ممنون می شم اگه کسی بتونه نمودارشو درست کنه.
برای رفتن به قسمت نمودار از کلید fاستفاده کنید.
تابع نمودار نمودارهای معمولی رو رسم می کنه ولی با نمودار هایی مثل tanx,1/tanx,1/xیه سری مشکلات داره.چون نقاط رو با line به هم وصل می کنه یه سری خطوط اضافی (مجانبها) هم می کشه که نمودارو خرلب می کنه البته اونو درست کردم.ولی حالا توابع x^x یا tanx^tanxرو اشتباه می کنه اونم درست کردم ولی خطوط نمودار خراب شد(به اون دوتا شرطی که تو تابع نمودار کاری نمی کنن دقت کنید اگه فعال بشن یه سری خطها رسم نمی شن)
شاید هر سه تا شرطم الگوریتمی خراب باشه
اگه می شه یه کد مناسب بزنید که کار کنه.يادم رفت بگم. براي توابع مثلثاتي قبل از رسم نمودار كليد rرو بزنيد تا از حالت درجه به حالت راديان تبديل بشه.
کد: #include<conio.h>
#include<stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<math.h>
#include<graphics.h>
int k,a[1000],y=26,avval=0,nomber=0,insert=0,max=0,amalgar[100];
int X=320,Y=240,D=25;
int first=0,end=0,pabaz[100],pabas[100];
int x=0,q=0,w=0,i=0,para=0;
int sabet[100],counter=-1,dotshomar=0;
int hyp=0,virg=0,i2=0;
int error=0,tab=0,lk=0;
int rad=0;
int ER[640];
double pi=M_PI;
double nem[640][2];
double adad[100],shib=0,shib2=0;
unsigned short int far *screen=(unsigned short int far*) 0xb8000000;
char *c;
int FUNC(char *c)
{
*c=getch();
if(*c==0)
{
*c=getch();
return 1;
}
else
return 0;
}
void nemoodar()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
*c=0;
while(*c!=13)
{
clrscr();
setcolor(1);
line(0,Y,639,Y);
line(X,0,X,480);
setcolor(3);
for(int h=0;h<639;h++)
{
shib=((Y-D*nem[h+1][1])-(Y-D*nem[h][1]))/((X+D*nem[h+1][0])-(X+D*nem[h][0]));
shib2=((Y-D*nem[h+2][1])-(Y-D*nem[h+1][1]))/((X+D*nem[h+2][0])-(X+D*nem[h+1][0]));
if(ER[h]&&ER[h+1]&&ER[h-1])
//if(Y-D*nem[h][1]>0&&Y-D*nem[h][1]<480&&Y-D*nem[h+1][1]>0&&Y-D*nem[h+1][1]<480)
//if(Y-D*nem[h][1]-Y+D*nem[h+1][1]>0||(Y-D*nem[h][1]-Y+D*nem[h+1][1]<0&&(nem[h][1]-nem[h-1][1]<0)))
if(shib*shib2>0)
line((X+D*nem[h][0]),(Y-D*nem[h][1]),(X+D*nem[h+1][0]),(Y-D*nem[h+1][1]));
}
k=FUNC(c);
if(*c==75)
X+=10;
if(X>640)
X=640;
if(*c==72)
Y+=10;
if(Y>480)
Y=480;
if(*c==77)
X-=10;
if(X<0)
X=0;
if(*c==80)
Y-=10;
if(Y<0)
Y=0;
if(*c==43)
D++;
if(D>100)
D=100;
if(*c==45)
D--;
if(D<=12)
D=12;
}
closegraph();
}
void por(int i,int j,int color)
{
screen[i*80+j]=color;
}
void benevis()
{
for(int i=0;i<24;i++)
por(23,i+26,a[i+avval]+256*4);
}
double behsaz(double r)
{
if(!rad)
{
if(r>359)
r-=360;
else
r+=360;
if(r>360||r<0)
behsaz(r);
return r;
}
else
{
if(r>2*pi)
r-=(2*pi);
else
r+=(2*pi);
if(r>2*pi||r<0)
behsaz(r);
return(r);
}
}
void LOG()
{
a[nomber]=108;
a[nomber+1]=111;
a[nomber+2]=103;
a[nomber+3]=40;
nomber+=4;
max+=4;
para++;
lk=40;
}
void tangant()
{
a[nomber]=116;
a[nomber+1]=97;
a[nomber+2]=110;
a[nomber+3]=40;
para++;
nomber+=4;
max+=4;
lk=40;
}
void sinus()
{
a[nomber]=115;
a[nomber+1]=105;
a[nomber+2]=110;
a[nomber+3]=40;
para++;
nomber+=4;
max+=4;
lk=40;
}
void cosinus()
{
a[nomber]=99;
a[nomber+1]=111;
a[nomber+2]=115;
a[nomber+3]=40;
para++;
nomber+=4;
max+=4;
lk=40;
}
double Mjazr(double q1,double q2)
{
double ans1=0;
if(q2>0)
{
while(pow(ans1,q1)<q2)
ans1=ans1+0.00001;
return (ans1-0.00001);
}
else if(q2<0)
{
while(pow(ans1,q1)>q2)
ans1=ans1-0.00001;
return (ans1);
}
else return 0;
}
double Mlog(double q1,double q2)
{
if(q1<=0||q2<0)
{error=1;return 0;}
else
return log10(q1)/log10(q2);
}
double Mcosinus(double p)
{
if(!rad)
{
if(p>359||p<1)
p=behsaz(p);
if(p!=90&&p!=270)
return cos((p/180)*pi);
else return 0;
}
else
{
if(p>2*pi||p<0)
p=behsaz(p);
return cos(p);
}
}
double Mtangant(double p)
{
if(!rad)
{
if(p>359||p<1)
p=behsaz(p);
return tan((p/180)*pi);
}
else
{
if(p>2*pi||p<0)
p=behsaz(p);
return tan(p);
}
}
double Msinus(double p)
{
if(!rad)
{
if(p>359||p<1)
p=behsaz(p);
if(p!=360&&p!=180)
return sin((p/180)*pi);
else
return 0;
}
else
{
if(p>2*pi||p<0)
p=behsaz(p);
return sin(p);
}
}
void backspase()
{
if(max!=0)
max--;
for(int i=nomber;i<1000;i++)
a[i-1]=a[i];
nomber--;
if(avval>0)
avval--;
else
{
por(24,y,219+256*7);
por(24,y-1,10*256+24);
y--;
}
}
void harfgozar()
{
for(int i=999;i>nomber;i--)
a[i]=a[i-1];
max++;
if(*c!=112)
a[nomber]=*c;
else a[nomber]=227;
if(y==50)
y=49;
if(a[nomber+1]==0)
a[nomber+1]=32;
}
void jadid()
{
for (int i=0;i<640;i++)
ER[i]=0;
for(i=0;i<50;i++)
for(int j=0;j<80;j++)
if (j>25&&j<50&&i<30&&i>20)
if(i!=23)
por(i,j,219+256*7);
else
por(i,j,219+256*16);
else
por(i,j,219+256*9);
por(24,y,10*256+24);
for(i=0;i<100;i++)
{
amalgar[i]=0;
adad[i]=0;
}
nomber=i=max=0;
pabaz[-1]=0;
for(i=0;i<1000;i++)
a[i]=0;
}
void arc()
{
a[nomber]=97;
a[nomber+1]=114;
a[nomber+2]=99;
nomber+=3;
max+=3;
benevis();
while(*c!=115 && *c!=116&&*c!=99)
k=FUNC(c);
if(*c==115)
sinus();
else if(*c==116)
tangant();
else if(*c==99)
cosinus();
}
void hyper()
{
if(*c==115)
sinus();
else if(*c==99)
cosinus();
else if(*c==116)
tangant();
a[nomber-1]=104;
a[nomber]=40;
nomber++;
max++;
}
void tabe()
{
a[nomber]=102;
a[nomber+1]=40;
a[nomber+2]=120;
a[nomber+3]=41;
a[nomber+4]=61;
tab++;
max+=5;
nomber+=5;
}
double aashar()
{
int tavan=0;
double ans=0;
while(a[i+1]>47&&a[i+1]<59)
{
i++;
ans=10*ans+a[i]-48;
tavan--;
}
return ans*pow(10,tavan);
}
double POW(double q1,double q2)
{
double power=0;
if(q1<0&&q2-floor(q2)!=0)
{
error=1;
power=0;
}
else if(q1==0&&q2==0)
{
error=1;
power=1;
}
else if(pow(q1,q2)>999999)
{
error=1;
power=0;
}
else
power=pow(q1,q2);
return power;
}
double mohasebe(int m,int n)
{
i=m+1;
if(a[i]==45&&a[i+1]==40)
{
i++;
adad[x]=-1*(mohasebe(i,41));
i++;
}
while(a[i]!=n&&!error)
{
if(a[i]==99&&a[i+3]!=104)
{
i+=3;
counter++;
sabet[counter]=x;
adad[x]=mohasebe(i,41);
adad[x]=Mcosinus(adad[x]);
x=sabet[counter];
counter--;
i++;
}
else if(a[i]==99&&a[i+3]==104)
{
i+=4;
counter++;
sabet[counter]=x;
adad[x]=mohasebe(i,41);
adad[x]=cosh(adad[x]);
x=sabet[counter];
counter--;
i++;
}
else if(a[i]==115&&a[i+3]==40)
{
i+=3;
counter++;
sabet[counter]=x;
adad[x]=mohasebe(i,41);
adad[x]=Msinus(adad[x]);
x=sabet[counter];
counter--;
i++;
}
else if(a[i+3]==104&&a[i]==115)
{
i+=4;
counter++;
sabet[counter]=x;
adad[x]=mohasebe(i,41);
adad[x]=sinh(adad[x]);
x=sabet[counter];
counter--;
i++;
}
else if(a[i]==251)
{
i++;
counter++;
sabet[counter]=x;
adad[x]=mohasebe(i,44);
x++;
adad[x]=mohasebe(i,41);
adad[x-1]=Mjazr(adad[x-1],adad[x]);
adad[x]=0;
x=sabet[counter];
counter--;
i++;
}
else if(a[i]==108)
{
i+=3;
counter++;
sabet[counter]=x;
adad[x]=mohasebe(i,44);
x++;
adad[x]=mohasebe(i,41);
adad[x-1]=Mlog(adad[x-1],adad[x]);
adad[x]=0;
x=sabet[counter];
counter--;
i++;
}
else if(a[i]==116&&a[i+3]!=104)
{
i+=3;
counter++;
sabet[counter]=x;
adad[x]=mohasebe(i,41);
adad[x]=Mtangant(adad[x]);
x=sabet[counter];
counter--;
i++;
}
else if(a[i]==116&&a[i+3]==104)
{
i+=4;
counter++;
sabet[counter]=x;
adad[x]=mohasebe(i,41);
adad[x]=tanh(adad[x]);
x=sabet[counter];
counter--;
i++;
}
else if(a[i]==97&&a[i+3]==115)
{
i+=6;
counter++;
//sabet[counter]=x;
adad[x]=mohasebe(i,41);
if(adad[x]>1||adad[x]<-1)
error=1;
else
{
if(!rad)
adad[x]=(asin(adad[x])/pi)*180;
else
adad[x]=asin(adad[x]);
}
if(!error)
{
//x=sabet[counter];
counter--;
i++;
}
}
else if(a[i]==97&&a[i+3]==99)
{
i+=6;
counter++;
//sabet[counter]=x;
adad[x]=mohasebe(i,41);
if(adad[x]>1||adad[x]<-1)
error=1;
else
{
if(!rad)
adad[x]=(acos(adad[x])/pi)*180;
else
adad[x]=acos(adad[x]);
}
if(!error)
{
//x=sabet[counter];
counter--;
i++;
}
}
else if(a[i]==97&&a[i+3]==116)
{
i+=6;
counter++;
//sabet[counter]=x;
adad[x]=mohasebe(i,41);
if(!rad)
adad[x]=(atan(adad[x])/pi)*180;
else
adad[x]=atan(adad[x]);
//x=sabet[counter];
counter--;
i++;
}
while(((a[i]>47&&a[i]<59)||a[i]==46||a[i]==120||a[i]==227||a[i]==101)&&!error)
{
if(a[i]!=46&&a[i]!=120&&a[i]!=227&&a[i]!=101)
{
adad[x]=10*adad[x]+a[i]-48;
i++;
}
else if(a[i]==46)
{
adad[x]=adad[x]+aashar();
i++;
}
else if(a[i]==120)
{
if(i2!=-320)
adad[x]=nem[i2+319][0]+0.1;
else
adad[x]=i2/10;
if(i2==0)
adad[x]=0;
i++;
nem[i2+320][0]=adad[x];
}
else if(a[i]==227)
{
adad[x]=M_PI;
i++;
}
else if(a[i]==101)
{
adad[x]=M_E;
i++;
}
if(x>1000)
error=1;
}
while((a[i]<48||a[i]==94)&&a[i]!=0&&a[i]!=n)
{
if(a[i]!=40)
amalgar[x]=a[i];
else
{
if(adad[x]!=0)
x++;
counter++;
sabet[counter]=x;
adad[x]=mohasebe(i,41);
x=sabet[counter];
counter--;
}
i++;
}
x++;
}
if (counter<0)
sabet[counter]=0;
for(int i1=sabet[counter];i1<x;i1++)
if(amalgar[i1]==94)
{
adad[i1]=POW(adad[i1],adad[i1+1]);
for(int j=i1;j<x;j++)
adad[j+1]=adad[j+2];
for(j=i1;j<x;j++)
amalgar[j]=amalgar[j+1];
x--;
i1--;
}
for(i1=sabet[counter];i1<x;i1++)
if(amalgar[i1]==42)
{
adad[i1]=adad[i1]*adad[i1+1];
for(int j=i1;j<x;j++)
adad[j+1]=adad[j+2];
for(j=i1;j<x;j++)
amalgar[j]=amalgar[j+1];
x--;
i1--;
}
for(i1=sabet[counter];i1<x;i1++)
if(amalgar[i1]==47)
{
if(adad[i1+1]!=0)
adad[i1]=adad[i1]/adad[i1+1];
else
error=1;
for(int j=i1;j<x;j++)
adad[j+1]=adad[j+2];
for(j=i1;j<x;j++)
amalgar[j]=amalgar[j+1];
x--;
i1--;
}
for(i1=sabet[counter];i1<x;i1++)
if(amalgar[i1]==45)
{
adad[i1]=adad[i1]-adad[i1+1];
for(int j=i1;j<x;j++)
adad[j+1]=adad[j+2];
for(j=i1;j<x;j++)
amalgar[j]=amalgar[j+1];
x--;
i1--;
}
for(i1=sabet[counter];i1<x;i1++)
if(amalgar[i1]==43)
{
adad[i1]=adad[i1]+adad[i1+1];
for(int j=i1;j<x;j++)
adad[j+1]=adad[j+2];
for(j=i1;j<x;j++)
amalgar[j]=amalgar[j+1];
x--;
i1--;
}
if(x>0)
x--;
if(!error)
return adad[x];
else
return 0;
}
void main()
{
int paravirg=0;
a[-1]=40;
jadid();
int k=FUNC(c);
while(*c!=27)
{
if((*c>47&&*c<59&&lk!=41&&lk!=120&&lk!=112&&lk!=101)||(*c==112&&(lk==40||lk==42||lk==43||lk==45||lk==47||lk==94||lk==0||lk==44))
||(*c==120&&tab&&(lk==42||lk==43||lk==45||lk==47||lk==94||lk==40||lk==0||lk==44))||(*c==44&&virg!=0&&((lk>47&&lk<59)
||lk==41||lk==101||lk==112||lk==120))||(*c==46&&dotshomar==0&&(lk>47&&lk<59))
||((*c==42||*c==43||*c==47||*c==94)&&((lk>47&&lk<59)||lk==41||lk==120||lk==112||lk==101))
||(*c==45&&lk!=46&&lk!=45&&lk!=42&&lk!=43&&lk!=47&&lk!=94)||
(*c==40&&(lk==42||lk==43||lk==45||lk==47||lk==40||lk==0||lk==94)
||(*c==101&&(lk==40||lk==42||lk==43||lk==44||lk==45||lk==47||lk==94||lk==0))
||(*c==41&&((lk>47&&lk<59)||lk==41||lk==120||lk==112||lk==101))&&(*c!=41||para>0)))
{
if(*c==40)
para++;
if(*c==41)
{
if(virg)
paravirg--;
para--;
}
else if(*c==46)
dotshomar++;
else if((*c==42||*c==43||*c==45||*c==47)&&dotshomar==1)
dotshomar--;
else if(*c==44)
virg--;
lk=*c;
if(y>48)
avval++;
harfgozar();
if(nomber<1000)
nomber++;
y++;
}
else if(*c==115)
if(!hyp)
sinus();
else
hyper();
else if(*c==99)
if(!hyp)
cosinus();
else
hyper();
else if(*c==116)
if(!hyp)
tangant();
else
hyper();
else if(*c==104)
hyp=1-hyp;
else if(*c==97)
arc();
else if(*c==106)
{
lk=40;
a[nomber]=251;
a[nomber+1]=40;
para++;
max+=2;
nomber+=2;
virg++;
}
else if(*c==102)
tabe();
else if (*c==114)
rad=1-rad;
else if(*c==108)
{
LOG();
virg++;
}
if((*c==75)&&(k==1))
{
int ezafe=0;
if(nomber>0)
nomber--;
if(y>26)
{
por(24,y,219+256*7);
por(24,y-1,10*256+24);
y--;
}
else
{
avval-=6;
if(avval<0)
{
ezafe=0-avval;
avval=0;
}
por(24,y,219+256*7);
y=y+5-ezafe;
if(y<26)
y=26;
por(24,y,24+256*10);
}
}
if(*c==13&¶==0&&!tab&&!virg&&((lk>47&&lk<58)||lk==41||lk==112||lk==101))
{
end=1;
a[max]=41;
gotoxy(25,25);
double ans=mohasebe(-1,41);
if(!error)
printf("%G",ans);
else
printf("error!!!");
a[max]=0;
}
if(*c==13&&tab&&!virg&¶==0&&((lk>47&&lk<58)||lk==41||lk==120||lk==112||lk==101))
{
end=1;
a[max]=41;
for(i2=-320;i2<320;i2++)
{
nem[i2+320][1]=mohasebe(4,41);
for(int j2=0;j2<100;j2++)
adad[j2]=0;
if(error==1)
{
ER[i2+320]=0;
// nem[i2+320][0]=nem[i2+319][0];
// nem[i2+320][1]=nem[i2+319][1];
}
else
ER[i2+320]=1;
error=0;
}
a[max]=0;
nemoodar();
}
if((*c==8)&&(k==0)&&(nomber!=0))
backspase();
//printf("%d",*c);
benevis();
por(23,25,219+256*9);
if(avval!=0)
por(23,25,17+256*4);
por(23,50,219+256*9);
if(avval+23<max)
por(23,50,16+256*4);
k=FUNC(c);
if(end)
jadid();
}
}
(آخرین ویرایش در این ارسال: ۲۹-بهمن-۱۳۸۶, ۲۲:۵۷:۲۴، توسط misaq.)
|
|