html5網(wǎng)站編寫青島網(wǎng)站制作推廣
文章目錄
- 💯前言
- 💯題目描述
- 輸入格式:
- 輸出格式:
- 💯我的做法
- 代碼實現(xiàn):
- 💯老師的做法
- 代碼實現(xiàn):
- 💯對比分析
- 💯拓展與優(yōu)化
- 💯總結(jié)
- 一開始的錯誤做法
💯前言
- 在編程學習過程中,C++ 語言為我們提供了強大的控制能力和靈活的操作方式。在本次學習中,我們面對的是一個簡單的算術口算題目的處理任務。任務要求通過程序自動處理多個口算算式,輸出完整的算式、其計算結(jié)果,并計算算式的總長度。這個問題看似簡單,但可以通過多種方式解決,過程中涉及到字符串拼接、運算符判斷和數(shù)據(jù)存儲等基礎編程技術。
在本次討論中,我們將深入分析兩種不同的解決方法:我提出的做法與老師的做法。我們將詳細對比這兩種方法的思路、代碼實現(xiàn),并進行優(yōu)化和拓展,以便對 C++ 編程的理解更為深刻。
C++ 參考手冊
💯題目描述
P1957 口算練習題
題目要求我們處理一組口算題目,每道題目可能包括加法、減法或乘法操作。每道題的輸入由兩個或三個數(shù)據(jù)組成,若有三個數(shù)據(jù),第一個表示運算符(a
表示加法,b
表示減法,c
表示乘法),接下來的兩個數(shù)據(jù)為參與運算的數(shù)值;若只有兩個數(shù)據(jù),則表示繼承上一道題的運算符。
我們需要輸出每道題的完整算式,并且輸出算式的總長度。以下是題目的完整描述:
輸入格式:
4
a 64 46
275 125
c 11 99
b 46 64
輸出格式:
64+46=110
9
275+125=400
11
11*99=1089
10
46-64=-18
9
💯我的做法
我的實現(xiàn)方法著眼于輸入的處理與字符串的拼接,基本流程如下:
- 輸入讀取:首先讀取題目數(shù)量
i
,然后循環(huán)處理每一道算式。每道算式可以是完整的帶有運算符的輸入,也可以是繼承上題的運算符。 - 算式計算:對于每道算式,根據(jù)運算符
a
,b
, 或c
來決定進行加法、減法或乘法操作。 - 字符串拼接:利用字符串的拼接(
+=
)來構造完整的算式表達式,并計算結(jié)果。 - 輸出:輸出每道算式及其結(jié)果,最后輸出算式的總長度。
代碼實現(xiàn):
#include <iostream>
#include <string>
using namespace std;int main()
{int i;cin >> i;int a, b;string temp, ysf;while(i--){string s;cin >> temp;if(temp == "a" || temp == "b" || temp == "c"){cin >> a >> b;if(temp == "a"){s += to_string(a);s += '+';s += to_string(b);s += '=';s += to_string(a + b);}else if(temp == "b"){s += to_string(a);s += '-';s += to_string(b);s += '=';s += to_string(a - b);}else if(temp == "c"){s += to_string(a);s += '*';s += to_string(b);s += '=';s += to_string(a * b);}ysf = temp;}else{a = stoi(temp);cin >> b;if(ysf == "a"){s += to_string(a);s += '+';s += to_string(b);s += '=';s += to_string(a + b);}else if(ysf == "b"){s += to_string(a);s += '-';s += to_string(b);s += '=';s += to_string(a - b);}else{s += to_string(a);s += '*';s += to_string(b);s += '=';s += to_string(a * b);}}cout << s << endl;cout << s.size() << endl;}return 0;
}
💯老師的做法
老師的做法與我的實現(xiàn)思路相似,但有一些不同之處。老師的代碼在結(jié)構上稍顯復雜,特別是在輸入和字符串拼接部分的處理上,且做了更多的優(yōu)化來處理繼承運算符的情況。
代碼實現(xiàn):
int main()
{int n = 0;cin >> n;string op;string num1;string num2;string last;int ret = 0;while (n--){string ans;cin >> op;if (op == "a" || op == "b" || op == "c"){cin >> num1 >> num2;int n1 = stoi(num1);int n2 = stoi(num2);ans += num1;if (op == "a"){ret = n1 + n2;ans += "+";}else if (op == "b"){ret = n1 - n2;ans += "-";}else{ret = n1 * n2;ans += "*";}last = op;}else{num1 = op;cin >> num2;int n1 = stoi(num1);int n2 = stoi(num2);ans += num1;if (last == "a"){ret = n1 + n2;ans += "+";}else if (last == "b"){ret = n1 - n2;ans += "-";}else{ret = n1 * n2;ans += "*";}}ans += (num2 + "=" + to_string(ret));cout << ans << endl;cout << ans.size() << endl;}return 0;
}
💯對比分析
-
結(jié)構差異:
- 我的做法中,我們根據(jù)輸入的運算符判斷是否更新運算符,并且用
last_op
來記住上一題的運算符,保證后續(xù)算式的正確計算。 - 老師的做法稍微復雜一些,采用了更顯式的變量存儲(如
last
變量)。另外,老師在每次處理完一個算式后,拼接完成的字符串才會輸出。
- 我的做法中,我們根據(jù)輸入的運算符判斷是否更新運算符,并且用
-
字符串拼接:
- 我的做法通過直接將
+
、-
、*
等運算符拼接進ans
字符串。 - 老師的做法在拼接過程中,將運算符的插入和結(jié)果的轉(zhuǎn)換更加細化,也做了更精確的類型轉(zhuǎn)換處理(使用
stoi
將字符串轉(zhuǎn)換為整數(shù))。
- 我的做法通過直接將
-
處理繼承運算符:
- 我的做法是依賴
last_op
來判斷是否使用上一題的運算符。 - 老師的做法在這一點上比較細致,利用了
last
變量來確保后續(xù)運算使用的是正確的運算符。
- 我的做法是依賴
💯拓展與優(yōu)化
-
代碼優(yōu)化:
- 對于運算符和結(jié)果拼接部分,使用了
+=
拼接字符串,但如果問題較為復雜或涉及到更多操作,可能會導致拼接效率不高。可以考慮使用ostringstream
來拼接字符串,這樣可以提高性能。
- 對于運算符和結(jié)果拼接部分,使用了
-
用戶輸入優(yōu)化:
- 可以增加輸入校驗,避免用戶輸入錯誤的數(shù)據(jù)類型(如非數(shù)字輸入等)。
-
更廣泛的應用:
- 這類算術問題不僅限于加法、減法和乘法。如果要處理更多運算符(如除法、取余等),可以通過擴展運算符判斷來完成。
-
函數(shù)化:
- 該問題的不同部分(如運算符判斷、算式拼接、輸出結(jié)果等)可以通過函數(shù)化進行封裝,提高代碼的模塊化和復用性。
💯總結(jié)
本次學習和討論了如何用 C++ 語言處理簡單的口算算式,通過兩種不同的實現(xiàn)方法(我的做法與老師的做法),我們掌握了如何判斷運算符、處理繼承運算符的情況,并輸出結(jié)果與算式的總長度。通過對比分析,我們看到了兩種做法的異同與各自的優(yōu)缺點。
在優(yōu)化方面,我們提出了改進的思路,如何提高代碼性能、增強可擴展性,以及如何處理更多復雜的運算符類型。總體來說,這道題目的解決方案為我們提供了一個很好的編程練習機會,幫助我們更好地理解字符串操作、控制流程和輸入輸出的細節(jié)。
一開始的錯誤做法
#include <iostream>
#include <string>
using namespace std;int main()
{int i = 0;cin >> i;int opera = 0;string s;while(i--){int index = 0, a = 0, b = 0;while(cin >> s){index++;if(index == 1){if(s[i] == 'a')opera = 1;else if(s[i] == 'b')opera = 2;else if(s[i] == 'c')opera = 3;elsea = stoi(string(1, s[i])); // 將字符 s[i] 轉(zhuǎn)換為字符串后再使用 stoi}if(index == 2 && a != 0)b = stoi(string(1, s[i]));else if(index == 2 && a == 0)a = stoi(string(1, s[i]));if(index == 3)b = stoi(string(1, s[i])); }if(opera == 1)cout << a << "+" << b << "=" << (a + b) << endl;else if(opera == 2)cout << a << "-" << b << "=" << (a - b) << endl;elsecout << a << "*" << b << "=" << (a * b) << endl;}return 0;
}
還有,要注意變量的作用域
學習C++的建議
C++ 是一門強大且廣泛應用的編程語言,無論是系統(tǒng)開發(fā)、游戲開發(fā)還是高性能計算,它都有不可替代的地位。然而,學習C++的道路可能是陡峭的,為了幫助你更高效地掌握這門語言,我總結(jié)了一些學習建議和經(jīng)驗。
1. 理解C++的基礎
學習重點:
- 掌握基本語法:
- 學會聲明變量、條件語句、循環(huán)、函數(shù)等核心語法。
- 掌握數(shù)組、指針、引用等基礎知識。
- 熟悉標準輸入輸出:
- 掌握
cin
和cout
的用法。 - 理解格式化輸出,例如
std::setw
和std::fixed
。
- 掌握
- 記住編譯器的角色:
- 理解源代碼如何通過編譯器轉(zhuǎn)換為可執(zhí)行程序,選擇一款好的IDE(如Visual Studio、Clion、VSCode)。
建議:用大量小程序練習這些基礎語法,比如寫一個計算器、模擬猜數(shù)字游戲等。
2. 深入學習C++的特性
學習重點:
- 面向?qū)ο缶幊?#xff08;OOP):
- 理解類和對象,熟悉如何定義類、成員變量和成員函數(shù)。
- 掌握封裝、繼承、多態(tài)三大核心特性。
- 內(nèi)存管理:
- 理解指針的用法,掌握動態(tài)內(nèi)存分配(
new
和delete
)。 - 學習如何避免內(nèi)存泄漏,熟悉智能指針(如
std::unique_ptr
和std::shared_ptr
)。
- 理解指針的用法,掌握動態(tài)內(nèi)存分配(
- 標準模板庫(STL):
- 熟悉常用的容器(如
vector
、map
、set
)和算法(如sort
、find
)。 - 掌握迭代器的用法。
- 熟悉常用的容器(如
- 異常處理:
- 學習使用
try-catch
塊處理異常。 - 理解異常的用途以及如何設計健壯的代碼。
- 學習使用
建議:嘗試開發(fā)一個小型項目,比如一個學生管理系統(tǒng),綜合應用類、STL、指針和動態(tài)內(nèi)存分配。
3. 掌握進階內(nèi)容
學習重點:
- 模板:
- 理解函數(shù)模板和類模板,掌握泛型編程思想。
- 學習模板特化和模板元編程的基本概念。
- 多線程與并發(fā):
- 學習 C++11 提供的多線程支持(如
std::thread
)。 - 熟悉互斥鎖(
std::mutex
)和條件變量(std::condition_variable
)。
- 學習 C++11 提供的多線程支持(如
- C++與C的兼容性:
- 學習如何在C++中使用C語言代碼,理解C和C++的區(qū)別。
- 掌握C風格字符串(
char[]
)和C++字符串(std::string
)的轉(zhuǎn)換。
建議:在這一階段,可以挑戰(zhàn)更復雜的項目,比如開發(fā)一個小型的HTTP服務器,學習網(wǎng)絡編程并結(jié)合多線程。
4. 學習資源與實踐方法
學習資源:
- 書籍:
- 《C++ Primer》:非常適合初學者的經(jīng)典書籍。
- 《Effective C++》:進階學習C++最佳實踐的指南。
- 《The C++ Programming Language》:Bjarne Stroustrup(C++之父)的權威著作。
- 在線課程:
- Coursera 上的 C++ 編程課程。
- YouTube 上免費的 C++ 系列教程。
- 社區(qū)與文檔:
- 參與C++相關的論壇(如CSDN、Stack Overflow)。
- 閱讀官方文檔(https://en.cppreference.com)。
實踐方法:
- 多寫代碼,多調(diào)試:
- 每學一個概念后,寫至少兩個示例代碼并進行調(diào)試。
- 做小項目:
- 從簡單的控制臺程序開始,比如文件讀寫、計算器、小游戲等。
- 慢慢過渡到圖形界面或網(wǎng)絡程序開發(fā)。
- 閱讀他人代碼:
- 閱讀開源項目的代碼,理解優(yōu)秀代碼的設計思路。
- 參加編程比賽:
- 比如 LeetCode 或 Codeforces,可以幫助你提升算法能力和C++的熟練度。
5. 保持耐心與興趣
學習C++可能會面臨以下困難:
- 復雜的語法:如模板、智能指針、多線程等。
- 調(diào)試困難:指針錯誤、內(nèi)存泄漏、未定義行為可能讓人頭疼。
如何應對:
- 將大問題拆解成小問題,逐步解決。
- 不斷重復基礎知識,以加深理解。
- 保持興趣,嘗試一些有趣的項目,比如寫一個游戲、制作一個簡單的圖形程序。
小結(jié)
學習C++需要一個循序漸進的過程,從基礎語法到面向?qū)ο缶幊?#xff0c;再到進階的模板和并發(fā)編程,每一步都需要耐心和實踐。通過充分利用學習資源、進行大量編碼練習,以及挑戰(zhàn)實際項目,你一定可以成為C++的高手。記住,學習的核心在于理解,而非死記硬背。
祝你學有所成,享受C++編程的樂趣!