计算器程序

//implement a calculator
//no bracket
#include <iostream>
#include<cctype>//the ‘isdigit‘ which was included in it will be used in the funcion named number;
#include <cstdlib>

using std::cin;
using std::cout;
using std::endl;

void eatspaces(char * str);
double number(const char * str, size_t & index);
double expr(const char *str);
double term(const char *str, size_t & index);

int main()
{
    const int max{ 80 };//length of the expression
    char buffer[max]{};

    cout << endl << "enter an expression , or an empty line to quit :" << endl;

    while (1)
    {
        cin.getline(buffer, sizeof buffer);//get an expression from keyboard
        cout << "the expression you enter is : " << buffer<<endl;
        eatspaces(buffer);
        cout << "the expression without spaces is : " << buffer << endl;
        double value{};
        //size_t index{};

        value = expr(buffer);//calculate the expression
        //value = number(buffer, index);//be use to test whether the function "number" is on work
        cout << "the value :" << value << endl;

        if (buffer[0] == 0)
            return 0;
    }

    //cout << endl;
    return 0;

}
/*expr :calculate the expression got from buffer*/
double expr(const char *str)
{
    double value{};
    size_t index{};//this index will be used from now to the end ,which show as a ‘&‘

    //divide the expression into term according to the ‘+‘ or ‘-‘
    value=term(str, index);//the beginning term
    for (;;)
    {
        char temp{ *(str + index) };
        index++;
        cout << "test index" << endl;
        switch (temp)
        {
        case ‘\0‘:return value;
        case ‘+‘: value = value + term(str, index); break;//whether put index++ here or not?
        case ‘-‘:value = value - term(str, index); break;
        //default:char message[38]{ "expression evaluation error,found: " };
        //        strncat_s(message, str + index -1, 1);
        //        throw message;
        //        break;
        }
    }
}
/*calculate every term by using the multi (*)and divide(/)*/
double term(const char *str, size_t & index)
{
    double value{};
    value = number(str, index);
    while (1)
    {
        if (*(str + index) == ‘*‘)
            value = value*number(str, ++index);
        else if (*(str + index) == ‘/‘)
            value = value / number(str, ++index);
        else
            break;
        //switch (*(str + index++))
        //{
        //case ‘\0‘:return value;
        //case ‘*‘:value = value*number(str, index); break;
        //case ‘/‘:value = value / number(str, index); break;
        //default:return value;

        //}
    }
    return value;
}
/*read number;*/
double number(const char * str, size_t & index)
{
    double value{};
    while (isdigit(*(str + index)))
    {
        value = 10 * value + (*(str + index) - ‘0‘);
        index++;
    }
    if (*(str + index) != ‘.‘)
    {
        return value;//if the number is not a decimal
    }
    else
    {
        //if the number is a decimal
        double factor{ 1.0 };
        index++;//point to the char after the dicimal
        while (isdigit(*(str + index)))
        {
            factor = factor*0.1;
            value = value + (*(str + index) - ‘0‘)*factor;
            index++;
        }
        return value;
    }
}

/*delete space*/
void eatspaces(char * str)
{
    size_t i{};//control the pointer which point to the new string;
    size_t j{};//control the pointer which point to the old string;
    do
    {
        if (*(str + j) != ‘ ‘)
        {
            *(str + i) = *(str + j);
            i++;
        }
        j++;
    } while (*(str + j) != ‘\0‘);
    *(str + i) = ‘\0‘;//give an end command to the new string ;
    return;
}
时间: 2024-10-10 02:54:35

计算器程序的相关文章

中缀输入逆波兰计算器程序part1

在看K&R的时候,里面提到了逆波兰表示法,老实说看得我迷迷糊糊的,主要是这种反人类的后缀表示法做出的计算器,一般人根本就不知道怎么输入好吧.今天看书的时候,看到了将中缀表达式转为后缀表达式的方法才恍然大悟,原来是少了这一步.这下我就知道该如何做一个可用的逆波兰计算器了. 先简单介绍一下如何完成这步转换吧.中缀表达式就是我们习惯的表达式,比如:1+2*3 考虑运算符优先级的话后缀表达式则应该写成123*+ 写成后缀表达式的形式后我们可以利用栈轻松地解决计算问题,思路是当见到一个数时就把它推入栈:在

纯javascript代码编写计算器程序

今天来分享一下用纯javascript代码编写的一个计算器程序,很多行业都能用到这个程序,例如做装修预算.贷款利率等等. 首先来看一下完成后的效果: 具体代码如下:(关注我的博客,及时获取最新WEB前端开发源代码) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

