SlideShare uma empresa Scribd logo
1 de 23
Baixar para ler offline
Kỹ thuật lập trình
Phần III: Lập trình tổng quát
010101010101010110000101010101010101011000010101010101010101100001
010101010010101010010101010101001010101001010101010100101010100101
101001100011001001001010100110001100100100101010011000110010010010
110010110010001000001011001011001000100000101100101100100010000010
010101010101010110000101010101010101011000010101010101010101100001
010101010010101010010101010101001010101001010101010100101010100101
101001100011001001001010100110001100100100101010011000110010010010
110010110010001000001011001011001000100000101100101100100010000010
010101010101010110000101010101010101011000010101010101010101100001
010101010010101010010101010101001010101001010101010100101010100101
101001100011001001001010100110001100100100101010011000110010010010
110010110010001000001011001011001000100000101100101100100010000010
y = A*x + B*u;
x = C*x + d*u;
StateController
start()
stop()
LQGController
start()
stop()
Chương 9:
Khuôn mẫu hàm và khuôn mẫu lớp
12/25/2007
2Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Nội dung chương 9
9.1 Khuôn mẫu hàm
- Vai trò của khuôn mẫu hàm
- Định nghĩa khuôn mẫu hàm
- Sử dụng khuôn mẫu hàm
9.2 Khuôn mẫu lớp
- Định nghĩa khuôn mẫu lớp
- Dẫn xuất khuôn mẫu lớp
- Ví dụ khuôn mẫu lớp Vector
3Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
9.1 Khuôn mẫu hàm (function template)
Vấn ₫ề: Nhiều hàm chỉ khác nhau về kiểu dữ liệu tham số áp
dụng, không khác nhau về thuật toán
Ví dụ:
int max(int a, int b) {
return (a > b)? a : b;
}
double max(double a, double b) {
return (a > b)? a : b;
}
...
Các ví dụ khác: các hàm swap, sort, find, select,...
Bản chất của vấn ₫ề? Nằm ở ngôn ngữ lập trình còn thấp, chưa
gần với tư duy của con người!
Giải pháp: Tổng quát hóa các hàm chỉ khác nhau về kiểu dữ
liệu áp dụng thành khuôn mẫu hàm.
4Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Định nghĩa khuôn mẫu hàm
Ví dụ tổng quát hóa hàm max ₫ể có thể áp dụng cho nhiều kiểu
dữ liệu khác nhau:
template <typename T>
T max(T a, T b) {
return (a > b)? a : b;
}
Ví dụ tổng quát hóa hàm swap:
template <class X>
void (X& a, X& b) {
X temp = a;
a = b;
b = temp;
}
Một khuôn mẫu hàm inline:
template <typename T>
inline T max(T a, T b) { return (a > b)? a : b;}
Sử dụng từ khóa typename
hoặc class ₫ể khai báo tham
số khuôn mẫu
5Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Khai báo và sử dụng khuôn mẫu hàm
Ví dụ sử dụng khuôn mẫu hàm max
template <class T> T max(T a, T b);
template <class T> void swap(T&, T&);
void main() {
int N1 = 5, N2 = 7;
double D1 = 5.0, D2 = 7.0;
int N = max(N1,N2); // max<int>(int,int)
char c = max('c','a'); // max<char>(char, char)
double D = max(D1,D2); // max<double>(double, double)
swap(N1,N2); // swap<int>(int&,int&)
swap(D1,D2); // swap<double>(double&,double&)
D = max(D1,A1); // error: ambiguous
N = max('c',A1); // error: ambiguous
D = max<double>(D1,A1);// OK: explicit qualification
N = max<int>('c',A); // OK: explicit qualification
}
Khuôn mẫu hàm
Hàm khuôn mẫu
6Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Khả năng áp dụng khuôn mẫu hàm
Khả năng áp dụng một khuôn mẫu hàm là vô tận, nhưng không
phải áp dụng ₫ược cho tất cả các ₫ối số khuôn mẫu
Ví dụ: Điều kiện ràng buộc ₫ối với kiểu dữ liệu có thể áp dụng
trong khuôn mẫu hàm max là phải có phép so sánh lớn hơn (>):
template <class T>
inline T max(T a, T b) { return (a > b)? a : b;}
=> Đối với các kiểu dữ liệu mới, muốn áp dụng ₫ược thì cần phải
nạp chồng toán tử so sánh >
Tuy nhiên, khả năng áp dụng ₫ược chưa chắc ₫ã có ý nghĩa
Ví dụ: Xác ₫ịnh chuỗi ký tự ₫ứng sau trong hai chuỗi cho trước
theo vần ABC
char city1[] = "Ha Noi", city2[] = "Hai Phong";
char* city = max(city1,city2); // ???
// max<char*>(char*,char*)
7Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Nạp chồng khuôn mẫu hàm
Một khuôn mẫu hàm có thể ₫ược nạp chồng bằng hàm cùng tên...
char* max(char* a, char* b) { if (strcmp(a,b))... }
void f() {
char c = max('H','K'); // max<char>(char,char)
char city1[] = "Ha Noi", city2[] = "Hai Phong";
char* city = max(city1,city2); // max(char*,char*)
...
}
...hoặc bằng một khuôn mẫu hàm cùng tên (khác số lượng các
tham số hoặc kiểu của ít nhất một tham số), ví dụ:
template <class T> T max(T a, T b, T c) {...}
template <class T> T max(T* a, int n) {...}
nhưng không ₫ược như thế này:
template <class X> X max(X a, X b) {...}
8Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Tham số khuôn mẫu
Tham số khuôn mẫu hàm có thể là một kiểu cơ bản hoặc một
kiểu dẫn xuất, nhưng không thể là một biến hoặc một hằng số:
template <class T> max(T a, T b) { ... } // OK
template <int N> max(int* a) { ... } // error
Một khuôn mẫu hàm có thể có hơn một tham số kiểu:
template <class A, class B> void swap(A& a, B& b) {
A t = a;
a = b; // valid as long as B is compatible to A
b = t; // valid as long as A is compatible to B
}
void f() {
double a = 2.0;
int b = 3;
swap(a,b); // swap<double,int>(double&,int&)
swap(b,a); // swap<int,double)(int&, double&)
}
9Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Thông thường, tham số khuôn mẫu xuất hiện ít nhất một lần là
kiểu hoặc kiểu dẫn xuất trực tiếp của các tham biến:
template <class X> void f1(X a, int b) {...}
template <class X> void f2(X* b) {...}
template <class X,class Y> void f3(Y& a, X b) {...}
Theo chuẩn ANSI/ISO C++, tham số khuôn mẫu không bắt buộc
phải xuất hiện trong danh sách tham biến, nhưng cần lưu ý khi
sử dụng. Ví dụ
#include <stdlib.h>
template <class X> X* array_alloc(int nelem) {
return (X*) malloc(nelem*sizeof(X));
}
void main() {
double* p1 = array_alloc(5); // error!
double* p2 = array_alloc<double>(5); // OK!
...
free(p2);
}
10Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Khuôn mẫu hàm và hàm khuôn mẫu
Khuôn mẫu hàm chỉ ₫ưa ra cách thức thực hiện và sử dụng một
thuật toán nào ₫ó một cách tổng quát
Trong khi biên dịch khuôn mẫu hàm, compiler chỉ kiểm tra về
cú pháp, không dịch sang mã ₫ích
Mã hàm khuôn mẫu ₫ược compiler tạo ra (dựa trên khuôn mẫu
hàm) khi và chỉ khi khuôn mẫu hàm ₫ược sử dụng với kiểu cụ
thể
Nếu một khuôn mẫu hàm ₫ược sử dụng nhiều lần với các kiểu
khác nhau, nhiều hàm khuôn mẫu sẽ ₫ược tạo ra tương ứng
Nếu một khuôn mẫu hàm ₫ược sử dụng nhiều lần với các kiểu
tương ứng giống nhau, compiler chỉ tạo ra một hàm khuôn mẫu.
11Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Ưu ₫iểm của khuôn mẫu hàm
Tiết kiệm ₫ược mã nguồn => dễ bao quát, dễ kiểm soát lỗi, nâng
cao hiệu quả lập trình
Đảm bảo ₫ược tính chặt chẽ về kiểm tra kiểu mạnh trong ngôn
ngữ lập trình (hơn hẳn sử dụng macro trong C)
Tính mở, nâng cao giá trị sử dụng lại của phần mềm: thuật toán
viết một lần, sử dụng vô số lần
Đảm bảo hiệu suất tương ₫ương như viết tách thành từng hàm
riêng biệt
Cho phép xây dựng các thư viện chuẩn rất mạnh (các thuật toán
thông dụng như sao chép, tìm kiếm, sắp xếp, lựa chọn, ....)
12Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Nhược ₫iểm của khuôn mẫu hàm
Nếu muốn ₫ảm bảo tính mở hoàn toàn thì người sử dụng khuôn
mẫu hàm cũng phải có mã nguồn thực thi
— Mã nguồn thực thi cần ₫ược ₫ặt trong header file
— Khó bảo vệ chất xám
Việc theo dõi, tìm lỗi biên dịch nhiều khi gặp khó khăn
— Lỗi nhiều khi nằm ở mã sử dụng, nhưng lại ₫ược báo trong mã ₫ịnh
nghĩa khuôn mẫu hàm
— Ví dụ: Compiler không báo lỗi ở dòng lệnh sau ₫ây, mà báo lỗi ở
phần ₫ịnh nghĩa hàm max, tại phép toán so sánh lớn hơn không
₫ược ₫ịnh nghĩa cho kiểu Complex:
Complex a, b;
...
Complex c = max(a,b);
Định nghĩa và sử dụng không ₫úng cách có thể dẫn tới gia tăng
lớn về mã ₫ích, bởi số lượng hàm khuôn mẫu có thể ₫ược tạo ra
quá nhiều không cần thiết.
13Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Ví dụ: khuôn mẫu hàm copy
template <class S, class D>
void copy(const S * s, D* d, int n) {
while (n--)
*d++ = *s++;
}
void main() {
int a[] = {1,2,3,4,5,6,7};
double b[10];
float c[5];
copy(a,b,7); // copy<int,double>(a,b,7)
copy(b,c,5); // copy<double,float>(b,c,5);
...
}
14Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
9.2 Khuôn mẫu lớp (class template)
Nhiều cấu trúc dữ liệu như Point, Complex, Vector, List, Map,...
trước kia vẫn phải ₫ược ₫ịnh nghĩa riêng cho từng kiểu dữ liệu
phần tử cụ thể, ví dụ DoubleComplex, FloatComplex,
DoubleVector, IntVector, ComplexVector, DateList,
MessageList, ...
Cách thực hiện mỗi cấu trúc thực ra giống nhau, nói chung
không phụ thuộc vào kiểu phần tử cụ thể
class IntPoint { int x,y;
public: IntPoint(int x0, int y0) : x(x0), y(y0) {}
...
};
class DoublePoint { double x,y;
public: DoublePoint(double x0, double y0) : x(x0), y(y0) {}
...
};
15Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Định nghĩa khuôn mẫu lớp
// Point.h
template <typename T>
class Point {
T x, y;
public:
Point(): x(0), y(0) {}
Point(T x0, T y0) : x(x0), y(y0) {}
Point(const Point&);
void move(T dx, T dy) { x += dx; y+= dy; }
bool inRect(Point p1, Point p2);
//...
};
template <class T>
Point<T>::Point(const Point<T>& b) : x(b.x), y(b.y) {}
template <class Coord>
bool Point<Coord>::inRect(Point<Coord> p1, Point<Coord> p2) {
return (x >= p1.x && x <= p2.x || x >= p2.x && x <= p1.x) &&
(y >= p1.y && y <= p2.y || y >= p2.y && x <= p1.y);
}
Mỗi hàm thành
viên của một
khuôn mẫu lớp là
một khuôn mẫu
hàm
Tham số khuôn mẫu:
Kiểu hoặc hằng số
16Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Sử dụng khuôn mẫu lớp: Lớp khuôn mẫu
#include "Point.h"
void main() {
Point<int> A1(5,5),A2(10,10);
Point<int> A3(A1);
while (A3.inRect(A1,A2))
A3.move(2,3);
typedef Point<float> FPoint;
FPoint B1(5.0,5.0), B2(10.0,10.0);
FPoint B3(B1);
while (B3.inRect(B1,B2))
B3.move(2,3);
//...
Point<double> C1(B1); // error
if (A3.inRect(B1,B2)) // error
; //...
}
17Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Những kiểu nào có thể áp dụng?
Khả năng áp dụng của kiểu là vô tận, tuy nhiên không có nghĩa
là áp dụng ₫ược cho tất cả các kiểu
Một kiểu muốn áp dụng ₫ược phải hỗ trợ các phép toán ₫ược sử
dụng trong mã thực thi khuôn mẫu lớp.
Ví dụ khuôn mẫu lớp Point yêu cầu kiểu tọa ₫ộ phải áp dụng
₫ược các phép toán sau ₫ây:
— Chuyển ₫ổi từ số nguyên (trong hàm tạo mặc ₫ịnh)
— Sao chép (trong hàm tạo thứ hai và hàm tạo bản sao)
— Toán tử += (trong hàm move)
— Các phép so sánh >=, <= (trong hàm inRect)
Việc kiểm tra kiểu ₫ược tiến hành khi sử dụng hàm thành viên
của lớp khuôn mẫu, nếu có lỗi thì sẽ ₫ược báo tại mã nguồn
thực thi khuôn mẫu lớp
18Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Tham số khuôn mẫu: kiểu hoặc hằng số
template <class T = double, int N = 10>
class Array {
T data[N];
public:
Array(const T& x = T(0));
int size() const { return N; }
T operator[](int i) const { return data[i]; }
T& operator[](int i) { return data[i]; }
//...
};
template <class T, int N> Array<T,N>::Array(const T& x) {
for (int i=0; i < N; ++ i) data[i] = x;
}
void main() {
Array<double,10> a;
Array<double> b; // same as above
Array<> c; // same as above
//...
}
Tham số mặc ₫ịnh
19Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Dẫn xuất từ khuôn mẫu lớp
template <class T> class IOBuffer : public Array<T,8> {
public:
IOBuffer(T x) : Array<T,8>(x) {}
//...
};
class DigitalIO : public IOBuffer<bool> {
public:
DigitalIO(bool x) : IOBuffer<bool>(x) {}
//...
};
class AnalogIO : public IOBuffer<unsigned short> {
typedef IOBuffer<unsigned short> BaseClass;
public:
AnalogIO(unsigned short x) : BaseClass(x) {}
//...
};
void main() {
IOBuffer<double> delayBuf(0);
DigitalIO di(false);
AnalogIO ao(0); //...
}
20Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Ví dụ khuôn mẫu lớp Vector
template <class T>
class Vector {
int nelem;
T* data;
public:
Vector() : nelem(0), data(0) {}
Vector(int n, T d);
Vector(int n, T *array);
Vector(const Vector<T>&);
~Vector();
int size() const { return nelem; }
T operator[](int i) const { return data[i]; }
T& operator[](int i) { return data[i]; }
private:
void create(int n) { data = new T[nelem=n]; }
void destroy() { if (data != 0) delete [] data; }
};
21Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
template <class T> Vector<T>::Vector(int n, T d) {
create(n);
while (n-- > 0)
data[n] = d;
}
template <class T> Vector<T>::Vector(int n, T* p) {
create(n);
while (n-- > 0)
data[n] = p[n];
}
template <class T> Vector<T>::~Vector() { destroy(); }
template <class T>
Vector<T>::Vector(const Vector<T>& a) {
create(a.nelem);
for (int i=0; i < nelem; ++i)
data[i] = a.data[i];
}
22Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
#include "Point.h"
#include "Vector.h"
void main()
Vector<double> v(5,1.0);
double d = v[0];
v[1] = d + 2.0;
Vector<double> v2(v);
//...
int b[] = {1,2,3,4,5};
Vector<int> a(5,b);
int n = a[0];
a[1] = n + 2;
Vector<int> a2(a);
//...
typedef Vector<Point<double> > Points;
Points lines(5,Point<double>(0.0,0.0));
lines[0] = Point<double>(5.0,5.0);
//...
}
23Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp
Bài tập về nhà
Xây dựng một khuôn mẫu hàm xác ₫ịnh vị trí (₫ịa chỉ) của phần
tử có giá trị lớn nhất xuất hiện ₫ầu tiên trong một dãy số. Viết
chương trình minh họa sử dụng cho hai kiểu số liệu cụ thể.
Từ bài tập xây dựng lớp MessageList, tổng quát hóa thành một
khuôn mẫu lớp có tên là List với các phép toán (hàm thành viên)
cần thiết

