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