當前位置:首頁 » 編程軟體 » 可編譯計算器

可編譯計算器

發布時間: 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 瀏覽:705
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:968
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:676
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:828
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:737
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1076
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:308
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:188
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:875
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:829