Mais conteúdo relacionado

Mais procurados

Giao trinh bai tap c va c++
Giao trinh bai tap c va c++Giao trinh bai tap c va c++
Giao trinh bai tap c va c++Congdat Le
 
Phần 6: Hàm
Phần 6: HàmPhần 6: Hàm
Phần 6: HàmHuy Rùa
 
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]bookbooming1
 
Nmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltcNmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltcMinh Ngoc Tran
 
Sổ tay thư viện hàm ngôn ngữ C
Sổ tay thư viện hàm ngôn ngữ CSổ tay thư viện hàm ngôn ngữ C
Sổ tay thư viện hàm ngôn ngữ Cvncoding
 
Phong cach lap trinh c++
Phong cach lap trinh c++Phong cach lap trinh c++
Phong cach lap trinh c++ptquang160492
 
LAP TRINH C - SESSION 2
LAP TRINH C - SESSION 2LAP TRINH C - SESSION 2
LAP TRINH C - SESSION 2pnanhvn
 
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Thanh Minh Hoang
 
Thdc3 Lap Trinh C
Thdc3 Lap Trinh CThdc3 Lap Trinh C
Thdc3 Lap Trinh Cquyloc
 
Tin học ứng dụng trong kinh doanh data4u
Tin học ứng dụng trong kinh doanh data4uTin học ứng dụng trong kinh doanh data4u
Tin học ứng dụng trong kinh doanh data4uXephang Daihoc
 
