You are on page 1of 172

KỸ THUẬT LẬP TRÌNH

NGUYỄN DUY NHẬT VIỄN


GIỚI THIỆU
Khái niệm
• Kỹ thuật lập trình:
• Thực thi một giải pháp phần mềm (cấu trúc dữ liệu + giải thuật)
• Dựa trên nền tảng:
• phương pháp luận (methodology)
• một hoặc nhiều ngôn ngữ lập trình phù hợp với yêu cầu đặc thù của ứng dụng.
Khái niệm
• Phương pháp luận:
• Các mô thức lập trình
• Các ý tưởng, thuật toán để giải quyết vấn đề
• Phong cách trình bày trong lập trình
• Văn hóa lập trình
Khái niệm
• Ngôn ngữ lập trình:
• Mô thức - nguyên tắc chung cơ bản
• Cú pháp - xác định cái gì là hợp lệ trong mã nguồn
• Ngữ nghĩa - ngữ pháp của ngôn ngữ lập trình
• Ngôn ngữ lập trình:
• Là ngôn ngữ được chuẩn hóa
• Người và máy tính có thể đọc và hiểu được
• Sử dụng chương trình biên dịch tương ứng để giao tiếp với máy tính
Khái niệm
• Trình biên dịch:
• Là chương trình thực hiện biên dịch toàn bộ chương trình nguồn thành mã
máy trước khi thực hiện
Khái niệm
• Lập trình tuần tự
• Mã nguồn được viết dưới dạng từ trên xuống dưới
• Khó sửa lỗi, bảo trì.
• Lập trình hướng thủ tục (Lập trình cấu trúc)
• Xây dựng chương trình dựa trên các hàm/thủ tục/chương trình con
• Dữ liệu và xử lý (hàm) tách rời nhau
• Các hàm không bắt buộc phải tuân theo một cách thức chung truy cập vào dữ
liệu
• Lập trình hướng đối tượng:
• Coi chương trình phần mềm là một tập hợp các đối tượng tương tác với nhau
Phần 1

Lập trình C++ cơ bản


Nội dung
• Tổng quan về ngôn ngữ C++
• Các kiểu dữ liệu chuẩn trong C++
• Các toán tử
• Vào ra cơ bản trong C++
• Cấu trúc điều khiển
• Hàm
• Mảng và con trỏ
• Các kiểu dữ liệu tự định nghĩa
Tổng quan về ngôn ngữ C++
Lịch sử phát triển
• Đầu thập kỷ 70, lập trình hệ thống dựa trên hợp ngữ
(Assembly)
• Công việc nặng nề, phức tạp
• Khó chuyển đổi chương trình giữa các hệ máy tính khác nhau
• Cần một ngôn ngữ lập trình hệ thống có tính khả chuyển cao
để viết lại hệ điều hành Unix
Lịch sử phát triển
• Đặc điểm của ngôn ngữ lập trình C
• Ngôn ngữ lập trình hệ thống
• Tính khả chuyển, linh hoạt cao
• Có thế mạnh trong xử lý dữ liệu số, văn bản, cơ sở dữ liệu
• C thường được sử dụng để viết các chương trình hệ thống
• Hệ điều hành Unix có 90% mã C, 10% hợp ngữ
• Các trình điều khiển thiết bị (device driver)
• Xử lý ảnh

• Các phiên bản ngôn ngữ C
• ANSI C: C chuẩn (1989)
• Các phiên bản khác xây dựng dựa trên ANSI C
• Đưa thêm thư viện bổ sung thư viện của ANSI C
Lịch sử phát triển
• Ngôn ngữ lập trình C++ được Bjarne Stroustrup phát minh năm 1979
• C++ được thiết kế hướng tới lập trình hệ thống máy tính và phần
mềm nhúng trên các mạch vi xử lý, với ưu điểm vượt trội về hiệu
suất, hiệu quả và tính linh hoạt cao
• C++ hầu hết được thực thi dưới dạng là một ngôn ngữ biên dịch, có
thể chạy trên nhiều nền tảng khác nhau như Windows, Mac OS,
Linux, Ubuntu và các phiên bản Unix
• C ++ được Tổ chức Tiêu chuẩn hóa Quốc tế (ISO) chuẩn hóa, với
phiên bản tiêu chuẩn mới nhất được ISO phê chuẩn và công bố vào
tháng 12 năm 2017 là ISO / IEC 14882: 2017 (được gọi một cách
không chính thức là C ++ 17)
Các trình biên dịch phổ biến
• Turbo C++ và Borland C++ của Borland Inc.
• MSC và VC của Microsoft Corp.
• GCC của GNU project.
• Apple C++. Xcode.
• Bloodshed Dev-C++. A GCC-based (Mingw) IDE.
• Codeblocks
• Clang C++.
• Cygwin (GNU C++)
• MINGW - "Minimalist GNU for Windows
• …
Các phần tử có bản chương trình C++
1. Tập ký tự
2. Từ khóa
3. Định danh
4. Các kiểu dữ liệu
5. Hằng số
6. Biến
7. Hàm
8. Biểu thức
9. Câu lệnh
10. Chú thích
Tập ký tự
• Tập ký tự là tập các phần tử cơ bản tạo nên chương trình
• Tổ hợp các ký tự -> từ
• Liên kết các từ theo cú pháp -> câu lệnh
• Tổ chức các câu lệnh -> chương trình
• Tập ký tự trong C++
• 26 chữ cái hoa:A B C ... X Y Z
• 26 chữ cái thường:a b c … x y z.
• 10 chữ số: 0 1 2 3 4 5 6 7 8 9.
• Các kí hiệu toán học:+ - * / = < >
• Các dấu ngăn cách: . ; , : space tab
• Các dấu ngoặc:( ) [ ] { }
• Các kí hiệu đặc biệt:_ ? $ & # ^ \ ! ‘ “ ~ .v.v.
Từ khóa
• Từ khóa (keyword)
• Có sẵn trong mỗi ngôn ngữ lập trình
• Dành riêng cho các mục đích xác định
• Đặt tên cho kiểu dữ liệu: int, float, double…
• Mô tả các lệnh, các cấu trúc lập trình: if, while, case…
• Chú ý:
• Tất cả từ khóa trong C++ đều viết bằng chữ cái thường
Từ khóa
Các từ khóa dành chung cho chương trình C lẫn C++
auto break case char const
continue default do double else
enum extern float for goto
if int long register return
short signed sizeof static struct
switch typedef union unsigned void
volatile while

Các từ khóa dành cho C++


asm bool catch class const_cast
delete dynamic_cast explicit false friend
inline mutable namespace new operator
private protected public reinterpret_cast
static_cast template this throw true
try typeid typename using virtual
wchar_t
Tên – định danh
• Định danh (Identifier – hoặc còn gọi là Tên) là một dãy các kí tự dùng để
gọi tên các đối tượng trong chương trình.
• Các đối tượng trong chương trình
• Biến
• Hằng số
• Hàm
• Kiểu dữ liệu
• …
• Định danh có thể được đặt bởi
• Ngôn ngữ lập trình -> các từ khóa
• Người lập trình
Tên – định danh
• Quy tắc đặt tên định danh trong C++
• Các kí tự được sử dụng trong các định danh của ngôn ngữ C++ chỉ được
gồm có: chữ cái, chữ số và dấu gạch dưới “_” (underscore)
• Bắt đầu của định danh phải là chữ cái hoặc dấu gạch dưới, không được bắt
đầu định danh bằng chữ số.
• Định danh do người lập trình đặt không được trùng với các từ khóa của C++
• Chú ý: C++ là ngôn ngữ có phân biệt chữ hoa và chữ thường
Tên – định danh
• Ví dụ
• Định danh hợp lệ:
i, x, y, a, b, _function, _MY_CONSTANT, PI, gia_tri_1
• Định danh không hợp lệ
• 1_a, 3d, 55x (bắt đầu bằng chữ số)
• so luong, ti le (có dấu cách - kí tự không hợp lệ)
• int, char (trùng với từ khóa của ngôn ngữ C)
Tên – định danh
• Một số quy ước (code convention)
• Nên sử dụng dấu gạch dưới để phân tách các định danh gồm nhiều từ
• Định danh nên có tính gợi nhớ
• Quy ước thường được sử dụng:
• Hằng số dùng chữ cái hoa
• Các biến, hàm, cấu trúc dùng chữ cái thường
• Ví dụ
Định danh Loại đối tượng
HANG_SO_1, _CONSTANT_2 Hằng số
a, b, i, j, count Biến
nhap_du_lieu, tim_kiem, xu_li Hàm
sinh_vien, mat_hang Cấu trúc
Kiểu dữ liệu
• Định nghĩa:
• Một kiểu dữ liệu là một tập hợp các giá trị mà một dữ liệu thuộc kiểu dữ liệu
đó có thể nhận được.
• Trên một kiểu dữ liệu ta xác định một số phép toán đối với các dữ liệu thuộc
kiểu dữ liệu đó.
• Ví dụ:
• Kiểu dữ liệu int (số nguyên) trong C++
• Một dữ liệu thuộc kiểu dữ liệu int
• Là một số nguyên
• Nhận giá trị từ từ - 32,768 (- 215) đến 32,767 (215 - 1)
Hằng số
• Định nghĩa:
• hằng (constant) là đại lượng có giá trị không đổi trong chương trình.
• Biểu diễn hằng số nguyên: trong C++, một hằng số nguyên có thể biểu
diễn dưới 3 dạng
• Dạng thập phân
• Dạng thập lục phân
• Dạng bát phân
• Ví dụ
Giá trị thập phân Giá trị thập lục phân Giá trị bát phân
2007 0x7D7 03727
396 0x18C 0614
Hằng số
• Biểu diễn hằng số thực: trong C, một hằng số thực có thể biểu diễn
dưới 2 dạng
• Dạng số thực dấu phẩy tĩnh
• Dạng số thực dấu phẩy động
• Ví dụ
Số thực dấu phẩy tĩnh Số thực dấu phẩy động

