09. 函數(shù)2

函數(shù)和string對象

  1. 例子:聲明string對象數(shù)組,然后傳遞給一個函數(shù)

    #include <iostream>
    #include <string>
    using namespace std;
    const int SIZE = 5;
    
    void display(const string str1[],int n);  // 形參str1是一個指向string對象的指針
    int main()
    {
     string list1[SIZE];  // 一個數(shù)組,存儲5個字符串對象
     cout << "輸入"<< SIZE << "個你喜歡的球隊名字:\n";
     for (int i=0;i<SIZE;i++){
         cout << i+1 << ":";
         getline(cin,list1[i]); 
     }
     
     cout << "名單如下:\n";
     display(list1,SIZE);
     return 0;   
    }
    
    void display(const string str1[],int n){
     for (int i=0;i<n;i++){
         cout << i+1 << ":"<< str1[i] << endl;
     }
    }
    

函數(shù)和array對象

  1. 例子:c++模板類arry

    #include <iostream>
    #include <array>
    #include <string>
    
    using namespace std;
    const int SEASONS = 4; // 四季
    const array<std::string,SEASONS> names = {"Spring","Summber","Fall","Winter"};
    
    void fill(array<double,SEASONS> *pointer);
    
    void show(array<double,SEASONS> data);
    
    int main()
    {
     array<double,SEASONS> expenses;
     fill(&expenses); // 函數(shù)fill()用來修改expenses對象,需要將該對象的地址傳遞給函數(shù) 
     show(expenses); // 函數(shù)show()用來顯示expenses的內(nèi)容,可以按值傳遞 
     return 0;
    }
    
    void fill(array<double,SEASONS> *pointer)
    {
     
     for (int i=0;i<SEASONS;i++){
         cout << "輸入" << names[i] << "的開銷:";
         cin >> (*pointer)[i];
     }
    }
    
    void show(array<double,SEASONS> data){
     double total = 0.0;
     cout << "\n開銷\n";
     for (int i=0;i<SEASONS;i++){
         cout << names[i] << ":"<<data[i] << endl;
         total += data[i]; 
     } 
     cout << "總共的花銷是:" << total << endl;
    }
    
    • 函數(shù)原型中的參數(shù)和定義時的參數(shù)名字寫成一樣的

遞歸

  1. cpp函數(shù)可以調(diào)用自己,但是不允許main()函數(shù)調(diào)用自己

  2. 一個簡單的遞歸例子

    void recurs(argumentList)
    {
     statement1;
        if (test){
            recurs(arguments);
        }
        statement2;
    }
    
  3. 多次遞歸調(diào)用的遞歸函數(shù)

    #include <iostream>
    using namespace std;
    const int LENGTH = 66;
    const int DIVES = 6;
    
    void subdivide(char arr1[],int low,int high,int level);
     
     
     int main()
     {
         char ruler[LENGTH];
         int i;
         for (i = 1;i< LENGTH -2;i++){
             ruler[i] = ' ';
      }
      ruler[LENGTH-1] = '\0';
      int max = LENGTH -2;
      int min = 0;
      ruler[min] = ruler[max] = '|';
      cout << ruler << endl;
      for (i = 1;i<= DIVES;i++){
         subdivide(ruler,min,max,i);
         cout << ruler << endl;
         for (int j = 1;i< LENGTH-2;j++){
             ruler[j] = ' ';
          }
      }
      
         return 0;
     }
     void subdivide(char arr1[],int low,int high,int level){
         if (level == 0){
             return ;
      }
      int mid = (low + high) /2;
      arr1[mid] = '|';
      subdivide(arr1,low,mid,level -1);
      subdivide(arr1,mid,high,level-1);
         
     }
    
    • 函數(shù)subdivide()使用level變量來控制遞歸層數(shù),每次遞歸的時候level減去1,當(dāng)level變成0的時候停止遞歸
    • 函數(shù)subdivide()調(diào)用了自己兩次,左半邊一次,右半邊一次
    • 最初的中間點被用作一次調(diào)用之后的右端點和另一側(cè)的左端點
    • 調(diào)用的次數(shù)呈幾何級數(shù)增長,即2的次方

