#include #define TRUE 1

#define FALSE 0

#define LEN 10//输入数字不得超过10位

#define MAXSIZE 40//数字和运算符总个数不得超过40个

typedef struct

{

char data[MAXSIZE][LEN];//栈区为二维数组

int top;

}seqstack;

seqstack *initseqstack();

void push(seqstack *s, char *x);

char *pop(seqstack *s);

int optr(char *z);

int priority(char *a, char *b);

void process(char arrOne[][LEN], char arrTwo[][LEN]);

double calc(char *a, char *b, char *ch);

void express(char (*arrTwo)[LEN]);

seqstack *s = NULL;//声明全局变量

seqstack *initseqstack()//初始化栈顶指针

{

seqstack *s = (seqstack *) malloc (sizeof(seqstack));

s->top = -1;

return s;

}

void push(seqstack *s, char *x)//入栈

{

if (MAXSIZE-1 == s->top)

{

printf("overflow\n");

exit(0);

}

strcpy(s->data[++s->top], x);

}

char *pop(seqstack *s)//出栈

{

char *y = (char *) malloc (LEN * sizeof(char));

strcpy(y, s->data[s->top--]);

return y;

}

int optr(char *z)//判断是否为运算符,是返回TRUE

{

int i;

char *optr1[6] = {"+", "-", "*", "/", "(", ")"};

for (i=0; i<6; i++)

{

if (0 == strcmp(optr1[i], z))

{

return TRUE;

}

}

return FALSE;

}

int priority(char *a, char *b)//比较优先级

{

int i, j;

char *array[5] = {"(", "+", "-", "*", "/"};//优先级列表,由小到大

for (i=0; i<5; i++)

{

if (0 == strcmp(array[i], a))

{

break;

}

}

for (j=0; j<5; j++)

{

if (0 == strcmp(array[j], b))

{

break;

}

}

switch (i)

{

case 0: i = 0; break;

case 1:

case 2: i = 1; break;

case 3:

case 4: i = 2; break;

}

switch (j)

{

case 0: j = 0; break;

case 1:

case 2: j = 1; break;

case 3:

case 4: j = 2; break;

}

if (i >= j)

{

return TRUE;

}

else

{

return FALSE;

}

}

void process(char (*arrOne)[LEN], char (*arrTwo)[LEN])//将中缀式处理成后缀式(运算符入栈处理)

{

int i, j = 0;

s = initseqstack();//初始化

for (i=0; 0!=strcmp(arrOne[i], "\0"); i++)

{

if (1 < strlen(arrOne[i]) || (TRUE != optr(arrOne[i])))//arrOne[i][LEN]为数字时

{

strcpy(arrTwo[j++], arrOne[i]);//将数字拷贝到arrTwo

}

else if (0 == strcmp(arrOne[i], "("))

{

push(s, arrOne[i]);//入栈

}

else if (0 == strcmp(arrOne[i], ")"))

{

while ((-1 != s->top) && (0 != strcmp(s->data[s->top], "(")))

{

strcpy(arrTwo[j++], pop(s));//出栈

}

pop(s);//将"("弹出

}

else//此时arrOne的内容只可能是"+", "-", "*", "/"

{

if (-1 == s->top)

{

push(s, arrOne[i]);

}

else

{

while (-1 != s->top)

{

if (TRUE == priority(s->data[s->top], arrOne[i]))//与栈顶元素进行优先级比较

{

strcpy(arrTwo[j++], pop(s));

}

else

{

push(s, arrOne[i]);

break;

}

}

if (-1 == s->top)

{

push(s, arrOne[i]);

}

}

}

}

while (-1 != s->top)

{

strcpy(arrTwo[j++], pop(s));

}

}

double calc(char *a, char *b, char *ch)//运算,返回double类型

{

double num;

double numOne, numTwo;

numOne = atof(a);

numTwo = atof(b);//将字符串转化为double类型(atof是库函数)

switch(*ch)

{

case '+': num = numOne + numTwo; break;

case '-': num = numOne - numTwo; break;

case '*': num = numOne * numTwo; break;

case '/':

if ((0.000001 >= numTwo) && (-0.000001 <= numTwo))

{

printf("error!\n");

}

else

{

num = numOne / numTwo;

}

break;

default:

exit(0);

}

return num;

}

void express(char (*arrTwo)[LEN])//后缀式入栈运算

{

int i;

double num;

char result[LEN];

char numOne[LEN], numTwo[LEN];

s = initseqstack();//初始化

for (i=0; 0!=strcmp(arrTwo[i], "\0"); i++)

{

if (TRUE != optr(arrTwo[i]))//假如是数,则入栈

{

push(s, arrTwo[i]);

}

else

{

strcpy(numTwo, pop(s));

strcpy(numOne, pop(s));//将顶上两数字弹出

num = calc(numOne, numTwo, arrTwo[i]);//运算

gcvt(num, LEN, result);//将double转换成字符串(gcvt是库函数)

push(s, result);//入栈

}

}

printf(" %s\n\n", result);//输出最终结果

}

void Menu(void)

{

printf("注意:\n");

printf("1.本程序有一定误差,误差范围大约是-0.001到+0.001\n");

printf("2.本程序只能处理正确的表达形式.\n");

printf("3.避免计算结果越界.\n");

printf("4.输入方式:如输入表达式(-1+2)*3\n");

printf(" 输入:\n");

printf(" (空格-1空格+空格2空格)空格*空格3空格=回车\n");

}

void main(void)

