C语言怎么实现四则运算

网上科普有关“C语言怎么实现四则运算”话题很是火热,小编也是针对C语言怎么实现四则运算寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。我...

网上科普有关“C语言怎么实现四则运算”话题很是火热,小编也是针对C语言怎么实现四则运算寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

我曾用c编了个计算器,支持四则运算,支持括号改变优先级,你看看吧:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <conio.h>

#define Esc 27

#define Tab 9

void needle(char* s,char* carriage,int start)//needle意为“用针缝”

{

int size_carriage=(int)strlen(carriage);

int i,j;

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

{

for(i=(int)strlen(s);i>=start;i--)

s[i+1]=s[i];

s[i+1]=carriage[j];

start=i+2;

}

}

double factorial(double d)//factorial意为“阶乘”

{

return d==0?1:d*factorial(d-1);

}

void handle(char* carriage)//handle意为“处理”

{

void find_start(char*,int*);

char* save1,*save2,ch;

char op[111];

double d1,d2;

int start,i;

find_start(carriage,&start);

ch=carriage[start];

d1=strtod(carriage,&save1);//strtod是库函数,功能是将字符串carriage中出现的第一个浮点数转化为double,并将剩余字符储存在save1中

if(ch=='!')

{

sprintf(op,"%g",factorial(d1));//springf是库函数,功能是将显示在屏幕上的内容储存在op中

strcpy(carriage,op);

return;

}

for(i=0;i<(int)strlen(save1);i++)//对于第一个不是'+'或'-'或数字的字符串,strtod无法作用。所以得去掉诸如"*22"字符串中的'*'

save1[i]=save1[i+1];

d2=strtod(save1,&save2);

switch(ch)

{

case '*':sprintf(op,"%.32g",d1*d2);break;

case '/':sprintf(op,"%.32g",d1/d2);break;

case '+':sprintf(op,"%.16g",d1+d2);break;

case '-':sprintf(op,"%.16g",d1-d2);

}

strcpy(carriage,op);

}

void del(char* s,int start,int end)//delete意为“删除”

{

int i,j;

int size=(int)strlen(s);

for(i=end;i>=start;i--)

for(j=i;j<size;j++)

s[j]=s[j+1];

}

void copy(char* s,char* carriage,int start,int end)//copy意为“复制”

{

int i;

for(i=0;start<=end;i++,start++)

carriage[i]=s[start];

carriage[i]='\0';

}

void scissor(char* s,char* carriage,int* start)//scissor意为“用剪刀剪”

{

int sta,end;

for(sta=*start-1;(s[sta]>='0'&&s[sta]<='9')||s[sta]=='.';sta--);

if(sta!=0||s[*start]=='!') //处理式子是-2+3或-2!的特殊情况

sta++;

if(s[*start]=='!')//'!'是单目运算符

end=*start;

else

{

for(end=*start+1;(s[end]>='0'&&s[end]<='9')||s[end]=='.';end++);

if((s[end-1]=='*'||s[end-1]=='/')&&(s[end]=='+'||s[end]=='-'))//处理式子是2*-2等的特殊情况

for(end++;(s[end]>='0'&&s[end]<='9')||s[end]=='.';end++);

end--;

}

copy(s,carriage,sta,end);

del(s,sta,end);

*start=sta;//记住等下针线函数needle要开始缝的地方

}

void find_start(char* s,int* start)//find_start意为“找到操作符号开始处”

{

int i;

int size=(int)strlen(s);

//由优先级决定从上而下的顺序

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

if(s[i]=='!')

{

*start=i;

return;

}

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

if(s[i]=='*'||s[i]=='/')

{

*start=i;

return;

}

if(s[0]=='+'||s[0]=='-')

{

for(*start=1;(s[*start]>='0'&&s[*start]<='9')||s[*start]=='.';(*start)++);

return;

}

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

if(s[i]=='+'||s[i]=='-')

{

*start=i;

return;

}

}

int judge(char* s)//judge意为“判断”

{

int i;

int size=(int)strlen(s);

for(i=1;i<size;i++)

if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='!')

return 1;

return 0;

}

void count(char* s)//count意为“计算”

