- 算法競(jìng)賽寶典(第一部):語(yǔ)言及算法入門
- 張新華
- 1968字
- 2021-03-19 19:27:45
選擇結(jié)構(gòu)
選擇結(jié)構(gòu)用于判斷給定的條件,根據(jù)判斷的結(jié)果來(lái)控制程序的流程。
要使用選擇結(jié)構(gòu),我們先來(lái)學(xué)習(xí)關(guān)系運(yùn)算。所謂關(guān)系運(yùn)算,實(shí)際上就是“比較運(yùn)算”。將兩個(gè)值進(jìn)行比較,判斷其比較的結(jié)果是否符合給定的條件。例如a>4是一個(gè)關(guān)系表達(dá)式,大于號(hào)是一個(gè)關(guān)系運(yùn)算符,如果滿足a>4的條件下,則該關(guān)系表達(dá)式的值為“真”,否則該關(guān)系表達(dá)式的值為“假”。
C++語(yǔ)言提供6種關(guān)系運(yùn)算符,如表2.1所示。
表2.1

if語(yǔ)句是用來(lái)判定所給定的條件是否滿足,根據(jù)結(jié)果的真或假?zèng)Q定執(zhí)行給出的兩種操作之一。
C++語(yǔ)言提供了三種形式的if語(yǔ)句:
1. if(表達(dá)式成立) 執(zhí)行語(yǔ)句 2. if(表達(dá)式成立) 執(zhí)行語(yǔ)句1 else 執(zhí)行語(yǔ)句2 3. if(表達(dá)式1成立) 執(zhí)行語(yǔ)句1 else if(表達(dá)式2成立) 執(zhí)行語(yǔ)句2 else if(表達(dá)式3成立) 執(zhí)行語(yǔ)句3 … else if(表達(dá)式m成立) 執(zhí)行語(yǔ)句m else 執(zhí)行語(yǔ)句n
這個(gè)很容易理解,我可以舉生活中的例子如下:
1. if(天氣好) 我就上街逛逛; 2. if(天氣好) 我就上街逛逛; else 我就待在家; 3. if (我至少有五百塊錢) 我可以買五件貨; else if(我至少有四百塊錢) 我可以買四件貨; else if(我至少有三百塊錢) 我可以買三件貨; else if(我至少有兩百塊錢) 我可以買兩件貨; else if(我至少有一百塊錢) 我可以買一件貨; else 回家吧,什么都不說(shuō)了,一說(shuō)都是淚啊;
【例題描述】 求絕對(duì)值
魔法師使用的能量除了正能量以外,還有一種神秘的暗能量,暗能量是一種不可見(jiàn)的、能推動(dòng)宇宙運(yùn)動(dòng)的能量。如圖2.4所示,與正能量級(jí)別相對(duì)應(yīng)的,魔法師將暗能量的級(jí)別以負(fù)數(shù)表示,現(xiàn)已知某種能量的級(jí)別,試用if語(yǔ)句顯示該能量級(jí)別的絕對(duì)值。