{

int i = 0;

char arr[MAXSIZE][LEN]; //输入字符串

char arrOne[MAXSIZE][LEN] = { "\0" }; //保存中缀式

char arrTwo[MAXSIZE][LEN] = { "\0" }; //保存后缀式

Menu();

printf("\n\n\n请输入表达式:\n");

while (scanf("%s", arr[i]))

{

if (0 == strcmp(arr[i], "="))

{

break;

}

strcpy(arrOne[i], arr[i]);

i++;

}

process(arrOne, arrTwo); //调用

express(arrTwo); //调用

}

10 -3 2用c语言怎么打,(3*20+30-10)/2怎么使用C语言编写相关推荐

  1. c语言中写出int变量x为奇数,求C语言好的同学

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1.(单选题) 执行以下程序段后, x, y和z的值分别是___B___.(5分) int x=10,y=20,z=30; if(x>y) z=x; ...

  2. 数学狂想曲(三)——统计杂谈, PID算法, 20世纪10大算法, 矩阵向量的积

    http://antkillerfarm.github.io/ 统计杂谈 统计模拟 统计模拟是数理统计中非常有用的工具之一, 它是利用计算机产生某概率模型的随机数,再通过这些随机数来模拟真实模型. 这 ...

  3. C语言 | 自由落地,求第10次落地共经过多少米

    例57:一个球从100m高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹.C语言编程求它在第10次落地时,共经过多少米,第10次反弹多高. 解析:读者看着道题的时候应该很容易看懂,做这样的题 ...

  4. C语言编程>第二周 ⑥ 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

    例题:一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 代码如下: /*程序分析:利用for循环语句求解*/ #include& ...

  5. C语言 一个球从100米高度下落,每次下落反弹原来高度的一半,如此反复,求第10次落地时共经历了多少米?第10次反弹多高?

    C语言 一个球从100米高度下落,每次下落反弹原来高度的一半,如此反复,求第10次落地时共经历了多少米?第10次反弹多高? 代码: #include <stdio.h> void main ...

  6. 10万字C语言入门手册,历时三个月,详细的C语言教程终于出炉了,给你全新C语言入门体验

    C语言是一种非常流行的编程语言,它是许多现代编程语言的基础. 什么是计算机? 计算机是一种用于存储.处理.和输出数据的电子设备.它通过程序控制和数学算法来实现数据处理.计算机通过输入设备(如键盘.鼠标 ...

  7. c语言考试编程题万能公式,C语言程序设计历年统考试题集10套含答案(可编辑)

    <C语言程序设计历年统考试题集10套含答案(可编辑)>由会员分享,可在线阅读,更多相关<C语言程序设计历年统考试题集10套含答案(可编辑)(39页珍藏版)>请在人人文库网上搜索 ...

  8. c语言程序中的算数表达式X Y-Z,C语言程序设计实验教程习题1~10.docx

    C语言程序设计实验教程习题1~10 第一章一.选择题1.最早开发C语言是为了编写下面那一种操作系统( C) A .Windows B.DOS C.UNIX D.Linux2.下面哪一项不属于C语言的特 ...

  9. 8b 10b c语言编码,2012年计算机等级二级C语言章节习题及答案(10)

    第10章 指针 同步练习二 一.选择题(在下列各题的A).B).C).D)四个选项中,只有一个选项是正确的,请将正确选项填涂在答题卡相应位置上.)10.1b 下列关于指针变量赋空值的说法错误的是 A) ...

  10. 寻找最大公约数c语言,C语言程序设计100例之(10):最大公约数

    例10        最大公约数 问题描述 有三个正整数a,b,c(0 输入数据 第一行输入一个n,表示有n组测试数据,接下来的n行,每行输入两个正整数a,b. 输出格式 输出对应的c,每组测试数据占 ...

最新文章

  1. Python3使用tkinter编写GUI程序
  2. java基础-泛型举例详解
  3. 1.6解不等式 1.6.1 平方根不等式
  4. 常用知识总结——模板Template
  5. Tomcat BIO . NIO . ARP 配置
  6. R语言-数据整形之简介
  7. python 读取excel表格的数据
  8. android textview 添加阴影效果:Paint.setShadowLayer is not supported
  9. 共阳极管的代码_《手把手教你学FPGA》第三章设计实例
  10. linux下ant安装和使用教程,ant安装与简单应用
  11. SQL编程题练习题(基础)
  12. 精确率、准确率、召回率、ROC、AUC的概念,计算方式和代码实现
  13. EasyOCR,识别图片中的文字真的so easy
  14. 初中数学知识点总结_初中数学知识点
  15. html点击出现对勾,css伪类右下角点击出现对号角标表示选中的代码
  16. Python金融学-风险中性测度
  17. 廊坊通岭计算机学校校长,计算机科学与技术S021-S024班校友荣归母校为母校捐赠文化石...
  18. route和bridge是什么意思_vue-router中router和route的区别
  19. 运营精益创业组织的柔术
  20. 计算机图形学研究背景及意义,虚拟现实技术研究背景目的意义与国内外现状.doc...

热门文章

  1. 教你如何用 Python 三行代码做动图!
  2. 长沙 · 中国1024程序员节盛况空前,500 万程序员线上线下引爆星城
  3. 入行 AI,如何选个脚踏实地的高薪岗位?
  4. 都在说 AI 与云计算融合,AI 在云中的作用真有那么大吗?
  5. 三大运营商将上线 5G 消息;苹果谷歌联手,追踪 30 亿用户;jQuery 3.5.0 发布 | 极客头条...
  6. 软件开发需要学好数学吗?
  7. 腾讯 Angel 升级:加入图算法,支持十亿节点、千亿边规模!
  8. 杭州趣链张帅:趣链拥有大厂都没有的优势
  9. 英特尔“宠坏”程序员!
  10. 漫画:如何给女朋友解释什么是“锟斤拷”?