當前位置:首頁 » 編程語言 » c語言實現四則復合運算
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言實現四則復合運算

發布時間: 2022-05-06 05:05:27

Ⅰ 用c語言編寫以計算器可以四則混合運算無括弧

無括弧四則運算那就很簡單了,在2型文法上進行描述,沒幾條產生式:
<表達式>
::=
<項>
(
+
|
-
)
<項>
<項>
->
::=
<數值>
(
*
|
/
)
<數值>
有了以上文法,也就可以很輕松的手寫出
parse:
#include
<stdio.h>
#include
<stdlib.h>
char
ch;
int
error
=
0;
double
number()
{

double
num
=
0;

while
((ch
=
getchar())
==
'
');

if
(ch
>=
'0'
&&
ch
<=
'9')

{

ungetc(ch,
stdin);

scanf("%lf",
&num);

}

else

error
=
1;

while
((ch
=
getchar())
==
'
');

return
num;
}
double
term()
{

double
num
=
number();

while
(ch
==
'*'
||
ch
==
'/')

if
(ch
==
'*')

num
*=
number();

else

num
/=
number();

return
num;
}
int
main()
{

double
num
=
term();

while
(ch
==
'+'
||
ch
==
'-')

if
(ch
==
'+')

num
+=
term();

else

num
-=
term();

if
(ch
!=
'\n')

error
=
1;

error
?
puts("語法錯誤")
:
printf("%lf",
num);

system("pause");

return
0;
}

Ⅱ C語言怎麼實現任意兩個數的四則運算

C語言實現任意兩個數的四則運算的方法:

1、閱讀代碼,使用了隨機函數:srand(unsigned( time(NULL)));通過調用隨機函數,將生成的100以內的隨機整數賦給不同的變數,一部分用於四則運算式數據的來源,而賦給變數c的隨機數則用於結合switch語句控製程序跳轉執行 不同的分支,即不同的四則運算,如下:

c = rand() % 5; //隨機產生小於5的非負整數

switch (c)

case 0:

case 1:

...........

case 5:

2、使用while語句控制除數不為0

while (b == 0)

{

b = rand() % 1; //若b=0則重新生成b,直到b不為0

}

3、使用if語句判斷減數與被減數的大小。

if (a > b) //使a<b

{

d = a;

a = b;

b = d;

}

if (m > n) //使m<n

{

d = m;

m = n;

n = d;

}

通過if判斷並賦值的手段保證結果不出現負數

4、 原代碼僅能一次性生成20個隨機的四則運算式,而無法從鍵盤輸入結果並判斷答案正確與否。

5、修改代碼。由於原代碼無法從鍵盤讀入數據,所以對其進行了改進。

(1)增加鍵盤讀入功能

scanf("%d",&x);

從鍵盤讀入輸入的答案

(2)對答案進行正確與否的判斷

if(x == (a+b))

printf("You are right! ");

else

printf("You are wrong! ");

通過比較輸入答案與運算得出的答案告知用戶計算是否正確。

6、上傳源代碼至GitHub。

Ⅲ 用c語言怎麼做四則運算

1 讀入第一個操作數
2 讀入運算符
3 讀入第二個操作數
4 根據運算符 計算結果
5 輸出。

如果是復合的表達式,就需要遞歸運行了。

Ⅳ 四則混合運算怎樣用C語言實現

寫個程序輸出結果吧
/*c++ program in vc 6.0*/
#include <iostream>
using namespace std;
int main()
{
//這里進行強制轉化為double,否則3/(4+5)為0
double res=1+2*(double)3/(4+5);
cout<<res<<endl;//輸出結果
return 0;
}

Ⅳ C語言怎麼實現四則運算

我曾用c編了個計算器,支持四則運算,支持括弧改變優先順序,你看看吧:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define Esc 27
#define Tab 9

void needle(char* s,char* carriage,int start)//needle意為「用針縫」
{
int size_carriage=(int)strlen(carriage);
int i,j;
for(j=0;j<size_carriage;j++)
{
for(i=(int)strlen(s);i>=start;i--)
s[i+1]=s[i];
s[i+1]=carriage[j];
start=i+2;
}
}

double factorial(double d)//factorial意為「階乘」
{
return d==0?1:d*factorial(d-1);
}

void handle(char* carriage)//handle意為「處理」
{
void find_start(char*,int*);
char* save1,*save2,ch;
char op[111];
double d1,d2;
int start,i;
find_start(carriage,&start);
ch=carriage[start];
d1=strtod(carriage,&save1);//strtod是庫函數,功能是將字元串carriage中出現的第一個浮點數轉化為double,並將剩餘字元儲存在save1中
if(ch=='!')
{
sprintf(op,"%g",factorial(d1));//springf是庫函數,功能是將顯示在屏幕上的內容儲存在op中
strcpy(carriage,op);
return;
}
for(i=0;i<(int)strlen(save1);i++)//對於第一個不是'+'或'-'或數字的字元串,strtod無法作用。所以得去掉諸如"*22"字元串中的'*'
save1[i]=save1[i+1];
d2=strtod(save1,&save2);
switch(ch)
{
case '*':sprintf(op,"%.32g",d1*d2);break;
case '/':sprintf(op,"%.32g",d1/d2);break;
case '+':sprintf(op,"%.16g",d1+d2);break;
case '-':sprintf(op,"%.16g",d1-d2);
}
strcpy(carriage,op);
}

void del(char* s,int start,int end)//delete意為「刪除」
{
int i,j;
int size=(int)strlen(s);
for(i=end;i>=start;i--)
for(j=i;j<size;j++)
s[j]=s[j+1];
}

void (char* s,char* carriage,int start,int end)//意為「復制」
{
int i;
for(i=0;start<=end;i++,start++)
carriage[i]=s[start];
carriage[i]='\0';
}

void scissor(char* s,char* carriage,int* start)//scissor意為「用剪刀剪」
{
int sta,end;
for(sta=*start-1;(s[sta]>='0'&&s[sta]<='9')||s[sta]=='.';sta--);
if(sta!=0||s[*start]=='!') //處理式子是-2+3或-2!的特殊情況
sta++;
if(s[*start]=='!')//'!'是單目運算符
end=*start;
else
{
for(end=*start+1;(s[end]>='0'&&s[end]<='9')||s[end]=='.';end++);
if((s[end-1]=='*'||s[end-1]=='/')&&(s[end]=='+'||s[end]=='-'))//處理式子是2*-2等的特殊情況
for(end++;(s[end]>='0'&&s[end]<='9')||s[end]=='.';end++);
end--;
}
(s,carriage,sta,end);
del(s,sta,end);
*start=sta;//記住等下針線函數needle要開始縫的地方
}

void find_start(char* s,int* start)//find_start意為「找到操作符號開始處」
{
int i;
int size=(int)strlen(s);
//由優先順序決定從上而下的順序
for(i=0;i<size;i++)
if(s[i]=='!')
{
*start=i;
return;
}
for(i=0;i<size;i++)
if(s[i]=='*'||s[i]=='/')
{
*start=i;
return;
}
if(s[0]=='+'||s[0]=='-')
{
for(*start=1;(s[*start]>='0'&&s[*start]<='9')||s[*start]=='.';(*start)++);
return;
}
for(i=0;i<size;i++)
if(s[i]=='+'||s[i]=='-')
{
*start=i;
return;
}
}

int judge(char* s)//judge意為「判斷」
{
int i;
int size=(int)strlen(s);
for(i=1;i<size;i++)
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='!')
return 1;
return 0;
}

void count(char* s)//count意為「計算」
{
int start,i;
char carriage[555];//carriage意為「運載體」
while(judge(s))//判斷式子是否還需要進行運算
{
for(i=0;i<(int)strlen(s);i++)//此循環作用是將式子中出現的'--'替換為'+'
{
for(;s[i]!='-' && i<(int)strlen(s);i++);//循環結束
if(s[i+1]=='-')
{
del(s,i,i+1);
needle(s,"+",i);
}

}
find_start(s,&start);//讓下標start指向式子應該最先開始處理的運算符
scissor(s,carriage,&start);//用剪刀scissor將start指向的運算符及相對應的操作數剪下並儲存在運載體carriage上
handle(carriage);//處理該運載體,並將運載體上運載的式子的計算結果儲存在運載體上
needle(s,carriage,start);//見函數simplify中的說明
}
}

void simplify(char* s)//simplify意為「簡化」,即將括弧去除
{
char carriage[555];//carriage意為「運載體」
int start,end,i;
int size=(int)strlen(s);
while(1)
{
for(i=0;s[i] != '(' && i<size;i++);//注意這里末尾是分號
if(i==size)
break;//說明式子已不含括弧,簡化完成
for(end=0;s[end] != ')';end++);//使end下標指向式子中第一個出現')'的地方
end--;
for(start=end;s[start] != '(';start--);//尋找與上面一個')'配對的'('
start++;
(s,carriage,start,end);//將括弧里的內容復制給運載體carriage
del(s,start-1,end+1);//刪除整個括弧及其裡面的內容
count(carriage);//計算運載體運載的表達式,運算結果儲存在運載體上
needle(s,carriage,start-1);//將運載體運載過來的結果用針線needle縫在剛才刪除式子s括弧及其內容的地方
}
}

int main()
{
int i=0;
char s[555],ch;
puts(" 本程序不對用戶輸入數據進行檢測:");
puts(" 即用戶應輸入規范的計算式,包括分母不能為0:");
puts(" 式子不能含有空格及其他非計算字元;");
puts(" 按任意一個鍵開始,按回車鍵顯示運算結果;");
while(1)
{
i++;
ch=getch();
if(Esc==ch)
break;
if(Tab==ch)
{
system("cls");//清除當前屏幕
puts("顯示運算結果後:按「Esc」鍵退出,按「Tab」鍵清除當前屏幕");
}
if(i==1)
{
system("cls");
puts("顯示運算結果後:按「Esc」鍵退出,按「Tab」鍵清除當前屏幕");
}
puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
gets(s);
simplify(s);
count(s);
puts(s);
//實驗數據:23.243*(5!-23.123/.133+(2!-13/13.23)*(2!-.235)-((4!-20)!/2!)-32*(3!+2.23/(2*3)!))
//其正確結果是:-5953.9401265774754346182917611489
}
puts("謝謝使用!\n有問題可加q問我:281754179");
getch();
return 0;
}

我記得學了數據結構後我又重新用棧寫了個,容錯能力會更好,上面的代碼可以改進很多,也只是給你一個思路罷了

Ⅵ 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();
}

