一个计算器的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, 能够參考书上的内容。在这里就不赘述了。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • RocketMQ报错: commit_memory(0x00000006ec800000, 2147483648, 0) failed; error=‘Cannot allocate memory

    RocketMQ报错: commit_memory(0x00000006ec800000, 2147483648, 0) failed; error=‘Cannot allocate memory环境:虚拟机测试环境,在向MQ推送消息发现连不上namesrv,查看netstat-antlp|grep9876发现namesrv进程已关闭。利用命令重启:sh/usr/local/rocketmq/rocketmq-all/bin/mqnamesrv提示报错:[root@hantestrocketmq-all]#sh/usr/local/rocketmq/rocketmq-all/bin/mqnamesrvOpenJDK64-BitServerVMw

  • java关键字:fianl的一些简单的用法

    java关键字:fianl的一些简单的用法

  • jsrender

    jsrender

  • 转:分享两个饼状图在线生成工具[通俗易懂]

    转:分享两个饼状图在线生成工具[通俗易懂]饼状图最近用的蛮多的,每次用excel略麻烦:https://imgflip.com/chart-makerhttp://www.lizibuluo.com/bing/index.php两个工具

  • 发卡网源码(企业和个人发卡网源码二合一)及代理系统附搭建教程

    发卡网源码(企业和个人发卡网源码二合一)及代理系统附搭建教程  最近,有网友问到,自己在上传发卡网源码的时候,总是各种出错。比如404、或者数据库错误等等。  如果通过自己上传源码,安装的时候还是出现各种错误。  附源码及演示:fakaysw.top  那么,我建议可以使用企业级发卡网源码的一键部署功能。  这个功能对于新手来说,非常好用,十分省心。  第一种方式是,找到宝塔面板的“软件商店”-“发卡网源码一键部署”  看一下列表中有没有你想要安装的程序,如果没有找到,看下面的第二种方式  第二种方式,找到“软件商店”,在搜索框搜索“发卡网一键

  • lora协议不属于lpwan_哪种协议用于wan

    lora协议不属于lpwan_哪种协议用于wan考虑使用LoRaWAN部署您的物联网解决方案?倘若您正在开发用于工业或企业用途的专用网络解决方案,那么您需要了解此技术的一些限制(以及在许多情况下将为您提供更好服务的替代协议)。在本文中,我们将深入探讨:LoRa与LoRaWAN的区别LoRaWAN如何运作LoRaWANA,B和C类啁啾率,处理增益和正交性利用LoRaWAN构建专用网络的障碍另一种解决方案:SymphonyLinkLoRa与Lo…

发表回复

您的电子邮箱地址不会被公开。

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