close

第二章  開始學習C++

一.進入C++

通常一個c++程式,會包含下列內容

  • 註釋
  • 預處理器編譯指令#include
  • 函數頭: int main()
  • 編譯指令: using namespace
  • 函數體: 用{和}一起
  • 使用c++的cout輸出
  • 結束main()函數的return語句

 

 //範例程式


#include <iostream>
using namespace std;
int main(){
  cout<<"hello"<<endl;
return 0;
}


 

1.註釋

可以在開頭使用  //  或是 /*和*/之間

應使用註釋來說明程式碼,程式越複雜,註釋的價值越大。

不僅能幫助他人了解該程式碼,也助於自己更了解該程式的內容,特別是過一段時間沒有接觸該程式的時候

2.預處理器編譯指令#include

如果使用C++的輸入或輸出工具(cin和cout),請使用下列兩行程式碼

 

#include <iostream>
using namespace std;

 

iostream文件涉及到程式與外部世界之間的通信

io是指輸入和輸出

C++的輸入輸出使用到iostream文件中的多個定義

所以必須先#include編譯指令,使iostream文件的內容發送給編譯器

3.頭文件名

像iostream這種文件,叫做包含文件(include file)

由於他們被包含在其他文件中,所以也叫"頭文件"

C++編譯器有很多自帶的頭文件,他們都包含一組特定的工具

C語言的傳統是使用擴展名.h,例如<iostream.h>

而C++並沒有擴展名,使用的方法是──"名稱空間"

4.名稱空間

using namespace std;

 

這叫做using編譯指令

意義是會從"std"這個名稱空間中找尋函數

如果不使用"using namespace std; "的話

則每行用到iostream裡面函數的程式碼,前面都必須加上std::才能找到iostream裡面的函數

std::cout<<"hello";
std::cout<<std::endl;

 

舉例來說:

要在一個叫做"std"的箱子找東西,必須先宣告說從std這個箱子裡面找

不然可能別的箱子也會裝叫做cout的物品,系統就會無法分辨在哪個箱子裡

而這裡的箱子代表的就是所謂的"名稱空間"。

 

 

5.main()函數

 

 //去掉修飾後,程式的基本結構

int main()
{

  statements
  return 0;

}


 

一個程式,必須要知道何時開始,何時結束

而C++句法的要求main()函數的定義是以函數頭int main()開始

每條完整的指令都稱為"語句",所有語句皆以分號做為結束

最後一條語句 叫做返回語句 (return statement),它用來結束函數

6.使用cout進行C++輸出

 

cout的對象屬性包含一個運算符號"<<"

它可以將右側的訊息插入到輸出流中

 

控制符"endl"表示一個重要的概念:重起一行

和cout一樣,它也是在iostream裡面被定義的

 

 cout<<"內容"<<endl;

C++也提供了舊式的換行符號 \n 

在字符串結尾直接加上\n即可

 cout<<"內容\n";

 

 

二.C++語句

接下來以下面的程式為範例來作探討:

#include <iostream>
int main()
{
    using namespace std;
    int carrots;
    carrots = 25;
    cout << "I have";
    cout << carrots;
    cout << "carrots";
    cout << endl;
    carrots = carrots -1;
    cout << "Crunch, cuunch. Now I have " << carrots << "carrots" << endl;
    return 0;
}



 

1.聲明語句和變量

 int carrots;

 

這句話包含兩樣訊息: "內存" 和 "內存單元的名稱"。

這條語句指出  程序需要足夠的儲存空間來儲存一個整數(int)

然後再給儲存單元一個名稱。在這指出,此後程序將使用carrots 來標是儲存單元中的值。

 

2.賦值語句

賦值語句代表將值賦給儲存單元

例如下面這行,代表將25 賦給 carrots

 carrots = 25;

 

賦值是由右向左賦的,也可以連續賦值(C和C++的不尋常特性)

也可以對變量的值進行修改:

 carrots = carrots -1 ;

 

右邊的carrots -1 是個算術表達式

計算機將變量25減去1變成24,賦值運算符將這個新值儲存到變量carrots對應的內存單元中。

 

 

3.使用cin

 cin >> carrots;

 

從這條訊息得知,訊息從cin流向carrots

iostream文件將cin視為流入程序的字符流

輸入時,cin使用>>從輸入流中抽取字符

通常需要在右側提供一個變量,以接收抽取的訊息。

 

三.函數

C++的函數分為兩種:有返回值 沒有返回值

1.使用有返回值的函數

有返回值的函數將生成一個值,這個值可以賦給變量或在其他表達式中使用。

例如標準C/C++庫,包含一個名為sqrt()的函數,會返回一個平分根

