C#教程
主页 > 软件编程 > C#教程 >

基于C++实现一个Windows多功能计算器

2025-10-26 | 佚名 | 点击:

功能特性

标准计算功能:提供基本数学运算,支持即时计算和表达式求值

科学计算功能:扩展数学运算,支持运算优先级和复杂函数计算

程序员计算功能:为开发者提供常用数学运算,支持常见进制转换

日期计算:计算两个日期之间的差异,支持年、月、日的加减运算

计算历史和内存:支持计算历史记录和内存存储功能

单位转换:支持多种度量单位之间的转换

货币转换:基于Bing数据提供实时货币汇率转换

高精度计算:采用任意精度算术算法,确保计算精度不丢失

安装指南

系统要求

安装步骤

使用说明

基本使用示例

计算器提供多种模式,用户可以通过界面切换不同的计算模式:

1

2

3

4

5

6

7

8

// 初始化计算器管理器

CalculatorManager manager(displayCallback, resourceProvider);

 

// 设置标准模式

manager.SetStandardMode();

 

// 发送计算命令

manager.SendCommand(Command::ADD);

单位转换示例

1

2

3

4

5

// 创建单位转换器

UnitConverter converter(dataLoader);

 

// 执行温度单位转换

converter.Convert(100, "Celsius", "Fahrenheit");

货币转换示例

1

2

3

// 使用Bing数据进行货币转换

CurrencyConverter currencyConverter(currencyDataLoader);

currencyConverter.Convert(100, "USD", "EUR");

核心代码

计算器历史管理

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

// CalculatorHistory.cpp - 历史记录管理实现

unsigned int CalculatorHistory::AddToHistory(

    _In_ shared_ptr<vector<pair<wstring, int>>> const& tokens,

    _In_ shared_ptr<vector<shared_ptr<IExpressionCommand>>> const& commands,

    wstring_view result)

{

    shared_ptr<HISTORYITEM> spHistoryItem = make_shared<HISTORYITEM>();

     

    spHistoryItem->historyItemVector.spTokens = tokens;

    spHistoryItem->historyItemVector.spCommands = commands;

    spHistoryItem->historyItemVector.expression = GetGeneratedExpression(*tokens);

    spHistoryItem->historyItemVector.result = wstring(result);

     

    return AddItem(spHistoryItem);

}

高精度有理数运算

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

// Rational.cpp - 有理数运算实现

Rational Rational::operator-() const

{

    return Rational{

        Number{ -1 * m_p.Sign(), m_p.Exp(), m_p.Mantissa() },

        m_q

    };

}

 

Rational& Rational::operator+=(Rational const& rhs)

{

    PRAT lhsRat = this->ToPRAT();

    PRAT rhsRat = rhs.ToPRAT();

     

    try {

        addrat(&lhsRat, rhsRat, RATIONAL_BASE, RATIONAL_PRECISION);

        destroyrat(rhsRat);

    }

    catch (uint32_t error) {

        destroyrat(lhsRat);

        destroyrat(rhsRat);

        throw(error);

    }

     

    *this = Rational{ lhsRat };

    destroyrat(lhsRat);

     

    return *this;

}

表达式命令处理

1

2

3

4

5

6

7

8

9

10

// ExpressionCommand.cpp - 表达式命令处理

CalculationManager::CommandType CUnaryCommand::GetCommandType() const

{

    return CalculationManager::CommandType::UnaryCommand;

}

 

void CUnaryCommand::Accept(_In_ ISerializeCommandVisitor& commandVisitor)

{

    commandVisitor.Visit(*this);

}

数字格式化工具

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

// NumberFormattingUtils.cpp - 数字格式化工具

void TrimTrailingZeros(_Inout_ wstring& number)

{

    if (number.find(L'.') == wstring::npos) {

        return;

    }

     

    if (auto i = number.find_last_not_of(L'0'); i != wstring::npos) {

        number.erase(number.cbegin() + i + 1, number.cend());

    }

     

    if (number.back() == L'.') {

        number.pop_back();

    }

}

计算引擎核心

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// CalcEngine.cpp - 计算引擎核心功能

void CCalcEngine::ProcessCommand(OpCode wID)

{

    if (IsGuiSettingOpCode(wID)) {

        // 处理GUI设置操作码

        HandleGuiSettingCommand(wID);

    } else if (IsDigitOpCode(wID)) {

        // 处理数字输入

        HandleDigitCommand(wID);

    } else if (IsBinOpCode(wID)) {

        // 处理二元操作符

        HandleBinaryOperatorCommand(wID);

    } else if (IsUnaryOpCode(wID)) {

        // 处理一元操作符

        HandleUnaryOperatorCommand(wID);

    }

}

原文链接:
相关文章
最新更新