- 算法競賽寶典(第一部):語言及算法入門
- 張新華
- 1438字
- 2021-03-19 19:27:43
標準數據類型
C++語言提供了豐富的數據類型,如整數類型、實數類型(浮點數)、字符類型等。每種數據類型均有其取值范圍,Dev-C++(4.9.9.2)是Windows平臺下的32位編譯器,基本數據類型的取值范圍如表1.1所示(方括弧內的部分是可以省寫的,例如,signed int與int等價)。
表1.1

現在的計算機普遍使用二進制(即0和1兩個數碼)來存儲數據。二進制位(bit)是計算機存儲信息的最小單位,代表1個二進制數位,其值為0或1,可以表示兩個狀態/數值。
8個連續的二進制位為一個字節,可以存放1個西文字符的編碼(ASCII碼)。1個漢字占兩個字節。
表1.1列出的整數類型的取值范圍均包含有負數,如果程序中需要用到的某數據類型的取值范圍僅為正數,并且永遠不可能取負數時,則可以使用無符號的數據類型,其取值范圍如表1.2所示。
表1.2

使用無符號類型的整數類型,正整數的最大數據范圍擴大了一倍啊。這對于某些數據規模較大的題目來說,如果不涉及負數的運算,使用無符號類型的整數類型,倒是很方便的。
sizeof函數可用于獲取各數據類型的字節長度,例如獲取long型字節長度可這樣寫:
cout <<sizeof(long);
了解所使用的編譯器支持的各數據類型的字節長度很有必要,可以這樣寫:
cout<<"int的字節長度為"<<sizeof(int)<<endl; cout<<"short的字節長度為"<<sizeof(short)<<endl; cout<<"long的字節長度為"<<sizeof(long)<<endl; cout<<"long long的字節長度為"<<sizeof(long long)<<endl; cout<<"bool的字節長度為"<<sizeof(bool)<<endl; cout<<"char的字節長度為"<<sizeof(char)<<endl; cout<<"float的字節長度為"<<sizeof(float)<<endl; cout<<"double的字節長度為"<<sizeof(double)<<endl; cout<<"long double的字節長度為"<<sizeof(long double)<<endl;
【例題描述】 兩整數相加
輸入兩個整數,計算兩整數相加的和。
1 /* 2 這是一個加法程序 3 */ 4 #include <iostream> 5 using namespace std; 6 7 int main() 8 { 9 int a,b,c; //定義變量a,b,c 10 cout <<"請輸入a,b的值:"; //顯示提示信息 11 cin >> a >>b; //從鍵盤輸入a和b的值 12 c=a+b; //計算a和b的和,并把結果放在c中 13 cout <<a<<"+"<<b<<"="<<c<<endl;//顯示結果 14 system("pause"); 15 return 0; 16 }
第1~3行中的/*…… */是C++語言里的注釋語句,用于注釋多行的語句。
//也是C++語言里的注釋語句,用于注釋當前這一行的語句。
所謂注釋語句只是方便閱讀程序的人理解程序所寫的語句,對編譯和運行不起任何作用,當編譯程序時,將自動忽略注釋語句,所以注釋語句的多少不影響程序運行的快慢。為便于理解,一般注釋語句可用中文表示,當然也可以用英語或漢語拼音作注釋。適當地添加注釋語句是編程的一個好習慣。
int a,b,c;定義了a,b,c三個整型變量,所有的變量必須先定義后使用。
第11行是輸入語句。cin代表標準輸入流設備即鍵盤,輸入操作由運算符“>>”來表達,它表示通過標準輸入設備輸入右邊的數據。cin>>a>>b這條語句是表示從鍵盤輸入兩個整數,cin一次可輸入多個變量的值,注意輸入時數與數之間要以空格間隔。
第12行是表達式語句,即計算a+b的值,并將結果存儲在c中。
第13行最后的endl用于換行,相當于前面用過的'\n'。endl與'\n'有細微的差別,endl除了輸出換行外,還刷新了流,在Cena評測系統(一個可自動評測代碼是否正確的軟件)中,有時使用endl會隨機地導致程序無法通過。
我發現一個小技巧,就是在調試程序過程中,如果暫時不想運行某段代碼,其實無須將它刪除,只需將這段代碼注釋掉就可以了。
可是我又發現一個問題,就是我不小心在輸入數據時多輸入或者少輸入了數字,甚至輸入的根本就是錯誤字符,可是程序仍然會得出結果,雖然這結果是錯誤的。
從鍵盤輸入數據時,需嚴格按輸入語句要求的格式輸入,例如上例中,當a=1,b=2時,cin>>a>>b語句的正確輸入格式應該是輸入半角字符12后回車,其中1和2之間以一個或多個空格分隔,但不能是其他符號。諸如從鍵盤輸入“a=1,b=2”,或者“1,2”之類的格式均是錯誤的。
需要注意的是,如果輸入數字的時候錯誤地輸入了其他字符,在C語言里會將該字符自動轉換為該字符相對應ASCII碼,但C++語言會直接忽略該字符,而直接代之以內存中當前位置的原始儲存值。
此外,輸入輸出語句應嚴格按照格式編寫,例如不能寫成cin>>a,b,c;或者cout<<a+b=c之類的。即輸入輸出的字符串、各變量之間應使用“>>”或“<<”分隔。
C++程序對用到的所有數據都必須指定其數據類型。程序中常需要對一些變量預先設置初值。C++語言允許在定義變量的同時使變量初始化。例如:
int a=5; //指定a為整型變量,初值為5 float f=3.45; //指定f為實型變量,初值為3.45 char c= 'a '; //指定c為字符變量,初值為'a '
其中諸如int a=5這樣的語句,相當于下面兩條語句:
int a; a=5;
也可以使被定義的變量的一部分賦初值。如:
int a,b,c=5; //定義了整型變量a,b,c,其中c的初值為5,注意a,b,c之間用逗號分隔。
如果對幾個變量均賦予初值5,應該寫成:
int a=5,b=5,c=5;
不能寫成int a=b=c=5;
數據類型一經確定,即不再更改,所以變量類型的定義應視程序的實際需要而定,選取數據類型過大會降低運算速度、浪費內存空間,過小會發生數據溢出。
C++程序用到的算術運算符如表1.3所示。
表1.3

