屌丝c++语言程序设计第二章 c++语言基础
本章介紹C++語言的一些基本知識,包括程序的基本結構、標識符、數據類型、變量、常量、基本的輸入和輸出方法等。通過本章的學習,應該能夠編寫簡單的C++程序。
【重點和難點】
本章內容比較簡單,沒有難于理解的概念。重點內容包括:
◇ C++語言中的變量和常量的概念和使用;
◇ C++語言中輸入輸出庫的使用。
【學習方法指導】
本章內容簡單,但確是重要的基礎知識,對基本概念應加強記憶與理解,為以后的學習打下堅實的基礎。
【知識點】
標識符;關鍵字;變量;整型變量;浮點型變量
字符型變量;布爾型變量;字符串;常量;枚舉變量
標準輸出;標準輸入;printf輸出;scanf輸入:
第一節 簡單的c++程序
我們對這個程序逐行加以解釋:
首先看下面這個簡單的C++程序(為了方便起見,程序的每一行都加上了行號)。
| 程序2-1: | |
| ? | 1.//simple.cpp是一個簡單的C++程序 2.#include <iostream.h> 3.void main(void) 4.{ 5. int i; 6. cout<<"Hello C++!"; 7. cout<<"請輸入一個整數:\n"; 8. cin>>i; 9. cout<<"您輸入的整數是:"; 10. cout <<i; 11. cout <<'\n'; 12.} |
(1)第一行是C++語言的注釋。其中,"//"是C++語言的一種注釋符號,自"//"開始,一直到本行結束,所有內容都會被當作注釋對待。C++注釋也可以寫成下面的形式:
/*注釋內容*/
即夾在"/*"與"*/"號間的部分是要注釋的內容,例如,本句可以改為:
/*simple.cpp是一個簡單的C++程序*/
我們進行程序設計時,這兩種注釋形式都會經常用到。它們的區別在于:前者只能注釋一行內容,而后者可以注釋多行內容。它可以用在程序的任何地方,編譯器在編譯時將這些信息忽略,注釋就是用來幫助閱讀和理解程序的信息,也可使用注釋來幫助用戶調試程序。
(2)第2行使用預處理指令#include將頭文件iostream.h包含到程序中來, iostream.h是標準的C++頭文件,它包含了輸入和輸出的定義。
(3)第3行定義了一個稱為main的函數。
◇ 一個函數有0個或多個參數,它們出現在函數名后的一對圓括號中。
◇ 括號中的void表示main沒有參數。
◇ 一個函數可以有一個返回類型,它在函數名的左邊。
◇ main函數左邊的返回類型為void,表示沒有返回值。
◇ C++程序的執行總是從main函數開始的。
(4)第4行是一個花括號,是main函數體開始的標記。
(5)第5行是一個語句。
◇ 一個語句可能是定義或聲明一個變量,也可能是得到一個數值的計算步驟。
◇ 一個語句用分號(;)結尾,C/C++用分號來分隔語句。
◇ 這個語句定義了一個整型變量i。
◇ 一個變量能夠保存一種特定類型的數據,整型變量能夠保存一個整型數據。
(6)第6行也是一個語句。
◇ 這個語句將字符串"Hello C++!"發送到cout輸出流。
◇ 一個字符串是一個用雙引號包圍的字符系列。
(7)第7行也是一個語句。
◇ 這個語句將字符串"請輸入一個整數:"發送到cout輸出流。
◇ 字符串的最后一個字符(\n)是一個換行符。
◇ 流是執行輸入和輸出的對象。
◇ cout是C++標準的輸出流,標準輸出通常是指計算機屏幕。
◇ 符號<<是一個輸出運算符,帶一個輸出流作為它的左操作數,一個表達式作為它的右操作數。后者被發送到前者,字符串"請輸入一個整數:\n"發送到cout的效果是把字符串打印到計算機屏幕上。
(8)第8行也是一個語句。
◇ 這個語句將cin輸入流抽取到變量i。
◇ cin是C++標準的輸入流,標準輸入通常是指計算機鍵盤。
◇ 符號>>是一個輸入運算符,帶一個輸入流作為它的左操作數,一個變量作為它的右操作數。前者被抽取到后者,cin輸入流抽取到變量i的效果是將鍵盤的輸入值復制到變量i中。
(9)第9、10、11行分別是在屏幕上打印"您輸入的整數是:"、變量i和和換行符。這三行實際上可以綜合為一個語句:
cout<<"您輸入的整數是:" <<i <<'\n';
它的效果與使用三個語句是一樣的。
(10)第12行的花括號是main函數體結束的標記。
運用第一章介紹的知識,我們在Visual C++6的開發環境里,編譯、連接、運行該程序,可以得到下面的提示:
Hello C++!請輸入一個整數:
假定我們輸入整數5,即:
5↙
↙表示鍵入了"ENTER"鍵(或稱為回車鍵),則得到運行結果:
您輸入的整數是:5
通過這個實例,我們對C++程序的結構、語句、變量、函數、預處理指令、輸入和輸出等,已有了一個初步的印象,在后面的章節中,我們還將作更詳細的介紹。
由于我們定義main( )函數的返回類型為void,所以最后就不用返回值了。如果我們定義main的返回類型的int,則要返回一個整型值:
int main()
{
…
return 0;
}
要注意的是C/C++是區分大小寫的,不能隨便更改,cout是C++標準的輸出流,而Cout不是,如果沒有預先定義,編譯器就不認識這個Cout。大多數C++命令使用小寫字母,大多數常量使用大寫字母,而大多數變量是大小寫混合使用。
第二節 標示符和關鍵字
標識符是一個字符序列,用來標識變量、函數、數據類型等。任何程序都離不開標識符,也就是說,不可能有沒有標識符的C++程序。在程序2-1中,include、void、main、int、i、cin、cout等都是標識符。
標識符可以由大寫字母、小寫字母、下劃線(_)和數字0~9組成,但必須是以大寫字母、小寫字母或下劃線(_)開頭。在C++語言程序中,大寫字母和小寫字母不能混用,比如Name和name就代表兩個不同的標識符。在表2-1中,我們給出了幾個正確和不正確的標識符實例。
| ? | 表2-1:正確和不正確的標識符實例 | ||||||||
| ? |
| ||||||||
標識符的命名規則:
1. 所有標識符必須由一個字母(a~z或A~Z)或下劃線(_)開頭;
2. 標識符的其它部分可以用字母、下劃線或數字(0~9)組成;
3. 大小寫字母表示不同意義, 即代表不同的標識符,如前面的cout和Cout;
在定義標識符時,雖然語法上允許用下劃線開頭,但是,我們最好避免定義用下劃線開頭的標識符,因為編譯器常常定義一些下劃線開頭的標識符。
C++沒有限制一個標識符中字符的個數,但是,大多數的編譯器都會有限制。不過,我們在定義標識符時,通常并不用擔心標識符中字符數會不會超過編譯器的限制,因為編譯器限制的數字很大(例如255)。
一個寫得好的程序,標識符應該盡量有意義。 比如表示年可以用year,表示長度可以用length,表示累加和可以用sum等,這樣的標識符本身就增加了程序的可讀性,使程序更加清晰易懂。
C++語言的標識符經常用在以下情況中:
1. 標識對象或變量的名字
2. 類、結構和聯合的成員
3. 函數或類的成員函數
4. 自定義類型名
5. 標識宏的名字
6. 宏的參數
第三節 基本數據類型
在C++中,數據具有不同的類型,類型定義了變量可存儲的數值范圍以及可進行的操作變量是用于內存中保存數據的,每個變量都必須有確定的數據類型,C++語言的數據類型如圖2-1所示。
在圖2-1中,把數據類型劃分為基本的數據類型和復合的數據類型,我們也可把數據類型分為內置的類型和用戶定義的類型兩大類,用戶定義的類型在使用以前,必須先定義,包括:結構、類、枚舉和聯合類型;內置的類型是指直接被C++提供的類型,也就是說,是除用戶定義的類型以外的其它類型。
?
| ? | |
| ? | 圖2-1 C++數據類型 |
| ? | 第四節 變量 |
| ? |
| 變量就是機器一個內存位置的符號名,在該內存位置可以保存數據,并可通過符號名進行訪問。變量有三個特征: ? ? |
下面是一個使用變量的程序實例:
| 程序2-3: | |
| ? | #include <iostream.h> int main (void) { 1. int workDays = 5; 2. float workHours, payRate, weeklyPay; 3. workHours = 7.5; payRate = 38.55; 4. weeklyPay = workDays * workHours * payRate; 5. cout << "Weekly Pay = " << weeklyPay << '\n'; } |
第一行定義了一個整型變量workDays,并初始化為5,表示一周的工作天數。
第二行定義了三個實型變量,分別表示每天工作的小時數、每小時應支付的薪水及每周應支付的薪水。
第三行是兩個賦值語句。7.5 賦給變量workHours,38.55賦給變量payRate。
第四行是計算每周的工資,即三個變量workDays、workHours、payRate的積,*是乘運算符,結果保存在變量weeklyPay變量中。
第五行輸出字符串"Weekly Pay = "、變量weeklyPay 的值和換行符。
本程序的運行結果如下:
Weekly Pay = 1445.625
如果我們定義一個變量時,沒有給它賦初值,它的值是不定的。例如,在上面的第四行執行前,weeklyPay的值是不定的。
變量第一次賦值稱之為初始化,變量在使用之前應當先初始化。
第五節 常量
在進行程序設計時,常常需要常量,例如圓周率π = 3.1416。在需要常量的地方,直接使用常量的數值的方法非常不好,例如:
//計算圓的面積
s = 3.1416*r*r;
...
如果我們需要提高計算精度,將π的值改為3.1415927進行計算,我們就不得不將程序中所有的π值從3.1416改為3.1415927,這不僅繁瑣,更重要的是很容易出錯。
C++允許定義符號常量,定義常量的一般形式為:
const 類型 名字 = 值;
其中,"類型"是指常量的類型,如short、long、double等,"名字" 是指常量的名字,而"值"是指賦給常量的、合適的數據類型的數值。 參看例2-7。
?
下面給出一個有常量定義的實例程序,這個程序是打印給定半徑的圓的面積和周長。
| ? | 例2-6: |
| ? | void main() { const double PI = 3.1415926535898; //定義圓周率常量PI double radius; //定義圓半徑變量 double area; //定義圓面積變量 double circumference; //定義圓周長變量 cout << "Enter radius : "; cin >> radius; area = PI*radius*radius; circumference = 2.0*PI*radius; cout << "Area of circle of radius " << radius << " is " << area << " \n"; cout << "and its circumference is " << circumference << " \n"; } 運行該程序,并輸入半徑值10.0: Enter radius : 10.0↙ 則輸出結果為: Area of circle of radius 10.0 is 314.159 and its circumference is 62.8319 |
`r` // r為字符型直接常量
3.1415926 // 3.1415926為雙精度直接常量
符號常量就是用一個標識符代表某個常量。符號常量可用關鍵字const聲明,其格式如下:
const 數據類型 常量名=常數值;
例如:
const int a= 1234; //定義a為整型常量其值為1234
const char b=`a` //定義b 為字符型常量其值為a
在程序設計中,盡量使用符號常量來代替常數,這是一種好的編程習慣,這樣可以增加程序的可讀性、可維護性。例如,在數值計算中,我們會經常遇到一些常量,比如圓周率。如果把它定義成符號常量,當需要更改常量值的時候,只需要更改符號常量的定義語句即可。
也可以使用預處理語句定義符號常量,例如我們用:
#define PI 3.14159
定義符號常量PI,然后在程序中使用PI,跟使用常數3.14159的效果是一樣的。編譯器在編譯時,把符號PI替換成3.14159,當需要修改PI的值時,只需要修改上面的語句即可。但是我們不推薦這樣做:因為預定義符號與符號常量不同,在編譯時使用常數替代了所有的預定義符號,這樣在代碼中相應位置實際都是常數。程序中過多的常數會導致程序代碼量變大,而且在多個源文件中定義了同樣的符號,會產生符號重定義的問題。使用常量優于#define宏,優點在于可指定類型信息。
| ? | 例2-7: |
| ? | const double PI = 3.1415927; //圓周率π const long number = 49L; const char TAB = '\t'; const char QUERY = '?'; const double SOMENUM = 1.235E75; |
第六節 枚舉類型
我們常常需要一些整型常量表示某一個的數據范圍。例如,假定需要表示汽車的顏色:
const int cRED = 0;
const int cBLUE = 1;
…
int auto_colour;
auto_colour = cBLUE;
上面的程序語句是用整型變量auto_colour表示顏色,下面的語句也是合法的:
auto_colour = -1;
…
顯然,-1并不是所需要的顏色值。如果能夠限定auto_colour在限定的整數范圍(即規定的幾種顏色集合)內取值就比較好,C++中的枚舉類型能夠讓我們做到這一點。枚舉類型是一種用戶定義的數據類型,其一般定義形式為:
enum 枚舉類型名
{
標識符[=整型常數],
標識符[=整型常數],
...
標識符[=整型常數],
};
"枚舉類型名"右邊花括號中的內容稱之為枚舉表,枚舉表中的每一項稱之為枚舉成員,枚舉成員是常量,也就是說,枚舉表是整型常量的集合。枚舉成員之間用逗號隔開,方括號中的"整型常數"是枚舉成員的初值。
如果不給枚舉成員賦初值,即省掉了標識符后的"=整型常數"時,則編譯器為每一個枚舉成員給一個不同的整型值,第一個成員為0,第二個為1,等等。當枚舉類型中的某個成員賦值后,其后的成員則按依次加1的規則確定其值。下面是一個枚舉類型定義實例:
enum Colour { eRED, eBLUE, eYELLOW, eGREEN,
eSILVERGREY,eBURGUNDY };
這樣就定義了一個稱之為Colour的枚舉類型,編譯器給枚舉成員eRED,…,eBURGUNDY的值分別為0,…,5。 定義了枚舉類型,就可以定義枚舉類型的變量,其值限定為某一個枚舉成員。例如:
Colour auto_colour;
…
auto_colour = eBURGUNDY;
Colour類型變量auto_colour只能取eRED,…,eBURGUNDY六個值中的一個,下面的語句將會出現編譯錯誤:
auto_colour = 4;
我們也可以在定義枚舉類型時,為枚舉成員指定初值,例如:
enum Colour { eRED=5, eBLUE, eYELLOW, Egreen=30,
Esilvergrey=40,eBURGUNDY };
這時,eBLUE=6、Eyellow=7、Eburgundy=41。
由上述幾種基本數據類型通過各種組合可以得到復合數據類型,這些數據類型在以后章節會有詳細講解。
如果一個變量只有幾種可能的值,就可以把它定義為枚舉類型。"枚舉",顧名思義,就是把這種類型數據可取的值一一列舉出來。
例如,可以定義一個表示日期的枚舉類型weekday:
enum weekday{sun,mon,tru,wed,thu,fri,sat};
這里enum是關鍵字,用于定義枚舉數據類型,weekday是枚舉類型的名字,枚舉元素用標識符表示。
接下來我們可以用weekday來定義變量,例如:
weekday today,nextday;
C++語言也允許在定義枚舉類型的同時定義枚舉變量,例如:
enum weekday{sun,mon,tru,wed,thu,fri,sat}today,nextday;
這樣,變量today和nextday就具有weekday類型,它們的取值只能是sun,mon,…,sta,例如可有:
today = sun;
nextday = mon;
if(today == sat)
nextday = sun //如果today是sat的話,那么nextday賦值為sun
C++編譯器對枚舉元素實際上是按整型常數處理。所以,就象前面所說的那樣,當遇到枚舉元素列表時,編譯程序就把其中第一個標識符賦0值,第二、三、…個標識符依次賦1、2、…。因此,當枚舉元素賦給枚舉變量時,該變量實際得到一個整數值。例如:
today = sun;
是將0賦給today,而不是將字符串"sun"賦給today。賦值后:
cout<<today;
語句的輸出結果是0。
我們也可以在枚舉類型定義時指定枚舉元素的值,例如:
enum weekday{sun = 7,mon = 1,tue,wed,thu,fri,sat};
這時sun的值是7,mon的值是1,而tue以后各元素的值,從mon的值開始,每次遞增1,即tue的值為2,wed的值為3,…。如果不寫mon = 1,則mon的值為8,tue的值為9,依此類推。
由于枚舉元素是常量,所以我們在程序中不能對它們進行賦值,如"sun = 0;mon = 1;"將產生錯誤。
既然枚舉元素就是整型值,那么它有什么存在的必要呢?至少有兩個原因:一個是用標識符表示數值增加了程序的可讀性,例如:
if(today == sat)
next = sun
就比
if(today == 6)
nextday = 0;
清楚多了;另一個重要的原因是:它限制了變量取值的范圍,如現在today只能取sun~sat中的值。
注意:enum在 C++和C中使用的不同。下面的C語言語句定義了名為day的變量:
enum Days { Monday, Tuesday, Wednesday, Thursday, Friday };
enum Days day;
在C++中,定義為:
enum Days { Monday, Tuesday, Wednesday, Thursday, Friday };
Days day;
C++中定義了枚舉類型數據后,程序可以把它當作一種類型使用,不需在類型名Days前加enum關鍵字。
第七節 輸入與輸出
C/C++語言本身并不帶輸入和輸出(即I/O)功能,而是提供了輸入輸出庫,也稱為I/O庫。通過I/O庫,我們可以完成輸入和輸出的操作。大多數C程序使用一種稱為stdio(標準I/O)的I/O庫,該庫也能夠在C++中使用。但是,在C++程序中,一種稱為iostream(I/O 流庫)的I/O庫用得更多。
在C++中,I/O使用了流的概念-字符(或字節)流。每一個I/O 設備傳送和接收一系列的字節,稱之為流。輸入操作可以看成是字節從一個設備流入內存,而輸出操作可以看成是字節從內存流出到一個設備。流是輸入輸出設備的另一個名字-一個文件、屏幕、鍵盤等。要使用C++標準的I/O流庫的功能,必須包括兩個頭文件:
#include<iostream.h>
#include<iomanip.h>
iostream.h文件提供基本的輸入輸出功能,iomanip.h 文件提供格式化的功能。通過包含iostream流庫,內存中就創建了一些用于處理輸入和輸出操作的對象。標準的輸出流(通常是屏幕)稱為cout,標準的輸入流(通常是鍵盤)稱為cin。
輸出變量d的值到標準輸出設備的語法形式如下:
cout << d;
注意:(<<)是雙小于號,不是左移操作符,它是一種輸出操作符,指出程序哪個流發送數據。
本語句表示傳送d的值到標準的輸出設備(由cout表示)。理解這個語句的一種方法是調用了函數operator<<,d是函數參數(關于函數調用,在第五章學習)。明確地說,為了輸出d的值到cout,可以使用語句:
cout.operator<<(d);
由于"cout.operator<<(d);"寫起來繁瑣,我們更喜歡把它寫成"cout << d;"。
對于C語言的程序中,使用的是stdio(標準I/O)庫,在這個庫中不僅定義了面向控制臺(顯示器和鍵盤)的輸入輸出,還分別定義了文件輸入輸出函數和面向內存的輸入輸出函數。在C++程序中,我們最常使用的是iostream(I/O 流庫),它是基于面向對象的,可以實現stdio庫的所有功能,通過它統一了標準I/O、文件和存儲塊的函數接口,使得對所有設備的操作看上去都一樣,隱藏了內部實現。與標準C輸入輸出庫的各種各樣的函數相比,輸入輸出流更容易、更安全、更有效。為了保證兼容性,I/O流類和C標準輸入輸出函數庫是可以共同使用的。
使用stdio庫,需要在程序中包含stdio.h頭文件,若使用iostream庫,需要包含iostream.h頭文件,如果要帶參數的格式化輸入輸出,還需要包含iomanip.h頭文件。
使用stdio庫的標準輸入輸出,要使用scanf和printf函數,scanf函數是從標準輸入(鍵盤)設備讀入,printf是向標準輸出設備(顯示器)輸出。
iostream庫在iostream.h中預定義了四個全局的流對象:cout、cerr、clog和cin,用于標準輸出和輸入,cout和cin在程序設計中會經常用到。cout流對象控制向控制臺(顯示器)的標準輸出,cin控制從控制臺(鍵盤)輸入。
本章小結
本章講述了C++語言的基本知識。
◇ 在C++語言中,語句、變量、函數、預處理指令、輸入和輸出等,是重要的概念,應該在編程實踐中逐漸掌握這些概念和它們的應用。
◇ 標識符是用來標識變量、函數、數據類型等的字符序列。C++中的標符可以由大寫字母、小寫字母、下劃線(_)和數字0~9組成,但必須是以大寫字母、小寫字母或下劃線(_)開頭。C++語言中預定義了一些標識符,稱之為關鍵字,它們不能被再定義。
◇ 布爾型、字符型、整型、浮點型和空類型是基本數據類型。指針、數組、引用、結構和類可以通過基本數據類型進行構造,稱之為復合數據類型。
◇ 變量就是機器一個內存位置的符號名,在該內存位置可以保存數據,并可通過符號名進行訪問。為了提高程序的可讀性,給變量命名時,應該注意使用有意義的名字。變量第一次賦值稱之為初始化,變量在使用之前應當先聲明。
◇ 常量是在程序運行過程中,其值不能改變的量。
◇ C++語言本身沒有輸入輸出功能,而是通過輸入輸出庫完成I/O操作。C程序使用的stdio(標準I/O)I/O庫也能夠在C++中使用;另外C++語言還提供了一種稱之為iostream(I/O 流庫)的I/O庫。
課后習題
| 一、選擇題: |
總結
以上是生活随笔為你收集整理的屌丝c++语言程序设计第二章 c++语言基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息管家
- 下一篇: 国内工业软件排行榜、市场份额与主要玩家