一个计算器的C语言实现「建议收藏」

一个计算器的C语言实现

大家好,又见面了,我是全栈君。

今天在读《编译原理及实践》时。看到了一个简单的整数计算器的实现。

依照书上的思路,我略微进行了扩展:

1、从整数计算器扩展到小数计算器。

2、支持除法

3、支持空字符。

执行效果例如以下:

一个计算器的C语言实现「建议收藏」

代码非常easy,例如以下:

cal.c:

#include <stdio.h>
#include <stdlib.h>

char token;

double exp(void);
double term(void);
double factor(void);
char getPrintableChar(void);

void match(char expectedToken);
void error(void);


int main(void)
{
	double result;

	for (;;)
	{
		token = getPrintableChar();
		if (token == 'q')
			break;

		result = exp();
		if (token == '\n')
			printf("Result is: %g\n", result);
		else
			error();
	}

	return 0;
}

double exp(void)
{
	double temp = term();
	while (token == '+' || token == '-')
		switch(token)
		{
			case '+': match('+');
					  temp += term();
					  break;
			case '-': match('-');
					  temp -= term();
					  break;
		}
	return temp;
}

double term(void)
{
	double temp = factor();
	while (token == '*' || token == '/')
		switch(token)
		{
			case '*': match('*');
					  temp *= factor();
					  break;
			case '/': match('/');
					  temp /= factor();
					  break;
		}
	return temp;
}

double factor(void)
{
	double temp;
	if (token == '(')
	{
		match('(');
		temp = exp();
		match(')');
	} else if (isdigit(token))
	{
		ungetc(token, stdin);
		scanf("%lf", &temp);
		token = getPrintableChar();
	} else
		error();

	return temp;
}

void error(void)
{
	fprintf(stderr, "Error!\n");
	exit(EXIT_FAILURE);
}

void match(char expectedToken)
{
	if (expectedToken == token)
		token = getPrintableChar();
	else
		error();
}

char getPrintableChar(void)
{
	char temp;
	do
		temp = getchar();
	while (isblank(temp));

	return temp;
}

程序实现的思路是依照EBNF规则实现,即:

<exp> -> <term> { <addop> <term> }
<addop> -> + | -
<term> -> <factor> { <mulop> <factor> }
<mulop> -> * | /
<factor> -> ( <exp> ) | Number

关于EBNF, 能够參考书上的内容。在这里就不赘述了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116303.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 软件的静态测试_软件测试静态测试和动态测试的区别

    软件的静态测试_软件测试静态测试和动态测试的区别静态测试通常是指不执行程序代码而寻找代码中可能存在的错误或评估程序代码的过程。静态测试的主要内容:①各阶段的评审、②代码检查、③软件复杂性分析、④软件质量度量①评审是对软件元素或项目状态进行评估的活动,用以确定与预期结果之间的偏差和相应的改进意见,一般评审包括培训评审、预备评审、同行评审。同行评审是由开发软件产品作者以外的其他人检查工作产品,以发现缺陷并寻找改进的机会同行评审一般包

    2025年7月2日
    5
  • pt100测温电路图(ad590典型的测温电路)

    PT100精密测温电路一、需求分析根据题目要求为:测温范围为0-100℃、测温精度要求为±1℃。由于铂电阻具有精度高、性能可靠、稳定性好的特点,且铂电阻的电阻相对变化率与温度的关系曲线线性度最好,故选择铂电阻作为敏感元件。而在国标中,铂电阻有几种不同的标准,如PT100、PT1000。分别对应着0摄氏度下铂电阻的阻值为100R和1000R,由于需要考虑铂电阻的自发热问题,所以尽量选择阻值小的铂电阻,故选择PT100为最终型号。二、电路设计2.1热电阻接法热电阻测温电路有多种接法,其中三线制会导致

    2022年4月9日
    77
  • 银行家算法C语言版「建议收藏」

    银行家算法C语言版「建议收藏」#include<stdio.h>#include<stdlib.h>#include<conio.h>#definem50#definetrue1#definefalse0intno1;//进程数intno2;//资源数intr;intallocation[m][m],need[m][m],available[m],max[m][m];charname1[m],name2[m];.

    2022年6月8日
    41
  • day07_Scanner类,Random类,ArrayList类

    day07_Scanner类,Random类,ArrayList类

    2021年5月19日
    104
  • 树莓派能做什么?如何使用树莓派[通俗易懂]

    树莓派能做什么?如何使用树莓派[通俗易懂]我们知道树莓派是最常用的开发板,树莓派受欢迎的原因之一在于树莓派的功能非常全面,不论是做视频播放、音频播放等功能,树莓派都能派上用场。为增进大家对树莓派的认识,本文将带大家了解一下曾有人用树莓派做了什么。如果你对树莓派具有兴趣,不妨继续往下阅读哦。1、无线热点这大概是地球人拿来干的最多的一件——插上网线和USB无线网卡,配置之后就可以作为一个无线热点。2、机械假肢MITMediaLab的研究员把它作为机械假肢的控制器。3、简易自制笔记本把树莓派跟LCD液晶面板连上,再加上鼠标键盘

    2022年6月10日
    50
  • java课设选题_基于javaweb的课程设计

    java课设选题_基于javaweb的课程设计Java课程设计1.题目及要求基于学校的搜索引擎负责部分:JavaGUI设计2.界面调查1)调查界面:百度2)思考:根据我的调查,我认为我需要完成三个界面的设计:第一个是调查主界面,里面有一个集美大学的logo,一个搜索框用文本字段,因为需要在里面写入搜索内容,一个搜索按钮用button,这个按钮完成的功能就是输入搜索内容后,点击搜索按钮,可以跳转到下一个界面,并且返回结果。第二个界面是搜索结…

    2025年5月31日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号