今天给各位分享科学计算器c语言代码的知识,其中也会对科学计算器c语言代码怎么用进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、c语言编写简单的科学计算器2、如何用C语言编写一个科学计算器3、c语言编写“多功能计算器”的代码
c语言编写简单的科学计算器
/*/////////////////////////////////////////////////////////////
* 功能:实现一个计算器程序
* 作者:
* 时间:
*////////////////////////////////////////////////////////////*/
#include iostream
#include cstdlib
#include cctype
#include cstring
using namespace std;
enum types { DELIMITER = 1, VARIABLE, NUMBER};//定义枚举类型把DELIMITER初试化为1后面
//的相应的是前面值+1
class Info
{
public:
void displayInfo();
};
class parser
{
char *exp_ptr; // 定义一个指向表达式的指针
char token[80]; // 存储表达式中的字符变量
char tok_type; // 存储具体是什么类型
void eval_exp2(double result);
void eval_exp3(double result);
void eval_exp4(double result);
void eval_exp5(double result);
void eval_exp6(double result);
void atom(double result);
void get_token();
void serror(int error);
int isdelim(char c);
public:
parser();//类的构照函数
double eval_exp(char *exp);
};
void Info::displayInfo()
{
cout”==============================================================\n”;
cout”====================这是一个计算器程序========================\n”;
cout”==============================================================\n”;
cout”* 说明:可以进行+ – * \ % ^ 操作您还可以用括号输入您的表达式 *\n”;
cout”* 您输入表达式不需要输=号 例:您可输入(6+7)*5\\7+4 然后回车 *\n”;
cout”==============================================================\n\n”;
cout “\t\t输入点号(.)回车,结束程序运行\n\n”;
}
// 类构造函数的具体实现
parser::parser()
{
exp_ptr = NULL;//把exp_ptr的指针初始化为空
}
// 方法eval_exp的具体实现过程
double parser::eval_exp(char *exp)
{
double result;
exp_ptr = exp;//把传递过来的参数exp赋给exp_ptr
get_token();
if(!*token)
{
serror(2); //输出没有任何表达式的错误信息
return 0.0;
}
eval_exp2(result);
if(*token) serror(0); // last token must be null
return result;
}
// 两个变量字符是加或者减操作
void parser::eval_exp2(double result)
{
register char op;
double temp;
eval_exp3(result);
while((op = *token) == ‘+’ || op == ‘-‘)
{
get_token();
eval_exp3(temp);
switch(op)
{
case ‘-‘:
result = result – temp;
break;
case ‘+’:
result = result + temp;
break;
}
}
}
// 两个变量是乘或者除操作 或者是取余
void parser::eval_exp3(double result)
{
register char op;
double temp;
eval_exp4(result);
while((op = *token) == ‘*’ || op == ‘/’ || op == ‘%’)
{
get_token();
eval_exp4(temp);
switch(op)
{
case ‘*’:
result = result * temp;
break;
case ‘/’:
result = result / temp;
break;
case ‘%’:
result = (int) result % (int) temp;
break;
}
}
}
// 进行^运算
void parser::eval_exp4(double result)
{
double temp, ex;
register int t;
eval_exp5(result);
if(*token== ‘^’)
{
get_token();
eval_exp4(temp);
ex = result;
if(temp==0.0)
{
result = 1.0;
return;
}
for(t=(int)temp-1; t0; –t) result = result * (double)ex;
}
}
void parser::eval_exp5(double result)
{
register char op;
op = 0;
if((tok_type == DELIMITER) *token==’+’ || *token == ‘-‘)
{
op = *token;
get_token();
}
eval_exp6(result);
if(op==’-‘) result = -result;
}
// 进行有括号的算法
void parser::eval_exp6(double result)
{
if((*token == ‘(‘))
{
get_token();
eval_exp2(result);
if(*token != ‘)’)
serror(1);
get_token();
}
else atom(result);
}
// 取得数值
void parser::atom(double result)
{
switch(tok_type)
{
case NUMBER:
result = atof(token);
get_token();
return;
default:
serror(0);
}
}
// 输出出错信息.
void parser::serror(int error)
{
static char *e[]=
{
“语法错误”,
“不对称的括号”,
“您没有输入任何的表达式!”
};
cout e[error] endl;
}
// 取得下一个token值
void parser::get_token()
{
register char *temp;
tok_type = 0;
temp = token;
*temp = ‘\0’;
if(!*exp_ptr) return; // 如果到表达式末尾则返回
while(isspace(*exp_ptr)) ++exp_ptr; //
if(strchr(“+-*/%^=()”, *exp_ptr))
{ //用strchr函数在字符串”+-*/%^=()”中查找*exp_ptr指向的字符所在位置,判断返回值(非0为真就执行)以便是否执行以下语句
tok_type = DELIMITER;//把tok_type置为DELIMITER
// advance to next char
*temp++ = *exp_ptr++;
}
else if(isalpha(*exp_ptr))
{
while(!isdelim(*exp_ptr)) *temp++ = *exp_ptr++; //isdelim判断是否是分隔符,当*exp_ptr指向的字符不为分隔符时把值负给*temp
tok_type = VARIABLE;//把tok_type置为VARIABLE
}
else if(isdigit(*exp_ptr))
{ // isdigit判断*exp_ptr指向的字符是否为数字
while(!isdelim(*exp_ptr)) *temp++ = *exp_ptr++;
tok_type = NUMBER;
}
*temp = ‘\0’;
}
// isdelim函数的具体实现,如果参数是一个分割符则返回真
int parser::isdelim(char c)
{
if(strchr(” +-/*%^=()”, c) || c==9 || c==’\r’ || c==0)//把”+-/*%^=()09\r定义非分隔符
return 1;
return 0;
}
int main()
{
char expstr[80];
Info prgInfo;
parser ob; // 创建一个parser类型的实例
prgInfo.displayInfo();
for(;;)
{
cout “请输入你要计算的表达式: “;
cin.getline(expstr, 79);//读入表达式到名为expstr的数组中,数组大小为79
if(*expstr==’.’) break;
cout “计数的结果是: ” ob.eval_exp(expstr) “\n\n”;
};
return 0;
}
如何用C语言编写一个科学计算器
用栈 就可以办到了。。。这个很详细的, lz 随便输入一个表达式,中间的计算过程全部输出了,lz试两个 就知道怎么回事了。 #include stdio.h
#include stdlib.h
#include string.h
#define MAXSIZE 4000;
typedef struct
{
char data[10];
int top;//头地址
int base;//基地址
int length;//长度
}Stack;
void init(Stack *st)//初始化栈
{
st-base=0;
st-top=0;
st-length=0;
}
int isEmpty(Stack *st)
{
int n=0,top,base;
top =st-top;
base =st-base;
if(top==base)
{
return 1;
}
return n;
}
int isFull(Stack *st)
{
int n=0,top,base;
top =st-top;
if(top=4000)
{
return 1;
}
return n;
}
char getTop(Stack *st)// 返回top值,不改变栈的结构
{
char n;
if(isEmpty(st))
{
printf(“栈为空\n”);
return 0;
}
int positon= st-top-1;
n= st-data[positon];//取出数据;
return n;
}
char pop(Stack *st)// 出栈,返回
{
char n;
if(isEmpty(st))
{
printf(“栈为空\n”);
return 0;
}
int positon= st-top-1;
n= st-data[positon];//取出数据;
st-top–;
st-length–;
st-data[positon]=’\0′;//消除数据
return n;
}
void push(char n,Stack *st)//入栈
{
int positon ;
if(isFull(st))
{
printf(“栈满\n”);
}
else
{
positon= st-top;//获取位置
st-data[positon]=n;//存入数据
st-top++;//改变位置
}
}
void show(Stack *m1)//输出栈中的数据
{
int top,base;
top=m1-top;
base=m1-base;
while(topbase)
{
printf(“%c,”,m1-data[–top]);
}
printf(“\n”);
}
int isOperate(char temp)//是否是操作符
{
if(temp==’+’||temp==’-‘||temp==’*’||temp==’/’||temp=='(‘||temp==’)’||temp==’#’)
{
return 1;
}
return 0;
}
int isValue(char temp)//是否是数值
{
if(temp=’0’temp=’9′)//
{
return 1;
}
else
{
return 0;
}
}
int isAvail(char temp)//是否有效字符
{
if(isOperate(temp)||isValue(temp))//如果temp既不是操作符和数值的话,则它是非法的
{
return 1;
}
return 0;
}
int detect(char temp)//搜索矩阵位置
{
int i=0;
char oper[7]={‘+’,’-‘,’*’,’/’,'(‘,’)’,’#’};
for(i=0;i7;i++)
{
if(temp==oper[i])
{
return i;
}
}
}
char Priority(char temp,char optr)//判断优先级
{
/**//*
+ – * / ( ) #
1 2 3 4 5 6 7
+ 1
– 2
* 3
/ 4
( 5 = 0
) 6 = 0
# 7 0 =
*/
int row ,col;
char priority[7][7]={/**//* + – * / ( ) # */
{”,”,”,”,”,”,”},
{”,”,”,”,”,”,”},
{”,”,”,”,”,”,”},
{”,”,”,”,”,”,”},
{”,”,”,”,”,’=’,”},
{”,”,”,”,’=’,’0′,”},
{”,”,”,”,”,”,’=’},
};
row = detect(temp);//找出对应的矩阵下标;
col = detect(optr);
// printf(“%d,%d”,row,col);
//优先级存储在一个7×7的矩阵中,对应关系上图;
return priority[row][col];
}
char evaluate(int a,int b,char oper)
{
switch(oper)
{
case ‘+’: return a+b+’0′;
case ‘-‘: return a-b+’0’;
case ‘*’: return a*b+’0′;
case ‘/’: return a/b+’0′;
default : return 0+’0′;
}
}
int calculateExpress(char *express)//计算表达式
{
int result=0;
int a,b;
// char oper,result;
Stack OPTR,OPND;//OPTR存储操作符,OPND操作数值
init(OPTR);
init(OPND);
push(‘#’,OPTR);//默认第一个位’#’
////////////////////-算法-////////////////////////////
while(*express!=’\0′)
{
char temp;
temp= *(express);
printf(“———————————\n”);
printf(“当前的符号为%c\n”,temp);
if(isAvail(temp))//是否是有效字符
{
if(isOperate(temp) )//输入的是操作符
{
char oper,result;
char optr = getTop(OPTR);//栈中top位的操作符
printf(“栈顶操作符位:%c\n”,optr);
char prior = Priority(temp,optr);//判断优先级
switch(prior)
{
case ”:
push(temp,OPTR);
printf(“将符号位%c入栈\n”,temp);
express++;
break;
case ”:
//int a,b;
//char oper,result;
a=pop(OPND)-‘0’;//存在栈中的都是char字符
b=pop(OPND)-‘0’;
oper=pop(OPTR);
result=evaluate(b,a,oper);//出栈一个操作符,计算结果
//printf(“%d”,result-‘0’);
push(result,OPND);//结果入OPND
printf(“%d%c%d结果为:%d\n”,b,oper,a,result-‘0’);
break;
case ‘=’:
//消除括号
pop(OPTR);
printf(“消除括号\n”);
express++;
break;
}
}
if(isValue(temp))//输入的是数值
{
push(temp,OPND);//将数值位入栈;
express++;
printf(“将数值%c压入栈\n”,temp);
//show(OPND);
}
}
else //表达式中有非法字符
{
printf(“表达式中有非法字符\n”);
exit(-1);//退出程序
}
}
// show(OPND);
// show(OPTR);
return getTop(OPND)-‘0’;
}
void inputExpress(char *express)//输入表达式
{
int length=0;
printf(“请输入一个表达式:”);
scanf(“%s”,express);
int len =strlen(express);
express[len]=’#’;//表达式最后一位默认为’#’;
express[len+1]=’\0′;
}
void output(char *express,int result)//输出表达式
{
int i=0;
printf(“—————————————-\n表达式:”);
while(express[i]!=’#’)
{
printf(“%c”,express[i]);
i++;
}
printf(“=%d\n”,result);
}
int main()
{
char express[100];//表达式
int result =0;
inputExpress(express);//输入表达式
result = calculateExpress(express);//计算表达式;
output(express,result); //输出表达式
//、、、、、、、、、、、、、测试优先级。
/**//*
char m=’7′ ;
m=Priority(‘+’,’*’);
printf(“优先级为%c”,m);
int m=evaluate(5,6,’m’);
printf(“%d”,m);
*/
return 0;
}
c语言编写“多功能计算器”的代码
#includestdio.h
#includewindows.h
#includemath.h
double
EPS=10E-6;
double
sum(double
a,double
b)
{
return
a+b;
}
double
sub(double
a,double
b)
{
return
a-b;
}
double
mul(double
a,double
b)
{
return
a*b;
}
double
divv(double
a,double
b)
{
return
a/b;
}
int
rem(int
a
,
int
b)
{
return
a%b;
}
int
addnumber(int
c,int
d)
{
int
sum=0;
for(int
i=c;i=d;i++)
{
sum+=i;
}
return
sum;
}
int
factor(int
n)
{
int
f=1;
for(int
i=1;i=n;i++)
{
f*=i;
}
return
f;
}
void
displaymenu()
{
printf(“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\n”);
printf(“*############高级计算器############*
\n”);
printf(“************************************
\n”);
printf(“*
①加法运算
*
\n”);
printf(“*
②减法运算
*
\n”);
printf(“*
③乘法运算
*
\n”);
printf(“*
④除法运算
*
\n”);
printf(“*
⑤取余运算
*
\n”);
printf(“*
⑥累加运算
*
\n”);
printf(“*
⑦阶乘运算
*
\n”);
printf(“*
⊙结束运算
*
\n”);
printf(“************************************
\n”);
printf(“************************************
\n”);
}
void
main()
{
int
c,d;
/*用于做四则运算的两个数值的说明*/
double
a,b;
/*用来做累加函数的两个参数值的说明*/
int
intresult;
double
result;
/*用于保存表单运算中函数的返回值*/
int
choice;
displaymenu();/*保存用户选择项目菜单项*/
while(1)
{
printf(“请选择你所进行运算项目的符号:”);
scanf(“%d”,choice);
switch(choice)
{
case
1:
/*加法计算*/
printf(“请输入两个数字:”);
scanf(“%lf%lf”,a,b);
result=sum(a,b);
printf(“%lf+%lf的计算结果是:%lf\n”,a,b,result);
break;
case
2:
/*减法计算*/
printf(“请输入两个数字:”);
scanf(“%lf%lf”,a,b);
result=sub(a,b);
printf(“%lf-%lf的计算结果是:%lf\n”,a,b,result);
break;
case
3:
/*乘法计算*/
printf(“请输入两个数字:”);
scanf(“%lf%lf”,a,b);
result=mul(a,b);
printf(“%lf*%lf的计算结果是:%lf\n”,a,b,result);
break;
case
4:
/*除法计算*/
{
scanf(“%lf%lf”,a,b);
if(b-0.0EPS)
printf(“数字错误\n”);
else
{
printf(“请输入两个数字:”);
result=divv(a,b);
printf(“%lf/%lf的计算结果是:%lf\n”,a,b,result);
}
break;
}
case
5:
/*取余计算*/
printf(“请输入两个数字:”);
scanf(“%d%d”,c,d);
result=rem(c,d);
printf(“%d
%
%d的计算结果是:%d\n”,c,d,result);
break;
case
6:
/*累加计算*/
printf(“请输入两个整数”);
scanf(“%d%d”,c,d);
intresult=addnumber(c,d);
printf(“%d-%d的累加计算结果是:%d\n”,c,d,intresult);
break;
case
7:
//阶乘计算
{
printf(“请输入一个大于0小于10的整数字”);
scanf(“%d”,c);
if(c0||c10)
{
printf(“请输入一个大于0小于10的整数字,数据错误。\n”);
break;
}
intresult=factor(c);
printf(“%d的阶乘计算结果是:%d\n”,c,intresult);
break;
}
case
0:
printf(“谢谢使用。欢迎下次再用。\n”);
return
;
default:
printf(“选择错误,程序结束\n”);
break;
}
}
}
关于科学计算器c语言代码和科学计算器c语言代码怎么用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。