首先輸入要計(jì)算什么
創(chuàng)新互聯(lián)主營(yíng)開平網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,開平h5成都微信小程序搭建,開平網(wǎng)站營(yíng)銷推廣歡迎開平等地區(qū)企業(yè)咨詢
比如
sin
cos
...
然后輸入要計(jì)算的值
接著調(diào)用對(duì)應(yīng)的數(shù)學(xué)函數(shù)就可以了
sin
con
tan
cot這些都是有對(duì)應(yīng)數(shù)學(xué)函數(shù)的
最后輸出結(jié)果。
需要注意的是
C的數(shù)學(xué)三角函數(shù)都是弧度做參數(shù)
而不是角度。
用棧 就可以辦到了。。。這個(gè)很詳細(xì)的, lz 隨便輸入一個(gè)表達(dá)式,中間的計(jì)算過(guò)程全部輸出了,lz試兩個(gè) 就知道怎么回事了。 #include stdio.h
#include stdlib.h
#include string.h
#define MAXSIZE 4000;
typedef struct
{
char data[10];
int top;//頭地址
int base;//基地址
int length;//長(zhǎng)度
}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值,不改變棧的結(jié)構(gòu)
{
char n;
if(isEmpty(st))
{
printf("棧為空\(chéng)n");
return 0;
}
int positon= st-top-1;
n= st-data[positon];//取出數(shù)據(jù);
return n;
}
char pop(Stack *st)// 出棧,返回
{
char n;
if(isEmpty(st))
{
printf("棧為空\(chéng)n");
return 0;
}
int positon= st-top-1;
n= st-data[positon];//取出數(shù)據(jù);
st-top--;
st-length--;
st-data[positon]='\0';//消除數(shù)據(jù)
return n;
}
void push(char n,Stack *st)//入棧
{
int positon ;
if(isFull(st))
{
printf("棧滿\n");
}
else
{
positon= st-top;//獲取位置
st-data[positon]=n;//存入數(shù)據(jù)
st-top++;//改變位置
}
}
void show(Stack *m1)//輸出棧中的數(shù)據(jù)
{
int top,base;
top=m1-top;
base=m1-base;
while(topbase)
{
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)//是否是數(shù)值
{
if(temp='0'temp='9')//
{
return 1;
}
else
{
return 0;
}
}
int isAvail(char temp)//是否有效字符
{
if(isOperate(temp)||isValue(temp))//如果temp既不是操作符和數(shù)值的話,則它是非法的
{
return 1;
}
return 0;
}
int detect(char temp)//搜索矩陣位置
{
int i=0;
char oper[7]={'+','-','*','/','(',')','#'};
for(i=0;i7;i++)
{
if(temp==oper[i])
{
return i;
}
}
}
char Priority(char temp,char optr)//判斷優(yōu)先級(jí)
{
/**//*
+ - * / ( ) #
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);//找出對(duì)應(yīng)的矩陣下標(biāo);
col = detect(optr);
// printf("%d,%d",row,col);
//優(yōu)先級(jí)存儲(chǔ)在一個(gè)7x7的矩陣中,對(duì)應(yīng)關(guān)系上圖;
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)//計(jì)算表達(dá)式
{
int result=0;
int a,b;
// char oper,result;
Stack OPTR,OPND;//OPTR存儲(chǔ)操作符,OPND操作數(shù)值
init(OPTR);
init(OPND);
push('#',OPTR);//默認(rèn)第一個(gè)位'#'
////////////////////-算法-////////////////////////////
while(*express!='\0')
{
char temp;
temp= *(express);
printf("---------------------------------\n");
printf("當(dāng)前的符號(hào)為%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);//判斷優(yōu)先級(jí)
switch(prior)
{
case '':
push(temp,OPTR);
printf("將符號(hào)位%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);//出棧一個(gè)操作符,計(jì)算結(jié)果
//printf("%d",result-'0');
push(result,OPND);//結(jié)果入OPND
printf("%d%c%d結(jié)果為:%d\n",b,oper,a,result-'0');
break;
case '=':
//消除括號(hào)
pop(OPTR);
printf("消除括號(hào)\n");
express++;
break;
}
}
if(isValue(temp))//輸入的是數(shù)值
{
push(temp,OPND);//將數(shù)值位入棧;
express++;
printf("將數(shù)值%c壓入棧\n",temp);
//show(OPND);
}
}
else //表達(dá)式中有非法字符
{
printf("表達(dá)式中有非法字符\n");
exit(-1);//退出程序
}
}
// show(OPND);
// show(OPTR);
return getTop(OPND)-'0';
}
void inputExpress(char *express)//輸入表達(dá)式
{
int length=0;
printf("請(qǐng)輸入一個(gè)表達(dá)式:");
scanf("%s",express);
int len =strlen(express);
express[len]='#';//表達(dá)式最后一位默認(rèn)為'#';
express[len+1]='\0';
}
void output(char *express,int result)//輸出表達(dá)式
{
int i=0;
printf("----------------------------------------\n表達(dá)式:");
while(express[i]!='#')
{
printf("%c",express[i]);
i++;
}
printf("=%d\n",result);
}
int main()
{
char express[100];//表達(dá)式
int result =0;
inputExpress(express);//輸入表達(dá)式
result = calculateExpress(express);//計(jì)算表達(dá)式;
output(express,result); //輸出表達(dá)式
//、、、、、、、、、、、、、測(cè)試優(yōu)先級(jí)。
/**//*
char m='7' ;
m=Priority('+','*');
printf("優(yōu)先級(jí)為%c",m);
int m=evaluate(5,6,'m');
printf("%d",m);
*/
return 0;
}
#includestdio.h
#includewindows.h
#includemath.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("*############高級(jí)計(jì)算器############* \n");
printf("************************************ \n");
printf("* ①加法運(yùn)算 * \n");
printf("* ②減法運(yùn)算 * \n");
printf("* ③乘法運(yùn)算 * \n");
printf("* ④除法運(yùn)算 * \n");
printf("* ⑤取余運(yùn)算 * \n");
printf("* ⑥累加運(yùn)算 * \n");
printf("* ⑦階乘運(yùn)算 * \n");
printf("* ⊙結(jié)束運(yùn)算 * \n");
printf("************************************ \n");
printf("************************************ \n");
}
void main()
{
int c,d; /*用于做四則運(yùn)算的兩個(gè)數(shù)值的說(shuō)明*/
double a,b; /*用來(lái)做累加函數(shù)的兩個(gè)參數(shù)值的說(shuō)明*/
int intresult;
double result; /*用于保存表單運(yùn)算中函數(shù)的返回值*/
int choice;
displaymenu();/*保存用戶選擇項(xiàng)目菜單項(xiàng)*/
while(1)
{
printf("請(qǐng)選擇你所進(jìn)行運(yùn)算項(xiàng)目的符號(hào):");
scanf("%d",choice);
switch(choice)
{
case 1: /*加法計(jì)算*/
printf("請(qǐng)輸入兩個(gè)數(shù)字:");
scanf("%lf%lf",a,b);
result=sum(a,b);
printf("%lf+%lf的計(jì)算結(jié)果是:%lf\n",a,b,result);
break;
case 2: /*減法計(jì)算*/
printf("請(qǐng)輸入兩個(gè)數(shù)字:");
scanf("%lf%lf",a,b);
result=sub(a,b);
printf("%lf-%lf的計(jì)算結(jié)果是:%lf\n",a,b,result);
break;
case 3: /*乘法計(jì)算*/
printf("請(qǐng)輸入兩個(gè)數(shù)字:");
scanf("%lf%lf",a,b);
result=mul(a,b);
printf("%lf*%lf的計(jì)算結(jié)果是:%lf\n",a,b,result);
break;
case 4: /*除法計(jì)算*/
{
scanf("%lf%lf",a,b);
if(b-0.0EPS) printf("數(shù)字錯(cuò)誤\n");
else
{
printf("請(qǐng)輸入兩個(gè)數(shù)字:");
result=divv(a,b);
printf("%lf/%lf的計(jì)算結(jié)果是:%lf\n",a,b,result);
}
break;
}
case 5: /*取余計(jì)算*/
printf("請(qǐng)輸入兩個(gè)數(shù)字:");
scanf("%d%d",c,d);
result=rem(c,d);
printf("%d % %d的計(jì)算結(jié)果是:%d\n",c,d,result);
break;
case 6: /*累加計(jì)算*/
printf("請(qǐng)輸入兩個(gè)整數(shù)");
scanf("%d%d",c,d);
intresult=addnumber(c,d);
printf("%d-%d的累加計(jì)算結(jié)果是:%d\n",c,d,intresult);
break;
case 7: //階乘計(jì)算
{
printf("請(qǐng)輸入一個(gè)大于0小于10的整數(shù)字");
scanf("%d",c);
if(c0||c10)
{
printf("請(qǐng)輸入一個(gè)大于0小于10的整數(shù)字,數(shù)據(jù)錯(cuò)誤。\n");
break;
}
intresult=factor(c);
printf("%d的階乘計(jì)算結(jié)果是:%d\n",c,intresult);
break;
}
case 0:
printf("謝謝使用。歡迎下次再用。\n");
return ;
default:
printf("選擇錯(cuò)誤,程序結(jié)束\n");
break;
}
}
}
三角函數(shù)直接用庫(kù)函數(shù)
#include "math.h"
#include "stdio.h"
void main()
{
char a = ' ';
double i;
printf("請(qǐng)輸入要計(jì)算的函數(shù)類型!例如:s(arcsin),c(arccosine),t(arctangent)\n");
scanf("%c",a);
printf("請(qǐng)輸入要計(jì)算的值!\n");
scanf("%lf",i);
switch(a)
{
case 's':printf("%lf",asin(i));break;
case 'c':printf("%lf",acos(i));break;
case 't':printf("%lf",atan(i));break;
}
}
很簡(jiǎn)單的,比如你已經(jīng)有一個(gè)表達(dá)式char exp[];
那么 char * s = strstr(exp, "sin");
if(s) {
執(zhí)行sin(alpha)
}
就可以了
strstr是一個(gè)字符串函數(shù),用于查找字符串內(nèi)與關(guān)鍵字匹配的那個(gè)位置
比如char exp[] = "cos(a) + sin(b) - tan(c)";
那么char * s = strstr(exp, "sin");
printf(s)的結(jié)果是:
sin(b) - tan(c)
#include
#include
int main()
{
double n; //sin cos是函數(shù),不能定義成變量
scanf("%lf",n);
n=sin(n); //求n的sin()值,并返回給n
printf("%lf\n",n);//輸出n
return 0;
}
包含頭文件math.h后,所有三角函數(shù)的庫(kù)函數(shù)就都可以直接引用了。比如求x的正弦就用sin(x),它返回一個(gè)double值。注意x以弧度計(jì)……