?? 計算器4.c
字號:
double ctod (char *,int );
int f(char);
int check(char *,int);
void ztob(char *,char *);
double zhu(char *);
#define P printf
#include"stdio.h"
#include"string.h"
void main (void)
{
char c[1000],*c1=c,c2[1000];
int i,biao,length,flag=0,fla;
double jieguo;
P("請選擇輸入算式的表示法,輸入代號\n 1波蘭輸入法\n 2自然輸入法(務必正確輸入,且不要輸入括號,此算法無法查錯)\n");
fla=scanf("%d",&biao);
while( fla==0||( biao!=1&&biao!=2 ) )
{
while(getchar()!='\n') ;
P("請選擇輸入算式的表示法\n 1波蘭輸入法\n 2自然輸入法(務必正確輸入,且不要輸入括號,此算法無法查錯)\n");
fla=scanf("%d",&biao);
/*while(getchar()!='\n') ;*/
}
while(getchar()!='\n') ;
if(biao==1)
{
printf("輸入波蘭算式");
gets(c2);
length=strlen(c2); P("length=%d\n",length);
flag=check(c2,length);
while(flag==0)
{
printf("波蘭算式錯誤,重新輸入\n");
gets(c2);
length=strlen(c2);
flag=check(c2,length);
}
c2[length]='\n';
jieguo=zhu(c2);
}
if(biao==2)
{
P("輸入自然算式:\n");
gets(c1);
ztob(c1,c2);
for(i=0;c2[i]!='\n';i++) putchar(c2[i]);
jieguo=zhu(c2);
}
P("結果是%f\n",jieguo);
}
/*函數1 定義算波蘭法的函數*/
double zhu(char *c)
{
char *pc=c;
double a[1000],*pa=a,t;
int i=0,k=0,flag1=1;
while(c[i]!='\n')
{
if(c[i]!=42&&c[i]!=43&&c[i]!=45&&c[i]!=47) /*c[i]不是運算副*/
{
if(c[i]==32) {*pa=ctod(pc-k,k); pa++; k=0;}
else k++;
}
else /*c[i]是運算副*/
{
if((c[i-1]>=48&&c[i-1]<=57)||c[i-1]==46) {*pa=ctod(pc-k,k);k=0;}
else pa--;
switch (c[i])
{
case 43: t=(*(pa-1))+(*pa); break;
case 45: t=(*(pa-1))-(*pa); break;
case 42: t=(*(pa-1))*(*pa); break;
default:
{
if(*pa+1.0==1.0) {flag1=0;printf("除數為零,停止運算");}
else t=(*(pa-1))/(*pa);
}
}
*(--pa)=t;
pa++;
}
i++;
pc++;
}
if(flag1==1) return(t);
}
/*函數2 定義將字符轉化成數字的函數*/
double ctod(char *p,int k)
{
double s,z,x;
int numz=0,i=0,flag=0;
while(i<k&&flag==0)
{
if(p[i]!=46) numz++;
else flag=1;
i++;
}
z=0;
for(i=0;i<numz;i++) z=10*z+(double)(p[i]-48); ;
x=0;
for(i=k-1;i>numz;i--) x=x/10+p[i]-48;
s=z+x/10;
return(s);
}
/*函數3 定義初步檢查字符合理性的函數*/
int f(char c)
{
int b;
if((c>=48&&c<=57)||c==42||c==43||c==45||c==47||c==32||c==46) b=1;
else b=0;
return(b);
}
/*函數4 定義進一步檢查字符合理性的函數*/
int check(char *c,int length)
{
int i=0,nn=0,nk=0,nf=0,bd=0;
if(c[0]<48||c[0]>57) { P("第一個字符非數字");return(0);} /*第一個字符必須為數字*/
while(i<length)
{
if(f(c[i])==0) {P("c[%d]不滿足初步要求,c[%d]=%c\n",i,i,c[i]);return(0);}
else /*c[i]初步合理*/
{
if(c[i]==32) /*c[i]為空格*/
{
bd=0; nk++;
if(c[i+1]==32) {P("c[%d]c[%d]都是空格\n",i,i+1);return(0);}
}
else /*c[i]非空格*/
{
if(c[i]==43||c[i]==45||c[i]==42||c[i]==47) /*c[i]為四符*/
{
bd=0; nf++;
if(nf>(nn+1)) /*第n個運算副前至少n+1個數,此條件不成立*/
{P("不滿足第n個運算副前至少n+1個數\n"); return(0);}
}
else /*c[i]非四符*/
{
if(c[i]==46) /*c[i]為小數點*/
{
if(bd==0) bd=1;
else { P("c[i]為第二個小數點\n");return(0);} /*兩個小數點*/
}
else /*c[i]非小數點,只能是數字*/
{
if(c[i+1]==43||c[i+1]==45||c[i+1]==42||c[i+1]==47||c[i+1]==32) nn++;
}
}
}
}
i++;
}
if( (nf==(nn-1)) && (nk<=nf) ) return(1);
else {P("不滿足運算副數比數字數少一\n"); return(0);}
}
/*函數5 定義將自然法轉換成波蘭法的函數*/
void ztob(char *c,char *c2)
{
int length,nn=0,nf=0,nk=0,i=0,k;
char fu[10]="k",*fp=fu;
length=strlen(c);
while(i<length)
{
if((c[i]>=48&&c[i]<=57)||c[i]==46) /*c[i]是數字或小數點*/
{
*c2=c[i];
c2++;
if((c[i+1]<48||c[i+1]>57)&&c[i+1]!=46)
{
nn++;
*c2=32;
c2++;
}
}
else /*c[i]是運算副*/
{
if( (*fp=='k')|| (( c[i]==42||c[i]==47 )&&( *(fp-1)==43||*(fp-1)==45 )) )
/*fp空或c[i]高于fp頂*/
{
*fp=c[i];
fp++;
}
else
{
k=fp-fu;
if(k==1)
{
fp--;
if(*(c2-1)==32) c2--;
*c2=*fp;
c2++;
nf++;
*fp=c[i];
fp++;
}
if(k==2)
{
fp--;
if(*(c2-1)==32) c2--;
*c2=*fp;
c2++;
nf++;
/*始*/ if(( c[i]==42||c[i]==47 )&&( *(fp-1)==43||*(fp-1)==45 ))
{
*fp=c[i];
fp++;
}
else
{
fp--;
if(*(c2-1)==32) c2--;
*c2=*fp;
c2++;
nf++;
*fp=c[i];
fp++;
} /*終*/
}
}
}
i++;
}
P("符號站里有%c %c\n",fu[0],fu[1]); P("fp-fu==%d\n",fp-fu);
while(fp-fu!=0)
{
P("取一次\n");
fp--;
if(*(c2-1)==32) c2--;
*c2=*fp;
c2++;
}
*c2='\n';
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -