一文看懂扣噠世界CodeCombat信息學奧賽體系C++(干貨超多,免費學習)


CoCo來信

扣噠世界CodeCombat 首席支持者,你好,

CodeCombat信息學奧賽體系C++上線啦,下面是童老師為大家准備的介紹文章,看完后記得在底部領取免費試用班級碼哈~

C++ 基本概念

我們首先介紹一些 C++ 語言的基本概念,這些概念有助於理解下文。

注釋。以 // 開頭的單行內容或者被 /* … */ 包含的內容為 C++ 的注釋內容,注釋內容並不被電腦使用,是純粹提供給編程者閱讀的內容。變量。用來儲存數據的結構。函數。用來完成某種功能的結構。聲明。由於在 C++ 中默認只認可預先定義好的像 if, while 之類的大約六十個關鍵字,其他所有單詞都被 C++ 認為是不可理解的。如果我們希望在代碼中使用一個自定義變量或者函數,我們需要利用聲明來向電腦宣告這個自定義的名字是合法的。即聲明是保證 C++ 認識編程者書寫的代碼的基礎。命名空間。簡單的說 namespace 的功能是最大化的利用一個名字,就好比漢語里我們知道張三和李三表示兩個人是因為雖然他們的名相同,但他們的姓不同。而命名空間就很像這個姓的作用。C ++ 中使用雙冒號表達命名空間從屬關系,如 std::cin 指的是 std 命名空間中的 cin 函數。如果我再定義一個 std2::cin 那么它與 std::cin 是兩個不同的函數。編譯。編譯指電腦確認每一行 C++ 代碼是否合法的過程。編譯順序是解析 C++ 代碼的順序,這個順序基本按照代碼的行數進行。如上文提到在 C++ 中使用變量需要提前聲明,即是指在編譯順序中(C++ 代碼順序)需要將聲明語句寫在使用語句之前。此處不涉及運行過程,因此如果出現錯誤通常是語法錯誤,即為 C++ 的書寫規范書寫代碼。運行。運行指 C++ 代碼在作為程序開始執行功能。運行順序以主函數 (main函數) 為運行起點,從主函數的第一行代碼開始依次執行語句,由於編譯過程保證了電腦能夠理解每一條代碼,因此此處出現的錯誤通常才是編程者設計代碼時出現的邏輯錯誤。

C++ 基本結構

了解過基本概念后,想要知道如何學習 C++,還需要知道 C++ 代碼的基本結構。通常我們可以把一個常見的單文件(針對信奧)的 C++ 代碼分為三個代碼部分:

全局變量區。在 C++ 中我們通常會將引用頭文件、定義全局命名空間(namespace)、定義全局變量這三種語句放在代碼的開頭。因為頭文件是聲明我們在代碼中需要使用的函數/變量的文件,將其放在文件開頭可以避免使用到相應函數/變量時出現未聲明的編譯錯誤。因為命名空間是 C++ 中區分某些名字(變量名,函數名或者對象名)唯一性的,某些常用且不容易出現重名的名字(如 cin, cout)就會利用 using 語句去全局聲明命名空間,表示代碼中可以出現該命名空間中的名字且不加前綴。因此該語句通常也放在代碼最前面保證全局有效性。全局變量。為了使全局變量全局有效,我們通常會把其聲明盡可能提前,因此也會放在文件開頭。自定義函數/對象區。同樣,為了讓我們自己定義的函數/對象在主函數中運行時被 C++ 認可,我們通常都會將自定義函數與對象放在主函數之前。(當然也可以只把聲明放在這里,把定義延后)主函數區。為了讓代碼運行時所有變量/函數/對象都合法,我們通常將主函數放在最后,但這同時也是 C++ 代碼的核心。一個 C++ 程序可以沒有前面兩項代碼,但一定要有主函數。

CodeCombat 的C++關卡了解過 C++ 基本結構后我們可以看一看 CodeCombat 的關卡。

CodeCombat 的關卡分左中右三部分,左邊是游戲界面,右邊是控制游戲界面的代碼區,我們通過在代碼區書寫 C++ 代碼來控制左邊的游戲運行。中間是知識區,用來介紹每個關卡可能使用到的函數知識點。這樣的設計可以使編程者直接看到自己寫的代碼的運行效果。

為了控制關卡難度,CodeCombat 的代碼區只要求(也只能)書寫函數定義區與主函數區的代碼,同時相對比較復雜的對象定義也並沒有支持。我們的核心目標是幫助初學者掌握基本語法,能完成大部分 C++ 代碼的書寫。以信奧為例,除去極少數需要通過自定義數據結構(如鏈表,樹)才能完成的題目,其他所有信奧習題需要的知識點在 CodeCombat 的闖關中都能學習和訓練到。

針對信奧的分析

其實剛剛已經提到一部分,信奧中需要掌握的 C++ 知識除去基本語法外,核心是簡單算法的實現,以及小部分指針與數據結構的知識。接下來我們可以一一分析這些知識點。

