- -|| 忍不住吐槽。。二樓的童鞋寫的程序好長啊。。。有必要嗎
創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、翼城網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5網(wǎng)站設計、購物商城網(wǎng)站建設、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為翼城等各大城市提供網(wǎng)站開發(fā)制作服務。
#includestdio.h
int main()
{
double x,y; // 有除法的題要注意一下,計算機中,整數(shù)除法是不準的。。。會省掉余數(shù)
printf("please input x"); //所謂的提示句子,我做作業(yè)時一般都不寫= =!
scanf("%lf",x); //這里要注意一下地是,double型的數(shù)據(jù)輸入用 lf 。我經(jīng)常習慣性地寫 d
printf("Y=5+7(x-6)/9\n"); // 又一句提示,可有可無
y=5+7*(x-6)/9;
printf("%g\n",y);
}
其實用函數(shù)去寫的話會是整段代碼好看些,至少簡潔一點。不過我寫這么短的代碼的時候除非特意練習函數(shù),否則一般都不用的。
我注意看了一下1L,發(fā)現(xiàn)輸出寫錯了- -!printf 的實數(shù)一律統(tǒng)一 %f 無論是單精度還是雙精度
不過我一般習慣用 %g 因為這種輸出會省掉后面不必要的零
#include stdlib.h
#include math.h
#include conio.h
#include stdio.h
#include string.h
void SplitPrem(char *str);
float Combine();
char str[200],str1[200],str2[50][30],operate_c[50],sub_str[30];
int operate_2str[50];
int strnum=0,operatenum=0; /* 子字符串個數(shù),操作符個數(shù) */
int i,j,k,flag;
float f=0.0,str_f[50];
void main()
{
float temp;
printf("請輸入一個字符串表達式:\n");
gets(str);
strcpy(str1,str);
SplitPrem(str1);
temp=Combine();
printf("%s=%g\n",str,temp);
}
/* 分解為子字符串和操作符 */
void SplitPrem(char *str1)
{
j=strlen(str1);
sub_str[0]=str1[0];
k=1;
for( i=1; ij; i++)
{
if(str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-')
{
sub_str[k]=0;
strcpy(str2[strnum],sub_str);
operate_c[operatenum]=str1[i];
operate_2str[operatenum]=strnum;
strnum++;
operatenum++;
k=0;
}
else
{
sub_str[k]=str1[i];
k++;
}
}
if(k0)
{
sub_str[k]=0;
strcpy(str2[strnum],sub_str);
strnum++;
}
for( i=0; istrnum; i++)
str_f[i]=atof(str2[i]); /* 字符串轉(zhuǎn)化為浮點數(shù) */
}
/*先計算乘除,后計算加減,每計算一次,子字符串和操作符向前移動 */
float Combine()
{
while(1)
{
flag=0;
for( i=0; ioperatenum; i++)
{
if(operate_c[i]=='*'||operate_c[i]=='/')
{
if(operate_c[i]=='*')
{
f=str_f[operate_2str[i]]*str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for( j=i; joperatenum-1; j++)
{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for( j=operate_2str[i]+1; jstrnum-1; j++)
str_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
else
{
f=str_f[operate_2str[i]]/str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for( j=i; joperatenum-1; j++)
{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for( j=operate_2str[i]+1; jstrnum-1; j++)
str_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
}
}
if(flag==0)break;
}
while(1)
{
flag=0;
for( i=0; ioperatenum; i++)
{
if(operate_c[i]=='+'||operate_c[i]=='-')
{
if(operate_c[i]=='+')
{
f=str_f[operate_2str[i]]+str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for( j=i; joperatenum-1; j++)
{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for( j=operate_2str[i]+1; jstrnum-1; j++)
str_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
else
{
f=str_f[operate_2str[i]]-str_f[operate_2str[i]+1];
str_f[operate_2str[i]]=f;
for( j=i; joperatenum-1; j++)
{
operate_c[j]=operate_c[j+1];
operate_2str[j]=operate_2str[j+1]-1;
}
for( j=operate_2str[i]+1; jstrnum-1; j++)
str_f[j]=str_f[j+1];
operatenum=operatenum-1;
strnum=strnum-1;
flag=1;
}
}
}
if(flag==0)break;
}
return f;
}
聲明一個myCOperate *型指針pOperate,并用strOperateField和調(diào)用函數(shù)RUNTIME_CLASS(myCOperate)的返回值調(diào)用函數(shù)etOperate,把函數(shù)etOperate的返回值賦給指針pOperate。
#define STACK_INIT_SIZE 10 /* 存儲空間初始分配量 */
#define STACKINCREMENT 2 /* 存儲空間分配增量 */
typedef struct SqStack
{
SElemType *base; /* 在棧構造之前和銷毀之后,base的值為NULL */
SElemType *top; /* 棧頂指針 */
int stacksize; /* 當前已分配的存儲空間,以元素為單位 */
}SqStack; /* 順序棧 */
Status InitStack(SqStack *S)
{ /* 構造一個空棧S */
(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存儲分配失敗 */
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return OK;
}
Status GetTop(SqStack S,SElemType *e)
{ /* 若棧不空,則用e返回S的棧頂元素,并返回OK;否則返回ERROR */
if(S.topS.base)
{
*e=*(S.top-1);
return OK;
}
else
return ERROR;
}
Status Push(SqStack *S,SElemType e)
{ /* 插入元素e為新的棧頂元素 */
if((*S).top-(*S).base==(*S).stacksize) /* 棧滿 */
return ERROR;
*((*S).top)++=e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{ /* 若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR */
if((*S).top==(*S).base)
return ERROR;
*e=*--(*S).top;
return OK;
}
#includestdio.h
#includestdlib.h /* atoi() */
#includemath.h
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; /* Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 */
typedef int Boolean; /* Boolean是布爾類型,其值是TRUE或FALSE */
/* 表達式求值(范圍為int類型,輸入負數(shù)要用(0-正數(shù))表示) */
typedef int SElemType; /* 棧元素類型為整型,改進算法3.4 */
#include"stack.h"
SElemType Precede(SElemType t1,SElemType t2)
{ /* 根據(jù)教科書表3.1,判斷兩符號的優(yōu)先關系 */
SElemType f;
switch(t2)
{
case '+':
case '-':if(t1=='('||t1=='=')
f='';
else
f='';
break;
case '*':
case '/':if(t1=='*'||t1=='/'||t1==')')
f='';
else
f='';
break;
case '(':if(t1==')')
{
printf("ERROR1\n");
exit(ERROR);
}
else
f='';
break;
//將此函數(shù)補充完整
//......
return f;
}
Status In(SElemType c)
{ /* 判斷c是否為運算符 */
switch(c)
{
case'+':
case'-':
//將此函數(shù)補充完整
//......
}
}
SElemType Operate(SElemType a,SElemType theta,SElemType b)
{
SElemType c;
switch(theta)
{
case'+':c=a+b;
break;
//將此函數(shù)補充完整
//......
}
return c;
}
SElemType EvaluateExpression()
{ /* 算術表達式求值的算符優(yōu)先算法。設OPTR和OPND分別為運算符棧和運算數(shù)棧 */
SqStack OPTR,OPND;
SElemType a,b,d,x,theta;
char c; /* 存放由鍵盤接收的字符串 */
char z[6]; /* 存放整數(shù)字符串 */
int i;
InitStack(OPTR); /* 初始化運算符棧 */
Push(OPTR,'='); /* =是表達式結(jié)束標志 */
InitStack(OPND); /* 初始化運算數(shù)棧 */
c=getchar();
GetTop(OPTR,x);
while(c!='='||x!='=')
{
if(In(c)) /* 是7種運算符之一 */
switch(Precede(x,c))
{
case'':Push(OPTR,c); /* 棧頂元素優(yōu)先權低 */
c=getchar();
break;
//將此函數(shù)補充完整
//......
}
else if(c='0'c='9') /* c是操作數(shù) */
{
//將此函數(shù)補充完整
//......
}
else /* c是非法字符 */
{
printf("ERROR3\n");
exit(ERROR);
}
GetTop(OPTR,x);
}
GetTop(OPND,x);
return x;
}
void main()
{
printf("請輸入算術表達式,負數(shù)要用(0-正數(shù))表示,并以=結(jié)束\n");
printf("%d\n",EvaluateExpression());
}
我這個程序使用了棧這個數(shù)據(jù)結(jié)構,功能是:任意輸入一個數(shù)學表達式以#結(jié)束,可以包括小括號,其他括號不行,我這個程序功能挺強的,可有任意位數(shù),你運行試一下:
//此表達式求值程序功能:運算數(shù)可以是任意位數(shù),可以是負數(shù),可以含任意對匹配的括號
//如,-8+3*(-8+23)-12#;另外還有簡單的表達式輸入錯誤的判斷的功能,
//括號不匹配,運算符多輸入或少輸入;
#includemalloc.h
#includestdio.h
#define error -1
typedef struct snode1{
int data;
struct snode1*next;
}snode1,*linkstack1;
typedef struct snode2{
char c;
struct snode2*next;
}snode2,*linkstack2;
initstack1(linkstack1*s)
{
*s=(linkstack1)malloc(sizeof(snode1));
(*s)-next=NULL;
}
initstack2(linkstack2*s)
{
*s=(linkstack2)malloc(sizeof(snode2));
(*s)-next=NULL;
}
int popstack1(linkstack1 s)
{
int e;
linkstack1 p;
if(!(s-next))
{ printf("The stack is empty.");return error; }
p=s-next;
e=p-data;
s-next=p-next;
free(p);
return e;
}
pushstack1(linkstack1 s,int x)
{linkstack1 p;
p=(linkstack1)malloc(sizeof(snode1));
p-data=x;
p-next=s-next;
s-next=p;
}
char popstack2(linkstack2 s)
{char e;linkstack2 p;
if(!(s-next))
{
printf("The stack is empty.");return '\0'; }
p=s-next;
e=p-c;
s-next=p-next;
free(p);
return e;
}
pushstack2(linkstack2 s,char x)
{linkstack2 p;
p=(linkstack2)malloc(sizeof(snode2));
p-c=x;
p-next=s-next;
s-next=p;
}
Gettopstack1(linkstack1 s)
{if(!(s-next))
{printf("The stack is empty .");return error;
}
return (s-next-data);
}
char Gettopstack2(linkstack2 s)
{
if(!(s-next))
{printf("The stack is empty .");return '\0';
}
return(s-next-c);
}
char Precede(char c1,char c2)//此函數(shù)功能為:比較兩運算符的優(yōu)先級,定義了兩個整
{int a,b; //形變量與這兩運算符相對應,依據(jù)這兩優(yōu)先級,巧妙設置兩變量的值
switch(c1) //通過這兩整形變量值的大小判定兩運算符的優(yōu)先級
{case'+':
case'-':a=2;break;
case'*':
case'/':a=4;break;
case'#':a=-1;break;
case'(':a=0;break;
case')':a=5;break;
}
switch(c2)
{case'+':
case'-':b=1;break;
case'*':
case'/':b=3;break;
case'#':b=-1;break;
case'(':b=5;break;
case')':b=0;break;
}
if(a==b)return('=');
else if(ab)return('');
else return('');
}
int In(char c)//判定是否是運算符
{ int a;
switch(c)
{case'+':
case'-':
case'*':
case'#':
case'(':
case')':
case'/':a=1;break;
default:a=0;
}
return a;
}
operate(int a,int b,char c)//進行二元運算a@b;
{int x;
switch(c)
{case'+':x=a+b;break;
case'-':x=a-b;break;
case'*':x=a*b;break;
case'/':x=a/b;break;
}
return (x);
}
In2(char ch)//以下這三個函數(shù)是判定括號是否匹配
{ int a;
switch(ch)
{case'(':
case'[':
case'{':a=1;break;//這個函數(shù)判定是不是括號,左括號還是右括號
case')':
case']':
case'}':a=2;break;
default:a=0;
}
return a;
}
match1(char c1,char c2)//判定這兩個括號是不是匹配
{int a;int b;
switch(c1)
{case'(':a=1;break;
case'[':a=2;break;
case'{':a=3;break;
}
switch(c2)
{case')':b=1;break;
case']': b=2;break;
case'}':b=3;break;
}
if(a==b)return 1;
else return 0;
}
match(char*s)
{linkstack2 p;//這是判定整個表達式括號匹配的主導函數(shù),利用了棧這個數(shù)據(jù)結(jié)構
int a ;
initstack2(p);
while(*s)
{a=In2(*s);
if(a==1){pushstack2(p,*s);s++; }
else if(a==2)
{
if(match1(popstack2(p),*s))s++;
else return 0;
}
else s++;
}
if(!(p-next)) return 1;
else return 0;
} //到這里為止
IsRight(char ch1,char ch2)
{
if(In(ch1)In(ch2))
{if(ch2=='('ch1!=')')return 1;
else if(ch1==')'ch2!='(')return 1;
else return 0;
}
else return 1;
}
int EvaluateExpreession()
{char *s,*t,ch;int i=0, sum,a,b,total;
linkstack1 opnd;linkstack2 optr;
initstack1(opnd);
initstack2(optr);pushstack2(optr,'#');
t=(char*)malloc(20*sizeof(char));//為t分配空間
gets(t);//將輸入的表達式先保存在字符竄t中
if(!match(t)){printf("syn Erroe!"); return error; }//判定輸入的表達式中括號是否匹配,
//如果不的話,輸入錯誤
s=(char*)malloc(30*sizeof(char));//對表達式中的第一個字符進行處理,如果是'-'的話
if(*t=='-')s[i++]='0';//在它前面補0,如果是+的話,則應將其去掉:這兩種不能視為錯誤
if(*t=='+'(t[1]=='('||!In(t[1])))t++;//應看作視冗余,我們應處理一下
ch=*t;
t++;
while(*t)//下面這個循環(huán)功能是:將這樣的輸入進行處理--(-2---)和(+2---)
{ //方法是在負號前補0,將多余的+去除
if(ch=='('*t=='-')
{s[i++]=ch;s[i++]='0';}
else if(ch=='('*t=='+')
{t++;s[i++]=ch;}
else s[i++]=ch;
ch=*t;t++;
}
s[i]=ch;//到這里經(jīng)過處理后的字符竄都已經(jīng)存在了s中了
ch=*s++;
while(ch!='#'||Gettopstack2(optr)!='#')//以下為計算的主體部分
{
if(!In(ch))
{ sum=0;
while(!(In(ch)))//如果是數(shù)字,則將其放入整形變量sum中,并不斷循環(huán),直至
{ //不是數(shù)字為止,最后壓入棧中,因此這起到了多位數(shù)的計算功能
sum=10*sum+ch-48;
if(*s=='#')ch=*s;
else ch=*s++;
}
pushstack1(opnd,sum);
}
// if(!IsRight(ch,*s)){printf("Syn Error!");return error; }
switch(Precede(Gettopstack2(optr),ch))//如果遇到運算符,則將其與棧頂?shù)倪\算符
{ //進行優(yōu)先級的比較
case'':pushstack2(optr,ch);ch=*s++;break;//如果棧頂中的低,則將其壓入運算符棧中
case'=':popstack2(optr); ch=*s++; break;//如果相等,那么是遇到了左右括號,兩都仍掉
case'': //如果棧中高,則進行計算
if(!(opnd-next)){printf("Syn Error!");return;} //如果數(shù)棧中竟然沒數(shù),則說明表達式輸入錯誤
else b=popstack1(opnd);
if(!(opnd-next)){printf("Syn Error!");return;}
else a=popstack1(opnd);
total=operate(a,b,popstack2(optr));
pushstack1(opnd,total);break;
}
}
if(opnd-next-next){printf("Syn Error!");return;}//運算結(jié)束后,數(shù)棧中還有兩個以上數(shù),則說明表達式錯誤
printf("biao da shi zhi shi %d ", Gettopstack1(opnd));
}
main()
{
printf("please input the biaodashi:");
EvaluateExpreession();
}
我的能運行!!但表達式末尾加要加#
例如2+3要打2+3#
#includecstdio
#includemalloc.h
#define NULL 0
typedef struct node{
char date;
struct node *next;
}SNode;
SNode *InitStack(){
SNode *top;
top=(SNode *)malloc(sizeof(SNode));
top-next=NULL;
return top;
}
void PushOptr(SNode *top,char x){
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
p-date=x;
p-next=top-next;
top-next=p;
}
char PopOptr(SNode *top){
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top-next;
x=p-date;
top-next=p-next;
free(p);
return x;
}
void PushOpnd(SNode *top,char x){
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
p-date=x;
p-next=top-next;
top-next=p;
}
char PopOpnd(SNode *top){
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top-next;
x=p-date;
top-next=p-next;
free(p);
return x;
}
char GetTop(SNode *top){
return (top-next)-date;
}
int In(char c){
int n;
switch(c){
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':n=1;break;
default:n=0;break;
}
return n;
}
char Precede(char x,char y){
int i,j;
int form[7][7]={{1,1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,1,1,-1,1,1},{1,1,1,1,-1,1,1},{-1,-1,-1,-1,-1,0,2},{1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};
switch(x){
case '+':i=0;break;
case '-':i=1;break;
case '*':i=2;break;
case '/':i=3;break;
case '(':i=4;break;
case ')':i=5;break;
case '#':i=6;break;
}
switch(y){
case '+':j=0;break;
case '-':j=1;break;
case '*':j=2;break;
case '/':j=3;break;
case '(':j=4;break;
case ')':j=5;break;
case '#':j=6;break;
}
if(form[i][j]==1)
return '';
else
if(form[i][j]==-1)
return '';
else
return '=';
}
int Operate(char x,char z,char y){
int a=x-'0',b=y-'0';
switch(z){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
}
char Eval_Exp(){
char a,b,c,r,f,z;
int result;
SNode *top[2];
top[0]=InitStack();
PushOptr(top[0],'#');
top[1]=InitStack();
c=getchar();
while(c!='#'||(GetTop(top[0]))!='#'){
if(!In(c)){
PushOpnd(top[1],c);
c=getchar();
}
else{
r=Precede(GetTop(top[0]),c);
switch(r){
case '':PushOptr(top[0],c);
c=getchar();
break;
case '=':PopOptr(top[0]);
c=getchar();
break;
case '':b=PopOptr(top[0]);
a=PopOpnd(top[1]);
z=PopOpnd(top[1]);
result=Operate(z,b,a);
f=result+'0';
PushOpnd(top[1],f);
break;
}
}
}
return f;
}
void main(){
char result;
result=Eval_Exp();
printf("%d\n",result-'0');
}
名稱欄目:operate函數(shù)C語言,假設函數(shù)operate的部分c代碼如下
分享網(wǎng)址:http://m.newbst.com/article40/dsigheo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化、小程序開發(fā)、靜態(tài)網(wǎng)站、動態(tài)網(wǎng)站、網(wǎng)站改版、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)