导语:这份c语言表达式求值报告,适用于国企技术岗实习报告,试用期总结,写代码调试过程。 重点聚焦:讲清楚自己参与了一个计算器程序开发,主要负责栈结构实现和表达式求值逻辑性。 全文约1050字,阅读需10分钟。
适用对象:计算机专业学生、刚入职的程序员、需要交周报的实习生。
使用场合:国企技术岗实习报告,试用期总结,写代码调试过程。
核心内容:讲清楚自己参与了一个计算器程序开发,主要负责栈结构实现和表达式求值逻辑性。
内容体量:1050字 阅读时长:10分钟
# include
# define ma__operator_num 100 //运算符栈数组长度
# define ma__data_num 100 //运算数栈数组长度
typedef struct opstack //定义运算符栈
{
char opstack[ma__operator_num];
int top;
}opstack, _popstack;
typedef struct datastack //定义运算数栈
double stack[ma__data_num];
}datastack, _pdatastack;
void initpopstack(popstack postack) //初始化运算符栈
if( !(postack = (popstack)malloc(sizeof(opstack)))) //为运算符栈分配空间
printf(分配内存空间失败! );
e_it(-1);
}
postack->;;;top = -1;
void initpdatastack(pdatastack pdstack) //初始化运算数栈
if( !(pdstack = (pdatastack)malloc(sizeof(datastack)))) //为运算数栈分配空间
pdstack->;;;top = -1;
void pushopstack(popstack postack, char ch) //运算符进栈
postack->;;;opstack[ (postack->;;;top)] = ch;
void popopstack(popstack postack, char ch) //运算符出栈
ch = postack->;;;opstack[postack->;;;top];
postack->;;;top--;
void pushdatastack(pdatastack pdstack, double d) //运算数进栈
(pdstack->;;;top);
pdstack->;;;stack[pdstack->;;;top] = d;
void popdatastack(pdatastack pdstack, double d) //运算数出栈
d = pdstack->;;;stack[pdstack->;;;top];
pdstack->;;;top--;
void clearpopstack(popstack postack) //清空运算符栈
void clearpdatastack(pdatastack pdstack) //清空运算数栈
char gettoppopstack(popstack postack) //获取运算符栈顶元素
return postack->;;;opstack[postack->;;;top];
double gettoppdatastack(pdatastack pdstack) //获取运算数栈顶元素
return pdstack->;;;stack[pdstack->;;;top];
bool isop(char ch) //区分 运算符 和 运算数 的函数,是运算符时返回true,否则返回false
{ //判断是否为符号
if ( (ch == ) || (ch == -) || (ch == _) || (ch == /) || (ch == =) || (ch == a) || (ch == s) || (ch == a) || (ch == s) || (ch == () || (ch == )) )
return true;
else
return false;
char precede(char op1, char op2) //参考《数据结构》(c语言版)第53页 3.2.5表达式求值 表 3.1
char tab[9][10]; //定义字符串的二维数组来存放运算符优先级的关系
strcpy( tab[0], >;;;>;;;<<;<; );
strcpy( tab, >;;;>;;;<<;<; );
strcpy( tab, >;;;>;;;>;;;>;;;;<; );
strcpy( tab[3], >;;;>;;;>;;;>;;;;<; );
strcpy( tab[4], <<<<<=<
strcpy( tab[5], >;;;>;;;>;;;>;;;e>;;;>;;;>;;;>;;; );
strcpy( tab[6], >;;;>;;;>;;;>;;;;>;;;>;;;>;;; );
strcpy( tab[7], >;;;>;;;>;;;>;;;;>;;;>;;;>;;; );
strcpy( tab[8], <<<<
printf( | ___欢迎您的下次使用!谢谢!___ | ); //退出使用
printf( |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| );
double operate(double a, char theta, double b) //对出栈的运算符和运算数进行计算
double s;
switch(theta)
case :
s = a b;
break;
case -:
s = a - b;
case _:
s = a _ b;
case /:
if ( b != 0 ) //判断除数是否为0,若为0,退出程序
s = a/b;
printf( #### 除数为0,非法运算。程序终止! #### );
e_it_e; //打印结束菜单
case a:
s = fabs(b); //调用fabs函数
case s:
if( b >;;;= 0) //判断被开方数是否为0,若为0,退出程序
s = sqrt(b); //调用sqrt函数
printf( #### 求负数的平方根是非法运算。程序终止! #### );
return s;
char changechar(char c) //通过changechar函数来把a、s的小写字母改为大写的
if( c == a )
c = a;
else if( c == s )
c = s;
return c;
//参考《数据结构》(c语言版)第53页 3.2.5表达式求值算法3.4 evaluatee_pression_r函数
void evaluatee_pression_r //计算函数:读入表达式,并计算结果
popstack postack; //声明运算符栈
pdatastack pdstack; //声明运算数栈
double result; //存运算的结果
char _, theta, c; //c存放读取的字符,_、theta存放运算符栈的栈顶元素
int flag, data; //标识符,用来读入连续的数字
double getd; //存放gettop___的结果
double a, b, cc; //a,b存放数据栈出栈的栈顶元素, c存放运算结果
flag = 0; //初始化标识符,用来判断字符串中的连续数字
data = 0; //
initpopstack(postack); //初始化运算符栈
initpdatastack(pdstack); //初始化运算数栈
pushopstack(postack, =); //在运算符栈底放入=
printf( 请输入表达式以=结束:);
c = get); //读入字符
changechar(c); //通过调用函数来实现把小写的a、s改为大写的a、s
while( c != = || gettoppopstack(postack) != =)
{
if( !isop(c) ) //不是运算符进栈
{
s = c - 0; //把字符转化为数字
if ( flag == 1 )
{
popdatastack(pdstack, getd);
s = getd_10 s;
}
pushdatastack(pdstack, s);
flag = 1;
c = get);
changechar(c);
}
else
{
flag = 0;
switch( precede(gettoppopstack(postack), c) ) //输入元素和运算符栈顶元素比较
{
case <: //栈顶元素优先级低
pushopstack(postack, c);
c = get);
changechar(c);
break;
case =: //托括号并接受下一个字符
popopstack(postack, _);
c = get);
changechar(c);
break;
case >;;;: //退栈并将运算结果进栈
popopstack(postack, theta);
popdatastack(pdstack, b);
popdatastack(pdstack, a);
cc = operate(a, theta, b);
pushdatastack(pdstack, cc);
break;
}//switch
}//else
}//while
result = gettoppdatastack(pdstack); //运算结束时,运算数栈的栈底元素就是计算结果
clearpopstack(postack); //清空运算符栈
clearpdatastack(pdstack); //清空运算数栈
printf( ->;;;计算结果为:%.2f , result); //输出运算结果
return ;
}
void print_user //欢迎界面
{
printf( 欢迎使用c语言版模拟计算器 );
printf(________________________________________________________________________ );
printf( |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| );
printf( | 模拟计算器使用说明 | );
printf( | 作者:谢先斌 | );
printf( | 本程序包括对 、-、_、/、的运算 | );
printf( | 本程序中abs算用a替代、sqrt运算用s代替 | );
printf( | 本程序中的一切字母均不区分大小写 | );
printf( 正确的表达式如:1 a(7-8) s(9_8)= );
printf( | 输入=表示表达式输入结束! | );
printf( | 欢迎使用!-->;;;-->;;; | );
printf( |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| );
printf(________________________________________________________________________ );
}
int main //主函数
{
char in;
bool b; //标识符,用来标识是否结束程序
b = true; //初始化,不结束
print_user; //打印欢迎界面
printf( _请确认使用计算器y/n:);
while(1)
{
scanf(%c, in); //确认是否继续操作
get); //吃掉会车,避免干扰
switch(in)
{
case y:
case y:
{
evaluatee_pression_r; //进入计算函数:读入表达式,并计算结果
break;
}
case n:
case n:
{
e_it_e;
b = false;
break;
}
//default:
// printf( __输入错误,请重新输入y/n:);
// break;
}
if(b==false) //如果 b==false ,退出整个程序
break;
printf( _您确定要继续使用计算机y/n:);
get); //用getchar吃掉回车,避免对后续输入中in的干扰
}
return 0;
标题、正文、小结,段落分明,每部分不超三段,先写做了啥再写结果。