一个计算器的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)
上一篇 2022年1月23日 上午11:00
下一篇 2022年1月23日 下午12:00


相关推荐

  • android redis客户端,redis client (redis客户端)

    android redis客户端,redis client (redis客户端)redisclient(redis客户端)是一款编程辅助软件。这款软件协助开发人员和保护人员便利的树立,修正,删去,查询redis数据,彻底不需要了解redis指令。能够让用户便利的修改数据,剪切,仿制,张贴redis数据,能够导入,导出redis数据,能够对redis数据排序,进步编程功率和准确性。redisclient(redis客户端)软件功用重命名Redis数据更新Redis…

    2022年5月9日
    47
  • 【停更】Deepfacelab 新手教程

    【停更】Deepfacelab 新手教程欢迎进入本教程,本教程不定期更新本文教程内容更新时间为:2019/2,本文最后更新时间为:2019/3/8欢迎进群讨论,我不是群主,群主的各QQ群号码请看:https://deepfakes.com.cn/index.php/资助升级群这几天朱茵换脸杨幂的事件上了热门,我们群不存在该违法问题。然而因为网上的这个事件,2群排队已经可以说排到了明年。群主表示等风波结束了再考虑新群,毕竟群主不想…

    2022年5月4日
    116
  • linux 主机支持远程唤醒_LINUX 远程开机

    linux 主机支持远程唤醒_LINUX 远程开机linux远程开机1、主机bios设置支持lan启动2、查看机器是否支持服务器远程唤醒ethtooleth0Settingsforeth0:Supportedports:[TPMII]Supportedlinkmodes:10baseT/Half10baseT/Full100baseT/Half100baseT/FullSupportsauto-negotiat…

    2022年6月2日
    41
  • PYTHON 全栈工程师「建议收藏」

    PYTHON 全栈工程师「建议收藏」FSDDevelopmentwithPython:全栈工程师,FSD(FullStackDeveloper),在PYTHONRestfulService软件开发上主要包括:明确开

    2022年7月6日
    23
  • Springboot整合JdbcTemplate实现分页查询「建议收藏」

    Springboot整合JdbcTemplate实现分页查询「建议收藏」在做SpringBoot后端项目时,我想采用后端分页的模式,后端分页是在后端先把数据处理好,再发给前端,前端只需要访问对应的页面拿相应页的数据即可。后端分页的写法中MyBatis和JPA都有现成的后端分页组件,而JdbcTemplate却没有。因此这里以实体类User为例把自己的学习过程记录下来。…

    2022年10月9日
    4
  • 电脑很大,电脑内存很大为什么还是很卡「建议收藏」

    电脑很大,电脑内存很大为什么还是很卡「建议收藏」2019-10-09阅读(121)”电脑反应慢原因:1.电脑反应太慢,第一我们打开任务管理器,检查CPU资源的使用,若某个程序的CPU资源占用一直比较高(比如占到50%以上),系统速度就会明显变慢。因一般情况下,除大型游戏程序之外,应用程序在运行过程中只是瞬间占用较高,而不会一直持续2019-10-09阅读(132)一.清理垃圾在Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文…

    2022年5月5日
    335

发表回复

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

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