分號。C++ 以分號作為語句的結束標志。C++ 不區分多余的空格與回車,因此在識別到分號之前一條語句是不會結束的,也就是你可以把一條 C++ 語句寫成任意多行,這無關緊要。只有兩個例外:以 # 開頭的預編譯語句,如 #include ,這種語句不需要分號結尾。以 } 結束的語句,如 if, for, while, 以及函數定義,右大括號后可以不需要分號。聲明。開頭已經說明過聲明的作用,這里再強調一次,每一個自定義的變量名,函數名,對象名都需要提前聲明,如果你沒有看到提前聲明,看看聲明在哪一個 #include 語句引入的文件中。變量與數據類型。C++ 的任何一個變量都需要數據類型,即整數,浮點數(小數),字符,字符串,布爾(真假),以及其他對象(對象也是一種數據類型)。在 CodeCombat 的關卡中我們使用 auto 替代了大部分類型的顯式聲明,但學習 C++ 不可避開對數據類型的學習,因為 auto 只是簡化代碼,並沒有改變 C++ 的運行方式。條件語句。C++ 使用形如if () {}else if () {}else () {}的代碼表示條件分支,注意在這個例子中所有(除去 else if 中的空格)空格和回車都是不必須的,只需要在小括號中寫上條件表達式,在大括號中寫上邏輯代碼即為 C++ 條件語句。

循環語句。C++ 有三種大同小異的循環結構:while () {}do {} while();for ( ; ; ) {}分別為按條件循環,先運行一次代碼再判斷是否循環,指定初始條件和每次循環的變化的循環。三者的循環本質沒有什么差異。注意 do while 循環需要在 ) 后補充分號,因為右小括號不能作為語句結束的標志。

函數。C++ 函數在定義時有兩處需要數據類型,一個是函數名的前面,一個是參數名的前面,這兩者均為指定變量的數據類型,前者是函數返回值的數據類型,后者是參數類型。函數本身沒有數據類型的說法。也可將返回值的數據類型理解為函數類型,但這並非標准。函數有一些高級用法,包括參數傳值還是傳引用,以及嵌套調用與遞歸,都屬於 C++ 高級用法,后文會簡單介紹。對象。對象在信奧中幾乎沒有應用,數據結構的定義可以使用對象,也可以使用 C 標准的 struct. 由於對象也屬於高級知識,此處略去不說。算法。信奧中常用的算法不算很多,大多是數學方法,需要的是數學理解。程序算法主要有下面幾種:排序。冒泡排序與快速排序是排序算法中比較常用的兩種。冒泡排序相對比較簡單。快速排序利用了分治的算法思想。二分查找。二分查找同樣是分治思想。在有序數列中可以以中點判斷要查找的數字在數列前半部分還是后半部分,從而每次減少一半的查找時間。遞歸與回溯。理解遞歸並不容易,可以從 a 調用 b, b 調用 a 的雙向嵌套來理解。而 a 調用 a 自己則相當於 b 只做調用 a 這一件事。這兩個算法中的常見例題是漢諾塔與八皇后,信奧特別喜歡考。動態規划。動態規划實際上也是一個數學算法,核心是找出從一個狀態計算下一個狀態的遞推式。如下題中尋找從 a 到 b 不經過對角線的所有路徑數量,只接受右行和上行。指針。指針的核心是對內存存儲數據的理解,一個蘿卜一個坑,一個大蘿卜兩個坑。數據結構。利用指針代表內存片段就能夠理解如何保存指向相同結構的鏈表節點或者樹節點了。總結

在 CodeCombat ,我們提供了很好的練習平台來訓練學生,加深他們對 C++ 絕大部分實用語法的理解。熟練地掌握語法能解決 C++ 中的編譯問題,也就相當於解決了一半的代碼問題。而實際上 C++ 學習過程中編譯問題還不止占錯誤數量的一半,這些都是 CodeCombat 能很好解決的。因為 CodeCombat 有着所寫即所得的游戲,游戲為什么能吸引孩子,因為用鍵盤或者鼠標的每一個操作都有直觀的游戲動作,這是一種很強的控制感,會讓孩子覺得自己確實在做什么事。傳統的信奧練習以數學題為主,對孩子們來說難以理解使用計算機的意義——因為數學解法往往比編程解法更為快捷,既然課堂上已經學習過數學解法,那么課外再學習編程解法的成就感就會大大降低。但利用編程控制游戲角色就回到了游戲的控制感中,因為每一行代碼都有了更豐富的意義,學習的興趣也就會更強。而一旦對代碼有了興趣,同時又熟悉了基本語法,那么學習算法並實現就是一件如魚得水的事了。

免費學習步驟:

1.打開網站:koudashijie.com

2.點擊右上角的注冊按鈕

3.注冊成為學生

4.輸入班級碼:SickSinkHorse,點擊繼續

5.輸入您的用戶名等信息

6.定制自己的英雄

7.注冊成功啦,快去玩玩吧~!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM