計(jì)算機(jī)技術(shù)基礎(chǔ)課程設(shè)計(jì)---簡(jiǎn)單的加減乘除運(yùn)算_第1頁(yè)
已閱讀1頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  計(jì)算機(jī)技術(shù)基礎(chǔ)課程設(shè)計(jì)</p><p><b>  C語(yǔ)言設(shè)計(jì)報(bào)告</b></p><p>  題目: 簡(jiǎn)單的加減乘除運(yùn)算</p><p>  學(xué)院: 化學(xué)工程學(xué)院</p><p>  專業(yè): 制藥工程專業(yè)</p><p><b>  一 . 選題背景&

2、lt;/b></p><p>  在現(xiàn)實(shí)生活中常需要對(duì)一些并不深?yuàn)W但較長(zhǎng)或繁瑣的數(shù)字進(jìn)行簡(jiǎn)單的計(jì)算,可大大提高工作效率,節(jié)約時(shí)間.該程序可運(yùn)用到C語(yǔ)言中的大部分知識(shí),并且簡(jiǎn)單易懂,在選擇分支下判斷符號(hào)的優(yōu)先級(jí)別,調(diào)用加減乘除的計(jì)算函數(shù)并轉(zhuǎn)化表達(dá)式即可完成程序的運(yùn)行.選擇該題目也有能力限制的原因,但不影響涵蓋廣泛的知識(shí)面.</p><p><b>  二 . 設(shè)計(jì)思路:<

3、;/b></p><p>  加減乘除的運(yùn)算均是雙目運(yùn)算,計(jì)算式涉及兩個(gè)數(shù)據(jù)和一個(gè)計(jì)算符號(hào),所以,首先定義兩個(gè)結(jié)構(gòu)體變量,在結(jié)構(gòu)體變量中再分別定義兩個(gè)棧, 所謂棧就是一個(gè)稍微復(fù)雜的數(shù)組,并且只能從后面加入數(shù)據(jù)和導(dǎo)出數(shù)據(jù),就是所謂的后到先出,好比堆東西,在最上面的東西是最后放入的,但是卻是最先取出的</p><p><b>  struct</b></p&g

