简单计算器

  • 题目要求:
  • 思路:
    • 如何将等式的元素保存到数组中?
    • 如何利用等式数组进行从左向右的运算?
  • 代码

题目要求:

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:

1+2*10-10/2=

输出样例:

10

思路:

如何将等式的元素保存到数组中?

创建一个int数组,保存输入的等式元素。
不能对所有的元素都使用getchar()因为数字可能有多位。
因为每当读取一个运算符后(不包括‘=’),后面必定是一个数字,
所以可以每次读取并储存一个运算符后,
用scanf("%d",&equal[i])读取并储存一个数字。
这样就实现了将等式的所有元素都保存在等式数组中。
代码片段如下:

 int equal[100] = {0};                  //建立等式数组int c;                                  //创建字符变量int i = 0, j, cnt;                     //运算符指针, 右操作数指针, 计算次数int right;                               //创建右操作数变量int tot;                              //创建累积量scanf("%d", &equal[i]);                    //先把第一个数字储存到等式数组中i++;                                 //让储存等式元素的数组的索引+1while( (c = getchar()) != '='){equal[i] = c;                        //读取运算符号i++;                              //让储存等式元素的数组的索引+1scanf("%d", &equal[i++]);         //读取数字并让储存等式元素的数组的索引+1//(即不管读取的是数字还是符号都需要让索引+1)switch (c)                           //如果读取了不是运算符号的字符,返回EORROR{case '+':break;case '-':break;case '*':break;case '/':break;default:printf("ERROR\n");return 0;}if (c == '/' && equal[i-1] == 0)  //如果被除数是0,返回ERROR{printf("ERROR\n");return 0;}}

如何利用等式数组进行从左向右的运算?

假设输入的字符串是1 + 2 * 10 - 10 / 2 =
通过上述保存等式数组的方法,得到的数组是:

元素 1 + 2 * 10 - 10 / 2
索引 0 1 2 3 4 5 6 7 8

p.s.所有的运算符都是通过ASCII码的形式储存的,是int型,想得到字符类型需要用到类型转化,即(char)equal[i]

通过观察可以发现
运算符的索引是奇数(2n +1 )
算子(我更喜欢叫操作数)的索引是偶数(2
n)。
于是我们可以建立一个累积变量(tot),让这个累计变量(tot)成为为运算的左操作数,元素中的每一个数字(除了第一个)成为右操作数。
e.g.

tot = 1 i = 1; j = 2;
tot + 2 = 3 --> tot = 3 n = 1;+ ----> equal(1) ; 2 ----> equal(2); i = 2 *n +1 = 3; n = n + 1 = 2; j = 2 * n = 4;
tot *10 = 30 --> tot = 30 n = 2;* ----> equal(3) ; 10 ----> equal(4); i = 2 *n +1 = 5;n = n + 1 = 3; j = 2 * n =6 ;
tot - 10 = 20 --> tot = 20 n = 3; + ----> equal(5) ; 2 ----> equal(6); i = 2 *n +1 = 7; n = n + 1 = 4; j = 2 * n = 8;
tot / 2 = 10 --> tot = 10 n = 4; + ----> equal(7) ; 2 ----> equal(8); i = 2 *n +1 = 9; n = n + 1 = 5; j = 2 * n = 10;

代码片段如下:

int lene = i;                           // lene ---> length of equaltot = equal[0];                         // tot  ---> total(累加值)right = equal[2];                      // right---> 右操作数(equal[0,2,4,6,8,...])for (i = 1, j = 2, cnt = 1; i < lene;)  // 计算等式(tot + or - or * or / equal[0,2,4,6,8,...]){switch ((char)equal[i]){case '+'://printf("hr+\n");tot += right;//printf("tot = %d\n",tot);break;case '-'://printf("hr-\n");tot -= right;//printf("tot = %d\n",tot);break;case '*'://printf("hr*\n");tot *= right;//printf("tot = %d\n",tot);break;case '/'://printf("hr/\n");tot /= right;//printf("tot = %d\n",tot);break;}i = 2 * cnt + 1;                  // i是指向运算符号的指针,i = 1,3,5,7....cnt++;                              // 计算的次数j = 2 * cnt;                       // j是指向右操作数的指针, j = 2,4,6,8.....right = equal[j]; }

最后tot的值即为等式的结果。

代码

#include <stdio.h>int main()
{int equal[100] = {0};                 //建立等式数组int c;                                  //创建字符变量int i = 0, j, cnt;                     //运算符指针, 右操作数指针, 计算次数int right;                               //创建右操作数变量int tot;                              //创建累积量scanf("%d", &equal[i]);                    //先把第一个数字储存到等式数组中i++;                                 //让储存等式元素的数组的索引+1while( (c = getchar()) != '='){equal[i] = c;                        //读取运算符号i++;                              //让储存等式元素的数组的索引+1scanf("%d", &equal[i++]);         //读取数字并让储存等式元素的数组的索引+1(即不管读取的是数字还是符号都需要让索引+1)switch (c)                         //如果读取了不是运算符号的字符,返回EORROR{case '+':break;case '-':break;case '*':break;case '/':break;default:printf("ERROR\n");return 0;}if (c == '/' && equal[i-1] == 0)  //如果被除数是0,返回ERROR{printf("ERROR\n");return 0;}}int lene = i;                          // lene ---> length of equaltot = equal[0];                         // tot  ---> total(累加值)right = equal[2];                      // right---> 右操作数(equal[0,2,4,6,8,...])for (i = 1, j = 2, cnt = 1; i < lene;)  // 计算等式(tot + or - or * or / equal[0,2,4,6,8,...]){switch ((char)equal[i]){case '+'://printf("hr+\n");tot += right;//printf("tot = %d\n",tot);break;case '-'://printf("hr-\n");tot -= right;//printf("tot = %d\n",tot);break;case '*'://printf("hr*\n");tot *= right;//printf("tot = %d\n",tot);break;case '/'://printf("hr/\n");tot /= right;//printf("tot = %d\n",tot);break;}i = 2 * cnt + 1;                  // i是指向运算符号的指针,i = 1,3,5,7....cnt++;                              // 计算的次数j = 2 * cnt;                       // j是指向右操作数的指针, j = 2,4,6,8.....right = equal[j]; }printf("%d\n", tot);                  //  打印出最后的计算值return 0;
}

