新聞中心
用C語言編譯數(shù)學運算
這個是我的實驗報告,跟你的這個一樣的。如果只要代碼的話就看最后面的。我感覺應該算比較全面的。你看看,有什么具體要求可以提出來。
創(chuàng)新互聯(lián)公司長期為1000+客戶提供的網(wǎng)站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為昌都企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站建設,昌都網(wǎng)站改版等技術服務。擁有十年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
一、需求分析
1、 功能:疏如一行表達式,若表達式有誤,則輸出“表達式有錯” ,否則計算出表達式的值并輸出。 運算符包括加、減、乘、除、乘方、一目減。 括號均為小括號,但可以層層嵌套。操作數(shù)可以是浮點數(shù),也包括有多個字母組成的變量。
2、 輸入的形式為表達式,按回車結束。輸入值的范圍不超過浮點數(shù)的范圍。含有變量,變量名由字母組成,大小寫不限。
3、 若計算結果為整數(shù),則輸出整數(shù),若含有小數(shù),則輸出浮點數(shù)。
二、概要設計
1、 總體思路,先讀入一行表達式,用一個字符數(shù)組存儲。然后依次讀每個字符,進行判斷。邊讀入邊進行計算。程序中用到了兩個棧,一個字符棧以及一個數(shù)字棧,分別用來存儲運算符和數(shù)字,根據(jù)運算符的優(yōu)先順序進行計算。最后輸出結果。
2、程序包括幾個模塊,主函數(shù)和幾個基本函數(shù)。
說明幾個函數(shù):
bool stackempty(save1 s)用來判斷操作數(shù)棧s是否為空。
void push(save1 s,char e)若棧滿則輸出“棧已滿”,否則將元素e入棧
void pop(save1 s, char e)若棧為空則輸出“棧為空”,否則將棧頂元素賦給e
bool stackempty2(save2 s)用來判斷運算符棧s是否為空。
void push2(save2 s, char e)若運算符棧滿則輸出“棧已滿”,否則將元素e入棧
void pop2(save2 s, char e)若棧為空則輸出“棧為空”,否則將棧頂元素賦給e
int in(char e)返回運算符e在棧內的優(yōu)先級別
int out(char e) 返回運算符e在棧外的優(yōu)先級別
void count(char a,char ope, char b)將a、b進行相應的運算,并將運算結果入棧
3、具體操作步驟:
1、先讀入一行表達式,用一個字符數(shù)組line[]存儲
2、依次讀入每個字符并進行處理同是進行表達式判錯:
1. 遇數(shù)字,則繼續(xù)判斷下一個字符,直到下一個字符不是數(shù)字且不是小數(shù)點,若該數(shù)含有兩個小以上數(shù)點,則表示輸入錯誤。否則即可保證該操作數(shù)是完整的浮點數(shù),然后將該數(shù)入操作數(shù)棧。
若數(shù)字不是表達式的最后一位,且數(shù)字后面跟的不是“+、-、*、/、^、)”,則為表達式錯誤
2. 遇運算符,則分兩種情況:
1、若運算符為負號(該運算符為符號的情況有兩種:一為負號在最開頭,一為符號前面是“(” ),則先將0入操作數(shù)棧,然后再將負號入運算符棧。
2、該運算符不是負號則與運算符棧的棧頂元素比:
(1) 若棧頂元素優(yōu)先級低, 新輸入的運算符入棧。
(2) 若棧頂元素優(yōu)先級高,
1) 從符號棧彈出一個運算符,
2) 從對象棧彈出一個/兩個操作數(shù),
3) 運算結果壓入對象棧。
(3) 優(yōu)先級相等,則棧頂元素出棧,與輸入元素對消。
若“(、+、-、*、/、^”放在表達式最后面,則表達式錯誤
若“+、-、*、/、^”后面跟的不是數(shù)字或者變量,表達式錯誤
3、遇字母變量,則繼續(xù)判斷下一個字符,直到下一個字符不是字母變量,即可保證該變量是完整的,然后輸出“請輸入變量的值”,再將輸入的變量值入操作數(shù)棧。
若變量后面跟的不是“+、-、*、/、^、)”,則表達式錯誤
4、若所讀的該字符不是上述情況中的一種,則表達式錯誤
3、當將所有的字符都讀一遍之后,若表達式正確的話,則必然不含有“(”或者“)”。即若運算符棧中含有“(”或者“)”,則表達式必錯誤。 再考慮表達式正確的情況:運算符??赡転榭?,則操作符棧中必剩下一個操作數(shù),即最后的結果。若不為空,則留在運算符棧中的運算符的優(yōu)先級別從棧頂至棧底依次遞減。故可從運算符棧頂開始彈出一個運算符,從操作數(shù)棧中彈出兩個操作數(shù)進行運算,再將運算結果入操作數(shù)棧,一直循環(huán)至運算符棧為空。此時操作數(shù)棧剩下的唯一一個操作數(shù)就是運算結果。
三、結論及體會
1、實驗結論
a)、實驗完成了題目的要求,自己添加了對浮點數(shù)的操作,并進行判錯。
b)、編寫代碼基本上能夠滿足編程規(guī)范的要求,代碼的變量命名,以及注釋的書寫,基本能按照要求進行。
b)、將數(shù)據(jù)結構中的隊列和堆棧的知識復習到,并且學會創(chuàng)新,在代碼的編寫中,學習了編程規(guī)范,學習了結構化編程。
2、實驗體會
a)、通過本設計實驗將數(shù)據(jù)結構中的堆棧和隊列的知識復習到,并且能夠自己設計一些東西,學會了在設計實驗過程時的基本步驟?;旧夏軌蛴袟l理的解決這些問題。
b)、在試驗中遇到了很多的問題,都是以前沒有發(fā)現(xiàn)的,這些問題設計的方面很多,有以前的C++基礎的,也有最近學習的數(shù)據(jù)結構的知識。通過實驗的設計,讓我發(fā)現(xiàn)了自己的不足。自己在學習知識上面的漏洞。自己在細節(jié)方面的考慮還不夠全面,很多細節(jié)都是通過調試才發(fā)現(xiàn)的。比如剛開始時忘了考慮變量之前有負號的情況以及將整個式子讀一遍之后,棧中的操作數(shù)可能還有剩,還得繼續(xù)進行計算等。希望通過彌補這些發(fā)現(xiàn)的漏洞,提高自己的專業(yè)知識水平。
c)、設計過程中的解決問題的方法,讓我明白了如何學習會更有效。如何學習才不會耽誤太多的時間。也學會了解決問題的一般方法:向老師、同學請教,借助網(wǎng)絡等等。
d)、實驗過程中也走了很多的彎路,由于在開始設計的時候思路不時很清晰,對于一些問題不能很好的提出解決問題的方法,在設計過程中,代碼總是重復的修改,在很多問題上,代碼并不時最優(yōu)的。相信在以后的學習中,隨著知識的增多,問題會逐漸得到解決。
四、程序源代碼
#includeiostream
#includecmath
#includecstdlib
using namespace std;
#define MAX 1000
struct save1
{
float n[MAX];
int top;
}stack1;
struct save2
{
char n[MAX];
int top;
}stack2;
//stack1存儲數(shù)字,stack2存儲運算符號.
bool stackempty(save1 s)//判斷是否為空
{
if (s.top== -1)
return 1;
else
return 0;
}
bool stackempty2(save2 s)//判斷是否為空
{
if (s.top== -1)
return 1;
else
return 0;
}
void push(save1 s,float e)//將e入棧
{
if(s.top==MAX-1)
{
cout"棧已滿"endl;
return ;
}
s.top++;
s.n[s.top]=e;
}
void push2(save2 s,char e)//將e入棧
{
if(s.top==MAX-1)
{
cout"棧已滿"endl;
return ;
}
s.top++;
s.n[s.top]=e;
}
void pop(save1 s,float e)//將棧頂元素出棧,存到e中
{
if(s.top==-1)
{ cout"棧為空"endl; }
else
{e=s.n[s.top]; s.top--; }
}
void pop2(save2 s,char e)//將棧頂元素出棧,存到e中
{
if(s.top==-1)
{ cout"棧為空"endl; }
else
{e=s.n[s.top]; s.top--; }
}
int in(char e)//e在棧內的優(yōu)先級別
{
if(e=='-' || e=='+') return 2;
if(e=='*' || e=='/') return 4;
if(e=='^') return 5;
if(e=='(') return 0;
if(e==')') return 7;
return -1;
}
int out(char e)//e在棧外的優(yōu)先級別
{
if(e=='-' || e=='+') return 1;
if(e=='*' || e=='/') return 3;
if(e=='^') return 6;
if(e=='(') return 7;
if(e==')') return 0;
return -1;
}
void count(float a,char ope,float b)//進行計算并將計算結果入棧
{
float sum;
if(ope=='+') sum=a+b;
if(ope=='-') sum=a-b;
if(ope=='*') sum=a*b;
if(ope=='/') sum=a/b;
if(ope=='^') sum=pow(a,b);
push(stack1,sum);
}
int main()
{
int i=0,len,j,nofpoint,g=0;//len表示輸入式子的長度。 g表示讀入的字符是否是字母變量、數(shù)字以及運算符。
float a,b;//a、b用來存儲操作數(shù)棧中彈出的操作數(shù),便于代入函數(shù)中進行計算。
char line[MAX],operate,temp[20];
cout"請輸入表達式"endl;
cinline;
len=strlen(line);
stack1.top=-1;//將棧置為空
stack2.top=-1;//將棧置為空
while(1)
{
g=0;
if(isdigit(line[i]))//若讀入的字符為數(shù)字,則繼續(xù)判斷下一個字符,直到下一個字符不是數(shù)字或者不是小數(shù)點,即可保證該操作數(shù)是完整的小數(shù),然后將該數(shù)入操作數(shù)棧。
{
j=0; g=1;
nofpoint=0;//記錄所存的數(shù)中小數(shù)點的個數(shù)
while(isdigit(line[i]) || line[i]=='.')
{
if(line[i]=='.') nofpoint++;
temp[j++]=line[i];
i++;
if(i=len) break;
}
if( nofpoint1 || (ilen(line[i]!='-' line[i]!='+' line[i]!='*' line[i]!='/' line[i]!='^' line[i]!=')')) )
{ cout"表達式有錯"endl; return 0; }//所存數(shù)中含有不止一個小數(shù)點,或者數(shù)字后面跟的不是“+、-、*、/、^、)”,則為錯誤
temp[j]='\0';
b=atof(temp);
push(stack1,b);
if(i=len) break;
}
else
{
if(line[i]=='-' || line[i]=='+' || line[i]=='*' || line[i]=='/' ||
line[i]=='^' || line[i]=='(' || line[i]==')' ) //若讀入的字符為運算符的情況
{
g=1;
if(line[i]=='(' i==len) { cout"表達式有錯"endl; return 0; }// “(”放表達式最后面,錯誤
if(line[i]=='-' || line[i]=='+' || line[i]=='*' || line[i]=='/' || line[i]=='^')
{
if(i==len) { cout"表達式有錯"endl; return 0; }//“+、-、*、/、^”放在表達式最后面,錯誤
if( (!isdigit(line[i+1])) (!isalpha(line[i+1])) line[i+1]!='(')//“+、-、*、/、^”后面跟的不是數(shù)字或者變量,錯誤
{ cout"表達式有錯"endl; return 0; }
}
if(line[i]=='-' (i==0 || line[i-1]=='(' ))//運算符是負號
{
push(stack1,0);
push2(stack2,line[i]);
i++;
}
else
{ //讀入的運算符與運算符棧的棧頂元素相比,并進行相應的操作
if(in(stack2.n[stack2.top])out(line[i])||stackempty2(stack2)) { push2(stack2,line[i]);i++;}
else
if(in(stack2.n[stack2.top])==out(line[i])) {i++; stack2.top--;}
else
if(in(stack2.n[stack2.top])out(line[i]))
{
pop(stack1,a);
pop(stack1,b);
pop2(stack2,operate);
count(b,operate,a);
}
if(i=len) break;
}
}
else
{
if(isalpha(line[i]))//讀入的字符是字母變量的情況
{
g=1;
cout"請輸入變量";
while( isalpha(line[i])) { coutline[i]; i++; }
cout"的值"endl;
cinb;
push(stack1,b);
if(i=len) break;
if(line[i]!='-' line[i]!='+' line[i]!='*' line[i]!='/' line[i]!='^' line[i]!=')')//變量后面跟的不是“+、-、*、/、^、)”,則為錯誤
{ cout"表達式有錯"endl; return 0; }
}
}
}
if(g==0) { cout"表達式有錯"endl; return 0; }//g=0表示該字符是不符合要求的字符
}
while(stack2.top!=-1)//讀入結束后,繼續(xù)進行操作,直到運算符棧為空
{
pop(stack1,a);
pop(stack1,b);
pop2(stack2,operate);
if(operate=='(' || operate==')') //括號多余的情況
{ cout"表達式有錯"endl; return 0; }
count(b,operate,a);
}
coutstack1.n[stack1.top]endl;
return 0;
}
C語言編寫函數(shù)?
在C語言中,一個標準的函數(shù)定義語句塊必須包含函數(shù)返回值的類型標識符、函數(shù)名、形參類型及數(shù)量、函數(shù)體、返回值表達式。如果函數(shù)返回值類型為 void (即無返回值),則在兩個大括號之間不能寫帶有返回值表達式的 return 語句,否則編譯器就會報錯。你寫的 test 函數(shù)返回值類型為 void,而你在函數(shù)定義語句塊內寫下了 return 語句,編譯器自然會報錯了。
你可以將這個函數(shù)修改為以下形式:
int test(int n)
{
int m = n / 2;
return m;
}
c語言如何編寫自己的函數(shù)
int
getdata(int
a,int
b)//括號是形式參數(shù),前面int
是函數(shù)返回值類型
{
...
return
a;//返回值
}
...是實現(xiàn)的代碼。
自己看看書上的函數(shù)定義和實現(xiàn)形式很容易的。
C語言的函數(shù)是如何編出來的?
既然C語言叫語言。那就是一種約定。大家都按照這個約定做事,才能互相理解。
就好像我問你“吃飯沒?”,因為這是中文,一種語言,約定的,所以你會看的懂,然后回答我“沒呢?!?/p>
如果沒有約定。我問你“阿瑟領導家扶綏多幅?”。
你滿頭問號回答我“軍旅擴軍毒素發(fā)離開家灑的發(fā)。”
這樣對于我們就都是奇怪的符號了。。。
因此,你想寫出你說的“奇怪的符號”,就必須先理解這些奇怪的東西是怎么約定的。等你學過了,自然就明白了。
教程。。。我還真不知道有什么基礎的教程比較好的。如果是c++的話看c++ primer好了。比國內那些學校里的教材好不少。
如何寫C語言函數(shù)?
1、打開C-Free,按ctrl+N創(chuàng)建一個新的文件。
2、然后開始調用函數(shù)。
3、按F9進行調試后發(fā)現(xiàn)沒有錯誤。
4、按F5執(zhí)行程序。
5、輸入想要輸入的數(shù)字。
6、按ENTER鍵輸出結果,檢驗符合結果,說明函數(shù)調用成功。
紅帽linux中C語言編程如何調用數(shù)學函數(shù)
紅帽linux中C語言編程調用數(shù)學函數(shù)參考案例如下所示:
當需要調用函數(shù)的個數(shù)比較少時,可以直接在main函數(shù)中包含該文件,比如一個文件夾下包含add.c和main.c文件。
文件add.c定義兩個整數(shù)相加的函數(shù),code如下:#include#includeintadd(inta,intb){intz;z=a+b;returnz;},主函數(shù)main.c的code如下:#include#include#include"add.c"intmain(){inti,j,k;i=1;j=2;k=add(i,j);printf("iaddj=%d",k);},編譯生成可執(zhí)行文件:gcc-omainmain.c,執(zhí)行:./main。
網(wǎng)站欄目:C語言如何編譯數(shù)學函數(shù) c語言如何編譯數(shù)學函數(shù)圖像
分享URL:http://www.dlmjj.cn/article/hhshdi.html