‘壹’ 有人可以用C语言编个多功能计算器吗
#include<iostream>
#include"Stack.h"
using namespace std;
/*@author sasa*/
Status Stack::InitStack(SqStack &S){ //初始化构造一个空栈
S.base = new SElemType[STACK_INIT_SIZE];
if(!S.base) exit(OVERFLOW); //存储失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status Stack::GetTop(SqStack S,SElemType &e){ //返回栈顶元素
if(S.top == S.base) return ERROR;
e = *(S.top-1);
return OK;
}
Status Stack::Push(SqStack &S, SElemType e){ //插入元素e为新的栈顶元素
//栈满,追加存储空间
if(S.top - S.base >=S.stacksize){
S.base = new SElemType[S.stacksize + STACKINCREMENT];
if(!S.base) exit(OVERFLOW); //存储分配失败
S.top = S.base + S.stacksize;
S.stacksize +=STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
Status Stack::Pop(SqStack &S,SElemType &e){ //删除S的栈顶元素,用e返回
if(S.top == S.base) return ERROR;
e = * --S.top;
return OK;
}
Status Stack::StackEmpty(SqStack S){ //判断是否空栈,空栈返回true
if(S.top==S.base)
return true;
else
return false;
}
我编的小型计算器程序,能计算普通+,-,*,/,和带括号的表达式,使用顺序栈的数据结构,程序如下:
//////////////////////////////////////////////
#include "iostream"
#include "string"
using namespace std;
//---------------------------------- Stack.h --------------------------
//定义Stack类
const maxsize=20;
enum Error_code { success, overflow, underflow };
template <class T>
class Stack {
public:
Stack();
bool empty() const;
bool full() const;
int size() const;
void clear();
Error_code top(T &item) const;
Error_code pop();
Error_code push(const T &item);
private:
int count;
T entry[maxsize];
};
template <class T>
Stack<T>::Stack() {
count=0;
}
template <class T>
bool Stack<T>::empty () const {
return count==0;
}
template <class T>
bool Stack<T>::full () const {
return count==maxsize;
}
template <class T>
int Stack<T>::size() const {
return count;
}
template <class T>
void Stack<T>::clear() {
count=0;
}
template <class T>
Error_code Stack<T>::top (T &item) const {
if (empty()) return underflow;
item= entry[count-1];
return success;
}
template <class T>
Error_code Stack<T>::pop () {
if (empty()) return underflow;
count--;
return success;
}
template <class T>
Error_code Stack<T>::push (const T &item) {
if (full()) return overflow;
entry[count++]=item;
return success;
}
//------------------------------------------额外函数------------------
bool user_says_yes()
{
int c;
bool initial_response = true;
do { // Loop until an appropriate input is received.
if (initial_response)
cout << " (y,n)? " << flush;
else
cout << "Respond with either y or n: " << flush;
do { // Ignore white space.
c = cin.get();
} while (c == '\n' || c ==' ' || c == '\t');
initial_response = false;
} while (c != 'y' && c != 'Y' && c != 'n' && c != 'N');
return (c == 'y' || c == 'Y');
}
//---------------------------------- Main Program ----------------------
Stack<char> sign;
Stack<double> num;
int set; // 判断程序中的异常,以便适时退出
void process(char c) { //计算两个数的 + - * / 运算
int k=0;
double a,b;
sign.pop();
if (num.top(b)==success){ //判断例外
num.pop();
if (num.top(a)==success) {
num.pop();
k=1;
}
}
if (k) {
switch (c) {
case '+': num.push(a+b); break;
case '-': num.push(a-b); break;
case '*': num.push(a*b); break;
case '/':
if (b==0) { //分母不能为0
set=4;
num.push(-1);
}
else
num.push(a/b);
break;
}
}
else {set=1;num.push(-1);}
}
//输入表达式
void get_command(string &str) {
cout<<"\n请输入要进行运算的表达式,包括\" +,-,*,/,=,(,)\"和数字,"<<endl
<<"例如:\" 3+2.5*(6-25/4)-8.32= \"."<<endl
<<"注意: 以数字开头,等号结尾,中间括号要匹配."<<endl;
cin>>str;
}
//求值 表达式
double do_command(const string &str) {
string s="";
double outcome=-1;
char c;
for (int i=0;str[i]!='\0';i++)
{
if (set!=0) break; //例外 则停止运行
while (1) { //分离数据与运算符
if (str[i]<='9' && str[i]>='0' || str[i]=='.') {
s+=str[i];
i++;
}
else {
if(s!="") {
if (num.push(atof(s.c_str ()))==overflow)
set=3;
s="";
}
break;
}
}
char ch= str[i];
switch (ch) { //处理运算的优先级,并注意例外抛出
case '*':
case '/':
if (sign.top(c)==success)
if(c=='*'||c=='/') process(c);
if (sign.push(ch)==overflow)
set=3;
break;
case '+':
case '-':
while (sign.top(c)==success) {
if (c!='(') process(c);
else break;
}
if (sign.push(ch)==overflow)
set=3;
break;
case '(':
if (sign.push(ch)==overflow)
set=3;
break;
case ')':
while (sign.top(c)==success) {
if (c!='(') process(c);
else break;
}
sign.pop();
break;
case '=':
while (sign.top(c)==success) {
if (c!='(') process(c);
else break;
}
break;
default: set=2;break;
}
}
if (num.size()==1 && sign.size()==0)
num.top(outcome);
else set=1;
if (set==0) cout<<"运算结果是:\n"<<endl; //出错时的错误信息
else {
outcome=-1;
if (set==1) cout<<"\n您输入的不匹配,有错误发生。Result lost!!"<<endl;
if (set==2) cout<<"\n您输入了非法字符 , 请重新输入,谢谢合作!"<<endl;
if (set==3) cout<<"\nStack is full, Lost result!!"<<endl;
if (set==4) cout<<"\n 分母为0,不能进行除法运算,出现溢出, Lost result!!"<<endl;
}
return outcome;
}
// 主程序main()
int main() {
do {
string str,s;
set=0;
get_command(str);
s=str;
if( str[0]=='-') str='0'+str; //处理表达式中的负号
for (int i=1;str[i]!='\0';i++) {
if (str[i]=='-' && str[i-1]=='(') {
str.insert (i,"0");
i++;
}
}
double out= do_command(str);
cout<<s<<out<<endl; //输出结果
num.clear(); //清空栈
sign.clear();
cout<<"\n还要计算其它的吗"<<flush;
}while (user_says_yes()); //允许多次执行运算
return 1;
}
/*保存为*.cpp文件*/
‘贰’ 求c程序编多功能计算器
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define UNKNOWN_CHAR 2
#define DIVISOR_IS_ZERO 3
#define FALSE 0
#define TRUE 1
/*定义结构,主要用于GetString函数,可以不管它*/
typedef struct string
{char str;
struct string *next;
}string;
/*函数声明*/
/*可以无限接受字符,输入一个字符就给你个空间,返回一个字符串首地址 . */
/*这个函数可以看成普通的scanf()*/
char *GetString();
/*从字符串str第*rank个字符开始分析直到遇到 ')' or ']' or '}' or '\0' . */
/*有错误就把错误代号装在*errorNum中,返回从中计算出的值*/
double GetASResultOf(char * str, int *rank, int *errorNum);
/*从字符串str第*rank个字符开始分析直到遇到不符合要求的字符,返回这个单位值.*/
/*如:str="12+sin(30)+[12+cos(60)]"
GetUnitageOf(str,0,errorNum)=12
GetUnitageOf(str,3,errorNum)=0.5
GetUnitageOf(str,11,errorNum)=12.5 */
double GetUnitageOf(char * str, int *rank, int *errorNum);
/*Are you ready? Let's go!----------------------------------*/
int main()
{
/*定义变量*/
double value;
int rank=0;
int errorNum=TRUE;
char * str;
/*接收字符*/
printf("counter v1.0\n");
printf("Made by PT\n");
printf("Date 2005-07-16\n\n");
printf("Please input your arithmetic:\n");
str=GetString();
/*调用处理函数,*/
value = GetASResultOf(str, &rank, &errorNum);
/*错误处理(没完善)*/
if (errorNum==TRUE) printf("The result is: %lf\n",value, rank);
else if (errorNum==UNKNOWN_CHAR) printf("char error!\n");
else if (errorNum==DIVISOR_IS_ZERO) printf("Divisor could not be 0\n");
else printf("Other error\n");
getch();
return 0;
}
/*0==[=========>无限动态字符接受函数*/
char *GetString()
{
char *CharToString(string * sHead, int arraySize);
int arraySize=0;
string *s;
string *sHead;
s = (string *)malloc(sizeof(string));
sHead = s;
s->str = getchar();
arraySize++;
while((s->str)!='\n')
{
arraySize++;
s->next=(string *)malloc(sizeof(string));
s=s->next;
s->str=getchar();
}
return CharToString(sHead, arraySize);
}
char *CharToString(string * sHead, int arraySize)
{
char *strArray;
string *s=sHead;
int i=0;
strArray = (char*)malloc(arraySize*sizeof(char));
while(i<arraySize)
{
if (s->str=='=' || s->str=='\n') break;
if (s->str!=32) strArray[i++]=s->str;
s=s->next;
}
strArray[i]='\0';
return strArray;
}
/*0==[=========> 得到一个单位的值*/
double GetUnitageOf(char * str, int *rank, int *errorNum)
{
double CharToNum(char * str, int *rank);
double value;
/*如果是数字或负号就返回这个数字*/
if ((str[*rank]>=48 && str[*rank]<=57) || (str[*rank]=='-'))
{if (str[*rank]=='-') {(*rank)++;value = (-1)*GetUnitageOf(str, rank,errorNum);}
else {value = CharToNum(str, rank);}}
/*如果是括号就用GetASResultOf取得括号里面的值并返回*/
else if (str[*rank]=='(' ||
str[*rank]=='[' ||
str[*rank]=='{' )
{(*rank)++;
value = GetASResultOf(str, rank, errorNum);}
/*返回sin(x)*/
else if (str[*rank]=='s' &&
str[(*rank)+1]=='i' &&
str[(*rank)+2]=='n')
{ (*rank)=(*rank)+3;
value = GetUnitageOf(str, rank, errorNum);
value = sin(value);
}
/*返回cos(x)*/
else if (str[*rank]=='c' &&
str[(*rank)+1]=='o' &&
str[(*rank)+2]=='s')
{*rank=*rank+3;
value = cos(GetUnitageOf(str, rank, errorNum));}
/*返回tan(x)*/
else if (str[*rank]=='t' &&
str[(*rank)+1]=='a' &&
str[(*rank)+2]=='n')
{*rank=*rank+3;
value = tan(GetUnitageOf(str, rank, errorNum));}
/*还可以加一些的,懒得加了*/
/*defult:处理错误*/
else {*errorNum = UNKNOWN_CHAR;value = 0;}
/*检查errorNum*/
if (*errorNum==TRUE){return value;}
else return FALSE;
}
/*0==[=========>这个是把字符转换成数字的函数,只在GetUnitageOf()里用*/
/*数字不能超过15个,其余的将被抹去.*/
double CharToNum(char * str, int *rank)
{
int j=0;
double value=0;
while((str[*rank]>=48 && str[*rank]<=57) || (str[*rank]==46))
{
if (str[*rank]!='.')
{if ((j++)<=15) {value = value*10+(str[*rank]-48);}}
else
{if (j<=15)
{
for ((*rank)++,j=1; (str[*rank]>=48 && str[*rank]<=57 && str[*rank]!='\0'); (*rank)++, j++)
{value = value+(str[*rank]-48)*pow(0.1,j);}
return value;
}
}
(*rank)++;
}
return value;
}
/*0==[=========>这个函数写的太复杂了,实在不好作解释,反正是在GetPDResultOf
函数和GetUnitageOf函数之间转啊转的*/
/*简单地说就是把str中第一个加减号前的式子算出来放在value变量中.再用函数
GetPDResultOf算出直到二个加减号前的式子然后与value相加或相减放在
变量value中,以此类推,直到遇上 ')' or ']' or '}' or '\0' */
double GetASResultOf(char * str, int *rank, int *errorNum)
{
double GetPDResultOf(char * str, int *rank, int *errorNum);
double value;
double dwIf_Zero;
/*遇上 ')' or ']' or '}' or '\0' 就返回*/
while (str[*rank]!=')' &&
str[*rank]!=']' &&
str[*rank]!='}' &&
str[*rank]!='\0')
{
if ((str[*rank]>=48 && str[*rank]<=57) ||
str[*rank]=='s' ||
str[*rank]=='c' ||
str[*rank]=='t')
{
if ((str[*rank-1]==')' ||
str[*rank-1]==']' ||
str[*rank-1]=='}') &&
*rank!=0)
{value = value*GetUnitageOf(str, rank, errorNum);}
else
{value = GetUnitageOf(str, rank, errorNum);}
}
else if (str[*rank]=='+')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value + GetPDResultOf(str, rank, errorNum);}
else {*errorNum=UNKNOWN_CHAR;return 0;}}
else if (str[*rank]=='-')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value - GetPDResultOf(str, rank, errorNum);}
else {value = GetUnitageOf(str, rank, errorNum);}}
else if (str[*rank]=='*')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value * GetUnitageOf(str, rank, errorNum);}
else {*errorNum=UNKNOWN_CHAR;return 0;}}
else if (str[*rank]=='/')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++;
dwIf_Zero=GetUnitageOf(str, rank, errorNum);
if (dwIf_Zero==0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
else value = value /dwIf_Zero;}
else {*errorNum=UNKNOWN_CHAR;return 0;}}
else if (str[*rank]== '(' ||
str[*rank]== '[' ||
str[*rank]== '{' )
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value*GetASResultOf(str, rank, errorNum);}
else {value = GetUnitageOf(str, rank, errorNum);}}
else {*errorNum=UNKNOWN_CHAR;return FALSE;}
if (*errorNum!=TRUE) return FALSE;
}
(*rank)++;
return value;
}
double GetPDResultOf(char * str, int *rank, int *errorNum)
{
double value;
double dwIf_Zero;
value = GetUnitageOf(str, rank, errorNum);
if (str[*rank]=='\0') return value;
while (str[*rank]!='+' &&
str[*rank]!='-' &&
str[*rank]!=')' &&
str[*rank]!=']' &&
str[*rank]!='}')
{
if (str[*rank]=='*')
value = value * GetUnitageOf(str, rank, errorNum);
else if (str[*rank]=='/')
{
dwIf_Zero= GetUnitageOf(str, rank, errorNum);
if (dwIf_Zero=0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
else value = value /dwIf_Zero;
}
else if (str[*rank]=='(' ||
str[*rank]=='[' ||
str[*rank]=='{')
{(*rank)++;
value = value * GetUnitageOf(str, rank, errorNum);}
else {*errorNum=UNKNOWN_CHAR;return FALSE;}
if (*errorNum!=TRUE) return FALSE;
}
return value;
}
‘叁’ 多功能计算器有哪些类型
多功能计算器有
函数机:比如卡西欧FX82,FX991等,能以自然书写的显示方式计算多种函数
图形机:如卡西欧FX10,9860等,可以计算各种函数并显示函数图像
程序机:可以用特定语言编辑保存计算程序的组合,多数图形机也带程序功能
主要的计算器品牌有:卡西欧,德州仪器(TI),夏普等
‘肆’ c语言编写“多功能计算器”的代码
#include<stdio.h>
#include<windows.h>
#include<math.h>
double EPS=10E-6;
double sum(double a,double b)
{
return a+b;
}
double sub(double a,double b)
{
return a-b;
}
double mul(double a,double b)
{
return a*b;
}
double divv(double a,double b)
{
return a/b;
}
int rem(int a , int b)
{
return a%b;
}
int addnumber(int c,int d)
{
int sum=0;
for(int i=c;i<=d;i++)
{
sum+=i;
}
return sum;
}
int factor(int n)
{
int f=1;
for(int i=1;i<=n;i++)
{
f*=i;
}
return f;
}
void displaymenu()
{
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ \n");
printf("*############高级计算器############* \n");
printf("************************************ \n");
printf("* ①加法运算 * \n");
printf("* ②减法运算 * \n");
printf("* ③乘法运算 * \n");
printf("* ④除法运算 * \n");
printf("* ⑤取余运算 * \n");
printf("* ⑥累加运算 * \n");
printf("* ⑦阶乘运算 * \n");
printf("* ⊙结束运算 * \n");
printf("************************************ \n");
printf("************************************ \n");
}
void main()
{
int c,d; /*用于做四则运算的两个数值的说明*/
double a,b; /*用来做累加函数的两个参数值的说明*/
int intresult;
double result; /*用于保存表单运算中函数的返回值*/
int choice;
displaymenu();/*保存用户选择项目菜单项*/
while(1)
{
printf("请选择你所进行运算项目的符号:");
scanf("%d",&choice);
switch(choice)
{
case 1: /*加法计算*/
printf("请输入两个数字:");
scanf("%lf%lf",&a,&b);
result=sum(a,b);
printf("%lf+%lf的计算结果是:%lf\n",a,b,result);
break;
case 2: /*减法计算*/
printf("请输入两个数字:");
scanf("%lf%lf",&a,&b);
result=sub(a,b);
printf("%lf-%lf的计算结果是:%lf\n",a,b,result);
break;
case 3: /*乘法计算*/
printf("请输入两个数字:");
scanf("%lf%lf",&a,&b);
result=mul(a,b);
printf("%lf*%lf的计算结果是:%lf\n",a,b,result);
break;
case 4: /*除法计算*/
{
scanf("%lf%lf",&a,&b);
if(b-0.0<EPS) printf("数字错误\n");
else
{
printf("请输入两个数字:");
result=divv(a,b);
printf("%lf/%lf的计算结果是:%lf\n",a,b,result);
}
break;
}
case 5: /*取余计算*/
printf("请输入两个数字:");
scanf("%d%d",&c,&d);
result=rem(c,d);
printf("%d % %d的计算结果是:%d\n",c,d,result);
break;
case 6: /*累加计算*/
printf("请输入两个整数");
scanf("%d%d",&c,&d);
intresult=addnumber(c,d);
printf("%d-%d的累加计算结果是:%d\n",c,d,intresult);
break;
case 7: //阶乘计算
{
printf("请输入一个大于0小于10的整数字");
scanf("%d",&c);
if(c<0||c>10)
{
printf("请输入一个大于0小于10的整数字,数据错误。\n");
break;
}
intresult=factor(c);
printf("%d的阶乘计算结果是:%d\n",c,intresult);
break;
}
case 0:
printf("谢谢使用。欢迎下次再用。\n");
return ;
default:
printf("选择错误,程序结束\n");
break;
}
}
}
‘伍’ 最多功能的计算器中文版电脑版下载
开始菜单里面的附件 里的计算器就能实现
‘陆’ 多功能计算器有哪些功能
开根,解三角。对数等数学计算有关
‘柒’ 卡西欧多功能计算器fx-3800p的RAD DEG GRA什么意思
显示上出现[DEG]、[RAD]、[GRA],代表计算器角度单位被设定为“度”、“弧度”、“梯度(一整圆为400单位)”
较早的型号使用[DRG]键切换角度单位,如fx-80、fx-100型计算器,直接按[DRG]键切换角度单位设置;其后的函数型计算器在按键上方有一列表,说明按[MODE]键后再按其他键后对计算器的一些设置,如按[MODE]+[4],显示屏出现黑底的[D],表示计算器设定角度单位为“度”;按[MODE]+[5],显示屏显示黑底白字[R],表示计算器角度被设定为“弧度”;这个设定只影响有角度参加运算的计算,此时如果显示[RAD],角度输入或运算结果得到的角度是以弧度为单位,不是以度为单位;对一般数字运算没有影响,也无法消除。
至于 SD ,则表示计算器被设定为可以进行统计功能标准偏差值运算,使用[MODE]+[0]键,使计算器设定为[comp]即普通状态,则统计运算功能取消, SD 显示消失。
早期计算器上有[SD]键,按此键取消SD功能。
‘捌’ 我想下载一个多功能计算器 '
先按1.03,然后按X^Y,再按20,最后按=就行了
‘玖’ 多功能计算器如何开根号
先按你要开几次方的方数,按shift键,按朝下的这个符号 “<”我打不出来,按被开方数,按=键出结果。
或逆向思维,用答案选项去试,乘一次原数是平方,再乘原数是三次方,再乘原数是四次方,以此类推。例:3.731531开9次方等于1.157558654 1.1576*1.1576*1.1576……连乘,每乘一次多一次方,乘到9次方得3.73153101143,但书上总给四舍五入,所以数会有一丁点的出入,但不影响你选择正确答案。
‘拾’ 求一款多功能计算器软件。
matlab什么都能算