Ⅶ 如何使用c語言實現四則運算,詳細思路很重要啊(越詳細越好~),可以木有代碼(急)

1.判斷四則運算字元串的括弧是否匹配,可以用以個棧來計算,開始棧是空,從頭遍歷所有字元,找到'(',壓棧,找到')'彈出一個元素,遍歷完成以後如果棧是空表示正常,非空,或則中間出現問題都表示括弧不正常。
2.分解四則運算中的所有元素,把所有分解的元素放在隊列中,遍歷整個字元串,有switch分支,如果是0-9的字元用一個字元串存儲並和前面的字元組合起來,如果是'+''-''*''/'就把前面存儲數字的字元串當成一個元素放進隊列,並把當前運演算法符當成一個元素也放進隊列,遍歷完成以後所有的數據和運算符都分開了,比如234+456,會分解成234,+,456三個元素。
3.然後分解隊列,用兩個棧,一個存放所有元素用A表示,一個存放運算符號用B表示(這個是臨時變數),從頭開始遍歷整個隊列,如果是數據就把數據壓到A棧。如果元素是運算符就分開處理,如果是'(''+''-''*''/'')'處理方法都不一樣,詳細說明太復雜,整體的思想就是把數據和運算符的順序排列好(上面的元素排列以後變成234,456,+;可以參考後序排列)。
4.計算:依次彈出A中的元素,如果是數據把數據壓在棧C中,如果是運算符,從C中彈出該運算符需要的數據,然後把計算結果再次壓進棧C,當A遍歷完以後,C頂元素就是計算結果。
整個大題思路:1.檢查,2.分解,3.中序排列,4.後序排列,5.計算

