計算機技術基礎課程設計---簡單的加減乘除運算_第1頁
已閱讀1頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  計算機技術基礎課程設計</p><p><b>  C語言設計報告</b></p><p>  題目: 簡單的加減乘除運算</p><p>  學院: 化學工程學院</p><p>  專業(yè): 制藥工程專業(yè)</p><p><b>  一 . 選題背景&

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

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

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

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

6、<p>  為了方便起見,選擇用指針做參數(shù)來記錄數(shù)據(jù)</p><p>  void Pop_St(float *e) //用指針作參數(shù)直接記錄數(shù)據(jù),方便 </p><p>  在連續(xù)計算中涉及到計算符號優(yōu)先級別的比較,所以調用函數(shù)完成該比較.擴號的優(yōu)先級別最高,其次是乘除,再次是加減,用>,=,<來表示優(yōu)先級別.</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>  然后調用函數(shù)進行計算</p><p>  進入程序的核心部分,把表達式轉化為逆波蘭表達式.</p><p>  printf("Please input the expression:");</p><p>  gets(str)

12、; //輸入表達式</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ù)字轉化為實際意義的數(shù)字,并且把一串字符數(shù)字變成有實際意義的數(shù)字,如‘1’‘2’‘3’‘4’這是一串字符,轉化成1234,一千兩百三十四</p><p>  putchar(*p);</p><p><b>  p++;</b></p>&

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

16、></p><p>  最后再比較讀入符號的優(yōu)先級別,進行計算,并返回計算函數(shù)的返回值,輸出計算結果</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; /*用來記錄棧頂?shù)淖兞?/ </p><p>  }St; /*在外部定義了一個棧,好似定義了一個全局變量,此棧為數(shù)據(jù)棧*/</p><p><b>  struct<

19、/b></p><p><b>  {</b></p><p>  char b[100];</p><p>  int top; /*也是用來記錄棧頂?shù)淖兞?/</p><p>  }Op; /*同上,此棧為運算符號棧*/</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++; /*沒滿的話棧頂向前

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

22、 /*把一個數(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ù)導出來 */ </p><p>  St.top--; /*棧頂向回退一個*/</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),只不過因為是兩個棧,所以需另編一個*/</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),只不過因為是兩個棧,所以需另編一個*/</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)先級了,如果運算符棧頂?shù)姆柕膬?yōu)先級比現(xiàn)在讀取的符號的優(yōu)先級高的話,就返回一個〉,反之返回一個〉。*/</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) /*運算*/</p><p&g

38、t;<b>  {</b></p><p><b>  float c;</b></p><p>  switch (e) /*判斷符號,選擇相應的運算*/</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[]) /*這里是把我們習慣的運算表達使轉化成逆波蘭表達式,這是本程序的核心。*/</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; /*初始化兩個棧,使兩個棧為空*/</p><p><b>  p=str;</b></p><p>  printf("Please input the expression:");</p><p> 

46、 gets(str); /*輸入表達式*/</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ù)字轉化為實際意義的數(shù)字,并且把一串字符數(shù)字變成有實際意義的數(shù)字,如‘1’‘2’‘3’‘4’這是一串字符,轉化成1234,一千兩百三十四*/</p><p>  putchar(*p);</p><p><b>  p++;</b&

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

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

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

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

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

54、;theta);</p><p>  Pop_St(&b);</p><p>  Pop_St(&a);</p><p>  if (theta=='/'&&(b==0)) /*當運算符號為/時且a-b=0這時候是錯誤所以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 /*如果正常就輸出運算符和數(shù)據(jù)并進行運算,把運算結

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那么把棧里面未輸出的符號挨個導出運算*/</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)) /*注意,在導出棧里面未輸出時可能也會出現(xiàn)除數(shù)為零的可能*/</p><p><b>  {</b></p><p>  printf("\nerror expression\n"); /*這時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時才會輸出結果*/</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() /*因為我們學的是數(shù)據(jù)結構,強調數(shù)據(jù)封裝化,再主函數(shù)中應盡力減少對數(shù)據(jù)的處理,而對數(shù)據(jù)的處理應該用不同的函數(shù)去完成。*/</p><p><b>  {</b></p><p>  char str[100]={'\0'};</p><p>  trans(str);&

65、lt;/p><p><b>  }</b></p><p>  五 . 主要問題的解決方法</p><p>  1. 主要問題的解決方法及技術關鍵</p><p>  表達式向逆波蘭表達式轉化的問題,定義出一個函數(shù)來完成這個轉化過程.</p><p>  對符號優(yōu)先級別的判斷,由選擇分支結構來完成.&

66、lt;/p><p>  棧的技術由定義結構體變量完成.</p><p><b>  2.技術關鍵</b></p><p>  函數(shù)調用,結構體變量的定義使用</p><p>  六 . 設計結果說明:</p><p><b>  1 . 設計優(yōu)點:</b></p>

溫馨提示

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

評論

0/150

提交評論