{

int start,i;

char carriage[555];//carriage意为“运载体”

while(judge(s))//判断式子是否还需要进行运算

{

for(i=0;i<(int)strlen(s);i++)//此循环作用是将式子中出现的'--'替换为'+'

{

for(;s[i]!='-' && i<(int)strlen(s);i++);//循环结束

if(s[i+1]=='-')

{

del(s,i,i+1);

needle(s,"+",i);

}

}

find_start(s,&start);//让下标start指向式子应该最先开始处理的运算符

scissor(s,carriage,&start);//用剪刀scissor将start指向的运算符及相对应的操作数剪下并储存在运载体carriage上

handle(carriage);//处理该运载体,并将运载体上运载的式子的计算结果储存在运载体上

needle(s,carriage,start);//见函数simplify中的说明

}

}

void simplify(char* s)//simplify意为“简化”,即将括号去除

{

char carriage[555];//carriage意为“运载体”

int start,end,i;

int size=(int)strlen(s);

while(1)

{

for(i=0;s[i] != '(' && i<size;i++);//注意这里末尾是分号

if(i==size)

break;//说明式子已不含括号,简化完成

for(end=0;s[end] != ')';end++);//使end下标指向式子中第一个出现')'的地方

end--;

for(start=end;s[start] != '(';start--);//寻找与上面一个')'配对的'('

start++;

copy(s,carriage,start,end);//将括号里的内容复制给运载体carriage

del(s,start-1,end+1);//删除整个括号及其里面的内容

count(carriage);//计算运载体运载的表达式,运算结果储存在运载体上

needle(s,carriage,start-1);//将运载体运载过来的结果用针线needle缝在刚才删除式子s括号及其内容的地方

}

}

int main()

{

int i=0;

char s[555],ch;

puts(" 本程序不对用户输入数据进行检测:");

puts(" 即用户应输入规范的计算式,包括分母不能为0:");

puts(" 式子不能含有空格及其他非计算字符;");

puts(" 按任意一个键开始,按回车键显示运算结果;");

while(1)

{

i++;

ch=getch();

if(Esc==ch)

break;

if(Tab==ch)

{

system("cls");//清除当前屏幕

puts("显示运算结果后:按“Esc”键退出,按“Tab”键清除当前屏幕");

}

if(i==1)

{

system("cls");

puts("显示运算结果后:按“Esc”键退出,按“Tab”键清除当前屏幕");

}

puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

gets(s);

simplify(s);

count(s);

puts(s);

//实验数据:23.243*(5!-23.123/.133+(2!-13/13.23)*(2!-.235)-((4!-20)!/2!)-32*(3!+2.23/(2*3)!))

//其正确结果是:-5953.9401265774754346182917611489

}

puts("谢谢使用!\n有问题可加q问我:281754179");

getch();

return 0;

}

我记得学了数据结构后我又重新用栈写了个,容错能力会更好,上面的代码可以改进很多,也只是给你一个思路罢了

关于“C语言怎么实现四则运算”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

本文来自作者[含雪]投稿,不代表小熊号立场,如若转载,请注明出处:https://xx-scm.com/cshi/202606-178662.html

(187)

