第一章 : 開始
1.1 編寫一個簡單的C++程式
要點:每個函式有且只能擁有一個main函式,且main的預設返回是一個int型別。
函式定義:返回型別,函式名,形參列表,函式體
1.1.1編譯 執行程式
程式原始檔命名約定
無論使用命令列還是IDE(整合開發環境),都將程式碼存放在一個或多個檔案中,這些檔案就是原始碼。
編譯
在某個控制視窗中編譯程式(winsdows命令列和linux命令列)
1.2 初識輸入輸出
iostream庫:
istream:輸入流
ostream:輸出流
PS:一個流就是一個字元序列,是從IO裝置讀出或寫入IO裝置的。流(stream)表達的是,隨著時間的推移,字元是順序生成或消耗的。
標準輸入輸出
cin:標準輸入
cout:標準輸出
cerr和clog:標準錯誤
cout與cerr的區別:
1.cout:經過緩衝後輸出,預設情況下是顯示器。這是一個被緩衝的輸出,是標準輸出,並且可以重新定向
2.cerr不經過緩衝而直接輸出,一般用於迅速輸出出錯資訊,是標準錯誤,預設情況下被關聯到標準輸出流,但它不被緩衝,也就說錯誤訊息可以直接傳送到顯示器,而無需等到緩衝區或者新的換行符時,才被顯示。一般情況下不被重定向
PS:緩衝區
實際程式碼例子
#include<iostream>//標頭檔案,一般在main外部
using namespace std;//名稱空間(namespace),通過使作用域運算子(::),來使用std空間的cout和cin
int main()
{
int a,b;
cout<<"Hello world"<<endl;//endl是操作符,作用是將與裝置關聯的緩衝區中的內容刷到裝置中
cin>>a>>b;
cout<<"a*b="<<a*b;//多個語句能和成為一個語句
return 0;
}
向流中寫入寫出資料
"<<"(name:輸出運算子):左側的運算物件必須是ostream物件右側物件為需要列印的值。它會將右側的值給到ostream物件中。
">>"(name:輸入運算子):左側的運算物件必須是istream物件右側物件為需要輸入的值。它會將istream物件的值給到右側物件中。
WARNING
程式設計師在除錯時常常新增列印語句。這一類語句應該保證“一直”重新整理流。否則,如果程式崩潰,輸出還可能留在緩衝區中,從而導致關於程式崩潰位置的錯誤判斷。
1.3 註釋簡介
C++中的註釋的種類
1.當行註釋(//),以雙斜線開始,換行符結束,這種註釋可以包含任何文字內容和額外的資料雙斜線
2.界定符對註釋(/* */),可以包含除後界定符的任意內容註釋界定符不能巢狀
/*
*註釋對/* */不能巢狀
*不能巢狀四個字會被認為是原始碼,
*像剩餘程式一樣處理
*/
int main
{
return 0;
}
1.4 控制流
1.4.1 while語句
說明
while反覆執行一段程式碼,直到給定條件為假
執行過程是交替檢測condition和執行關聯語句statement,直到condition為假
while(condition)
statement
例項
從1~100的整數總和(複合賦值運算子)
#include<iostream>
using namespace std;
int main()
{
int sum=0;
int i=0;
while(i<=100)
{
sum+=i;//使用了複合賦值運算子
++i;//字首遞增運算子
}
cout<<sum;
return 0;
}
1.4.2 for語句
說明
for迴圈與while迴圈相比,將檢測變數 變數遞增等進行了簡化
for(init-statement;condition;expression)
principal
例項
從1~100的整數總和
#include<iostream>
using namespace std;
int main()
{
int sum=0;
for(int i=0;i<=100;i++)
sum+=i;
cout<<sum;
return 0;
}
1.4.3 讀取數量不定的輸入資料
當不知道需要對多少數進行操作是,可以使用istream物件作為條件配合迴圈
當istream物件作為條件時,其效果就是檢測流的狀態。如果流是有效的,即檢測成功。當遇到檔案檢測符,或者遇到無效輸出時,istream物件的狀態變為無效,處於無效狀態的istream的物件,條件判斷為假。
PS:檔案檢測符
1.Windows Ctrl+Z 後按Enter或Return
2.Unix and Mac OS X Ctrl+D
例項
計算輸入整數的和
#include<iostream>
using namespace std;
int main()
{
int sum=0;
int val=0;
while (cin>>val)
{
sum+=val;
}
cout<<sum;
return 0;
}
1.4.4 if語句
if語句用來支援條件執行
if(condition)
principal_1
else
principal_2
例項
統計輸入中每個值連續出現了了多少次
#include<iostream>
using namespace std;
int main()
{
int currval=0,val=0;
if(cin>>currval)//讀取第一個數
{
int cnt=1;//儲存當前值的個數
while (cin>>val)//讀取剩餘的數
{
if(currval==val)
cnt++;
else
{
cout<<currval<<" occurs"<<cnt<<" times"<<endl;
currval=val;//記住新值
cnt=1;//重置計數器
}
}
cout<<currval<<" occurs"<<cnt<<" times"<<endl;//列印最後一個值的個數
}
return 0;
}
輸入:
42 42 42 42 42 55 62 100 100 100
輸出:
42 occurs5 times
55 occurs1 times
62 occurs1 times
100 occurs3 times
PS:運算子
1.5 類簡介
1.5.1 類
定義
在C++中,我們通過定義一個類(class)來定義自己的資料結構。
一個類定義了一個型別,以及與其關聯的一組操作。
類機制是C++最重要的特性之一,C++的最初的一個設計焦點就是能定義使用上像內建型別一樣自然的類型別(class type)
使用類時需要了解的事情:
1.類名是什麼?
2.它是在哪裡定義的?
3.它支援什麼操作?
關鍵概念:類定義了行為
類的創作者在創造類時定義了類的物件能進行的所有操作,使用一個類建立了一個物件時,這個對像能進行的行為就已經確定了。
例項
Sales_items類
假設已經存在了一個Sales_items類,存放在Sales_items.h的標頭檔案中
讀寫Sales_items
#include<iostream>
#include"Sales_item.h"//Sales_item類的相關操作都存放在這
using namespace std;
int main()
{
Sales_items book;
cin>>book;//進行了運算子過載(後面的部落格有詳細講解)
//讀入了ISBN號 售出的冊數 銷售價格
cout<<book<<endl;
//寫入了ISBN號 售出的冊數 總銷售額 平均價格
return 0;
}
輸入:
0-201-70353-X 4 24.99
輸出:
0-201-70353-X 4 99.96 24.99
Sales_item 物件的加法
#include<iostream>
#include"Sales_item.h"
using namespace std;
int main()
{
Sales_items item1,item2;
cin>>item1>>item2;
cout<<item1+item2<<endl;//進行了運算子過載,換句話說此+非彼+,和整數的加法不同
return 0;
}
輸入:
0-201-70353-X 3 20
0-201-70353-X 2 25
輸出:
0-201-70353-X 5 110 22
1.5.2 成員函式
什麼是成員函式(member function)?
成員函式是定義為類的一部分的函式(類包含有成員函式),有時也稱為方法(method)
例項
#include<iostream>
#include"Sales_item.h"
using namespace std;
int main()
{
Sales_item item1,item2;
cin>>item1>>item2;
//首先檢查item1和item2是否為同一本書
if(item1.isbn()==item2.isbn)
{
cout<<item1+item2<<endl;
return 0;//表示成功
}
cout<<"error";
return -1;//表示失敗
}
1.6 書店程式
我們需要從一個檔案中讀取銷售記錄,生成每本書的銷售報告,顯示售出冊數 總銷售額 平均售價。
假定書號相同的資料是聚集在一起的。
#include<iostream>
#include"Sales_item.h"
using namespace std;
int main()
{
Sales_item total;//儲存和的變數
//讀入第一條交易記錄,並確定有資料可以處理
if(cin>>total)
{
Sales_item trans;//儲存下一條記錄的變數
//讀入並處理剩餘交易記錄
while (cin>>trans)
{
//處理相同的書
if(total.isbn==trans.isbn)
total+=trans;//更新總銷售額
else
{
cout<<total<<endl;
total=trans;//total現在變成下一本書的銷售額
}
}
cout<<total<<endl;//列印最後一本書的銷售額
}
else
{
cout<<"No date?!"<<endl;//錯誤警告
return -1;
}
return 0;
}
特別鳴謝
xqy同學指導我使用了Editor.md,讓這個系列可以進行更新(邁出了第一步)。
hyf同學在排版和內容等方面提出了十分重要的意見。
注:這個系列會長期的更新下去,希望我寫的文章能對諸位有所幫助。