简单计算器(C 语言实现)相关推荐

  1. PTA 基础编程题目集 7-12 两个数的简单计算器 C语言

    PTA 基础编程题目集 7-12 两个数的简单计算器 C语言 本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加.减.乘.除或求余运算.题目保证输入和输出均不超过整型范围. 输入格式 ...

  2. c语言设计简单计算器,c语言设计简单计算器实现加减乘除运算

    编写程序的目的就是使程序有他应用的地方,编写一个简单的计算器来实现我们计算的目的. 利用swich  case 语句和循环结构来实现简单程序的编写.利用选择语句来进行输入的选择,然后利用所输入的数字的 ...

  3. c语言对10求余不为7,【PTA | 基础编程题目集】7-12 两个数的简单计算器 (10分)

    本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加.减.乘.除或求余运算.题目保证输入和输出均不超过整型范围. 输入格式: 输入在一行中依次输入操作数1.运算符.操作数2,其间以1个 ...

  4. c语言程序 实现简单计算器功能,C语言实现简单计算器小项目

    昨天刚安装上devc++,半夜想着练练C语言吧 于是就看到实验楼有一个计算器的项目 之前做过一次,这次写的主要是思路 首先我们先从原理思考jia,实现简单的计算器就要具备加减乘除这些,看普通的计算器也 ...

  5. html语言简单,简单的html语言计算器

    <简单的html语言计算器>由会员分享,可在线阅读,更多相关<简单的html语言计算器(3页珍藏版)>请在人人文库网上搜索. 1.简单的计算器源码如图:代码input.MyBu ...

  6. 计算器软件C语言课程设计实验报告,c简单计算器实验报告_相关文章专题_写写帮文库...

    时间:2019-05-15 12:55:15 作者:admin 计算器实验报告 班级: 07计本(1)班 姓名: 王林 学号: 20706031047 指导老师: 韩静 一. 需求分析 (1)制作一个 ...

  7. c语言课程设计之简易计算器,简易计算器课程设计 帮忙写简单计算器课程设计...

    帮忙写简单计算器课程设计书繁华若真如一梦,过而无痕多好,人就不必失意,只当醉了一场,醒来仍过平淡的生活. 程序 #include #include //定义atlf函数 #include 简介下的 要 ...

  8. c语言——简单计算器

    c语言--简单计算器--加.减.乘.除 #define _crt_secure_no_warnings#include<stdio.h> void menu() {printf(" ...

  9. C语言简单计算器报告5000字,c语言简单计算器报告.docx

    c语言简单计算器报告 xxxx大学信息科学与工程学院 课程设计报告 班级:姓名:实验项目名称: 实验室(中心):指导教师: 实验完成时间: 通信工程一班 xxx 简易计算器信息科学与工程学院信息技术实 ...

最新文章

  1. “由于/bin 不在PATH 环境变量中,故无法找到该命令”
  2. Spring集成Mybatis,spring4.x整合Mybatis3.x
  3. js 校验验证码 知识点
  4. VS2008 快捷键 大全
  5. 超级干货|UI免费资源集合地,分享乐园,为UI设计师减少70%加班时间
  6. 计算机日志研究方法,基于日志的计算机取证技术研究与实现
  7. 解决 jsp:include 引用文件时出现乱码的问题
  8. vc2017 c语言运行,vc++2017下载|vc++2017运行库 32位64位 官方版 - 软件下载 - 绿茶软件园|33LC.com...
  9. Milvus 在 AVX-512 与 AVX2 的性能对比
  10. 【Android 开发入门】我为什么要在Android找工作越来越难的时候开始学习它
  11. oracle数据库怎么切换实例,oracle切换数据库实例
  12. 陶哲轩(Terence Tao)对从事数学职业的建议
  13. Android广告图片轮播控件,banner的简单使用
  14. .Net平台下的B/S开发框架
  15. 开始用巴别小精灵强化英语单词记忆
  16. mysql二亿大表_面对有2亿条数据的mysql表
  17. brew 一直等待_壹配资网门户技术解盘20201104:尿素遇阻回落 铜等待突破-股票外汇期货配资门户...
  18. SQLite自动切换32位64位dll兼容32位和64位问题 X86 X64
  19. excel文件保护工作表无法编辑,忘记密码时解决办法
  20. IDEA输入字母间距变大报红处理方法

热门文章

  1. 2015年9月10日
  2. oracle 查询索引个数,Oracle数据库索引的创建和查询
  3. jQuery元素操作-遍历元素
  4. 下午三点半,公司空空荡荡
  5. Skywalking系列博客6-手把手教你编写 Skywalking 插件
  6. 【醒悟】揭露炸鸡鸭背后的真相:一位良心发现者的自白
  7. VsCode配置快速注释
  8. ViewFlipper和ViewPager
  9. 第一周:数据的描述性统计
  10. Binding的三种方式