420 likes | 553 Views
進階資料型態 (Advanced data types). 國立台中二中 -- 劉洲溶. 有關新課綱. 新課綱 必修 資訊科技概論 (2-4) 選修 ( 資訊科學 ) 程式設計 (1-2) 進階程式設計 (2) 資訊科學與應用專題 (1-4). 一、程式設計 …. 進階資料型態. 陣列 (array) 資料錄、結構 (record 、 struct) 指標 (pointer) *Linked list 的組成. 進階資料型態 — 教學方式. 以投影片介紹陣列、結構、指標的含意及及程式設計方法 以 Dev- C++ 軟體編譯及執行範例程式
E N D
進階資料型態(Advanced data types) 國立台中二中--劉洲溶
有關新課綱 • 新課綱 • 必修 • 資訊科技概論(2-4) • 選修(資訊科學) • 程式設計(1-2) • 進階程式設計(2) • 資訊科學與應用專題(1-4)
進階資料型態 陣列(array) 資料錄、結構(record、struct) 指標(pointer) *Linked list 的組成
進階資料型態—教學方式 • 以投影片介紹陣列、結構、指標的含意及及程式設計方法 • 以Dev- C++軟體編譯及執行範例程式 • 學生上機練習範例程式及程式題目
參考網站 C語言考古題& C的解題-- 程式設計學習入門 (網址:http://using-c.blogspot.com/) 網站:星子ACM小窩 (網址:http://www.csie.nctu.edu.tw/~chchu/acm/online/) 網站:ACM Online Judge Guide (網址:http://axp1.csie.ncu.edu.tw/~rick/acmguide/) 網站:ACM problemset 題目中譯 (網址:http://bunny.idv.tw/~kcwu/acmpage/cacm/) 網站:網際網路全國大賽 (網址:http://contest.cc.ntu.edu.tw/npsc2007/) 網站:Olympiad in Informatics (網址:http://www.cs.nthu.edu.tw/~progcont/Olympia/index.htm) 網站:Lucky貓的ACM園地 (網址: http://luckycat.kshs.kh.edu.tw/) …
陣列(array) • 何謂陣列 • 陣列是一群具有相同資料型態的變數所共同組合而成的特殊資料結構,每個陣列擁有一個陣列名稱。 • 若要存取陣列中的元素(element),須以索引(index)來表示欲存取的陣列元素位於陣列中哪一個位置。 • 陣列大致分為一維陣列、二維陣列及多維陣列。
陣列 • 一維陣列的宣告及設定一維陣列元素資料值的語法介紹—以c++為例,或… • 宣告陣列的語法 • 設定陣列初始值的語法 • 陣列與迴圈 • 記憶體配置的狀況(連續記憶體位置) • 以記憶體觀點來看陣列 • 提醒同學:C、C++陣列的索引值是由0或1開始編號
陣列 • 為什麼用要陣列 • For example:若欲寫一程式,模擬投擲一個骰子的情形,並欲將每個點數出現的次數記錄下來。 • 程式一:不使用陣列… • if (dieValue == 1) { • count1++; • } • else if (dieValue == 2) { • count2++; • } • else if (dieValue == 3){ • count3++; • }
陣列 • else if (dieValue == 4) { • count4++; • } • else if (dieValue == 5) { • count5++; • } • else { count6++; }
陣列 • 程式二:如果使用陣列count[ ] • count[dieValue]++;
陣列 • 類似程式練習題 • 寫一個程式,以亂數隨機產生100個0—99的整數,並以每10的數字為一級距(0-9、10-19…、90-99),統計每一級距的數字各有幾個。 (迴圈處理陣列的技巧)
陣列 • 一維陣列程式範例一 • 寫一個程式,使用一維陣列來儲存1號至10號共10位學生的程式設計作業的分數,然後從10個分數中找出最高及最低的程式設計分數,並在畫面上顯現最高分數及最低分數。(迴圈處理陣列的技巧)
陣列 • 一維陣列程式範例二 • Q591:Box of Bricks • 3歲的小明喜歡玩他的方塊積木,他總是把方塊疊在一起形成高度不一的方塊堆。然後他說:這是一面牆。5歲的姊姊小美聽到了就跟小明說:真正的牆高度應該要一樣才行。小明聽了覺得有道理於是決定要搬動一些方塊使所有方塊堆的高度一樣。如下圖。由於小明是個懶惰的小孩,他想要搬動最小數目的方塊以達成這個目的,你能幫助他嗎?
陣列 • Input 輸入包含好幾組資料,每組資料有2行,第一行有一個數字n,代表有幾堆方塊。第二行有n個數字分別代表這n堆方塊的高度hi。你可以假設1<=n<=50 1<=hi<=100 方塊的總數一定可以整除堆數n,也就是說一定可以使所有的方塊堆同樣高度。如果輸入的n=0,代表輸入結束。 • Output 對每一組輸入資料,首先輸出一行這是第幾組測試資料,下一行為“The minimum number of moves is k.” k在這裡就是需搬動方塊最小的數目以使所有的方塊堆同一高度。每組測試資料後亦請空一行。
陣列 Sample Iutput 65 2 4 1 7 531 1 10 Sample Output Set #1 The minimum number of moves is 5. Set #2 The minimum number of moves is 0.
陣列 while(1) { sum=0; count=0; set++; cin >> n; if (n==0) break;
陣列 for(i=0;i<n;i++) { cin >> h[i]; sum=sum+h[i]; } ave=sum/n; for(i=0;i<n;i++) { if (h[i]<ave) count=count+(ave-h[i]); } } // while
陣列 • 給學生的程式作業實作練習 • 大數運算:寫一程式,可讓使用者輸入兩個300位數的正整數,並計算2者相加的結果輸出。 • (字元陣列的處理)
陣列 • 二維陣列在記憶體中的實際配置情況 • 給int A[0][0]的記憶體位置,求A[3][15]的位置 • 二維陣列與巢狀迴圈 • 二維陣列程式範例說明 • 請設計一個程式,可以計算兩個3*3矩陣相加 。
結構(struct) 說明何謂結構 結構與關連式資料庫中的記錄之關係 說明為什麼需要使用結構
結構(struct) 說明使用結構之資料範例 例:一個人的身高、體重、年齡… 例:一本書的書名、作者、頁數、價錢…
結構 • 說明定義結構 • 宣告結構變數 • 結構變數資料成員初始值設定 • 存取結構變數資料成員資料的語法 • variable.field
結構 • 定義結構 • general format: struct tag_name { data type member1; data type member2; … … }
結構 • 例: struct lib_books { char title[20]; char author[15]; int pages; float price; }; struct lib_books book1, book2, book3;
結構 • 例: cin >> book1.title; cin >> book1.pages; orstrcpy(book1.title,”basic”); strcpy(book1.author,”Balagurusamy”); book1.pages=250; book1.price=28.50;
結構 • 程式範例課堂練習 • 請設計一個程式,自行定義一個結構,結構名稱為student,程式需滿足下列敘述 • 使用者自行定義一個結構student,結構student內包含5種資料成員,依序為長整數stu_id、字元陣列stu_name[10]、整數變數chinese、整數變數eng、整數變數math。此結構student可以用於儲存學生的學號、姓名及學生的國文、英文、數學成績。 • 宣告一個結構變數stu。 • 以鍵盤輸入設定結構變數初始值,分別設定資料成員stu_id初始值為9810023、資料成員stu_name[10]的初始值為 “Mary”、 資料成員chinese初始值為20、資料成員eng初始值為60、資料成員math初始值為70。
結構 • 傳遞結構參數到函數 • 結構陣列的使用
結構 • 程式作業上機實作 • 以結構陣列的方式處理資料:寫一程式可讓使用者分別輸入5位同學的學號、姓名、國文、英文、數學3科成績。計算每位同學的三科總分計算,並和前述資料一起以結構陣列的方式將每位同學的資料一起儲存起來。
指標(pointer) 如何存取變數的記憶體位置(in C and C++ &) 說明何謂指標變數(pointer) 影片1 影片2 影片3
指標 • 陣列與指標的關係: • 陣列名稱可以代表此陣列在記憶體中的起始位置。 • int A [6]={1,2,3,4,5,6} ; //宣告一維陣列A[6] • int *ptr ; //宣告指向整數的指標變數ptr • ptr = A ; //A代表陣列A在記憶體的起始位置,將陣列的起始位置存在ptr中 • cout << a[3]; • cout << *(ptr+3);
指標 • 常犯的錯誤 • int* ptr; • *ptr=100; • 不可預期的結果 • int * ptr=new int; • *ptr=100;
指標 • Call by value • int main() • { • int s = 5,t = 10; • cout <<"Before swap"<<" s="<<s<< " t="<<t << endl; • swap(s, t); • cout <<"After swap"<<" s="<<s<< " t="<<t; • getch(); • return EXIT_SUCCESS; • } • /* Incorrectly exchanges a pair of values in caller */ • void swap(int x, int y) • { • int temp; • temp = x; • x = y; • y = temp; • }
指標 Call by value swap main 5 5 10 10 X s Y t
指標 • Call by reference • int main() • { • int s = 5,t = 10; • cout <<"Before swap"<<" s="<<s<< " t="<<t << endl; • swap(&s, &t); • cout <<"After swap"<<" s="<<s<< " t="<<t; • getch(); • return EXIT_SUCCESS; • } • /* Correctly exchanges a pair of values in caller */ • void swap(int *xptr, int *yptr) • { • int temp; • temp = *xptr; • *xptr = *yptr; • *yptr = temp; • }
指標 • Call by reference swap main 5 xptr 10 X yptr Y
指標 • 陣列變數在函數的參數傳遞:
指標 不同資料型態的指標
Linked list簡介 head