当前位置:首页 » 编程软件 » 可编译计算器

可编译计算器

发布时间: 2023-01-15 21:26:52

⑴ 怎么用c语言编译计算器可以多个数同时进行运算

这个,全部自己写,略显麻烦,,,,,,,,把数和计算符号,分别拆分,然后判断、计算

⑵ 想用C语言写一款计算器,应该用什么编译器

codeblock
vs
vc
gcc
都可以,计算器这种软件很低级的.基本上能够编译的软件都可以啊

⑶ 求一个C语言编译计算器的程序!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
double f(double a[100],char b[100],int la,int lb)
{
int i,j,k;
for(i=0;i<lb;i++)
{
if(b[i]==’*’)
{
a[i]=a[i]*a[i+1];
for(j=i;j<lb-1;j++)
b[j]=b[j+1];
for(j=i+1;j<la-1;j++)
a[j]=a[j+1];
la--;
lb--;
i--;
}
else if(b[i]==’/’)
{
a[i]=a[i]/a[i+1];
for(j=i;j<lb-1;j++)
b[j]=b[j+1];
for(j=i+1;j<la-1;j++)
a[j]=a[j+1];
la--;
lb--;
i--;
}
}
for(i=0;i<lb;i++)
{
if(b[i]==’+’)
{
a[i]=a[i]+a[i+1];
for(j=i;j<lb-1;j++)
b[j]=b[j+1];
for(j=i+1;j<la-1;j++)
a[j]=a[j+1];
la--;
lb--;
i--;
}
else if(b[i]==’-’)
{
a[i]=a[i]-a[i+1];
for(j=i;j<lb-1;j++)
b[j]=b[j+1];
for(j=i+1;j<la-1;j++)
a[j]=a[j+1];
la--;
lb--;
i--;
}
}

return a[0];
}
main()
{
char b[100],c[100],y[100];
double a[100],s,t,x[100];
int i,j,k,la,lb,l,ld,le,d[100],e[100],g[100],lx,ly;
while(gets(c))
{
i=0;j=0;t=1;l=0;
for(k=0;k<100;k++)
a[k]=0;
s=0;
for(k=0;c[k];k++)
{
if(c[k]>=’0’&&c[k]<=’9’)
if(t==1)
{
s=s*10+c[k]-’0’;

}
else
{
s=s+(c[k]-’0’)*t;
t=t/10;
}
else if(c[k]==’.’)
t=0.1;
else if(c[k]==’+’||c[k]==’-’||c[k]==’*’||c[k]==’/’)
{
b[i]=c[k];
a[i++]=s;

s=0;
t=1;
}
else if(c[k]==’(’)
{

g[j++]=i;

}
else if(c[k]==’)’)
{

e[l++]=i;

}
}
a[i++]=s;
ld=j;
le=l;
la=i;

lb=la-1;
for(i=0;i<ld;i++)
d[i]=g[ld-i-1];

for(i=0;i<ld;i++)
{
for(j=0,k=d[i];k<e[i];k++,j++)
{
x[j]=a[k];
y[j]=b[k];
}
x[j++]=a[k];
lx=j;
ly=j-1;

a[(d[i])]=f(x,y,lx,ly);

k=e[i]-d[i];
for(j=d[i]+1;j<la-1;j++)
{
a[j]=a[j+k];
b[j]=b[j+k];
}
a[j]=a[j+k];
la=la-k;
lb=lb-k;
for(j=i+1;j<ld;j++)
e[j]=e[j]-k;

}
s=f(a,b,la,lb);

printf("s=%lf\n",s);

}
}

//这是c语言表达式求值程序如输入(1+3*5*(2+6))就会输出正确结果

⑷ 学生用计算器怎么玩游戏

网上有购买可编译计算器的,只有这种可编译计算器才可以玩游戏,而且需要自己进行编程和设计,但是我记得好像也可以在网上下载。

