程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> NYOJ305表達式求值

NYOJ305表達式求值

編輯:C++入門知識

NYOJ305表達式求值


表達式求值

時間限制:3000 ms | 內存限制:65535 KB 難度:3
描述

Dr.Kong設計的機器人卡多掌握了加減法運算以後,最近又學會了一些簡單的函數求值,比如,它知道函數min(20,23)的值是20 ,add(10,98) 的值是108等等。經過訓練,Dr.Kong設計的機器人卡多甚至會計算一種嵌套的更復雜的表達式。

假設表達式可以簡單定義為:

1. 一個正的十進制數 x 是一個表達式。

2. 如果 x 和 y 是 表達式,則 函數min(x,y )也是表達式,其值為x,y 中的最小數。

3. 如果 x 和 y 是 表達式,則 函數max(x,y )也是表達式,其值為x,y 中的最大數。

4.如果 x 和 y 是 表達式,則 函數add(x,y )也是表達式,其值為x,y 之和。

例如, 表達式 max(add(1,2),7) 的值為 7。

請你編寫程序,對於給定的一組表達式,幫助 Dr.Kong 算出正確答案,以便校對卡多計算的正誤。

輸入
第一行: N 表示要計算的表達式個數 (1≤ N ≤ 10)
接下來有N行, 每行是一個字符串,表示待求值的表達式
(表達式中不會有多余的空格,每行不超過300個字符,表達式中出現的十進制數都不
超過1000。)
輸出
輸出有N行,每一行對應一個表達式的值。
樣例輸入
3
add(1,2) 
max(1,999) 
add(min(1,1000),add(100,99)) 
樣例輸出
3
999
200
程序要用到函數sscanf()函數鏈接:http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html
# include 
# include 
# include 
int max(int a, int b)
{
	if (a > b)
		return a;
	else
		return b;
}
int min(int a, int b)
{
	if (a > b)
		return b;
	else
		 return a;
}
char str[1000];
int start;
int fun()
{
	int num,len;
	switch(str[start])
	{
	case'a':
		start += 3;
		return fun() +fun();
	case'm':             //當搜索到m是要判斷是max,還是min,然後遞歸進入相應的計算
		start += 3;
		if (str[start-2] == 'a')
			return max(fun(),fun());
		else
			return min(fun(),fun());
	case'(':
	case')':
	case',':               //遇到這些符號直接跳過
		start ++;
		return fun();
	default:
		sscanf(str+start,"%d%n",&num,&len);   //這個是個函數鏈接如上;mun負責讀取整數,len負責讀取整數的長度(其實沒有整數,都是字符通過函數轉換而來的)
		start+= len;
		return num;
	}
}
int main(void)
{
	int n;
	scanf("%d", &n);
	while (n--)
	{
		start = 0;
		scanf("%s", str);
		printf("%d\n", fun());
	}
	return 0;
}
復制去Google翻譯翻譯結果

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved