91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言實現簡單計算器程序的示例

發布時間:2021-04-17 15:04:57 來源:億速云 閱讀:155 作者:小新 欄目:編程語言

這篇文章主要介紹C語言實現簡單計算器程序的示例,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

這兩天在看一個C語言寫的計算器程序,做了不少的功夫,跟著作者一步步的進行完善,了解了許多細節性的東西,在此自己做個總結,加深自己對程序的印象,也算是梳理。

在該計算器程序,能進行加減乘除、sin、cos、exp等操作,同時能進行數值保存功能。而該計算器使用逆波蘭表示法。即所有運算符都跟在操作數的后面,比如下列表達式:
(1 - 2) * (4 + 5)采用逆波蘭表示法表示為:1 2 - 4 5 + *
逆波蘭表達法中不需要圓括號,只要知道每個運算符需要幾個操作數就不會引起歧義。

計算器程序實現很簡單,具體原理如下:

while(/* 下一個運算符或操作數不是文件結束指示符 */)
 if(/* 是數 */)
 /* 將該數壓入到棧中 */
 else if (/* 是運算符 */)
 /* 彈出所需數目的操作數 */
 /* 執行運算 */
 /* 將結果壓入到棧中 */
 else if (/* 是換行符 */)
 /* 彈出并打印棧頂的值 */
 else
 /* 出錯 */

在程序設計中,使用模塊化思想,getop函數來進行讀入,該函數返回一個標識,用來標識讀入的是什么類型。主循環體中根據該標識執行相應的動作。

以下是該程序: (我將所有函數和變量放在同一文件)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAXOP 100
#define NUMBER '0' //標識讀入的是數字
#define NAME 'n' //標識讀入的是字符串(函數名或非法字符串)
#define ALPHA 26 
int getop(char []); 
void push (double); //壓棧
double pop(void); //出棧
void clear(void); //清空棧
void mathfnc(char []); //執行相應的數學函數sin、cos、exp等

int main(void)
{
 int type;
 int i, var = 0;
 double op1, op2,v;
 char s[MAXOP];
 double variable[ALPHA];

 for (i = 0; i < ALPHA; i++) //初始化用于保存數值的變量數組
 variable[i] = 0.0;

 while ((type = getop(s)) != EOF) //讀取輸入
 {
 switch (type)
 {
  case NUMBER:
  push (atof(s));
  break;
  case NAME:
  mathfnc(s);
  break;
  case '+':
  push (pop() + pop());
  break;
  case '*':
  push (pop() * pop());
  break;
  case '-':
  op2 = pop();
  push (pop() - op2);
  break;
  case '/':
  op2 = pop();
  if (op2 != 0.0)
   push (pop() / op2);
  else
   printf ("error: zero divisor\n");
  break;
  case '%':
  op2 = pop();
  if (op2 != 0.0)
   push (fmod(pop(), op2));
  else
   printf ("error: zero divisor\n");
  break;
  case '?': //打印棧頂元素
  op2 = pop();
  printf ("\t%.8g\n", op2);
  push (op2);
  break;
  case '=': //保存數值
  pop();
  if (var >= 'A' && var <= 'Z')
   variable[var - 'A'] = pop();
  else
   printf ("error: no variable name\n");
  break;
  case 'c':
  clear();
  break;
  case 'd': //復制棧頂元素
  op2 = pop();
  push(op2);
  push(op2);
  break;
  case 's': //交換棧元素
  op1 = pop();
  op2 = pop();
  push(op1);
  push(op2);
  case '\n':
  v = pop(); //v保存最后的一次結果
  printf ("\t%.8g\n", v);
  break;
  default:
  if (type >= 'A' && type <= 'Z')
   push(variable[type - 'A']);
  else if (type == '@') //輸入的字符@表示最近一次結果值 
   push(v);
  else
   printf ("error: unknown command %s\n", s);
  break;
 }
 var = type; 
 }
 return 0;
}

/* ----------------------------------------------------------- */

#define MAXVAL 100

