网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月23日
漏签
0
天
c语言吧
关注:
798,696
贴子:
4,346,973
看贴
图片
吧主推荐
视频
游戏
1
2
下一页
尾页
78
回复贴,共
2
页
,跳到
页
确定
<<返回c语言吧
>0< 加载中...
C语言表达式计算器~
只看楼主
收藏
回复
642985327
彩虹面包
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
刚开始学习数据结构,试着写了个这玩意儿。
不知道为什么,有些算数表达式会计算错误,希望吧友们发现计算错误的表达式回帖告诉我,3Q。
因为有BUG所以就不发源码了...
C.rar
大小:3.23KB
下载:14次
转存:0次
文件已失效
heyajunjim1
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
switch case
属
的吉吉啊
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪
肥鱼七号
低能力者
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
没源码没人可以告诉你
642985327
彩虹面包
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
#include <stdio.h>
#include <malloc.h>
#include <windows.h>
struct Numerical
{
double value;
struct Numerical *next;
};
struct Symbol
{
char c;
struct Symbol *next;
};
void Push_Numerical(struct Numerical **top,double value)
{
struct Numerical *p = *top;
(*top = (struct Numerical*)malloc(sizeof (struct Numerical)))->next = p;
(*top)->value = value;
}
void Push_Symbol(struct Symbol **top,char c)
{
struct Symbol *p = *top;
(*top = (struct Symbol*)malloc(sizeof (struct Symbol)))->next = p;
(*top)->c = c;
}
double Pop_Numerical(struct Numerical **top)
{
struct Numerical *p = *top;
double n = (*top)->value;
*top = (*top)->next;
free(p);
return n;
}
char Pop_Symbol(struct Symbol **top)
{
struct Symbol *p = *top;
char c = (*top)->c;
*top = (*top)->next;
free(p);
return c;
}
int priority(char c)
{
switch (c)
{
case *+*:
case *-*:
return 1;
case ***:
case */*:
return 2;
default:
return 10;
}
}
double calculate(char c,double l,double g)
{
switch (c)
{
case *+*:
return l + g;
case *-*:
return l - g;
case ***:
return l * g;
case */*:
return l / g;
}
}
int main (void)
{
struct Numerical *Numerical_stack = NULL;
struct Symbol *Symbol_stack = NULL;
double n;
int last_number = 0; //上一个读取的是不是数则值为假,如果上一个读取的是数,下一个只能是读取字符
char pop_c,c;
puts("表达式计算器\n\n");
puts("1.作者很笨,写出来的程序智商很低,因此它是一个很单纯的计算器,请不要用复杂的算数表达式为难它\n");
puts("2.因为作者忘记了除数不能为0,所以并没有做特殊处理,请不要故意除以0\n");
puts("3.当你输入错误的表达式,程序会采用崩溃的方式提示你的输入有误,请重启程序重新输入\n");
puts("4.支持的运算符:英文状态下:‘(’‘)’‘+’‘-’‘*’‘/’\n");
puts("程序有些BUG,某些表达式会得出错误的结果,希望大家能够指出\n作者:642985327");
system("pause");
system("cls");
begin:
if((c = getchar()) == *-*)Push_Numerical(&Numerical_stack,0); //如:-(5)第一个字符被压栈双目运算数字栈空导致错误
ungetc(c,stdin);
while ((c = getchar())!= *\n*) //读取表达式内容,在转换后缀表达式的同时进行运算
{
ungetc(c,stdin);
if (last_number == 0 && scanf("%lf",&n))
{
Push_Numerical(&Numerical_stack,n);
last_number = 1;
}
else
{
char a = getchar();
if ((c == *+* || c == *-* ) && c != a && last_number != 1) //防止scanf吃掉正负号导致程序错误计算,如果scanf勿吃掉了计算用的正负号则仍回输入流
ungetc(a,stdin);
else
c=a;
if ((c) == *)*)
{
while ((pop_c = Pop_Symbol(&Symbol_stack)) != *(*)
{
double g = Pop_Numerical(&Numerical_stack);
double l = Pop_Numerical(&Numerical_stack);
Push_Numerical(&Numerical_stack,calculate(pop_c,l,g));
}
}
else if (Symbol_stack == NULL || c == *(* || Symbol_stack->c ==*(* || priority(Symbol_stack->c) < priority(c))
{
Push_Symbol(&Symbol_stack,c);
}
else
{
while (Symbol_stack->c != *(*)
{
pop_c = Pop_Symbol(&Symbol_stack);
double g = Pop_Numerical(&Numerical_stack);
double l = Pop_Numerical(&Numerical_stack);
Push_Numerical(&Numerical_stack,calculate(pop_c,l,g));
if (Symbol_stack == NULL || priority(Symbol_stack->c) < pop_c || Symbol_stack->c == *(*)break;
}
Push_Symbol(&Symbol_stack,c);
}
if (c != *)*)last_number = 0; //除了在读到*)*的情况,读到其他符号,下一次都能尝试读取一个数字
}
}
while (Symbol_stack != NULL) //剩余符号全部弹出栈参与运算
{
double g = Pop_Numerical(&Numerical_stack);
double l = Pop_Numerical(&Numerical_stack);
Push_Numerical(&Numerical_stack,calculate(Pop_Symbol(&Symbol_stack),l,g));
}
printf("%g\n",Pop_Numerical(&Numerical_stack));
goto begin
return 0;
}
642985327
彩虹面包
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
代码贴出来了,吧友说有代码可以帮忙修改。
a327380135
彩虹面包
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
~
goto大法好~,只能windows用大法好~太长不想看
qsqsqsIHSIN
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
好可爱
,顶下!
金小梵
酱油
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
。。。。。。。。。。。。。。。
我是不是师兄
帕秋莉糕
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
第二次输入表达式就崩溃了
"程序会采用崩溃的方式提示你的输入有误"
好萌的程序
几句km
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我用for和if做出了一个只能算加减乘除的玩意而且输入字母就会出现死循环
谁都不好
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我也弄了个计算器不过不支持括号
chikumei
帕秋莉糕
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
逆波兰表达式
閑魚
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
为了爱,失恋是必要的;为了光明,黑暗是必要的。
陌殇_毛毛虫
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
也太长了,不需要这么长的
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示