html+js实现简单的网页计算器(支持四则运算带括号)

网络上的html+js计算器大多是两个数字加一个运算符,不能实现输入长算式,这恰好是我学习中的一个任务,我就对长算式计算进行了js语言的简单实现。


页面部分十分简单,因为我的任务主要是后端开发:

<body>
        输入算式:<input type="text" name="string" id="string" autocomplete="off"/>
        <input type="button" value="计算" id="" onclick="calculate()"/>
        <p id="result"> </p>
</body>

就是这么个简陋的页面:
极简画风

其中,计算按钮触发js中calculate()函数,完成计算。


则js部分中,使用:

document.getElementById("string").value

读入字符串(输入的算式)。


使用:

document.getElementById("result").innerHTML

作为输出载体。


JS部分的编写,说实话还是与java有很大不同的,比如变量类型很随意,直接用var声明,而且一个数组里可以直接存多个类型的数据,方便处理。


处理算式需要多次使用正则表达式判断某个字符属于某个字符集,此项目使用的正则表达式如下:

const num=/[0-9]/;
const op=/[()/*\-+]/;
const spec=/[)/*+.]/;
const big=/[/*]/
const small=/[+\-]/
const fdm=/[(#]/;

下面开始处理数据,首先是将字符串处理为数字+运算符,存入队列中等待运算:
(比较啰嗦,但我实在想不到什么好方法了,大概也有一些疏漏,不过或许这个任务的目的就是借此熟悉一下各种语法吧)

		var st=document.getElementById("string").value;
        preIsOp=0;st="0+("+st+")+0";
        for(var i=0;i<st.length;i++){
   
            if(preIsOp==0&&spec.test(st.charAt(i))){
   document.getElementById("result").innerHTML="连续输入符号或两端为运算符"; return 0;}
            if(preIsOp==1&&st.
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个简单括号四则运算计算器的C语言代码,已经加上了注释,希望对你有帮助: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAXLEN 100 // 定义最大长度 // 定义一个结构体表示栈 typedef struct { int top; // 栈顶指针 int data[MAXLEN]; // 存放数据的数组 } Stack; // 初始化栈 void initStack(Stack *s) { s->top = -1; // 初始时,栈顶指针为-1 } // 判断栈是否为空 int isEmpty(Stack *s) { return s->top == -1; } // 判断栈是否已满 int isFull(Stack *s) { return s->top == MAXLEN - 1; } // 入栈操作 void push(Stack *s, int x) { if (isFull(s)) { printf("Stack is full!\n"); exit(1); } s->data[++s->top] = x; // 先将栈顶指针加1,然后再赋值 } // 出栈操作 int pop(Stack *s) { if (isEmpty(s)) { printf("Stack is empty!\n"); exit(1); } return s->data[s->top--]; // 先返回栈顶元素,然后再将栈顶指针减1 } // 获取栈顶元素 int peek(Stack *s) { if (isEmpty(s)) { printf("Stack is empty!\n"); exit(1); } return s->data[s->top]; } // 判断是否为运算符 int isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 判断操作符的优先级 int priority(char c) { if (c == '*' || c == '/') { return 2; } else if (c == '+' || c == '-') { return 1; } else { return 0; } } // 中缀表达式转后缀表达式 void infixToPostfix(char *infix, char *postfix) { Stack s; initStack(&s); int i = 0, j = 0; while (infix[i]) { if (isdigit(infix[i])) { // 如果是数字,直接输出到后缀表达式中 postfix[j++] = infix[i++]; } else if (infix[i] == '(') { // 如果是左括号,入栈 push(&s, infix[i++]); } else if (infix[i] == ')') { // 如果是右括号,将栈中的元素输出到后缀表达式中,直到遇到左括号 while (!isEmpty(&s) && peek(&s) != '(') { postfix[j++] = pop(&s); } if (!isEmpty(&s) && peek(&s) == '(') { pop(&s); // 弹出左括号 } i++; } else if (isOperator(infix[i])) { // 如果是运算符 while (!isEmpty(&s) && priority(infix[i]) <= priority(peek(&s))) { postfix[j++] = pop(&s); } push(&s, infix[i++]); } else { printf("Invalid character!\n"); exit(1); } } while (!isEmpty(&s)) { // 将栈中的元素输出到后缀表达式中 postfix[j++] = pop(&s); } postfix[j] = '\0'; // 后缀表达式以'\0'结尾 } // 计算后缀表达式的值 int calculate(char *postfix) { Stack s; initStack(&s); int i = 0; while (postfix[i]) { if (isdigit(postfix[i])) { // 如果是数字,将其转换为整数,然后入栈 int num = 0; while (isdigit(postfix[i])) { num = num * 10 + postfix[i] - '0'; i++; } push(&s, num); } else if (isOperator(postfix[i])) { // 如果是运算符,弹出栈顶的两个元素,进行运算,然后将结果入栈 int b = pop(&s); int a = pop(&s); switch (postfix[i]) { case '+': push(&s, a + b); break; case '-': push(&s, a - b); break; case '*': push(&s, a * b); break; case '/': push(&s, a / b); break; } i++; } else { printf("Invalid character!\n"); exit(1); } } return pop(&s); // 最终栈中的元素就是计算结果 } int main() { char infix[MAXLEN], postfix[MAXLEN]; printf("Please enter an infix expression (with parentheses): "); fgets(infix, MAXLEN, stdin); // 从标准输入中读取中缀表达式 infixToPostfix(infix, postfix); // 将中缀表达式转换为后缀表达式 printf("The postfix expression is: %s\n", postfix); int result = calculate(postfix); // 计算后缀表达式的值 printf("The result is: %d\n", result); return 0; } ``` 这个计算器可以进行括号四则运算,例如输入"(3+4)*5-6/2",输出结果为"374+5*62/-"和"23"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值