① 用c語言 (c++) 編寫計算器程序
我們平時進行數學運算都是用計算器完成的,那麼如何用C語言編寫一個計算器呢?下面我給大家分享一下。
工具/材料
Dev C++
- 01
首先我們需要在Dev C++軟體中創建一個C語言項目,項目類型選擇控制台程序,如下圖所示
- 02
接下來我們在項目下面新建C語言文件,如下圖所示
- 03
然後我們在C文件中寫入計算器邏輯代碼,主要是讓用戶輸入計算方式,然後程序自動計算,如下圖所示
- 04
接下來我們點擊運行菜單,選擇下拉菜單中的運行選項,如下圖所示
- 05
最後在彈出的界面中我們輸入要計算的公式,程序就會自動計算,如下圖所示
② 用簡單c語言編寫計算器
#include"stdio.h"
/*預處理命令*/
void
main()
/*主函數*/
{
double
a,b;
/*雙精度實型變數說明*/
char
c,d;
/*變數說明*/
do
/*循環體*/
{
printf("input
a
(-*/)b\n");
/*輸入提示*/
scanf("%lf%c%lf",&a,&c,&b);
/*輸入算術表達式*/
if(c=='
')
/*判斷
*/
printf("=%0.2f",a
b);
/*輸出a
b的值*/
else
if(c=='-')
/*判斷-*/
printf("=%0.2f",a-b);
/*輸出a-b的值*/
else
if(c=='*')
/*判斷**/
printf("=%0.2f",a*b);
/*輸出a*b的值*/
else
if(c=='/')
/*判斷/*/
printf("=%0.3f",a/b);
/*輸出a/b*/
else
/*不滿足以上條件*/
printf("error");
/*輸出錯誤*/
printf("\n\ninput\n");
/*輸入\n*/
scanf("%c",&d);
/*輸入符號給d*/
}
/*循環體結束*/
while(d=='\n');
/*循環條件語句*/
}
③ c語言編寫計算器程序
C語言編寫計算器
我們可以用printf和scanf函數輸出結果和獲取用戶的輸入。需要<stdio.h>頭文件。scanf函數在讀取數據的時候不需要再一行上輸入每個數據,只要數據和數據之間留出空白就可以了。先聲明兩個變數number1和number2,operation變數用來存儲運算符。用scanf函數獲取這兩個數字和運算符。分別用%lf %c %lf
④ 如何用C語言寫一個簡易計算器
#include<stdio.h>
int main()
{
double num1;
double num2;
double result;
char ch;
printf("Please enter express to caculate, 'q' to exit(eg. 1+3):");
while(scanf("%lf%c%lf",&num1,&ch,&num2) == 3)
{
switch(ch)
{
case '+':
{
result = num1 + num2;
break;
}
case '-':
{
result = num1 - num2;
break;
}
case '/':
{
if(num2 == 0)
printf("Error:div/0\n");
else
result = num1 / num2;
break;
}
case '*':
{
result = num1 * num2;
break;
}
}
printf("%g%c%g=%g\n",num1,ch,num2,result);
printf("Please enter express to caculate, 'q' to exit(eg. 1+3):");
}
return 0;
}
⑤ 怎樣用c語言編一個簡單的計算器最簡單的
//簡單計算器,含加減乘除、乘方運算。
#include<string.h>
#include<ctype.h>
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include<io.h> // eof()
#include<math.h> // floor(),ceil(),abs()
#include<process.h> // exit()
#include<iostream.h> // cout,cin
// 函數結果狀態代碼
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因為在math.h中已定義OVERFLOW的值為3,故去掉此行
typedef int Status; // Status是函數的類型,其值是函數結果狀態代碼,如OK等
typedef int Boolean; // Boolean是布爾類型,其值是TRUE或FALSE
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
//***************************************************************************
//棧的儲存結構
typedef struct{
//運算符棧
char *base;
char *top;
int stacksize;
}SqStack1;
typedef struct{
//運算數棧
float *base;
float *top;
int stacksize;
}SqStack2;
//***************************************************************************
//以下是運算符棧的基本操作函數
Status InitStack(SqStack1 &S){
//初始化一個棧
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack
Status DestroyStack(SqStack1 &S){
//銷毀棧S
free(S.top);
free(S.base);
return OK;
}//DestroyStack
char GetTop(SqStack1 S){
//若棧不空,則返回S的棧頂元素,並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
return *(S.top-1);
}//Gettop
Status Push(SqStack1 &S,char e){
//插入元素e為新的棧頂元素
if(S.top-S.base>=S.stacksize){
//棧滿,追加儲存空間
S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push
Status Pop(SqStack1 &S,char &e){
//若棧不空,則刪除S的棧頂元素,用e返回其值;並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}//Pop
//***************************************************************************
//以下是運算數棧的基本操作函數
Status InitStack(SqStack2 &S){
//初始化一個棧
S.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack
Status DestroyStack(SqStack2 &S){
//銷毀棧S
free(S.top);
free(S.base);
return OK;
}//DestroyStack
float GetTop(SqStack2 S){
//若棧不空,則返回S的棧頂元素,並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
return *(S.top-1);
}//Gettop
Status Push(SqStack2 &S,float e){
//插入元素e為新的棧頂元素
if(S.top-S.base>=S.stacksize){
//棧滿,追加儲存空間
S.base=(float *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(float));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push
Status Pop(SqStack2 &S,float &e){
//若棧不空,則刪除S的棧頂元素,用e返回其值;並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}//Pop
//***************************************************************************
//以下是相關的運算符判斷函數
char Precede(char A,char B){
//比較運算符A, B的優先關系,A,B的范圍僅限於'+','-','*','/','^','(',')','='
//返回'>','<','='
switch(A){
case '+':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '-':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '*':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '/':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '^':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '(':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '=';
case '=':printf("表達式錯誤!\n");exit(0);
default:printf("表達式錯誤!\n");exit(0);
}
case ')':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':printf("表達式錯誤!\n");exit(0);
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '=':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':printf("表達式錯誤!\n");exit(0);
case '=':return '=';
default:printf("表達式錯誤!\n");exit(0);
}
default:printf("表達式錯誤!\n");exit(0);
}
}//Precede
Status InOP(char c){
//判斷c是否是運算符,是則返回TRUE,否則返回FALSE
switch(c){
case '+':return TRUE;
case '-':return TRUE;
case '*':return TRUE;
case '/':return TRUE;
case '^':return TRUE;
case '(':return TRUE;
case ')':return TRUE;
case '=':return TRUE;
default:return FALSE;
}
}//InOP
//***************************************************************************
float Operate(float a,char theta,float b){
switch(theta){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':
if(b==0){
printf("分母不能為0!\n");
exit(0);
}
else return a/b;
case '^':
if(a==0&&b<=0){
printf("0的指數必須大於0!\n");
exit(0);
}
else return (float)pow(a,b);
default:printf("表達式錯誤!\n");exit(0);
}
}//Operate
Status EvaluateExpression(){
//算術表達式求值
char c,x,theta,prec;
//c是每次讀取的字元,x是存放脫括弧後的多餘的括弧,theta是運算符,prec是c的前一個字元
float a,b,result;//a、b是每次從運算數棧中取出的要進行運算的數,result存放最終結果
float cc,flag,ii,minus=1;
//cc存放由字元串轉化而來的浮點數,flag用於標記是否已讀取過小數點,
//ii存放小數部分需要縮小的倍數,minus用於記錄該數前是否有負號
SqStack1 OPTR;
SqStack2 OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR,'=');
prec='=';scanf("%c",&c);
while(c!='='||GetTop(OPTR)!='='){
cc=0;flag=0;ii=10;
if(c=='-'&&(prec=='='||prec=='(')){minus=-1;prec=c;scanf("%c",&c);}
//若某「-」前面是「=」(第一個符號就是「-」)或「(」,則此為負號,不是減號
else if(!InOP(c)){
while(!InOP(c)){
if(c>=48&&c<=57){
if(flag==0)cc=cc*10+c-48;//小數點之前
else if(flag==1){cc=cc+(c-48)/ii;ii*=10;}//小數點之後
else {printf("小數點錯誤!\n");exit(0);}//小數點有錯
}
else if(c=='.')flag++;//讀到小數點
else {printf("表達式錯誤!\n");exit(0);}
prec=c;scanf("%c",&c);
}
cc*=minus;minus=1;
Push(OPND,cc);
}//不是運算符則進OPND棧
else
switch(Precede(GetTop(OPTR),c)){
case '<':Push(OPTR,c);prec=c;scanf("%c",&c);break;//棧頂元素優先順序低
case '=':Pop(OPTR,x);prec=c;scanf("%c",&c);break;//脫括弧並接收下一字元
case '>'://退棧並將運算結果入棧
Pop(OPTR,theta);
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
}
result=GetTop(OPND);
printf("%f\n",result);
//DestroyStack(OPTR);
//DestroyStack(OPND);
return OK;
}//EvaluateExpression
void main(){
printf(" **********************\n");
printf(" * 歡迎使用計算器! *\n");
printf(" **********************\n");
printf("請輸入表達式,以「=」結束:\n");
printf("(支持實數間的加(+)、減(-)、乘(*)、除(/)、乘方(^)、單目減(-)運算)\n");
EvaluateExpression();
exit (0);
}
⑥ c語言中 簡單計算器代碼的編寫 (注意! 是簡單的計算器代碼編寫!)
-以前無聊的時候寫的,感覺還不錯。
說明:編譯打開程序之後,輸入的是算式,就是你要求的那樣。支持的運算有 加減乘除,平方根,求余,對數,階乘(只能計算整數階乘,小數會四捨五入再計算),按位與或非,三角函數等。詳見代碼中的sign字元宴辯串數組裡面的命令。
例如輸入:1.5*3.14159-10^3+cos(12*6-15)*10
----------caodd_2010-------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define PAI 3.141592654
//str 內容,大於0 為運算符號,小於0為數字。str中沒有0(除了末尾)。
//prtx內容,為str對應元素的優先順序
//num內容為str對應的數字的存儲區
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
const char sign[][5]= {".","+","-","*","/","^","sqrt","%","log","!","(",")","acos","asin","atan","acot","cos","sin","tan","cot","ln","lg","--","&","|","~","xor","B","H","cd","exit",""};
const char prt[]= { 0, 1, 1, 2, 2, 4, 3, 2, 3, 5, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 3, 3, 3, 3, 5, 5, 5, 1, 0}; //優先順序
//只有薯亮左目預算符優先順序才可為5
char counter(char mode,double * a,double * b)//返回-1代表左邊數祥寬的值被改變 +1代表右邊的值被改變 0代表都被改變
{
double ax;
int i;
//printf("\nmode=%d,*a=%g,*b=%g",mode,*a,*b);
switch(mode)
{
case 1://+
*b+=*a;
return 0;
case 2://-
*b=*a-*b;
return 0;
case 3://*
*b*=*a;
return 0;
case 4:// /
*b=*a/(*b);
return 0;
case 5://^
*b=pow(*a,*b);
return 0;
case 6:// sqrt
*b=sqrt(*b);
return 1;
case 7://%
*b=fmod(*a,*b);
return 0;
case 8://log
*b=log(*b)/log(*a);
return 0;
case 9://!
ax=1;
i=(int)(*a+0.5);
while(i)
{
ax*=i;
i--;
}
*a=ax;
return -1;
case 12://acos
*b=acos(*b)*180/PAI;
return 1;
case 13://asin
*b=asin(*b)*180/PAI;
return 1;
case 14://atan
*b=atan(*b)*180/PAI;
return 1;
case 15://acot
*b=atan(1/(*b))*180/PAI;
return 1;
case 16://cos
*b=cos(*b*PAI/180);
return 1;
case 17://sin
*b=sin(*b*PAI/180);
return 1;
case 18://tan
*b=tan(*b*PAI/180);
return 1;
case 19://cot
*b=1/tan(*b*PAI/180);
return 1;
case 20://ln
*b=log(*b);
return 1;
case 21://lg
*b=log10(*b);
return 1;
case 22://--負數
*b=-*b;
return 1;
case 23://& 按位與
*b=(int)(*a+0.5)&(int)(*b+0.5);
return 0;
case 24://|按位或
*b=(int)(*a+0.5)|(int)(*b+0.5);
return 0;
case 25://~按位取反
*b=~(int)(*b+0.5);
return 1;
case 26://xor按位異或
*b=(int)(*a+0.5)^(int)(*b+0.5);
return 0;
case 27://B二進制
return -1;
case 28://H十六進制
return -1;
case 29://cd
return -1;
case 30://exit
exit(0);
}
return 0;
}
double master(char *str)
{
double num[64]= {0}; //存儲數字
double *pa,*pb;
double zero=0;
char prtx[128]="",*t;//prtx存儲運算優先順序
char sp[128]="";//sp數組存儲根據prtx得來的運算順序。
char i,k,l,len,n,allc=1,mark=0;//allc為運算符數量,n為數字的數量,len為字元串長度。
//找出運算符 因為acos 和cos 會有重復的部分,所以找到a之後要把後面的c置為其它不重復字元,比如','。
while(sign[allc][0]!=0)
{
if((t=strstr(str,sign[allc]))!=NULL)
{
if(*t=='a')
{
*(t+1)=',';
}
*t=allc;
}
else
{
allc++;
}
}
//找出數字,賦值給num
for(i=0,n=0; 1; i++)
{
if(str[i]>='0'&&str[i]<='9'||str[i]=='.')
{
num[n++]=atof(str+i);
str[i]=-n;
while((str[++i]>='0'&&str[i]<='9')||str[i]=='.')
{
;
}
}
else if(str[i]==0)
{
break;
}
}
//puts("num:");for(i=0; i<20; i++){printf("[%d:%g] ",i,num[i]);}
//刪除多餘的字元
for(i=0,len=0; str[i]!=0; i++)
{
if(str[i]<=allc)
{
str[len++]=str[i];
}
}
//關於負號的問題
for(i=0; i<len; i++)
{
if(str[i]==10&&str[i+1]==2)
{
str[++i]=22;
}
}
str[len]=0;
//puts("\nstr:");for(i=0; i<len; i++){printf("[%d:%2d] ",i,str[i]);}
//構建優先順序,數字與括弧則優先順序為0 ,其他符號優先順序參照prt表並與mark加成
for(i=0; i<len; i++)
{
if(str[i]<0)
{
prtx[i]=0;
}
else if(str[i]==10) //每進一層括弧mark+4 , mark為char型,所以最多可以有30或31層括弧
{
prtx[i]=0;
mark+=4;
}
else if(str[i]==11)//每出一層括弧mark-4
{
prtx[i]=0;
mark-=4;
}
else
{
prtx[i]=prt[str[i]]+mark;//優先順序加成,prt數組裡面的每種符號的默認優先順序加上括弧優先順序
}
}
//puts("\nprtx:");for(i=0; i<len; i++){printf("[%d:%2d] ",i,prtx[i]);}
//存放運算順序
k=0;
l=0;
do
{
mark=1;
for(i=0; i<len; i++)
{
if(str[i]>0)
{
if(mark<prtx[i])
{
mark=prtx[i];
k=l;
sp[k++]=i;
}
else if(mark==prtx[i])
{
sp[k++]=i;
}
}
}
for(i=l; i<k; i++)
{
prtx[sp[i]]=0;
}
l=k;
}
while(mark!=1);
sp[k]=-1; //sp數組結束標志,遇到-1則結束
//puts("\nsp :");for(i=0; sp[i]>0; i++){printf("[%d:%2d] ",i,sp[i]);}
//運算開始
for(i=0; sp[i]>=0; i++)
{
//printf("\nprtx[%d]=%d",i,prtx[i]);
//k為向運算符前面查找最近的數字
for(k=sp[i]-1; k>0; k--)
{
if(str[k]<0)
{
break;
}
}
if(str[k]>-1)
{
pa=&zero;
}
else
{
pa=&num[-str[k]-1];
}
//l為向運算符後面查找最近的數字
for(l=sp[i]+1; l<len; l++)
{
if(str[l]<0)
{
break;
}
}
if(str[l]>-1)
{
pb=&zero;
}
else
{
pb=&num[-str[l]-1];
}
//返回值為0說明左右兩個數字均參與了運算
if(counter(str[sp[i]],pa,pb)==0)
{
num[-str[k]-1]=0;//將參數運算的兩個數字之一清零(我選取的是每次清除運算符左面的數)
str[k]=0;//同樣將其從表達式中清除
}
}
for(i=0; i<n; i++)
{
if(num[i]>1e-20||num[i]<-1e-20)
{
return num[i];
}
}
return 0;
}
int main(/*int argc, char *argv[]*/)
{
char str[128];
double m;
while(1)
{
printf("請輸入算式(輸入exit退出):\n計算器>");
fgets(str,sizeof(str),stdin);
m=master(str);
printf("計算結果為:%f (%g)\n\n",m,m);
}
return 0;
}
⑦ C語言初學:求計算器程序編碼。
/*程序我已經運行過。可以用的。希望對你有所幫助*/
#include
"stdio.h"
main()
{
float
i,k;
char
c;/*定義的運算符*/
printf("please
input
i+(-/*k)\n");/*自己輸入等式咐正*/
scanf("%f%c%f",&i,&c,&k);
switch(c)
{
case
'*'衡帆悔
:printf("%,3f\n",i*k);break;/*保留三位有效數字*/
case
'/'
:printf("%.3f\n",i/轎拿k);break;
case
'+'
:printf("%.3f\n",(i+k));break;
case
'-'
:printf("%.3f\n",(i-k));break;
default
:printf("input
eirror\n");
}
}
⑧ 如何用C程序編寫一個計算器
1
首先,得從網上下載並安裝c++,然後從桌面找到並打開它。
⑨ 用C語言編寫一個簡單的計算器1
#include<stdio.h>
int main() {
double num1 = 0; //輸入1
double num2 = 0; //輸入2
char ch; //操作
double ret = 0; //結果 printf( "輸入埋尺第一個數:" );
scanf( "%lf", &num1 );
printf( "輸入第二個數:" );
scanf( "彎虛高%lf"譽譽, &num2 );
printf( "操作[+ - * /]:" );
getchar();
scanf( "%c", &ch ); switch( ch ) {
case '+':
ret = num1 + num2;
break;
case '-':
ret = num1 - num2;
break;
case '*':
ret = num1 * num2;
break;
case '/':
ret = num1 / num2;
break;
default:
break;
}
printf( "結果:%.2lf\n", ret ); return 0;
} 寫個簡單易懂的,你操作計算器的步驟就是編寫程序的思路呀