⑸ 怎么用C++编译一个简单的计算器

我借鉴了别人的某计算器,因为你没有说多简易...我就找了个差不多的...
/*
程序名称:表达式计算器
编译环境:Microsoft Visual C++ 6.0
作者:吉林大学 计算机科学与技术学院 2006 罗泗勇
时间:200801
*/

/*
说明:
采用树形结构处理表达式,按优先级运算结果,一个加,减,乘,除或数值为一个节点
优先级如下:
函数:4
括号:3
乘除:2
加减:1
*/

#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;

const char NUM[]={'0','1','2','3','4','5','6','7','8','9','.'};
const char OPERATION[]={'+','-','*','/'};
const double PI=3.14159265358979;
const double EE=2.71828182818281;

class Fun //处理系统数学函数的类
{
public:
Fun(string o,int t,double l=0.0,double r=0.0):op(o),type(t),lvalue(l),rvalue(r){}
static string FUN[];
double calc();
private:
int type; //666 0 1 sin90 2 3! 3 3C2
string op; //函数类型
double lvalue; //函数左边的值
double rvalue; //函数右边的值
static int FunNum;
};

int Fun::FunNum=8;
string Fun::FUN[]={"!","sin","cos","tan","log","ln","C","A","^"};
/*
函数说明:
1:log是以10为底的工程对数
2:ln 是以e为底的自然对数
3:C 计算组合数 输入规则 如计算 3取2的组合 输入表达式 3C2
4:A 计算排列数 输入规则 如计算 3取2的排列 输入表达式 3A2
5:! 计算阶乘
6:^ x的y次方 输入 x^y
*/

int factorial(int n) //阶乘函数
{
int i,s=1;
for(i=1;i<=n;i++)
s*=i;
return s;
}

int C(int a,int b)
{
return factorial(a)/(factorial(b)*factorial(a-b));
}

int A(int a,int b)
{
return factorial(a)/factorial(b);
}

double Fun::calc() //计算系统函数的值
{
if(type==0)
return lvalue;
else
{
if(op=="!")
return factorial(lvalue);
if(op=="sin")
return sin(rvalue/180*PI);
if(op=="cos")
return cos(rvalue/180*PI);
if(op=="tan")
return tan(rvalue/180*PI);
if(op=="log")
return log10(rvalue);
if(op=="ln")
return log10(rvalue)/log10(EE);
if(op=="C")
return C(lvalue,rvalue);
if(op=="A")
return A(lvalue,rvalue);
if(op=="^")
return pow(lvalue,rvalue);
else
{
string err="暂时没有函数"+op;
MessageBox(NULL,err.c_str(),"错误",MB_OK);
return 0;
}
}
}

struct Unit //双向链表保存运算单元
{
Unit(int p,char o,string c,double v,int t,Unit * pr=NULL,Unit * n=NULL)
:PRI(p),Operation(o),Code(c),value(v),Type(t),Pre(pr),Next(n){}
int PRI; //优先级

char Operation; //操作符
string Code; //原始代码
double value; //数据

int Type; //类型 操作符0 数据1 函数2
Unit * Pre; //构成双向链表
Unit * Next;
};

class Node //表达式树状结构的节点
{
public:
Node(char o,int p,int e=1,double v=0,Node * ph=NULL,Node * pl=NULL,Node * pr=NULL)
:Operation(o),PRI(p),Expression(e),value(v),Head(ph),Left(pl),Right(pr){}
Node * Head; //节点的根,左树枝,右树枝
Node * Left;
Node * Right;
double GetValue();
char GetOperation() const {return Operation;}
int GetPri() const {return PRI;}
int IsExp() const {return Expression;}
private:
char Operation; //操作符
int PRI; //优先级
int Expression; //记录该节点是否是表达式0 1
double value; //该节点的值
};