Giao trinh c++ aptech
Giao trinh c++ aptechGiao trinh c++ aptech
Giao trinh c++ aptechTấn Nhật
 
Bài tập nhập môn lập trình
Bài tập nhập môn lập trìnhBài tập nhập môn lập trình
Bài tập nhập môn lập trìnhHuy Rùa
 
Huong dan su dung va debug voi dev c++
Huong dan su dung va debug voi dev c++Huong dan su dung va debug voi dev c++
Huong dan su dung va debug voi dev c++tuandong_ptit
 
Hàm và Chuỗi
Hàm và ChuỗiHàm và Chuỗi
Hàm và Chuỗipnanhvn
 
Bài tập CTDL và GT 4
Bài tập CTDL và GT 4Bài tập CTDL và GT 4
Bài tập CTDL và GT 4Hồ Lợi
 
Bai tap thuc hanh nhap mon tin hoc
Bai tap thuc hanh nhap mon tin hocBai tap thuc hanh nhap mon tin hoc
Bai tap thuc hanh nhap mon tin hocHồ Lợi
 
Pplthdt c01 phong_cachlaptrinh_v13.09a
Pplthdt c01 phong_cachlaptrinh_v13.09aPplthdt c01 phong_cachlaptrinh_v13.09a
Pplthdt c01 phong_cachlaptrinh_v13.09aPix Nhox
 

