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日

相关文章

  • C语言中结构与结合的区别

    下面是详细讲解“C语言中结构与结合的区别”的完整使用攻略: C语言中结构与结合的区别 结构体 结构体是一种自定义数据类型,可以将不同类型的数据打包在一起。结构体中可以包含多个成员,每个成员可以是不同类型的数据,例如int、float、char等等,也可以是其他结构体类型。结构体创建后,需要通过结构体变量来存储和使用。 下面是一个示例: // 定义结构体 st…

    C 2023年5月10日
    00
  • C程序 检查字符串是否为Pangram

    下面就为您详细讲解“C程序 检查字符串是否为Pangram”的完整使用攻略: 什么是Pangram Pangram是一个包含所有字母的字符串。 这意味着,很多时候我们需要检查某个字符串是否为Pangram。 接下来我们就来学习如何使用C程序来检查字符串是否为Pangram。 程序代码 以下是C语言程序来检查字符串是否为Pangram的代码: #include…

    C 2023年5月9日
    00
  • 制作win2003自动安装盘 集成补丁/Raid及硬件驱动

    制作Win2003自动安装盘需要以下几个步骤: 1. 下载Win2003操作系统光盘镜像文件 首先需要从官网或者其他渠道下载Win2003的操作系统光盘镜像文件,通常为ISO格式的文件,作为后续制作自动安装盘的基础。 2. 下载并安装WinISO软件 WinISO是用于制作光盘镜像的工具软件,可以帮助将Win2003光盘镜像文件转换成ISO格式,方便进行自动…

    C 2023年5月24日
    00
  • C语言WinSock学习笔记

    下面我来详细讲解一下《C语言WinSock学习笔记》的完整攻略。 一、WinSock是什么 WinSock (Windows Sockets) 是一种技术,允许应用程序通过 TCP/IP 协议来进行网络通信,是 Windows 操作系统自带的一个 API。WinSock 可以使用基于 TCP 或者 UDP 协议的 Socket 通信方式来实现网络应用。 二、…

    C 2023年5月22日
    00
  • C语言实现数字游戏

    C语言实现数字游戏攻略 本文将介绍如何使用C语言编写数字游戏,包括游戏规则、实现步骤和示例代码。 游戏规则 数字游戏的规则如下: 游戏中有一个三位数的目标数字(不能以0开头),玩家需要猜测这个数字。 玩家每次猜测一个三位数,如果该数与目标数字相同,则游戏胜利结束;否则,系统会给出提示: 相同数字的个数和位置(称为“A”)。 相同数字的个数但位置不同(称为“B…

    C 2023年5月23日
    00
  • c++ vector(向量)使用方法详解(顺序访问vector的多种方式)

    C++ vector(向量)使用方法详解 简介 vector 是 C++ STL 中的一个重要数据结构,用于实现动态数组。它具有许多优点,包括支持尾部插入、常量时间访问、动态分配内存等。 基本操作 创建 vector 创建一个空的 vector 和一个具有初始值的 vector 的方式如下: #include <vector> using nam…

    C 2023年5月22日
    00
  • C++加密解密php代码的方法

    下面是我对于“C++加密解密PHP代码的方法”的攻略,其中包含两个示例说明。 1. 背景介绍 在很多情况下,我们需要对PHP代码进行加密以保护代码的安全性,比如在将PHP代码部署到云服务器上发布应用程序时,我们希望代码不被黑客篡改或者攻击。此时,我们可以使用C++来加密和解密PHP代码。 2. C++加密PHP代码的过程 C++加密PHP代码的过程大致如下:…

    C 2023年5月24日
    00
  • C语言 结构体

    下面就为大家详细讲解一下“C语言 结构体”的使用攻略。 C语言 结构体 结构体是C语言中一种自定义的数据类型,用于存储一组多个不同类型的数据,相比于数组在存储不同类型数据时的不足,结构体能够更加灵活地组合多个类型的数据。一个结构体被定义后,可以使用点运算符 . 来访问其各个成员。 结构体的定义 定义一个结构体需要使用 struct 关键字,结构体跟类型名之间…

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