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/202605-178662.html

(174)

文章推荐

  • 扬州大学广陵学院2023投档线

    网上科普有关“扬州大学广陵学院2023投档线”话题很是火热,小编也是针对扬州大学广陵学院2023投档线寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。2023年扬州大学广陵学院在江苏省(普通类本科批)最低录取分数分别为:物理类464分、历史类492分。广陵学院

    2025年03月20日
    207
  • 推荐一款“炫酷众娱麻将来好牌几率(详细透视开挂教程)

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

    2025年05月14日
    46
  • 实测辅助”欢乐南通长牌怎么装挂开挂”其实确实有挂

    欢乐南通长牌怎么装挂开挂网上科普有关“欢乐南通长牌怎么装挂开挂”话题很是火热,小编也是针对欢乐南通长牌怎么装挂开挂寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,欢乐南通长牌怎么装挂开挂这款游戏可以开挂的,确实是有挂的,通过微信【】很

    2025年05月24日
    46
  • 6秒懂!森林大厅可以开挂吗(其实确实有挂)

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

    2025年06月24日
    24
  • 辅助开挂工具“莫莫娱乐可以安装挂吗开挂(详细透视开挂教程)

    莫莫娱乐可以安装挂吗开挂网上科普有关“莫莫娱乐可以安装挂吗开挂”话题很是火热,小编也是针对莫莫娱乐可以安装挂吗开挂寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,莫莫娱乐可以安装挂吗开挂这款游戏可以开挂的,确实是有挂的,通过微信【】很

    2025年06月30日
    32
  • 辅助教程实测“微乐家乡麻将开挂怎么弄呢”其实确实有挂

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

    2025年07月15日
    24
  • 教程开挂辅助“扣点麻将开挂下什么软件(详细真的有挂)

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

    2025年08月05日
    16
  • 实测分析“微乐安徽麻将怎么上挂(详细透视开挂教程)

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

    2025年08月19日
    12
  • 玩家必搜“乐酷副厅要怎么开挂”(确实有挂)

    乐酷副厅要怎么开挂网上科普有关“乐酷副厅要怎么开挂”话题很是火热,小编也是针对乐酷副厅要怎么开挂寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。  您好,乐酷副厅要怎么开挂这款游戏可以开挂的,确实是有挂的,通过微信【】很多玩家在这款游戏中打牌都

    2025年08月24日
    18
  • 2020的疫情是什么(2020年的疫情是什么时候发生的)

    2020中国疫情时间轴?新冠疫情时间线时间轴简洁版:2019年12月1日:武汉出现首例不明原因肺炎病例。2020年1月23日:武汉封城,实施严格的进出管控措施。2020年2月5日:钻石公主号邮轮在日本横滨港停靠,意大利游客下船后返回意大利,成为全球疫情扩散的重要节点。月19日,高级别专家组上午参加

    2025年11月24日
    24

发表回复

本站作者后才能评论

评论列表(4条)

  • 含雪
    含雪 2026年05月07日

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

  • 含雪
    含雪 2026年05月07日

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

  • 含雪
    含雪 2026年05月07日

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

  • 含雪
    含雪 2026年05月07日

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