圖2.4
我是這樣寫的:
1 //求絕對(duì)值1 2 # include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int x; 8 cin>>x; 9 if (x<0) 10 x=-x; 11 cout<<x<<endl; 12 system("pause"); 13 return 0; 14 }
我是這樣寫的:
1 //求絕對(duì)值2 2 # include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int x; 8 cin>>x; 9 if (x<0) 10 cout<<-x<<endl; 11 else 12 cout<<x<<endl; 13 system("pause"); 14 return 0; 15 }
在if和else后面只含一個(gè)內(nèi)嵌的操作語(yǔ)句(如上例),如果有多個(gè)操作語(yǔ)句,就必須要用花括號(hào)“{ }”將幾個(gè)語(yǔ)句括起來(lái)成為一個(gè)復(fù)合語(yǔ)句。如:
if(x>y) { number=0; //語(yǔ)句1 cout<<x<<endl; //語(yǔ)句2 } else { number=1; //語(yǔ)句1 cout<<y<<endl; //語(yǔ)句2 }
我明白了,我舉一個(gè)生活中的例子:
if(天氣好) { 我就購(gòu)物; 我就看電影; 我就吃冰淇淋; } else { 我就在家看書; 我就在家看動(dòng)畫片; }
【例題描述】 兩實(shí)數(shù)排序
輸入兩個(gè)實(shí)數(shù)a和b,按代數(shù)值由小到大的次序輸出這兩個(gè)數(shù),例如輸入“3 2”,輸出“2 3”,輸入“2 3”,輸出仍是“2 3”。注意只允許使用cout<<a<<" "<<b這樣的語(yǔ)句,而不允許使用諸如cout<<b<<" "<<a這樣取巧的語(yǔ)句。
根據(jù)題目要求,顯然當(dāng)a>b的時(shí)候,a和b的值要互換,但a和b的值不能直接互換,而要通過(guò)一個(gè)中間變量(例如t)互換a,b的值。可以這樣想象:假設(shè)有一瓶醬油和一瓶醋,如果要把醬油裝入醋瓶,醋裝入醬油瓶,就必須要有一個(gè)空瓶子作為臨時(shí)盛放的容器。中間變量t就相當(dāng)于這個(gè)空瓶子。
參考程序如下所示:
1 //兩實(shí)數(shù)排序 2 # include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 float a,b,t; 8 cin>>a>>b;; 9 if(a>b) 10 {t=a;a=b;b=t;} 11 cout<<a<<" "<<b<<endl; 12 system("pause"); 13 return 0; 14 }
【上機(jī)實(shí)踐】 三實(shí)數(shù)排序
輸入3個(gè)數(shù)a、b、c,要求模擬兩實(shí)數(shù)排序的程序按由小到大的順序輸出。
偽代碼如下所示:
1 定義浮點(diǎn)數(shù)a,b,c,t 2 輸入a,b,c 3 如果(a>b) 4 a,b兩值交換 5 如果(a>c) 6 a,c兩值交換 7 如果(b>c) 8 b,c兩值交換 9 輸出a,b,c的值
注意該程序中三個(gè)變量的比較過(guò)程,即先比較a是否大于b,再比較a是否大于c,最后比較b是否大于c。想想看,如果改變比較順序,結(jié)果是否仍然正確?
【上機(jī)實(shí)踐】 等級(jí)制
魔法學(xué)院的考試采用等級(jí)制,即將百分制轉(zhuǎn)化為A、B、C、D、E五個(gè)等級(jí),設(shè)成績(jī)?yōu)閄,則X≥90為A等,X≥80為B等,X≥70為C等,X≥60為D等,否則為E等。試編寫一個(gè)程序,將輸入的分?jǐn)?shù)轉(zhuǎn)換成A、B、C、D和E五個(gè)等級(jí)。
偽代碼如下所示:
1 定義分?jǐn)?shù)為浮點(diǎn)數(shù)x 2 輸入x的值 3 如果(x>=90) 4 輸出"A" 5 否則如果(x>=80) 6 輸出"B" 7 否則如果(x>=70) 8 輸出"C" 9 否則如果(x>=60) 10 輸出"D" 11 否則 12 輸出"E"
C++有一個(gè)可替代if-else語(yǔ)句的操作符,這個(gè)操作符被稱為三目運(yùn)算符(?:),它是C++中唯一一個(gè)需要3個(gè)操作數(shù)的操作符。如a>b?c:d;此句的含義是:a大于b嗎?如果是,則取c的值,否則取d的值。
例如下面的語(yǔ)句:
if(a>b) Max=a; else Max=b; 可以寫成Max=(a>b)?a:b;
【例題描述】 找最大值
編程輸出兩個(gè)整數(shù)的最大值。
1 //求最大值 2 # include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int x,y; 8 cin>>x>>y; 9 int c=x>y?x:y; 10 cout<<c<<endl; 11 system("pause"); 12 return 0; 13 }
分析以下程序的執(zhí)行錯(cuò)誤:
1 //輸出星期幾 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 cin>>n; 9 if(n=1) 10 cout<<"星期一"<<endl; 11 if(n=2) 12 cout<<"星期二"<<endl; 13 if(n=3) 14 cout<<"星期三"<<endl; 15 if(n=4) 16 cout<<"星期四"<<endl; 17 if(n=5) 18 cout<<"星期五"<<endl; 19 if(n=6) 20 cout<<"星期六"<<endl; 21 if(n=7) 22 cout<<"星期日"<<endl; 23 system("pause"); 24 return 0; 25 }
我找到了,對(duì)于n=1來(lái)說(shuō),它的意思是將1賦給n,所以,這是一條賦值語(yǔ)句,整個(gè)表達(dá)式返回值為1,表示true,所以輸出星期一,而對(duì)于其他的if語(yǔ)句也同樣執(zhí)行。改正方法是將所有if條件表達(dá)式中的“=”改為“==”。
在if語(yǔ)句中又包含一個(gè)或多個(gè)if語(yǔ)句稱為if語(yǔ)句的嵌套,一般形式如下:


