本人是菜鸟,写了很久才弄出来,见笑了哦
如果可以给个精鼓励鼓励
功能介绍:排除干扰,有括号,有优先级,能计算+-*/ 和取余%的计算
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<math.h>
#define INPUT_LEN 256//定义输入长度
//变量
char input[INPUT_LEN]={"1+((1+2)+1)"};//定义输入数组
char *pinput=input; //数组指针(用于格式化函数类)
//以下是函数
int checkchar(char cchar); //判断有效字符
double calculate(char input[INPUT_LEN]); //计算无括号有优先级
double singlecalculate(double num1,char sign,double num2);//简单计算
double kuohao(char *input);
void main()
{
//输入循环:
printf("本计算器能计算加+、减-、乘*、除/、取模%\n"
"只要你输入一条表达式就能立即得到结果\n"
"清屏输入clear,退出输入quit\n"
"现在请输入一串不超过255个字符的表达式:\n");
while(fgets(input,INPUT_LEN,stdin)!="quit\n")
{
if(strcmp(input,"clear\n")==0)
{
system("cls");
}
else
{
printf("=%lf\n",kuohao(input));
}
}
}
//括号区:
double kuohao(char *input)
{
char copy[INPUT_LEN]={'\0'},kuostr[INPUT_LEN]={'\0'}; //备用字符
int index=0,dexto=-1,to=0;
strcpy(copy,input);
while(true) //大循环
{
index=0;dexto=-1;
while(copy[index]) //检查内括号
{
if(copy[index]=='(')
{
dexto=++index;
}
else if(copy[index]==')'&&dexto!=-1)
{
copy[dexto-1]='\0';
to=0; //缓存数据清零
while(dexto<index) //复制最内括号
{
// printf("aa%c\n",copy[dexto]);
//将最内括号前括号换成结束
kuostr[to++]=copy[dexto++];
}
dexto++;
kuostr[to]='\0';
printf("括号内数据:%s\n",kuostr);
sprintf(kuostr,"%lf",calculate(kuostr));
for(to=0;kuostr[to];to++);
while(copy[dexto])//将括号后的复制到括号结果后
{
kuostr[to++]=copy[dexto++];
}
kuostr[to]='\0';
strcat(copy,kuostr); //将括号结果连到copy上
printf("第一括号提取计算结果%s\n",copy);
break;
}else index++;
}
if(dexto==-1)//如果没有全的括号
{
index=0;
dexto=0;
while(copy[index])//去掉残留括号
{
if(copy[index]!='('&©[index]!=')')
{
copy[dexto++]=copy[index++];
}else
{
index++;
}
}
copy[dexto]='\0';
return calculate(copy);//最后计算
}
}
}
//以下为计算区
//判断有效字符ok
int checkchar(char cchar)
{
char che[]={'0','1','2','3','4','5','6','7','8','9','.','+','-','*','/','^','%'};
for(int i=0;i<(int)strlen(che);i++)
if(cchar==che[i])return i+1;
return 0;
}
//计算函数
double calculate(char input[INPUT_LEN])
{
int index=0,dexto=0;
bool firsttime =0;
double num[4]={0};
char sign[4]={'s'};
while(sign[0]!='a'){
// if(input[index]){
for(int i=0;i<4;i++)
{
if(firsttime ==1)i=3;
//提取第i+1个数字
dexto=1;
char num_str[INPUT_LEN]={'+'};
while(input[index])
{
if(isdigit(input[index]))
num_str[dexto++]=input[index++];
else
if((input[index]=='+'||input[index]=='-')&&dexto==1)
num_str[dexto-1]=input[index++];
如果可以给个精鼓励鼓励
功能介绍:排除干扰,有括号,有优先级,能计算+-*/ 和取余%的计算
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<math.h>
#define INPUT_LEN 256//定义输入长度
//变量
char input[INPUT_LEN]={"1+((1+2)+1)"};//定义输入数组
char *pinput=input; //数组指针(用于格式化函数类)
//以下是函数
int checkchar(char cchar); //判断有效字符
double calculate(char input[INPUT_LEN]); //计算无括号有优先级
double singlecalculate(double num1,char sign,double num2);//简单计算
double kuohao(char *input);
void main()
{
//输入循环:
printf("本计算器能计算加+、减-、乘*、除/、取模%\n"
"只要你输入一条表达式就能立即得到结果\n"
"清屏输入clear,退出输入quit\n"
"现在请输入一串不超过255个字符的表达式:\n");
while(fgets(input,INPUT_LEN,stdin)!="quit\n")
{
if(strcmp(input,"clear\n")==0)
{
system("cls");
}
else
{
printf("=%lf\n",kuohao(input));
}
}
}
//括号区:
double kuohao(char *input)
{
char copy[INPUT_LEN]={'\0'},kuostr[INPUT_LEN]={'\0'}; //备用字符
int index=0,dexto=-1,to=0;
strcpy(copy,input);
while(true) //大循环
{
index=0;dexto=-1;
while(copy[index]) //检查内括号
{
if(copy[index]=='(')
{
dexto=++index;
}
else if(copy[index]==')'&&dexto!=-1)
{
copy[dexto-1]='\0';
to=0; //缓存数据清零
while(dexto<index) //复制最内括号
{
// printf("aa%c\n",copy[dexto]);
//将最内括号前括号换成结束
kuostr[to++]=copy[dexto++];
}
dexto++;
kuostr[to]='\0';
printf("括号内数据:%s\n",kuostr);
sprintf(kuostr,"%lf",calculate(kuostr));
for(to=0;kuostr[to];to++);
while(copy[dexto])//将括号后的复制到括号结果后
{
kuostr[to++]=copy[dexto++];
}
kuostr[to]='\0';
strcat(copy,kuostr); //将括号结果连到copy上
printf("第一括号提取计算结果%s\n",copy);
break;
}else index++;
}
if(dexto==-1)//如果没有全的括号
{
index=0;
dexto=0;
while(copy[index])//去掉残留括号
{
if(copy[index]!='('&©[index]!=')')
{
copy[dexto++]=copy[index++];
}else
{
index++;
}
}
copy[dexto]='\0';
return calculate(copy);//最后计算
}
}
}
//以下为计算区
//判断有效字符ok
int checkchar(char cchar)
{
char che[]={'0','1','2','3','4','5','6','7','8','9','.','+','-','*','/','^','%'};
for(int i=0;i<(int)strlen(che);i++)
if(cchar==che[i])return i+1;
return 0;
}
//计算函数
double calculate(char input[INPUT_LEN])
{
int index=0,dexto=0;
bool firsttime =0;
double num[4]={0};
char sign[4]={'s'};
while(sign[0]!='a'){
// if(input[index]){
for(int i=0;i<4;i++)
{
if(firsttime ==1)i=3;
//提取第i+1个数字
dexto=1;
char num_str[INPUT_LEN]={'+'};
while(input[index])
{
if(isdigit(input[index]))
num_str[dexto++]=input[index++];
else
if((input[index]=='+'||input[index]=='-')&&dexto==1)
num_str[dexto-1]=input[index++];