double Node::GetValue() //运算该节点的值
{
if(IsExp()) //该节点的值还未算出来
{
double lvalue,rvalue;
lvalue=Left->GetValue();
rvalue=Right->GetValue();
Expression=0;
char op=GetOperation();
switch(op)
{
case '+':
return lvalue+rvalue;
case '-':
return lvalue-rvalue;
case '*':
return lvalue*rvalue;
case '/':
return lvalue/rvalue;
default:
return 0;
}
}
else
return value;
}

bool Isnum(char c)
{
for(int i=0;i<sizeof(NUM);i++)
{
if(c==NUM[i])
return true;
}
return false;
}

bool Isoperation(char c)
{
for(int i=0;i<sizeof(OPERATION);i++)
{
if(c==OPERATION[i])
return true;
}
return false;
}

Unit * Analyse(string exp) //分析表达式并生成链表
{
int pri=0; //当前优先级
int stat=-1; //当前的读入状态 括号 0 数据 1 运算符 2
Unit * head=NULL,* p=NULL;
int i=0,explen;
explen=exp.size();
for(i=0;i<explen;i++)
{
char c=exp.at(i);
if(c=='(')
{
pri+=3;
stat=0;
}
else if(c==')')
{
pri-=3;
stat=0;
}
else if(Isoperation(c)) //操作符不会出现在表达式开头
{
Unit * temp=p;
int add_pri; //自身增加的优先级
if(c=='+' || c=='-')
add_pri=1;
else
add_pri=2;
p->Next=new Unit(pri+add_pri,c," ",0,0);
p=p->Next;
p->Pre=temp;
}
else //其他的当做函数处理
{
string function="";
while(i<explen && (c=exp.at(i),! Isoperation(c)) && c!=')')
{
function+=c;
i++;
}
i--;

if(head==NULL)
{
p=new Unit(pri,' ',function,0,2);
head=p;
}
else
{
Unit * temp=p;
p->Next=new Unit(pri,' ',function,0,2);
p=p->Next;
p->Pre=temp;
}
}
}
return head;
}

Unit * Calc(Unit * head) //计算双向链表基本单元的值
{
Unit * p=head;
while(p!=NULL)
{
if(p->Type!=0) //非操作符
{
string temp=p->Code;
string op;
double lvalue=0,rvalue=0;
int l_point=0,r_point=0;
int i=0,type=0;
char ch;
while(i<temp.size() && (ch=temp.at(i),Isnum(ch)))
{
if(ch=='.')
{
l_point++;
i++;
continue;
}
if(! l_point)
lvalue*=10;
lvalue+=(ch-'0')*pow(10,-l_point);
i++;
if(l_point)
l_point++;
}
while(i<temp.size() && (ch=temp.at(i),! Isnum(ch)))
{
op+=ch;
type=1;
i++;
}
while(i<temp.size() && (ch=temp.at(i),Isnum(ch)))
{
if(ch=='.')
{
r_point++;
i++;
continue;
}
if(! r_point)
rvalue*=10;
rvalue+=(ch-'0')*pow(10,-r_point);
i++;
if(r_point)
r_point++;
}
Fun * f=new Fun(op,type,lvalue,rvalue);
p->value=f->calc();
}
p=p->Next;
}
return head;
}

