c語言編寫計算器
Ⅰ 如何用c語言編寫一個科學計算器
用棧 就可以辦到了。。。這個很詳細的, lz 隨便輸入一個表達式,中間的計算過程全部輸出了,lz試兩個 就知道怎麼回事了。 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 4000;
typedef struct
{
char data[10];
int top;//頭地址
int base;//基地址
int length;//長度
}Stack;
void init(Stack *st)//初始化棧
{
st->base=0;
st->top=0;
st->length=0;
}
int isEmpty(Stack *st)
{
int n=0,top,base;
top =st->top;
base =st->base;
if(top==base)
{
return 1;
}
return n;
}
int isFull(Stack *st)
{
int n=0,top,base;
top =st->top;
if(top>=4000)
{
return 1;
}
return n;
}
char getTop(Stack *st)// 返回top值,不改變棧的結構
{
char n;
if(isEmpty(st))
{
printf("棧為空\n");
return 0;
}
int positon= st->top-1;
n= st->data[positon];//取出數據;
return n;
}
char pop(Stack *st)// 出棧,返回
{
char n;
if(isEmpty(st))
{
printf("棧為空\n");
return 0;
}
int positon= st->top-1;
n= st->data[positon];//取出數據;
st->top--;
st->length--;
st->data[positon]='\0';//消除數據
return n;
}
void push(char n,Stack *st)//入棧
{
int positon ;
if(isFull(st))
{
printf("棧滿\n");
}
else
{
positon= st->top;//獲取位置
st->data[positon]=n;//存入數據
st->top++;//改變位置
}
}
void show(Stack *m1)//輸出棧中的數據
{
int top,base;
top=m1->top;
base=m1->base;
while(top>base)
{
printf("%c,",m1->data[--top]);
}
printf("\n");
}
int isOperate(char temp)//是否是操作符
{
if(temp=='+'||temp=='-'||temp=='*'||temp=='/'||temp=='('||temp==')'||temp=='#')
{
return 1;
}
return 0;
}
int isValue(char temp)//是否是數值
{
if(temp>='0'&&temp<='9')//
{
return 1;
}
else
{
return 0;
}
}
int isAvail(char temp)//是否有效字元
{
if(isOperate(temp)||isValue(temp))//如果temp既不是操作符和數值的話,則它是非法的
{
return 1;
}
return 0;
}
int detect(char temp)//搜索矩陣位置
{
int i=0;
char oper[7]={'+','-','*','/','(',')','#'};
for(i=0;i<7;i++)
{
if(temp==oper[i])
{
return i;
}
}
}
char Priority(char temp,char optr)//判斷優先順序
{
/**//*
+ - * / ( ) #
1 2 3 4 5 6 7
+ 1 < < < < > > >
- 2 < < < < > > >
* 3 > > < < > > >
/ 4 > > < < > > >
( 5 > > > > > = 0
) 6 < < < < = 0 >
# 7 < < < < > 0 =
*/
int row ,col;
char priority[7][7]={/**//* + - * / ( ) # */
{'<','<','<','<','>','>','>'},
{'<','<','<','<','>','>','>'},
{'>','>','<','<','>','>','>'},
{'>','>','<','<','>','>','>'},
{'>','>','>','>','>','=','>'},
{'<','<','<','<','=','0','>'},
{'<','<','<','<','>','<','='},
};
row = detect(temp);//找出對應的矩陣下標;
col = detect(optr);
// printf("%d,%d",row,col);
//優先順序存儲在一個7x7的矩陣中,對應關繫上圖;
return priority[row][col];
}
char evaluate(int a,int b,char oper)
{
switch(oper)
{
case '+': return a+b+'0';
case '-': return a-b+'0';
case '*': return a*b+'0';
case '/': return a/b+'0';
default : return 0+'0';
}
}
int calculateExpress(char *express)//計算表達式
{
int result=0;
int a,b;
// char oper,result;
Stack OPTR,OPND;//OPTR存儲操作符,OPND操作數值
init(&OPTR);
init(&OPND);
push('#',&OPTR);//默認第一個位'#'
////////////////////-演算法-////////////////////////////
while(*express!='\0')
{
char temp;
temp= *(express);
printf("---------------------------------\n");
printf("當前的符號為%c\n",temp);
if(isAvail(temp))//是否是有效字元
{
if(isOperate(temp) )//輸入的是操作符
{
char oper,result;
char optr = getTop(&OPTR);//棧中top位的操作符
printf("棧頂操作符位:%c\n",optr);
char prior = Priority(temp,optr);//判斷優先順序
switch(prior)
{
case '>':
push(temp,&OPTR);
printf("將符號位%c入棧\n",temp);
express++;
break;
case '<':
//int a,b;
//char oper,result;
a=pop(&OPND)-'0';//存在棧中的都是char字元
b=pop(&OPND)-'0';
oper=pop(&OPTR);
result=evaluate(b,a,oper);//出棧一個操作符,計算結果
//printf("%d",result-'0');
push(result,&OPND);//結果入OPND
printf("%d%c%d結果為:%d\n",b,oper,a,result-'0');
break;
case '=':
//消除括弧
pop(&OPTR);
printf("消除括弧\n");
express++;
break;
}
}
if(isValue(temp))//輸入的是數值
{
push(temp,&OPND);//將數值位入棧;
express++;
printf("將數值%c壓入棧\n",temp);
//show(&OPND);
}
}
else //表達式中有非法字元
{
printf("表達式中有非法字元\n");
exit(-1);//退出程序
}
}
// show(&OPND);
// show(&OPTR);
return getTop(&OPND)-'0';
}
void inputExpress(char *express)//輸入表達式
{
int length=0;
printf("請輸入一個表達式:");
scanf("%s",express);
int len =strlen(express);
express[len]='#';//表達式最後一位默認為'#';
express[len+1]='\0';
}
void output(char *express,int result)//輸出表達式
{
int i=0;
printf("----------------------------------------\n表達式:");
while(express[i]!='#')
{
printf("%c",express[i]);
i++;
}
printf("=%d\n",result);
}
int main()
{
char express[100];//表達式
int result =0;
inputExpress(express);//輸入表達式
result = calculateExpress(express);//計算表達式;
output(express,result); //輸出表達式
//、、、、、、、、、、、、、測試優先順序。
/**//*
char m='7' ;
m=Priority('+','*');
printf("優先順序為%c",m);
int m=evaluate(5,6,'m');
printf("%d",m);
*/
return 0;
}
Ⅱ 如何用c語言寫計算器程序
計算器要求如下:1)
設計一面向對象的類,含有加、減、乘、除運算及開平方等功能的函數。
2)
設計加、減、乘、除運算及求平方根的函數。
3)
設計實現四則混合運算的函數。
4)
設計測試函數。
要求是
完善計算器程序,改為可對實數操作。
完善程序,改為多個操作數基本四則運算,遇到0為止。
增加函數,完成四則混合運算,增加相應的主菜單選項。
添加語句,使四則運算具有測試功能。
可擴充其功能。
Ⅲ 用C語言編寫計算器程序
http://www.softhouse.com.cn/html/200509/2005091911241600011153.html這個頁面可能對你有幫助。
Ⅳ c語言設計一個簡單的計算器程序
#include<stdio.h>//計算器
voidmenu()//自定義的菜單界面
{
printf("--------------------\n");
printf("請輸入你的選擇\n");
printf("1.+\n");
printf("2.-\n");
printf("3.*\n");
printf("4./\n");
printf("--------------------\n");
}
intmain()
{
inti=0;
intj=0;
intnum=0;//計算結果存放在nun
intselect=0;//選擇的選項存放在select
do//do-while先執行再判斷循環條件,即可實現重復計算功能
{
menu();//列印出菜單界面
scanf("%d",&select);//輸入你的選項
printf("請輸入計算值:");
scanf("%d%d",&i,&j);//輸入要計算的數值
switch(select)
{
case1:
printf("%d+%d=%d\n",i,j,num=i+j);//實現加法功能
break;
case2:
printf("%d-%d=%d\n",i,j,num=i-j);//實現減法功能
break;
case3:
printf("%d*%d=%d\n",i,j,num=i*j);//實現乘法功能
break;
case4:
printf("%d-%d=%d\n",i,j,num=i/j);//實現除法功能
break;
default:
printf("輸入有誤重新選擇");
break;
}
}while(select);
return0;
}
運行結果:
(4)c語言編寫計算器擴展閱讀:
return表示把程序流程從被調函數轉向主調函數並把表達式的值帶回主調函數,實現函數值的返回,返回時可附帶一個返回值,由return後面的參數指定。
return通常是必要的,因為函數調用的時候計算結果通常是通過返回值帶出的。如果函數執行不需要返回計算結果,也經常需要返回一個狀態碼來表示函數執行的順利與否(-1和0就是最常用的狀態碼),主調函數可以通過返回值判斷被調函數的執行情況。
Ⅳ 用簡單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語言編寫一個計算器
先簡單給你寫了一下,你先看看行不行,太晚了,我得睡啦,要是不明白,明天追問就行:
#include <stdio.h>
int main()
{
int a,b;
char c;
while(
//這里是逗號表達式,如果看起來別扭可以改到while循環外
printf("請輸入1個式子(輸入q退出): "),
scanf("%d%c%d",&a,&c,&b)==3
)
{
//先給你寫了加減乘除,當然這里也可以採用switch
if(c=='+') printf("%d ",a+b);//加
else if(c=='-') printf("%d ",a-b);//減
else if(c=='*') printf("%d ",a*b);//乘
else if(c=='/') printf("%d ",a/b);//除
}
return 0;
}
Ⅶ 用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;
} 寫個簡單易懂的,你操作計算器的步驟就是編寫程序的思路呀
Ⅷ 用C語言編計算器程序
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "math.h"
//expression evaluate
#define iMUL 0
#define iDIV 1
#define iADD 2
#define iSUB 3
#define iCap 4
//#define LtKH 5
//#define RtKH 6
#define MaxSize 100
void iPush(float);
float iPop();
float StaOperand[MaxSize];
int iTop=-1;
//
char Srcexp[MaxSize];
char Capaexp[MaxSize];
char RevPolishexp[MaxSize];
float NumCapaTab[26];
char validexp[]="*/+-()";
char NumSets[]="0123456789";
char StackSymb[MaxSize];
int operands;
//
void NumsToCapas(char [], int , char [], float []);
int CheckExpress(char);
int PriorChar(char,char);
int GetOperator(char [], char);
void counterPolishexp(char INexp[], int slen, char Outexp[]);
float CalcRevPolishexp(char [], float [], char [], int);
void main()
{
int ilen;
float iResult=0.0;
printf("enter a valid number string:\n");
memset(StackSymb,0,MaxSize);
memset(NumCapaTab,0,26); //A--NO.1, B--NO.2, etc.
gets(Srcexp);
ilen=strlen(Srcexp);
//printf("source expression:%s\n",Srcexp);
NumsToCapas(Srcexp,ilen,Capaexp,NumCapaTab);
printf("Numbers listed as follows:\n");
int i;
for (i=0; i<operands; ++i)
printf("%.2f ",NumCapaTab[i]);
printf("\nCapaexp listed in the following:\n");
printf("%s\n",Capaexp);
ilen=strlen(Capaexp);
counterPolishexp(Capaexp,ilen,RevPolishexp);
printf("RevPolishexp:\n%s\n",RevPolishexp);
ilen=strlen(RevPolishexp);
iResult=CalcRevPolishexp(validexp, NumCapaTab, RevPolishexp,ilen);
printf("\ncounterPolish expression:\n%s%.6f\n",Srcexp,iResult);
}
void iPush(float value)
{
if(iTop<MaxSize) StaOperand[++iTop]=value;
}
float iPop()
{
if(iTop>-1)
return StaOperand[iTop--];
return -1.0;
}
void NumsToCapas(char Srcexp[], int slen, char Capaexp[], float NumCapaTab[])
{
char ch;
int i, j, k, flg=0;
int sign;
float val=0.0,power=10.0;
i=0; j=0; k=0;
while (i<slen)
{
ch=Srcexp[i];
if (i==0)
{
sign=(ch=='-')?-1:1;
if(ch=='+'||ch=='-')
{
ch=Srcexp[++i];
flg=1;
}
}
if (isdigit(ch))
{
val=ch-'0';
while (isdigit(ch=Srcexp[++i]))
{
val=val*10.0+ch-'0';
}
if (ch=='.')
{
while(isdigit(ch=Srcexp[++i]))
{
val=val+(ch-'0')/power;
power*=10;
}
} //end if
if(flg)
{
val*=sign;
flg=0;
}
} //end if
//write Capaexp array
// write NO.j to array
if(val)
{
Capaexp[k++]='A'+j;
Capaexp[k++]=ch;
NumCapaTab[j++]=val; //A--0, B--1,and C, etc.
}
else
{
Capaexp[k++]=ch;
}
val=0.0;
power=10.0;
//
i++;
}
Capaexp[k]='\0';
operands=j;
}
float CalcRevPolishexp(char validexp[], float NumCapaTab[], char RevPolishexp[], int slen)
{
float sval=0.0, op1,op2;
int i, rt;
char ch;
//recursive stack
i=0;
while((ch=RevPolishexp[i]) && i<slen)
{
switch(rt=GetOperator(validexp, ch))
{
case iMUL: op2=iPop(); op1=iPop();
sval=op1*op2;
iPush(sval);
break;
case iDIV: op2=iPop(); op1=iPop();
if(!fabs(op2))
{
printf("overflow\n");
iPush(0);
break;
}
sval=op1/op2;
iPush(sval);
break;
case iADD: op2=iPop(); op1=iPop();
sval=op1+op2;
iPush(sval);
break;
case iSUB: op2=iPop(); op1=iPop();
sval=op1-op2;
iPush(sval);
break;
case iCap: iPush(NumCapaTab[ch-'A']);
break;
default: ;
}
++i;
}
while(iTop>-1)
{
sval=iPop();
}
return sval;
}
int GetOperator(char validexp[],char oper)
{
int oplen,i=0;
oplen=strlen(validexp);
if (!oplen) return -1;
if(isalpha(oper)) return 4;
while(i<oplen && validexp[i]!=oper) ++i;
if(i==oplen || i>=4) return -1;
return i;
}
int CheckExpress(char ch)
{
int i=0;
char cc;
while((cc=validexp[i]) && ch!=cc) ++i;
if (!cc)
return 0;
return 1;
}
int PriorChar(char curch, char stach)
{
//棧外優先順序高於(>)棧頂優先順序時,才入棧
//否則(<=),一律出棧
if (curch==stach) return 0; //等於時應該出棧
else if (curch=='*' || curch=='/')
{
if(stach!='*' && stach!='/')
return 1;
}
else if (curch=='+' || curch=='-')
{
if (stach=='(' || stach==')')
return 1;
}
else if (curch=='(')
{
if (stach==')')
return 1;
}
return 0;
}
void counterPolishexp(char INexp[], int slen, char Outexp[])
{
int i, j, k,pr;
char t;
i=0;
j=k=0;
while (INexp[i]!='=' && i<slen)
{
if (INexp[i]=='(')
StackSymb[k++]=INexp[i];
//iPush(*(INexp+i));
else if(INexp[i]==')')
{
//if((t=iPop())!=-1)
while((t=StackSymb[k-1])!='(')
{
Outexp[j++]=t;
k--;
}
k--;
}
else if (CheckExpress(INexp[i])) // is oparator
{
// printf("operator %c k=%d\n",INexp[i],k);
while (k)
{
// iPush(*(INexp+i));
if(pr=PriorChar(INexp[i],StackSymb[k-1]))
break;
else
{
//if ((t=iPop())!=-1)
t=StackSymb[k-1]; k--;
Outexp[j++]=t;
}
} //end while
StackSymb[k++]=INexp[i]; //common process
}
else //if() 變數名
{
// printf("operand %c k=%d\n",INexp[i],k);
Outexp[j++]=INexp[i];
}
i++; //
}
while (k)
{
t=StackSymb[k-1]; k--;
Outexp[j++]=t;
}
Outexp[j]='\0';
}
Ⅸ c語言編寫計算器
不知道是不是你喜歡的格式。建議自己修改成自己喜歡的格式。#include<stdio.h>
#include<math.h>
void menu()
{
printf(" |============================|\n");
printf(" | 1.算術運算; 2.進制轉換; |\n");
printf(" |============================|\n\n");
}
void fun1()//算術運算
{
int a,b;
char oper; printf("請輸入算式:");
scanf("%d%c%d",&a,&oper,&b);
switch(oper)
{
case '+':printf("結果為:%d\n",a+b);break;
case '-':printf("結果為:%d\n",a-b);break;
case '*':printf("結果為:%d\n",a*b);break;
case '/':printf("結果為:%.2f\n",(float)a/b);break;
case '%':printf("結果為:%d\n",a%b);break;
default:printf("輸入有誤!\n");break;
}
}
void fun2()//進制轉換
{
int choice,value,i,j=0,k,t;
char s[50];
int a[4];
printf(" ********************************************************\n");
printf(" 1.十進制轉換成二進制; 2.十進制轉換成十六進制;\n");
printf(" 3.二進制轉換成十進制; 4.二進制轉換成十六進制;\n");
printf(" 5.十六進制轉換成二進制; 6.十六進制轉換成十進制;\n");
printf(" ********************************************************\n");
printf("請選擇:");
scanf("%d",&choice);
switch(choice)
{
case 1:printf("請輸入十進制數值:");scanf("%d",&value);
while(value>=2)
{
if(value%2!=0)
s[j++]='1';
else
s[j++]='0';
value=value/2;
}
if(value==1)
s[j]='1';
printf("結果為:");
for(i=j;i>=0;i--)
printf("%c",s[i]);
break;
case 2:printf("請輸入十進制數值:");scanf("%d",&value);
printf("結果為:%x",value);break;
case 3:printf("請輸入二進制數:");scanf("%s",s);
for(i=0;s[i]!='\0';i++);
i--;value=0;
for(j=0;j<=i;j++)
{ t=1;
if(s[j]=='1')
{ for(k=i-j;k>0;k--)
t*=2;
value+=t;
}
}
printf("結果為:%d\n",value);break;
case 4:printf("請輸入二進制數:");scanf("%s",s);
for(i=0;s[i]!='\0';i++);
i--;value=0;
for(j=0;j<=i;j++)
{ t=1;
if(s[j]=='1')
{ for(k=i-j;k>0;k--)
t*=2;
value+=t;
}
}
printf("結果為:%x\n",value);break;
case 5:printf("請輸入十六進制數值:");scanf("%x",&value);
while(value>=2)
{
if(value%2!=0)
s[j++]='1';
else
s[j++]='0';
value=value/2;
}
if(value==1)
s[j]='1';
printf("結果為:");
for(i=j;i>=0;i--)
printf("%c",s[i]);
break;
case 6:printf("請輸入十六進制數值:");scanf("%x",value);
printf("結果為:%d\n",value);break;
default:printf("選擇有誤!\n");
break;
}
}
void main()
{
int choice;
while(choice!=0)
{
menu();
printf("請選擇(0退出):");
scanf("%d",&choice);
if(choice==1)
fun1();
else if(choice==2)
fun2();
printf("\n");
}
}
Ⅹ C語言編寫計算器
#include<stdio.h>
#define NUM 1000;
main(){
int ys,i;
int a,b,c,d;
printf("welcome...\n");
printf("請選擇:\n");
printf("1.加法\n");
printf("2.減法\n");
printf("3.乘法\n");
printf("4.除法\n");
scanf("%d",&ys);
srand(time(NULL));
a=rand()%NUM;
b=rand()%NUM;
if(ys==1){
c=a+b;
printf("%d+%d=",a,b);
}
else if(ys==2){
c=a-b;
printf("%d-%d=",a,b);
}
else if(ys==3){
c=a*b;
printf("%d*%d=",a,b);
}
else{
c=a/b;
printf("%d/%d=",a,b);
}
for(i=0;i<2;i++)
{
scanf("%d",&d);
if(d==c){
printf("回答正確\n");
break;
}
if(i==0){
printf("錯誤\n請重新輸入:");
}
}
}
我做的第一版,初步測試運行正常,如果有bug,或者不符合要求可以提出.我再修改