/*===============================================*\
** 设计目的:简单计算器,计算形如10*(20.2-30.6)+5.0/2的表达式值
** 简要原理:中缀式转逆波兰式(后缀式)
** IDE:Dev-Cpp 4.9.9.2
** 注意事项:括号必须是英文状态的
** 时间: 2014-6-17
\*===============================================*/ #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxn 1000
char buf[maxn], str[maxn], signStack[maxn], ch[2];
int len, id, idSign, idAns, i, n;
double ans[maxn]; void checkSign(char sign){
if(sign == '(') signStack[idSign++] = sign;
else if(sign == '*' || sign == '/'){
while(idSign && (signStack[idSign-1] == '*' || signStack[idSign-1] == '/'))
str[id++] = signStack[--idSign];
signStack[idSign++] = sign;
}else if(sign == ')'){
while(signStack[idSign-1] != '(') str[id++] = signStack[--idSign];
--idSign;
}else{
while(idSign && signStack[idSign-1] != '(') str[id++] = signStack[--idSign];
signStack[idSign++] = sign;
}
str[id++] = ' ';
} int check(double a, char sign){
if(a == 0 && sign == '/'){
printf("除数不能为0!,程序结束。\n");
system("pause");
exit(EXIT_FAILURE);
}
return 1;
} double cal(double a, double b, char sign){
switch(sign){
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
} int main(){ printf("\t\t\t\t简单计算器\n\n");
printf("\t\t ======================================\n");
printf("\t\t || 支持+ - * / ( ) 等符号和负数输入 ||\n");
printf("\t\t ======================================\n");
printf("\t\t\t\t\t\t原创作者:邱正钢\n");
printf("\t\t\t\t\t\t完毕时间:2014年6月17日\n");
printf("\t\t\t\t\t\tEmail:2276479303@qq.com\n"); printf("请输入一个表达式,如 -10*(20.2-30.6)+5.0/2\n以回车结束:\n");
do{
gets(buf); id = idSign = idAns = 0;
if((len = strlen(buf)) == 0) continue; int flag = 0; //这个是用来推断'-'字符是负号还是减号的。1表示数字,0表示 +*/(
/*推断原理:假设第一次读取就碰到-,那么一定是负号,若近期一次读取是+*-/(那么
也一定是负号,假设是右括号或数字那么是减号*/ for(i = 0; i < len; ++i){
if(buf[i] == ' ') continue;
if(buf[i] >= '0' && buf[i] <= '9' || buf[i] == '.' || buf[i] == '-' && !flag){
str[id++] = buf[i]; flag = 1;
}
else {
str[id++] = ' '; checkSign(buf[i]);
if(buf[i] != ')') flag = 0;
else flag = 1;
}
}
while(idSign) str[id++] = signStack[--idSign]; for(i = 0, n = 0; i < id; ++i){
if(str[i] == ' ') continue;
/*用添加空格的方式推断‘-’字符是负号还是减号,若‘-’后面挨着数字或小数点,那么一定是负号*/
if(str[i] >= '0' && str[i] <= '9' || str[i] == '.' || str[i] == '-'
&& (str[i+1] >= '0' && str[i+1] <= '9' || str[i+1] == '.')){
sscanf(str + i, "%lf%n", &ans[idAns++], &n);
i += n - 1; continue;
}else if(check(ans[idAns-1], str[i])){
ans[idAns-2] = cal(ans[idAns-2], ans[idAns-1], str[i]);
--idAns;
}
}
printf("结果是 %.2lf\n", ans[0]);
printf("输入Y 继续, N 退出: ");
scanf("%s", ch);
}while(ch[0] == 'Y' || ch[0] == 'y');
printf("感谢您的使用!再见\n");
system("pause");
return 0;
}

大一C语言结课设计之《简单计算器》的更多相关文章

  1. 大一C语言结课设计之《学生信息管理系统》

    第一次写这么长的程序,代码仅供參考,有问题请留言. /* ** 学生信息管理系统 ** IDE:Dev-Cpp 4.9.9.2 ** 2014-6-15 */ #include <stdio.h ...

  2. 这是C语言结课前(期末考试之前)写给牛晓霞的一封信!

    致尊敬的牛晓霞老师: 这是黄领衫的感想,也是想告诉你的话! 在老师说要给班里写得好的人发黄领衫的时候,我当时的想法是我很有可能拿到这份奖品的,怎么说呢,算是一种自信吧,或是对自己的态度的认可.虽然我能 ...

  3. 留念 C语言第一课简单的计算器制作

    留念 C语言第一课简单的计算器制作 学C语言这么久了.  /* 留念 C语言第一课简单的计算器制作 */   #include<stdio.h>  #include<stdlib.h ...

  4. 简单的C语言小学四则运算设计

    题目:设计一个简单的四则运算编辑器 思路:我使用的是C语言编程,看到题目首先要随机出3个随机数,其中两个为100以内的随机数(a,b),一个为0~3的随机数(k). k值的变化使得+ - * /的变化 ...

  5. 简单计算器 (c语言课程设计)

    可以实现简单的加减乘除四则运算 #include<stdio.h> #include<string.h> #define MAX 10100 int main() { int ...

  6. OO结课了,狂喜

    OO结课了,狂喜 哈哈哈哈哈 哈哈哈 哈哈 哈 第十三次作业 UML类图 简要分析: 本次作业是对UML类图进行解析,给到的接口里面已经有了很多类了,但是自带的类肯定是没有反应这些类的结构的.所以就自 ...

  7. OO Unit4总结 & 结课总结

    OO Unit4总结 & 结课总结 OO课Unit4 UML解析应用技术回顾 BUAA.1823.邓新宇 2020/6/19 总结本单元三次作业的架构设计 本单元的架构设计主要是两方面. 一方 ...

  8. C语言程序设计课程设计自查表格

    课程设计自查表格 序号 项目 完成与否(完成打勾) 1 格式是否符合标准(缩进是否规范) 2 是否模块化设计(使用函数分解系统功能) 3 函数名否易懂(不得使用f1(int a1,int a2)这样的 ...

  9. ShoneSharp语言(S#)的设计和使用介绍系列(1)— 开篇

    ShoneSharp语言(S#)的设计和使用介绍 系列(1)- 开篇 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. 一 ...

随机推荐

  1. 优秀的 Android Studio 插件

    转自:http://www.codeceo.com/article/8-android-studio-plugins.html Android Studio是目前Google官方设计的用于原生Andr ...

  2. jQuery数据缓存data(name, value)详解及实现

    一. jQuery数据缓存的作用 jQuery数据缓存的作用在中文API中是这样描述的:“用于在一个元素上存取数据而避免了循环引用的风险”.如何理解这句话呢,看看我下面的举例,不知道合不合适,如果你有 ...

  3. python 学习之Windows 下的编码处理!

    问题1: Non-ASCII character '\xe9' in file 问题原因:程序编码上出现问题 解决方法:在程序头部加上代码 #-*- coding: UTF-8 -*- 设置代码编码为 ...

  4. 【转】从框架看PHP的五种境界及各自的薪资待遇

    无意中看到这篇文章,有些触动,作为博客开篇,用来激励自己. 原文地址:点击打开 在撰写此文前首先必须申明的是本人不鄙视任何一种框架,也无意于挑起PHP框架间的战争,更没有贬低某个框架使用者的用意,本文 ...

  5. latex如何把目录页的页码去掉?

    页眉的显示与关闭,清空,还有样式之间的切换,需要用到如下几个命令: \pagestyle  用于设置当前页以及后续页面的页眉显示情况(可称为页版式).中间页版式可由\thispagestyle命令来指 ...

  6. MySQL的InnoDB和MyISAM比较

    InnoDB 1)虽然不支持用户创建聚族索引,但InnoDB会对主键建立聚簇索引.如果你不指定主键,InnoDB会用一个具有唯一且非空值的索引来代替.如果不存在这样的索引,InnoDB会定义一个隐藏的 ...

  7. SMT实用工艺

    第一章 SMT概述 SMT(表面组装技术)是新一代电子组装技术.经过20世纪80年代和90年代的迅速发展,已进入成熟期.SMT已经成为一个涉及面广,内容丰富,跨多学科的综合性高新技术.最新几年,SMT ...

  8. 老生常谈--Js继承小结

    一直以来,对Js的继承有所认识,但是认识不全面,没什么深刻印象.于是,经常性的浪费很多时间重新看博文学习继承,今天工作不是特别忙,有幸看到了http://www.slideshare.net/stoy ...

  9. mysql 的卸载、再安装与常用命令

    1.卸载mysql.完全删除: 删除 mysqlsudo apt-get autoremove --purge mysql-server-5.0sudo apt-get remove mysql-se ...

  10. xcode initWithCoder\awakeFromNib\layoutSubviews

    控件通过xib,storyboard创建,初始化设置一定会调用initWithCoder awakeFromNib 加载完毕的时候肯定会调用 layoutSubviews 布局子控件 位置和尺寸 利用 ...