一个计算器--支持去空格
// 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
一个计算器--支持去空格相关推荐
- 请用python3编写一个计算器的控制台程序_二、软件工程慕课第一章作业题——编写一个计算器...
一.题目描述 请用Python3编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描述 ...
- java 添加空格方法_java 各种去空格的方法
String str =" dgd fdgd "; 方法一:str = str.trim();//去前后空格 返回:dgd fdgd 方法二:str = str.replaceAl ...
- 用C语言写一个计算器
用C语言写一个计算器,除了四则混合运算之外,还支持三角函数和绝对值等函数. PS E:\Code\PL\calc> .\a.exe abs(3*5-4^2) abs(3*5-4^2)=1.000 ...
- 个人使用向7:easypoi EXCEL导入去空格
场景:系统存在客户可以通过上传excel来输入一些产品数据.对应用户输入数据校验是进行精确校验.所以输入的数据需要首尾去空格,因为空格肉眼无法判断是否存在,但是对应数据进行精确匹配时候回匹配上. 处理 ...
- input点击事件不能用_用js简单写一个计算器
嗨,大家好,今天给大家带来的是一个计算器 首先要知道我们常用的计算器都有哪些按键,有'0~9','+' ,' -' , '*', '/',还有'=' 和'.',基本是这些按键,然后我们去创建一些按键. ...
- 程序员修仙之路-数据结构之 CXO让我做一个计算器
菜菜呀,个税最近改革了,我得重新计算你的工资呀,我需要个计算器,你开发一个吧 CEO,CTO,CFO于一身的CXO X总,咱不会买一个吗? 菜菜 那不得花钱吗,一块钱也是钱呀··这个计算器支持加减乘除 ...
- android 获取url中的参数,验证邮箱格式,截取字符串中键值对的值,String的字节长度,去空格,替换字符
String ss="hello"; byte[] buff=ss.getBytes(); int f=buff.length; System.out.println(f); 字节 ...
- python tkinter计算器实例_Python+tkinter使用80行代码实现一个计算器实例
Python+tkinter使用80行代码实现一个计算器实例 本文主要探索的是使用Python+tkinter编程实现一个简单的计算器代码示例,具体如下. 闲话不说,直奔主题.建议大家跟着敲一遍代码, ...
- java trim all,[JAVA中各种去除空格][java string.trim()][str.replaceAll去空格]
有时候去除空格是件很烦的事,去空格我们也要详细了解一下他们的功能等,下面就罗列一下各个方法吧! 1. String.trim() trim()是去掉首尾空格 2.str.replace(" ...
- 按编译原理的思路设计的一个计算器
(周游[http://www.cnblogs.com/naturemickey]版权所有,未经许可请勿转载) 首先看一下这个计算器的功能: CALC> set a = 1; b = 2 CALC ...
最新文章
- MediaCodec问题汇总
- 每天最少编码1000行
- golang中的flag模块小结
- Mybatis实现CRUD操作
- GNOME下也是Alt+F2,输入gnome-terminal
- clearTaskOnLaunch的作用,自己总结,求关注
- Linux下启动/关闭Oracle
- Could not get resource ‘https://dl.google.com/dl/android/maven2/com/android/
- atitit.事件驱动的总结attilax
- 合并传闻是真是假?ofo摩拜之争是否继续?(产品)
- python函数定义的规则
- 【硬石科技】电机系列教学(基于STM32)——直流有刷电机和直流减速电机及其驱动电路
- NODA-GA-NHS ester CAS:1407166-70-4 大环配体配合物
- 大学生家乡网页设计作业模板下载 南京城市网页设计作业成品 静态HTML旅游景点网页制作下载_网页设计代码
- 【c#】DGV中复制粘贴数据最详细代码
- 【CTF WriteUp】2020全国工业互联网安全技术技能大赛(原护网杯)Crypto题解
- JetBrains学生注册码申请步骤
- 硬核万字总结:看完这 20 道 Redis 面试题,女朋友都面上阿里了
- 数据分析知识体系与校招时间线
- uwb定位系统,室内定位技术
热门文章
- thinkphp __hash__
- JavaScript的类型转换
- Mac Android studio: Gradle Build Running 、 run build 运行卡顿 、 加载慢问题问题(亲测可用)
- redis哨兵配置和redis-cluster搭建
- git GUI管理工具 sourcetree使用
- SQL Server 触发器触发器
- PHP表单常用正则表达式(URL、HTTP、手机、邮箱等)
- codeforces 701A A. Cards(水题)
- Jquery常用操作select篇
- ubuntu12.04 安装 coreseek 4.1beta (转)