Mais procurados (18)

Giao trinh bai tap c va c++
Giao trinh bai tap c va c++Giao trinh bai tap c va c++
Giao trinh bai tap c va c++
 
Phần 6: Hàm
Phần 6: HàmPhần 6: Hàm
Phần 6: Hàm
 
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
 
Nmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltcNmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltc
 
Sổ tay thư viện hàm ngôn ngữ C
Sổ tay thư viện hàm ngôn ngữ CSổ tay thư viện hàm ngôn ngữ C
Sổ tay thư viện hàm ngôn ngữ C
 
Phong cach lap trinh c++
Phong cach lap trinh c++Phong cach lap trinh c++
Phong cach lap trinh c++
 
LAP TRINH C - SESSION 2
LAP TRINH C - SESSION 2LAP TRINH C - SESSION 2
LAP TRINH C - SESSION 2
 
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
 
Thdc3 Lap Trinh C
Thdc3 Lap Trinh CThdc3 Lap Trinh C
Thdc3 Lap Trinh C
 
Tin học ứng dụng trong kinh doanh data4u
Tin học ứng dụng trong kinh doanh data4uTin học ứng dụng trong kinh doanh data4u
Tin học ứng dụng trong kinh doanh data4u
 
Giao trinh c++ aptech
Giao trinh c++ aptechGiao trinh c++ aptech
Giao trinh c++ aptech
 
Bài tập nhập môn lập trình
Bài tập nhập môn lập trìnhBài tập nhập môn lập trình
Bài tập nhập môn lập trình
 
Huong dan su dung va debug voi dev c++
Huong dan su dung va debug voi dev c++Huong dan su dung va debug voi dev c++
Huong dan su dung va debug voi dev c++
 
Hàm và Chuỗi
Hàm và ChuỗiHàm và Chuỗi
Hàm và Chuỗi
 
Bài tập CTDL và GT 4
Bài tập CTDL và GT 4Bài tập CTDL và GT 4
Bài tập CTDL và GT 4
 
Bai tap thuc hanh nhap mon tin hoc
Bai tap thuc hanh nhap mon tin hocBai tap thuc hanh nhap mon tin hoc
Bai tap thuc hanh nhap mon tin hoc
 
Phạm văn ất
Phạm văn ấtPhạm văn ất
Phạm văn ất
 
Pplthdt c01 phong_cachlaptrinh_v13.09a
Pplthdt c01 phong_cachlaptrinh_v13.09aPplthdt c01 phong_cachlaptrinh_v13.09a
Pplthdt c01 phong_cachlaptrinh_v13.09a
 

Destaque (16)

Kyusoku ws
Kyusoku wsKyusoku ws
Kyusoku ws
 
Neev Consulting Corporate Presentation v1.0 - For Emailing
Neev Consulting Corporate Presentation v1.0 - For EmailingNeev Consulting Corporate Presentation v1.0 - For Emailing
Neev Consulting Corporate Presentation v1.0 - For Emailing
 
Kyusoku based
Kyusoku basedKyusoku based
Kyusoku based
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinking
 
C3 functions and_library
C3 functions and_libraryC3 functions and_library
C3 functions and_library
 
How to touch drawing
How to touch drawingHow to touch drawing
How to touch drawing
 
Touchdrawing wokshop
Touchdrawing wokshopTouchdrawing wokshop
Touchdrawing wokshop
 
C1 introduction
C1 introductionC1 introduction
C1 introduction
 
Joan of arc
Joan of arcJoan of arc
Joan of arc
 
C2 basics of_c_and_cpp
C2 basics of_c_and_cppC2 basics of_c_and_cpp
C2 basics of_c_and_cpp
 
Interactive World Company Profile v1.1
Interactive World Company Profile v1.1Interactive World Company Profile v1.1
Interactive World Company Profile v1.1
 
Windows comunication foundation
Windows comunication foundationWindows comunication foundation
Windows comunication foundation
 
Giao trinh c can ban
Giao trinh c can banGiao trinh c can ban
Giao trinh c can ban
 
Mainboard
MainboardMainboard
Mainboard
 
VBA for AutoCAD
VBA for AutoCADVBA for AutoCAD
VBA for AutoCAD
 
Operating System PPT
Operating System PPTOperating System PPT
Operating System PPT
 

Semelhante a C9 templates

lap-trinh-c_nguyen-thanh-tung_chapter08_ham_-_cuuduongthancong.com.pdf
lap-trinh-c_nguyen-thanh-tung_chapter08_ham_-_cuuduongthancong.com.pdflap-trinh-c_nguyen-thanh-tung_chapter08_ham_-_cuuduongthancong.com.pdf
lap-trinh-c_nguyen-thanh-tung_chapter08_ham_-_cuuduongthancong.com.pdfmanhnguyen258069
 
Ngon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiNgon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiHuynh MVT
 
Ch02 - Cau truc chuong trinh C.pptx
Ch02 - Cau truc chuong trinh C.pptxCh02 - Cau truc chuong trinh C.pptx
Ch02 - Cau truc chuong trinh C.pptxducanh18022004
 
C3 functions and_library
C3 functions and_libraryC3 functions and_library
C3 functions and_libraryHồ Lợi
 
Nhập môn lập trình - Vương Bá Thịnh
Nhập môn lập trình - Vương Bá ThịnhNhập môn lập trình - Vương Bá Thịnh
Nhập môn lập trình - Vương Bá Thịnhsilverclaw
 
lap trinh c Phan2 chuong5
 lap trinh c Phan2 chuong5 lap trinh c Phan2 chuong5
lap trinh c Phan2 chuong5thanhyu
 
Lec3. Ham.pdf
Lec3. Ham.pdfLec3. Ham.pdf
Lec3. Ham.pdfKinHongnh
 
10. C - Function And Operator Overload
10. C   - Function And Operator Overload10. C   - Function And Operator Overload
10. C - Function And Operator OverloadDarian Pruitt
 
