c语言数组中元素的加减乘除,c语言中,取余运算符和加减乘除的运算顺序??...
2014-11-25 回答
#include
#include
#define n 100
typedef struct{ //操作数栈
float d[n];
int len; //len相当于top
}stacks,*lists;
typedef struct{ //运算符栈
char c[n];
int len; //len相当于top
}stack,*list;
int init(list p); //stack 初始化
int inits(lists p); //stacks 初始化
int pushs(lists p,float m); // stacks 入栈
int push(list p,char c); //stack 入栈
int pops(lists p,float *m); //stacks 出栈
int pop(list p,char *c); //stack 出栈
int in(char c); //判断c是否为数据 是则返回 1 否则 返回 0
char pre(char s,char c); //判断s c的优先级 s>c return '>'; s
float operate(float a,char t,float b); //对a b进行t(+-*/)运算 return a+b or a-b, a*b ,a/b
float value(char s[]); //求表达式s 的值
void main(){
char s[n]; int n; float f;
printf("*******************express evaluate***********************\n");
while(1){
printf("please input a express\n");
scanf("%s",s); //输入表达式
n=strlen(s); //求表达式的长度
printf("express length=%d\n",n); //输出表达式的长度
s[n]='#'; //在表达式尾部插入'#' 注: # 表示操作结束
f=value(s); //计算表达式的长度
printf("f=%.5f\n",f); //输出表达时的值 注 只输出前五位小数
printf("continue input 1,break input 0\n");
scanf("%d",&n); printf("\n"); //判断是否继续进操作 是则输入 1,否则输入 0
if(!n) break; }
}
int init(list p){
if(!p) {printf("error,init stack null\n"); return 0;}
p->len=0;
return 1;
}
int inits(lists p){
if(!p) {printf("error,init stacks null\n"); return 0;}
p->len=0;
return 1;
}
int pushs(lists p,float m){
if(!p) {printf("error,pushs stacks null\n"); return 0;}
p->d[p->len++]=m; return 1;
}
int push(list p,char c){
if(!p) {printf("error,push stack null\n"); return 0;}
p->c[p->len++]=c; return 1;
}
int pops(lists p,float *m){
if(!p) {printf("error,push stacks null\n"); return 0;}
*m=p->d[--p->len]; return 1;
}
int pop(list p,char *c){
if(!p) {printf("error,push stack null\n"); return 0;}
*c=p->c[--p->len]; return 1;
}
int in(char c){ //判断c是否为数据 是则返回 1 否则 返回 0
if(c>='0'&&c<='9'||c=='.') return 1; return 0;}
char pre(char s,char c){ //判断s c的优先级 s>c return '>'; s
char m= '' , r;
if((s=='-')||(s=='+')){
if((c=='*')||(c=='(')||(c=='/'))
r=m;
else r=k; }
if((s=='*')||(s=='/')){
if((c=='(')) r=m;
else r=k; }
if(s=='('){
if(c==')') r=n;
else r=m; }
if(s==')')
r=k;
if(s=='#') {
if(c=='#') r=n;
else r=m; }
return r;
}
float operate(float a,char t,float b){ //对a b进行t(+-*/)运算 return a+b or a-b, a*b ,a/b
if(t=='-') return a-b; if(t=='+') return a+b;
if(t=='*') return a*b; if(t=='/') return a/b; }
float value(char s[]){
stacks opnd; stack optr; char *p,*pr,x,t; float a,b,m=0;
inits(&opnd); init(&optr); int k=0,i,tp=10;
push(&optr,'#'); //将'#'压入栈optr中,作结束标志
p=pr=s; //初始化 指针 p pr 使pr p 指向 表达式
while(*p!='#'||optr.c[optr.len-1]!='#'){//当p指向的操作符 和optr 中的栈顶元素都为'#'时 操作结束
if(in(*p)) //如果p指向数字 则把 数字字符串转化为实型(float)数据 并存入栈opnd中
{
m=0; k=0; tp=10;
while(in(*p)) p++; //使p指向下一个运算符
while(pr!=p)
{
if(*pr!='.') //如果pr指向小数点 则跳过
m=(m+*(pr++)-'0')*10; //将单个字数字符转化为数据 并逐位求和
else{ //如 12.3 -> 1230
k=p-pr; pr++; }
}
for(i=0,tp=10;i
{
tp=tp*10;
if(i==k-1)
tp=tp/10;
}
pushs(&opnd,m/tp); //输入栈opnd中
}
else switch(pre(optr.c[optr.len-1],*p)){
case'
case'=':pop(&optr,&x);p++;pr=p;break;
case'>':pop(&optr,&t); pops(&opnd,&b); pops(&opnd,&a); //输出一个操作符和两个数据
pushs(&opnd,operate(a,t,b));break;} //运算
}
return opnd.d[opnd.len-1]; //返回表达式的值
}
c语言数组中元素的加减乘除,c语言中,取余运算符和加减乘除的运算顺序??...相关推荐
- c语言横坐标加一怎么表示,c语言中‘取反加一’是怎么回事啊?
c语言中'取反加一'是怎么回事啊?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中'取反加一'是怎么回事啊? 计 ...
- c语言数组前const的作用,c语言中const的用法
C语言作为一门新型高级编程语言,在计算机软件编程中具有较为广泛的应用和实现.下面小编就跟你们详细介绍下c语言中const的用法,希望对你们有用. c语言中const的用法如下: const的基本解释 ...
- C语言switch中break的作用,C语言中switch...case语句中break的重要性
在C语言中switch...case语句是经常用到的,下面我介绍一下在使用该语句时候需要注意的一个细节问题.话不多说,直接举例子: 例子1: switch(fruit) { case 1:printf ...
- c语言数组数据的输入,在C语言中,数组中的值如何输入到函数中?
我希望这有帮助: #include /* don't need to specify size of array1 here */ /* rather pass the no. of elements ...
- C语言程序中的精度问题,c语言中float精度问题
3.1415926(10进制) == 11.00100100001111110110100110100010010110110000100101(2进制) == 1.10010010000111111 ...
- C语言数组中找到第一个重复元素的算法(附完整源码)
C语言数组中找到第一个重复元素的算法 C语言数组中找到第一个重复元素的算法完整源码(定义,实现,main函数测试) C语言数组中找到第一个重复元素的算法完整源码(定义,实现,main函数测试) #in ...
- C++与C语言中有关数组中元素排序
C++与C语言中有关数组中元素排序 C语言中 #include<stdio.h> #define n 4 int main(){ int a[n]; int i,j,temp; for ...
- 一维数组元素倒置 c语言,实例12 数组中元素的倒置.pdf
第1 篇 C 语言基础知识 第1 章 走入C 语言的世界 实例12 数组中元素的倒置 [实例描述] 让一维数组中的元素转置,也就是让数组的元素本末倒置,即第 一个元素变成最后一个元素,第二个元素变成倒 ...
- (c语言)编程输出二维数组中元素的最大值,要求用指针实现。
(c语言)编程输出二维数组中元素的最大值,要求用指针实现. #include<stdio.h> #include<stdlib.h> #define N 6 //行数 #def ...
最新文章
- R语言普通最小二乘回归分析
- CodeChef TWOROADS(计算几何+拉格朗日乘数法)
- 搜索引擎平台化的构想
- 基于Spring的Web缓存
- 百度金融资深产品经理降峰:互金产品如何准确触达用户
- VS 配置外部DLL的引用路径【可执行文件的环境路径】
- php mysql生成excel文件,PHP导出MySQL数据到Excel文件简单示例
- zstack 第一个例子
- LoadRunner场景设置里的各参数解释
- 返回一个一维整数数组中最大子数组的和
- C/C++[codeup 1934,1932,1935]查找
- 布谷鸟过滤器java使用_一种基于布谷鸟过滤器的云平台隐私保护方法与流程
- 电脑证书错误即上网站打不开提示证书错误
- SD卡格式化|SD卡数据恢复技巧
- 乌镇互联网大会:大佬们都爱AI
- Windows主机间批量操作的基本配置
- 测试集和训练集8:2切分
- linaro gcc 交叉编译链编译
- html语言设置网页名称,HTML语言范例
- h5页面自适应手机屏幕宽度