函數(shù)指針

  1. 假設(shè)要寫一個函數(shù),用來計算不同算法函數(shù)的運行時間,那么需要將不同算法函數(shù)的地址傳給這個函數(shù),即需要:

    1. 獲取函數(shù)的地址:只需要使用函數(shù)名

      process(abc); // 假設(shè)abc()是一個函數(shù),那么abc就是這個函數(shù)的地址
      
    2. 聲明一個函數(shù)指針:必須指定指針指向的函數(shù)類型,即指定函數(shù)的返回類型和函數(shù)的參數(shù)列表(類似于函數(shù)的原型)

      double func(int); // 函數(shù)func()的原型
      
      double (*pr)(int);  // (*pr)是一個函數(shù),pr是一個函數(shù)指針
      
      // 將相應(yīng)函數(shù)的地址賦給pr
      pr = func;  // 指針pr現(xiàn)在指向了函數(shù)func()
      
      • 上述代碼中,指針pr指向了一個函數(shù),這個函數(shù)有一個int類型的返回值并且返回了double類型
      • 加括號是用來保證正確的運算符優(yōu)先級,比如:
        • *pr(int):表示函數(shù)pr()是一個返回指針的函數(shù)
        • (*pr)(int):表示pr是一個指向函數(shù)的指針
      • 在將指針指向某個函數(shù)的時候,被指向的函數(shù)參數(shù)列表,返回類型必須和指針的參數(shù)列表,返回類型相同,不然編譯器就拒絕
    3. 使用函數(shù)指針來調(diào)用函數(shù)

      double func(int); // 函數(shù)func()的原型
      
      double (*pr)(int);  // (*pr)是一個函數(shù),pr是一個函數(shù)指針
      
      // 方式1
      pr = func;  // pr執(zhí)行函數(shù)func()
      double x = func(4);  // 可以通過正常的方式來調(diào)用函數(shù)func()
      double y = (*pr)(5);  //  通過指針的方式調(diào)用函數(shù)func()
      
      // 方式2:直接像使用函數(shù)名那樣使用指針pr
      double x = pr(5)  // 通過指針的方式調(diào)用func()的另一種寫法
      

函數(shù)指針示例

  1. 例子:寫一個函數(shù),計算別的函數(shù)的運行時間

    #include <iostream>
    double funny(int);
    double echo(int);
    
    void times(int lines,double(*pr)(int)); 
    int main(){
     
     using namespace std;
     int code;
     cout << "輸入行數(shù):";
     cin >> code; 
     cout << "函數(shù)funny的運行時間是:";
     times(code,funny);
     cout << "函數(shù)echo的運行時間是:";
     times(code,echo);
     return 0;
    }
    
    double funny(int i){
     return 0.05*i;
    }
    
    double echo(int i){
     return 0.03*i + 0.005*i*i;
    }
    
    
    void times(int lines,double(*pr)(int)){
     using namespace std;
     cout << (*pr)(lines) << endl; 
     
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第七章 函數(shù)(模塊) 1. 關(guān)于函數(shù)返回值 在C++中,函數(shù)分為有返回值和無返回值兩種。函數(shù)可以返回除數(shù)組之外的任...
    Leon_Geo閱讀 445評論 0 0
  • 前言 最近發(fā)現(xiàn)要學(xué)習(xí)C++來開發(fā)NDK,不得不把基礎(chǔ)的東西記錄下來,否則學(xué)的太多會混淆,廢話不多說,開始記錄我的C...
    程序愛好者閱讀 471評論 0 1
  • 6.函數(shù) 典型的函數(shù)包含以下部分:返回類型、函數(shù)名字、0或多個形參(parameter)組成的列表以及函數(shù)體。 通...
    暮落晴空閱讀 259評論 0 0
  • 0.一些有用的概念 <0>: 自動對象:對于普通局部變量對應(yīng)的對象而言,當(dāng)函數(shù)的控制路徑經(jīng)過該變量定義語句時創(chuàng)建該...
    BrightHewei閱讀 286評論 0 1
  • 函數(shù) 函數(shù)的基礎(chǔ)知識 沒有返回值的函數(shù)稱為void函數(shù)void functionName(parameterLis...
    我在龍亭湖邊閱讀 171評論 0 0

友情鏈接更多精彩內(nèi)容