Local sakainame 501127 ktl_trình hlmt1 a01 fall 2013 _ modules
Local sakainame   501127 ktl_trình hlmt1 a01 fall 2013 _ modulesLocal sakainame   501127 ktl_trình hlmt1 a01 fall 2013 _ modules
Local sakainame 501127 ktl_trình hlmt1 a01 fall 2013 _ modulesTrần Văn Nam
 
Stl vector nguyen_trihai_11520094_khmt06
Stl vector nguyen_trihai_11520094_khmt06Stl vector nguyen_trihai_11520094_khmt06
Stl vector nguyen_trihai_11520094_khmt06Quach Long
 
Bai giangtrenlop
Bai giangtrenlopBai giangtrenlop
Bai giangtrenlopHồ Lợi
 
Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04. .
 

Semelhante a C9 templates (20)

lap-trinh-c_nguyen-thanh-tung_chapter08_ham_-_cuuduongthancong.com.pdf
lap-trinh-c_nguyen-thanh-tung_chapter08_ham_-_cuuduongthancong.com.pdflap-trinh-c_nguyen-thanh-tung_chapter08_ham_-_cuuduongthancong.com.pdf
lap-trinh-c_nguyen-thanh-tung_chapter08_ham_-_cuuduongthancong.com.pdf
 
Ctdl lab01
Ctdl lab01Ctdl lab01
Ctdl lab01
 
Ngon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiNgon ngu c theo chuan ansi
Ngon ngu c theo chuan ansi
 
Ch02 - Cau truc chuong trinh C.pptx
Ch02 - Cau truc chuong trinh C.pptxCh02 - Cau truc chuong trinh C.pptx
Ch02 - Cau truc chuong trinh C.pptx
 
Chuong 2
Chuong 2Chuong 2
Chuong 2
 
C3 functions and_library
C3 functions and_libraryC3 functions and_library
C3 functions and_library
 
Nhung bai mau lap trinh c
Nhung bai mau lap trinh cNhung bai mau lap trinh c
Nhung bai mau lap trinh c
 
Bai 18
Bai 18Bai 18
Bai 18
 
Chuong 1
Chuong 1Chuong 1
Chuong 1
 
Nhập môn lập trình - Vương Bá Thịnh
Nhập môn lập trình - Vương Bá ThịnhNhập môn lập trình - Vương Bá Thịnh
Nhập môn lập trình - Vương Bá Thịnh
 
Giao trinh bai tap c va c++
Giao trinh bai tap c va c++Giao trinh bai tap c va c++
Giao trinh bai tap c va c++
 
lap trinh c Phan2 chuong5
 lap trinh c Phan2 chuong5 lap trinh c Phan2 chuong5
lap trinh c Phan2 chuong5
 
Lec3. Ham.pdf
Lec3. Ham.pdfLec3. Ham.pdf
Lec3. Ham.pdf
 
10. C - Function And Operator Overload
10. C   - Function And Operator Overload10. C   - Function And Operator Overload
10. C - Function And Operator Overload
 
Local sakainame 501127 ktl_trình hlmt1 a01 fall 2013 _ modules
Local sakainame   501127 ktl_trình hlmt1 a01 fall 2013 _ modulesLocal sakainame   501127 ktl_trình hlmt1 a01 fall 2013 _ modules
Local sakainame 501127 ktl_trình hlmt1 a01 fall 2013 _ modules
 
Chuong1 c
Chuong1 c Chuong1 c
Chuong1 c
 
Stl vector nguyen_trihai_11520094_khmt06
Stl vector nguyen_trihai_11520094_khmt06Stl vector nguyen_trihai_11520094_khmt06
Stl vector nguyen_trihai_11520094_khmt06
 
Bai giangtrenlop
Bai giangtrenlopBai giangtrenlop
Bai giangtrenlop
 
Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04
 
Bai tap thuc hanh
Bai tap thuc hanhBai tap thuc hanh
Bai tap thuc hanh
 

Mais de Tiến Quang Phan (10)

Keyboard shortcuts for windows 8 pdf
Keyboard shortcuts for windows 8 pdfKeyboard shortcuts for windows 8 pdf
Keyboard shortcuts for windows 8 pdf
 
C7 class relationship
C7 class relationshipC7 class relationship
C7 class relationship
 
C5 classes and objects
C5 classes and objectsC5 classes and objects
C5 classes and objects
 
C4 data structures
C4 data structuresC4 data structures
C4 data structures
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithms
 
Ngon ngu lap trinh c&c++
Ngon ngu lap trinh c&c++Ngon ngu lap trinh c&c++
Ngon ngu lap trinh c&c++
 
Nang cao c++
Nang cao c++Nang cao c++
Nang cao c++
 
Con tro ham c++
Con tro ham c++Con tro ham c++
Con tro ham c++
 
Bai tap oop c++
Bai tap oop c++Bai tap oop c++
Bai tap oop c++
 
Thu vien chuan c++
Thu vien chuan c++Thu vien chuan c++
Thu vien chuan c++
 

Último

sách sinh học đại cương - Textbook.pdf
sách sinh học đại cương   -   Textbook.pdfsách sinh học đại cương   -   Textbook.pdf
sách sinh học đại cương - Textbook.pdfTrnHoa46
 
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docxTHAO316680
 
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...Nguyen Thanh Tu Collection
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIGIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIĐiện Lạnh Bách Khoa Hà Nội
 
Nhiễm khuẩn tiêu hóa-Tiêu chảy do vi khuẩn.pptx
Nhiễm khuẩn tiêu hóa-Tiêu chảy do vi khuẩn.pptxNhiễm khuẩn tiêu hóa-Tiêu chảy do vi khuẩn.pptx
Nhiễm khuẩn tiêu hóa-Tiêu chảy do vi khuẩn.pptxhoangvubaongoc112011
 
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfCampbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfTrnHoa46
 
GNHH và KBHQ - giao nhận hàng hoá và khai báo hải quan
GNHH và KBHQ - giao nhận hàng hoá và khai báo hải quanGNHH và KBHQ - giao nhận hàng hoá và khai báo hải quan
GNHH và KBHQ - giao nhận hàng hoá và khai báo hải quanmyvh40253
 
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...Nguyen Thanh Tu Collection
 
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảo
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảoKiểm tra cuối học kì 1 sinh học 12 đề tham khảo
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảohoanhv296
 