Node * Tree(Unit * head) //生成表达式树
{
Node * root=NULL,* proot=NULL,* pbranch=NULL;
Unit * p=head;
int now_pri; //当前优先级
bool hadop=false;
while(p!=NULL)
{
if(p->Type==0) //如果是一个操作符
{
hadop=true;
if(root==NULL)
{
proot=new Node(p->Operation,p->PRI,1);
root=proot;
pbranch=root;
now_pri=p->PRI;
proot->Left=new Node(' ',0,0,p->Pre->value);
proot->Right=new Node(' ',0,0,p->Next->value);
}
else
{
if(p->PRI<=now_pri) //优先级低于当前优先级,树根方向 //最初写的 if(p->PRI<now_pri),9/3/3=9,错的
{
proot=new Node(p->Operation,p->PRI,1); //新的树根
proot->Left=root; //根的变换
proot->Right=new Node(' ',0,0,p->Next->value);
root=proot;

pbranch=proot; //右树枝的变换
//pbranch->Right=new Node(' ',0,0,p->Pre->value); //树枝右边取值
}
else
{
Node * temp;
temp=new Node(p->Operation,p->PRI,1);

pbranch->Right=temp;
temp->Head=pbranch;

pbranch=pbranch->Right;
pbranch->Left=new Node(' ',0,0,p->Pre->value);
pbranch->Right=new Node(' ',0,0,p->Next->value);
}
now_pri=p->PRI;
}
}
p=p->Next;
}
if(! hadop)
root=new Node(' ',0,0,head->value);
return root;
}

int main()
{
string exp;

//ifstream infile("test.txt",ios::in);
while(! getline(cin,exp).eof())
{
if(exp=="")
continue;
Unit * h=Analyse(exp);
h=Calc(h);
Node * root=Tree(h);
cout<<exp<<"="<<root->GetValue()<<endl;
}
return 0;
}

⑹ vs2010编译简单计算器窗体

先看看图片 说明以上控件动态生成的,初学可自己拖放控件,以下代码仅供参考 /*设计一个简单的四则计算器*/ string[]名称={"+","-","*","/"}; Button[]控件组=Array.ConvertAll(名称,控件=>newButton()); EventHandler[]按钮事件=newEventHandler[]{按钮加_Click,按钮减_Click,按钮乘_Click,按钮除_Click}; foreach(Button按钮in控件组) { 按钮.Text=名称[--数]; 按钮.Name="按钮"+数.ToString(); 按钮.Parent=this; 按钮.Anchor=(AnchorStyles.Top|AnchorStyles.Left); 按钮.Location=newPoint(100*数,17); 按钮.Click+=按钮事件[数]; } 名称=newstring[]{"值1","值2","结果"}; TextBox[]数字输入框=Array.ConvertAll(名称,控件=>newTextBox()); 数=3; foreach(TextBox输入框in数字输入框) { 输入框.Text=(--数+10).ToString(); 输入框.Name="输入框"+名称[数]; 输入框.Parent=this; 输入框.Anchor=(AnchorStyles.Top|AnchorStyles.Left); 输入框.Location=newPoint(100*数,0); } void按钮加_Click(objectsender,EventArgse) { 四则运算("+"); } void按钮减_Click(objectsender,EventArgse) { 四则运算("-"); } void按钮乘_Click(objectsender,EventArgse) { 四则运算("*"); } void按钮除_Click(objectsender,EventArgse) { 四则运算("/"); } void四则运算(string运算符) { Control.ControlCollection文本框=this.Controls; double值1=int.Parse(文本框[9].Text),值2=int.Parse(文本框[8].Text); switch(运算符) { case"+": {文本框[7].Text=(值1+值2).ToString();} break; case"-": {文本框[7].Text=(值1-值2).ToString();} break; case"*": {文本框[7].Text=(值1*值2).ToString();} break; case"/": {文本框[7].Text=(值1/值2).ToString();} break; default: break; } }

⑺ 用C语言编译一个简单计算器的程序,要求其中有括号和幂函数

既然大家都没发程序,I am coming.
说明:由于幂的运算应该比括号低比乘除要高,所以为避免混淆用幂运算时用括号括起来,比如2+9/3^2-5表示2+(9/3)^2-5,要是想要9除以3^2,这样输入:2+9/(3^2)-5,以免引起歧义。
程序功能强大代码简练。可以对任意数值类型计算,这里全部按double型处理,程序还可以使用大括号{}中括号[]小括号()三种括号,当然优先级是小括号>中括号>大括号>运算符。
要是只想结果取整,将所有double类型改为int即可,不过不主张这样做,既然是计算器,当然要精确计算。
一个完整的c程序如下,程序在win-tc和Dev-c++下都调试通过。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