C++語言沒有提供數學中的中括號和大括號運算符,而統一以圓括號代替,例如數學算式:{[3-(2-9)]-[(6-10)-(5-17)]},寫成C++的表達式為((3-(2-9))-((6-10)-(5-17))),計算時由內到外計算圓括號里的值。
順便提一下,諸如x2+y2這樣的式子,寫成C++的表達式為x*x+y*y。
諸如a*b+a*c這樣的表達式,注意千萬不要寫成ab+ac這樣的數學算式了,初學者常犯這樣的隱蔽錯誤。
現在自己嘗試著編程解決一些復雜的算式。例如輸入三個整數a,b,c,輸出a3+b3+c3的值。
哈哈,這個簡單,看我的關鍵代碼如下:
int a,b,c; cin>>a>>b>>c; cout<<a*a*a+b*b*b+c*c*c<<"\n";
可是為什么當a=1000,b=1000,c=1000時,結果居然是-1294967296呢?
每種類型的數據都有各自的取值范圍,請勿必確保所定義的數據不超過該類型數據的取值范圍,否則會造成數據的溢出并產生結果錯誤。請注意,數據的溢出在編譯和運行時并不報錯,完全要靠編程者的細心和經驗來保證結果的正確性。
下面的程序顯示了整型數據溢出的錯誤。
1 //整型數據的溢出 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int a=2147483647; 8 a=a+1; 9 cout<<"a ="<<a<<endl; 10 system("pause"); 11 return 0; 12 }
運行結果為:
a=-2147483648
我明白了,變量a在自身加1以后,其值已經超過int型數據的取值范圍,而發生錯誤。這就好像汽車的里程表一樣,當達到最大值以后,又從最小值開始計數。
【上機實踐】 梯形面積
如圖1.18所示,圣魔法學院的主教學樓平面圖是一個梯形,已知梯形的上底和下底的長度分別為15公里和30公里,梯形中陰影部分為高級魔法師才能去的場所,其面積是160平方公里,求梯形面積是多少。

圖1.18
三角形的面積公式是(底×高)/2,由此可以算出梯形的高,再將高代入梯形面積公式(上底+下底)×高/2即可。
- Python數據可視化:基于Bokeh的可視化繪圖
- 劍指Offer(專項突破版):數據結構與算法名企面試題精講
- HoloLens Beginner's Guide
- Java Web及其框架技術
- GitLab Repository Management
- Mastering Julia
- Mastering RStudio:Develop,Communicate,and Collaborate with R
- 小程序開發原理與實戰
- Python全棧數據工程師養成攻略(視頻講解版)
- Mastering AWS Security
- Learning VMware vSphere
- Modular Programming with JavaScript
- 從零開始學Unity游戲開發:場景+角色+腳本+交互+體驗+效果+發布
- Enterprise Application Architecture with .NET Core
- Lync Server Cookbook