// Logic.cpp : Defines the entry posize_t for the console application.

//

#include "stdafx.h"

#include "string.h"

#include "stdio.h"

#include <stdlib.h>

#include <math.h>

float logic(char* pStr){

char* inData=pStr;

// 去空格

size_t iIndex=1,iFlag=0;

for(iIndex;iIndex<strlen(inData);iIndex++){

if(*(inData+iIndex-1) == ' '){

iFlag=iIndex;

for(iFlag;iFlag<=strlen(inData);iFlag++){

*(inData+iFlag-1)=*(inData+iFlag);

}

}

}

// 计算乘除

for(;;){

size_t found=0;//是否找到操作符标记 每次查找前置0 表示没找到

size_t leftFlag=65535,rightFlag=65535; //分别 记录左边字符串的结束位置 右边字符串的起始位置

for(size_t i=1;i<=strlen(inData);i++){

char score=*(inData+i-1);

if( (score == '*') || (score == '/') ){

found=1;

char strLeft[255]={0},strRight[255]={0};

size_t ileft=i-1,iright=i+1;

for(ileft;ileft>0;ileft--){ // 获取左操作数

if((*(inData+ileft-1) == '+') || (*(inData+ileft-1) == '-') || ( ileft == 1) )

{

leftFlag=ileft;

size_t leftIndex=0;

if(ileft == 1){

for(size_t lStart=ileft;lStart<i;lStart++){

strLeft[leftIndex]=*(inData+lStart-1);

leftIndex++;

}

}else{

for(size_t lStart=ileft+1;lStart<i;lStart++){

strLeft[leftIndex]=*(inData+lStart-1);

leftIndex++;

}

}

break;

}

}

for(iright;iright<=strlen(inData);iright++){ //获取右操作数

if((*(inData+iright-1) == '+') || (*(inData+iright-1) == '-') || (*(inData+iright-1) == '*') ||(*(inData+iright-1) == '/') || (iright == strlen(inData)))

{

rightFlag=iright;

size_t rightIndex=0;

if( iright == strlen(inData)){

for(size_t rStart=i+1;rStart<=iright;rStart++){

strRight[rightIndex]=*(inData+rStart-1);

rightIndex++;

}

}else{

for(size_t rStart=i+1;rStart<iright;rStart++){

strRight[rightIndex]=*(inData+rStart-1);

rightIndex++;

}

}

break;

}

}

float res=0.0;

if( score == '*' ){ // 计算结果

res=atof(strLeft)*atof(strRight);

}else{

res=atof(strLeft)/atof(strRight);

}

char proStr[255]={0};

sprintf(proStr,"%.3f",res);

char lLeftStr[255]={0},lRightStr[255]={0};

if(leftFlag == 1){   //获取左边遗留字符串

memset(lLeftStr,0,255);

}else{

for(size_t a=1;a<=leftFlag;a++)

{

lLeftStr[a-1]=*(inData+a-1);

}

}

if(rightFlag == strlen(inData)){ //获取右边遗留字符串

memset(lRightStr,0,255);

}else{

int rIndex=0;

for(size_t b=rightFlag;b<=strlen(inData);b++){

lRightStr[rIndex]=*(inData+b-1);

rIndex++;

}

}

memset(inData,0,255); //拼接字符串,形成新的表达式

strcat(inData,lLeftStr);

strcat(inData,proStr);

strcat(inData,lRightStr);

break;

}

}

if(found==0)

break; //没找到,说明全部* /都计算完了 跳出继续找加减

}

// 下面处理加减

for(;;){

size_t found=0;//是否找到操作符标记 每次查找前置0 表示没找到

size_t rightFlag=65535;

for(size_t i=1;i<strlen(inData);i++){

char score=*(inData+i-1);

if( (score == '+') || (score == '-')){

found=1;

char strLeft[255]={0},strRight[255]={0};

size_t ileft=i-1,iright=i+1;

size_t leftIndex=0;// 获取 + 或 - 的左操作数

for(size_t lStart=1;lStart<=ileft;lStart++){

strLeft[leftIndex]=*(inData+lStart-1);

leftIndex++;

}

//1+2+3

for(iright;iright<=strlen(inData);iright++){// 获取 + 或 - 的右操作数

if((*(inData+iright-1) == '+') || (*(inData+iright-1) == '-') || (iright == strlen(inData)))

{

rightFlag=iright;

size_t rightIndex=0;

if(iright == strlen(inData)){

for(size_t rStart=i+1;rStart<=iright;rStart++){

strRight[rightIndex]=*(inData+rStart-1);

rightIndex++;

}

}else{

for(size_t rStart=i+1;rStart<iright;rStart++){

strRight[rightIndex]=*(inData+rStart-1);

rightIndex++;

}

}

break;

}

}

float res=0.0;

if( score == '+' ){

res=atof(strLeft)+atof(strRight);

}else{

res=atof(strLeft)-atof(strRight);

}

char proStr[255]={0};

sprintf(proStr,"%.3f",res);

char lRightStr[255]={0};

int rIndex=0;

if(rightFlag == strlen(inData)){

memset(lRightStr,0,255);

}else{

int len=strlen(inData);

for(size_t b=rightFlag;b<=strlen(inData);b++){

lRightStr[rIndex]=*(inData+b-1);

rIndex++;

}

}

memset(inData,0,255);

strcat(inData,proStr);

strcat(inData,lRightStr);

break;

}

}

if(found==0)

break; //没找到,说明全部+ -都计算完了

}

return atof(inData);

}

