c++primer第一章
1.1編寫一個簡單的c++程式
int main()
{
return 0;
}
一個函式的定義包含四部分:返回型別(return type),函式名(function name),一個括號包圍的**形參列表(parameter list)**以及函式體(function個body)。
型別: 程式設計最基本的元素之一,一種型別不僅定義了資料元素的內容,還定義了這類資料上可以進行的運算。
1.2初始輸入輸出
-----------c++語言並未定義任何輸入輸出語句,取而代之,包含了一個全面的標準庫來提供IO機制。
-----------iostream庫包含了istream和ostream兩個基礎型別,分別表示輸入流和輸出流。一個流就是一個字元序列,是從IO裝置獨處或寫入IO裝置的。術語流
-----------標準庫定義了4個IO物件。標準輸入物件cin屬於istream流。標準輸出物件cout輸入ostream流。其他兩個ostream物件cerr和clog。通常用cerr來輸出警告和錯誤訊息,因此被稱為標準錯誤。而clog用來輸出程式執行時的一些錯誤。
#include<iostream> using namespace std; int main() { cout<<"Enter two numbers:"<<endl; int v1=0,v2=0; cin>>v1>>v2; cout<<"The sum of"<<v1<<"and"<<v2 <<"is"<<v1+v2<<endl; return 0; }
這個程式開始時會在使用者螢幕列印
Enter two numbers:
然後等待使用者輸入,如果使用者輸入
3 7
然後使用者鍵入一個回車,則程式產生如下輸出:
The sum of 3 and 7 is 10
向流輸入資料
main的函式體的第一條資料執行了一條表示式。在c++中,一個表示式產生一個計算結果,它有一個或多個運算物件和一個運算子組成。這條語句中的表示式使用了<<輸出運算子在標準輸出上列印訊息:
cout<<“Enter two numbers:”<<endl;
<< 運算接受兩個物件:左側的運算物件必須是一個ostream物件右側的物件是要列印的值。此運算子將給定的值寫到給定的ostream物件中。
cout<<“Enter two numbers:”;
cout<<endl;
第一個運算子給使用者列印了一條訊息。這個訊息是一個字串字面值常量
第二個運算子列印endl,這是一個被稱為操縱符的特殊值。寫入endl的效果是結束當前行,並將與裝置關聯的緩衝區中的內容刷到裝置中。緩衝重新整理操作可以保證到目前為止程式所產生的所有輸出都真正寫入輸出流中,而不是僅停留在記憶體中等待寫入流。
從流讀入資料
先定義兩個變數
int v1=0,v2=0;
我們將這兩個變數定義為int型,並初始化為0。初始化就是在建立變數的同事為它賦予一個值。
cin>>v1>>v2;
它讀入資料。輸入運算子>>與輸出運算子類似,它接受一個istream作為其左側運算物件,接受一個物件作為其右側運算物件。它從給定的istream讀入資料,並存入給此物件。
1.3註釋簡介
c++有兩種註釋,單行註釋//和界定符註釋/**/。
單行註釋以//開始以換行符結束。
界定符以/*開始,以後面的結束,中間可以包含包括換行符的任意內容。
-------註釋界定符可以放置於任何允許放置製表符,空格符或換行符的地方。
-------註釋界定符可以跨越程式中的多行。當跨越多行時最好能顯示指出其內部的程式行都是屬於多行註釋的一部分。我們採用的風格是,註釋被的每行都以一個星號開頭,從而指出整個範圍都是多行註釋的一部分。
#include<iostream>
using namespace std;
/*
*簡單主函式:
*讀取兩個數,求他們的和
*/
int main()
{
//提示使用者輸入兩個數
cout<<"Enter two numbers :"<<endl;
int v1=0,v2=0;//儲存我們輸入資料的變數
cin>>v1>>v2;//讀入輸入資料
cout<<"The sum of"<<v1<<"and"<<v2
<<"is"<<v1+v2<<endl;
return 0;
}
註釋界定符不能巢狀
/*
*註釋對/* */不能巢狀
*“不能巢狀”會被認為是原始碼
*像剩餘程式一樣處理
*/
int main()
{
return 0;
}
///*
//*單行註釋中的任何內容都會被忽略
//*包括巢狀的註釋對也會一樣被忽略
//*/
1.4控制流
-------------1.4.1while語句
while語句反覆執行一段程式碼,直到給定條件為假時停止。
#include<iostream>
using namespace std
int main()
{
int sum=0,val=1;
while(val<=10)//只要val的值小於10就會持續執行
{
sum+=val;//將sum+val賦給sum
++val;//將val加1
}
cout<<"Sum of 1 to 10 inclusive is"
<<sum<<endl;
return 0;
}
編譯並執行這個程式,它會打印出
Sum of 1 to 10 inclusive is 55;
while的語句形式是
while(condition)
statement
while語句執行的過程是交替地檢測條件condition和執行關聯的語句statement,直至condition為假時停止。所謂條件(condition)就是產生真或假的結果的表示式。只要condition為真,statement就會被執行。當執行完statement,會再此檢測condition。如果condition仍為真,statement再次被執行。while語句持續地交替檢測condition和執行statement,直至從內地同為假為止。
---------1.4.2 for語句
#include<iostream>
using namespace std
void main()
{
int sum=0;
//從1加到10;
for (int val=1;val<=10;++val)
sum+=val;
cout<<"Sum of 1 to 10 inclusive is"
<<sum<<endl;
}
for(int val=0;val<=10;val++)
每個for語句包含兩個部分: 迴圈頭和迴圈體。迴圈頭控制迴圈體的執行次數,它由三部分組成:一個初始化語句(init-statement),一個迴圈條件(condition),以及一個表示式(expression)。
本例子中初始化語句:int val=1;
迴圈條件:val<=10
表示式:++val
for語句的執行總流程:
1.建立變數val,將其初始化為1.
2.檢測val是否小於10.若檢測成功,執行for迴圈體。若失敗,退出迴圈繼續執行for迴圈體之後的第一條語句。
3.將val的值增加1。
4.重複第二步中的條件檢測,只要條件為真就繼續執行剩餘步驟。
--------1.4.3 讀取數量不不定的輸入資料
#include<iostream>
using namespace std;
void main()
{
int sum=0,value=0;
while(cin>>value)
sun+=value;
cout<<"Sum is:"<<sum<<endl;
}
如果我們輸入 3 4 5 6
則程式輸出 18
while的迴圈條件的求值就是執行表示式
cin>>value
當我們使用一個istream物件作為條件時,其效果是檢測流的狀態。如果流是有效的,即流為遇到錯誤,那麼檢測成功。當遇到檔案結束符或遇到一個無效輸入是(列如輸入的不是一個整數),istream物件的狀態會變為無效。處於無效狀態的istream物件會是條件變為假。
因此,我們的while迴圈會一直星星知道遇到檔案結束符(或輸入錯誤)。
在Windows系統中檔案結束符是敲 CTRL+Z。
在UNIX系統和Mac OSX系統中檔案結束符是CTRL+D。
---------1.4.4 if語句
#include<iostream>
using namespace std;
void main()
{
int currval=0,val=0;//currval是我們正在統計的數;我們將讀入的新值存入val
if(cin>>currval){//讀入第一個數,並確保資料可以處理
int cnt=1;//儲存當前正在處理的值的個數
while(cin>>val){//讀取剩餘的數
if(val==currval)//如果值相同
++cnt;//將cnt加1
else
{
cout<<currval<<"occurs"<<cnt<<"times"<<endl;
currval=val;
cnt=1;
}
}
cout<<currval<<"occurs"<<cnt<<"times"<<endl;//列印檔案中最後一個值的個數
}
如果我們輸入 42 42 42 42 42 55 55 62 100 100 100
則輸入應該是:
42 occurs 5 times
55 occurs 2 times
62 occurs 1 tmes
100 occurs 3 times
if(cin>>currval) {
/**/
}
保證輸入不為空。與while語句類似。if也對一個條件進行求值。第一條if語句的條件是讀取一個數值存入currval中。如果讀取成功,則條件為真,我們繼續執行條件之後的語句塊。該語句以左花括號開始,以return語句之前的右花括號結束。
if(val==vurrval)
++cnt;
else
{
cout<<currval<<"occurs"<<cnt<<"times"<<endl;
currval=val;
cnt=1;
}
這條語句使用了相等運算子來檢測val是否等於currval。如果是,我們執行緊跟在條件之後的語句。這條語句將從那天增加1,表明我們再次看到了currval。
如果條件為假,即val不等於currval。則執行else之後的語句。這條語句是一個由一條輸出語句和兩條賦值語句組成的語句塊。輸出語句列印我們剛剛統計完的值的出現次數。賦值語句將cnt重置未1,將currval充值未剛剛讀入的值val。
1.5 類簡介
在c++中我們通過定義一個**類(class)**來定義自己的資料結構。
class Sale_item
{
}
1.5.1Sale_item類
Sale_item類的作用是表示一本書的總銷售額,售出冊數和平均價格,我們現在不關心這些資料如何儲存,如何計算。為了使用一個類,我們不必關心它是如何實現的,只需知道類物件可以執行什麼操作。
每個類時機上都星藝了一個新的型別,其型別名就是類名。因此,我們的Sale_item類定義了一個名為Sale_item的型別。與內建型別一樣。我們可以定義類型別的變數。當我們寫下如下語句
Sale_item item;
是想表達item是一個Sale_item型別的物件。
讀寫Sale_item
#include<iostream>
using namespace std;
#include"Sale_item.h"
int main()
{
Sale_item book;
cin>>book;
cout<<book<<endl;
}
這裡先不說明類,只是把類這一資料型別提出來
1.5.2 初始成員函式
#include<iostream>
using namespace std;
#include"Sale_item.h"
int main()
{
Sale_item item1,iitem2;
cin>>item1>>item2;
if(item1.isbn()==item2.isbn())
{
cout<<item1+item2<<endl;
return 0;
}else
{
cerr<<"Date must refer to same ISBN"<<endl;
return -1;
}
}
什麼是成員函式?
這個if語句的檢測條件
item1.isbn()==item2.isbn()
呼叫名為isbn的成員函式。成員函式是定義為類的一部分函式,有時也被稱為方法。這裡不繼續深入解釋。