求C++100以内加减乘除法源代码
答案:2 悬赏:0
解决时间 2021-03-08 02:06
- 提问者网友:夕夏残阳落幕
- 2021-03-07 13:36
我们大一生的C++大作业,老师要求编一段程序,要求:供小学生使用的100以内加减乘除运算自测程序…好麻烦啊!各位高手帮帮忙!
最佳答案
- 二级知识专家网友:摧毁过往
- 2021-03-07 13:57
是100位还是100以内呃……
用随机函数自动生成数……
算法思路大概就是这样……毕竟我不学C 帮不了你了……
用随机函数自动生成数……
算法思路大概就是这样……毕竟我不学C 帮不了你了……
全部回答
- 1楼网友:末路丶一枝花
- 2021-03-07 14:18
#include
#include
#include
#include
#define max_size 256
enum bool{false,true};
typedef struct tagoperate{
double operand;
char operator;
}operate,*lpoperate;
void postsrc(char *src,lpoperate lpoperator);
int isdigit(char);
int isp(char ch);
int icp(char ch);
int locate(char ch);
int getoperand(char *s,int *len,double *oprd);
double calculate(lpoperate lpoperator,double x);
void srcfunproc(char *src);
void _proc(char*src);
static char operator[]="#(+-*/^";
static int inpriority[]={0,1,3,3,5,5,7};
static int outpriority[]={0,10,2,2,4,4,6};
int locate(char ch)
{
int i=0;
for(i=0;operator[i]!='\0';i++)
if(operator[i]==ch)
return i;
return -1;
}
int isp(char ch)
{
if('a'<=ch&&'z'>=ch)
return 9;
else
return inpriority[locate(ch)];
}
int icp(char ch)
{
if('a'<=ch&&'z'>=ch)
return 8;
else
return outpriority[locate(ch)];
}
void _proc(char*src)
{
char buffer[max_size];
char*p=src,*q=buffer;
*q++=*p++;
while('\0'!=*p)
{
if('-'==*p&&'('==*(p-1))
{
*q++='0';
*q++='-';
p++;
}
else
*q++=*p++;
}
*q='\0';
strcpy(src,buffer);
}
void srcfunproc(char*src)
{
char buffer[max_size];
char*p=src,*q=buffer;
while(*p!='\0')
{
switch(*p)
{
case 's': // a for sin
*q++='a';
p+=3;
break;
case 'c': // b for cos
*q++='b';
p+=3;
break;
case 'e': //c for exp
*q++='c';
p+=3;
break;
case 'l':
if('n'==*(p+1)) //d for ln()
*q++='d';
else
*q++='e'; //e for lg()
p+=2;
break;
case 't': //f for tan()
*q++='f';
p+=3;
break;
default:
*q++=*p++;
break;
}
}
*q='\0';
strcpy(src,buffer);
}
void postsrc(char*src,lpoperate lpoperator)
{
char *p=src,y;
lpoperate lpoptr=lpoperator;
char stack[max_size];
int top=-1;
double operand;
int offset=0;
stack[++top]='#';
while('\0'!=*p)
{
if(isdigit(*p))
{
getoperand(p,&offset,&operand);
p+=offset;
lpoptr->operand=operand;
lpoptr->operator=0;
lpoptr++;
}
else
if('x'==*p)
{
(lpoptr++)->operator='x';
p++;
}
else
if('p'==*p)
{
lpoptr->operand=3.14159266;
p+=2;
lpoptr->operator=0;
lpoptr++;
}
else
if(')'==*p)
{
for(y=stack[top--];y!='(';y=stack[top--])
(lpoptr++)->operator=y;
p++;
}
else
{
for(y=stack[top--];isp(y)>icp(*p);y=stack[top--])
(lpoptr++)->operator=y;
stack[++top]=y;
stack[++top]=*p++;
}
}
while(top!=-1)
(lpoptr++)->operator=stack[top--];
}
int isdigit(char ch)
{
if(('0'<=ch&&'9'>=ch)||'.'==ch)
return true;
return false;
}
int getoperand(char *s,int *len,double *oprd){
char *p = s,ch = *s++;
double z = 0,x = 0;
int bits = 0;
int point = false;
while( isdigit(ch) == true){
if (ch == '.'){
if (point == true)
return false;
point = true;
}
else {
if (point == true){
x *= 10;
x += ch - '0';
bits++;
}
else {
z *= 10;
z += ch - '0';
}
}
ch = *s++;
}
while(bits-- > 0) x /= 10;
z += x;
*oprd = z;
*len = s - p - 1;
return true;
}
double calculate(lpoperate lpoperator,double x)
{
double stack[max_size],y1,y2;
int top=-1;
lpoperate lpoptr=lpoperator;
stack[++top]=0;
while(lpoptr->operator!='#')
{
if(!lpoptr->operator)
stack[++top]=(lpoptr++)->operand;
else
if('x'==lpoptr->operator)
{
stack[++top]=x;
lpoptr++;
}
else
switch ((lpoptr++)->operator)
{
case '+':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y1+y2;
break;
case '-':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y2-y1;
break;
case '*':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y1*y2;
break;
case '/':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y2/y1;
break;
case '^':
y1=stack[top--];
y2=stack[top--];
stack[++top]=pow(y2,y1);
break;
case 'a':
y1=stack[top--];
stack[++top]=sin(y1);
break;
case 'b':
y1=stack[top--];
stack[++top]=cos(y1);
break;
case 'c':
y1=stack[top--];
stack[++top]=exp(y1);
break;
case 'd':
y1=stack[top--];
stack[++top]=log(y1);
break;
case 'e':
y1=stack[top--];
stack[++top]=log10(y1);
break;
case 'f':
y1=stack[top--];
stack[++top]=tan(y1);
break;
default:
break;
}
}
return stack[top];
}
void main()
{
char src[max_size];
double d;
operate postsrc[max_size];
memset(src,0,max_size);
printf("公式计算器--精确到小数点后八位 作者:*gothicmoon*\n输入任意表达式开始计算,输入quit结束程序\n常量 pi=3.14159266\n");
scanf("%s",src);
while(strcmp(src,"quit"))
{
_proc(src);
srcfunproc(src);
postsrc(src,postsrc);
d=calculate(postsrc,3.1415926);
printf("计算结果是:%f\n",d);
memset(src,0,max_size);
scanf("%s",src);
}
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