可以執行的C++程式的基本架構如下,以下這段程式碼電腦可以正常編譯並運行了(編譯是指運行C++必經的過程,將人類閱讀的程式碼轉換成給電腦運行的機器碼,類似翻譯的動作),只不過這段程式碼並不會做任何事,需要將「//程式內容」替換成要執行的程式碼。
請將這段程式碼牢牢記住,要隨時都能迅速地寫出來,可以不用死記,多練習幾次自然會記起來。
#include<bits/stdc++.h>
using namespace std;
int main(){
//程式內容
}
雖然以上的架構還沒有實際編寫要執行的程式,但請先牢記「C++中每段程式碼的結尾都要有分號;」,在後續開始編寫時請謹記要加上;。
另外在程式碼中寫上//會讓該行在//以後的部分成為「註解」,電腦並不會執行這部分,通常是作為註記用途,本教學會利用註解來補充說明程式碼的用途。
#include<bits/stdc++.h>一行是將C++內建的基本功能(包含但不限於輸入、輸出)加入我們寫的程式。
using namespace std;一行是簡化後續使用C++內建功能的步驟,如原本輸出要使用std::cout,加入該行程式碼後只需要cout即可。
int main(){...}則是主函式的概念,代表該程式執行時會從裡面的程式開始執行。
程式中最重要的功能之一就是變數的使用,建立變數就是告訴電腦將一個資料暫時儲存起來,後面的程式就能依據這個存起來的資料進行操作、運算。
在程式中建立新的變數稱作宣告變數,C++宣告變數的方式為「變數型別 變數名稱;」,變數型別代表變數想儲存怎樣的值,例如最常見的整數int。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n; //宣告整數變數n
int x,y; //一次宣告多個同型別的變數,可以用逗號分隔
}
此外尚有浮點數double,可以用來儲存小數,若在C++程式碼中寫了包含小數點的數字,如「1.0」,也會被視為double。除此之外C++程式碼內還有一種表示法為科學記號,輸入「2e3」代表「2*103」也就是2000,在程式碼內此種表示法也會被視為double。
long long int用來儲存較大的整數(大於2147483647,約為2*109),在C++程式碼中的整數數值後寫上LL(小寫亦可)則可以告訴電腦現在寫的這個整數要視為long long int。
若使用int儲存過大的數,則會因為「溢位」,也就是超出int能處理的範圍,導致數字變成亂數,這點在運算過程中也可能發生,如「int a=100000,b=100000;」,此時a*b變會溢位導致出現錯誤結果,解決方式就是使用long long int進行運算。
double的儲存是利用類似科學記號的形式,紀錄最前面的約15位數後,再處理小數點的位置,也就是其實double可以儲存到很大的數字(最大值21024,309位數),但此時只有前15位數是精確的。
因此遇到極大的整數時仍要使用long long int儲存,其最大可以儲存263-1(約為9*1018)。
除此之外long long int還有幾點要補充,一是其可以寫作long long,與long long int完全一樣,依個人習慣選擇就好,二是可以利用1LL*...來將一般int轉換為long long int,詳細原理在下面型別的轉換會提及。
此外還有char、string兩種與文字相關的型別,只是由於其性質與以上所述的其他型別相差很大,因此獨立在章節0-3介紹以避免混淆。
重點整理:型別的轉換
C++中若涉及不同型別的運算,就會牽扯到型別轉換,如「1.0*5LL」,此時C++會將運算結果的型別以「比較強」的型別處理,換句話說原先的型別可能會被轉換成其他型別,稱為轉型。
而上述比較強的意義其實是變數能儲存的值範圍較廣,故以上種類變數的排序會是「double > long long int > int」。
如此就可以知道「1.0*5LL」算完會是double。
C++中型別是非常重要的,在遇到不同型別混合運算時請謹記此規則。
另外在某些時候,我們會希望將一個值的型別直接轉換,例如使用科學記號表示整數。
這時候可以使用一個方法叫「強制轉型」,將變數或運算結果前面加上「(轉型種類)」就可以了,注意強制轉型只會影響後面接著的一個值。
舉例來講,不想寫「1000...000LL」來表示1018,可以用「(long long)1e18」替代。
而宣告了變數後,我們通常需要給予其一個值,稱為「賦值」,賦值的方式是「變數名稱=值;」,右邊的值可以是直接一個數值或者由其他變數進行運算,總之會將等號右邊的內容存到左邊的變數中。
注意變數如果沒有由輸入取得值(本篇後面會介紹到利用cin讓變數儲存輸入的資料),就必須在宣告時進行賦值的動作,否則後續使用該變數容易出現bug。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
n=1; //將n賦值1
int m=2; //宣告時亦可賦值
//到這裡時變數n儲存的值為1,變數m儲存的值為2
n=5,m=8; //不同變數的賦值可以由逗號分隔
//對已經賦值過的變數進行賦值,會直接覆蓋掉原本的資料,到這裡時變數n儲存的值為5,變數m儲存的值為8
int x=n*m,y=n-m; //宣告後x為40,y為-3
}
而如果是要一次儲存很多變數的時候,則可以使用陣列,陣列可以一次建立數萬甚至更多個同型別的變數,在宣告時變數名稱後加上[陣列大小]就可以宣告一個陣列,而要使用陣列內的其中一項進行賦值或拿來運算時,一樣在變數名稱後加上[第幾項]就能使用(其中第幾項的編號被稱為索引值),如下。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[10]; //宣告大小為10的整數陣列a
a[1]=1,a[2]=4,a[3]=9,a[4]=16; //賦值陣列a的第一到第四項
int n=a[3]+a[4]; //使用變數時一樣加上[第幾項(索引值)],例如此處是賦值n為a的第三項加第四項,結果為25
int b[10]={1,2,3,4}; //可以將陣列的前4項(b[0]~b[3],陣列索引值從0開始編號,見下方說明)賦值為1,2,3,4
//小陣列逐個賦值可以用此方法,但通常陣列直會使用迴圈(見0-2)輸入資料
}
可以將上述的陣列當作一排變數排在一起,而除了一排變數以外,C++還可以有二維的陣列,也就是把變數排成有行列的表格,宣告方式與一維陣列類似,只是變成「int a[第一維大小][第二維大小];」,此時總共可以儲存的變數數量會是「第一維大小*第二維大小」,而使用時也與一維陣列一樣,只不過有兩個索引值,如a[0][3],索引值最大一樣是「該維的大小-1」,超出可能導致錯誤,因此也建議宣告時大小預先+5。
需要注意宣告陣列後,陣列的索引值是從0開始編號,也就是說假設宣告陣列大小為10的時候,實際上可以使用的為a[0]、a[1]、...、a[9],恰好10項,若使用超過9的索引值可能導致程式出現錯誤,因此建議宣告時陣列大小至少使用「可能會用到的最大大小+5」。
另外建議可以養成將陣列宣告在全域的習慣,也就是在int main()的上方,如下,因為宣告在main內有時候會因為陣列大小太大導致程式掛掉中斷執行,但宣告在main外基本上可以宣告到上億的陣列大小,除此之外宣告在全域的好處還有會自動初始化,即開始執行時所有值都會是零,另外在不同函式(章節0-4會介紹,總之記得會比較方便就是了)也能使用該陣列。
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main(){
a[0]=1,a[1]=2;
}
C++最簡單的輸入、輸出方式就是使用cin、cout,用法為輸入時「cin>>變數1>>變數2>>變數3;」、輸出時「cout<<內容1<<內容2<<內容3;」。
輸入時請確保輸入內容跟變數型別一致,而輸入只要遇到空格或換行,就會依序讀入不同變數中,如「cin>>n>>m;」輸入「3 6」,在執行到cin那一行程式碼後n會變3、m會變6。
而輸出時由<<串起來的內容會依序輸出,這些內容可以是各種變數,也可以是直接寫在程式碼的運算式,如「cout<<10;」。
如果要輸出字母或空格可以直接在<<後寫「'a'」或「' '」(兩個英文單引號中間有字母、空格),單引號裡面可以放單個英文字母、空格或「\n」(視為一個字母,表示換行),程式就會認出這是表示「單個字母」的資料。
如果是一串英文字母可以使用雙引號,如「"Hello, World!"」,雙引號會讓程式將這段內容辨識成「一串字母」。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n>>m;
cout<<n+m;
//以上程式可以進行兩個整數的加法
//如輸入「5 7」,則會輸出「12」
}
#include<bits/stdc++.h>
using namespace std;
int main(){
string name; //字串型別,在0-3介紹,這裡只要暫時知道他是用來存一串字母的就好
cin>>name;
cout<<"Hello, "<<name<<'\n';
//以上程式碼可以輸入一個名字,並輸出「Hello 名字」然後換行
//如輸入「Samuel」,則會輸出「Hello, Samuel」
}
由於C++是利用類似科學記號的形式儲存浮點數,因此若執行「double x=123456789; cout<<x;」會輸出「1.23457e+08」,代表1.23457*10^8,至於非1.23456是因為將輸出結果四捨五入至有限的位數。而若要避免這樣的輸出,因為題目中都要求輸出正常的小數,則可以在程式碼的最前面寫上「cout<<fixed;」,注意此程式碼只需要寫一次就好,不用每次輸出前都寫;而另外有些題目是指定輸出幾位小數,此時可以寫成「cout<<fixed<<setprecision(n);」,其中的n就是會輸出到小數點後第n位,同樣只要執行一次就可以。
C++中進行基本運算的方式跟平常四則運算的規則一樣,+-*/並用時有先乘除後加減的規則,而如果有()會先將()內的內容運算完,並且多層()時一樣從最內層進行運算。而C++常見的運算還有取餘數,或稱取模,運算的符號是%,例如5%3代表5除3的餘數,運算結果是2,但須注意取模運算只適用於兩個整數間。另外需要注意的是程式中不能出現/0或%0的情況,因此若出現/a或%a時,請確保變數a的值不會是0。
雖然說C++的基本運算與平常數學的用法基本一樣,但唯一需要注意的是型別問題。例如「9/2」的結果,看似是4.5,但由於兩個數都是int型別,因此運算結果也會以int處理,而C++中對於無法整除、小數變整數,都是以無條件捨去來處理,因此9/2的結果為4。如果要得到4.5的話可以使用「9.0/2」,由於前面提及C++會以較強的型別來處理運算結果,而double較強,因此最終的結果會是4.5。
另外請注意C++沒有內建指數的運算子,也就是不像某些語言有a**b代表a的b次方的寫法,而a^b也不是a的b次,請不要用錯了。
如果今天要操控變數的值,例如將某個變數的值+5,除了可以使用賦值的方式「n=n+5;」,C++還有可以直接操作變數的方法,就是寫成「n+=5;」,這時變數n的值就會直接加上5了,同理有「-=」、「*=」、「/=」、「%=」;另外,對於整數變數還有兩種方式,「n++;」、「n--;」,分別會將變數n增加1與減少1,等同「n+=1;」、「n-=1;」。
不管是賦值或上述其他變數的運算操作,都會丟出運算完的值,但要使用其運算完的值需要加上()避免出現錯誤,例如「cout<<(n=5);」,會輸出5,因為n賦值變成5後,其值可以用於cout輸出,又例如「n=10; cout<<(n*=2);」會將n變為20並輸出20。
此外等號是可以連用的,會將最右邊的值賦值到左邊的變數中,如「n=m=10;」可以將n、m都賦值為10。
上述的「++」、「--」也可以丟出數值,只不過有分成先取值再加減跟先加減再取值。以「++」為例,若一開始變數n為5,則「cout<<(n++);」是先取值,所以輸出會是5,再加減,所以執行完n還是會變6;若是「cout<<(++n);」,則是先加完變6,再取值6進行輸出;「--」同理。而兩者差別可以用以下方式記憶「n++」的n在前面,所以會先取n值再+1;反之「++n」則是先+1再取加完的n值。
若有回覆需求可以選擇提供email。