Transcript Document

進階資料型態(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
6
524175
3
111
0
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;
or
strcpy(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
X
s
5
Y
5
t
10
10
指標

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
xptr
X
yptr
5
Y
10
指標

陣列變數在函數的參數傳遞:
指標

不同資料型態的指標
Linked list簡介
head
“rolls”
10
“ jam “
3
“tea”
2
End marker
感謝聆聽