我的C++成長之路(-) 學習階段 -02 函數、模板、數組的操作

來源:互聯網
上載者:User

接著上一節的內容

數組:是若干相同類型的對象集合體,它具有一定的循序關聯性,在記憶體中佔有一組聯絡的記憶體位址。定義格式:資料類型 數組名[常量運算式];--常量運算式表示數組大小

int a[5];//a有5個元素的整型數組,不能整體輸入 cin>>a 或輸出 cout<<a

字元數組:用來存放字元量的數組

測試檔案Test.cpp,實現2個矩陣的乘法運算

#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{
/*
float x[5], sum = 0;// 輸入5個數求平均
cout<<"輸入5個數:";
for(int i=0; i<5; i++) cin >> x[i];
for(int i=0; i<5; i++) sum += x[i];
cout<<"平均值:" << sum/5 << endl;*/

//定義一個字元數組並輸出其內容
/*
char c[2][5] = {{'c', '+', '+'}, {'H', 'e', 'l', 'l', 'o'}} ;
for(int i=0; i<2; i++)
{
  for(int j=0; j<5; j++) cout<< c[i][j];
  cout<<endl;
}*/

 // 利用字元數組操作字串
/*

char c[100];
cin >> c;
cout << c;// 控制台輸入輸出字元
char str[10];
memset(str, 0x00, sizeof(str)-1);// 將數組中所有元素設為空白值
memset(&str[9], '\0', 1);// 最後一位設定為0,否則字串無法定位結束位置
cout << str << endl;// 輸出字串

*/

 /*
int m[3][4]={{1,2,3,4},{2,2,3,1},{5,4,2,3}}; //矩陣1,定義並初始化
int n[4][3]={{6,3,2},{2,8,1},{6,9,5},{2,4,6}}; //矩陣2,定義並初始化
int q[3][3]={{0}, {0}, {0}};// 結果矩陣
for(int i=0; i<3; i++)
  for(int j=0; j<3; j++)
   for(int k=0; k<4; k++)
    q[i][j] += m[i][k] * n[k][j];// 將對應的行和列相應的元素相乘並累加
   for(int i=0; i<3; i++)
   {
    for(int j=0; j<3; j++)
     cout<<q[i][j]<<" ";// 輸出結果矩陣
    cout<<endl;//換行
   }
*/

 return 0;
}
函數:C++的模組分為函數(function)和類(class).

本章主要理解函數的概念、使用、參數傳遞機制、範圍規則、內嵌函式、函數的嵌套和遞迴的使用。掌握函數模板的編寫方法

定義格式

傳回型別 函數名(形參)

{

    ....//語句序列

    return 傳回型別的值;

}

函數原型:和變數的使用一樣,函數需要先聲明後使用,由函數的傳回型別、函數名和形參列表組成

文法格式:類型標識符 函數名(形參列表);//注意函數原型是一個語句要以分號結束

形參列表是一組由逗號分隔的參數類型和參數名稱組成,在函式宣告的時候,參數名可以被省略,但是在函數定義的時候,通常形參必須命名才能使用,形參列表可以為空白,但不能省略,在沒有任何參數的時候可以用空參數表或關鍵字void。

函數的調用:除main()函數外,任一函數都不能單獨的構成一個完整的程式,任一函數的調用都必須由main()函數直接或間接的去完成,可以使用函數名和一組逗號分隔開的實參來進行調用,調用的結果就是該函數傳回值的類型,調用格式:函數名(實參列表)

 函數名中的參數是形參,main函數調用時,傳遞進來的是實參。函數參數的傳遞方式:值傳遞和應用方式傳遞

大多數下需要給main()函數傳遞實參,如:dos下 display 1.map命令 1.map就作為實參傳遞。當無法列舉函數所有形參的類型和數目是使用省略符號,編譯器會暫停類型檢測

類型標識符 函數名(...) 或 類型標識符 函數名(形參1,...)  可見只有調用函數時,形參才會被分配記憶體空間,調用結束後釋放

範圍:函數和類之外定義的變數具有全域的範圍,稱為全域變數。C++函數體一般包含在{}中即語句塊,形參也是局部變數。變數的生命週期從定義時開始,到退出範圍是銷毀。局部變數只能在局部範圍中使用,main()函數中的變數也是局部變數,只在主函數中有效,不能被其他函數使用。同樣主函數也不可以使用其他函數的局部變數,在相同的範圍中,變數不可以同名。在不同的範圍中,可以使用相同的變數名,它們使用不同的記憶體。

