/*===============================================*\
** 设计目的:简单计算器,计算形如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. leetcode Longest Palindromic Substring python

    class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str ...

  2. web编程速度大比拼(nodejs go python)(非专业对比)

    C10K问题的解决,涌现出一大批新框架,或者新语言,那么问题来了:到底谁最快呢?非专业程序猿来个非专业对比. 比较程序:输出Hello World! 测试程序:siege –c 100 –r 100 ...

  3. Eclipse中搭建Python开发环境

    转载:http://www.cnblogs.com/realh/archive/2010/10/04/1841907.html Eclipse+PyDev环境搭建 1.准备工作 JDK6 Java 开 ...

  4. SQL Server 数据库备份到域中别的机器上

    backup database dbName to disk = '\\SV2\D\dbbackup\dbName.bak' with init,compression;

  5. BZOJ 1177 [Apio2009]Oil(递推)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1177 [题目大意] 给出一个矩阵,从中选出3个k*k且不相交的矩阵,使得其总和最大 [ ...

  6. MRC下单例模式的内存问题与ARC实现

    单例模式保证一个类只能拥有一个静态的实例,类负责创建与维护这个实例,并提供一个统一的静态(类方法)访问方式,并封锁了这个类外部的代码对这个类对象的创建. .h文件: #import <Found ...

  7. sae上屏蔽错误显示并查看错误日志

    首先应用上线之前肯定要屏蔽错误显示的, 登录sae,点进去你的应用, 关闭之后进入日志管理当前的当前版本 在http中可以查看各个级别的日志记录了

  8. cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针

    实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a- ...

  9. iPhone开发之全局变量的使用

    全局变量历来就是很好的东西,能够在开发中带来很多方便,下面来介绍一下iPhone中软件开发时全局变量的使用方法: 一.新建Constants.h文件(文件名根据需要自己取),用于存放全局变量: 二.在 ...

  10. openGl学习之加入颜色

    OpenGL 支持两种颜色模式:一种是 RGBA模式.一种是 颜色索引模式. 不管哪种颜色模式.计算机都必须为每个像素保存一些数据,即通过每个像素的颜色,来改变总体图形的颜色.不同的是. RGBA 模 ...