C语言实现计算器的两种方法

当下常见编程语言中,C语言是一种十分常用的语言。C语言可以用来开发各种类型的应用、系统和游戏,其中之一就是实现计算器。下面将结合两条示例来详细讲解“C语言实现计算器的两种方法”的完整攻略。

第一种方法:基于表达式求值的计算机实现

思路分析

在程序开发者社区中,基于表达式求值的方式是最广泛使用的方法之一。下面是一个实现“基于表达式求值的计算机”的思路:

  1. 读入表达式字符串
  2. 实现字符串切分,将表达式拆分成操作数和运算符
  3. 利用栈进行对表达式进行操作符和数值的储存
  4. 优先计算乘除运算符
  5. 计算加减运算符
  6. 按顺序计算完毕,最终将答案推出

示例演示

下面是一个实现基于表达式求值的计算器的示例源代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXSIZE 1000      // 定义栈的长度

int numStack[MAXSIZE];     // 创建储存数字栈
char opStack[MAXSIZE];     // 创建储存存储操作符的栈
int numTop = -1;           // 定义数字栈顶指针
int opTop = -1;            // 定义操作符栈顶指针

void cal() {  // 定义计算函数
    int a = numStack[numTop--]; 
    int b = numStack[numTop--];
    char op = opStack[opTop--];
    int sum;
    if(op == '+'){
        sum = b+a;
    }
    else if(op == '-'){
        sum = b-a;
    }
    else if(op == '*'){ 
        sum = b*a;
    }
    else{
        sum = b/a;
    }
    numStack[++numTop] = sum;
}

int pre(char op) {  // 定义优先级函数
    if(op == '+' || op == '-') return 1;
    if(op == '*' || op == '/') return 2;
    return 0; 
}

int isNumber(char c){  // 判断字符是否为数字
    return c >= '0' && c <= '9';
}

int scan(char str[],int *i){  // 读取表达式中的数字
    int sum=0;
    while(str[*i]!='\0' && isNumber(str[*i])){
        sum = sum*10 + str[*i] - '0';
        (*i)++;
    }
    return sum;
}

void calculate(char str[]){  // 计算表达式的函数
    int i=0;
    while(str[i] != '\0'){
        if (isNumber(str[i])){
            numStack[++numTop] = scan(str,&i);
        }
        else if(str[i] == ')'){
            while(opStack[opTop] != '('){
                cal();
            }
            opTop--;i++;
        }
        else{         
            while(opTop!=-1 && opStack[opTop]!='(' &&     pre(opStack[opTop])>=pre(str[i])){
                cal();
            }
            opStack[++opTop] = str[i++];
        }
    }
    while(opTop != -1){
        cal();
    }
}

int main(){   // 主函数
    char exp[MAXSIZE];
    while(scanf("%s",exp)!=EOF){   
        numTop = -1;    
        opTop  = -1;      
        int exp_len = strlen(exp);  
        opStack[++opTop] = '(';     // 运算符入栈
        exp[exp_len++] = ')';       // 将表达式尾添加')'
        calculate(exp);         
        printf("%d\n",numStack[numTop]); // 输出计算结果
    }
    return 0;
}

这段代码会读入一组表达式字符串,计算表达式中的算式结果,并基于printf输出函数输出结果。

第二种方法:基于switch分支的实现方法

思路分析

n第二种实现计算器的方法是基于switch分支实现的,该方法不是基于表达式求值而是进行列举型调用以实现计算器的运行机制。以下是基于switch分支的实现方法:

  1. 输入算式中的两个数字以及运算符
  2. 运用switch分支判断输入运算符类型
  3. 处理根据运算符类型匹配所需的算式处理函数
  4. 输出结果

示例演示

下面是一个使用switch基于实现的计算器示例源代码:

#include<stdio.h>
int main(){
    char operator = 0;   // 运算符
    float operand1 = 0;  // 操作数1
    float operand2 = 0;  // 操作数2
    float answer = 0;    // 计算结果
    while(1){
        scanf("%f%c%f",&operand1,&operator,&operand2);  // 读取输入数据
        switch(operator){  
            case '+': answer = operand1 + operand2; break; // 实现四则运算
            case '-': answer = operand1 - operand2; break;
            case '*': answer = operand1 * operand2; break;
            case '/': answer = operand1 / operand2; break; 
            default: printf("INVALID ENTRY.\n"); exit(0);  // 非法输入
        }
        printf("= %f\n",answer);  // 输出计算结果
    }
    return 0;
}

