Professional Documents
Culture Documents
• 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++
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;
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ý
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.
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,...)
false true
heightA > heightB
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
counter = 1
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ố
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
nums[2]
=? Kích
thước
int nums[3] = {5, 10}; int nums[ ] = {5, 10, 15}; mảng ?
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ỉ
*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 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
?
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
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
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!