本書面向程序設計競賽的準備和訓練,引導讀者進入編程的大門,主要內(nèi)容包括:編程概述、編程語法基礎、編程結(jié)構(gòu)、進制轉(zhuǎn)換、鏈表、排序、STL、思維訓練、遞推、貪心算法、優(yōu)先隊列、簡單搜索、分治等。
我們編著大學程序設計課程與競賽訓練教材系列圖書的初心是,基于程序設計競賽的試題,以全面、系統(tǒng)地訓練和提高學生編程解決問題的能力為目標,出版既能用于大學程序設計類課程的教學和實驗,又能用于程序設計競賽選手訓練的著作。目前,這一系列在中國大陸出版了簡體中文版,在中國臺灣地區(qū)出版了繁體中文版,在美國由CRC Press出版了英文版。而我們不僅對本系列不斷進行改進,也就課程建設、教學和訓練體系的建設開展了一系列的工作。
對于大學程序設計課程與競賽訓練教材系列圖書的建設,寧夏理工學院副校長俞經(jīng)善教授建議,要出版一部專門進行程序設計入門訓練的書籍,它不僅能夠適用于雙一流院校的學生,也要能夠適用于應用技術(shù)型院校的學生。華東交通大學的周娟老師一直負責學校的程序設計競賽訓練,她有一本使用了若干年的講義,我們對這本講義進行了改編,形成了本書。
對于本書的編寫,我們的指導思想如下。
1)內(nèi)容上,基于大學一年級的程序設計語言、高等數(shù)學、線性代數(shù)課程的教學內(nèi)容,以及中學期間所學的數(shù)學、物理相關(guān)知識,讓學生體會和實踐通過編程解決問題。
2)形式上,和系列著作一樣,章節(jié)的組織以實驗為核心,以程序設計競賽試題以及詳細的解析、帶注解的程序作為主要內(nèi)容。
本書的內(nèi)容如下。
第1章給出簡單輸出,以及練習輸入-處理-輸出模式的實驗。第2章給出選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、嵌套結(jié)構(gòu)、數(shù)組、二維數(shù)組、字符和字符串的實驗;第3章給出函數(shù)、遞歸函數(shù)、結(jié)構(gòu)體、指針的實驗。本書的前三章是基于程序設計語言的教學大綱,循序漸進地展開編程實驗,可以作為程序設計語言課程的實驗教材。
第4章分為五節(jié):幾何初步,歐幾里得算法和擴展的歐幾里得算法,概率論初步,微積分初步,矩陣計算。一方面,結(jié)合學生在中學期間所學習和掌握的數(shù)學知識進行編程解題訓練;另一方面,配合學生大一期間學習的高等數(shù)學中的導數(shù)、線性代數(shù)中的矩陣給出編程實驗。第5章也分為五節(jié):簡單的排序算法(選擇排序、插入排序、冒泡排序),歸并排序,快速排序,利用排序函數(shù)進行排序,結(jié)構(gòu)體排序。首先,給出運用運行時間為O(n2)的簡單排序算法進行排序的實驗;然后,給出運用時間復雜度為O(nlog2n)的排序算法進行排序的實驗;后,給出利用排序函數(shù)進行排序以及結(jié)構(gòu)體排序的實驗。第6章分為兩節(jié):STL容器,STL算法。
本書可作為大學程序設計語言入門課程的實驗教材,也可用作程序設計競賽選手的入門訓練參考書籍。
我們對浩如煙海的ACM-ICPC程序設計競賽區(qū)域預賽和全球總決賽、大學的程序設計競賽、在線程序設計競賽以及中學生信息學奧林匹克競賽的試題進行了分析和整理,從中精選出84道試題(包括一題多解)作為本書的實驗范例試題,每道試題不僅有詳盡的試題解析,還給出了標有詳細注釋的參考程序。
華章網(wǎng)站(www.hzbook.com)提供了本書所有試題的英文原版以及大部分試題的官方測試數(shù)據(jù)。
這些年來,我們秉承不忘初心,方得始終的信念,不斷地完善和改進系列著作。我們非常感謝廣大海內(nèi)外同人的情義相挺,并特別感謝中國大陸及中國臺灣、中國香港、中國澳門的同人一起創(chuàng)建ACM-ICPC亞洲訓練聯(lián)盟,該聯(lián)盟不僅為本書也為我們的系列著作及其課程建設提供了一個實踐的平臺。
由于時間和水平所限,書中肯定會夾雜一些錯誤,表述不當和筆誤也在所難免,熱忱歡迎學術(shù)界同人和讀者賜正。如果你在閱讀中發(fā)現(xiàn)了問題,請通過電子郵件告訴我們,以便我們在課程建設和中英文版再版時加以改進。聯(lián)系方式如下。
通信地址:上海市邯鄲路220號復旦大學計算機科學技術(shù)學院?吳永輝(郵編:200433)
電子郵件:yhwu@fudan.edu.cn
周 娟 吳永輝
2021年4月
注:本書試題的在線測試地址如下。
在線評測系統(tǒng)簡稱網(wǎng)址
北京大學在線評測系統(tǒng)POJhttp://poj.org/
浙江大學在線評測系統(tǒng)ZOJhttps://zoj.pintia.cn/home
UVA在線評測系統(tǒng)UVAhttp://uva.onlinejudge.org/
http://livearchive.onlinejudge.org/
Ural在線評測系統(tǒng)Uralhttp://acm.timus.ru/
HDOJ在線評測系統(tǒng)HDOJhttp://acm.hdu.edu.cn/
計蒜客在線評測系統(tǒng)計蒜客https://nanti.jisuanke.com/acm
Gym在線評測系統(tǒng)Gymhttp://codeforces.com/problemset
前 言
第1章 編程起點:輸入和輸出 1
1.1 輸出 1
1.2 輸入與輸出 2
第2章 編程基礎I 4
2.1 選擇結(jié)構(gòu) 4
2.2 循環(huán)結(jié)構(gòu) 7
2.3 嵌套結(jié)構(gòu) 14
2.4 數(shù)組 21
2.4.1 數(shù)組的特點 22
2.4.2 離線計算 26
2.4.3 序列 29
2.5 二維數(shù)組 33
2.6 字符和字符串 41
第3章 編程基礎II 49
3.1 函數(shù) 49
3.2 遞歸函數(shù) 57
3.3 結(jié)構(gòu)體 61
3.4 指針 69
第4章 數(shù)學計算 76
4.1 幾何初步 76
4.2 歐幾里得算法和擴展的歐幾里得算法 87
4.3 概率論初步 93
4.4 微積分初步 101
4.5 矩陣計算 108
第5章 排序 115
5.1 簡單的排序算法:選擇排序、插入排序、冒泡排序 116
5.2 歸并排序 122
5.3 快速排序 129
5.4 利用排序函數(shù)進行排序 132
5.5 結(jié)構(gòu)體排序 138
第6章 C STL 144
6.1 STL容器 144
6.1.1 序列式容器 144
6.1.2 關(guān)聯(lián)式容器 150
6.1.3 迭代器 161
6.2 STL算法 170