用简单的C语言实现带括号的四则运算

作者&投稿:莫炒 (若有异议请与网页底部的电邮联系)
如何用简单的C语言实现带有括号的四则运算~


考虑复杂的表达式,不可能简单吧。
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

void SplitK(char *str);
void SplitPrem(char *str);
void Combine(float f1,char Operate,float f2);
void StringBracket(char *str);

char str1[100],str2[100],str3[100],sub_str1[100],sub_str2[100],sub_str3[20];
char sub_str31[20],sub_str32[20],str_4[100],operate;
int pause=0,left=0,k1,k2,k3;
float f1=0.0,f2=0.0, f=0.0;

void main()
{
float temp;

printf("Please input a description :
");
scanf("%s",&str1);

SplitK(str1);

temp=atof(str1);
printf("description value is %.2f
",temp);

}

void SplitK(char *str)
{
int i,j,k,l,jk;

left=0;
while(*str) {
if(*str == '(') left++;
str++;
}
str2[0]='\0';
str3[0]='\0';
if(left>0)
{
StringBracket(str1);
j=strlen(str1);
for( i=0; i<j; i++)
{
if(str1[i]== '(')
{
jk=0;
for( k=i; k<j; k++)
{
if(str1[k]== ')') break;
for( l=i+1; l<k-1; l++)
{
if(str1[l]== '(')
}
}
if(jk==0)
{
for(l=0; l<i; l++) str2[l]=str1[l];
str2[i]='\0';
for(l=k+1; l<j; l++) str3[l-k-1]=str1[l];
str3[j-k-1]='\0';
for(l=i+1; l<=k-1; l++) str1[l-i-1]=str1[l];
str1[k-i-1]='\0';
break;
}
}
}
}
SplitPrem(str1);
}

void SplitPrem(char *str)
{
int i,j,k,l;

f1=0.0;
f2=0.0;
pause=0;
strcpy(str1,str);
StringBracket(str1);
j=strlen(str1);

for( i=1; i<j-1; i++)
{
if((str1[i]=='*'||str1[i]=='/'))
{
strcpy(sub_str1," ");
strcpy(sub_str2," ");
strcpy(sub_str3," ");
strcpy(sub_str31," ");
strcpy(sub_str32," ");
operate=str1[i];
for( k1=i-2; k1>=0; k1--)
{
if((str1[k1]=='*'||str1[k1]=='/'||str1[k1]=='+'||str1[k1]=='-'))
{
for( l=0; l<=k1; l++) sub_str1[l]=str1[l];
sub_str1[k1+1]='\0';
break;
}
}
for( k2=i+2; k2<j; k2++)
{
if((str1[k2]=='*'||str1[k2]=='/'||str1[k2]=='+'||str1[k2]=='-'))
{
for(l=k2; l<j; l++) sub_str2[l-k2]=str1[l];
sub_str2[j-k2]='\0';
break;
}
}
if(k1<0) k1=-1;
for(l=k1+1; l<i; l++) sub_str31[l-k1-1]=str1[l];
sub_str31[i-k1-1]='\0';
if(k2>j) k2=j;
for(l=i+1; l<k2; l++) sub_str32[l-i-1]=str1[l];
sub_str32[k2-i-1]='\0';
f1=atof(sub_str31);
f2=atof(sub_str32);
Combine(f1,operate,f2);
}
if(pause==1) break;
}

j=strlen(str1);
for( i=1; i<j-1; i++)
{
if((str1[i]=='+'||str1[i]=='-'))
{
strcpy(sub_str1," ");
strcpy(sub_str2," ");
strcpy(sub_str3," ");
strcpy(sub_str31," ");
strcpy(sub_str32," ");
operate=str1[i];
sub_str1[0]='\0';
k3=0;
for( k2=i+2; k2<j-1; k2++)
{
if((str1[k2]=='+'||str1[k2]=='-'))
{
k3=1;
for(l=k2; l<j; l++) sub_str2[l-k2]=str1[l];
sub_str2[j-k2]='\0';
break;
}
}
for(l=0; l<i; l++) sub_str31[l]=str1[l];
sub_str31[i]='\0';
if(k2>j) k2=j;
if( k3==0) k2=j;
for(l=i+1; l<k2; l++) sub_str32[l-i-1]=str1[l];
sub_str32[k2-i-1]='\0';
f1=atof(sub_str31);
f2=atof(sub_str32);
Combine(f1,operate,f2);
}
if(pause==1) break;
}
strcpy(str_4,str2);
strcat(str_4,str1);
strcat(str_4,str3);
strcpy(str1,str_4);
StringBracket(str1);
j=strlen(str1);
str2[0]='\0';
str3[0]='\0';
for( i=0; i<j; i++)
{
if((str1[i]=='('))
{
SplitK(str1);
break;
}
}

for( i=0; i<j-1; i++)
{
if((str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-'))
{
k=1;
if(str1[0]=='-')
{
k=0;
for( l=1; l<j-1; l++)
{
if((str1[l]=='*'||str1[l]=='/'||str1[l]=='+'||str1[l]=='-'))
{
k=1;
break;
}
}
}
if(k==0) break;
if(k==1)
{
SplitPrem(str1);
break;
}
}
}
}

void Combine(float f1,char Operate,float f2)
{
int i,j,k,l;

f=0.0;
switch (Operate) {
case '+':
f=f1+f2;
break;
case '-':
f=f1-f2;
break;
case '*':
f=f1*f2;
break;
case '/':
if(f2!=0)
f=f1/f2;
break;
}
sprintf(sub_str3,"%5.3f",f);
strcpy(str1,sub_str1);
strcat(str1,sub_str3);
strcat(str1,sub_str2);
StringBracket(str1);
j=strlen(str1);
for( i=0; i<j-1; i++)
{
if((str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-'))
{
k=1;
if(str1[0]=='-')
{
k=0;
for( l=1; l<j-1; l++)
{
if((str1[l]=='*'||str1[l]=='/'||str1[l]=='+'||str1[l]=='-'))
{
k=1;
break;
}
}
}
if(k==0) break;
if(k==1)
{
SplitPrem(str1);
break;
}
}
}
pause=1;
strcpy(str_4,str2);
strcat(str_4,str1);
strcat(str_4,str3);
strcpy(str1,str_4);
str2[0]='\0';
str3[0]='\0';
StringBracket(str1);
j=strlen(str1);
for( i=0; i<j; i++)
{
if((str1[i]=='('))
{
SplitK(str1);
break;
}
}
}

void StringBracket(char *str)
{
int i,j,len;

len=strlen(str);
j=0;
for(i=0; i<len; i++)
{
if(str[i]!=' ')
{
str[j]=str[i];
j=j+1;
}
}
str[j]='\0';

if(j>0 && str[j-1]=='.')
{
str[j-1]='\0';
j=j-1;
}
}

#include /*库文件包含*/
#include /*用于字符串操作*/
#include /*用于exit函数*/

/**************************************************************************
int check(char *c)
输入参数:
char *c: 输入的字符串
返回参数:
0:字符串中有不符合规定的字符
1: 字符串字符符合规定,没有不符合规定的字符.
功能:
检查字符串中有否除了 0-9, +,-,*,/,(,),之外的其他字符,
如果有,则返回0, 表示出现错误。
若没有,则返回1,表式字符串符合规定。
**************************************************************************/
int check(char *c)
{
int k=0;
while(*c!='\0')
{
if((*c>='0' && *c<='9') || *c=='+' ||
*c=='-' || *c=='*' || *c=='/' ||
*c=='.' || *c=='(' || *c==')' )
{

只是吐槽,不负法律责任。
对于四则运算的处理应该属于 AST算法 的一个分支,如果不构建词法分析树的话,就难以对给定串(不一定是简单的四则运算)进行优先级处理。
然而居然能够说出“不用堆栈”之类的话,看样子楼主是基本不会什么数据结构了,即使这样,还奢望能够写出四则运算处理。。
然而语言略微有些偏激了。
简而言之,处理四则运算,考虑优先级规则最简单的方法是堆栈(不考虑优先级的话从左到右扫一遍也是可以的),如果要复杂的方法也行,只是连堆栈都不想用的人,估计理解不了那些复杂方法。
最后一提,如果可以使用数据结构(如栈啊,队列啊)的话,追问可以得到源代码,否则请勿回复,并建议主动关闭问题。


用C语言编程实现一个简单的学生成绩管理系统
include <stdio.h>#include <stdlib.h>#include <string.h>#include<memory.h>typedef struct student{char num[16];char name[20];float score[4];struct student *next;} stu;stu *head; \/\/ 链头指针stu* create()\/\/ 创建链表,从文件读取信息 { printf("Reading student information...

用C语言编程实现一个简单的学生成绩管理系统
void count_passnumber(Student *S){ Student *p=S; int e_p_number=0,m_p_number=0,c_p_number=0,num=0; while(num<=Operate1) { if(p->English_score>=60) e_p_number++; if(p->math_score>=60) m_p_number++; if(p->chinese_score>=60) c_p_number++; ...

求1000以内的同构数,用最简单的c语言
以下是 C 语言实现求解 1000 以内的同构数的程序:```c include <stdio.h> \/\/ 判断两个数是否为同构数 int isIsomorphic(int a, int b) { int a_digits[10] = {0}; \/\/ 存储数字 a 中各个位上出现的次数 int b_digits[10] = {0}; \/\/ 存储数字 b 中各个位上出现的次数 while (...

简单C语言编程,求解答
3.编程实现,输入一个字符,输出该字符的ASCII码。include "stdio.h"main(){ char n;printf("请输入一个字符:");scanf("%c",&n);printf("\\n%c的ASCII值为:%d",n,n);getch();} 4.编写程序,实现将输入的华氏温度值转换成摄氏温度值,输出结果精度为0.1,(转换公式利用百度等工具在...

用c语言实现:s=1+12+123+……+123456789
如果只是简单的计算他们的和与差,这样就可以了:int s=1-12+123-1234+12345;如果是要按一定规律的计算,比如计算10以下的 int s = 0;int nsymbol= -1;int ntmp = 0;for(int i = 1;i<=10;i++){ ntmp = 10 ntmp;ntmp += i;nsymbol = -1;s += nsymbol ntmp;} 朋友,请...

用C语言做一个计算器,能实现加减乘除混合运算
用C语言编写一个简单的可以进行加减乘除运算混合运算的计算器的方法:1、打开visual C++ 6.0-文件-新建-文件-C++ Source File;2、输入预处理命令和主函数:include<stdio.h> \/*函数头:输入输出头文件*\/ void main()\/*空类型:主函数*\/ 3、定义变量:int a,b,d; \/*定义变量的数据类型为...

c语言代码输出为0.000000
三、实现代码示例 下面是一个简单的C语言代码示例,演示如何实现输出结果为0.000000:c include int main { double num = 0.0; \/\/ 定义一个双精度浮点数并初始化为0 printf; \/\/ 使用格式化输出,保留六位小数位 return 0; \/\/ 程序正常结束 } 在这段代码中,我们首先定义了一个双精度浮点数...

编程实现:计算c语言期末成绩,平时成绩占比30%,期末成绩占比70%,成绩...
在C语言中,我们可以通过以下步骤来实现这个计算过程:定义变量来存储平时成绩和期末成绩。根据平时成绩和期末成绩的占比,计算最终成绩。判断最终成绩是否及格。以下是一个简单的C语言程序示例:c复制代码 include <stdio.h> int main() { float usualScore, finalScore, totalScore;\/\/ 获取平时成绩和...

用C语言和数据结构编写一个简单的程序(求源代码)
\/*使用递归,理论上说可以对任意多位数组合,但位数太多了,可能发生堆栈溢出.以下程序在VC++6.0中编译通过.\/ include <stdio.h> include <string.h> define MAX_NUMBER 6 \/\/修改这个参数来允许最大的位数,现设为6位 void GetZhe (const char * preStr,const char * strNum){ char newPre...

简单C语言程序
printf("%c",ch2);printf("\\n");} return 0;} 5. 编程输出所有三位数中的素数。include int main(void){ int x,i;for(x=100;x<=999;x++){ for(i=2;i<x\/2;i++)if(x%i==0)break;if(i==x\/2)printf("%d ",x);} return 0;} 6. 定义一个函数even(),判断一个整数是否...

黎城县19828699885: 用简单的C语言实现带括号的四则运算 -
帛以迪非: #include<stdio.h> /*库文件包含*/ #include<string.h> /*用于字符串操作*/ #include<stdlib.h> /*用于exit函数*/ /************************************************************************** int check(char *c) 输入参数: char *c: 输入的字符串 返回参数: 0:字符...

黎城县19828699885: 如何用简单的C语言实现带有括号的四则运算 -
帛以迪非: 考虑复杂的表达式,不可能简单吧.#include <stdlib.h>#include <math.h>#include <conio.h>#include <stdio.h>#include <string.h> void SplitK(char *str); void SplitPrem(char *str); void Combine(float f1,char Operate,float f2); void StringBracket(char ...

黎城县19828699885: 求达人用C语言编写一个带括号的四则运算 -
帛以迪非: #include char* next; double opd[1000]; int opt; double *popd = opd;#define PUSH(n) { *popd++ = n; }#define POP() (*--popd)#define TOP() (*(popd-1))#define EMPTY() (popd == opd)#define SIZE() (popd - opd) void fail(char* s) { printf("match '%s'...

黎城县19828699885: 用C语言编写带括号的四则运算 -
帛以迪非: #include <stdio.h> #include "windows.h" main() { char Exp[1024]={0},Oper[100]={0}; int Num[200]={0},Expi=0,Operi=0,Numi=0; boolean isnum=FALSE; printf("input a Expression:"); scanf("%s",Exp); while(Exp[Expi]!='\0') { switch(Exp[Expi]) ...

黎城县19828699885: C语言程序设计:实现带有括号的四则运算 -
帛以迪非: 呵呵.不知道你是否过关了.我是才看到.我写了个c++版本的.stack_h文件 #ifndef STACK_H#define STACK_H#define STACK_INIT_SIZE 100#include<iostream> using namespace std; template <class type> class stack { public: stack(int = ...

黎城县19828699885: 怎么使用C语言做一个带括号的四则运算的计算器(求大神把C语言编码出 -
帛以迪非: 学过堆栈 不? 自己编写一个栈(先进后出规则),存放表达式,然后取出来判断计算. 对了还要判断优先级,

黎城县19828699885: c语言四则运算带括号且不使用指针 -
帛以迪非: #include float sss(float d[],char e[],int I) {int i,n; for(i=0;i{if(e[i]==0) {printf("The answer is:-->: %f\n",d[i]);i=I;} else {if(e[i]-e[i+1]>-5) {switch(e[i]) {case 80: d[i+1]=d[i]+d[i+1];break; case 81: d[i+1]=d[i]-d[i+1];break; case 90: d[i+1]=d[i]*d[i+1];break; case ...

黎城县19828699885: C语言:从0到9中任选四个数利用四则运算、及括号得到24.输出一种可能即可. -
帛以迪非: 给你个参考程序: 这个程序实现的是输入4 个数,如果这个四个数可以用四则运算、及括号得到24,那么输出这种运算. 如 输入 5 5 1 5 输出 5*(5-(1/5))#include int flag; double count(double a,double b,int op) {if(op==0)return a+b;...

黎城县19828699885: 输入一个带有括号的四则运算表达式,编程计算其结果. 例如:输入:123+213 - 67*34+345/23*45*(34+34 - 345+245+567) 程序计算得出结果为:359183 如何用c语言编写 ?希望能简单有详细的解释,本人水平不高. -
帛以迪非: #include "iostream.h" #define TRUE 1 #define FALSE 0 #define ERROR -1 typedef int Status; //用模板实现的链式结构堆栈类 template <class T> class stack{private:struct link{T data; //结点数据域link *next; //下一结点指针link(T Data,...

黎城县19828699885: 如何使用c语言实现四则运算,详细思路很重要啊(越详细越好~),可以木有代码(急) -
帛以迪非: 展开全部1.判断四则运算字符串的括号是否匹配,可以用以个栈来计算,开始栈是空,从头遍历所有字符,找到'(',压栈,找到')'弹出一个元素,遍历完成以后如果栈是空表示正常,非空,或则中间出现问题都表示括号不正常.2.分解四则运...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网