當前位置:首頁 » 編程語言 » c語言中運算時有兩個括弧
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言中運算時有兩個括弧

發布時間: 2022-07-22 01:54:15

1. c語言作業,計算三個數字間的加減乘除,三個數字兩個運算符兩個括弧,考慮優先順序

所謂後綴表達式,就是將a @ b寫成 a b @
其中前者是我們日常生活中的中綴表達式,後面的就是後綴表達式。
例如7*8 化為 7 8 *
例如6-9 化為 6 9 -
例如5*(3+2),化成後綴表達式就是5 3 2 + *
可知後綴表達式無括弧。
然後依次掃描符號,數字就直接進棧,遇到運算符就將前兩個數字出棧、運算後結果再進棧:
例如5 3 2 + *
掃描5——>5
掃描3——>5 3
掃描2——>5 3 2
掃描+——>5 5
掃描*——>25


所以你現在要解決的問題是如何將中綴表達式轉化成後綴表達式。
這個依然是通過棧來實現。
從左到右掃描,遇到數字直接輸出,遇到符號比較優先順序進棧或輸出(優先順序大的進棧,小的或相等的直接輸出。其中左括弧優先順序大於乘除大於加減),遇到左括弧則進棧,遇到右括弧則將棧內左括弧之內的符號都輸出,遇到末尾就將棧內的所有符號都輸出。
例如5*(3+2)