PHƯƠNG THỨC VẬN TẢI ĐƯỜNG SẮT TRONG VẬN TẢI
PHƯƠNG THỨC VẬN TẢI ĐƯỜNG SẮT TRONG VẬN TẢIPHƯƠNG THỨC VẬN TẢI ĐƯỜNG SẮT TRONG VẬN TẢI
PHƯƠNG THỨC VẬN TẢI ĐƯỜNG SẮT TRONG VẬN TẢImyvh40253
 
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...Nguyen Thanh Tu Collection
 
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...Nguyen Thanh Tu Collection
 
CD21 Exercise 2.1 KEY.docx tieng anh cho
CD21 Exercise 2.1 KEY.docx tieng anh choCD21 Exercise 2.1 KEY.docx tieng anh cho
CD21 Exercise 2.1 KEY.docx tieng anh chonamc250
 
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIĐiện Lạnh Bách Khoa Hà Nội
 
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfChuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfhoangtuansinh1
 
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...Nguyen Thanh Tu Collection
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 

Último (20)

sách sinh học đại cương - Textbook.pdf
sách sinh học đại cương   -   Textbook.pdfsách sinh học đại cương   -   Textbook.pdf
sách sinh học đại cương - Textbook.pdf
 
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
 
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIGIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
 
Nhiễm khuẩn tiêu hóa-Tiêu chảy do vi khuẩn.pptx
Nhiễm khuẩn tiêu hóa-Tiêu chảy do vi khuẩn.pptxNhiễm khuẩn tiêu hóa-Tiêu chảy do vi khuẩn.pptx
Nhiễm khuẩn tiêu hóa-Tiêu chảy do vi khuẩn.pptx
 
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfCampbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
 
GNHH và KBHQ - giao nhận hàng hoá và khai báo hải quan
GNHH và KBHQ - giao nhận hàng hoá và khai báo hải quanGNHH và KBHQ - giao nhận hàng hoá và khai báo hải quan
GNHH và KBHQ - giao nhận hàng hoá và khai báo hải quan
 
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
 
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảo
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảoKiểm tra cuối học kì 1 sinh học 12 đề tham khảo
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảo
 
PHƯƠNG THỨC VẬN TẢI ĐƯỜNG SẮT TRONG VẬN TẢI
PHƯƠNG THỨC VẬN TẢI ĐƯỜNG SẮT TRONG VẬN TẢIPHƯƠNG THỨC VẬN TẢI ĐƯỜNG SẮT TRONG VẬN TẢI
PHƯƠNG THỨC VẬN TẢI ĐƯỜNG SẮT TRONG VẬN TẢI
 
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
 
1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf
1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf
1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf
 
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
 
CD21 Exercise 2.1 KEY.docx tieng anh cho
CD21 Exercise 2.1 KEY.docx tieng anh choCD21 Exercise 2.1 KEY.docx tieng anh cho
CD21 Exercise 2.1 KEY.docx tieng anh cho
 
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
 
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfChuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
 
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 