3.14159 31.4159 E-1

123.456 12.3456 E+1 hoặc 1.23456 E+2


Hằng số
• Biểu diễn hằng ký tự: trong C, một hằng ký tự có thể biểu diễn theo
hai cách
• Bằng ký hiệu của ký tự đặt giữa hai dấu nháy đơn
• Bằng số thứ tự của ký tự đó trong bảng mã ASCII (số nguyên -> tuân thủ quy
tắc biểu diễn hằng số nguyên)
• Ví dụ
Ký tự cần biểu diễn Cách 1 Cách 2
Chữ cái A ‘A’ 65, 0x41, 0101
Dấu nháy đơn ‘\’’ 39, 0x27, 047
Ký tự tab ‘\t’ 0, 0x09, 011
Hằng số
• Biểu diễn hằng xâu ký tự:
• Hằng xâu kí tự được biểu diễn bởi dãy các kí tự thành phần có trong xâu đó và
được đặt trong cặp dấu nháy kép.
• Ví dụ:
• “ngon ngu lap trinh C++”
• “Ky thuat lap trinh”
• “Khoa Dien tu –Vien thong”
Biến
• Định nghĩa:
• Biến (variable) là đại lượng mà giá trị có thể thay đổi trong chương trình.
• Chú ý:
• Hằng số và biến được sử dụng để lưu trữ dữ liệu trong chương trình
• Hằng số và biến phải thuộc một kiểu dữ liệu nào đó
• Hằng số và biến đều phải đặt tên theo quy tắc
Hàm
Hàm (function) là một chương trình con có chức năng nhận dữ liệu đầu
vào (các tham số đầu vào), thực hiện một chức năng nào đó và đưa ra
các kết quả.
Biểu thức
• Định nghĩa:
• Biểu thức là sự ghép nối các toán tử (operator) và các toán hạng (operand)
theo một quy tắc xác định.
• Các toán hạng có thể là biến, hằng
• Các toán tử rất đa dạng: cộng, trừ, nhân, chia, …
• Ví dụ: biểu thức tính thể tích hình chữ nhật
chieu_dai * chieu_rong * chieu_cao
- chieu_dai, chieu_rong, chieu_cao là các hằng hoặc biến số đóng vai trò toán
hạng
- Phép * đóng vai trò toán tử
Câu lệnh
• Câu lệnh (statement) diễn tả một hoặc một nhóm các thao tác trong
giải thuật. Chương trình được tạo thành từ dãy các câu lệnh.
• Cuối mỗi câu lệnh trong C++, bắt buộc có dấu chấm phẩy ‘;’ để đánh
dấu kết thúc câu lệnh và phân tách các câu lệnh
• Phân nhóm:
• Nhóm các câu lệnh đơn: những câu lệnh không chứa câu lệnh khác. Ví dụ:
phép gán, phép cộng, phép trừ…
• Nhóm các câu lệnh phức: những câu lệnh chứa câu lệnh khác. Ví dụ: lệnh khối
(đặt trong cặp ngoặc nhọn « {} »), lệnh rẽ nhánh, lệnh lặp…
Câu lệnh
• Lệnh đơn là một sự tính toán Ví dụ:
được kết thúc bằng dấu chấm
phẩy. {
int min, i = 10, j = 20;
min = (i < j ? i : j);
• Nhiều lệnh đơn có thể kết nối lại min + 5;
cout << min << '\n';
thành một lệnh phức (khối lệnh) ;
bằng cách rào chúng bên trong }
các dấu ngoặc móc {}.
Lệnh rỗng Lệnh vô dụng
Chú thích
• Chú thích (comment):
• Lời mô tả, giải thích vắn tắt cho một câu lệnh, một đoạn chương trình hoặc cả
chương trình
• Giúp việc đọc và hiểu chương trình dễ dàng hơn
• Chú thích không phải là câu lệnh -> không ảnh hưởng tới chương trình
• Cách viết chú thích: trong C++ có hai cách
• Chú thích một dòng: sử dụng « // »
• Chú thích nhiều dòng: sử dụng « /* » và « */ »
Cấu trúc cơ bản chương trình C+
+
//khai báo các tiền xử lý, các thư viện #include <iostream>
#include … using namespace std;
struct hinhchunhat{
    float d,r, dt,cv;
//định nghĩa các kiểu dữ liệu   };
float tinhdientich(hinhchunhat h);
typedef …
int main()
struct … {
  
  hinhchunhat h1;
//khai báo các hàm nguyên mẫu   h1.d=100;
  h1.r=200;
//khai báo các biến toàn cục h1.dt=tinhdientich(h1);
  h1.cv = 2*(h1.d+h1.r);
  cout <<"Dien tich hinh 1= "<<h1.dt<<endl;
//định nghĩa hàm main()   cout <<"Chu vi hinh1 = "<<h1.cv<<endl;
int main(void)   return 0;
}
{ float tinhdientich(hinhchunhat h)
… {
return(h.d*h.r);
}
}
//định nghĩa các hàm đã khai báo nguyên mẫu
Cấu trúc cơ bản chương trình C++
• Phần 1: Phần khai báo các tiền xử lý, các thư viện: Phần này
có chức năng thông báo cho chương trình dịch biết là chương
trình có sử dụng những thư viện nào (mỗi tệp tiêu đề tương
ứng với một thư viện).
• Phần 2: Định nghĩa các kiểu dữ liệu mới dùng cho cả chương
trình.
• Phần 3: Phần khai báo các hàm nguyên mẫu. Giúp cho
chương trình dịch biết được những thông tin cơ bản (gồm tên
hàm, dach sách các tham số và kiểu dữ liệu trả về) của các
hàm sử dụng trong chương trình.
Cấu trúc cơ bản chương trình C++
• Phần 4: Phần khai báo các biến toàn cục.
• Phần 5 (Bắt buộc): định nghĩa hàm main( ).
• Hàm main( ) là một hàm đặc biệt trong C++. Chương trình sẽ bắt đầu
bằng việc thực hiện các câu lệnh trong hàm main( ).
• Phần 6: Định nghĩa các hàm đã khai báo nguyên mẫu trong
phần 3. Định nghĩa cách thức cài đặt và hoạt động của các
hàm.
//khai báo các tiền xử lý, các thư viện #include <iostream>
#include … using namespace std;
struct hinhchunhat{
    float d,r, dt,cv;
//định nghĩa các kiểu dữ liệu   };
typedef … float tinhdientich(hinhchunhat h);
int main()
struct … {
  
