CSDN 編程挑戰——《coder的計算器》

coder的計算器

題目詳情:

coder現在已經上初中,也會用計算器實現+ ,-,*,/和冪運算^了,但他覺得市場那些計算器太繁瑣了,有很多他不認識的符號,所以他現在很想要能計算帶括號的+ ,-,*,/和冪運算^的混合表達式就可以了,你能幫他實現這個愿望嗎?還有coder希望這臺計算器能告訴他每一步的計算結果,以便學習和檢查。注意 2^2^2表示2^(2^2)。

輸入格式:有T組數據,每一組都是一個表達式,表達式每個符號之間都會有一個空格,如1 + 2 ?/ ?3 =

輸出格式:首先輸出按照計算順序的每一步的計算結果,而且要空行,最后輸出計算結果,

第k組前要加上Case k : ?,每個輸出都要保留3位小數點。



答題說明:

輸入樣例:

1

1 - 0.5 ^ 2 ^ 0 + ( 2 - 1 ) =

輸出樣例:

2.000^0.000=1.000

0.500^1.000=0.500

1.000-0.500=0.500

2.000-1.000=1.000

0.500+1.000=1.500

Case 1: 1.500?


錯誤的代碼(由于對 ‘-’ 的二義性沒有考慮到):

#include "stdio.h"
#include "string.h" 
#include "math.h"
#include "ctype.h"
#include "stack"
#define maxn 1000
using namespace std;
char buf[maxn],length;stack<char> op;
/*在此犯了一個很嚴重的錯誤,錯誤的定義成了 stack<int> n,
這樣的錯誤導致結果總是為 0,調試了好久很沒有發現錯誤的根源在哪里*/
stack<double> n;int getPriority(char c)
{switch(c){case '(': return 1;case ')': return 1;	case '+': return 2;case '-': return 2;case '*': return 3;case '/': return 3;case '^': return 4;			default: return 0;}	
}double calc(double a,double b,char c)
{double d; switch(c){case '+': d=(a+b); break;case '-': d=(a-b); break;case '*': d=(a*b); break;case '/': d=(a/b); break;case '^': d=pow(a,b); break;}printf("%.3lf%c%.3lf=%.3lf\n",a,c,b,d);return d;
}
void pull()
{double a,b;char c=op.top(); op.pop();if(getPriority(c)>1 && n.size()>1){b=n.top(); n.pop();a=n.top(); n.pop();n.push(calc(a,b,c));} 		
} int main()
{int T,count=0;scanf("%d",&T);while(T--){char c; double d; int i;length=0; count++;do{c=getchar();if(' '!=c) buf[length++]=c;}while('='!=c);i=-1;while(++i<length){			if(isalnum(buf[i])){//從左至右掃描表達式,數字讀入 sscanf(buf+i,"%lf",&d); n.push(d);while(isalnum(buf[i+1]) || '.'==buf[i+1]) i++;}else{//從左至右掃描表達式,運算符讀入c=buf[i];if(getPriority(c)){	//能被識別的操作符 if('('==c || '^'==c || op.empty() || getPriority(c)>getPriority(op.top()) ) op.push(c);else if(')'==c){while(!op.empty() && '('!=op.top()) pull();if(!op.empty()) op.pop();}else{while(!op.empty() && getPriority(c)<=getPriority(op.top())) pull();	//操作符計算 op.push(c);}} }					}while(!op.empty()) pull();printf("Case %d: %.3lf\n",count,n.top());while(!n.empty()) n.pop(); 	//清空數據棧 		}return 0;
}


修改后(AC):
#include "stdio.h"
#include "string.h" 
#include "math.h"
#include "ctype.h"
#include "stack"
#define maxn 1000
using namespace std;
char buf[maxn],length;stack<char> op;
stack<double> n;int getPriority(char c)
{switch(c){case '(': return 1;case ')': return 1;	case '+': return 2;case '-': return 2;case '*': return 3;case '/': return 3;case '^': return 4;			default: return 0;}	
}double calc(double a,double b,char c)
{double d; switch(c){case '+': d=(a+b); break;case '-': d=(a-b); break;case '*': d=(a*b); break;case '/': d=(a/b); break;case '^': d=pow(a,b); break;}printf("%.3lf%c%.3lf=%.3lf\n",a,c,b,d);return d;
}
void pull()
{double a,b;char c=op.top(); op.pop();if(getPriority(c)>1 && n.size()>1){b=n.top(); n.pop();a=n.top(); n.pop();n.push(calc(a,b,c));} 		
} int main()
{int T,count=0;scanf("%d",&T);while(T--){char c; double d; int i;length=0; count++;do{c=getchar();if(' '!=c && '\n'!=c) buf[length++]=c;}while('='!=c);i=-1;while(++i<length){	if( buf[i]=='-' ){	//  '-' 可能出現二義性(符號或減號)因此特殊處理 int flag=0;if(i==0) flag=1;else if(i>0){int tmp=i;flag=1;while(tmp--){if(isalnum(buf[tmp])){flag=0; break;}else if(getPriority(buf[tmp])>1) break;}}if(flag){sscanf(buf+i,"%lf",&d); n.push(d);while(isalnum(buf[i+1]) || '.'==buf[i+1]) i++;continue;}				}if(isalnum(buf[i])){//從左至右掃描表達式,數字讀入 sscanf(buf+i,"%lf",&d); n.push(d);while(isalnum(buf[i+1]) || '.'==buf[i+1]) i++;}else{//從左至右掃描表達式,運算符讀入c=buf[i];if(getPriority(c)){	//能被識別的操作符 if('('==c || '^'==c || op.empty() || getPriority(c)>getPriority(op.top()) ) op.push(c);else if(')'==c){//遇到有括號退棧計算,直到計算到左括號或棧空為止 while(!op.empty() && '('!=op.top()) pull();if(!op.empty()) op.pop();}else{while(!op.empty() && getPriority(c)<=getPriority(op.top())) pull();	//操作符計算 op.push(c);}} }					}while(!op.empty()) pull();printf("Case %d: %.3lf\n",count,n.top());while(!n.empty()) n.pop(); 	//清空數據棧 		}return 0;
} 


? ? ? ? ??

CSDN挑戰編程交流群:?372863405 ? ? ? ??

?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374004.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374004.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374004.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenShift Express:部署Java EE應用程序(支持AS7)

在過去的幾年中&#xff0c;我越來越聽到有關“云”服務的信息。 最初&#xff0c;我并不是很想嘗試一下。 但是幾個月后&#xff08;一年&#xff1f;&#xff09;&#xff0c;我決定看看這是怎么回事。 我從事Java EE開發已經超過7年了&#xff0c;所以我決定看看將Java EE應…

07 總結ProgressDialog 異步任務

1,ProgressDialog> //使用對象 設置標題 progressDialog.setTitle("標題"); //設置圖標 progressDialog.setIcon(R.drawable.ic_launcher); //設置展示的內容 progressDialog.setMessage(&q…

python函數封裝計算n運算_在Python里面怎么可以運算出999999999**999999999,求思路?...

>>> 999999999 * math.log(999999999, 2) / 8 / 1024 ** 33.480509950621777所以這個數字本身就差不多需要3.5GB內存&#xff0c;考慮到計算過程中需要存儲臨時結果&#xff0c;還需要翻個兩三倍吧而Python中的long可以到多少呢&#xff1a;#define MAX_LONG_DIGITS \…

C++中const關鍵字的使用總結

const是不變的意思&#xff0c;在C程序中&#xff0c;經常用const來限制對一個對象的操作: 1.1 const變量 例如&#xff1a; const int n3; 則這個變量的值不能改變&#xff0c;即不能對變量賦值。 1.2 const參數 出現在函數參數中的const表示在函數體中不能對這個參數做修改…

php封裝redis負載均衡類

$array array( master > array( "redis://127.0.0.1:6379?timeout1", ), slave > array( "redis://127.0.0.1:6479?timeout1", "redis://127.0.0.1:6579?timeout1", ) ); $redis R…

我今天對JavaFX的了解

如果您沒有聽說過&#xff0c;JavaFX 2是Java的新Desktop / web / client框架。 自JavaFX 1以來&#xff0c;它已經進行了相當大的改動&#xff08;坦率地說&#xff0c;效果并不那么令人印象深刻&#xff09;。 自定義腳本語言已經淘汰了&#xff0c;您可以使用標準Java和基于…

怎么解決xp系統不能安裝NET Framework4.0?

.net 4.0安裝不上解決方法&#xff1a; 引用 9 樓 MoreQuestion 的回復: 全部都不行&#xff01;就是用360軟件管家安裝那個就可以了。用了樓主的方法&#xff0c;果然可行啊 1.先安裝wic。 2.用360安裝.net40 本帖最后由 不懂 于 2014-6-6 00:56 編輯Windows Server 2003 如何…

C++內聯(inline)函數

內聯函數 內聯函數是一種特殊類型的函數&#xff0c;內聯函數在定義或聲明時前面加上“inline”關鍵字。比如&#xff1a; inline int max(int a,int b) { return (a>b)?a:b; } 內聯&#xff08;inline&#xff09;是內聯擴展&#xff08;inline expansion&#xff09;的簡…

我的python學習筆記全集_記錄我的Python學習筆記

不想再像以前那樣&#xff0c;什么都從頭開始學習語法、總結語法&#xff0c;這樣反而會過分糾結于語法&#xff0c;耽誤了開發&#xff0c;畢竟語言的主要屬性是工具&#xff0c;次要的屬性是語言本身。所以還是先熟練使用語言去進行開發&#xff0c;等足夠熟悉了&#xff0c;…

HDU 5794:A Simple Chess(Lucas + DP)

題目鏈接&#xff1a;http://acm.split.hdu.edu.cn/showproblem.php?pid5794 題意&#xff1a;讓一個棋子從&#xff08;1,1&#xff09;走到&#xff08;n&#xff0c;m&#xff09;&#xff0c;要求像馬一樣走日字型并只能往右下角走。里面還有r個障礙點不能經過或者到達&am…

php源碼分析之PHPAPI宏的作用

在PHP源碼中&#xff0c;我們經常會看到很多函數前面有個PHPAPI&#xff0c;但這是什么呢&#xff1f; 于是我在php源碼/main/php.h中找到了它的定義 #ifdef PHP_WIN32 # include "tsrm_win32.h" # include "win95nt.h" # ifdef PHP_EXPORTS # …

15分鐘內開始使用Amazon Web Services和全自動資源調配

在等待一個新項目時&#xff0c;我想學習一些有用的東西。 而且由于在許多項目中我們需要評估和測試正在開發的應用程序的性能&#xff0c;而很少有足夠的硬件來生成實際負載&#xff0c;因此我決定學習更多有關按需在云中按需配置虛擬機的知識&#xff0c;即Amazon Web Servic…

解析JVM內存區域組成

在方法&#xff08;代碼塊&#xff09;中定義一個變量時&#xff0c;java就在棧中為這個變量分配JVM內存空間&#xff0c;當超過變量的作用域后&#xff0c;java會自動釋放掉為該變量所分配的JVM內存空間&#xff1b;而在堆中分配的JVM內存由java虛擬機的自動垃圾回收器來管理。…

python打開瀏覽器后帶cookie_Python爬蟲使用瀏覽器的cookies:browsercookie

很多用Python的人可能都寫過網絡爬蟲&#xff0c;自動化獲取網絡數據確實是一件令人愉悅的事情&#xff0c;而Python很好的幫助我們達到這種愉悅。然而&#xff0c;爬蟲經常要碰到各種登錄、驗證的阻撓&#xff0c;讓人灰心喪氣(網站&#xff1a;天天碰到各種各樣的爬蟲抓我們網…

VS插件開發

參考資料: VS插件開發 - 個性化VS IDE編輯器 自己動手編寫一個VS插件&#xff08;一&#xff09; VS Addin插件基本開發入門 VS Addin插件配置、部署 轉載于:https://www.cnblogs.com/wangwangfei/p/5830081.html

使用AspectJ,Javassist和Java Proxy進行代碼注入的實用介紹

靜態地或在運行時將代碼片段注入已編譯的類和方法中的功能可能會很有幫助。 這尤其適用于在沒有源代碼的第三方庫中或在無法使用調試器或探查器的環境中對問題進行故障排除。 代碼注入對于處理涉及整個應用程序的問題&#xff08;例如性能監視&#xff09;也很有用。 以這種方式…

Java中的變量

java類的成員變量有兩種&#xff1a;一種是被static關鍵字修飾的變量&#xff0c;叫類變量或者靜態變量&#xff1b;另一種沒有static修飾&#xff0c;為實例變量。 在語法定義上的區別&#xff1a;靜態變量前要加static關鍵字&#xff0c;而實例變量前則不加。 在程序運行時的…

無限漫游

一、FAT AP架構下&#xff0c;AP設備不做認證時&#xff1a; (1) AP1&#xff0c;AP2正常工作&#xff0c;發送Beacon幀&#xff0c;向STA通告支持的無線服務&#xff1b; (2) STA搜索到AP1的信號&#xff0c;向AP1發Probe Request,請求獲取AP1所提供的無線服務&#xff1b;AP…

uni-app內置地圖軌跡_MIUI11 新增親情守護,支持安全圍欄、運動軌跡功能

點擊右上角關注我們&#xff0c;每天給您帶來最新最潮的科技資訊&#xff0c;讓您足不出戶也知道科技圈大事&#xff01;日前&#xff0c;小米 MIUI 體驗總負責人 MIUI小凡 在微博上為大家預告了 MIUI11 的新特性「親情守護」&#xff0c;并表示「在親情守護中&#xff0c;我們…

:before與:after偽類的應用

1.小三角樣式 .tip{ position:relative; display:inline-block; width:100px; margin:100px; padding:30px 20px; color:#fff; border:1px solid #666; border-radius:5px; background-color:rgba(0,153,51,1);}.tip:before{ content:; posit…