一个计算器--支持去空格

// 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;

}

一个计算器--支持去空格

时间: 2024-11-10 01:00:03

一个计算器--支持去空格的相关文章

python3.5 + PyQt5 +Eric6 实现的一个计算器

目前可以实现简单的计算.计算前请重置,设计的时候默认数字是0,学了半天就做出来个这么个结果,bug不少. python3.5 + PyQt5 +Eric6 在windows7 32位系统可以完美运行 计算器,简单学了半天就画个图实现的存在bug,部分按钮还未实现,后续优化. 代码结构如图: 1 jisuan.py 2 import re 3 #匹配整数或小数的乘除法,包括了开头存在减号的情况 4 mul_div=re.compile("(-?\d+)(\.\d+)?(\*|/)(-?\d+)(\

通过一个计算器的例子,了解设计模式中的工厂模式

计算器实例方法声明 @interface ViewController : UIViewController { BOOL bBegin; BOOL backOpen; BOOL cptOpen; BOOL secOpen; double fstOperand; double sumOperand; NSString *operator; } @property (strong, nonatomic) IBOutlet UITextField *display; @property (stron

C++中trim去空格函数的实现

以下代码摘抄CSDN论坛: 源文连接在:http://topic.csdn.net/u/20110620/10/1e0e91f0-1440-45db-aa29-6ce618fec2da.html 本人目的只在于收藏: C方法: 1 void del_sp(char *src) // 删除C风格字符串中的空格 2 { 3 char * fp = src; 4 while (*src) { 5 if (*src != ' ') { // 如果不是空格就复制 6 *fp = *src; 7 fp++;

JAVA 一个或多个空格分割字符串

知识补充 String的split方法支持正则表达式: 正则表达式\s表示匹配任何空白字符,+表示匹配一次或多次. 有了以上补充知识,下面的内容就很好理解了. 一.待分割字符串 待分割字符串为如下: String str = "a b c d e f g" 其中,字符串中的的空白分别为:单个空格,多个空格,tab制表符. 二.使用一个或多个空格分割字符串 正确代码如下: String [] arr = str.split("\\s+"); for(String ss

黑马程序员——java——模拟一个字符串中的trim方法去掉一个字符串两端的空格

模拟一个字符串中的trim方法去掉一个字符串两端的空格 public class StingTrimDemo { //模拟一个trim方法, 去掉一个字符串两边的空格], public static void main(String[] args) { // TODO Auto-generated method stub String s = " my java "; System.out.println("未去空格前的字符串+++:[ "+s+" ]&q

JQuery动画——.trim()去空格、.get()和.index()获取DOM元素

.trim()去空格..get()和.index()获取DOM元素 1   .trim()函数用于去除字符串两端的空白字符,没有多余的参数用法 2   移除字符串开始和结尾处的所有换行符,空格(包括连续的空格)和制表符(tab),如果这些空白字符在字符串中间时,它们将被保留,不会被移除3   .get()获取DOM元素,通过已知的索引在合集中找到对应的元素4   get获取dom对象,通过document.getElementById获取的对象,从0开始索引,如找到第二元素,可以传递 $(a).

程序员修仙之路- CXO让我做一个计算器!!

菜菜呀,个税最近改革了,我得重新计算你的工资呀,我需要个计算器,你开发一个吧 CEO,CTO,CFO于一身的CXO X总,咱不会买一个吗? 菜菜 那不得花钱吗,一块钱也是钱呀··这个计算器支持加减乘除运算就行,很简单 CEO,CTO,CFO于一身的CXO (尼玛)那能不能给我涨点工资呀? 菜菜 公司现在很困难,你这个计算器关系到公司的存亡,你要注意呀!! CEO,CTO,CFO于一身的CXO (关于撇开话题佩服的五体投地)好吧X总,我尽快做 菜菜 给你一天时间,我这里着急要用 CEO,CTO,C

用VBA写一个计算器

着急的 玩家 可以 跳过“============”部分 ======================================可以跳过的 部分   开始====================================================== 之所以 要有今天这样一篇博客是因为. 之前领导让找几组数据.从excel表格里面. 要求是 主号码 一致,副号码 一致,名称为 XXX 的 项目发生变化的数据 需要被找到. 这样的 项目 有 11个. 我找的真的是眼要花. 变动前

Java写的一个计算器模拟小程序

下个周六又要参加自考实践上机考试了,时间过的好快,天冷了人也变懒惰了,有时候什么也不想干,今晚刚好有时间就抽空把JAVA的试题拿出来再复习复习,看书比较困乏索性就敲敲代码吧,说实话我对JAVA不是很熟,如果不是因为考试要考,我也没时间接触它,毕竟做运维的,我更喜欢shell,PYTHON之类的.算了,还是把刚敲的代码放这里保存下,省的以后又找不到了.刚入门也就这样了. 题目: 编写一个计算器模拟程序.界面采用4行3列布局,界面设有3个文字标签(运算数1.运算数2.计算结果).3个文本框和3个加.