應(yīng)當(dāng)注意if與else的配對(duì)關(guān)系。else總是與它上面的最近的未配對(duì)的if配對(duì)。就好像穿衣服一樣,總是一層套一層的。
類似的生活中的例子有:
if(天氣好) if(是周末) 我就逛街; else 我就看電影; else if(是周末) 我就看電視; else 我就學(xué)習(xí)
【上機(jī)實(shí)踐】 完整的解一元二次方程
完整解方程ax2+bx+c=0的解實(shí)際上應(yīng)該有以下幾種可能:
(1)a=0,不是二次方程。
(2)b2-4ac=0,有兩個(gè)相等實(shí)根。
(3)b2-4ac>0,有兩個(gè)不等實(shí)根。
(4)b2-4ac<0,沒(méi)有實(shí)根(注意:引入虛數(shù)概念后,應(yīng)該有兩個(gè)共軛復(fù)根)。
這題要注意的是:因?yàn)閍是實(shí)數(shù),而實(shí)數(shù)在計(jì)算和存儲(chǔ)時(shí)會(huì)有一些微小的誤差,因此本來(lái)是零的值,由于誤差原因而判別為非零的值。所以不能通過(guò)(a==0)的方式判斷a是否等于0。我們采取的辦法是判斷a的絕對(duì)值是否小于一個(gè)很小的數(shù)(例如0.000001)。
fabs函數(shù)為求一個(gè)double類型的絕對(duì)值,例如fabs(-3)=3。使用fabs函數(shù),程序頭需引用math.h頭文件。順便提一下,abs函數(shù)為求一個(gè)整數(shù)變量的絕對(duì)值。
偽代碼如下所示:
1 定義浮點(diǎn)數(shù)a,b,c,disc,x1,x2
2 輸入a,b,c的值
3 如果(fabs(a)<=1e-6) //1e-6為科學(xué)計(jì)數(shù)法,即1×10-6
4 輸出“不是一元二次方程”
5 否則
6 {
7 設(shè)disc=b*b-4ac
8 如果(disc==0) //注意實(shí)際代碼的括號(hào)內(nèi)應(yīng)寫成(fabs(disc)<=0.000001)
9 輸出兩個(gè)相同的實(shí)根
10 否則如果(disc>0) //此處的代碼應(yīng)該怎么寫?
11 輸出兩不同的實(shí)根
12 否則
13 輸出“無(wú)實(shí)根”
14 }
【例題描述】 判斷閏年
閏年(Leap Year)是為了彌補(bǔ)因人為歷法規(guī)定造成的年度天數(shù)與地球?qū)嶋H公轉(zhuǎn)周期的時(shí)間差而設(shè)立的。因?yàn)榈厍蚶@太陽(yáng)運(yùn)行周期為365天5小時(shí)48分46秒(合365.24219天)即一回歸年(tropical year)。公歷的平年只有365日,比回歸年短約0.2422日,所余下的時(shí)間約為四年累計(jì)一天,故四年于2月加1天,使當(dāng)年的歷年長(zhǎng)度為366日,這一年就為閏年。現(xiàn)行公歷中每400年有97個(gè)閏年。
閏年的條件是符合下面二者之一:(1)能被4整除,但不能被100整除。(2)能被4整除,又能被400整除。請(qǐng)編程判斷某一年是否是閏年。
這個(gè)程序看上去很簡(jiǎn)單嘛,只要進(jìn)行幾次選擇判斷就可以了,這是我寫的程序,你能寫一個(gè)和我這個(gè)程序不一樣的代碼嗎?
1 //判斷閏年1 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int year,leap; 8 cin>>year; 9 if(year%400==0) 10 cout<<"是閏年"; 11 else if(year%100!=0) 12 { 13 if (year%4==0) 14 cout<<"是閏年"; 15 else 16 cout<<"不是閏年"; 17 } 18 else 19 cout<<"不是閏年"; 20 system("pause"); 21 return 0; 22 }
學(xué)過(guò)下面要講的邏輯運(yùn)算符后,這道題也可以只用一個(gè)邏輯表達(dá)式來(lái)表示:
(year%4==0 && year%100!=0)||year%400==0
或者加一個(gè)“!”用來(lái)判別非閏年:
!((year%4==0 && year%100!=0)||year%400==0)
關(guān)系表達(dá)式的值是一個(gè)邏輯值,即“真”或“假”。例如,關(guān)系表達(dá)式“3==4”的值為假,“4>=0”的值為真。C++語(yǔ)言以“1”代表真,以“0”代表假。
C++語(yǔ)言里只要系統(tǒng)給出的邏輯運(yùn)算結(jié)果非零,即為真。
C++語(yǔ)言提供三種邏輯運(yùn)算符,如表2.2所示。
表2.2

