• /  128
  • 下載費用: 9.90積分  

C++語言程序設計 清華大學鄭莉 六.ppt

'C++語言程序設計 清華大學鄭莉 六.ppt'
第六章 數組 指針與字符串清華大學 鄭 莉C++語言程序設計*本章主要內容數組指針動態存儲分配指針與數組指針與函數vector的基本用法字符串深度探索*數組的概念數組是具有一定順序關系的若干相同類型變量的集合體,組成數組的變量稱為該數組的元素。數組屬于構造類型。 數 組*一維數組的聲明與引用一維數組的聲明類型說明符 數組名[ 常量表達式 ]; 例如:int a[10]; 表示 a 為整型數組,有10個元素:a[0]...a[9]引用必須先聲明,后使用。只能逐個引用數組元素,而不能一次引用整個數組 例如:a[0]=a[5]+a[7]-a[2*3]數組名的構成方法與一般變量名相同。 數 組*例6. 1一維數組的聲明與引用#include using namespace std;int main() { int a[10], b[10]; for(int i = 0; i < 10; i++) { a[i] = i * 2 - 1; b[10 - i - 1] = a[i]; } for(int i = 0; i < 10; i++) { cout << "a[" << i << "] = " << a[i] << " "; cout << "b[" << I << "] = " << b[i] << endl; } return 0;} 數 組*一維數組的存儲順序數組元素在內存中順次存放,它們的地址是連續的。例如:具有10個元素的數組 a,在內存中的存放次序如下:數組名字是數組首元素的內存地址。數組名是一個常量,不能被賦值。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a 數 組*一維數組的初始化可以在定義數組的同時賦給初值:在聲明數組時對數組元素賦以初值。 例如:static int a[10]={0,1,2,3,4,5,6,7,8,9};可以只給一部分元素賦初值。 例如:static int a[10]={0,1,2,3,4};在對全部數組元素賦初值時,可以不指定數組長度。 例如:static int a[]={1,2,3,4,5} 數 組*#include using namespace std;int main() { int f[20] = {1,1};//初始化第0、1個數 for (int i = 2; i < 20; i++) //求第2~19個數 f[i] = f[i - 2] + f[i - 1]; for (i=0;i<20;i++) { //輸出,每行5個數 if (i % 5 == 0) cout << endl; cout.width(12); //設置輸出寬度為12 cout << f[i]; } return 0;}例:用數組來處理求Fibonacci數列問題*例:用數組來處理求Fibonacci數列問題運行結果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765*一維數組應用舉例循環從鍵盤讀入若干組選擇題答案,計算并輸出每組答案的正確率,直到輸入ctrl+z為止。每組連續輸入5個答案,每個答案可以是'a'..'d'。 數 組#include using namespace std;int main() { const char KEY[ ] = {'a','c','b','a','d'}; const int NUM_QUES = 5; char c; int ques = 0, numCorrect = 0; cout << "Enter the " << NUM_QUES << " question tests:" << endl; while(cin.get(c)) { if(c != '\n') { if(c == key[ques]) { numCorrect++; cout << " "; } else cout<<"*"; ques++; } else { cout << " Score " << static_cast(numCorrect)/NUM_QUES*100<<"%"; ques = 0; numCorrect = 0; cout << endl; } } return 0;}*運行結果:acbba ** Score 60%acbad Score 100%abbda * ** Score 40%bdcba***** Score 0%**二維數組的聲明及引用數據類型 標識符[常量表達式1][常量表達式2] …;例: int a[5][3]; 表示a為整型二維數組,其中第一維有5個下標(0~4),第二維有3個下標(0~2),數組的元素個數為15,可以用于存放5行3列的整型數據表格。 數 組*存儲順序按行存放,上例中數組a的存儲順序為: 二維數組的聲明類型說明符 數組名[常量表達式][常量表達式]例如:float a[3][4];a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23a[0]——a00 a01 a02 a03a[1]——a10 a11 a12 a13 a[2]——a20 a21 a22 a23a可以理解為:引用例如:b[1][2]=a[2][3]/2下標不要越界二維數組的聲明及引用 數 組*將所有數據寫在一個{}內,按順序賦值例如:static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};分行給二維數組賦初值例如:static int a[3][4] ={{1,2,3,4},{5,6,7,8},{9,10,11,12}};可以對部分元素賦初值例如:static int a[3][4]={{1},{0,6},{0,0,11}};二維數組的初始化 數 組*數組作為函數參數數組元素作實參,與單個變量一樣。數組名作參數,形、實參數都應是數組名,類型要一樣,傳送的是數組首地址。對形參數組的改變會直接影響到實參數組。 數 組*例6-2 使用數組名作為函數參數主函數中初始化一個矩陣并將每個元素都輸出,然后調用子函數,分別計算每一行的元素之和,將和直接存放在每行的第一。省略部分。tline(cin, s2, ',');* 字符串例6.24 用getline輸入字符串*include #include using namespace std;int main() { for (int i = 0; i < 2; i++) { string city, state; getline(cin, city, ','); getline(cin, state); cout << "City:" << city << “ State:" << state << endl; } return 0;} 字符串Beijing,ChinaCity: Beijing State: ChinaSan Francisco,the United StatesCity: San Francisco State: the United States指針與引用的對應關系//使用指針常量void swap(int * const pa, int * const pb) { int temp = *pa; *pa = *pb; *pb = temp;}int main() { int a, b; …… swap(&a, &b); …… return 0;}//使用引用void swap(int &ra, int &rb) { int temp = ra; ra = rb; rb = temp;}int main() { int a, b; …… swap(a, b); …… return 0;}* 深度探索指針與引用的聯系引用在底層通過指針來實現一個引用變量,通過存儲被引用對象的地址,來標識它所引用的對象引用是對指針的包裝,比指針更高級指針是C語言就有的底層概念,使用起來很靈活,但用不好容易出錯引用隱藏了指針的“地址”概念,不能直接對地址操作,比指針更安全* 深度探索引用與指針的選擇什么時候用引用?如無需直接對地址進行操作,指針一般都可用引用代替用更多的引用代替指針,更簡潔、安全什么時候用指針?引用的功能沒有指針強大,有時不得不用指針:引用一經初始化,無法更改被引用對象,如有這種需求,必須用指針;沒有空引用,但有空指針,如果空指針有存在的必要,必須用指針;函數指針;用new動態創建的對象或數組,用指針存儲其地址最自然;函數調用時,以數組形式傳遞大量數據時,需要用指針作為參數。* 深度探索指針的地址安全性問題地址安全性問題通過指針,訪問了不該訪問的地址,就會出問題典型問題:數組下標越界問題的嚴重性:有時會在不知不覺中產生錯誤,錯誤源很難定位,因此程序調試起來很麻煩解決方案指針只有賦了初值才能使用(這一點普通變量也應遵循)指針的算術運算,一定要限制在通過指向數組中某個元素的指針,得到指向同一個數組中另一個元素的指針盡量使用封裝的數組(如vector),而不直接對指針進行操作* 深度探索指針的類型安全性問題(1)基本類型數據的轉換是基于內容的:例:int i = 2;float x = static_cast(i);目標類型不同的指針間的轉換,會使一種類型數據的二進制序列被當作另一種類型的數據:reinterpret_cast:可以將一種類型的指針轉換為另一種類型int i = 2;float *p = reinterpret_cast(&i);結論從一種具體類型指針轉換為另一種具體類型指針的reinterpret_cast很不安全,一般情況下不要用* 深度探索指針的類型安全性問題(2)void指針與具體類型指針的轉換:具體類型指針可以隱含地轉換為void指針:int i = 2;void *vp = &i;void指針轉換為具體類型指針需要用static_cast,例如:int *p = static_cast(vp);但這樣就出問題了:float *p2 = static_cast(vp);結論void指針也容易帶來不安全,盡量不用,在不得不用的時候,一定要在將void指針轉換為具體類型指針時,確保指針被轉換為它最初的類型。* 深度探索堆對象的管理堆對象必須用delete刪除避免“內存泄漏”原則很簡單,但在復雜的程序中,一個堆對象常常要被多個不同的類、模塊訪問,該在哪里刪除,常常引起混亂如何有條理地管理堆對象明確每個堆對象的歸屬最理想的情況:在一個類的成員函數中創建的堆對象,也在這個類的成員函數中刪除把對象的建立和刪除變成了一個類的局部問題如需在不同類之間轉移堆對象的歸屬,一定要在注釋中注明,作為類的對外接口約定例如在一個函數內創建堆對象并將其返回,則該對象應當由調用該函數的類負責刪除* 深度探索const_cast介紹const_cast的用法用于將常指針、常引用轉換為不帶“const”的相關類型例:void foo(const int *cp) { int *p = const_cast(cp); (*p)++;}這可以通過常指針修改指針發對象的值,但這是不安全的用法,因為破壞了接口中const的約定const_cast不是安全的轉換,但有時可以安全地使用* 深度探索const_cast的安全使用(1)對例6-18的改進例6-18通過下列函數訪問數組元素Point &element(int index);問題:由于不是常成員函數,無法使用常對象訪問數組元素解決方法:重載element函數:const Point &element(int index) const { assert(index >= 0 && index < size); return points[index];}新問題代碼的重復:這個element函數與原先的函數內容完全相同,兩份重復的代碼,不易維護* 深度探索const_cast的安全使用(2)新問題的解決修改原先的element函數:Point &element(int index) { return const_cast( static_cast(this) ->element(index));}執行過程:調用常成員函數element(),再將其返回結果中的const用const_cast去除將this用static_cast轉換為常指針,是安全的轉換該函數本身不是常成員函數,確保將最終的結果以普通引用形式返回是安全的思考:如果保留該函數,而修改常成員函數element,使常成員函數element調用該函數,是否合適?* 深度探索*小結與復習建議主要內容數組、指針、動態存儲分配、指針與數組、指針與函數、字符串達到的目標理解數組、指針的概念,掌握定義和使用方法,掌握動態存儲分配技術,會使用string類。實驗任務實驗六
關 鍵 詞:
c++ 語言 程序設計 清華大學
 天天文庫所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
關于本文
本文標題:C++語言程序設計 清華大學鄭莉 六.ppt
鏈接地址: http://www.476824.live/p-51617168.html
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服點擊這里,給天天文庫發消息,QQ:1290478887 - 聯系我們

本站為“文檔C2C交易模式”,即用戶上傳的文檔直接賣給(下載)用戶,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有【成交的100%(原創)】。本站是網絡服務平臺方,若您的權利被侵害,侵權客服QQ:1290478887 歡迎舉報。

[email protected] 2017-2027 http://www.476824.live 網站版權所有

粵ICP備19057495號 

收起
展開
球探网即时蓝球比分 有富策略 什么股票论坛好 安徽11选5玩法 极速快三346后面出什么 内蒙11选五遗漏数据 上海股票配资 广东省快乐十分一定牛 福建22选5技巧 腾讯分分彩分析软件 专业期货配资公司