char s[201];/*全局变量s[]与i分别表示算术表达式字符串以及其当前位置指针变量*/
int i=0;
double proc1(char ch);
void proc2(double *a,char *c);

void str_read(double *a,char *c) /*读取下一个操作数*/
{ int j=0;
char s1[30];
while ((s[i]!='\0')&&(s[i]!='+')&&(s[i]!='-')&&(s[i]!='(')&&(s[i]!=')')
&&(s[i]!='=')&&(s[i]!='^')&&(s[i]!='*')&&(s[i]!='/')&&(s[i]!='[')&&(s[i]!=']')
&&(s[i]!='{')&&(s[i]!='}')) /*操作数结束标志*/
s1[j++]=s[i++];
s1[j]='\0';
*a=atof(s1);
*c=s[i++];
}

void input_str() /*表达式接收模块*/
{ int j,k,t=0;
char c,s1[80];
printf("\n请输入任一算术表达式:\n");
while (!t)
{ gets(s);
j=k=0; t=1;
while ((s[j]!='=')&&(s[j]!='\0')&&(t)) /*判断括号配对*/
{if ((s[j]=='(')||(s[j]=='[')||(s[j]=='{'))
switch(s[j])
{ case '(':s1[k++]=')';break;
case '[':s1[k++]=']';break;
case '{':s1[k++]='}';
}
else if ((s[j]==')')||(s[j]==']')||(s[j]=='}'))
if (s1[--k]!=s[j])
{ printf("输入出错!请重新输入(直接回车退出):\n");
t=0;
}
j++;
}
if ((k!=0)&&(t))
{printf("输入出错!请重新输入(直接回车退出):\n");
t=0;
}
}
}

void proc2(double *a,char *c)
/*算术运算符之后只有两种情况:要么是各种左括号,要么是操作数*/
{ char ch;
if ((s[i]=='(')||(s[i]=='[')||(s[i]=='{'))
{ switch(s[i])
{ case '(':ch=')';break;
case '[':ch=']';break;
case '{':ch='}';
}
++i;
*a=proc1(ch);
/*计算从当前左括号开始到与其相对应的右括号结束这段表达式的值*/
*c=s[i++]; /*跳过右括号*/
}
else str_read(a,c); /*读取一个操作数*/
}

double proc1(char ch)
/*该过程对算术表达式s从当前位置s[i]开始到表达式结束或s[i]==ch这部分进行求值*/
{ double a1=0,a2,a=0;
char c1='+',c='+',c2='+';
/*给表达式前面加上"0+"(第一操作数与第一操作符)*/
while((c!='=')&&(c!='\0')&&(c!=ch))
{ proc2(&a,&c); /*读取第二操作数与第二操作符.*/
while (c=='^' || c=='*' || c=='/')
{ proc2(&a2,&c2); /*读取第三操作数与第三操作符.*/
switch (c) /*对第二操作符进行运算*/
{ case '*':a=a*a2; break;
case '/':a=a/a2; break;
case '^':a=pow(a,a2);
}
c=c2; /*把第三操作符赋给第二操作符变量*/
}
switch (c1) /*对第一操作符进行运算*/
{ case '+':a1=a1+a;break;
case '-':a1=a1-a;
}
c1=c; /*把第二操作符赋给第一操作符变量*/
}
return(a1); /*返回这部分表达式的值*/
}

int main(void)
{ system("cls");
input_str();
if (s[0]=='\0') return 0;
printf("该表达式的值是: ");
printf("%-8f\n",proc1('\0'));
system("pause");
return 0;
}

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:648
制作脚本网站 发布:2025-10-20 08:17:34 浏览:939
python中的init方法 发布:2025-10-20 08:17:33 浏览:634
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:823
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:734
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1069
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:302
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:163
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:855
python股票数据获取 发布:2025-10-20 07:39:44 浏览:765