前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个计算器的C语言实现「建议收藏」

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

作者头像
全栈程序员站长
发布2022-07-07 20:15:50
4790
发布2022-07-07 20:15:50
举报

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

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

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

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

2、支持除法

3、支持空字符。

执行效果例如以下:

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

代码非常easy,例如以下:

cal.c:

代码语言:javascript
复制
#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规则实现,即:

代码语言:javascript
复制
<exp> -> <term> { <addop> <term> }
<addop> -> + | -
<term> -> <factor> { <mulop> <factor> }
<mulop> -> * | /
<factor> -> ( <exp> ) | Number

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档