用C語言編寫的公式計算器
標頭檔案
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define MAX_SIZE 256
enum BOOL{FALSE,TRUE};
typedef struct tagOPERATE{
double Operand;
char Operator;
}OPERATE,*LPOPERATE;
void PostSrc(char *src,LPOPERATE lpOperator);
int IsDigit(char);
int isp(char ch);
int icp(char ch);
int Locate(char ch);
int getOperand(char *s,int *len,double *oprd);
double Calculate(LPOPERATE lpOperator,double x);
void SrcFunProc(char *src);
void _Proc(char*src);
以下是原始檔的內容
#include"sin.h"
static char Operator[]="#(+-*/^";
static int InPriority[]={0,1,3,3,5,5,7};
static int OutPriority[]={0,10,2,2,4,4,6};
int Locate(char ch)
{
int i=0;
for(i=0;Operator[i]!='/0';i++)
if(Operator[i]==ch)
return i;
return -1;
}
int isp(char ch)
{
if('A'<=ch&&'Z'>=ch)
return 9;
else
return InPriority[Locate(ch)];
}
int icp(char ch)
{
if('A'<=ch&&'Z'>=ch)
return 8;
else
return OutPriority[Locate(ch)];
}
void _Proc(char*src)
{
char Buffer[MAX_SIZE];
char*p=src,*q=Buffer;
*q++=*p++;
while('/0'!=*p)
{
if('-'==*p&&'('==*(p-1))
{
*q++='0';
*q++='-';
p++;
}
else
*q++=*p++;
}
*q='/0';
strcpy(src,Buffer);
}
void SrcFunProc(char*src)
{
char Buffer[MAX_SIZE];
char*p=src,*q=Buffer;
while(*p!='/0')
{
switch(*p)
{
case 's': // A for sin
*q++='A';
p+=3;
break;
case 'c': // B for cos
*q++='B';
p+=3;
break;
case 'e': //C for exp
*q++='C';
p+=3;
break;
case 'l':
if('n'==*(p+1)) //D for ln()
*q++='D';
else
*q++='E'; //E for lg()
p+=2;
break;
case 't': //F for tan()
*q++='F';
p+=3;
break;
default:
*q++=*p++;
break;
}
}
*q='/0';
strcpy(src,Buffer);
}
void PostSrc(char*src,LPOPERATE lpOperator)
{
char *p=src,y;
LPOPERATE lpOptr=lpOperator;
char stack[MAX_SIZE];
int top=-1;
double Operand;
int offset=0;
stack[++top]='#';
while('/0'!=*p)
{
if(IsDigit(*p))
{
getOperand(p,&offset,&Operand);
p+=offset;
lpOptr->Operand=Operand;
lpOptr->Operator=0;
lpOptr++;
}
else
if('x'==*p)
{
(lpOptr++)->Operator='x';
p++;
}
else
if('p'==*p)
{
lpOptr->Operand=3.14159266;
p+=2;
lpOptr->Operator=0;
lpOptr++;
}
else
if(')'==*p)
{
for(y=stack[top--];y!='(';y=stack[top--])
(lpOptr++)->Operator=y;
p++;
}
else
{
for(y=stack[top--];isp(y)>icp(*p);y=stack[top--])
(lpOptr++)->Operator=y;
stack[++top]=y;
stack[++top]=*p++;
}
}
while(top!=-1)
(lpOptr++)->Operator=stack[top--];
}
int IsDigit(char ch)
{
if(('0'<=ch&&'9'>=ch)||'.'==ch)
return TRUE;
return FALSE;
}
int getOperand(char *s,int *len,double *oprd){
char *p = s,ch = *s++;
double z = 0,x = 0;
int bits = 0;
int point = FALSE;
while( IsDigit(ch) == TRUE){
if (ch == '.'){
if (point == TRUE)
return FALSE;
point = TRUE;
}
else {
if (point == TRUE){
x *= 10;
x += ch - '0';
bits++;
}
else {
z *= 10;
z += ch - '0';
}
}
ch = *s++;
}
while(bits-- > 0) x /= 10;
z += x;
*oprd = z;
*len = s - p - 1;
return TRUE;
}
double Calculate(LPOPERATE lpOperator,double x)
{
double stack[MAX_SIZE],y1,y2;
int top=-1;
LPOPERATE lpOptr=lpOperator;
stack[++top]=0;
while(lpOptr->Operator!='#')
{
if(!lpOptr->Operator)
stack[++top]=(lpOptr++)->Operand;
else
if('x'==lpOptr->Operator)
{
stack[++top]=x;
lpOptr++;
}
else
switch ((lpOptr++)->Operator)
{
case '+':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y1+y2;
break;
case '-':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y2-y1;
break;
case '*':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y1*y2;
break;
case '/':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y2/y1;
break;
case '^':
y1=stack[top--];
y2=stack[top--];
stack[++top]=pow(y2,y1);
break;
case 'A':
y1=stack[top--];
stack[++top]=sin(y1);
break;
case 'B':
y1=stack[top--];
stack[++top]=cos(y1);
break;
case 'C':
y1=stack[top--];
stack[++top]=exp(y1);
break;
case 'D':
y1=stack[top--];
stack[++top]=log(y1);
break;
case 'E':
y1=stack[top--];
stack[++top]=log10(y1);
break;
case 'F':
y1=stack[top--];
stack[++top]=tan(y1);
break;
default:
break;
}
}
return stack[top];
}
void main()
{
char src[MAX_SIZE];
double d;
OPERATE postsrc[MAX_SIZE];
memset(src,0,MAX_SIZE);
printf("公式計算器 作者:趙國玉/n輸入任意表示式開始計算,輸入quit結束程式/n常量 pi=3.14159266/n");
scanf("%s",src);
while(strcmp(src,"quit"))
{
_Proc(src);
SrcFunProc(src);
PostSrc(src,postsrc);
d=Calculate(postsrc,3.1415926);
printf("計算結果是:%f/n",d);
memset(src,0,MAX_SIZE);
scanf("%s",src);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define MAX_SIZE 256
enum BOOL{FALSE,TRUE};
typedef struct tagOPERATE{
double Operand;
char Operator;
}OPERATE,*LPOPERATE;
void PostSrc(char *src,LPOPERATE lpOperator);
int IsDigit(char);
int isp(char ch);
int icp(char ch);
int Locate(char ch);
int getOperand(char *s,int *len,double *oprd);
double Calculate(LPOPERATE lpOperator,double x);
void SrcFunProc(char *src);
void _Proc(char*src);
以下是原始檔的內容
#include"sin.h"
static char Operator[]="#(+-*/^";
static int InPriority[]={0,1,3,3,5,5,7};
static int OutPriority[]={0,10,2,2,4,4,6};
int Locate(char ch)
{
int i=0;
for(i=0;Operator[i]!='/0';i++)
if(Operator[i]==ch)
return i;
return -1;
}
int isp(char ch)
{
if('A'<=ch&&'Z'>=ch)
return 9;
else
return InPriority[Locate(ch)];
}
int icp(char ch)
{
if('A'<=ch&&'Z'>=ch)
return 8;
else
return OutPriority[Locate(ch)];
}
void _Proc(char*src)
{
char Buffer[MAX_SIZE];
char*p=src,*q=Buffer;
*q++=*p++;
while('/0'!=*p)
{
if('-'==*p&&'('==*(p-1))
{
*q++='0';
*q++='-';
p++;
}
else
*q++=*p++;
}
*q='/0';
strcpy(src,Buffer);
}
void SrcFunProc(char*src)
{
char Buffer[MAX_SIZE];
char*p=src,*q=Buffer;
while(*p!='/0')
{
switch(*p)
{
case 's': // A for sin
*q++='A';
p+=3;
break;
case 'c': // B for cos
*q++='B';
p+=3;
break;
case 'e': //C for exp
*q++='C';
p+=3;
break;
case 'l':
if('n'==*(p+1)) //D for ln()
*q++='D';
else
*q++='E'; //E for lg()
p+=2;
break;
case 't': //F for tan()
*q++='F';
p+=3;
break;
default:
*q++=*p++;
break;
}
}
*q='/0';
strcpy(src,Buffer);
}
void PostSrc(char*src,LPOPERATE lpOperator)
{
char *p=src,y;
LPOPERATE lpOptr=lpOperator;
char stack[MAX_SIZE];
int top=-1;
double Operand;
int offset=0;
stack[++top]='#';
while('/0'!=*p)
{
if(IsDigit(*p))
{
getOperand(p,&offset,&Operand);
p+=offset;
lpOptr->Operand=Operand;
lpOptr->Operator=0;
lpOptr++;
}
else
if('x'==*p)
{
(lpOptr++)->Operator='x';
p++;
}
else
if('p'==*p)
{
lpOptr->Operand=3.14159266;
p+=2;
lpOptr->Operator=0;
lpOptr++;
}
else
if(')'==*p)
{
for(y=stack[top--];y!='(';y=stack[top--])
(lpOptr++)->Operator=y;
p++;
}
else
{
for(y=stack[top--];isp(y)>icp(*p);y=stack[top--])
(lpOptr++)->Operator=y;
stack[++top]=y;
stack[++top]=*p++;
}
}
while(top!=-1)
(lpOptr++)->Operator=stack[top--];
}
int IsDigit(char ch)
{
if(('0'<=ch&&'9'>=ch)||'.'==ch)
return TRUE;
return FALSE;
}
int getOperand(char *s,int *len,double *oprd){
char *p = s,ch = *s++;
double z = 0,x = 0;
int bits = 0;
int point = FALSE;
while( IsDigit(ch) == TRUE){
if (ch == '.'){
if (point == TRUE)
return FALSE;
point = TRUE;
}
else {
if (point == TRUE){
x *= 10;
x += ch - '0';
bits++;
}
else {
z *= 10;
z += ch - '0';
}
}
ch = *s++;
}
while(bits-- > 0) x /= 10;
z += x;
*oprd = z;
*len = s - p - 1;
return TRUE;
}
double Calculate(LPOPERATE lpOperator,double x)
{
double stack[MAX_SIZE],y1,y2;
int top=-1;
LPOPERATE lpOptr=lpOperator;
stack[++top]=0;
while(lpOptr->Operator!='#')
{
if(!lpOptr->Operator)
stack[++top]=(lpOptr++)->Operand;
else
if('x'==lpOptr->Operator)
{
stack[++top]=x;
lpOptr++;
}
else
switch ((lpOptr++)->Operator)
{
case '+':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y1+y2;
break;
case '-':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y2-y1;
break;
case '*':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y1*y2;
break;
case '/':
y1=stack[top--];
y2=stack[top--];
stack[++top]=y2/y1;
break;
case '^':
y1=stack[top--];
y2=stack[top--];
stack[++top]=pow(y2,y1);
break;
case 'A':
y1=stack[top--];
stack[++top]=sin(y1);
break;
case 'B':
y1=stack[top--];
stack[++top]=cos(y1);
break;
case 'C':
y1=stack[top--];
stack[++top]=exp(y1);
break;
case 'D':
y1=stack[top--];
stack[++top]=log(y1);
break;
case 'E':
y1=stack[top--];
stack[++top]=log10(y1);
break;
case 'F':
y1=stack[top--];
stack[++top]=tan(y1);
break;
default:
break;
}
}
return stack[top];
}
void main()
{
char src[MAX_SIZE];
double d;
OPERATE postsrc[MAX_SIZE];
memset(src,0,MAX_SIZE);
printf("公式計算器 作者:趙國玉/n輸入任意表示式開始計算,輸入quit結束程式/n常量 pi=3.14159266/n");
scanf("%s",src);
while(strcmp(src,"quit"))
{
_Proc(src);
SrcFunProc(src);
PostSrc(src,postsrc);
d=Calculate(postsrc,3.1415926);
printf("計算結果是:%f/n",d);
memset(src,0,MAX_SIZE);
scanf("%s",src);
}
}
相關文章
- 用 C 語言編寫多程式 Web 伺服器【粗暴版】Web伺服器
- 編譯warp,d語言寫的c/c++前處理器.編譯C++
- C語言 編寫線段樹C語言
- 用C語言編寫小遊戲——“井字棋”C語言遊戲
- C語言程式設計>第八週 ② 編寫函式fun,函式的功能是:根據以下公式計算,計算結果作為函式值返回。C語言程式設計函式公式
- C語言練手專案--C 語言製作簡單計算器C語言
- 機器語言編寫helloworld
- 用python語言寫程式有什麼好用的編輯器?Python
- 用 golang 寫一個語言(編譯器,虛擬機器)Golang編譯虛擬機
- C語言用三目運算實現判斷大寫C語言
- C語言:迴文數計算C語言
- 教你在 C 語言上編寫自己的協程
- C語言編譯器手機版C語言編譯
- 用C語言寫strcat、strcpy、strlen、strcmpC語言
- Keepalived 2.0.14 釋出,C 語言編寫的路由軟體路由
- C語言如何計算陣列的長度C語言陣列
- C語言計算輸入字元的個數C語言字元
- C語言:計算輸入字元的個數C語言字元
- JavaScript編寫計算器的發展史JavaScript
- 計算機程式語言的分類,解釋型語言、編譯型語言、指令碼語言的關係計算機編譯指令碼
- 快速排序用C語言可以這麼寫排序C語言
- 使用C語言編寫貪食蛇程式原始碼C語言原始碼
- C語言爬蟲程式編寫的爬取APP通用模板C語言爬蟲APP
- 初學計算機語言者(C語言,C++,java,pytion,C#)計算機C語言C++JavaC#
- 使用Golang語言編寫Hello World Web應用GolangWeb
- 手機寫作業系統之 使用C語言編寫核心作業系統C語言
- C語言位運算C語言
- Cython,一個簡化 Python 編寫 C 擴充套件的語言Python套件
- C語言編譯器開發之旅(二):解析器C語言編譯
- word公式怎麼計算 word公式計算的方法公式
- 幽默:儘量用領域語言編寫程式碼
- Python編寫一個簡單計算器Python
- C語言 - 條件編譯C語言編譯
- C語言-檔案讀寫C語言
- C語言編寫作業系統有什麼好處C語言作業系統
- 計算機語言:編譯型/解釋型、動態語言/靜態語言、強型別語言/弱型別語言計算機編譯型別
- 編譯原理——C++版桌面計算器編譯原理C++
- C語言:使用函式計算兩點間的距離C語言函式
- 9 SystemVerilog語言編寫SPI接收