int sp = 0; //標識棧頂
double val[MAXVAL];

void push(double f)
{
 if (sp < MAXVAL)
 val[sp++] = f;
 else
 printf ("error: stack full, can't push %g\n", f);
}

double pop(void)
{
 if (sp > 0)
 return val[--sp];
 else
 {
 printf ("error: statck empty\n");
 return 0.0;
 } 
}

void clear(void)
{
 sp = 0;
}

void mathfnc (char s[])
{
 double op2;

 if (strcmp (s, "sin") == 0)
 push(sin(pop()));
 else if(strcmp (s, "cos") == 0)
 push(cos(pop()));
 else if(strcmp (s, "exp") == 0)
 push(exp(pop()));
 else if(strcmp (s, "pow") == 0)
 {
 op2 = pop();
 push (pow(pop(), op2));
 }
 else
 printf ("error: %s not supported\n", s);
}

/* ----------------------------------------------------------- */

#include <ctype.h>

int getch(void);
void ungetch(int);

int getop(char s[])
{
 int i, c;
 while ((s[0] = c = getch()) == ' ' || c == '\t') //過濾開頭的空白字符
 ;
 s[1] = '\0';

 i = 0;

 if (islower(c)) //判斷是否為小寫字母,也即讀取由小寫字母組成的字符串
 {
 while (islower(s[++i] = c = getch()))
  ;
 s[i] = '\0';

 if (c != EOF)
  ungetch(c);
 if (strlen (s) > 1)
  return NAME;
 else 
  return c;
 }

 if (!isdigit(c) && c != '.' && c != '-')
 return c;

 if (c == '-') //用于判斷是負數還是減操作  
 { 
 if (isdigit(c = getch()) || c == '.') 
  s[++i] = c;
 else
 {
  if (c != EOF)
  ungetch(c);
  return '-';
 }
 }

 if (isdigit(c)) //收集整數部分
 while (isdigit(s[++i] = c = getch()))
  ;

 if (c == '.') //收集小數部分
 while (isdigit(s[++i] = c = getch()))
  ;

 s[i] = '\0';

 if (c != EOF)
 ungetch(c);

 return NUMBER;
}


/* ----------------------------------------------------------- */
/*
 * 引用以下兩個函數是因為:程序不能確定它已經讀入的輸入是否足夠 *
 * 除非超前多讀入一些輸入,在本程序中,讀入一些字符合成一個數字 *
 * 所以在看到第一個非數字字符之前,已經讀入的數的完整性是不能確定的
 * 由于程序要超前讀入一個字符,這樣就導致最后又一個字符不屬于當前所要讀入的數 
 */

#define BUFSIZE 100
char buf[BUFSIZE];
int bufp = 0;

int getch(void) 
{
 return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch (int c)
{
 if (bufp >= BUFSIZE)
 printf ("ungetch: too many characters\n");
 else
 buf[bufp++] = c;
}

該程序雖然簡單,但是還是存在一些小小的問題,比如沒有數據時進行pop的話,會打印棧中無數據同時返回數值0.0,在循環體中許多執行操作會將該數值保存到棧中,之后打印該值,用戶體驗度比較差。程序設計方面,模塊化設計使得該程序容易增加功能而不影響其他模塊,比如增加一些數學函數處理,在mathfnc函數中去添加,或增加一些運算符操作,可以在主循環體中增加。

以上是“C語言實現簡單計算器程序的示例”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

旬阳县| 吉林市| 灌阳县| 榆林市| 寿光市| 昌都县| 于田县| 长武县| 登封市| 五莲县| 西青区| 新竹县| 韩城市| 万安县| 呼和浩特市| 长寿区| 乡宁县| 老河口市| 瑞安市| 广安市| 清徐县| 四川省| 伊宁市| 甘南县| 建阳市| 宾阳县| 外汇| 额济纳旗| 台山市| 浏阳市| 南昌市| 莱西市| 兴国县| 福鼎市| 昌图县| 综艺| 姚安县| 肇庆市| 高安市| 松江区| 陇西县|