函數的引入可以實現代碼的共用、減少程式的代碼量,但是需要時間和空間的開銷.

內嵌函式:可以減少這方面的開銷

函數模板:是指建立一個通用的函數,其函數原型和形參類型不具體指定,而用一個虛擬類型代替。

文法:template <typename T>// T為虛擬類型名

           template <class T>// template <class T1, typename T2>

寫了這麼多了,其實我也不想寫,但是為了加深理解,而不只是會寫代碼,就硬著頭皮寫了,對知識的掌握會有好處的。下面讓我們看個例子。

添加一個標頭檔testFunction.h 編寫幾個簡單的函數

#include <iostream>

using namespace std;
/*pragma once*/
int lcm(int, int);// 聲明計算最小公倍數的函數
int gcd(int, int);// 聲明計算最大公約數的函數
int countSum(int a, int b);// 聲明求和函數

int gcd (int m,int n) //計算最大公約數
{
 if (m > n) swap(m,n);
 while(n > 0)
 {
  int r = m % n;
  m = n;
  n = r;
 }
 return m;
}

int lcm (int m,int n)//計算最小公倍數
{
 return (m*n / gcd(m,n));
}

int countSum(int a, int b)
{
 return a + b;
}

測試檔案Test.cpp:

#include <iostream>

using namespace std;

#include "testFunction.h"

inline int sum(int a, int b);// 聲明內嵌函式
template <typename T>// 定義模板

T t_sum(T a, T b)// 返回T類型的函數
{
 return a + b;
}
int main(int argc, char* argv[])
{
 /*
 int m,n;
    cout << "請輸入兩個非負數: ";
    cin >> m >> n;
    cout << "gcd(" << m << "," << n << ") = " << gcd(m,n) <<endl;
    cout << "lcm(" << m << "," << n << ") = " << lcm(m,n) <<endl;
 cout << countSum(gcd(m, n), lcm(m, n))<<endl;
 */

 /*
 int a = 3, b = 2; 
 cout << "a = " << a << ", b = " << b <<endl;
 cout << "交換後: " << endl; 
 swap(a, b);// 形參的改變不會影響到實參的,如果此次自訂個交換函數是不起作用的
 cout << "a = " << a << ", b = " << b <<endl;
 */
 //cout << sum(2, 3) <<endl;// 內嵌函式
    int v1=10,v2=20;
 float v3=2.5,v4=4.6;
 cout<<"v1+v2="<<t_sum(v1,v2)<<endl; //調用模板函數,int型參數
 cout<<"v3+v4="<<t_sum(v3,v4)<<endl; //調用模板函數,float型參數
 
 return 0;
}

inline int sum(int a, int b)
{
 return a + b;
}

 案例:控制台輸入隨機數字作為數字大小,使用指標的方式賦值、並輸出

#include <iostream>
#include <time.h>
using namespace std;
int main(int argc, char *argv[])
{
 long nCnt(0);
 cout<<"輸入數值個數";
 cin>>nCnt;
 srand((unsigned)time(NULL));// 設定隨機產生種子
 int *pnArray = new int[nCnt];
 if(pnArray == NULL) exit(1);
 memset((void *)pnArray, 0x00, sizeof(int)*nCnt);
 for(long loop(0); loop<nCnt; loop++)
 {
  pnArray[loop] = rand();// 系統自動產生隨機數
  //cout<<*(pnArray+loop)<<endl;// 輸出元素
  cout<<pnArray[loop]<<endl;// 輸出元素
 }
 delete [] pnArray;
 pnArray = NULL;
 return 0;
}

案例:

#include <iostream>
#include <time.h>
using namespace std;
// 示範C風格數組的操作
int main(int argc, char *argv [])
{
 long *plArray = NULL;
 plArray = (long *)malloc(sizeof(long)*10);// 開闢動態數組空間
 srand((unsigned)time(NULL));// 設定產生隨機隨種子
 for(int nCnt(0); nCnt<10; nCnt++)
 {
  plArray[nCnt] = (long)rand();
  cout<<*(plArray + nCnt)<<endl;// 輸出隨機隨元素
 }
 free(plArray);// 釋放記憶體
 plArray = NULL;
 return 0;
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.