4、t;<p><b>  {</b></p><p>  float a[100];</p><p>  int top; /*用來(lái)記錄棧頂?shù)淖兞?/ </p><p>  }St; /*在外部定義了一個(gè)棧,好似定義了一個(gè)全局變量,此棧為數(shù)據(jù)棧*/</p><p>&l

5、t;b>  struct</b></p><p><b>  {</b></p><p>  char b[100];</p><p>  int top; //也是用來(lái)記錄棧頂?shù)淖兞?lt;/p><p>  }Op; //同上,此棧為運(yùn)算符號(hào)棧</p>

6、<p>  為了方便起見(jiàn),選擇用指針做參數(shù)來(lái)記錄數(shù)據(jù)</p><p>  void Pop_St(float *e) //用指針作參數(shù)直接記錄數(shù)據(jù),方便 </p><p>  在連續(xù)計(jì)算中涉及到計(jì)算符號(hào)優(yōu)先級(jí)別的比較,所以調(diào)用函數(shù)完成該比較.擴(kuò)號(hào)的優(yōu)先級(jí)別最高,其次是乘除,再次是加減,用>,=,<來(lái)表示優(yōu)先級(jí)別.</p><p>

7、  char Precede(char p)</p><p><b>  {</b></p><p>  char e; </p><p><b>  switch(p)</b></p><p><b>  {</b></p>&l

8、t;p><b>  case '+':</b></p><p><b>  case '-':</b></p><p>  if (Op.top!=-1&&Op.b[Op.top]!='(') e='>';</p><p>  el

9、se e='<';</p><p><b>  break;</b></p><p><b>  case '*':</b></p><p>  case '/':{</p><p>  if (Op.b[Op.top]=='*'

10、;||Op.b[Op.top]=='/'||Op.b[Op.top]==')') e='>';</p><p>  else e='<';</p><p><b>  break;</b></p><p><b>  }</b></p>

11、<p><b>  ……….</b></p><p>  然后調(diào)用函數(shù)進(jìn)行計(jì)算</p><p>  進(jìn)入程序的核心部分,把表達(dá)式轉(zhuǎn)化為逆波蘭表達(dá)式.</p><p>  printf("Please input the expression:");</p><p>  gets(str)

12、; //輸入表達(dá)式</p><p>  printf ("the change exprission is ");</p><p>  while (*p!='\0')</p><p><b>  {</b></p><p>  if(*p>=

13、'0'&&*p<='9') //如果輸入的是數(shù)字</p><p><b>  {</b></p><p>  while (*p>='0'&&*p<='9')</p><p><b>  {</b>&l

14、t;/p><p>  num=*p-'0'+num*10; //把用字符表示的數(shù)字轉(zhuǎn)化為實(shí)際意義的數(shù)字,并且把一串字符數(shù)字變成有實(shí)際意義的數(shù)字,如‘1’‘2’‘3’‘4’這是一串字符,轉(zhuǎn)化成1234,一千兩百三十四</p><p>  putchar(*p);</p><p><b>  p++;</b></p>&

15、lt;p><b>  }</b></p><p>  Push_St(num); //把轉(zhuǎn)化好的數(shù)字導(dǎo)入數(shù)據(jù)棧里</p><p><b>  num=0;</b></p><p>  putchar(' ');</p><p><b>  }</b

16、></p><p>  最后再比較讀入符號(hào)的優(yōu)先級(jí)別,進(jìn)行計(jì)算,并返回計(jì)算函數(shù)的返回值,輸出計(jì)算結(jié)果</p><p>  printf("\nthe resule is %.f\n",a);</p><p><b>  三,程序流程圖</b></p><p><b>  四 . 程序清

17、單:</b></p><p>  #include <stdio.h></p><p>  #include <stdlib.h></p><p>  #define Null 0</p><p><b>  struct</b></p><p><b&g

18、t;  {</b></p><p>  float a[100];</p><p>  int top; /*用來(lái)記錄棧頂?shù)淖兞?/ </p><p>  }St; /*在外部定義了一個(gè)棧,好似定義了一個(gè)全局變量,此棧為數(shù)據(jù)棧*/</p><p><b>  struct<

19、/b></p><p><b>  {</b></p><p>  char b[100];</p><p>  int top; /*也是用來(lái)記錄棧頂?shù)淖兞?/</p><p>  }Op; /*同上,此棧為運(yùn)算符號(hào)棧*/</p><p>  voi

20、d Push_St(float e)</p><p><b>  {</b></p><p>  if (St.top!=99) /*判斷棧頂是否滿了*/ </p><p><b>  {</b></p><p>  St.top++; /*沒(méi)滿的話棧頂向前

21、進(jìn)一個(gè)*/</p><p>  St.a[St.top]=e; /*在棧頂處放入一個(gè)數(shù)據(jù)*/</p><p><b>  }</b></p><p>  else printf ("Stack is Full\n");</p><p>  }

22、 /*把一個(gè)數(shù)據(jù)推入棧中*/ </p><p>  void Pop_St(float e) </p><p><b>  {</b></p><p>  if ((St.top)!=-1) /*如果棧不是空的話*/</p><p><b>  {</b>&

23、lt;/p><p>  e=St.a[St.top]; /*把棧頂數(shù)據(jù)導(dǎo)出來(lái) */ </p><p>  St.top--; /*棧頂向回退一個(gè)*/</p><p><b>  }</b></p><p>  else printf("Stack is empty\n");&l

24、t;/p><p>  } /*從棧中取出數(shù)據(jù)*/</p><p>  void Push_Op(char e) /*此函數(shù)同上Push_St(float e),只不過(guò)因?yàn)槭莾蓚€(gè)棧,所以需另編一個(gè)*/</p><p><b>  {</b></p><p>  

25、if (Op.top!=99)</p><p><b>  {</b></p><p><b>  Op.top++;</b></p><p>  Op.b[Op.top]=e;</p><p><b>  }</b></p><p>  else pr

26、intf("Stack is Full\n");</p><p><b>  }</b></p><p>  void Pop_Op(char e) /*此函數(shù)同上Pop_St(float e),只不過(guò)因?yàn)槭莾蓚€(gè)棧,所以需另編一個(gè)*/</p><p><b>  {</b></p&g

27、t;<p>  if (Op.top!=-1)</p><p><b>  {</b></p><p>  *e=Op.b[Op.top];</p><p><b>  Op.top--;</b></p><p><b>  }</b></p>&l

28、t;p>  else printf("Stack is Empty\n");</p><p><b>  }</b></p><p>  char Precede(char p) /*這里就是比較優(yōu)先級(jí)了,如果運(yùn)算符棧頂?shù)姆?hào)的優(yōu)先級(jí)比現(xiàn)在讀取的符號(hào)的優(yōu)先級(jí)高的話,就返回一個(gè)〉,反之返回一個(gè)〉。*/</p><

29、;p><b>  {</b></p><p>  char e; </p><p><b>  switch(p)</b></p><p><b>  {</b></p><p><b>  case '+':&l

30、t;/b></p><p><b>  case '-':</b></p><p>  if (Op.top!=-1&&Op.b[Op.top]!='(') e='>';</p><p>  else e='<';</p><p

31、><b>  break;</b></p><p><b>  case '*':</b></p><p>  case '/':{</p><p>  if (Op.b[Op.top]=='*'||Op.b[Op.top]=='/'||Op.b[Op

32、.top]==')') e='>';</p><p>  else e='<';</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  {</b><

33、/p><p>  if (Op.b[Op.top]=='*'||Op.b[Op.top]=='/'||Op.b[Op.top]==')') e='>';</p><p>  else e='<';</p><p><b>  break;</b></p

34、><p><b>  }</b></p><p><b>  case '(':</b></p><p><b>  {</b></p><p><b>  e='<';</b></p><p>&

35、lt;b>  break;</b></p><p><b>  }</b></p><p><b>  case ')':</b></p><p><b>  {</b></p><p>  if(Op.b[Op.top]=='(

36、9;) e='=';</p><p>  else e='>';</p><p><b>  break;</b></p><p><b>  }</b></p><p>  default: printf("Error\n");</p

37、><p><b>  }</b></p><p><b>  return e;</b></p><p><b>  }</b></p><p>  float Operate (float a,char e,float b) /*運(yùn)算*/</p><p&g

38、t;<b>  {</b></p><p><b>  float c;</b></p><p>  switch (e) /*判斷符號(hào),選擇相應(yīng)的運(yùn)算*/</p><p><b>  {</b></p><p>  case

39、 '+': </p><p><b>  {</b></p><p><b>  c=a+b;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><

40、;b>  case '-':</b></p><p><b>  {</b></p><p><b>  c=a-b;</b></p><p><b>  break;</b></p><p><b>  }</b><

41、;/p><p>  case '*': </p><p><b>  {</b></p><p><b>  c=a*b;</b></p><p><b>  break;</b></p><p><b>  }</b>

42、</p><p>  case '/': </p><p><b>  {</b></p><p><b>  c=a/b;</b></p><p><b>  break;</b></p><p><b>  }</b&

43、gt;</p><p>  default: printf("error\n");</p><p><b>  }</b></p><p><b>  return c;</b></p><p><b>  }</b></p><p>

44、;  void trans(char str[]) /*這里是把我們習(xí)慣的運(yùn)算表達(dá)使轉(zhuǎn)化成逆波蘭表達(dá)式,這是本程序的核心。*/</p><p><b>  {</b></p><p>  char *p,x,theta;</p><p>  float num=0,b,a,c;</p><p>  S

45、t.top=-1;</p><p>  Op.top=-1; /*初始化兩個(gè)棧,使兩個(gè)棧為空*/</p><p><b>  p=str;</b></p><p>  printf("Please input the expression:");</p><p> 

46、 gets(str); /*輸入表達(dá)式*/</p><p>  printf ("the change exprission is ");</p><p>  while (*p!='\0')</p><p><b>  {</b></p><p>

47、  if(*p>='0'&&*p<='9') /*如果輸入的是數(shù)字*/</p><p><b>  {</b></p><p>  while (*p>='0'&&*p<='9')</p><p><b> 

48、 {</b></p><p>  num=*p-'0'+num*10; /*把用字符表示的數(shù)字轉(zhuǎn)化為實(shí)際意義的數(shù)字,并且把一串字符數(shù)字變成有實(shí)際意義的數(shù)字,如‘1’‘2’‘3’‘4’這是一串字符,轉(zhuǎn)化成1234,一千兩百三十四*/</p><p>  putchar(*p);</p><p><b>  p++;</b&

49、gt;</p><p><b>  }</b></p><p>  Push_St(num); /*把轉(zhuǎn)化好的數(shù)字導(dǎo)入數(shù)據(jù)棧里*/</p><p><b>  num=0;</b></p><p>  putchar(' ');</p><p>

50、<b>  }</b></p><p>  if (*p!='\0') /*如果輸入的是運(yùn)算符,這里默認(rèn)輸入的除了數(shù)字就是運(yùn)算符*/</p><p><b>  {</b></p><p>  switch(Precede(*p)) /*這里就是判斷現(xiàn)在讀入的運(yùn)算符和運(yùn)算符棧里的運(yùn)算

51、符的優(yōu)先級(jí)*/</p><p><b>  {</b></p><p>  case '<': /*如果返回的是〈著把現(xiàn)在讀入的運(yùn)算符導(dǎo)入棧*/</p><p>  Push_Op(*p);</p><p><b>  p++;</b></p>

52、<p><b>  break;</b></p><p>  case '=': /*如果返回的是=的話,直接把運(yùn)算符棧頂?shù)倪\(yùn)算符扔了,就是直接導(dǎo)出不用任何有意義的變量去記錄,這里的x變量是無(wú)意的,可以認(rèn)為是垃圾桶*/</p><p>  Pop_Op(&x);</p><p><

53、;b>  p++;</b></p><p><b>  break;</b></p><p>  case '>': /*如果返回的是>的話,把運(yùn)算符棧頂?shù)倪\(yùn)算符導(dǎo)出來(lái),再把另一個(gè)數(shù)據(jù)棧里面的棧頂以及后面的兩個(gè)數(shù)據(jù)導(dǎo)出來(lái),進(jìn)行運(yùn)算*/</p><p>  Pop_Op(&

54、;theta);</p><p>  Pop_St(&b);</p><p>  Pop_St(&a);</p><p>  if (theta=='/'&&(b==0)) /*當(dāng)運(yùn)算符號(hào)為/時(shí)且a-b=0這時(shí)候是錯(cuò)誤所以c=-1;*/</p><p><b>  {</

55、b></p><p><b>  c=-1;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  else /*如果正常就輸出運(yùn)算符和數(shù)據(jù)并進(jìn)行運(yùn)算,把運(yùn)算結(jié)

56、果再次推入數(shù)據(jù)棧*/</p><p><b>  {</b></p><p>  printf("%c ",theta);</p><p>  Push_St(Operate(a,theta,b));</p><p><b>  break;</b></p><

57、;p><b>  }</b></p><p><b>  default:</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p&g

58、t;<p><b>  }</b></p><p>  if (c!=-1) /*這里如果c不等于-1那么把棧里面未輸出的符號(hào)挨個(gè)導(dǎo)出運(yùn)算*/</p><p><b>  {</b></p><p>  while(Op.top!=-1)</p><p><b> 

59、 {</b></p><p>  Pop_Op(&theta);</p><p>  putchar(' ');</p><p>  printf("%c",theta);</p><p>  Pop_St(&b);</p><p>  Pop_St(&a

60、mp;a);</p><p>  if (theta=='/'&&(b==0)) /*注意,在導(dǎo)出棧里面未輸出時(shí)可能也會(huì)出現(xiàn)除數(shù)為零的可能*/</p><p><b>  {</b></p><p>  printf("\nerror expression\n"); /*這時(shí)c=-

61、1*/</p><p><b>  c=-1;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  Push_St(Operate(a,theta,b));</p><p><b&g

62、t;  }</b></p><p>  if(c!=-1) /*如果c還不是-1時(shí)才會(huì)輸出結(jié)果*/</p><p><b>  {</b></p><p>  Pop_St(&a);</p><p>  printf("\nthe resule i

63、s %.f\n",a);</p><p><b>  }</b></p><p><b>  }</b></p><p>  else printf("error exprission");</p><p><b>  }</b></p>

64、;<p>  void main() /*因?yàn)槲覀儗W(xué)的是數(shù)據(jù)結(jié)構(gòu),強(qiáng)調(diào)數(shù)據(jù)封裝化,再主函數(shù)中應(yīng)盡力減少對(duì)數(shù)據(jù)的處理,而對(duì)數(shù)據(jù)的處理應(yīng)該用不同的函數(shù)去完成。*/</p><p><b>  {</b></p><p>  char str[100]={'\0'};</p><p>  trans(str);&

65、lt;/p><p><b>  }</b></p><p>  五 . 主要問(wèn)題的解決方法</p><p>  1. 主要問(wèn)題的解決方法及技術(shù)關(guān)鍵</p><p>  表達(dá)式向逆波蘭表達(dá)式轉(zhuǎn)化的問(wèn)題,定義出一個(gè)函數(shù)來(lái)完成這個(gè)轉(zhuǎn)化過(guò)程.</p><p>  對(duì)符號(hào)優(yōu)先級(jí)別的判斷,由選擇分支結(jié)構(gòu)來(lái)完成.&

66、lt;/p><p>  棧的技術(shù)由定義結(jié)構(gòu)體變量完成.</p><p><b>  2.技術(shù)關(guān)鍵</b></p><p>  函數(shù)調(diào)用,結(jié)構(gòu)體變量的定義使用</p><p>  六 . 設(shè)計(jì)結(jié)果說(shuō)明:</p><p><b>  1 . 設(shè)計(jì)優(yōu)點(diǎn):</b></p>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論