北郵上機複試 科學計算器 —— 由編譯器的不同引發的數十次 WA,最後終於AC——總結

北郵的上機複試環境用的是標準c/c++,而我從大一開始就用vc6.0,很痛苦的出現了很多不同情況。今天用DEV c++解決了一些問題,總結一下。

 

1. gets() 和 scanf()

 

gets() 可以接收一行字符串直到EOF結束。而scanf("%s")接收一行的時候碰到空格等等的就會結束。但是可以用scanf模擬gets,即scanf("%[^/n]%*c",s).詳見:http://blog.csdn.net/yinxusen/archive/2011/04/03/6300426.aspx

 

2. vc的編譯器不是標準c/c++,其中有很大的出入。就拿科學計算器這道題來說吧,我的程序邏輯性不好是一方面,編譯器不同也有很大的原因。題目如下:http://boj.me/onlinejudge/showproblem.php?problem_id=1511

 

我的vc程序

 

 

 

這個程序在vc上面跑是沒有問題的,結果非常非常的正確。但是在OJ上一直都是WA,很沮喪~

 

下面是我的DEV c程序

 

 

 

看出什麼不同來了嗎?

 

是的,compute() 函數有改動。我把原來的那句 改成了 ,把原來的compute() 函數 改成了 。

當然,程序的冗餘性我們暫時不管他。這種改動有很大的不同。在vc中,編譯器編譯程序後的尋址方式是這樣的。對於 numStack[numTop++] = compute();這句話,vc中是先做compute()這個函數,函數退出之後再做numStack[numTop++]的賦值工作。DEV c(standard c/c++)恰恰相反,他先做numStack[numTop++],再去運算compute() 函數。

 

最致命的問題是:我的numStack[numTop++]這句話和compute()函數中都有對堆棧的操作,這個堆棧和棧頂指針恰恰又都是全局變量!!

 

所以程序設計的時候一定要由軟件工程的思想。一個函數做什麼工作,那麼他就只做這件事,不要讓他做兩件事。例如上面的compute函數,做運算就不要做出棧進棧的操作。

 

另外,全局變量一定要少用,很容易出問題。在一個編譯器中可能看不出來,但是放到不同的編譯器中就是問題。

 

像numStack[numTop++]這樣的語句還是少些,你不知道什麼時候就會出問題。還是乖乖的寫成numStack[numTop];numTop++;算了。

 

3. 堆棧的問題,最好多使用程序庫中有的東西吧,想堆棧,用vector模擬一下是比較好的,最好不要自己寫。還有,如果讓你排序的話,最好用自帶的qsort()函數,不要自己寫一遍。

 

4. 這個題目還要注意一點:1/2*2=1,但是如果用int存數據的話結果是0,所以這個程序要用double或者float去存。

 

還沒幾天就要複試了,這兩天要多熟悉DEV啊~~

 

用了4年vc 的人你傷不起 啊,有木有有木有~~~~~~

發佈了82 篇原創文章 · 獲贊 15 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章