掃描5 直接輸出
掃描* 進棧(棧內:*)
掃描( 進棧(站內:* ()
掃描3 直接輸出
掃描+ +的優先順序小於(的優先順序,進棧,(棧內:* ( +)
掃描2 直接輸出
掃描) 將站內(之前的全部輸出,即輸出了+
掃描到末尾,將棧內所有東西全部輸出,即輸出了*
綜上,輸出了5 3 2 + *


你可以看這個鏈接http://..com/question/552455212079542532.html?oldq=1

也是我回答的

2. C語言中的括弧運算

理論上來說

增加括弧只會增加編譯的時間 並且對運行的時間是沒有差別的

也就是增加了把你從c/c++代碼變成exe的時間,但是不會影響exe運行的時間

而且 增加一兩個括弧 對於計算機編譯時間的影響是微乎其微的

計算機一秒計算數量以億算 怎麼會差這一個括弧呢

關於代碼運行效率 更應該注意的是演算法,而不是這些語句 那個才能從本質上提高程序運行效率

多行的代碼 運行效率就不一定比單行的要低

作為源代碼重要的一是演算法 二是可讀性 增加括弧和增加有必要的換行不但不會降低運行效率,反而會使代碼更加容易理解 減少歧義的產生

3. 用簡單的C語言實現帶括弧的四則運算

#include<stdio.h> /*庫文件包含*/

#include<string.h> /*用於字元串操作*/

#include<stdlib.h> /*用於exit函數*/

/**************************************************************************

int check(char *c)

輸入參數:

char *c: 輸入的字元串

返回參數:

0:字元串中有不符合規定的字元

1: 字元串字元符合規定,沒有不符合規定的字元.

功能:

檢查字元串中有否除了 0-9, +,-,*,/,(,),之外的其他字元,

如果有,則返回0, 表示出現錯誤。

若沒有,則返回1,表式字元串符合規定。

**************************************************************************/

int check(char *c)

{

int k=0;

while(*c!='')

{

if((*c>='0' && *c<='9') || *c=='+' ||

*c=='-' || *c=='*' || *c=='/' ||

*c=='.' || *c=='(' || *c==')' )

{

}

else

{

printf("input error, there have the char not the math expression char! ");

return 0;

}

if(*c=='(')

k++;

else if(*c==')')

k--;

c++;

}

if(k!=0)

{

printf("input error, there is not have correct bracket '()'! ");

return 0;

}

return 1;

}

4. 用簡單的C語言實現帶括弧的四則運算

#include<stdio.h> /*庫文件包含*/
#include<string.h> /*用於字元串操作*/
#include<stdlib.h> /*用於exit函數*/

/**************************************************************************
int check(char *c)
輸入參數:
char *c: 輸入的字元串
返回參數:
0:字元串中有不符合規定的字元
1: 字元串字元符合規定,沒有不符合規定的字元.
功能:
檢查字元串中有否除了 0-9, +,-,*,/,(,),之外的其他字元,
如果有,則返回0, 表示出現錯誤。
若沒有,則返回1,表式字元串符合規定。
**************************************************************************/
int check(char *c)
{
int k=0;
while(*c!='\0')
{
if((*c>='0' && *c<='9') || *c=='+' ||
*c=='-' || *c=='*' || *c=='/' ||
*c=='.' || *c=='(' || *c==')' )
{

}
else
{
printf("input error, there have the char not the math expression char!\n");
return 0;
}

if(*c=='(')
k++;
else if(*c==')')
k--;

c++;
}
if(k!=0)
{
printf("input error, there is not have correct bracket '()'!\n");
return 0;
}
return 1;
}

/**************************************************************************
void move(char *f, double *s,int p)

輸入參數:
char *f : 運算符數組
double *s: 數值數組
int p: 當前運算符數組位置。
返回參數:

功能:
將當前已經完成運算的運算符消去,同時將數值數組的位置調整以進行下一次運算。
傳入值p若為3
則當前符號的數組位置為3.
f[3]=f[3+1].......f[len-2]=f[len-1] f[len-1]='\0';
s[i]=s[i+1].......s[len-1]=s[len] 因為數值比運算符多一個。
***************************************************************************/

void move(char *f, double *s,int p)
{
int i=0,len=strlen(f);
for(i=p; i<len; i++) /*將已經運算過的符號,空出來的位置用後面的符號來填充,*/
{ /*即把乘和除號的位置用後面的加和減號填充*/
f[i]=f[i+1];
s[i]=s[i+1];
}
s[i]=s[i+1];
f[len-1]='\0';
}
/**************************************************************************
double convnum(char *c)
輸入參數:
char *c :由數字和小數點組成的字元,用以轉換成double型的數值。
返回參數:
num:返回轉換好的值。
功能:
將輸入的字元串先將其小數點以前的部分復制到temp[]數組中,
若有小數點,則將小數點之後的數值,也就是小數部分先進行計算,值存入num中
計算完成後,再對整數部分進行計算,值加上小數部分的值,存入num中。
***************************************************************************/
double convnum(char *c)
{
double num=0.0;
double a=1.0;
int i=0,p=0,len=0;
char temp[100];
int tempi=0;
int start=0;
int f=1; /*正負符號指示器,若為1則為正數,為-1,此數為負數*/

len=strlen�0�8;

if(c[0]=='-')
{
start=1;
f=-1;
}
for(i=start; i<len; i++)
{
if(c[i]=='.')
{
p=i;
break;
}
temp[tempi++]=c[i]; /*將整數部分復制到temp[]中*/
}
temp[tempi]='\0';

if(p!=0)
{
for(i=p+1;i<len;i++) /*將小數部分計算出來*/
{
if(c[i]=='.') /*如果有多餘的小數點,則表示輸入錯誤*/
{
printf("there is more that one dot '.' in number!error!\n");
exit(0);
}
a=a*0.1;
num+=(a*(c[i]-48));
}
}

a=1.0;

len=strlen(temp); /*計算整數部分*/
for(i=len-1;i>=0; i--)
{
num=num+(a*(temp[i]-48));
a*=10;
}

num=num*f;
return num;
}

/**************************************************************************
double good(char *c)
輸入參數:
char *c :即將進行運算的字元串型數學表達式。如3.5+(2*3/5)
返回參數:
s[0]:計算結果將放入s[0]中
功能:
將輸入的字元串中的數字分別調用convnum(char *c)函數進行數值變換,再將其依
次存入doulbe s[i]中,將加減乘除運算符依次存入字元串符號數組 char f[i]中,
然後如果遇到括弧,則將括弧內的字元串存入另一字元數組中,然後用此
good(char *c) 遞歸函數進行遞歸運算。 然後根據先乘除,後加減的順序對已
存入數組的數值根 據存入字元串符號數組的運算符進行運算。結果存入s[0]中。
返回最終結果。
***************************************************************************/
double good(char *c) /*可遞歸函數*/
{ /*取得數值字元串,並調用convnum轉換成double*/
char g[100],number[30]; /*g,保存當前的表達式串,number保存一個數的所有字元*/
char f[80]; /*保存所有的符號的堆棧*/
int fi=0; /*保存符號的位置指針*/
double s[80]; /*保存當前所有的數的一個堆棧*/
int si=0; /*保存數字位置指針*/
int k=0; /* 若k=1則表示有一對括弧*/
int num=0,i=0; /*num保存新括弧內的字元數,i 保存number里的字元位置*/
int cc=0; /*乘除符號數量*/
int jj=0; /*加減符號數量*/

while(*c!='\0')/*當p==1 和k==0時,表示已經把括弧里的內容全部復制到g[100]中了*/
{
k=0;
num=0;

switch(*c)
{
case '+': /*當前字元為+-乘除時則表示*/
case '-':
case '*':
case'/':
f[fi++]=*c;
if(*c=='*' || *c=='/')
cc++;
else
jj++;
if(*(c-1)!=')')
{
number[i]='\0';
i=0;/*完成一個數字的復制,其位置指針i=0*/

s[si++]=convnum(number);
}
break;
case'(': /*有括弧,則將當前括弧作用范圍內的全部字元保存,作為*/
k++; /*一個新的字元表達式進行遞歸調用good函數計算。*/
while(k>0)
{
c++;
g[num]=*c;
num++;
if(*c==')')
{
k--;
}
else if(*c=='(')
{
k++;
}
}
g[num-1]='\0';
num=0;/*完成一個括弧內容的復制,其位置指針num=0*/
s[si++]=good(g);
break;
default:
number[i++]=*c;

if(*(c+1)=='\0')
{ number[i]='\0';
s[si++]=convnum(number);
}
break;
}

c++;
}

f[fi]='\0';

i=0;
while(cc>0)
{
switch(f[i])
{
case '*': cc--;
s[i+1]=s[i]*s[i+1];
move(f,s,i);
break;
case '/': cc--;
s[i+1]=s[i]/(float)s[i+1];
move(f,s,i);
break;
default:
i++;
break;
}
}

i=0;
while(jj>0)
{
switch(f[i])
{
case '+': s[i+1]=s[i]+s[i+1];
jj--;
move(f,s,i);
break;
case '-': s[i+1]=s[i]-s[i+1];
jj--;
move(f,s,i);
break;
default:
printf("operator error!");
break;
}
}

return s[0];
}

void main()
{
char str[100];
double sum=0;
int p=1;

while(1)
{
printf("enter expression: enter 'exit' end of program\n");
scanf("%s",str);
p=strcmp(str,"exit");
if(p==0)
break;
p=check(str);

if(p==0)
continue;
sum=good(str);
printf("%s=%f",str,sum);
printf("\n");
}
printf("good bye!\n");
}

5. C語言中括弧運算符的問題

哈哈,你這是一個逗號表達式。
它將以逗號為界,從左到右依次計算每個表達式的值,最後返回最右邊的表達式的值。
阿明白??

6. C語言實現帶有括弧的四則運算

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
char token[61]; /*存放表達式字元串的數組*/
int n=0;
void error(void) /*報告錯誤函數*/
{
printf("ERROR!\n");
exit(1);
}
void match(char expected) /*檢查字元匹配的函數*/
{
if(token[n]==expected)
token[++n]=getchar();
else error();
}
double term(void); /*計算乘除的函數*/
double factor(void); /*處理括弧和數字的函數*/
double exp(void) /*計算加減的函數*/
{
double temp=term();
while((token[n]=='+')||(token[n]=='-'))
switch(token[n])
{
case'+':match('+');
temp+=term();
break;
case'-':match('-');
temp-=term();
break;
}
return temp;
}
double term(void)
{
double div;
double temp=factor();
while((token[n]=='*')||(token[n]=='/'))
switch(token[n])
{
case'*':match('*');
temp*=factor();
break;
case'/':match('/');
div=factor();
if(div==0) /*處理除數為零的情況*/
{
printf("The divisor is zero!\n");
exit(1);
}
temp/=div;
break;
}
return temp;
}
double factor(void)
{
double temp;
char number[61];
int i=0;
if(token[n]=='(')
{
match('(');
temp=exp();
match(')');
}
else if(isdigit(token[n])||token[n]=='.')
{
while(isdigit(token[n])||token[n]=='.') /*將字元串轉換為浮點數*/
{
number[i++]=token[n++];
token[n]=getchar();
}
number[i]='\0';
temp=atof(number);
}
else error();
return temp;
}
main()
{
double result;
FILE *data=fopen("61590_4.dat","at");
if(data==NULL)
data=fopen("61590_4.dat","wt");
if(data==NULL)
return 0;
token[n]=getchar();
result=exp();
if(token[n]=='\n')
{
token[n]='\0';
printf("%s=%g\n",token,result);
fprintf(data,"%s=%g\n",token,result);
}
else error();
fclose(data);
return 0;
getch();
}

7. c語言中關於函數後面的小括弧

括弧後面是寫參數數的
int
max(int
x,int
y)代表這個max函數有2個參數
每個參數都是整型的,所以調用max函數用max(3,4)這樣的就可以
用max(1.1,2.2)這樣的數程序就會出錯
如果不說明參數的類型將無法進行函數中的運算及表示