c语言编程笔录

首页 >   > 笔记大全

笔记大全

c语言编写有界面计算器

更新时间:2024-01-24

前言

本篇文章将介绍如何使用C语言编写一个有界面的计算器。这个计算器可以执行常见的算术运算,包括加法、减法、乘法和除法,同时还支持括号的使用和优先级的处理。

代码设计与实现

首先,我们需要定义一个适当的数据结构来表示计算器的每个运算符和操作数。我们可以使用一个栈来存储操作数,使用一个数组来存储表达式中的运算符,并使用一个整数变量来跟踪栈顶的位置。

#include 

#define MAX_SIZE 100

// 声明栈结构
typedef struct
{
    int top;
    int elements[MAX_SIZE];
} Stack;

// 初始化栈
void initialize(Stack *s)
{
    s->top = -1;
}

// 入栈
void push(Stack *s, int data)
{
    s->elements[++(s->top)] = data;
}

// 出栈
int pop(Stack *s)
{
    return s->elements[(s->top)--];
}

// 判断栈是否为空
int isEmpty(Stack *s)
{
    return (s->top == -1);
}

// 优先级比较
int precedence(char operator)
{
    if (operator == '+' || operator == '-')
        return 1;
    else if (operator == '*' || operator == '/')
        return 2;
    else
        return 0;
}

// 执行运算
int calculate(int operand1, int operand2, char operator)
{
    switch (operator)
    {
        case '+':
            return operand1 + operand2;
        case '-':
            return operand1 - operand2;
        case '*':
            return operand1 * operand2;
        case '/':
            return operand1 / operand2;
        default:
            return 0;
    }
}

// 主函数
int main()
{
    Stack operandStack;     // 操作数栈
    Stack operatorStack;    // 运算符栈
    char expression[MAX_SIZE];
    int i, operand1, operand2, result;

    initialize(&operandStack);
    initialize(&operatorStack);

    printf("请输入一个算术表达式:");
    gets(expression);

    for (i = 0; i < strlen(expression); i++)
    {
        if (isdigit(expression[i]))
        {
            int operand = expression[i] - '0';
            while (isdigit(expression[i+1]))
            {
                operand = operand * 10 + (expression[++i] - '0');
            }
            push(&operandStack, operand);
        }
        else if (expression[i] == '(')
        {
            push(&operatorStack, expression[i]);
        }
        else if (expression[i] == ')')
        {
            while (operatorStack.elements[operatorStack.top] != '(')
            {
                operand2 = pop(&operandStack);
                operand1 = pop(&operandStack);
                result = calculate(operand1, operand2, operatorStack.elements[operatorStack.top]);
                push(&operandStack, result);
                pop(&operatorStack);
            }
            pop(&operatorStack);
        }
        else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/')
        {
            while (!isEmpty(&operatorStack) && precedence(operatorStack.elements[operatorStack.top]) >= precedence(expression[i]))
            {
                operand2 = pop(&operandStack);
                operand1 = pop(&operandStack);
                result = calculate(operand1, operand2, operatorStack.elements[operatorStack.top]);
                push(&operandStack, result);
                pop(&operatorStack);
            }
            push(&operatorStack, expression[i]);
        }
    }
    while (!isEmpty(&operatorStack))
    {
        operand2 = pop(&operandStack);
        operand1 = pop(&operandStack);
        result = calculate(operand1, operand2, operatorStack.elements[operatorStack.top]);
        push(&operandStack, result);
        pop(&operatorStack);
    }
    result = pop(&operandStack);

    printf("计算结果为:%d\n", result);

    return 0;
}

分析解释

以上代码实现了一个简单的有界面计算器,使用栈来处理中缀表达式,并根据运算符的优先级执行相应的运算。

在主函数中,我们定义了两个栈:`operandStack`用于存储操作数,`operatorStack`用于存储运算符。我们还定义了一个字符数组`expression`,用于存储用户输入的算术表达式。

程序通过一个循环遍历算术表达式中的每个字符,进行相应的操作:

  1. 如果字符是数字,则将其转换为整数并入栈。
  2. 如果字符是左括号,则将其入栈。
  3. 如果字符是右括号,则从运算符栈中依次出栈,直到遇到左括号,并执行相应的运算。
  4. 如果字符是运算符,则比较其与栈顶运算符的优先级,如果当前运算符的优先级高于或等于栈顶运算符的优先级,则从栈中取出两个操作数和一个运算符,执行运算,并将结果入栈,继续比较栈顶运算符的优先级,直到当前运算符的优先级低于栈顶运算符的优先级,或者栈为空。然后将当前运算符入栈。

最后,循环结束后,我们执行最后一次运算,将结果从操作数栈中取出并输出。

总结

本文通过使用C语言编写代码,实现了一个有界面的计算器。代码中使用栈来处理中缀表达式,并对操作数和运算符进行相应的入栈和出栈操作,最终计算出表达式的结果。通过深入理解栈的使用和运算符优先级的比较,我们可以编写出更复杂和功能强大的计算器程序。