int main(size_t argc, char* argv[])

{

char buf[255]={0};

printf("请输入您要计算的表达式:\n");

fgets(buf,255,stdin);

if( (strlen(buf)==254) && (buf[253]!='\n') ){

scanf("%*[^\n]");

scanf("%*c");

}

int len = strlen(buf);

buf[len-1]='\0';

printf("计算后的结果是%.3f\n",logic(buf));

getchar();

return 0;

}

转载于:https://blog.51cto.com/shenyantao/1435171

一个计算器--支持去空格相关推荐

  1. 请用python3编写一个计算器的控制台程序_二、软件工程慕课第一章作业题——编写一个计算器...

    一.题目描述 请用Python3编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描述 ...

  2. java 添加空格方法_java 各种去空格的方法

    String str =" dgd fdgd "; 方法一:str = str.trim();//去前后空格 返回:dgd fdgd 方法二:str = str.replaceAl ...

  3. 用C语言写一个计算器

    用C语言写一个计算器,除了四则混合运算之外,还支持三角函数和绝对值等函数. PS E:\Code\PL\calc> .\a.exe abs(3*5-4^2) abs(3*5-4^2)=1.000 ...

  4. 个人使用向7:easypoi EXCEL导入去空格

    场景:系统存在客户可以通过上传excel来输入一些产品数据.对应用户输入数据校验是进行精确校验.所以输入的数据需要首尾去空格,因为空格肉眼无法判断是否存在,但是对应数据进行精确匹配时候回匹配上. 处理 ...

  5. input点击事件不能用_用js简单写一个计算器

    嗨,大家好,今天给大家带来的是一个计算器 首先要知道我们常用的计算器都有哪些按键,有'0~9','+' ,' -' , '*', '/',还有'=' 和'.',基本是这些按键,然后我们去创建一些按键. ...

  6. 程序员修仙之路-数据结构之 CXO让我做一个计算器

    菜菜呀,个税最近改革了,我得重新计算你的工资呀,我需要个计算器,你开发一个吧 CEO,CTO,CFO于一身的CXO X总,咱不会买一个吗? 菜菜 那不得花钱吗,一块钱也是钱呀··这个计算器支持加减乘除 ...

  7. android 获取url中的参数,验证邮箱格式,截取字符串中键值对的值,String的字节长度,去空格,替换字符

    String ss="hello"; byte[] buff=ss.getBytes(); int f=buff.length; System.out.println(f); 字节 ...

  8. python tkinter计算器实例_Python+tkinter使用80行代码实现一个计算器实例

    Python+tkinter使用80行代码实现一个计算器实例 本文主要探索的是使用Python+tkinter编程实现一个简单的计算器代码示例,具体如下. 闲话不说,直奔主题.建议大家跟着敲一遍代码, ...

  9. java trim all,[JAVA中各种去除空格][java string.trim()][str.replaceAll去空格]

    有时候去除空格是件很烦的事,去空格我们也要详细了解一下他们的功能等,下面就罗列一下各个方法吧! 1. String.trim() trim()是去掉首尾空格 2.str.replace(" ...

  10. 按编译原理的思路设计的一个计算器

    (周游[http://www.cnblogs.com/naturemickey]版权所有,未经许可请勿转载) 首先看一下这个计算器的功能: CALC> set a = 1; b = 2 CALC ...

最新文章

  1. MediaCodec问题汇总
  2. 每天最少编码1000行
  3. golang中的flag模块小结
  4. Mybatis实现CRUD操作
  5. GNOME下也是Alt+F2,输入gnome-terminal
  6. clearTaskOnLaunch的作用,自己总结,求关注
  7. Linux下启动/关闭Oracle
  8. Could not get resource ‘https://dl.google.com/dl/android/maven2/com/android/
  9. atitit.事件驱动的总结attilax
  10. 合并传闻是真是假?ofo摩拜之争是否继续?(产品)
  11. python函数定义的规则
  12. 【硬石科技】电机系列教学(基于STM32)——直流有刷电机和直流减速电机及其驱动电路
  13. NODA-GA-NHS ester CAS:1407166-70-4 大环配体配合物
  14. 大学生家乡网页设计作业模板下载 南京城市网页设计作业成品 静态HTML旅游景点网页制作下载_网页设计代码
  15. 【c#】DGV中复制粘贴数据最详细代码
  16. 【CTF WriteUp】2020全国工业互联网安全技术技能大赛(原护网杯)Crypto题解
  17. JetBrains学生注册码申请步骤
  18. 硬核万字总结:看完这 20 道 Redis 面试题,女朋友都面上阿里了
  19. 数据分析知识体系与校招时间线
  20. uwb定位系统,室内定位技术

热门文章

  1. thinkphp __hash__
  2. JavaScript的类型转换
  3. Mac Android studio: Gradle Build Running 、 run build 运行卡顿 、 加载慢问题问题(亲测可用)
  4. redis哨兵配置和redis-cluster搭建
  5. git GUI管理工具 sourcetree使用
  6. SQL Server 触发器触发器
  7. PHP表单常用正则表达式(URL、HTTP、手机、邮箱等)
  8. codeforces 701A A. Cards(水题)
  9. Jquery常用操作select篇
  10. ubuntu12.04 安装 coreseek 4.1beta (转)