Ⅷ c語言模擬計算器四則混合運算

//此演算法只能進行整數四則混合運算,也不支持括弧
//按下面的格式輸入表達式(末尾無=)
//10-5+4+6/2*14*8/4-5*7+2-4*6/2-10*4-6/3
#include<stdio.h>

int jisuan(int num1,char op1,int num2)
{
switch(op1)
{
case '*':
return num1*num2;
case '/':
return num1/num2;
case '+':
return num1+num2;
case '-':
return num1-num2;
}
}

int process(int num1,char op1,int num2)
{
int r,num3;
char op2;

if('\n'!=(op2=getchar()))
{
scanf("%d",&num3);
if('+'==op2 || '-'==op2)
{
num1=jisuan(num1,op1,num2);
r=process(num1,op2,num3);
}
else if('*'==op2 || '/'==op2)
{
if('/'==op1)
{
num1=jisuan(num1,op1,num2);
r=process(num1,op2,num3);
}
else
{
num2=jisuan(num2,op2,num3);
r=process(num1,op1,num2);
}
}
}
else
{
r=jisuan(num1,op1,num2);
}
return r;
}

int main()
{
int num1,num2;
char op;

printf("請輸入一個表達式:");
scanf("%d%c%d",&num1,&op,&num2);
printf("=%d\n",process(num1,op,num2));
return 0;
}

Ⅸ 用c語言編程四則混合運算計算器

使用反序.棧
比如5
+
3在棧里表示為5
3
+
掃描完整個用戶輸入的算式之後,從棧頂依次pop
如果是一個運算符(+),
就從棧里取兩個數字(5,
3)進行運算
當然還有括弧,比一般的+-*/級別高一些,可以再用一個棧
放括弧.
最後兩個棧都空,表名算式是正確的.

Ⅹ C語言編寫程序四則運演算法則

1234567891011121314151617# include <stdio.h>int main(void){ int a,b,s; char c; scanf("%d%c%d",&a,&c,&b); switch(c) { case '+':s=a+b;break; case '-':s=a-b;break; case '*':s=a*b;break; case '/':s=a/b;break; default:return -1; } printf("%d",s); return 0;}

如果還要判斷除數為0的情況 再添個if即可