#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<malloc.h>
void hua(void);
void jiemian(void);
int shu1(char str[]);
void jinzhi(void);
double jisuan(char a[]);
void sizeyunsuan(void);
void sizeyunsuan2(void);
float operation(char []);
float shu(int x,int y,char str[]);
void cheng(int numnum,int s[],float num[],char str[]);
float suan(int numnum,int chengnum,int s[],float num[],char str[]);
main(void)
{
jiemian();
}
void sizeyunsuan(void)
{
char str[26];
int i,c;
float j;
printf("\n");
printf("该项功能可实现10个数(包括负数和小数)以内的不含括号的四则运算\n");
printf("例如3+2.5*7+-5\n\n");
printf("请输入要计算的式子,以回车结束\n");
scanf("%s",str);
j=operation(str);
printf("结果:\n");
for(i=0;str[i]!='\0';i++)
printf("%c",str[i]);
printf("=%.3f\n",j);
printf("\n");
printf("如果您没有得到您想要的数,请检查您输入的式子是否正确\n\n");
printf("继续执行该功能请输1,返回上一目录请输2,清屏请输3,退出请输4,以回车结束\n");
scanf("%d",&c);
switch(c)
{
case 1: sizeyunsuan();
case 2: jiemian();
case 3: system("cls");jiemian();
case 4: exit(0);
}
}
float operation(char str[])
{
int i,p=0,q=0,jia[9],cheng[9],s[9]={0};
float l,num[10];
int j,k=0;
int numnum=0,jianum=0,chengnum=0;
for(j=0;str[j]!='\0';j++)
{
if((isdigit(str[j])>0)&&(isdigit(str[j+1])==0&&str[j+1]!='.')) numnum++,s[++k]=j+1;
}
for(k=0;k<numnum;k++)
{
num[k]=shu(s[k],s[k+1],str);
}
for(i=0;i<numnum;i++)
{
if(str[s[i]]=='+'||str[s[i]]=='-') jia[p]=s[i],p++,jianum++;
else if (str[s[i]]=='*'||str[s[i]]=='/') cheng[q]=s[i],q++,chengnum++;
}
l=suan(numnum,chengnum,s,num,str);
return l;
}
float shu(int x,int y,char str[])
{
float b,c;
int sign=1,i,chu=10,a=0;
for(i=(x==0)?x:x+1;(c=str[i])!='/0';i++)
{
if(c=='-')sign=-1;
if (isdigit(c))
{
b=c-'0';
while (isdigit(c=str[++i]))
{b=b*10+c-'0';}
if (c=='.')
{
while(isdigit(c=str[++i]))
{
b=b+(c-'0')/chu;
chu*=10;
}
}
b*=sign;
a=1,chu=10;
}
if(a) {a=0;break;}
}
return b;
}
void cheng(int numnum,int s[],float num[],char str[])
{
int i,j;
for (i=1;i<numnum;i++)
{
if (str[s[i]]=='*')
{
num[i-1]=num[i-1]*num[i];
for(j=i;j<numnum-1;j++)
{
num[j]=num[j+1];
num[j+1]=0;
s[j]=s[j+1];
s[j+1]=s[numnum];
}
}
if (str[s[i]]=='/')
{
num[i-1]=num[i-1]/num[i];
for(j=i;j<numnum-1;j++)
{
num[j]=num[j+1];
num[j+1]=0;
s[j]=s[j+1];
s[j+1]=s[numnum];
}
}
}
}
float suan(int numnum,int chengnum,int s[],float num[],char str[])
{
float huan;
int i=0;
for(i=0;i<chengnum;i++) cheng(numnum,s,num,str);
huan=num[0];
for(i=1;i<numnum-chengnum;i++)
{
switch(str[s[i]])
{
case '+':huan=num[i-1]+num[i];num[i]=huan;break;
case '-':huan=num[i-1]-num[i];num[i]=huan;break;
}
}
return huan;
}
double jisuan(char a[])
{
int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0;
char nibo[50],zhan2[50];
double x,n,l,z=0,zhan3[50];
typedef struct
{
double d1;
int d2;
}dd;
typedef struct
{
dd data[50];
int top;
}zhan1;
zhan1 *shu;
shu=(zhan1 *)malloc(sizeof(zhan1));
shu->top=0;
while(a[i]!='\0')
{
if(a[i]>='0'&&a[i]<='9')
{
z=0;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{j++;}
j--;
for(k=i;k<=j;k++)
{
z=z*10+a[k]-'0';
}
j=j+1;
x=z;
if(a[j]=='.')
{
l=1;
i=j+1;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{j++;}
j--;
for(k=i;k<=j;k++)
{
n=pow(0.1,l);
l=l+1;
x=x+n*(a[k]-'0');
}
i=j+1;
}
else i=j;
shu->data[++shu->top].d1=x;
shu->data[shu->top].d2=++cnt;
nibo[++t1]='0'+shu->data[shu->top].d2;
nibo[t1+1]='\0';
}
else if(a[i]=='(')
{
zhan2[++t2]=a[i];
i++;
}
else if(a[i]==')')
{
j=t2;
while(zhan2[j]!='(')
{
nibo[++t1]=zhan2[j];
nibo[t1+1]='\0';
j--;
}
t2=j-1;
i++;
}
else if(a[i]=='+')
{
while(t2>0&&zhan2[t2]!='(')
{
nibo[++t1]=zhan2[t2];
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
else if(a[i]=='-')
{
if(a[i-1]=='$')
{
a[0]='0';
i=0;
}
else if(a[i-1]=='(')
{
a[i-1]='0';
a[i-2]='(';
i=i-2;
t2--;
}
else
{
while(t2>0&&zhan2[t2]!='(')
{
nibo[++t1]=zhan2[t2];
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
}
else if(a[i]=='*'||a[i]=='/')
{
while(zhan2[t2]=='*'||zhan2[t2]=='/'||zhan2[t2]=='^'||zhan2[t2]=='#')
{
nibo[++t1]=zhan2[t2];
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
else if(a[i]=='^'||a[i]=='#')
{
while(zhan2[t2]=='^'||zhan2[t2]=='#')
{
nibo[++t1]=zhan2[t2];
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
}
while(t2>0)
{
nibo[++t1]=zhan2[t2];
nibo[t1+1]='\0';
t2--;
}
j=1;t3=0;
while(j<=t1)
{
if(nibo[j]>='0'&&nibo[j]!='^'&&nibo[j]!='#')//
{
for(i=1;i<=shu->top;i++)
{
if((int)(nibo[j]-'0')==shu->data[i].d2)
{
m=i;
break;
}
}
zhan3[++t3]=shu->data[m].d1;
}
else if(nibo[j]=='+')
{
zhan3[t3-1]=zhan3[t3-1]+zhan3[t3];
t3--;
}
else if(nibo[j]=='-')
{
zhan3[t3-1]=zhan3[t3-1]-zhan3[t3];
t3--;
}
else if(nibo[j]=='*')
{
zhan3[t3-1]=zhan3[t3-1]*zhan3[t3];
t3--;
}
else if(nibo[j]=='/')
{
zhan3[t3-1]=zhan3[t3-1]/zhan3[t3];
t3--;
}
else if(nibo[j]=='^')
{
zhan3[t3-1]=pow(zhan3[t3-1],zhan3[t3]);
t3--;
}
else if(nibo[j]=='#')
{
zhan3[t3]=sqrt(zhan3[t3]);
}
j++;
}
return zhan3[t3];
}
void sizeyunsuan2()
{
char x,a[50];
double jieguo;
int i=0,d;
a[0]='$';
x=getchar();
printf("\n");
printf("该项功能可实现50个以内的数(包括负数和小数)之间的四则运算,其中#表示开平方,^表示乘方\n\n");
printf("例如12^3表示12的3次方,#16表示根号16\n");
printf("请输入表达式:\n");
x=getchar();
while(x!='\n')
{
a[++i]=x;
x=getchar();
}
a[i+1]='\0';
jieguo=jisuan(a);
printf("\n");
printf("结果为:%.3lf",jieguo);
printf("\n\n");
printf("如果您没有得到您想要的数,请检查您输入的式子是否正确\n\n");
printf("继续执行该功能请输1,返回上一目录请输2,清屏输3,退出请输4,以回车结束\n");
scanf("%d",&d);
switch(d)
{
case 1: sizeyunsuan2();
case 2: jiemian();
case 3: system("cls");jiemian();
case 4: exit(0);
}
}
void jinzhi(void)
{
char b[]="0123456789ABCDEF";
long int n,x;
int i=0,j=0,s,a[40];
int c,d;
char str[50];
printf("\n");
printf("欢迎使用进制转换器,本程序可实现2、8、10、16进制之间的互转\n\n");
printf("请输入您将要输入的数的进制数(如2,8,10,16):");
scanf("%d",&c);
switch(c)
{case 2:
printf("请输入要转换的2进制数正整数 n=");
scanf("%s",str);
n=shu1(str);
break;
case 8:
printf("请输入要转换8进制的正整数 n=");
scanf("%o",&n);break;
case 10:
printf("请输入要转换10进制的正整数 n=");
scanf("%d",&n);break;
case 16:
printf("请输入要转换16进制的正整数 n=");
scanf("%x",&n);break;
}
printf("请输入要转换的数制(如2,8,10,16),s=");
scanf("%d",&s);x=n;i=0;
printf("转换后的%d进制数为:",s);
while(x>0)
{
a[i]=x%s;x=x/s;i++;
}
while(i>0)
{printf("%c",b[a[i-1]]);i--;}
printf("\n\n");
printf("如果您没有得到您想要的结果,请检查您所输入的数是否已经超过进制限制\n\n");
printf("继续执行该功能请输1,返回上一目录请输2,清屏请输3,退出请输4,以回车结束\n");
scanf("%d",&d);
switch(d)
{
case 1: jinzhi();
case 2: jiemian();
case 3: system("cls");jiemian();
case 4: exit(0);
}
}
int shu1(char str[])
{
int b,c;
int i,a=0;
for(i=0;(c=str[i])!='/0';i++)
{
if (isdigit(c))
{
b=c-'0';
while (isdigit(c=str[++i]))
{b=b*2+c-'0';}
a=1;
}
if(a) {a=0;break;}