C9 templates

  • 1. Kỹ thuật lập trình Phần III: Lập trình tổng quát 010101010101010110000101010101010101011000010101010101010101100001 010101010010101010010101010101001010101001010101010100101010100101 101001100011001001001010100110001100100100101010011000110010010010 110010110010001000001011001011001000100000101100101100100010000010 010101010101010110000101010101010101011000010101010101010101100001 010101010010101010010101010101001010101001010101010100101010100101 101001100011001001001010100110001100100100101010011000110010010010 110010110010001000001011001011001000100000101100101100100010000010 010101010101010110000101010101010101011000010101010101010101100001 010101010010101010010101010101001010101001010101010100101010100101 101001100011001001001010100110001100100100101010011000110010010010 110010110010001000001011001011001000100000101100101100100010000010 y = A*x + B*u; x = C*x + d*u; StateController start() stop() LQGController start() stop() Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp 12/25/2007
  • 2. 2Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Nội dung chương 9 9.1 Khuôn mẫu hàm - Vai trò của khuôn mẫu hàm - Định nghĩa khuôn mẫu hàm - Sử dụng khuôn mẫu hàm 9.2 Khuôn mẫu lớp - Định nghĩa khuôn mẫu lớp - Dẫn xuất khuôn mẫu lớp - Ví dụ khuôn mẫu lớp Vector
  • 3. 3Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp 9.1 Khuôn mẫu hàm (function template) Vấn ₫ề: Nhiều hàm chỉ khác nhau về kiểu dữ liệu tham số áp dụng, không khác nhau về thuật toán Ví dụ: int max(int a, int b) { return (a > b)? a : b; } double max(double a, double b) { return (a > b)? a : b; } ... Các ví dụ khác: các hàm swap, sort, find, select,... Bản chất của vấn ₫ề? Nằm ở ngôn ngữ lập trình còn thấp, chưa gần với tư duy của con người! Giải pháp: Tổng quát hóa các hàm chỉ khác nhau về kiểu dữ liệu áp dụng thành khuôn mẫu hàm.
  • 4. 4Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Định nghĩa khuôn mẫu hàm Ví dụ tổng quát hóa hàm max ₫ể có thể áp dụng cho nhiều kiểu dữ liệu khác nhau: template <typename T> T max(T a, T b) { return (a > b)? a : b; } Ví dụ tổng quát hóa hàm swap: template <class X> void (X& a, X& b) { X temp = a; a = b; b = temp; } Một khuôn mẫu hàm inline: template <typename T> inline T max(T a, T b) { return (a > b)? a : b;} Sử dụng từ khóa typename hoặc class ₫ể khai báo tham số khuôn mẫu
  • 5. 5Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Khai báo và sử dụng khuôn mẫu hàm Ví dụ sử dụng khuôn mẫu hàm max template <class T> T max(T a, T b); template <class T> void swap(T&, T&); void main() { int N1 = 5, N2 = 7; double D1 = 5.0, D2 = 7.0; int N = max(N1,N2); // max<int>(int,int) char c = max('c','a'); // max<char>(char, char) double D = max(D1,D2); // max<double>(double, double) swap(N1,N2); // swap<int>(int&,int&) swap(D1,D2); // swap<double>(double&,double&) D = max(D1,A1); // error: ambiguous N = max('c',A1); // error: ambiguous D = max<double>(D1,A1);// OK: explicit qualification N = max<int>('c',A); // OK: explicit qualification } Khuôn mẫu hàm Hàm khuôn mẫu
  • 6. 6Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Khả năng áp dụng khuôn mẫu hàm Khả năng áp dụng một khuôn mẫu hàm là vô tận, nhưng không phải áp dụng ₫ược cho tất cả các ₫ối số khuôn mẫu Ví dụ: Điều kiện ràng buộc ₫ối với kiểu dữ liệu có thể áp dụng trong khuôn mẫu hàm max là phải có phép so sánh lớn hơn (>): template <class T> inline T max(T a, T b) { return (a > b)? a : b;} => Đối với các kiểu dữ liệu mới, muốn áp dụng ₫ược thì cần phải nạp chồng toán tử so sánh > Tuy nhiên, khả năng áp dụng ₫ược chưa chắc ₫ã có ý nghĩa Ví dụ: Xác ₫ịnh chuỗi ký tự ₫ứng sau trong hai chuỗi cho trước theo vần ABC char city1[] = "Ha Noi", city2[] = "Hai Phong"; char* city = max(city1,city2); // ??? // max<char*>(char*,char*)
  • 7. 7Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Nạp chồng khuôn mẫu hàm Một khuôn mẫu hàm có thể ₫ược nạp chồng bằng hàm cùng tên... char* max(char* a, char* b) { if (strcmp(a,b))... } void f() { char c = max('H','K'); // max<char>(char,char) char city1[] = "Ha Noi", city2[] = "Hai Phong"; char* city = max(city1,city2); // max(char*,char*) ... } ...hoặc bằng một khuôn mẫu hàm cùng tên (khác số lượng các tham số hoặc kiểu của ít nhất một tham số), ví dụ: template <class T> T max(T a, T b, T c) {...} template <class T> T max(T* a, int n) {...} nhưng không ₫ược như thế này: template <class X> X max(X a, X b) {...}
  • 8. 8Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Tham số khuôn mẫu Tham số khuôn mẫu hàm có thể là một kiểu cơ bản hoặc một kiểu dẫn xuất, nhưng không thể là một biến hoặc một hằng số: template <class T> max(T a, T b) { ... } // OK template <int N> max(int* a) { ... } // error Một khuôn mẫu hàm có thể có hơn một tham số kiểu: template <class A, class B> void swap(A& a, B& b) { A t = a; a = b; // valid as long as B is compatible to A b = t; // valid as long as A is compatible to B } void f() { double a = 2.0; int b = 3; swap(a,b); // swap<double,int>(double&,int&) swap(b,a); // swap<int,double)(int&, double&) }
  • 9. 9Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Thông thường, tham số khuôn mẫu xuất hiện ít nhất một lần là kiểu hoặc kiểu dẫn xuất trực tiếp của các tham biến: template <class X> void f1(X a, int b) {...} template <class X> void f2(X* b) {...} template <class X,class Y> void f3(Y& a, X b) {...} Theo chuẩn ANSI/ISO C++, tham số khuôn mẫu không bắt buộc phải xuất hiện trong danh sách tham biến, nhưng cần lưu ý khi sử dụng. Ví dụ #include <stdlib.h> template <class X> X* array_alloc(int nelem) { return (X*) malloc(nelem*sizeof(X)); } void main() { double* p1 = array_alloc(5); // error! double* p2 = array_alloc<double>(5); // OK! ... free(p2); }
  • 10. 10Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Khuôn mẫu hàm và hàm khuôn mẫu Khuôn mẫu hàm chỉ ₫ưa ra cách thức thực hiện và sử dụng một thuật toán nào ₫ó một cách tổng quát Trong khi biên dịch khuôn mẫu hàm, compiler chỉ kiểm tra về cú pháp, không dịch sang mã ₫ích Mã hàm khuôn mẫu ₫ược compiler tạo ra (dựa trên khuôn mẫu hàm) khi và chỉ khi khuôn mẫu hàm ₫ược sử dụng với kiểu cụ thể Nếu một khuôn mẫu hàm ₫ược sử dụng nhiều lần với các kiểu khác nhau, nhiều hàm khuôn mẫu sẽ ₫ược tạo ra tương ứng Nếu một khuôn mẫu hàm ₫ược sử dụng nhiều lần với các kiểu tương ứng giống nhau, compiler chỉ tạo ra một hàm khuôn mẫu.
  • 11. 11Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Ưu ₫iểm của khuôn mẫu hàm Tiết kiệm ₫ược mã nguồn => dễ bao quát, dễ kiểm soát lỗi, nâng cao hiệu quả lập trình Đảm bảo ₫ược tính chặt chẽ về kiểm tra kiểu mạnh trong ngôn ngữ lập trình (hơn hẳn sử dụng macro trong C) Tính mở, nâng cao giá trị sử dụng lại của phần mềm: thuật toán viết một lần, sử dụng vô số lần Đảm bảo hiệu suất tương ₫ương như viết tách thành từng hàm riêng biệt Cho phép xây dựng các thư viện chuẩn rất mạnh (các thuật toán thông dụng như sao chép, tìm kiếm, sắp xếp, lựa chọn, ....)
  • 12. 12Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Nhược ₫iểm của khuôn mẫu hàm Nếu muốn ₫ảm bảo tính mở hoàn toàn thì người sử dụng khuôn mẫu hàm cũng phải có mã nguồn thực thi — Mã nguồn thực thi cần ₫ược ₫ặt trong header file — Khó bảo vệ chất xám Việc theo dõi, tìm lỗi biên dịch nhiều khi gặp khó khăn — Lỗi nhiều khi nằm ở mã sử dụng, nhưng lại ₫ược báo trong mã ₫ịnh nghĩa khuôn mẫu hàm — Ví dụ: Compiler không báo lỗi ở dòng lệnh sau ₫ây, mà báo lỗi ở phần ₫ịnh nghĩa hàm max, tại phép toán so sánh lớn hơn không ₫ược ₫ịnh nghĩa cho kiểu Complex: Complex a, b; ... Complex c = max(a,b); Định nghĩa và sử dụng không ₫úng cách có thể dẫn tới gia tăng lớn về mã ₫ích, bởi số lượng hàm khuôn mẫu có thể ₫ược tạo ra quá nhiều không cần thiết.
  • 13. 13Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Ví dụ: khuôn mẫu hàm copy template <class S, class D> void copy(const S * s, D* d, int n) { while (n--) *d++ = *s++; } void main() { int a[] = {1,2,3,4,5,6,7}; double b[10]; float c[5]; copy(a,b,7); // copy<int,double>(a,b,7) copy(b,c,5); // copy<double,float>(b,c,5); ... }
  • 14. 14Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp 9.2 Khuôn mẫu lớp (class template) Nhiều cấu trúc dữ liệu như Point, Complex, Vector, List, Map,... trước kia vẫn phải ₫ược ₫ịnh nghĩa riêng cho từng kiểu dữ liệu phần tử cụ thể, ví dụ DoubleComplex, FloatComplex, DoubleVector, IntVector, ComplexVector, DateList, MessageList, ... Cách thực hiện mỗi cấu trúc thực ra giống nhau, nói chung không phụ thuộc vào kiểu phần tử cụ thể class IntPoint { int x,y; public: IntPoint(int x0, int y0) : x(x0), y(y0) {} ... }; class DoublePoint { double x,y; public: DoublePoint(double x0, double y0) : x(x0), y(y0) {} ... };
  • 15. 15Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Định nghĩa khuôn mẫu lớp // Point.h template <typename T> class Point { T x, y; public: Point(): x(0), y(0) {} Point(T x0, T y0) : x(x0), y(y0) {} Point(const Point&); void move(T dx, T dy) { x += dx; y+= dy; } bool inRect(Point p1, Point p2); //... }; template <class T> Point<T>::Point(const Point<T>& b) : x(b.x), y(b.y) {} template <class Coord> bool Point<Coord>::inRect(Point<Coord> p1, Point<Coord> p2) { return (x >= p1.x && x <= p2.x || x >= p2.x && x <= p1.x) && (y >= p1.y && y <= p2.y || y >= p2.y && x <= p1.y); } Mỗi hàm thành viên của một khuôn mẫu lớp là một khuôn mẫu hàm Tham số khuôn mẫu: Kiểu hoặc hằng số
  • 16. 16Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Sử dụng khuôn mẫu lớp: Lớp khuôn mẫu #include "Point.h" void main() { Point<int> A1(5,5),A2(10,10); Point<int> A3(A1); while (A3.inRect(A1,A2)) A3.move(2,3); typedef Point<float> FPoint; FPoint B1(5.0,5.0), B2(10.0,10.0); FPoint B3(B1); while (B3.inRect(B1,B2)) B3.move(2,3); //... Point<double> C1(B1); // error if (A3.inRect(B1,B2)) // error ; //... }
  • 17. 17Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Những kiểu nào có thể áp dụng? Khả năng áp dụng của kiểu là vô tận, tuy nhiên không có nghĩa là áp dụng ₫ược cho tất cả các kiểu Một kiểu muốn áp dụng ₫ược phải hỗ trợ các phép toán ₫ược sử dụng trong mã thực thi khuôn mẫu lớp. Ví dụ khuôn mẫu lớp Point yêu cầu kiểu tọa ₫ộ phải áp dụng ₫ược các phép toán sau ₫ây: — Chuyển ₫ổi từ số nguyên (trong hàm tạo mặc ₫ịnh) — Sao chép (trong hàm tạo thứ hai và hàm tạo bản sao) — Toán tử += (trong hàm move) — Các phép so sánh >=, <= (trong hàm inRect) Việc kiểm tra kiểu ₫ược tiến hành khi sử dụng hàm thành viên của lớp khuôn mẫu, nếu có lỗi thì sẽ ₫ược báo tại mã nguồn thực thi khuôn mẫu lớp
  • 18. 18Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Tham số khuôn mẫu: kiểu hoặc hằng số template <class T = double, int N = 10> class Array { T data[N]; public: Array(const T& x = T(0)); int size() const { return N; } T operator[](int i) const { return data[i]; } T& operator[](int i) { return data[i]; } //... }; template <class T, int N> Array<T,N>::Array(const T& x) { for (int i=0; i < N; ++ i) data[i] = x; } void main() { Array<double,10> a; Array<double> b; // same as above Array<> c; // same as above //... } Tham số mặc ₫ịnh
  • 19. 19Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Dẫn xuất từ khuôn mẫu lớp template <class T> class IOBuffer : public Array<T,8> { public: IOBuffer(T x) : Array<T,8>(x) {} //... }; class DigitalIO : public IOBuffer<bool> { public: DigitalIO(bool x) : IOBuffer<bool>(x) {} //... }; class AnalogIO : public IOBuffer<unsigned short> { typedef IOBuffer<unsigned short> BaseClass; public: AnalogIO(unsigned short x) : BaseClass(x) {} //... }; void main() { IOBuffer<double> delayBuf(0); DigitalIO di(false); AnalogIO ao(0); //... }
  • 20. 20Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Ví dụ khuôn mẫu lớp Vector template <class T> class Vector { int nelem; T* data; public: Vector() : nelem(0), data(0) {} Vector(int n, T d); Vector(int n, T *array); Vector(const Vector<T>&); ~Vector(); int size() const { return nelem; } T operator[](int i) const { return data[i]; } T& operator[](int i) { return data[i]; } private: void create(int n) { data = new T[nelem=n]; } void destroy() { if (data != 0) delete [] data; } };
  • 21. 21Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp template <class T> Vector<T>::Vector(int n, T d) { create(n); while (n-- > 0) data[n] = d; } template <class T> Vector<T>::Vector(int n, T* p) { create(n); while (n-- > 0) data[n] = p[n]; } template <class T> Vector<T>::~Vector() { destroy(); } template <class T> Vector<T>::Vector(const Vector<T>& a) { create(a.nelem); for (int i=0; i < nelem; ++i) data[i] = a.data[i]; }
  • 22. 22Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp #include "Point.h" #include "Vector.h" void main() Vector<double> v(5,1.0); double d = v[0]; v[1] = d + 2.0; Vector<double> v2(v); //... int b[] = {1,2,3,4,5}; Vector<int> a(5,b); int n = a[0]; a[1] = n + 2; Vector<int> a2(a); //... typedef Vector<Point<double> > Points; Points lines(5,Point<double>(0.0,0.0)); lines[0] = Point<double>(5.0,5.0); //... }
  • 23. 23Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp Bài tập về nhà Xây dựng một khuôn mẫu hàm xác ₫ịnh vị trí (₫ịa chỉ) của phần tử có giá trị lớn nhất xuất hiện ₫ầu tiên trong một dãy số. Viết chương trình minh họa sử dụng cho hai kiểu số liệu cụ thể. Từ bài tập xây dựng lớp MessageList, tổng quát hóa thành một khuôn mẫu lớp có tên là List với các phép toán (hàm thành viên) cần thiết