这段代码包含了switch分支语句、浮点数等关键字。输入不同的操作符(+,-,*,/)时,会分别计算运算符两边的数字并输出结果。

所以,以上两种方法都可以用于实现基于C语言的计算器,开发者可以根据具体需求选择适用的方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现计算器的两种方法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • php实现的一段简单概率相关代码

    下面是关于“php实现的一段简单概率相关代码”的完整攻略,包含如何实现、示例说明等内容: 背景 概率统计在数据科学中扮演着重要的角色。在开发网络应用时,我们经常需要使用概率统计来解决一些问题,如随机生成数据、增加应用程序的随机性等。 在PHP语言中,我们可以使用随机数函数(rand() 和 mt_rand())来生成随机数。但是,如果我们需要生成一些特定的序…

    C 2023年5月23日
    00
  • 批处理 Set 命令详解 让你理解set命令

    批处理 Set 命令详解 什么是 Set 命令? Set 命令是 Windows CMD 中的命令之一,它用于设置环境变量,例如设置系统路径等。 Set 命令的语法 set [变量名=值] 变量名和值之间需要用等号 = 连接。 Set 命令的用法 1. 设置系统环境变量 使用 Set 命令可以设置系统环境变量,例如设置 PATH 变量: set PATH=C…

    C 2023年5月22日
    00
  • python多线程同步实例教程

    下面我会详细讲解“Python多线程同步实例教程”的完整攻略。 Python多线程同步实例教程 什么是多线程同步? 多线程同步是指,在多线程环境中,协调各个线程之间的执行顺序,避免线程之间的竞争问题,使得线程能够协调合作,实现正确的程序逻辑。 Python多线程同步的方法 Python多线程同步有以下几种方法: Lock(锁) Lock是Python中最基本…

    C 2023年5月22日
    00
  • 逍遥自在学C语言 | 位运算符^的高级用法

    前言 在上一篇文章中,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、交换两个变量的值 #include <stdio.h> int main() { int a = 10; in…

    C语言 2023年4月17日
    00
  • C语言学生成绩管理系统课程设计word版

    针对“C语言学生成绩管理系统课程设计word版”的完整攻略,我将从以下几个方面进行讲解: 1.系统需求分析2.系统设计方案3.系统开发实现4.系统测试与维护 1.系统需求分析 在进行任何系统开发之前,必须清楚自己的需求,包括用户的需求和技术的需求,了解系统功能、数据存储和处理方式、用户交互等方面的要求。对于此次课程设计,针对学生成绩管理系统,我们需要考虑以下…

    C 2023年5月22日
    00
  • C语言实现贪吃蛇小游戏

    下面是关于“C语言实现贪吃蛇小游戏”的完整攻略,包含以下几个方面的内容: 1.准备工作 在开始实现贪吃蛇游戏之前,需要准备好所需的开发环境和工具,包括 C 语言编译器、代码编辑器等。 2.实现游戏的基本框架 在实现贪吃蛇游戏的基本框架时,需要考虑游戏整体的结构和功能。通常包括游戏的界面、游戏的逻辑、游戏的音效等。 其中,实现游戏的逻辑是比较复杂的部分。通常需…

    C 2023年5月23日
    00
  • 深入浅出讲解Java比较器及数学常用类

    深入浅出讲解Java比较器及数学常用类 Java比较器 Java中的比较器是用于比较两个对象的大小关系的接口,它定义了一个compare()方法用于比较大小。常用于排序、查找等场景中。 自然排序 自然排序是Java中默认的排序方式,即根据对象所属类型的大小关系进行排序。例如,整数类型按照数值大小进行排序,字符串类型按照字典序进行排序。 public clas…

    C 2023年5月22日
    00
  • Ajax和Comet技术总结

    Ajax和Comet技术总结 Ajax是Asynchronous JavaScript and XML(异步JavaScript和XML)的缩写。它是一种利用JavaScript和XML在Web服务器上异步传输数据的技术。它可以在不重新加载整个网页的情况下,更新某个特定部分的内容。Ajax能够在不干扰客户端的情况下,优化Web应用的性能。 Ajax的优点 网…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部