简单计算器(C 语言实现)
简单计算器
- 题目要求:
- 思路:
- 如何将等式的元素保存到数组中?
- 如何利用等式数组进行从左向右的运算?
- 代码
题目要求:
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为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 )
算子(我更喜欢叫操作数)的索引是偶数(2n)。
于是我们可以建立一个累积变量(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 语言实现)相关推荐
- PTA 基础编程题目集 7-12 两个数的简单计算器 C语言
PTA 基础编程题目集 7-12 两个数的简单计算器 C语言 本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加.减.乘.除或求余运算.题目保证输入和输出均不超过整型范围. 输入格式 ...
- c语言设计简单计算器,c语言设计简单计算器实现加减乘除运算
编写程序的目的就是使程序有他应用的地方,编写一个简单的计算器来实现我们计算的目的. 利用swich case 语句和循环结构来实现简单程序的编写.利用选择语句来进行输入的选择,然后利用所输入的数字的 ...
- c语言对10求余不为7,【PTA | 基础编程题目集】7-12 两个数的简单计算器 (10分)
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加.减.乘.除或求余运算.题目保证输入和输出均不超过整型范围. 输入格式: 输入在一行中依次输入操作数1.运算符.操作数2,其间以1个 ...
- c语言程序 实现简单计算器功能,C语言实现简单计算器小项目
昨天刚安装上devc++,半夜想着练练C语言吧 于是就看到实验楼有一个计算器的项目 之前做过一次,这次写的主要是思路 首先我们先从原理思考jia,实现简单的计算器就要具备加减乘除这些,看普通的计算器也 ...
- html语言简单,简单的html语言计算器
<简单的html语言计算器>由会员分享,可在线阅读,更多相关<简单的html语言计算器(3页珍藏版)>请在人人文库网上搜索. 1.简单的计算器源码如图:代码input.MyBu ...
- 计算器软件C语言课程设计实验报告,c简单计算器实验报告_相关文章专题_写写帮文库...
时间:2019-05-15 12:55:15 作者:admin 计算器实验报告 班级: 07计本(1)班 姓名: 王林 学号: 20706031047 指导老师: 韩静 一. 需求分析 (1)制作一个 ...
- c语言课程设计之简易计算器,简易计算器课程设计 帮忙写简单计算器课程设计...
帮忙写简单计算器课程设计书繁华若真如一梦,过而无痕多好,人就不必失意,只当醉了一场,醒来仍过平淡的生活. 程序 #include #include //定义atlf函数 #include 简介下的 要 ...
- c语言——简单计算器
c语言--简单计算器--加.减.乘.除 #define _crt_secure_no_warnings#include<stdio.h> void menu() {printf(" ...
- C语言简单计算器报告5000字,c语言简单计算器报告.docx
c语言简单计算器报告 xxxx大学信息科学与工程学院 课程设计报告 班级:姓名:实验项目名称: 实验室(中心):指导教师: 实验完成时间: 通信工程一班 xxx 简易计算器信息科学与工程学院信息技术实 ...
最新文章
- “由于/bin 不在PATH 环境变量中,故无法找到该命令”
- Spring集成Mybatis,spring4.x整合Mybatis3.x
- js 校验验证码 知识点
- VS2008 快捷键 大全
- 超级干货|UI免费资源集合地,分享乐园,为UI设计师减少70%加班时间
- 计算机日志研究方法,基于日志的计算机取证技术研究与实现
- 解决 jsp:include 引用文件时出现乱码的问题
- vc2017 c语言运行,vc++2017下载|vc++2017运行库 32位64位 官方版 - 软件下载 - 绿茶软件园|33LC.com...
- Milvus 在 AVX-512 与 AVX2 的性能对比
- 【Android 开发入门】我为什么要在Android找工作越来越难的时候开始学习它
- oracle数据库怎么切换实例,oracle切换数据库实例
- 陶哲轩(Terence Tao)对从事数学职业的建议
- Android广告图片轮播控件,banner的简单使用
- .Net平台下的B/S开发框架
- 开始用巴别小精灵强化英语单词记忆
- mysql二亿大表_面对有2亿条数据的mysql表
- brew 一直等待_壹配资网门户技术解盘20201104:尿素遇阻回落 铜等待突破-股票外汇期货配资门户...
- SQLite自动切换32位64位dll兼容32位和64位问题 X86 X64
- excel文件保护工作表无法编辑,忘记密码时解决办法
- IDEA输入字母间距变大报红处理方法