Upload
dalia
View
49
Download
0
Tags:
Embed Size (px)
DESCRIPTION
2010 summer vacation. Marshall, CEITL. INDEX. 2010 summer. Struct Dynamic memory allocation Class Constructor, destructor template. STRUCT. 2010 summer. Basic data types Syntax More… Constructor Destructor Homework. Basic data types – types and sizes. STRUCT. - PowerPoint PPT Presentation
Citation preview
2010 summer vacation
Marshall, CEITL
INDEX
• Struct• Dynamic memory allocation• Class• Constructor, destructor• template
2010 summer
STRUCT
• Basic data types• Syntax• More…– Constructor– Destructor
• Homework
2010 summer
Basic data types – types and sizesSTRUCT
Ref : http://msdn.microsoft.com/en-us/library/cc953fe1(v=VS.80).aspx
Category Type Size
Integral charunsigned charsigned char
1 byte
bool 1 byte
short / short intunsigned short
2 bytes
intunsigned int
4 bytes
long / long intunsigned long
4 bytes
float float 4 bytes
double 8 bytes
Basic data types – range of valuesSTRUCT
Ref : http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx
Type name Bytes Range of values
Int 4 –2,147,483,648 ~ 2,147,483,647
Unsigned int 4 0 ~ 4,294,967,295
Bool 1 false / true
Char 1 –128 ~ 127
Unsigned char 1 0 ~ 255
Short 2 –32,768 ~ 32,767
Unsigned short 2 0 ~ 65,535
Long 4 –2,147,483,648 ~ 2,147,483,647
Unsigned long 4 0 ~ 4,294,967,295
float 4 3.4E +/- 38 (7 digits)
double 8 1.7E +/- 308 (15 digits)
Exercise
• 有一長方體 a, 其長、寬、高為 (3,4,5) ;x,y,z 坐標分別為 (1,1,2), 沿 x, y, z 軸分別移動 (13,2,6) 後 , 中心坐標與其體積為 ?
• 有一長方體 b, 其長、寬、高為 (1,4,2) ;x,y,z 坐標分別為 (3,3,2), 沿 x, y, z 軸分別移動 (6,9,12) 後 , 中心坐標其體積為 ?
STRUCT
STRUCTsyntax
struct PERSON{bool gender;int age;double height, weight;
};
void main(){PERSON tim;tim.gender = 1;tim.age = 18;tim.height= 180.0;tim.weight = 80.5;
//PERSON tim = {1,18,180.0,80.5};}
結構體的名字成員
分號宣告變數
存取成員
定義結構體
程示主體
也可以…
Size of struct Size of
?
對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自然對界( natural alignment )條件分配空間。自然對界是指按結構體的成員中 size最大的成員對齊。 第一個成員的位址和整個結構的位址相同。
STRUCT
Ref : http://stenlyho.blogspot.com/2007/04/ccstruct.html
struct PERSON{bool gender;int age;double height, weight;
};
Constructor & destructor#include <iostream>#include <cstdlib>using namespace std;struct numbers{
int number1;double number2;numbers(){
number1 = 5;number2= 5.5;cout << "numbers is created! " << endl;
}~numbers(){
cout <<" 一個 number 的結構體被終結了 " << endl;}
};
void main(){cout << a.number1 << endl;cout << a.number2 << endl;
}
STRUCT
Ref :http://www.study-area.org/coobila/tutorial_422.html
建構函式
解構函式
Constructor & destructor (2)#include <iostream>#include <cstdlib>using namespace std;
struct numbers{int number1;double number2;numbers(){
number1 = 5;number2= 5.5;cout << "numbers is created! " << endl;
}~numbers(){
cout <<“A numbers be terminated!" << endl;}
};void sub(numbers a){
cout << a.number1 << endl;cout << a.number2 << endl;
}
STRUCT
Ref :http://www.study-area.org/coobila/tutorial_422.html
void main(){cout << "main starts" << endl;numbers a;a.number1=100;a.number2=999;sub(a);sub(a);sub(a);sub(a);sub(a);cout << "main ended " << endl;
}
What will be output ?
exercise
產生 10 個長方體 , 並以亂數產生其座標與長、寬、高。座標為小於 10 的整數,長寬高為小於 5 的浮點數。在結構體刪除時輸出”刪除了 (x,y,z)=(??,??,??),
(L,W,H)=(??,??,??) 的結構體”
Hint : rand() : 在 <cstdlib> 定義 , 隨機從 0~RAND_MAX 挑出一個整數。型別轉換 : (double)rand()/RAND_MAX
STRUCT
SummarySize and range of data typesSyntax of structConstructor & destructor• What is ….• When will be called …..
Lifecycle of variablesStatic variablesAlignmentrand()
STRUCT
Dynamic memory allocation
• Data & memory address• Pointer & address• Array• Dynamic memory allocation• Exercise
2010 summer
Data & memory addressvoid main(){
int i = 999;int* p = &i;
}
Dynamic memory allocation
Datatype … int …Name … i …Value … 999 …address 0048FC54 0048FC55 0048FC56 0048FC57 0048FC58 0048FC59
Datatype … Int* …Name … p …Value … 00 48 FC 55 …address 0031FD9F 0031FDA0 0031FDA1 0031FDA2 0031FDA3 0031FDA4
Pointer & addressvoid main(){
int i = 999;int* p = &i; //int *p 或 int* p 均可// int* p1,p2,p3;// int *p1,*p2,*p3;
cout << i <<","<<&i << endl;cout << p << "," << *p << "," << & p << endl;
}
Dynamic memory allocation
Datatype Int Int* Int* int
Name i &I P *p
Value 999 0031FDAC 0031FDAC 999
adress 0031FDAC - 0031FDA0 0031FDAC( &*p )
int999
i
Int*0031FDAC
p0031FDAC
0031FDA0
Array - syntax• 一維陣列 : int a[5] = {1,2,4,5,6};
– 取得可存放 5 個 int 的記憶體位置,並把起始位址存入 a– a[0] : 從 a 的位址走 0 步 , 取出一個 int– a[1] : 從 a 的位址走 1 步 , 取出一個 int
• 產生 10 個長方體 , 並以亂數產生其座標與長、寬、高。• 產生 200 個長方體 , 並以亂數產生其座標與長、寬、高。
Dynamic memory allocation
a[0] a[1] a[2] a[3] a[4]
Value … … … … …
address 0029FCF0 0029FCF4 0029FCF8 0029FCFC 0029FD00
Array - syntax• 一維陣列 : int a[5] = {1,2,3,4,5};
• 二維陣列 : int b[3][2]={{1,2},{3,4},{5,6}};
Dynamic memory allocation
A[0] A[1] A[2] A[3] A[4]
Value … … … … …
address 0029FCF0 0029FCF4 0029FCF8 0029FCFC 0029FD00
B[0][0] B[0][1] B[1][0] B[1][1] B[2][0] B[2][1]
Exercise• 以二維陣列與一維陣列計算下題結果 :
Dynamic memory allocation
????
22109
*
1154
6153
2231 • Hint :
int a[4][3];int b[3];int c[4];
Dynamic memory allocation• 3 types of variables– Static– Normal– Dynamic
Void main(){ static int a[5];
int b[10];int* c = new int[10];
delete [] c;c= new int[200];
}
Dynamic memory allocation
Without “delete”, What will happen?
int Int Int Int Int Int Int Int Int int
Int*add
c
add
1
2
3
2D dynamic matrix ( 3 x 2 )Dynamic memory allocation
Int int
Int int
Int int
Int* Int* Int*
Int**void main(){
int** a;a = new int*[3];for(int i = 0 ; I < 3 ; i++)a[i] = new int[2];
//a[0] = new int[2];//a[1] = new int[2];//a[2] = new int[2];
for(int i=0; i<3 ;i++){delete [] a[i];}delete [] a;
}
Char arrayDynamic memory allocation
char c1 = ‘b’ ; char c[20] = “Hello!!” ;
char s[3][100] = {“Hello”, “world” , “!!”}
C[0] C[1] C[2] C[3] C[4] C[5] C[6] C[7] ~ c[19]
H E L L O ! ! \0
Exercise
• 寫出一程式 , 讓使用者輸入整數 , 程式會將此整數因數分解 , 並存入兩整數陣列。分別存入 factor[] 與 power[].
Ex : 輸入 40 . 將存入 factor[] = {2,5}power [] = {3,1}即 40 = 23 * 51
Dynamic memory allocation
SummaryDynamic memory allocation
Class
• Object oriented programming (OOP)• Member & method• Private & public• Constructor
2010 summer
Exercise• 有一矩形 , 其長為 5, 寬為 3, 長邊方向與 Y 軸同向 , 另其與原點相距最遠的點為 corner1, 質量中心座標為 (3 , 7), 矩型對質量中心做
3 。 /sec 順時針轉動;且其中心對原點作 3 。 /sec 逆時針轉動 , 試求其第 0~180sec, corner1 的座標。
2010 summer
Y
X
corner1
Object oriented programming (OOP)2010 summer
• 以物件為主的思考方式,能更直觀的將現實中的目標在程式中模擬出來。一般的想法 物件導向的想法
找出矩形中心點的位置
公轉角速度* 時間 * 半徑
自轉角速度* 時間 * 半徑
定義矩形:中心位置公轉路徑自轉方式長寬輸入時間
Corner1的坐標Corner1 的位置
Corner1 相對於中心點的位置
Member & method2010 summer
class rectangular{private:
double xpos, ypos;double length, width;
public:rectangular(){
xpos = 0 ;ypos = 0 ;
}void setsize(double l, double w){
length = l;width = w;
}void move(double x , double y ){
xpos += x ;ypos += y;
}
void printcorner(){printf("corner1 : ( x , y ) =
( %f , %f)\n" , xpos + width/2 , ypos + length/2 );
printf("corner2 : ( x , y ) = ( %f , %f)\n" , xpos + width/2 , ypos - length/2 );
printf("corner3 : ( x , y ) = ( %f , %f)\n" , xpos - width/2 , ypos - length/2 );
printf("corner3 : ( x , y ) = ( %f , %f)\n" , xpos - width/2 , ypos + length/2 );}
}; 方法(method)
Private & public2010 summer
• Encapsulation( 封裝性 ) : 透過存取權限設定而可達到資料保護的效果,• 權限的分類:– public : 不論物件內外均可存取。– Protect : … skip…– Private : 物件內的成員才能存取。( C++ 預設)
• 通常,物件內的變數均會設成 private ,而方法設成 public ,要更改變數的內容均用呼叫 mehtod 來達成。
Constructor definition & calling 2010 summer
class rectangular{private:
double xpos,ypos;double length, width;
public:rectangular(){
a = 0;}rectangular(double x, double y){
xpos =x ;ypos = y;
}rectangular(double x, double y, double l ,double w){
xpos = x;ypos= y;length = l;width = w;
}void setlocation(double x, double y){……}void setsize(double l, double w){……}void printcorner(){…….}
};
void main(){rectangular rectA; rectA.printcorner();rectA.setlocation(5.55,2.22);rectA.setsize(3.00, 5.00);rectA.printcorner();
rectangular rectB(123.33 ,22.1);rectB.printcorner();rectB.setsize(5.66 , 3.22);rectB.printcorner();
rectangular rectC(1 ,2, 3, 4);rectC.printcorner();
}
Constructors?
Exercise• 一球由座標 (2000, 5000) 沿 x 軸方向發射,重力加速度 a(x,y) 為
(0, -9.8) ,請以 10 秒為單位 cout 出球的所在位置,至球落地為止。
• 有一矩形 , 其長為 5, 寬為 3, 長邊方向與 Y 軸同向,質量中心位置(x , y) = ( t , sin(x/360) ) , 矩型對質量中心做 3 。 /sec 順時針轉動;試求其第 0~180sec , 4 個角的座標。
2010 summer
Class (2)• Pointer of class
– Syntax “->”– Special word “this”– Array of class
• More about constructor– Default constructor– Copy constructor– Normal constructor
• Operator overloading– Copy assignment operator– Operator overloading
2010 summer
Pointer of class// 宣告類別的指標Class rect{Private:
double l,w,x,y;Public: rect(); void setsize(double l , double w); void setpos(double x, double y);
};
Void main(){rect *a = new rect; a->setsize(4,3);a->setpos(1,2);
}
class(2)
// 保留字 “ this” Class rect{Private:
double l,w,x,y;Public: rect(); void setsize(double l , double w){
this-> l = l;this->w = w;
} void setpos(double x, double y){
this-> x = x;this ->y = y;
}};
// 類別的陣列Class rect{Private:
double l,w,x,y;Public:
rect();setsize(double l , double w);setpos(double x, double y);
};
Void main(){rect r[3]; r[1].setsize(100,200);rect *a = new rect[3];a[0] .setsize(100,200);………
}
Exercise
• 請將因式分解改寫為物件導向的版本。– 宣告一類別 number ,其中成員包含• 待因式分解的值 value ,• 結構體 factor ,內有 value 及 power ,均為
int[40]• 所以 value = factor.value[0]^factor.power[0]
*…..• 建構函式 number(int input) ,使得 input 為待分解值 value, 並在建構函式中完成分解。
Class(2)
Constructor”s”
• Normal constructor• Default constructor• Copy constructor
Class(2)
Pan’s house Mar’s house
Copy constructorclass house{private:
unsigned short door[3], wall[3]; unsigned short roof[3], chimney[3];
public:house(){} // default constructor
house(unsigned short *a,unsigned short *b, unsigned short *c,unsigned short *d ){
for(int i =0 ; i< 3 ; i++){this->door[i] = a[i] ;this->wall[i] = b[i] ;this->roof[i] = c[i] ;this->chimney[i] = d[i] ;
}} //normal constructor
Class(2)
void main(){
unsigned short color1[3] ={255,255,255} ; unsigned short color2[3] ={255,255,0};unsigned short color3[3] ={0,255,0};unsigned short color4[3] ={255, 0 ,0};
house pan(color1 , color2, color3 ,color4);house mar(pan);
}
house(const house& other){for(int i =0 ; i< 3 ; i++){
this->door[i] = other.door[i] ;this->wall[i] = other.wall[i] ;this->roof[i] = other.roof[i] ;this->chimney[i] =
other.chimney[i] ;}
} //copy constructor};
Operator overloading
//copy values between variablesint a = 5; int b;b=a;
//copy values between classeshouse pan(color1,color2,color3,color4);house mar; mar = pan //?????????
Class(2)
可以執行 , 但會有問題 ,尤其是指標成員
初始化 /Initialize指定 /assign
Operator overloading//Copy assignment operator
class house(){…house& operator=(const house& other){this->~house();for(int i =0 ; i< 3 ; i++){this->door[i] = other.door[i] ;this->wall[i] = other.wall[i] ;this->roof[i] = other.roof[i] ;this->chimney[i] = other.chimney[i] ;}return *this;}…
};
Class(2)
常數變數 (const variable) :只能在初始化改變其值 ,之後即無法更改的變數
a=(b=c);
Operator overloading
//other operatorsclassX operator+(const classX& rightObj){
classX ans ;ans.data1 = data1+rightObj.data1;..............return ans;
}
Class(2)
Exercise完成下面類別 :
Class intarray{Private:
int* value; // 值的陣列int size; // 值陣列的大小
Public:intarray();intarray(int* input, int size); //intarray(const intarray& other);~intarray();
void setvalue(int * input, int size); // 設值的 functionintarray& operator=(const intarray& other); //copy assignment operatorintarray operator+(const intarray& other); // 將兩個陣列接起來
};
Class(2)
template
• What template can do• Function template• Class template• Non-Type Parameter
2010 summer
What template can do
int myAdd(int a, int b){return a+b;
}
template
double myAdd(double a, double b){return a+b;
}
Template <class T>T myAdd(T a,T b){
return a+b;}
unsigned short
float ????
Syntaxtemplate
template<class T>void functionX(…){
…T data;…
}
template<typename T>class Y{
…T data;…
};
template<class T1, class T2>class Z{
…T1 data;T2 data1;…
};
• Function of compiler• Key word “class”/”typename”• Can apply to either class or function• Multi type paraments are acceptable
Function templatetemplate
#include <iostream>
using namespace std;
int myAdd(int a ,int b){cout << "processing int myAdd" << endl;return a+b;
}
template<class T>T myAdd(T a, T b){
cout << "processing template myAdd" << endl;return a+b;
}
void main(){double a=1, b=2 ;
cout << myAdd(a,b) << endl; }
class templatetemplate
template<class T1, class T2>class myClass{private:
T1* a;T2* b;
public:myClass(){
a= new T1[0];b= new T2[0];cout << "template class in created ... " <<
endl;}
};
void main(){myClass<int,int> c1,c2;
}
template<class T1, class T2>class myClass;
原型宣告實現
呼叫
Non-Type Parametertemplate
#include <iostream>
using namespace std;
template<class T, int i>class Buffer{
T v[i];int size;
public://Buffer():size(i) {} Buffer(){ size = i; }void print(){
cout << "size=" << size <<"," << v << endl;}
};
void main(){Buffer<char , 127> cBuf ; cBuf.print();
Default values Parametertemplate
#include <iostream>
using namespace std;
template<class T = string , int i=127>class Buffer{
T v[i];int size;
public://Buffer():size(i) {} Buffer(){ size = i; }void print(){
cout << "size=" << size <<"," << v << endl;}
};
void main(){Buffer<char > cBuf ; cBuf.print();
Template specializationtemplate
template<class T>class List; // 當其定義無法適用於所有的型態時 , 無法適用的型態要另// 外定義template<>class List<char*>;// 定義當宣告為 char* 時 , class List 的成員內容
Exercise• 定義一個點物件 class point, • 內部成員為點位置 , 點位置以陣列方式儲存 pos[], • 考慮到點可能為 1 維 ,2 維 ,3 維或更高 , 故以 template 的方式來對不同維度的點物件來做生成 . • 並在物件內定義計算距離的函式
– double distance(point& other),– ( 只有同樣維度的點物件可計算距離 ) 。
• 物件內定義輸出函式– point::print();
template
Exercise - answertemplate
template<int d>class point{private:
double pos[d];public:
point(){for(int i = 0 ; i<d ; i++) pos[i] = 0;
}point(double* input){
for(int i = 0 ; i < d ; i++) pos[i] = input[i];}double distance(const point<d>& other){
double tmp = 0;for(int i = 0 ; i < d ; i++){ tmp += (this->pos[i] - other.pos[i]) * (this->pos[i] - other.pos[i]);}return sqrt(tmp);
}void print(){
cout << "(" ; for(int i =0 ; i <d ; i++) cout << " "<<pos[i] <<" " ; cout << ")";
}};
// 對一維的處理特殊化template<>double point<1>::distance(const point<1>& other){
return abs(this->pos[0] - other.pos[0] ); }
Exercise - answertemplate
template<class T, int d>class point{private:
T pos[d];public:
point(){for(int i = 0 ; i<d ; i++) pos[i] = 0;
}point(T* input){
for(int i = 0 ; i < d ; i++) pos[i] = input[i];}double distance(const point<T, d>& other){
T tmp = 0;for(int i = 0 ; i < d ; i++){ tmp += (this->pos[i] - other.pos[i]) * (this->pos[i] - other.pos[i]);}return sqrt( (double)tmp );
}void print(){
cout << "(" ; for(int i =0 ; i <d ; i++) cout << " "<<pos[i] <<" " ; cout << ")";
}};
// 對一維的處理特殊化無法對單一 type 做特殊化……=> 無法只對 d 做特殊化……
HOMEWORK• 定義一物件 type_arr,
– 成員為變數陣列與陣列長度 , 陣列型態以 template 定義 , – 定義一成員函式 , type_arr add(conts typearr& other), 內容為將兩物件內陣列值一對一相加 – 在陣列 type 為 char 時 , 為 type_arr add(conts typearr& other) 定義一特殊化成員函式 , 內容為將第二個 type_arr 之陣列附加在第一個 type_arr 陣列之後
• EX : – Add( (3,3,5) , (1,2,3,5) ) => (4,5,8,5)– Add( (Yes!) , ( take a break!!) ) = ( Yes! take a break!! )
template