邏輯運(yùn)算舉例如下:
a && b:若a、b為真,則a && b為真。
a || b:若a、b之一為真,則a || b為真。
!a:若a為真,則!a為假。
表2.3為邏輯運(yùn)算的“真值表”。
表2.3

在一個(gè)邏輯表達(dá)式中如果包含多個(gè)邏輯運(yùn)算符,例如:
!a&&b||x>y&&c 按以下優(yōu)先次序: (1)!> && > || (2)&&和||低于關(guān)系運(yùn)算符,!高于算術(shù)運(yùn)算符。 例如: (a>b)&&(x>y) 可寫成a>b && x>y (a==b)||(x==y) 可寫成a==b||x==y (!a)||(a>b) 可寫成!a||a>b
為了提高C++程序的運(yùn)行效率,在邏輯表達(dá)式的求解中,并不是所有的邏輯運(yùn)算符都被執(zhí)行,只是在必須執(zhí)行下一個(gè)邏輯運(yùn)算符才能求出表達(dá)式的解時(shí),才執(zhí)行該運(yùn)算符。例如:
(1)a && b && c只有在a為真時(shí),才需要判別b的值。只有a和b都為真的情況下才需要判別c的值。只要a為假,就不必判別b和c的值。如果a和b為假,則不判別c。
(2)a || b || c只要a為真,就不必判斷b和c,只有a為假,才判別b。a和b都為假才判別c。
例如下例中輸出的a、b、c的值分別為0、1、1。
1 //邏輯表達(dá)式示例 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int a=0; 8 int b=1; 9 int c=1; 10 if(a && b++ && c++) 11 b++; 12 cout<<a<<b<<c<<endl; 13 system("pause"); 14 return 0; 15 }
那這樣就很容易寫了,看看我的代碼對(duì)不對(duì)?
1 //判斷閏年2 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int year; 8 cin>>year; 9 if((year%400==0) || ((year%4==0) && (year%100!=0))) 10 cout<<year <<"是閏年"<<endl; 11 else 12 cout<<year<<"不是閏年"<<endl; 13 system("pause"); 14 return 0; 15 }
switch語(yǔ)句是多分支選擇語(yǔ)句。用來(lái)實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。如學(xué)生的成績(jī)‘A’等為85分以上,‘B’等為70~84分,‘C’等為60~69分,‘D’等為50~59,其余的為‘E’等,我們可以實(shí)現(xiàn)如下:
switch(grade) //比較grade值,grade值為一個(gè)字符 { case 'A':cout<<“85-100分\n”; //若grade值為'A' case 'B':cout<<“70-84分\n”; //若grade 值為'B' case 'C':cout<<“60-69分\n”; //若 grade 值為'C' case 'D':cout<<“50-59分\n”; //若 grade 值為'D' default:cout<<“低于50分\n”; //否則為E }
switch后面括弧內(nèi)的表達(dá)式,可以為任何類型。如上例中g(shù)rade為字符型。
表達(dá)式的值必須與某一case后面的常量表達(dá)式的值完全匹配,才執(zhí)行此case后面的語(yǔ)句,若所有的case中的常量表達(dá)式的值都沒(méi)有與表達(dá)式的值相匹配,就執(zhí)行default后面的語(yǔ)句。
每一個(gè)case的常量表達(dá)式的值必須互不相同,否則會(huì)出現(xiàn)互相矛盾的現(xiàn)象。
每個(gè)case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。
要注意的是:執(zhí)行完一個(gè)case后面的語(yǔ)句后,流程控制轉(zhuǎn)移到下一個(gè)case繼續(xù)執(zhí)行。“case常量表達(dá)式”只是起語(yǔ)句標(biāo)號(hào)作用,并不是在該處進(jìn)行條件判斷。在執(zhí)行switch語(yǔ)句時(shí),根據(jù)switch后面表達(dá)式的值找到匹配的入口標(biāo)號(hào)后,就從此標(biāo)號(hào)開始執(zhí)行下去,不再進(jìn)行判斷。例如上面的例子中,若grade的值等于‘A’,則將連續(xù)輸出。輸出結(jié)果如下:
85-100分
70-84分
60-69分
50-59分
低于50分
應(yīng)該在執(zhí)行一個(gè)case分支后,使流程跳出switch結(jié)構(gòu),即終止switch語(yǔ)句的執(zhí)行。我們可以用一個(gè)break語(yǔ)句來(lái)跳出結(jié)構(gòu)。程序如下:
switch(grade) //比較grade值,grade值為一個(gè)字符 { case 'A':cout<<"85-100分\n"; break; case 'B':cout<<"70-84分\n"; break; case 'C':cout<<"60-69分\n"; break; case 'D':cout<<"50-59分\n"; break; default:cout<<"低于50分\n"; //此處可以不加break語(yǔ)句。 }
那我可以少寫一些語(yǔ)句了,因?yàn)槎鄠€(gè)case可以共用一組執(zhí)行語(yǔ)句,例如:
switch(grade) { case 'A': case 'B': case 'C': cout<<"高于60分\n";break; //語(yǔ)句1 case 'D': default:cout<<"低于60分\n"; //語(yǔ)句2 } 則當(dāng)grade的值為A、B、C時(shí)執(zhí)行語(yǔ)句1,當(dāng)grade的值為C,D時(shí)執(zhí)行語(yǔ)句2。
【例題描述】 五分制
魔法學(xué)校實(shí)行五分制,即5分為最高分,現(xiàn)在輸入一個(gè)學(xué)生的分?jǐn)?shù),如果是5分,則輸出“優(yōu)秀”,如果是4分,則輸出“良”,如果是3分,則輸出“及格”,如果是2分,則輸出“不及格”,如果是1分,則輸出“太糟糕了”。
1 //五分制 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int grade; //注意此處是整數(shù) 8 cin>>grade; 9 switch(grade) //比較grade值,grade值為一個(gè)整數(shù) 10 { 11 case 5: 12 cout<<"優(yōu)秀\n"; break; 13 case 4: 14 cout<<"良\n"; break; 15 case 3: 16 cout<<"及格\n"; break; 17 case 2: 18 cout<<"不及格\n"; break; 19 default:cout<<"太糟糕了\n"; //此處可以不加break語(yǔ)句 20 } 21 system("pause"); 22 return 0; 23 }
【例題描述】 等級(jí)劃分
魔法學(xué)校實(shí)行等級(jí)制,即A、B、C、D、E,現(xiàn)在輸入一個(gè)學(xué)生的等級(jí),如果是A,則輸出“優(yōu)秀”,如果是B,則輸出“良”,如果是C,則輸出“及格”,如果是D,則輸出“不及格”,如果是E,則輸出“太糟糕了”。
1 //等級(jí)劃分 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 char grade; //注意此處是字符型 8 cin>>grade; 9 switch(grade) //比較grade值,grade值為一個(gè)字符 10 { 11 case'A': 12 cout<<"優(yōu)秀\n"; break; 13 case'B': 14 cout<<"良\n"; break; 15 case'C': 16 cout<<"及格\n"; break; 17 case'D': 18 cout<<"不及格\n"; break; 19 default:cout<<"太糟糕了\n"; //此處可以不加break語(yǔ)句 20 } 21 system("pause"); 22 return 0; 23 }
【例題描述】 運(yùn)費(fèi)計(jì)算
魔法學(xué)院需要運(yùn)輸一批魔法材料,已知運(yùn)費(fèi)計(jì)算公式為f=p×w×s×(1-d),其中p為運(yùn)輸物品價(jià)值,w為運(yùn)送物品重量,s為運(yùn)送物品距離,d為折扣。現(xiàn)已知p、w、s的值,而折扣d的計(jì)算遵守以下規(guī)則:
s<250 沒(méi)有折扣
250≤s<500 2%折扣
500≤s<1000 5%折扣
1000≤s<2000 8%折扣
2000≤s<3000 10%折扣
3000≤s 15%折扣
試計(jì)算運(yùn)費(fèi)f的值。注意,只能用switch語(yǔ)句判斷和計(jì)算折扣值。
這個(gè)程序如果用判斷語(yǔ)句解決并不是特別困難,可是如果用switch語(yǔ)句來(lái)解決,好像有點(diǎn)困難。因?yàn)楸磉_(dá)式的值必須與某一case后面的常量表達(dá)式的值完全匹配,所以顯然不能寫成case s<250或者case(2000<=s)&&(s<3000)這樣的錯(cuò)誤形式。
可也總不能寫幾千個(gè)case吧?因此我們需要想辦法將無(wú)盡的數(shù)集映射為有限的數(shù)集,你想到怎么做了嗎?
參考程序如下所示:
1 //計(jì)算運(yùn)費(fèi) 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int c,s; 8 float p,w,d,f; 9 cin>>p>>w>>s; 10 c=s/250; //c是s的映射 11 switch(c) 12 { 13 case 0:d=0;break; 14 case 1:d=2;break; 15 case 2: 16 case 3:d=5;break; 17 case 4: 18 case 5: 19 case 6: 20 case 7:d=8;break; 21 case 8: 22 case 9: 23 case 10: 24 case 11:d=10;break; 25 default:d=15;break; 26 } 27 f=p*w*s*(1-d/100.0); 28 cout<<"總運(yùn)費(fèi)="<<f<<endl; 29 system("pause"); 30 return 0; 31 }
由于折扣的變化是有規(guī)律的,折扣的變化點(diǎn)都是250的倍數(shù),(250、500、1000、2000、3000)。所以利用這一特點(diǎn),加一個(gè)變量c=s/250,c代表250的倍數(shù)。
【上機(jī)實(shí)踐】 判斷某日是一年的第幾天
鍵盤上按照年月日的格式輸入年份、月和日期,運(yùn)行程序以后,判斷這一天是這一年的第幾天。
一年有12個(gè)月,每個(gè)月的天數(shù)是一定的,因此在解決問(wèn)題時(shí),可以用switch語(yǔ)句對(duì)應(yīng)每個(gè)月,然后將天數(shù)進(jìn)行累加。需要考慮的是2月的天數(shù)計(jì)算,2月天數(shù)可以先看成28,計(jì)算完畢后再根據(jù)年份的閏/平年的不同考慮是否加1。
- LabVIEW入門與實(shí)戰(zhàn)開發(fā)100例
- 算法訓(xùn)練營(yíng):入門篇(全彩版)
- HTML5 移動(dòng)Web開發(fā)從入門到精通(微課精編版)
- Getting Started with CreateJS
- 名師講壇:Spring實(shí)戰(zhàn)開發(fā)(Redis+SpringDataJPA+SpringMVC+SpringSecurity)
- Ext JS 4 Web Application Development Cookbook
- Haxe Game Development Essentials
- Scala程序員面試算法寶典
- SQL Server從入門到精通(第3版)
- 小型編譯器設(shè)計(jì)實(shí)踐
- Visual Basic程序設(shè)計(jì)習(xí)題與上機(jī)實(shí)踐
- Machine Learning for Developers
- Learning Python Data Visualization
- MySQL 8從零開始學(xué)(視頻教學(xué)版)
- Python機(jī)器學(xué)習(xí)與量化投資