逆向工程第003篇:令计算器程序显示汉字(上)

一.前言 计算器(Calc.exe)程序在Windows系统中已经存在了很长的时间,也是我们十分常用的软件.但是一般来说,它所显示的都是阿拉伯数字,而且也没有字符显示的切换.这次我会以两篇文章来进行讨论如何让计算器程序显示汉字的数字.本篇来讨论修改的基本原理,下一篇则来讨论如何编程实现. 二.修改原理剖析 在我以前的很多文章中,始终在强调,Windows编程在很大程度上其实就是各种API函数的堆砌,谁掌握了更多的API函数,那么他往往就能够编写出功能齐全的强大软件.当然,编写出优秀的软件还由其它

用c++写一个简单的计算器程序

// 050305.cpp : 定义控制台应用程序的入口点.// // 050304.cpp : 定义控制台应用程序的入口点.////四则运算#include "stdafx.h"#include<iostream>#include<stdio.h>using namespace std;void add(){ printf("输入要计算的加数(例如a b)\n"); int adda=0, addb=0,addc=0; cin >&g

Python新手必备练习4---开发一个计算器程序

总是有朋友问我,在听我讲的课时感觉都能听懂,我讲的例子照着写也能做出来,但一到自己想不照抄而是自己写的时候,就发现完全没有思路,不知如何下手.对此我只能说,还是因为练习的少,平常从来不写代码,学了点语法就想啪啪啪实现复杂的功能是不现实的,学习语言是一个循序渐近的过程,不经过几万行代码的洗礼,是很难成为一个优秀的程序员的,为了帮助初学者找一些好的练习基本功的例子,我近期会整理我讲课一来的一些Python练习程序分享给大家,想学好Python的同学可以照着例子一一去做,我敢保证,把我列出的练习程序列

Modern计算器-程序员功能更新

前几天写的Modern计算器有点太简单,今天将计算器增加了程序员功能,可以进行十进制的三种转换.10 to 2.10 to 8.10 to 16. 因为写过进制转换的程序,本想着可以直接将代码复制过来,没想到却碰到了麻烦,两种代码的变量命名太混乱,根本都是当时想到的变量名随便就命名了. 这种命名真的让自己头疼了好久,所以,规范变量以及函数的命名尤为重要. 计算器的功能还将继续扩充中,虽然网上的计算器很多,效率会更高但是自己设计的软件,UI以及DIY将有更大的自由度,本想着是一款仿Win10计算器

python 简单编写的计算器程序

计算器思路 1.要求输入公式 2.检测公式是否包含字母 3.如果包含字母则需要重新输入,否则进行下一步运算 4.检测是否存在括号,如果存在括号,把括号里面的值进行优先级运算,然后赋值到原位,没有则按照优先级运算,取出最后运算结果 流程图 具体代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'weibinf' import re   #导入模块 def kuohao(self):   #判断是否存在括号     se

编写计算器程序学习JS责任链模式

设计模式中的责任链模式能够很好的处理程序过程的逻辑判断,提高程序可读性. 责任链模式的核心在于责任链上的元素判断能够处理该数据,不能处理的话直接交给它的后继者. 计算器的基本样式: 通过div+css定义计算器的样式,并在每个按钮上绑定事件响应按钮输入. 输入的元素为数字.小数点.加减乘除运算符时,都是直接显示. 输入为清除所有.清除上一次时直接清除. 输入为等号.百分比.开根号.乘方.分之一时,开始计算. 同时在输入框下面显示上次运算的公式. 1.定义责任元素的基类 包括变量next指向他的后

QT5.4 计算器程序 打包&amp;发布,解决dll的最新解决方案(图文并茂,很清楚)

QT写界面还是很不错,就是打包会比较麻烦,折腾了一天总算是打包完成了. QT软件的打包发布一个难点是必备dll文件的识别,现在高版本QT自带了一个windeployqt工具,直接会把需要的dll生成一份,放在软件的目录里面. 参考官方文档:http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies 具体使用步骤如下: 1.添加qt的bin/目录进系统path变量.很简单,在系统属性里设置,添加D:\QT\QT5.4

QT5.4 计算器程序 打包&amp;发布,解决dll的最新解决方案

QT写界面还是很不错,就是打包会比较麻烦,折腾了一天总算是打包完成了. QT软件的打包发布一个难点是必备dll文件的识别,现在高版本QT自带了一个windeployqt工具,直接会把需要的dll生成一份,放在软件的目录里面. 参考官方文档:http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies 具体使用步骤如下: 1.添加qt的bin/目录进系统path变量.很简单,在系统属性里设置,添加D:\QT\QT5.4