用c语言实现计算器要求1.加减乘除2.进制转换3.可以判断括号内先加减功能

时间: 2024-02-06 22:12:15 浏览: 33
好的,这是一个比较复杂的问题,需要较多的代码实现。我将分为以下几个部分来回答你的问题。 1. 加减乘除的实现 我们可以使用 switch 语句来实现加减乘除的功能。具体代码如下: ```c #include <stdio.h> int main() { char operator; double num1, num2, result; printf("请输入运算符 (+, -, *, /): "); scanf("%c", &operator); printf("请输入两个数字: "); scanf("%lf %lf", &num1, &num2); switch(operator) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; // 如果运算符不是加减乘除之一,则提示错误信息 default: printf("错误!运算符不正确"); return 0; } printf("%.2lf %c %.2lf = %.2lf", num1, operator, num2, result); return 0; } ``` 2. 进制转换的实现 我们可以编写函数来实现进制转换的功能。具体代码如下: ```c #include <stdio.h> #include <string.h> // 将十进制数转换为二进制数 void decimalToBinary(int decimal) { int binary[32]; int i = 0; while(decimal > 0) { binary[i] = decimal % 2; decimal = decimal / 2; i++; } printf("二进制数为: "); for(int j = i - 1; j >= 0; j--) { printf("%d", binary[j]); } } // 将二进制数转换为十进制数 void binaryToDecimal(char binary[]) { int decimal = 0; int len = strlen(binary); for(int i = 0; i < len; i++) { decimal = decimal * 2 + (binary[i] - '0'); } printf("十进制数为: %d", decimal); } int main() { int decimal; char binary[32]; printf("请输入一个十进制数: "); scanf("%d", &decimal); decimalToBinary(decimal); printf("\n请输入一个二进制数: "); scanf("%s", binary); binaryToDecimal(binary); return 0; } ``` 3. 判断括号内先加减的功能的实现 我们可以使用栈来实现括号内先加减的功能。具体代码如下: ```c #include <stdio.h> #include <string.h> #define MAX_SIZE 100 // 定义栈结构体 typedef struct { int data[MAX_SIZE]; int top; } Stack; // 初始化栈 void initStack(Stack *s) { s->top = -1; } // 判断栈是否为空 int isEmpty(Stack *s) { if(s->top == -1) { return 1; } return 0; } // 判断栈是否已满 int isFull(Stack *s) { if(s->top == MAX_SIZE - 1) { return 1; } return 0; } // 入栈 void push(Stack *s, int value) { if(isFull(s)) { printf("栈已满,无法入栈!"); return; } s->top++; s->data[s->top] = value; } // 出栈 int pop(Stack *s) { if(isEmpty(s)) { printf("栈已空,无法出栈!"); return -1; } int value = s->data[s->top]; s->top--; return value; } // 获取栈顶元素 int getTop(Stack *s) { if(isEmpty(s)) { printf("栈已空,无法获取栈顶元素!"); return -1; } return s->data[s->top]; } // 判断是否为运算符 int isOperator(char c) { if(c == '+' || c == '-' || c == '*' || c == '/') { return 1; } return 0; } // 判断运算符优先级 int priority(char c) { if(c == '+' || c == '-') { return 1; } else if(c == '*' || c == '/') { return 2; } return 0; } // 计算表达式的值 int calculate(char expression[]) { Stack numStack; // 存储数字的栈 Stack opStack; // 存储运算符的栈 initStack(&numStack); initStack(&opStack); int num = 0; int len = strlen(expression); for(int i = 0; i < len; i++) { char c = expression[i]; if(isdigit(c)) { num = num * 10 + (c - '0'); // 如果下一个字符不是数字,则将数字推入栈中 if(i == len - 1 || !isdigit(expression[i + 1])) { push(&numStack, num); num = 0; } } else if(isOperator(c)) { // 如果运算符栈为空,或者栈顶运算符为左括号,则将运算符推入栈中 if(isEmpty(&opStack) || getTop(&opStack) == '(') { push(&opStack, c); } else { // 如果当前运算符优先级高于或等于栈顶运算符优先级,则将运算符推入栈中 if(priority(c) >= priority(getTop(&opStack))) { push(&opStack, c); } // 否则,将运算符栈中的运算符弹出,直到当前运算符优先级高于栈顶运算符优先级或者栈为空 else { while(!isEmpty(&opStack) && priority(c) < priority(getTop(&opStack))) { int num2 = pop(&numStack); int num1 = pop(&numStack); char op = pop(&opStack); int result; if(op == '+') { result = num1 + num2; } else if(op == '-') { result = num1 - num2; } else if(op == '*') { result = num1 * num2; } else if(op == '/') { result = num1 / num2; } push(&numStack, result); } push(&opStack, c); } } } else if(c == '(') { push(&opStack, c); } else if(c == ')') { // 将运算符栈中的运算符弹出,直到遇到左括号为止 while(getTop(&opStack) != '(') { int num2 = pop(&numStack); int num1 = pop(&numStack); char op = pop(&opStack); int result; if(op == '+') { result = num1 + num2; } else if(op == '-') { result = num1 - num2; } else if(op == '*') { result = num1 * num2; } else if(op == '/') { result = num1 / num2; } push(&numStack, result); } pop(&opStack); } } // 将运算符栈中的运算符全部弹出 while(!isEmpty(&opStack)) { int num2 = pop(&numStack); int num1 = pop(&numStack); char op = pop(&opStack); int result; if(op == '+') { result = num1 + num2; } else if(op == '-') { result = num1 - num2; } else if(op == '*') { result = num1 * num2; } else if(op == '/') { result = num1 / num2; } push(&numStack, result); } return getTop(&numStack); } int main() { char expression[100]; printf("请输入一个表达式: "); scanf("%s", expression); int result = calculate(expression); printf("计算结果为: %d", result); return 0; } ``` 以上就是用 C 语言实现计算器的全部代码。希望能帮到你!

相关推荐

最新推荐

recommend-type

Java swing + socket + mysql 五子棋网络对战游戏FiveChess.zip

五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
recommend-type

纯C语言实现的控制台有禁手五子棋(带AI)Five-to-five-Renju.zip

五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
recommend-type

setuptools-57.1.0.tar.gz

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

setuptools-59.1.1.tar.gz

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

空载损耗计算软件.zip

空载损耗计算软件
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。