用c语言 (c++) 编写计算器程序

Python018

用c语言 (c++) 编写计算器程序,第1张

我们平时进行数学运算都是用计算器完成的,那么如何用C语言编写一个计算器呢?下面我给大家分享一下。

工具/材料

Dev C++

01

首先我们需要在Dev C++软件中创建一个C语言项目,项目类型选择控制台程序,如下图所示

02

接下来我们在项目下面新建C语言文件,如下图所示

03

然后我们在C文件中写入计算器逻辑代码,主要是让用户输入计算方式,然后程序自动计算,如下图所示

04

接下来我们点击运行菜单,选择下拉菜单中的运行选项,如下图所示

05

最后在弹出的界面中我们输入要计算的公式,程序就会自动计算,如下图所示

#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-1t>0--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

}