假設要計算6.25的平方根,並賦值給x,可以在程式中使用以下的語句:

 x = sqrt(6.25);

 

表達式sqrt(6.25)將調用sqr()函數

括號中的值,是發送給函數的訊息,稱為"参數"

 

 

在使用函數之前,C++編譯器需要知道函數的參數類型,和返回值類型

如果缺少這些東西,編譯器將無法解釋返回值

C++提供這種訊息的方式是使用函數的原型語句

 

double sqrt(double);

 

第一個double意味著sqrt()將返回一個double值,第二個double意味著sqrt()需要一個double參數

在程式中使用sqrt()也必須提供原型,可以用兩種方法實現:

1.在原代碼文件中輸入函數原型

2.包含的頭文件(cmath)其中定義了原型

第二種方法更好,也就是使用

#include <cmath>

 對於C++庫中的每個函數,都有一個或多個頭文件提供了其原型

 

2.函數變體

有些函數需要多項訊息,這些函數使用多個參數,參數間用逗號分開。

例如、數學函數pow():接受兩個參數,返回值以第一個參數為底,第二個參數為指數的冪,原型如下:

//原型
double pow(double, double);


//以下計算5~8的次方
answer =  pow(5.0, 8.0);

 

在C++中調用函數必須包括括號,即使沒有參數。

沒有返回值的函數,在原型中使用void來指定返回類型,以指出函數沒有返回值。

3.用戶定義的函數

標準C庫提供了140多個預定義函數,用戶經常也要編寫自己的函數

以下將介紹過程範例;

#include <iostream>
void simon(int);
int main(){
  using namespace std;
  simon(3);
  cout<<"Pick an integer:";
  int count;
  cin>>count;
  simon(count);
  cout<<"Done!"<<endl;
  return 0;
  }
  void simon(int n) //定義simon函數
  {
    using namespace std;
    cout<<"Simon says touch your toes "<<n<<" times."<<endl;
  }

※main()函數兩次調用simon()函數,一次參數為3,另一次參數變量為count,

在這兩次調用之間,用戶輸入一整數來設置count的值

以下為結果:

1.JPG

 

1.函數格式

和main()的格式相同,先有一個函數頭,然後括號裡面包含函數體

type functionname(argumentlist)
{
    statements
}


 2.函數頭

 

viod simon(int n)

開頭使用viod表明該函數並沒有返回值,調用simon()不會生成可在main()中將其賦於變量的數字。

因此調用該函數的方式如下:

simon(3);

由於simon()沒有返回值,所以不能這樣使用它:

simple = simon(3);

括號中的int n表明,使用simon()函數時,應提供一個int參數

 

4.用戶定義的有返回值函數

再繼續深入,定義一個有返回值的函數

#include <iostream>
int stonetolb(int sts)
{
    return 14 * sts;
}

int main(){
    using namespace std;
    int stone;
    cout<<"Enter the weight in stone:";
    cin>>stone;
    int pounds = stonetolb(stone);
    cout<<stone<<"stone = ";
    cout<<pounds<<"pounds."<<endl;
    return 0;
}

※在main()中,程式使用cin來給整數變量stone提供一個值。

這個值被作為參數提供給stonetolb()函數,在該函數中,這個值被賦給變量sts,

最後stonetolb()函數用關鍵字return將14*sts返回給main()。

如果返回表達式的值很麻煩,可以用更複雜的方式定義函數,也更容易理解與修改:

int stonetolb(int sts)
{
    
    int pounds = 14 * sts;
    return pounds;
}

以下是執行的結果:

2.JPG

5.在多個函數程序中使用using編譯指令

如果每個函數都使用了cout,則都需要能夠訪問位於名稱空間的std中的sout定義

using namespace std;

可以將此編譯指令放在函數的外面,且位於兩個函數的前面,則多個函數都能夠訪問名稱空間std。

 

 

練習題:

編寫一個程序,其main調用一個用戶定義的函數,以光年值為參數,並返回天文單位的值

(1光年 = 63240天文單位)

#include <iostream>
using namespace std;
float ast(float a)
{
    float astt = a * 63240; 
    return astt; 
}
int main(){
    float number;
    cout<<"Enter the number of light years: ";
    cin>>number;
    cout<<number<<" light years = "<<ast(number)<<"astronomical units."<<endl;
    return 0; 
}

※因為用戶輸入的光年會有小數點,所以使用float來儲存。

以下為執行結果:

3.JPG

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 ivankao 的頭像
    ivankao

    IvanKao的部落格

    ivankao 發表在 痞客邦 留言(0) 人氣()