用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);
}
}
相關文章
- Java語言編寫計算器(簡單的計算器)Java
- 用 C 語言編寫一個簡單的垃圾回收器
- 用C語言編寫windows服務程式C語言Windows
- 用 C 語言編寫多程式 Web 伺服器【粗暴版】Web伺服器
- 用C語言編寫小遊戲——“井字棋”C語言遊戲
- 第一個C語言編譯器是怎樣編寫的?C語言編譯
- 第一個 C 語言編譯器是怎樣編寫的?編譯
- 機器語言編寫helloworld
- 用C語言編寫Linux實用程式的藝術(轉)C語言Linux
- C語言練手專案--C 語言製作簡單計算器C語言
- C語言 編寫線段樹C語言
- C語言程式設計>第八週 ② 編寫函式fun,函式的功能是:根據以下公式計算,計算結果作為函式值返回。C語言程式設計函式公式
- 編譯warp,d語言寫的c/c++前處理器.編譯C++
- 用 golang 寫一個語言(編譯器,虛擬機器)Golang編譯虛擬機
- C51-------時鐘程式(C語言編寫的微控制器時鐘)C語言
- 純 HTML+CSS+JavaScript 編寫的計算器應用HTMLCSSJavaScript
- C語言用三目運算實現判斷大寫C語言
- 用python語言寫程式有什麼好用的編輯器?Python
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- 使用C語言編寫貪食蛇程式原始碼C語言原始碼
- C語言:迴文數計算C語言
- 用C語言寫的程式不安全C語言
- 教你在 C 語言上編寫自己的協程
- 選擇使用c語言編寫的phalcon框架C語言框架
- java開發C語言編譯器:為C語言提供API呼叫JavaC語言編譯API
- 學習較底層程式設計:動手寫一個C語言編譯器程式設計C語言編譯
- 用VB寫計算器
- C語言編譯器手機版C語言編譯
- 用C語言寫strcat、strcpy、strlen、strcmpC語言
- JavaScript編寫計算器的發展史JavaScript
- c語言編寫經驗逐步積累4C語言
- C語言:計算輸入字元的個數C語言字元
- C語言計算輸入字元的個數C語言字元
- C語言如何計算陣列的長度C語言陣列
- HTML語言編寫指南HTML
- 如何編寫計算機模擬器計算機
- 計算機程式語言的分類,解釋型語言、編譯型語言、指令碼語言的關係計算機編譯指令碼
- 快速排序用C語言可以這麼寫排序C語言