  hinhchunhat h1;
//khai báo các hàm nguyên mẫu
  h1.d=100;
  h1.r=200;
//khai báo các biến toàn cục h1.dt=tinhdientich(h1);
  h1.cv = 2*(h1.d+h1.r);
  cout <<"Dien tich hinh 1= "<<h1.dt<<endl;
//định nghĩa hàm main()   cout <<"Chu vi hinh1 = "<<h1.cv<<endl;
int main(void)   return 0;
}
{ float tinhdientich(hinhchunhat h)
… {
} return(h.d*h.r);
}
//định nghĩa các hàm đã khai báo nguyên mẫu
Biên dịch C++
Biên dịch C++
Biên dịch C++
• Giai đoạn tiền xử lý – Preprocessor:
• Nhận mã nguồn
• Xóa bỏ tất cả chú thích, comments của chương trình
• Xử lý các chỉ thị tiền xử lý (bắt đầu bằng #)

• Ví dụ: chỉ thị #include cho phép ghép thêm mã chương trình của một tệp tiêu
để vào mã nguồn cần dịch. Các hằng số được định nghĩa bằng #define sẽ được
thay thế bằng giá trị cụ thể tại mỗi nơi sử dụng trong chương trình.
Biên dịch C++

• Dịch ngôn ngữ bậc Cao sang Assembly


• Phân tích cú pháp (syntax) của mã nguồn ngôn ngữ bậc cao
• Chuyển chúng sang dạng mã Assembly là một ngôn ngữ bậc thấp (hợp ngữ)
gần với tập lệnh của bộ vi xử lý.
• Công đoạn dịch Assembly
• Dich chương trình => Sang mã máy 0 và 1
• Một tệp mã máy (.obj) sinh ra trong hệ thống sau đó.
Biên dịch C++

• Giai đoạn Linker


• Trong giai đoạn này mã máy của một chương trình dịch từ nhiều nguồn (file .cpp hoặc
file thư viện .lib) được liên kết lại với nhau để tạo thành chương trình đích duy nhất
• Mã máy của các hàm thư viện gọi trong chương trình cũng được đưa vào chương trình
cuối trong giai đoạn này.
• Phát hiện lỗi: Các lỗi liên quan đến việc gọi hàm hay sử dụng biến không tồn tại sẽ bị
phát hiện. Kể cả lỗi viết chương trình chính không có hàm main() cũng được phát hiện
trong liên kết.
• Kết thúc quá trình tất cả các đối tượng được liên kết lại với nhau thành một
chương trình có thể thực thi được (executable hay .exe) thống nhất.
Các IDE biên dịch phổ biến
• IDE (Integrated Development Environment - môi trường phát
triển tích hợp).
• IDE cung cấp giao diện cho người dùng viết mã, tổ chức các
nhóm văn bản và tự động hóa các hoạt động lập trình.
• Những tính năng cơ bản của các IDE thông dụng
• Trình soạn thảo văn bản
• Trình gỡ lỗi
• Trình biên dịch
• Hoàn thành mã
• Hỗ trợ ngôn ngữ lập trình
• Hỗ trợ nhiều Plugin
Các IDE hỗ trợ C++ tốt
• Một số IDE yêu cầu phải cài trình biên dịch
• Visual Studio Code
• Visual studio
• XCode
• Eclipse
• Netbean IDE
• Code::Block
• DevC++
• C++ Builder
• Borland Turbo C++
Các trình biên dịch C++ thông dụng
• C++Builder (bcc*)
• Turbo C++ (tcc)
• Clang (clang++)
• GCC (g++)
• Intel C++ Compiler (icc)
• Visual C++ (cl)
• MinGW-w64
• Bloodshed Dev-C++ C++ Compiler
• Mingw32 C & C++ Compilers
• Cygwin Project (C & C++ Compilers)
• Microsoft Visual C++.
• Oracle C++.
Các trình biên dịch C++ online
• http://cpp.sh/
• https://www.onlinegdb.com/online_c++_compiler
• https://www.tutorialspoint.com/compile_cpp_online.php
• https://www.programiz.com/cpp-programming/online-compiler/
• https://repl.it/languages/cpp
• https://paiza.io/en/projects/new?language=cpp
• https://www.codiva.io/
• https://repl.it/languages/cpp11
• http://codepad.org/
• https://wandbox.org/
Các kiểu dữ liệu chuẩn trong C+
+
Độ rộng
Kiểu bit Dãy giá trị

char 1 byte -127 tới 127 hoặc 0 tới


255

Các kiểu dữ liệu chuẩn unsigned char


signed char
1 byte
1 byte
0 tới 255
-127 tới 127
-2147483648 tới
int 4 byte
2147483647
unsigned int 4 byte 0 tới 4294967295

signed int 4 byte -2147483648 tới


2147483647
Kiểu dữ liệu Từ khóa short int 2 byte -32768 tới 32767
Boolean bool
unsigned short int 2 byte 0 tới 65,535
Ký tự char
signed short int 2 byte -32768 tới 32767
Số nguyên int
Số thực float -2,147,483,647 tới
long int 4 byte
2,147,483,647
Số thực dạng Double double
signed long int 4 byte Tương tự như long int
Kiểu không có giá trị void
unsigned long int 4 byte 0 tới 4,294,967,295
Kiểu Wide character wchar_t
float 4 byte +/- 3.4e +/- 38 (~7 chữ số)
+/- 1.7e +/- 308 (~15 chữ
double 8 byte số)
+/- 1.7e +/- 308 (~15 chữ
long double 8 byte
số)
wchar_t 2, 4 byte 1 wide character
//khảo sát giá trị thực tế các kiểu dữ liệu của C++
#include <iostream>
using namespace std;
int main()
{
cout << "Kich co cua char la: " << sizeof(char) << endl;
cout << "Kich co cua int la: " << sizeof(int) << endl;
cout << "Kich co cua short int la: " << sizeof(short int) << endl;
cout << "Kich co cua long int la: " << sizeof(long int) << endl;
cout << "Kich co cua float la: " << sizeof(float) << endl;
cout << "Kich co cua double la: " << sizeof(double) << endl;
cout << "Kich co cua wchar_t la: " << sizeof(wchar_t) << endl;
return 0;
}
Kiểu số nguyên
• Số nguyên có dấu:
• Miền giá trị (số n-bit): -2n-1 .. +2n-1 – 1
Kiểu số nguyên
• Số nguyên không dấu:
• Miền giá trị (số n-bit): 0 .. 2n – 1
Kiểu số nguyên
• Hằng số nguyên có thể biểu diễn ở 3 dạng
• Bát phân: viết bắt đầu bằng số 0
• Thập phân: viết bắt đầu bằng số từ 1 đến 9
• Thập lục phân: viết đầu bằng 0x
• Các phép toán số học
• Phép cộng: +, phép trừ: –, phép nhân: *
• Phép chia lấy phần nguyên: /
• Phép chia lấy phần dư: %
• Các phép toán trên bit
• Phép and bit: &
• Phép or bit: |
• Phép xor bit: ^
• Phép not bit: ~
Kiểu số thực
• Cấu trúc lưu trữ bên trong của
số thực được thiết kế theo dấu
chấm động (floating-point) của
IEEE.
• Các phép toán số học
• Phép cộng: +
• Phép trừ: –
• Phép nhân: *
• Phép chia: /
• Các hàm toán học như căn số,
lũy thừa, logarit, …
Kiểu ký tự
• Kiểu ký tự 8 bit:
• Kiểu char hoặc unsigned char.
• Lưu mã ASCII của ký tự, giá trị từ 0 đến 255.
#include <iostream>

Kiểu ký tự using namespace std;
int main()
{
• Đổi ký tự từ ký tự thường sang ký tự hoa:  char ch;
• Nếu ‘a’ ≤ ch ≤ ’z’ thì ch (mới) = ch – (‘a’ – ‘A’)  ch=65;

• Trong mọi trường hợp ta có công thức:  cout <<ch<<endl;

• ch – (‘a’ – ‘A’) * (ch >= ‘a’ && ch <= ‘z’)  ch = 'A';


 cout <<ch<<endl;
• Tương tự, chuyển ký tự hoa thành ký tự
thường:  cout <<"nhap ch: ";
• ch – (‘A’ – ‘a’) * (ch >= ‘A’ && ch <= ‘Z’)  cin>> ch;
 cout <<"ASCII code = "<< (int) ch<<endl;
 ch = ch -('a'-'A')*(ch>='a' && ch<='z');
 cout<<"Upper case: "<< ch<<endl;
 return 0;
}
Kiểu ký tự
• Kiểu ký tự 16 bit:
• Kiểu wchar_t (#include <wchar>)
• Lưu trữ dựa trên bảng mã quốc tế UTF-16 (một dạng mã
Unicode) Mã UTF-16 của ký tự thông thường (‘0’ đến ‘9’, ‘A’
đến ‘Z’, ‘a’ đến ‘z’, …) trùng mã ASCII.
• Hằng ký tự kiểu wchar_t được đặt trước bằng chữ L
• Lưu ý, ‘B’ và L’B’ như nhau (cùng giá trị 66) nhưng kích thước
trong bộ nhớ khác nhau
(sizeof(‘B’) = 1, sizeof(L’B’) = 2)
Kiểu luận lý (logic)
• Trong C chuẩn không có kiểu logic. Giá trị sai (false) là 0, giá trị
đúng (true) là khác 0 (thường là 1).
• Kiểu bool được bổ sung trong C++
• Giá trị khác 0 nghĩa là đúng (true).
• Giá trị bằng 0 nghĩa là sai (false).
Lưu ý: Kết quả lượng giá một biểu thức luận lý bất kỳ thực hiện bởi C+
+ luôn cho kết quả là 0 (false) hay 1 (true).
• Các phép toán
• Kết hợp: && (and), || (or), ! (not)
• So sánh: >, >=, <, <=, ==, !=
Kiểu void
• Không lưu bất cứ dữ liệu gì
• Báo cho trình biên dịch hàm không có giá trị trả về, không có
tham số
• Con trỏ kiểu void (con trỏ tổng quát): là một kiểu dữ liệu đặc
biệt của con trỏ. Con trỏ kiểu void có thể trỏ đến bất kỳ đối
tượng nào (với bất kỳ kiểu dữ liệu nào) có địa chỉ cụ thể trên bộ
nhớ.
Khai báo biến
• Một biến trước khi sử dụng phải được khai báo
• Cú pháp khai báo:
kieu_du_lieu ten_bien;
Hoặc:
kieu_du_lieu ten_bien1, …, ten_bienN;
• Ví dụ:
//Khai báo biến x là một số nguyên 2 byte (hoặc 4 byte) có dấu
int x;
// Khai báo các biến y, z là các số thực 4 byte
float y,z;
// Sau khi khai báo, có thể sử dụng
x = 3; y = x + 1;
Khai báo biến
• Sau khi được khai báo, các biến chưa có giá trị xác định. Cần được
gán giá trị (khởi tạo) trước khi dùng!
• C++ cho phép kết hợp khai báo và khởi tạo
kieu_du_lieu ten_bien = gia_tri_ban_dau;
Hoặc:
kieu_du_lieu biên_1=gia_tri_1, bien_N=gia_tri_N;
• Ví dụ:
// Khai báo biến nguyên a và khởi tạo gia tri bằng 3
int a = 3;
// Khai báo biến thực x,y và khởi tạo gia tri bằng 5.0 và 7.6
float x = 5.0, y = 7.6;
Biến toàn cục, biến địa phương
#include <iostream>
using namespace std;
int main()  //ham main() cung la mot khoi lenh
{ int c= 10,  d= 20;
  cout<<"Bien ngoai khoi c= "<<c<<" d= "<<d<<endl;
    {  int c = 100, d=200;
      cout<<"Bien trong khoi c= "<<c<<" d= "<<d<<endl;
      cout<<"Tang them 10 cho cac gia tri moi bien "<<endl;
      c = c + 10; d= d + 10;
      cout<<"Bien trong khoi c= "<<c<<" d= "<<d<<endl;
   }
 cout<<"Bien ngoai khoi c= "<<c<<" d= "<<d<<endl;
 return 0;
}// ket thuc khoi lenh cua ham main()
Khai báo hằng
• Dùng từ khóa #define:
• Cú pháp:
# define ten_hang gia_tri
• Ví dụ:
#define MAX_SINH_VIEN 50
#define CNTT “Cong nghe thong tin”
#define DIEM_CHUAN 23.5
Khai báo hằng
• Dùng từ khóa const :
• Cú pháp:
const kieu_du_lieu ten_hang = gia_tri;
• Ví dụ:
const int MAX_SINH_VIEN = 50;
const char CNTT[20] = “Cong nghe thong tin”;
const float DIEM_CHUAN = 23.5;
Khai báo hằng
• Chú ý:
• Giá trị của các hằng phải được xác định ngay khi khai
báo.
• Trong chương trình, KHÔNG thể thay đổi được giá trị
của hằng.
• #define là chỉ thị tiền xử lý (preprocessing directive)
• Dễ đọc, dễ thay đổi
• Dễ chuyển đổi giữa các nền tảng phần cứng hơn
• Tốc độ nhanh hơn
Các toán tử
Toán tử gán
• Dùng để gán một giá trị nào đó cho một biến.
• Cú pháp: tên_biến = biểu thức;
• Ví dụ gán giá trị nguyên 5 cho biến a: a=5;
• Vế trái bắt buộc phải là một biến còn vế phải có thể là bất kì hằng, biến
hay kết quả của một biểu thức.
• Toán tử gán luôn được thực hiện từ trái sang phải và không bao giờ
đảo ngược
• Ví dụ: a = b;
• gán giá trị của biến a bằng giá trị đang chứa trong biến b. Chú ý rằng chúng ta
chỉ gán giá trị của b cho a và sự thay đổi của b sau đó sẽ không ảnh hưởng đến
giá trị của a.
Toán tử gán
• Toán tử gán trong C++ cho phép vế phải có thể chứa các phép gán khác.
• Ví dụ:
a = 2 + (b = 5);
tương đương với
b = 5;
a = 2 + b;
• Vì vậy biểu thức sau cũng hợp lệ trong C++
a = b = c = 5;
• gán giá trị 5 cho cả ba biến a, b và c
Các toán tử số học
• Năm toán tử số học được hỗ trợ bởi ngôn ngữ là:
• +: cộng
• -: trừ
• *: nhân
• /: chia
• %: lấy phần dư (trong phép chia)
• Thứ tự thực hiện giống như trong toán học.
• Dịch trái, dịch phải số nguyên A đi B bit: A<<B, A>>B.
• Toán tử bit: AND &, OR |, XOR ^ và NOT ~.
Toán tử gán phức hợp
• Một đặc tính làm cho C++ nổi tiếng là một ngôn ngữ súc tích
•  value += increase; tương đương với value = value + increase;
a -= 5; tương đương với a = a - 5;
a /= b; tương đương với a = a / b;
price *= units + 1; tương đương với price = price * (units + 1);
• và tương tự cho tất cả các toán tử khác.
Tăng và giảm
• Toán tử tăng (++) và giảm (--) giá trị chứa trong một biến đi 1.
• Tương đương với +=1 hoặc -=1. Vì vậy, các dòng sau là tương đương:
++a;
a++;
a+=1;
a=a+1;
• Chú ý: (++a) giá trị được tăng trước khi biểu thức được tính và giá trị đã tăng
được sử dụng trong biểu thức; (a++) giá trị trong biến a được tăng sau khi đã
tính toán.
Tăng và giảm
• Ví dụ 1
B=3;
A=++B;
// A is 4, B is 4
• Ví dụ 2
B=3;
A=B++;
// A is 3, B is 4
F=++(a++-++b/--a-b++)/(b++---a); //???
Các toán tử quan hệ
• So sánh hai biểu thức với nhau.
• Kết quả là giá trị logic - chỉ có thể có giá trị true hoặc false, tuỳ theo quan hệ
giữa vế trái và vế phải.
• Các toán tử quan hệ trong C++
• ==Bằng
• !=Khác
• >Lớn hơn
• <Nhỏ hơn
• > =Lớn hơn hoặc bằng
• < =Nhỏ hơn hoặc bằng
Các toán tử logic
• Toán tử ! tương đương với toán tử logic NOT, đổi ngược giá trị của đối số từ
true sang false hoặc ngược lại.
• Ví dụ:
• !(5 == 5) trả về false vì biểu thức bên phải (5 == 5) có giá trị true.
• !(6 <= 4) trả về true vì (6 <= 4) có giá trị false.
• !true trả về false.
• !false trả về true.
• Toán tử logic && và || được sử dụng khi tính toán hai biểu thức để lấy ra một
kết quả duy nhất. Tương ứng với các toán tử logic AND và OR. Kết quả của
chúng phụ thuộc vào mối quan hệ của hai đối số.
Toán tử lấy địa chỉ của biến
• Biến thực chất là một vùng nhớ được đặt tên (là tên của biến) trên bộ nhớ của
máy tính.
• Mọi ô nhớ trên bộ nhớ máy tính đều được đánh địa chỉ. Do đó mọi biến đều có
địa chỉ
• & <tên biến>; 1
• Ví dụ: int a = 2006 //(07D6H); .
..
..
 &a; // co gia tri la 158 hay 9E . 157

a D6 158

07 159

160
.
.
.
Chuyển đổi kiểu
• Chương trình dịch sẽ tự động chuyển đổi kiểu
• char  int  long int  float  double  long
double
• Ngược lại
• Số nguyên long int 50,000 không phải là một số nguyên kiểu int vì phạm vi
biểu diễn của kiểu int là từ (-32,768 đến 32,767).
 Phải ép kiểu
• Cú pháp:
(<kiểu dữ liệu mới>) <biểu thức>;
Chuyển đổi kiểu
• Ví dụ:
#include <iostream>
int main()
{
long int li; int i; float f; clrscr();
li = 0x123456; f = 123.456;
i = (int) li;
cout “li = “<<li<<“ i = ”<<i<<endl;
i = (int) f;
cout “f = “<<f<<“ i = ”<<i<<endl;
}
• Kết quả
– li = 1193046; i = 13398
– f = 123.456001; i = 123
Toán tử điều kiện
• Toán tử điều kiện tính toán một biểu thức và trả về một giá trị khác tuỳ thuộc
vào biểu thức đó là đúng hay sai. Cấu trúc của nó như sau:
condition ? result1 : result2
• Nếu condition là true thì giá trị trả về sẽ là result1, nếu không giá trị trả về là
result2.
• 7==5 ? 4 : 3 trả về 3 vì 7 không bằng 5.
• 7==5+2 ? 4 : 3 trả về 4 vì 7 bằng 5+2.
• 5>3 ? a : b trả về a, vì 5 lớn hơn 3.
• a>b ? a : b trả về giá trị lớn hơn, a hoặc b.
Thứ tự ưu tiên các toán tử
Mức Toán tử Thứ tự
Cao nhất :: Cả hai
() [] -> . Trái tới phải
+ ++ ! * new sizeof Phải tới trái
- -- ~ & delete ()
->* .* Trái tới phải
* / % Trái tới phải
+ - Trái tới phải
<< >> Trái tới phải
< <= > >= Trái tới phải
== != Trái tới phải
& Trái tới phải
^ Trái tới phải
| Trái tới phải
&& Trái tới phải
|| Trái tới phải
?: Trái tới phải
= += *= ^= &= <<= Phải tới trái
-= /= %= |= >>=
Thấp nhất , Trái tới phải
Vào ra cơ bản trong C++
Sử dụng cout
• cout là một đối tượng được định nghĩa trước trong C++, tương ứng với luồng ra chuẩn (standard
output stream).
• Toán tử << là toán tử chèn, định hướng nội dung cần hiển thị.
• Ví dụ:
• char str[ ]=”Hello world”;
• int i=8;
• cout << str << endl; // endl (hoặc \n) là dấu hiệu xuống dòng.
• cout << ”i=” << i << endl;
• Để định dạng nội dung hiển thị, sử dụng setw (nằm trong iomanip.h) để thiết lập đồ dài ký tự cho
biến kế sau.
• cout<< setw(12) << str << setw(5) << i;
• Kết quả: Hello world 8
Sử dụng cin
• cin là toán tử được định nghĩa trước trong C++, tương ứng với luồng
vào chuẩn (standard input stream).
• Toán tử >> đưa nội dung từ luồng vào chuẩn vào biến.
• Ví dụ:
• int temperature;
• cout << ”Enter temperature in Celsius: ”;
• cin >> temperature;
Nhập xâu ký tự
• C++ không có kiểu dữ liệu cơ bản để lưu các xâu kí tự  Mảng kiểu char.
• Ví dụ:
• char jenny [20];
• char st[]=“Hello”;
• Nhập xâu:
• cin.getline ( char buffer[], int length, char delimiter = \n );
• buffer (bộ đệm) lưu trữ xâu, length: độ dài cực đại của bộ đệm , delimiter: kí tự được dùng để kết thúc việc nhập,
mặc định - là kí tự xuống dòng ( \n ).

• Ví dụ:
• char mybuffer [100];
cout << "What s your name? ";
cin.getline (mybuffer,100);
cout << "Hello " << mybuffer << ".\n";
Xóa bộ nhớ đệm
• Khi thao tác với kiểu ký tự (char) có sử dụng khoảng trắng hay Enter, cần xóa bộ
nhớ đệm trước khi in ra màn hình.
• Việc quên xóa bộ nhớ đệm sẽ dẫn đến việc lưu trữ giá trị trong biến bị sai.
• Ví dụ:
#include <iostream>
using namespace std;
int main() {
    int a; Kết quả:
    char b[100]; 100 Ket thuc
    cin >> a;        //nhập số 100      
    cin.getline(b,100);      
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
Xóa bộ nhớ đệm
• Ở trên, chuỗi ký tự b không nhận được giá trị do bị ký tự Enter có
trong bộ nhớ đệm chèn vào.
• Để có thể xóa bộ nhớ đệm, có thể sử dụng các câu lệnh cin.ignore()
hoặc fflush(stdin)
#include <iostream>
using namespace std;
int main() {
    int a;
    char b[100];
    cin >> a;              
    cin.ignore(); //hoặc fflush(stdin);           
    cin.getline(b,100);    
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
Cấu trúc điều khiển
Thuật toán (algorithm)
• Tập hợp hữu hạn các chỉ thị thực thi chương trình theo một thứ tự nào đó để
giải quyết 1 vấn đề nào đó. 
• Thuật toán độc lập với ngôn ngữ lập trình
• Vấn đề / bài toán
• Giải quyết vấn đề bằng cách thực hiện các hoạt động theo một trình tự xác định.
• Xác định thuật toán
• Thực thi các hoạt động theo 1 trình tự
• Điều khiển chương trình
• Xác định trình tự thực hiện các câu lệnh (statements).
• Biểu diễn thuật toán:
• Mã giả
• Lưu đồ
Cấu trúc điều khiển
• Các cấu trúc điều khiển
• Cấu trúc tuần tự:
• Chương trình được thực hiện theo trình tự mặc định (default).
• Cấu trúc lựa chọn (điều kiện):
• if, if/else, switch
• Cấu trúc lặp:
• while, do/while, for
Mã giả
• Mã giả
• Ngôn ngữ dễ hiểu để phát triển thuật toán.
• Tương tự như tiếng Anh hằng ngày.
• Không thực hiện được trên máy tính
• Được sử dụng để suy nghĩ trước khi viết mã.
• Dễ dàng chuyển đổi sang ngôn ngữ C++
• Chỉ thực hiện các câu lệnh
• Không tiến hành các khai báo.
Lưu đồ thuật toán
• Lưu đồ:
• Đồ thị biểu diễn thuật toán.
• Gồm các ký hiệu xác định nối với nhau bằng các mũi tên.
• Ký hiệu hình chữ nhật: ký hiệu hoạt động
• Ký hiệu oval: bắt đầu, kết thúc chương trình hoặc một phần nào đó của
chương trình.
• Cấu trúc điều khiển một ngõ vào/một ngõ ra
• Ngõ ra của điểm này được nối với ngõ vào của điểm kia.
• Cấu trúc điều khiển ngăn xếp.
Lưu đồ thuật toán
Ký hiệu Ý nghĩa
Bắt đầu, kết thúc chương
Start End
trình
Luồng xử lý

X>=y? Điều khiển chọn lựa

Nhập n In k Nhập, xuất

Y=a.x+b.y+c.z Xử lý, tính toán, gán

A
Điểm nối liên kết (khi lưu đồ
vượt quá trang)
Cấu trúc trình tự
•Lưu
Thực
đồ: thi tiến trình theo tuần tự.
Startlệnh này đến
• Các lệnh được thực thi theo thứ tự từ trên xuống dưới, hết
lệnh khác.
• Ví dụ: Nhập vào 3 số nguyên a, b, c và xuất ra màn hình vớia,giá
Nhập b, c trị của
mỗi số đã tăng lên 1.

a++; b++; c++

Mã giả:
Bước 1: Bắt đầu Xuất a, b, c
Bước 2: Nhập 3 số a, b, c
Bước 3: Tăng a, b,c
Bước 4: Xuất a, b, c End
Bước 5: Kết thúc
Cấu trúc lựa chọn if/else –
switch/case
Cấu trúc lựa chọn if
• Chọn họat động theo điều kiện
• Ví dụ mã giả:
• Nếu x%2=0 thì xuất thông báo “x là số chia hết
cho 2”
• Nếu điều kiện là true
• Xuất thông báo “x là số chia hết cho 2” ,
chương trình tiếp tục với lệnh kế sau
• Nếu điều kiện là false
• Chương trình tiếp tục với lệnh kế sau
• Thường các lệnh trong if được viết thụt vào để dễ
đọc
• C++ bỏ qua các khoảng trắng (tabs,
spaces,...)

hadouken skill code


Cấu trúc lựa chọn if
• Chuyển sang C++
if ( x%2 == 0) cout << “x chia het cho 2";

• Ký hiệu quyết định hình thoi


(decision symbol) X%2= 0?
true X là số chia
hết cho 2
• Chỉ ra quyết định được thực hiện
• Chứa biểu thức có thể là true or false
• Kiểm tra điều kiện, theo đường dẫn false

• Cấu trúc if Chú ý :


zero - false
• Single-entry/single-exit
nonzero - true
Ví dụ:
3 - 4 is true
Cấu trúc chọn lựa if/else
• if
• Thực hiện hoạt động điều kiện đúng
• if/else
• Các họat động khác nhau được thực hiện nếu điều kiện là true hoặc false
• Mã giả
If (A’s height > B’s height) then
Print “A is taller than B”
Else
Print “B not as tall as A”
• C++ code
if ( heightA > heightB )
cout << " A is taller than B ";
else
cout << " B not as tall as A ";
Cấu trúc chọn lựa if/else
• Toán tử điều kiện tam phân (?:)
• 3 tham số (condition, giá trị if true, giá trị if false)
• Mã có thể viết lại như sau:
cout <<(( heightA > heightB )? “A is taller than B ” : “B not as tall as A” );

false true
heightA > heightB

B not as tall as A A is taller than B


Cấu trúc chọn lựa if/else
• Cấu trúc chọn lựa if/else lồng nhau
• Khi cấu trúc này lồng cấu trúc kia, kiểm tra các trường hợp.
• Khi điều kiện thỏa mãn, các câu lệnh khác được bỏ qua.
if ( grade < 5.0 )
cout << “Yeu";
else if ( grade <7 )
cout << “TB";
else if ( grade <8 )
cout << “Kha";
else if ( grade <9 )
cout << “Gioi";
else
cout << “Xuat sac";
Cấu trúc chọn lựa if/else
• Chú ý : trong trường hợp có nhiều cấu trúc if lồng nhau
thì else sẽ gắn liền với if gần nhất.

if(condition1) <statement1>;
else
if (condition2)
if(condition3) < statement2>;
else <statement3>;
else <statement4>;
Cấu trúc nhiều chọn lựa switch
• Kiểm tra một vài giá trị hằng cho một biểu thức nguyên, dạng thức
của nó như sau:
switch (expression) {
  case constant1:
    block of instructions 1
    break;
  case constant2:
    block of instructions 2
    break;
 .
 .
 .
  default:
    default block of instructions
 }
Cấu trúc nhiều chọn lựa switch
• Nếu biểu thức (expression) bằng hằng 1 (constant1) thì thực Case 1
T
Case 1 action
hiện khối lệnh 1 (block of instructions 1) cho đến khi tìm thấy từ
khoá break, thoát ra khỏi cấu trúc switch. F break?
Y
N
• Nếu không có từ khóa break, thực hiện khối kệnh 2 (block of
instructions 2) cho đến khi tìm thấy từ khoá break. Case 2
T
Case 2 action

• … F Y
break?
• Cuối cùng, nếu giá trị biểu thức không bằng bất kì hằng nào N

được chỉ định ở trên, chương trình sẽ thực hiện các lệnh trong
phần default (nếu nó tồn tại vì phần này không bắt buộc phải
có).
Default? Default action
Y
N
Cấu trúc nhiều chọn lựa switch
• Ví dụ switch • Ví dụ else/if
switch (x) if (x == 1) {
T
{ cout << "x is 1"; X==1? X là 1
case 1: }
F
cout << "x is 1"; else if (x == 2) {
break; cout << "x is 2";
T
case 2: } X==2 X là 2
cout << "x is 2"; else { F
break; cout << "value of x unknown";
default: } Chưa biết
cout << "value of x unknown"; số gì
}
Cấu trúc lặp for – while –
do/while
Cấu trúc lặp for
• Dùng để lặp công việc một số chính xác lần
đã định trước dựa vào sự biến thiên của
biến điều khiển Khởi tạo

• Cú pháp: Thay đổi


for([khởi tạo];[điều kiện];[thay đổi]) True
Điều kiện? Công việc
{công việc}
• Khởi tạo: Khởi tạo giá trị ban đầu cho vòng lặp
False
• Điều kiện : Điều kiện thực hiện tiếp tục vòng lặp
• Thay đổi: Thay đổi giá trị trong biểu thức điều
kiện, thường là tăng hoặc giảm bước lặp
• Công việc: Có thể là lệnh đơn lệnh kép hoặc
lệnh rỗng
Cấu trúc lặp for
• Ví dụ:
for( int counter = 1; counter <= 10; counter++ )
cout << counter << endl;
• In các số nguyên từ 1 đến 10

counter = 1
counter++

Counter<=10? True Xuất giá trị


counter

False
Cấu trúc lặp while
• Dạng
while (expression) statement
• lặp lại câu lệnh statement trong khi điều kiện expression còn thoả
mãn.
• Vòng lặp while lặp lại cho đến khi điều kiện là false
• Ví dụ
int product = 2;
while ( product <= 10 )
product = 2 * product;
Cấu trúc lặp while
• Lưu đồ

product = 2

True
product<=10? product=2*product

False
Cấu trúc lặp do/while
• Dạng thức:
do statement while (condition);
• Hoạt động lặp lại cho đến khi điều kiện sai.
• Vì vậy câu lệnh statement sẽ được thực hiện ít nhất một lần ngay cả
khi condition không bao giờ được thoả mãn.
• Ví dụ
int product = 1;
do
product = 2 * product;
while ( product <= 10 );
Cấu trúc lặp do/while
• Lưu đồ product=1

product=2*product

product<=10? True

False
Cấu trúc lặp do/while
• Mã giả
Set total to zero
Set grade counter to one
While grade counter is less than or equal to ten
Input the next grade
Add the grade into the total
Add one to the grade counter
Set the class average to the total divided by ten
Print the class average
• Chương trình C++ như sau:
1 // Class average program with counter-controlled repetition. 20
2 #include <iostream> 21 // processing phase
3 22 do {
4 using std::cout; 23 cout << "Enter grade: "; // prompt for input
5 using std::cin; 24 cin >> grade; // read grade from user
6 using std::endl; 25 total = total + grade; // add grade to total
7 26 gradeCounter = gradeCounter + 1; // increment
8 // function main begins program execution counter
9 int main() 27 } while ( gradeCounter <= 10 ) ; // loop 10 times
10 { 28
11 int total; // sum of grades input by user 29 // termination phase
12 int gradeCounter; // number of grade to be entered next 30 average = total / 10; // integer division
13 int grade; // grade value 31
14 int average; // average of grades 32 // display result
15 33 cout << "Class average is " << average << endl;
16 // initialization phase 34
17 total = 0; // initialize total 35 return 0; // indicate program ended successfully
18 gradeCounter = 1; // initialize loop counter 36
19 37 } // end function main
Cấu trúc lặp for đặc biệt
• Phần khởi tạo và lệnh tăng là không bắt buộc phải có. Chúng có thể được bỏ qua
nhưng vẫn phải có dấu chấm phẩy ngăn cách giữa các phần. Vì vậy, chúng ta có
thể viết for (;n<10;) hoặc for (;n<10;n++).
• Sử dụng dấu phẩy, ta có thể dùng nhiều lệnh trong bất kì trường nào trong vòng
for. Ví dụ chúng ta có thể khởi tạo một lúc nhiều biến trong vòng lặp:
for ( n=0, i=100 ; n!=i ; n++, i-- )
{
// thực hiện công việc gì đó ...
}
• Vòng lặp này sẽ thực hiện 50 lần nếu như n và i không bị thay đổi trong thân vòng
lặp:
Các lệnh rẽ nhánh và lệnh nhảy
Lệnh break
• Sử dụng break chúng ta có thể thoát khỏi vòng lặp while, for,
do/while, switch ngay cả khi điều kiện để nó kết thúc chưa được
thoả mãn.
• Lệnh này có thể được dùng để kết thúc một  vòng lặp không xác định
hay buộc nó phải kết thúc giữa chừng thay vì kết thúc một cách bình
thường.
• Thường sử dụng để bỏ qua phần còn lại của switch hoặc thoát khỏi
vòng lặp sớm.
1 #include <iostream>
2
3 using std::cout;
` 4
5
using std::endl;

6 int main()
7 {
8
9 int x; // x declared here so it can be used after the loop
10
11 // loop 10 times
12 for ( x = 1; x <= 10; x++ ) {
13 Exits for structure when
14 // if x is 5, terminate loop break executed.
15 if ( x == 5 )
16 break; // break loop only if x is 5
• 1234
17
• Broke out of loop when x became 5
18 cout << x << " "; // display value of x
19
20 } // end for
21
22 cout << "\nBroke out of loop when x became " << x << endl;
23
24 return 0; // indicate successful termination
25
26 } // end function main
Lệnh continue
• Lệnh continue làm cho chương trình bỏ qua phần còn lại của vòng lặp và
nhảy sang lần lặp tiếp theo.
• Ví dụ chúng ta sẽ bỏ qua số 5 trong phần đếm ngược
#include <iostream.h>
int main (){
for (int n=10; n>0; n--) {
if (n==5) continue;
cout << n << ", ";
}
cout << "FIRE!";
return 0;
} 10, 9, 8, 7, 6, 4, 3, 2, 1, FIRE!
Continue và break
Exit
• Kết thúc chương trình và trả về một mã xác định. Dạng thức
void exit (int exit code);
• exit code được dùng bởi một số hệ điều hành hoặc có thể được dùng
bởi các chương trình gọi. Mã trả về 0 có nghĩa là chương trình kết
thúc bình thường còn các giá trị khác 0 có nghĩa là có lỗi.
Goto nhãn
• Lệnh này cho phép nhảy vô điều kiện tới bất kì điểm nào trong
chương trình. Dạng thức
goto nhãn
• Nhảy đến nhãn được khai báo trong chương trình.
• Không nên sử dụng trong chương trình C++.
Return
• Cho phép một hàm trả về một giá trị cho thành phần gọi nó.
• Ví dụ:
#include <iostream.h> 
int addition (int a, int b){
int r=a+b;
return (r);

int main (){
int z;
z = addition (5,3);
cout << "The result is " << z;
return 0;
}
Hàm
Khái niệm hàm
• Hàm là một khối lệnh được thực hiện khi nó được gọi từ một điểm
khác của chương trình.
• Cú pháp:
type name ( argument1, argument2, ...) {
statement
}
• type là kiểu dữ liệu được trả về của hàm.
• name là tên gọi của hàm.
• arguments là các tham số. Khai báo các tham số giống như khi khai báo
biến (ví dụ int x). Tham số đóng vai trò bên trong hàm như biến. Các tham
số khác nhau được ngăn cách bởi các dấu phẩy. Chúng dùng để truyền
tham số cho hàm khi được gọi.
• statement là thân của hàm. Nó có thể là một lệnh đơn hay một khối lệnh
Ví Dụ Về Hàm
Tên hàm Các tham số

1 int Power(int base, unsigned int exponent) Khai báo hàm


2 {
3 int result = 1;
4 for (int i = 0; i < exponent; ++i)
5 result *= base; Định nghĩa hàm
6 return result;
7 }

8 main (void)
9 { Các đối số
10 cout << "2 ^ 8 = "<< Power(2,8)<< '\n';
11
}
12

Gọi hàm
Phạm Vi Toàn Cục – Cục Bộ #include <iostream.h>
#include <stdio.h>
int xyz = 1; // xyz là toàn cục
void abc (int xyz) // xyz là cục bộ cho thân của abc
• Phạm vi toàn cục {
if (xyz > 0) {
• Được định nghĩa ở double xyz =2; // xyz là cục bộ cho khối này
phạm vi chương trình cout <<"\nXyz co gia tri "<<xyz;
Nhap gia tri cua x: 5}
• Phạm vi cục bộ Xyz cua chuong trinh chinh:
else { 1
Tham so xyz co gia tri -4 cout <<"\nTham so xyz co gia tri:"<<xyz;
• Được địnhXyz
nghĩa ở chuong trinh chinh:
trong cout <<"\nXyz
1 trong chuong trinh chinh:
phạm vi khối hay hàm "<< ::xyz;
}
• Toán tử phạm vi }
void main(){
• :: int x;
cout <<"Nhap gia tri cua x: ";
cin >>x;
cout <<“Xyz cua chuong trinh chinh: "<<xyz<<endl;
abc(xyz-x);
}
Cấp phát bộ nhớ
• Biến toàn cục được cấp phát tĩnh
• Biến địa phương:
• Cấp phát động: biến được giải phóng khi kết thúc hàm, không lưu kết quả cho lần sau
• Cấp phát tĩnh: biến không được giải phóng khi kết thúc hàm, lưu kết quả cho lần sau
• Mặc định biến địa phương là cấp phát động. Để cấp phát tĩnh biến địa phương, ta
dùng từ khoá static trước khai báo của biến. Biến static chỉ sử dụng trong phạm vi
được khai báo.
• Biến địa phương thanh ghi: Thanh ghi có tốc độ truy cập nhanh hơn RAM, bộ nhớ
ngoài. Lưu biến trong thanh ghi sẽ tăng tốc độ thực hiện chương trình
• khai báo : register int x;
• yêu cầu trình biên dịch đặt biến đó vào thanh ghi (nếu có thể)
• không dùng từ khóa register với biến tĩnh.
• không định nghĩa con trỏ đến biến thanh ghi
• Không lạm dụng biến thanh ghi (dung lượng thanh ghi bé)
Đệ quy
• Một hàm gọi lại chính nó
1. long int giaithua(int n)
2. { if (n==0) return(1);
3. else return(giaithua(n-1)*n);
4. }
• Nên hạn chế dùng đệ quy, nếu có thể thì dùng vòng lặp để thay thế
1. long int giaithua(int n)
2. { long int i=1,k=1;
3. while (i<=n) { k=k*i ; i++ ; }
4. return(k);
5. }
Mảng và con trỏ
Mảng
• Gồm một tập các đối tượng cùng kiểu và được sắp xếp liên tiếp
trong bộ nhớ
• Mỗi phần tử mảng được xác định bởi một chỉ số biểu thị vị trí
của phần tử trong mảng
• Phần tử đầu tiên của mảng luôn có chỉ số 0
• Số lượng phần tử trong mảng được gọi là kích thước của
mảng (cố định; xác định trước)
• Gồm mảng một chiều và mảng đa chiều

int A[4]; 54 43 40 102


A[0] A[1] A[2] A[3]
Kích thước Chỉ số Phần tử mảng
Biến Mảng
• Biến mảng được định nghĩa bằng cách đặc tả kích
thước mảng và kiểu các phần tử của nó
• Ví dụ: int heights[10];
• Truy xuất 1 phần tử qua chỉ số mảng
• Ví dụ: heights[0]= 210; cout<< heights[3];
• Truy xuất phần tử không tồn tại  lỗi vượt ngoài
biên
• Ví dụ: cout<<heights[-1]; cout<<heights[10];
Bộ Khởi Tạo Mảng
• Mỗi mảng có một bộ khởi tạo mảng
• Ví dụ
int nums[3] = {5, 10, 15}; Bộ khởi tạo mảng

nums[2]
=? Kích
thước

int nums[3] = {5, 10}; int nums[ ] = {5, 10, 15}; mảng ?

• Chuỗi là một mảng ký tự


• Ví dụ: so sánh sự khác nhau của
char str[] = "HELLO"; và char str[] = {'H', 'E', 'L', 'L', 'O'};
Ví dụ mảng
• #include <iostream.h>
• #define n 5
• void main()
• {
• int i, mang[n];
• cout <<"Nhap cac phan tu cua mang: "<<endl;
• for(i=0 ; i<n ; i++) {
• cout <<"mang["<< i <<"]"<<": ";
• cin>> mang[i]; }
• cout<<"\n Mang gom cac phan tu :\n";
• for(i=0 ; i<n ; i++) {
• cout <<"mang["<< i <<"]"<<"= ";
• cout<<mang[i]<<endl; }
• getchar();
• }
Tham Chiếu
• Một tham chiếu (reference) là một biệt hiệu (alias) cho
một vùng nhớ được cấp phát cho một biến
• Các tác động lên tham chiếu sẽ giống như các tác động
trực tiếp lên biến đó
int num1=123;
• Ví dụ int &num2=num1;
cout <<"\n num1: “ <<num1 <<"\n num2: “<<num2;
num2=345; cout << “\n num1: ”<< num1;
• Chú ý
• Một tham chiếu phải luôn được khởi tạo khi nó được định
nghĩa
• Có thể khởi tạo tham chiếu tới một hằng.
• Khi khai báo tham chiếu, phải gắn nó với một biến nào đó và
không thể gắn lại với biến khác
Truy cập vào giá trị của địa chỉ
• Toán tử trỏ đến (*) cho phép chúng ta truy cập (get/set) giá trị tại
một địa chỉ cụ thể.
• Ví dụ
int n = 5;
cout << n << endl; //xuất giá trị của biến n
cout << &n << endl; //xuất địa chỉ của biến n
cout << *(&n) << endl; //xuất giá trị tại địa chỉ vùng nhớ của biến n

Kết quả:
5
0xBFD181AC
5
Truy cập vào giá trị của địa chỉ
• Ví dụ:
int n = 5;
cout << n << endl;
*(&n) = 10;
cout << n << endl;
• Kết quả:
5
10
Con Trỏ
• Con trỏ đơn giản chỉ là địa chỉ của một vị trí bộ nhớ và
cung cấp cách gián tiếp để truy xuất dữ liệu trong bộ
nhớ
• Ví dụ
Biến giá trị địa chỉ

int num = 10; num 10 1000


int *ptr1 = &num;
ptr1 1000 2000
cout << *ptr1;
Ví dụ kiểm định giá trị con trỏ
#include <iostream.h> Gia tri cua number: 10
void main() Dia chi cua number: 0012FF88
{ Gia tri cua con tro pointer: 0012FF88
Gia tri duoc tro toi boi pointer: 10
int number=10; Dia chi cua con tro pointer: 0012FF84
int *pointer=&number;
cout << "\nGia tri cua number : "<<number;
cout <<"\nDia chi cua number : "<<&number;
cout <<"\nGia tri cua con tro pointer : "<<pointer;
cout <<"\nGia tri duoc tro toi boi pointer : "<<*pointer;
cout <<"\nDia chi cua con tro pointer : "<<&pointer;
getchar();
}
Con trỏ
• Thay đổi giá trị của vùng nhớ con trỏ trỏ đến:
• Ví dụ:
int value = 5;
int *ptr = &value;

*ptr = 10;
cout << *ptr << endl;
cout <<value<<end;
• Kết quả:
10
10
Con trỏ
• Con trỏ khi khai báo phải gán một địa chỉ xác định cho nó. Nếu không thì sẽ gây lỗi hệ thống.
• Ví dụ con trỏ sử dụng nhưng chưa gán địa chỉ xác định gây lỗi:
• int *ptr;
• cout << *ptr << endl;
• Khai báo con trỏ nhưng chưa có địa chỉ khởi tạo cụ thể, chúng ta nên gán cho con trỏ giá
trị NULL.
• Ví dụ:
int *ptr = NULL;

if(ptr == NULL)
cout << "Do nothing" << endl;
else
cout << *ptr << endl;
Truyền tham số cho 1 hàm
Truyền trị (Passing by Value)

• Khi truyền trị, hàm sẽ tạo ra một biến cục bộ để lưu giá trị của biến được truyền.
• Giá trị của biến được truyền không thay đổi.
• Ví dụ:
• void f(int val)
• {
• val++;
• }
• int x=4;
• f(x);
• cout << x; // x = 4
Truyền tham chiếu (Passing by Reference)

• Tham chiếu cung cấp bí danh (alias) cho biến.


• Khi truyền tham số theo kiểu tham chiếu thì biến cục bộ là bí danh của biến được truyền.
• Địa chỉ của biến được truyền cho hàm.
• Hàm có thể truy cập trực tiếp trên biến được truyền.
• Ví dụ:
• void f(int &val)
• {
• val++;
• }
• int x=4;
• f(x);
• cout << x; // x = 5
Tham số hằng

• Tham chiếu hằng không cho phép hàm thay đổi giá trị của biến được truyền.
• Ví dụ:
• void f( int& a, const int& b ) // b là tham số hằng
• {
• a=5; // ok
• b=7; // fail
• }
Truyền Bằng Trị - Con Trỏ - Tham Chiếu

// Truyền bằng trị (đối tượng) int main (void)


1 void Swap1 (int x, int y) {
2 { int i = 10, j = 20;
3 int temp = x; Swap1(i, j); cout << i << ", " << j << '\n';
4 x = y; Swap2(&i, &j); cout << i << ", " << j << '\n';
5 y = temp;
Swap3(i, j); cout << i << ", " << j << '\n';
6 }
}
// Truyền bằng địa chỉ (con trỏ)
7 void Swap2 (int *x, int *y)
8 {
9 int temp = *x;

?
10 *x = *y; 10, 20 Hàm 1 tạo 2 bản sao cho hai biến x, y
11 *y = temp; 20, 10 Hàm 2 làm việc trực tiếp tại địa chỉ của i,j
}
12 // Truyền bằng tham chiếu 10, 20 Hàm 3 không tạo bản sao nào cả.
13 void Swap3 (int &x, int &y)
14 {
15 int temp = x;
16 x = y;
17 y = temp;
18 }
Con trỏ và mảng một chiều
• Các phần tử của mảng được cấp phát liên tiếp nhau, phần tử đầu tiên
có địa chỉ thấp nhất.
• Tên mảng là hằng con trỏ, luôn trỏ đến phần tử đầu tiên của mảng.
• Số học con trỏ: phép tăng / giảm con trỏ làm cho con trỏ trỏ đến phần
tử liền sau / liền trước của phần tử ban đầu .
1. cout <<“Nhap cac phan tu cua mang:”<<endl;
2. int a[10], i ;
3. for(i=0 ; i<10 ; i++)
4. { cout<< “Nhap vao phan tu a[“<<i<<“]: ”;
5. cin >>a[i];
6. }
7. int *p;
8. p=a; //p=&a[0]
9. cout <<“Xuat cac phan tu cua mang:”<<endl;
10. for(i=0 ; i<10 ; i++)
11. { cout <<“a[“<<i<<“]=“<<*p<<endl;
12. p++;
13. }
Truyền mảng một chiều cho hàm

int max( int x[ ]) int max( int *x)


{int j,m; {int j,m;
m= x[0]; m=*x;
for(j=0 ; j<10 ; j++) for(j=0;j<10;j++)
if( x [ j ] > m ) if( *(x+j) > m )
m= x [ j ] ; m=*(x+j);
return m; return m; }
}
Truyền mảng một chiều cho hàm
void nhap( int x[] )
{ int i;
for(i=0; i<N; i++)
{ cout <<i <<“ “;
cin >> x[i];
}
}
void xuat(const int x[]) // chú ý từ khoá const
{ int i;
for(i=0 ; i<N ; i++)
cout << x[i];
Khi
} thêm từ khóa const vào trước khai báo mảng hình thức thì trong thân hàm
không thể thay đổi giá trị của mảng đối số thực truyền cho hàm. Nó tương tự
như truyền đối số theo giá trị
Mảng nhiều chiều
Mảng nhiều chiều
Mùa Mùa hè Mùa thu Mùa đông Hàng
xuân
Hà nội 26 34 22 17
Đà nẵng 24 32 19 13 int seasonTemp[3][4];
Tp HCM 28 38 25 20

Cột

... 26 34 22 17 24 32 19 13 28 38 25 20 ...

First
hàngrow
đầu Second row
hàng hai Third
hàng row
ba

Cách tổ chức trong bộ nhớ


Con trỏ và mảng nhiều chiều
1. #include <iostream.h>
2. void main()
3. { int a[4][6];
4. int i,j;
5. for (i=0;i<4;i++)
6. for (j=0;j<6;j++)
7. { cout <<“a[“<<i<<“][”<<j<<“] =”;
8. cin >> a[i][j];
9. }
10. }
Con trỏ và mảng nhiều chiều
• Các phần tử của mảng 2 chiều được sắp xếp: các phần tử
của hàng đầu tiên, sau đó đến các phần tử của hàng kế
tiếp …

int *pa, a[4][6];


pa=(int *)a; // ép kiểu
Khi đó pa là địa chỉ của a[0][0]
pa + 1 là địa chỉ của a[0][1]
pa + 2 là địa chỉ của a[0][2]
........
pa + i*6 + j là địa chỉ của a[i][j]
1. #include <iostream.h>
2. void main()
3. { int i,j;
4. int *pa, a[4][6];
5. pa=(int *)a;
6. cout <<"\nNhap vao cac phan tu cua mang:";
7. for (i=0 ; i<4 ; i++)
8. for (j=0 ; j<6 ; j++)
9. {
10. cout <<"a["<<i<<"]["<<j<<"]=";
11. cin >>*(pa+i*6+j);
12. }
13. cout <<"\n\n";
14. for (i=0 ; i<4 ; i++)
15. {
16. for (j=0 ; j<6 ; j++)
17. cout<<" a["<<i<<"]["<<j<<"]="<<*(pa+i*6+j);
18. cout <<"\n";
19. }
20. getchar();
21. }
Truyền mảng nhiều chiều cho hàm
• Giả sử ta cần truyền mảng int a[4] [6] cho hàm
• Cách 1: khai báo
int (*pa)[6]; hoặc int pa[ ][6];
Trong thân hàm, để truy cập phần tử a[i][j] ta dùng pa[i][j].
• Cách 2: khai báo
int *pa; và int n; // số cột
Trong thân hàm, để truy cập phần tử a[i][j] ta dùng *(pa+i*n+j)
1. //chương trình nhập xuất mảng 2 chiều theo cách 1
2. #include <iostream>
3. void nhap(int a[][6],int m,int n)
4. {
5. cout<<endl<<"Nhap vao cac phan tu cua mang:";
6. for ( i=0 ; i<m ; i++)
7. for ( j=0 ; j<n ; j++)
8. {
9. cout<<“a[“<<i<<“][“<<j<<“]=“;
10. cin>> a[i][j];
11. }
12. }
15. void hienthi(int a[][6],int m,int n)
16. {
17. cout <<<<endl<<“Cac phan tu cua mang:“<<endl;
18. for (int i=0 ; i<m ; i++)
19. { for (int j=0 ; j<n ; j++)
20. cout<<“a[“<<i<<“][“<<j<<“]=“<<a[i][j] <<“ “;
21. cout <<endl;
22. }
23. }
24. void main()
25. { int m,n;
26. int a[10][6];
27. cout <<endl<<"Nhap m,n:"; cin>>m>>n;
28. nhap(a,m,n);
29. cout <<endl;
30. hienthi(a,m,n);
31. }
1. // nhập xuất mảng 2 chiều theo cách 2
2. #include <iostream>
3. void nhap(int *p,int m,int n)
4. { int i,j;
5. cout<<endl<<"Nhap vao cac phan tu cua mang:";
6. for (i=0;i<m;i++)
7. for (j=0;j<n;j++)
8. {
9. cout<<“a[“<<i<<“][“<<j<<“]=“;
10. cin>> *(p+i*n+j);
11. }
12. }
16. void hienthi(int *p, int m, int n)
17. {
18. cout <<<<endl<<“Cac phan tu cua mang:“<<endl;
19. for (int i=0 ; i<m ; i++)
20. { for (int j=0 ; j<n ; j++)
21. cout<<“a[“<<i<<“][“<<j<<“]=“<<*(p+i*n+j) <<“ “;
22. cout <<endl;
23. }
24. }
16. void main()
17. { int m,n;
18. int *pa, a[10][10];
19. pa=(int *)a; // chú ý lệnh này
20. cout <<endl<<"Nhap m,n:"; cin>>m>>n;
21. nhap(pa,m,n);
22. cout <<endl;
23. hienthi(pa,m,n);
16. }
Bộ Nhớ Động - Tĩnh
• Bộ nhớ động (heap)
• Vùng nhớ được cấp phát động trong thời gian thực thi
• Bộ nhớ tĩnh (stack)
• Vùng nhớ được sử dụng để lưu trữ các biến toàn cục và lời
gọi hàm
• Hai toán tử được sử dụng
• new: cấp phát
void Foo (void)
• delete: thu hồi {
int *ptr = new int;
char *str = new char[10];
//...
delete ptr;
delete [ ]str;
}
Các kiểu dữ liệu tự định nghĩa
Cấu trúc (struct)
• Một cấu trúc dữ liệu là một tập hợp của các thanh phần (trường
– field) có các kiểu dữ liệu khác nhau được gộp lại với một cái
tên duy nhất.
• Dạng thức
struct <tên_kiểu_cấu_trúc>
{
//Khai báo các thành phần cấu trúc
//…
} <tên_cấu trúc>;
• Khai báo biến, mảng cấu trúc:
tên_kiểu_cấu_trúc danh sách biến, mảng cấu trúc;
Cấu trúc
• Ví dụ:
struct thi_sinh
{
char hoten[25];
long sobaodanh;
float diemToan, diemLy, diemHoa, trungbinh;
};
thi_sinh ts1, ts_2, bachkhoa[3000]];
thi_sinh *p_ts;
• Hoặc
struct thi_sinh
{
char hoten[25];
long sobaodanh;
float diemToan, diemLy, diemHoa, trungbinh;
} bachkhoa[2000], kinhte[2000], caodang[2000];
Cấu trúc
• Truy cập vào thanh phần cấu trúc: sử dụng toán tử ‘.’ đối với biến cấu
trúc hoặc mũi tên ‘->’đối với con trỏ cấu trúc theo dạng thức:
Tên_biến_cấu_trúc.tên_thành_phần
Tên_con_trỏ_cấu_trúc->tên_thành_phần
• Ví dụ:
ts1.sobaodanh = 12345;
cout<<p_ts->hoten;
bachkhoa[5].diemToan=10;
Cấu trúc
• Struct lồng nhau:
• Có thể khai báo bên ngoài hoặc trực tiếp các trường dữ liệu của một
cấu trúc bên trong cấu trúc khác.
• Ví dụ:
struct diem_thi{
float dToan, dLy, dHoa; struct thi_sinh{
}; char SBD[10];
struct thi_sinh{ char ho_va_ten[30];
char SBD[10]; struct [diem_thi]{
char ho_va_ten[30]; float dToan, dLy, dHoa;
diem_thi ket_qua; } ket_qua;
} thi_sinh_1, thi_sinh_2; } thi_sinh_1, thi_sinh_2;

Truy cập:
thi_sinh1.ket_qua.dToan = 10;
Cấu trúc
• Khởi tạo biến cấu trúc: Có thể gán giá trị khởi đầu cho một biến
cấu trúc, theo nguyên tắc như kiểu mảng
• Ví dụ:
struct Date{
int day;
int month;
int year;
};
struct{
char hoTen[50];
Date ngaysinh;
} SV = {“Tran Van Anh", 20, 12, 1990 };
Cấu trúc
#include <iostream>
using namespace std;
• Gán giữa các biến cấu trúc: Sử struct point_3D{
float x;
dụng toán tử gán ‘=‘ để gán các float y;
thanh phần của các biến cấu trúc float z;
} p1, p2;
với nhau
biến_cấu_trúc1 = biến_cấu trúc_2 int main()
{
• Ví dụ: p1={1,2,3};
cout <<"Toa do cua p1: “;
cout<<“("<<p1.x<<","<<p1.y<<","<<p1.z<<")"<<endl;
p2=p1;
cout <<"Toa do cua p1: “;
cout<<“("<<p1.x<<","<<p1.y<<","<<p1.z<<")"<<endl;
}
Hợp (union)
• Union cho phép một phần bộ nhớ có thể được truy xuất dưới dạng nhiều kiểu dữ
liệu khác nhau.
• Tất cả các phần tử của union đều chiếm cùng một chỗ trong bộ nhớ.
• Kích thước của nó là kích thước của phần tử lớn nhất.
• Dạng thức
union <tên_kiểu_hợp>
{
//Khai báo các thành phần của hợp
//…
} <tên_hợp>;
• Khai báo biến, mảng Union :
tên_kiểu_hợp danh sách biến, mảng hợp;
Hợp (union)
• Ví dụ:
union mytypes_t
{
char c;
int i;
float f;
} mytypes;
• định nghĩa ba phần tử: mytypes.c, mytypes.i, mytypes.f chiếm cùng chỗ trong
bộ nhớ, kích thước 4 bytes (float).
Hợp (union)
• Các union vô danh
Ví dụ Union: Ví dụ Union vô danh:
struct { struct {
char title[50]; char title[50];
char author[50]; char author[50];
union { union {
float dollars; float dollars;
int yens; int yens;
} price; };
} book; } book;
Truy cập: Truy cập:
book.price.dollars book.dollars
book.price.yens book.yens
Kiểu liệt kê (enum)
• Tập hợp các tên hằng trong tập giá trị của 1 kiểu dữ liệu nào đó.
• Dạng thức:
enum <kiểu_liệt_kê>
{
//Khai báo các giá trị trong kiểu liệt kê
} <tên_biến_liệt_kê>;
• Khai báo:
kiểu_liệt_kê danh sách biến, mảng liệt kê;
• Ví dụ:
• enum bool {false, true};
• Chú ý: không sử dụng bất kì một kiểu dữ liệu trong phần khai báo.
Kiểu dữ liệu mới được tạo ra mà không dựa trên kiểu dữ liệu có sẵn.
Kiểu liệt kê (enum)
• Khai báo và sử dụng:
enum colors_t {black, blue, green, cyan, red, purple, yellow, white};
colors_t mycolor;
mycolor = blue;
if (mycolor == green) cout <<“mau xanh luc”;
• Kiểu liệt kê khi dịch là một tập số nguyên và các giá trị của nó là các hằng
số nguyên được chỉ định.
• Giá trị mặc định của phần tử đầu tiên là 0 và các giá trị tiếp theo cứ thế
tăng lên 1. Vì vậy, black ~ 0, blue ~ 1, green ~ 2 …
• enum {black=3, blue=5, green, cyan, red, purple, yellow, white} color;
• green=?
• white=?
Kiểu dữ liệu tự định nghĩa (typedef)
• C++ cho phép chúng ta định nghĩa các kiểu dữ liệu của riêng mình dựa
trên các kiểu dữ liệu đã có.
• Dạng thức:
• typedef   kiểu_dữ_liệu tên_kiểu_mới;
• Ví dụ
Khai báo: Sử dụng:
typedef char C; C achar,
anotherchar,
typedef unsigned int WORD;
*ptchar1;
typedef char * string_t; WORD myword;
typedef char field [50]; string_t ptchar2;
field name;
Chúc các em học tốt!

You might also like