文章推荐

  • 必看教程“微乐麻将外卦神器下载还有几种”实测确实有挂

    必看教程“微乐麻将外卦神器下载还有几种网上科普有关“必看教程“微乐麻将外卦神器下载还有几种”话题很是火热,小编也是针对必看教程“微乐麻将外卦神器下载还有几种寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,必看教程“微乐麻将外卦神器下载

    2025年03月15日
    62
  • 必备科技“聚玩麻将可以透明吗”实测确实有挂

    网上科普有关“聚玩麻将可以透明吗”话题很是火热,小编也是针对同城衡阳字牌作弊开挂的方法寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,聚玩麻将可以透明吗这款游戏可以开挂的,确实是有挂的,通过微信【游戏】很多玩家在这款游戏中打牌都会发现很多

    2025年04月23日
    86
  • 三分钟普及“手机微乐贵阳捉鸡麻将开挂神器下载(真的有挂)

    手机微乐贵阳捉鸡麻将开挂神器下载网上科普有关“手机微乐贵阳捉鸡麻将开挂神器下载”话题很是火热,小编也是针对手机微乐贵阳捉鸡麻将开挂神器下载寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,手机微乐贵阳捉鸡麻将开挂神器下载这款游戏可以开挂

    2025年04月25日
    69
  • 6秒懂!闲时互娱拼三张有挂太坑了(开挂神器怎么用)

    网上科普有关“闲时互娱拼三张有挂太坑了”话题很是火热,小编也是针对同城衡阳字牌作弊开挂的方法寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,闲时互娱拼三张有挂太坑了这款游戏可以开挂的,确实是有挂的,通过微信【游戏】很多玩家在这款游戏中打牌

    2025年06月27日
    52
  • 辅助教程实测“人人烟台麻将看牌器”实测确实有挂

    网上科普有关“人人烟台麻将看牌器”话题很是火热,小编也是针对同城衡阳字牌作弊开挂的方法寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,人人烟台麻将看牌器这款游戏可以开挂的,确实是有挂的,通过微信【游戏】很多玩家在这款游戏中打牌都会发现很多

    2025年07月12日
    33
  • 辅助教程实测“广东麻将为什么老是输(万能开挂器通用版)

    网上科普有关“广东麻将为什么老是输”话题很是火热,小编也是针对同城衡阳字牌作弊开挂的方法寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,广东麻将为什么老是输这款游戏可以开挂的,确实是有挂的,通过微信【游戏】很多玩家在这款游戏中打牌都会发现

    2025年07月15日
    33
  • 辅助教程实测“街坊麻将怎么开挂”果然有挂

    网上科普有关“街坊麻将怎么开挂”话题很是火热,小编也是针对同城衡阳字牌作弊开挂的方法寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,街坊麻将怎么开挂这款游戏可以开挂的,确实是有挂的,通过微信【游戏】很多玩家在这款游戏中打牌都会发现很多用户

    2025年07月19日
    21
  • 开挂工具“三宝北京麻将怎样提高胜率(真的有挂)

    网上科普有关“三宝北京麻将怎样提高胜率”话题很是火热,小编也是针对同城衡阳字牌作弊开挂的方法寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,三宝北京麻将怎样提高胜率这款游戏可以开挂的,确实是有挂的,通过微信【游戏】很多玩家在这款游戏中打牌

    2025年08月28日
    28
  • 赤峰疫情封城了吗最新消息(赤峰封城通知)

    2021年赤峰疫情封控时间1、年1月9日。根据赤峰政府官网资料显示,赤峰封城通知为2021年1月9日起,赤峰市各乡镇、苏木、街道、社区要加强流入人员管控,对入境及中高风险地区抵返人员实行登记管理。疫情封控区域是指将阳性个案的密切接触者,及共同暴露高风险人群的居住点、工作点、活动点及周边区域划为封控

    2025年09月10日
    34
  • 2020年疫情是什么时候结束的呢(2020年疫情啥时候结束?)

    中国新冠疫情开始和结束时间1、年12月31日,新型冠状病毒肺炎(COVID-19)疫情开始在中国武汉市爆发。2020年1月20日,中国国家卫生健康委员会发布1号通告,将新型冠状病毒感染的肺炎纳入乙类传染病管理,并采取甲类管理措施,同时将其纳入检疫传染病管理。2、中国新冠疫情开始时间为2019年12

    2025年09月23日
    24

发表回复

本站作者后才能评论

评论列表(4条)

  • 含雪
    含雪 2026年06月29日

    我是小熊号的签约作者“含雪”!

  • 含雪
    含雪 2026年06月29日

    希望本篇文章《C语言怎么实现四则运算》能对你有所帮助!

  • 含雪
    含雪 2026年06月29日

    本站[小熊号]内容主要涵盖:国足,欧洲杯,世界杯,篮球,欧冠,亚冠,英超,足球,综合体育

  • 含雪
    含雪 2026年06月29日

    本文概览:网上科普有关“C语言怎么实现四则运算”话题很是火热,小编也是针对C语言怎么实现四则运算寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。我...