Nộidung chương 2
2.1 Tổ chứcchương trình C/C++
2
2
Biế
à
á
kiể
dữ
liệ
bả
2
.
2
Biế
nv
à
c
á
c
kiể
u
dữ
liệ
ucơ
bả
n
2.3 Các kiểudữ liệudẫnxuấttrựctiếp
2
4
Định
nghĩa
kiểu
dữ
liệu
mới
2
.
4
Định
nghĩa
kiểu
dữ
liệu
mới
2.5 Các lệnh ₫iều khiển chương trình
2
.
6
Hàm và thư viện
2
.
6
Hàm
và
thư
viện
Chương 2: Tổng quan về C và C++
2
2.1 Tổ chức chương trình C/C++
T
d
á
dù
gi ltdi t
200
8
T
ạo
d
ự
á
n
dù
n
g
v
i
sua
l
s
t
u
di
o .ne
t
200
8
Chương 2: Tổng quan về C và C++
3
Chương trình tính giai thừa: Phiên bảnC
#include <stdio.h>
#include <conio.h>
int
gthua
(
int
);
Lệnh tiềnxử lý: Khai báo sử dụng hàm thư viện
Khai báo hàm
int
gthua
(
int
);
void main() {
char c = 'N';
int N = 1;
it
k
Lời chú thích
Chương trình chính
Khai báo biến
i
n
t
k
q;
do {
printf(“\n Nhap mot nguyen duong"); /* Viet ra man hinh*/
scanf("%d",&N); /* Nhap tu ban phim cho N*/
k
q
=
g
thua
(
N
);
q
g
();
printf(“\n Giai thua cua %d la %d", N, kq);
printf(“\n Ban co muon tiep tuc khong? Y/N");
c = getch();
} while (c=='y' || c=='Y');
}
}
int gthua(int n) {
int kq = 1;
while (n > 1)
k
q
*= n
;
Định nghĩa hàm (thân hàm)
Chương 2: Tổng quan về C và C++
4
q
;
return kq;
}
Chương trình tính giai thừa: Phiên bản C++
#include <iostream.h>
#include <conio.h>
int
g
thua
(
int
);
g
(
);
void main() {
char c = 'N';
int N = 1;
do
{
do
{
cout << “\nNhap mot so nguyen duong: “
cin >> N;
int kq = gthua(N);
cout << “\nGiai thua cua ” << N << “ la “ << kq
cout << “\nBan co muon tiep tuc khong? Y/N";
c = getch();
} while (c == 'y' || c == 'Y');
}
int gthua(int n) {
int kq = 1;
while (n > 1)
kq *= n ;
Chương 2: Tổng quan về C và C++
5
return kq;
}
Qui tắc soạn thảo mã nguồn
1. Tên biến, tên hàm, tên kiểumới:
Tránh sử dụng các từ khóa và tên kiểucơ sở
C
hỉ
₫
dù
á
ký
t
‘A’ ’Z’ ‘
’’
’‘
0
’’
9
’
‘’
C
hỉ
₫
ư
ợ
c
dù
ng c
á
c
ký
t
ự sau:
‘A’
’Z’
,
‘
a
’
’
z
’
,
‘
0
’
’
9
’
,
‘
_
’
Chỉ₫ượcbắt ₫ầubằng chữ cái hoặc dấu _
Phân biệtgiữachữ hoa và chữ thường.
Nên ₫ặt tên ngắn gọn và có ý nghĩa (có tính mô tả)
2. Sau mỗicâulệnh có chấmphảy (;)
3
Đ
{}
₫
i
là
hó
lệ h
khô
ó
dấ
3
.
Đ
oạn
{
…
}
₫
ượcco
i
là
n
hó
m
lệ
n
h
,
khô
ng c
ó
dấ
u
chấmphảysau₫ó, trừ khi khai báo kiểu
4
Cấu
trúc
mã
nguồn
theo
kiểu
phân
cấp
=>
dễ
₫ọc
4
.
Cấu
trúc
mã
nguồn
theo
kiểu
phân
cấp
=>
dễ
₫ọc
5. Bổ sung chú thích hợplý(/*
chú thích một ₫oạn
*/ hoặc
//
chú thích một dòng
)
Chương 2: Tổng quan về C và C++
6
6. Chia một file lớn thành nhiều file nhỏ
Các từ khóa trong C
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for si
g
ned void
g
default goto sizeof volatile
do if static while
Chương 2: Tổng quan về C và C++
7
Từ khóa trong C++
asm auto bool break
case catch char class
const
const cast
continue
default
const
const
_
cast
continue
default
delete else extern do
enum false double explicit
float
dynamic cast
export
for
float
dynamic
_
cast
export
for
friend goto if inline
int long mutable namespace
new
operator
private
protected
new
operator
private
protected
public register reinterpret_cast return
short signed sizeof static
static cast
struct
switch
template
static
_
cast
struct
switch
template
this throw true try
typedef typeid typename union
unsigned
using
virtual
void
Chương 2: Tổng quan về C và C++
8
unsigned
using
virtual
void
volatile wchar_t while
Biên dịch (compile)
Trong Visual studio .Net 2008: Gọi Compile (Ctrl + F7) ₫ể biên
dịch riêng rẽ hoặc Build (F6) ₫ể kết hợp biên dịch và liên kết
cho toàn bộ dự án
cho
toàn
bộ
dự
án
Các kiểu lỗi biên dịch (compile error):
—Lỗi cú pháp: Sử dụng tên sai qui ₫ịnh hoặc chưa khai báo, thiếu
dấuchấmphảy; dấu ₫óng }
dấu
chấm
phảy
;
,
dấu
₫óng
}
—Lỗi kiểu: Các số hạng trong biểu thức không tương thích kiểu, gọi
hàm với tham số sai kiểu
—
…
…
Các kiểu cảnh báo biên dịch (warning):
—Tự ₫ộng chuyển ₫ổi kiểu làm mất chính xác
Hàm khai báo có kiểutrả về nhưng không trả về
—
Hàm
khai
báo
có
kiểu
trả
về
nhưng
không
trả
về
—Sử dụng dấu = trong trường hợp nghi vấn là so sánh ==
—…
Chương 2: Tổng quan về C và C++
9
Liên kết (link)
Liên kết là quá trình ghép nhiều file ₫ích (*.obj, *.lib)
₫ể
tạo
r
a
c
h
ươ
n
g
t
rình
c
h
ạy
cuố
i
cù
n
g
*
.e
x
e
₫ể
tạo
a
c ươ g
t
c ạy
cuố
cù g
.e e
Trong Visual studio .Net 2008: Gọi Build (F6)
Lỗi liên kếtcóthể là do:
—
S
ử
dụng hàm nhưng không có ₫ịnh nghĩahàm
—Biếnhoặchàm₫ược ₫ịnh nghĩa nhiềulần
—…
Chương 2: Tổng quan về C và C++
10
Chạy thử và gỡ rối (debug)
Chạy thử trong Visual studio .Net 2008: Start
without debugging hoặc Ctrl+F5
Tìm lỗi:
—Lỗi khi chạy là lỗi thuộc về phương pháp, tư duy, thuật toán,
không phảivề cú pháp
không
phải
về
cú
pháp
—Lỗi khi chạy bình thường không ₫ược báo
—Lỗi khi chạy rất khó phát hiện, vì thế trong ₫a số trường hợp
cầntiếnhành
debug
cần
tiến
hành
debug
.
Chạy Debug trong Visual studio .Net 2008:
—Chạy tới chỗ ₫ặt cursor: F9
—Chạy từng dòng lệnh: F10
—Chạy vào trong hàm: F11
—
Chạytiếpbìnhthường:
F
5
Chương 2: Tổng quan về C và C++
11
Chạy
tiếp
bình
thường:
F
5
—Xem kết quả dưới cửa sổ Output hoặc gọi QuickWatch
Tổ chức bộ nhớ
Hệ điều hành
Mã chương trình
Các CT khác
Đỉnh ngăn xếp
Dữ liệu toàn cục
Vùng nhớ tự do
Array_A
n
SP
Ngăn xếp
(th biế biế
Vùng
nhớ
tự
do
i
k
f
(th
am
biế
n,
biế
n
cục bộ)
Vùng nhớ tự do
a
count
i
Chương 2: Tổng quan về C và C++
12
2.2 Biến và dữ liệu
Biểu thức = dữ liệu + phép toán
Biểu diễn dữ liệu: Thông qua biến hoặc hằng số, kèm
theo kiểu
Nội dung trong phần này:
Cá kiể dữ liệ bả
—
Cá
c
kiể
u
dữ
liệ
u cơ
bả
n
— Các phép toán áp dụng
—Tương thích và chuyển ₫ổi kiểu
—
Khai báo biến, phân loại biến
Chương 2: Tổng quan về C và C++
13
2.2.1 Các kiểu dữ liệu cơ bản của C/C++
Kiểu Kích cỡ thông dụng Phạm vi tối thiểu
(tính bằng bit)
cha
r
8 −127 to 127
signed char 8 −127 127
unsigned char 8 0 255
int 16/32 −32767 32767
signed int
16/32
nt
signed
int
16/32
-
nt
-
unsigned int 16/32 0 65535
short 16 −32767 32767
signed short 16 nt
unsigned short 16 0 65535
long 32 −2147483647 2147483647
signed long 32 nt
unsigned long
32
0 4294967295
unsigned
long
32
0
4294967295
float 32 Độ chính xác 6 chữ số
double 64 Độ chính xác 10 chữ số
long double 80 Độ chính xác 10 chữ số
bl
(C )
Chương 2: Tổng quan về C và C++
14
b
oo
l
(C
++
)
wchar_t (C++) 16 −32767 32767
Các phép toán cơ bản
Phép toán Ký hiệuKiểu nguyên Kiểu số thựcKiểu bool
Gán
=
XXX
Số h
* /
X
X
Số
h
ọc
+,
-,
*
,
/
,
+=, -=, *=, /=
X
X
x
%, %=
Xx
++,
Xx
So sánh
>, <, >=, <=,
==, !=
XXX
Logic
&&, ||, !
XXX
Logic bit
&, |, ^, ~
&
=
, |
=
,
^=
Xx
&, |,
Dịch bit
<<,>>, <<=,>>=
Xx
Lựa chọn
? :
XXX
Lũ thừ ?
Khô ó!
Chương 2: Tổng quan về C và C++
15
Lũ
y
thừ
a
?
Khô
ng c
ó!
Tương thích và chuyển ₫ổi kiểu
Những kiểu dữ liệu tương thích nhau có thể tự ₫ộng
chuyển ₫ổi kiểu:
—
Giữacáckiểusố nguyên với nhau (lưuý phạm vi giá trị)
—Giữacáckiểusố thựcvới nhau (lưuý ₫ộ chính xác)
—
G
i
ữa
các
ki
ểu
số
n
guyê
n
và
số
t
h
ực
(
l
ưu
ý
p
h
ạ
m
v
i
g
i
á
t
r
ị
và
G ữa
các
ểu
số
guyê
và
số
t ực
(
ưu
ý
p ạ
v
gá
t ị
và
₫ộ chính xác)
—Kiểu bool sang số nguyên, số thực: true => 1, false => 0
—
Số
nguyên
số
thực
sang
kiểu
bool
:
≠
0
=> true
0
=> false
Số
nguyên
,
số
thực
sang
kiểu
bool
:
≠
0
=>
true
,
0
=>
false
Nếucólỗihoặccảnh báo => khắcphụcbằng cách ép
chuyển ₫ổikiểu
—
VD:
i = int(5.1) % 2; //C
j
=
(
int
)
5.1 + 2
;
// C++
Chương 2: Tổng quan về C và C++
16
j(
)
;
2.2.2 Khai báo biến
char c = 'N';
bool b = true;
int kq;
Khai báo và khởi tạo giá trị
Chỉ khai báo giá trị bất ₫ịnh
double d;
long count, i=0;
unsigned vhexa=0x00fa;
unsigned
voctal
0
82;
Chỉ
khai
báo
,
giá
trị
bất
₫ịnh
Khai báo kết hợp, chỉ i=0
Đặt giá trị ₫ầu hexa
Đặtiátị ₫ầ tl
66
hứ khô hải
82
C: Toàn bộ biến phải khai báo ngay ₫ầu thân hàm
C++: Có thể khai báo
tại
chỗ nào cần
unsigned
voctal
=
0
82;
Đặt
g
iá
t
r
ị
₫ầ
u oc
t
a
l
->
66
c
hứ
khô
ng p
hải
82
C++:
Có
thể
khai
báo
tại
chỗ
nào
cần
Phân loại biến:
—Biến toàn cục: Khai báo ngoài hàm, lưu giữ trong vùng nhớ dữ liệu
chương trình
chương
trình
—Biến cục bộ: Khai báo trong thân hàm, lưu giữ trong ngăn xếp
(vùng nhớ tự do)
—Tham biến: Khai báo trên danh sách tham số của hàm
,
lưu
g
iữ
Chương 2: Tổng quan về C và C++
17
, g
trong ngăn xếp
Ví dụ khai báo các loại biến
int N = 1;
void main() {
char
c
='
N
'
;
Biến toàn cục
char
c
N;
do {
cout<<“\nNhap so> 0:";
cin>>N;
int
kq
=
gthua
(N
);
Biếncụcbộ
int
kq
gthua
(N
);
} while (c == 'y' || c == 'Y')
}
Hai biến cục bộ
Biến
cục
bộ
int gthua(int n) {
int kq = 1;
while (n > 1)
kq
*=
n
;
cùng tên ở hai phạm
vi khác nhau,
không liên quan gì
₫ến nhau!
kq
n
;
return kq;
}
Tham biến
₫ến
nhau!
Chương 2: Tổng quan về C và C++
18
Tham
biến
2.3 Các kiểu dữ liệu dẫn xuất trực tiếp
Kiểu liệt kê
Kiểu hằng
Kiểu con trỏ
Kiểu mảng
Kiểu tham chiếu (C++)
Chương 2: Tổng quan về C và C++
19
2.3.1 Kiểu liệt kê (enum)
ể
Tương tự như một ki
ể
u số nguyên.
Được dùng khi:
—Cần hạn chế phạm vi sử dụng
—Hoặc khi muốn sử dụng tên cụ thể thay cho hằng số nguyên
Ví dụ
void main()
{
enum Color {Red Green Blue};
enum
Color
{Red
,
Green
,
Blue};
enum WeekDay {Mon = 2,Tue, Wed, Thu, Fri, Sat, Sun = 1 };
//Tue=3, Wed=4…
int n=Red;
cout<<n; //
in ra số
0
cout<<n;
//
in
ra
số
0
Color c=Green;
n=c; //n=1;
}
Lưu ý: không thể gán trực tiếp một giá trị nguyên cho một biến
enum mà phải ép kiểu
VD:
c=
2
;//
Error
Chương 2: Tổng quan về C và C++
20
VD:
c=
2
;//
Error
c=Color(2);//OK
2.3.2 Kiểu hằng (const)
Khi muốn một biến không bị thay ₫ổi trong suốt
chương trình => khai báo hằng số
void main() {
const double pi = 3.1412;
const int x= 1;
pi = 3.14; // error
x
=
2
;
//
error
x
2
;
//
error
}
Chương 2: Tổng quan về C và C++
21
2.3.3 Kiểu con trỏ
Trong chương trình, mỗibiếnchiếmmộtsố byte
nhất ₫ịnh và lưu ở mộtvị trí cụ thể trong bộ nhớ
máy
tính
máy
tính
Con trỏ là mộtbiếnmang₫ịachỉ củamộtô nhớ
(
của m
ộ
tbiếnkhácho
ặ
cm
ộ
thàm
)
(
ộ
ặ
ộ
)
Cách khai báo: Data_type* pointer_var_name;
int x = 2;
int
*
p =
&
x
;
// p
chua dia chi cua x
int
p =
&
x
;
// p
chua dia chi cua x
*p = 3; // x=3
int y;
p
= &
y
;
//
p
chua dia chi cua
y
p
y
;
//
py
*p = 5; // y = 5, x = 3
Chương 2: Tổng quan về C và C++
22
Kết luậnvề con trỏ
Con trỏ là mộtbiếnchứa ₫ịachỉ byte ₫ầu củamộtbiếndữ liệu,
₫ượcsử dụng ₫ể truy cập gián tiếpdữ liệu ₫ó
N
ế
u
khai báo
con
trỏ
mà
không
khởi
tạo
mặc
₫ịnh
con
trỏ
mang
N
ế
u
khai
báo
con
trỏ
mà
không
khởi
tạo
,
mặc
₫ịnh
con
trỏ
mang
một ₫ịachỉ bất ₫ịnh
Để khởi tạo giá trị cho con trỏ, ta có thể cho nó trỏ vào một ₫ịa
chỉ nhớ cụ thể hoặc ₫ịachỉ củamộtbiến khác thông qua toán tử
chỉ
nhớ
cụ
thể
hoặc
₫ịa
chỉ
của
một
biến
khác
thông
qua
toán
tử
lấy ₫ịa chỉ &
Con trỏ có thể mỗi lúc ₫ại diện cho một biến dữ liệu khác, do ₫ó
₫
ị
a
chỉ mà
con
trỏ
mang
có
th
ể
thay ₫
ổ
i ₫
ượ
c
₫
ị
a
chỉ
mà
con
trỏ
mang
có
th
ể
thay
₫
ổ
i
₫
ượ
c
.
Dùng toán tử * ₫ể truy nhập nội dung của biến mà con trỏ trỏ
tới, có thể ₫ọc hoặc thay ₫ổi nội dung của biến ₫ó.
Kh
b
d
h
d
ế
ỏ
Kh
ông
b
ao gi
ờ
s
ử
d
ụng toán t
ử
truy n
h
ậpnội
d
ung, n
ế
ucon tr
ỏ
chưamangmột ₫ịachỉ ô nhớ mà chương trình có quyềnkiểm
soát
Chương 2: Tổng quan về C và C++
23
2.3.4 Kiểu mảng
012 N-1
Chỉ số
₫
ị
achỉ₫ầu
₫ịa chỉ cuối
Số phầntử củamảng: N
Số
lượng
các
phần
tử củamảng (tĩnh) là
cố
₫ịnh
ị
Số
lượng
các
phần
tử
của
mảng
(tĩnh)
là
cố
₫ịnh
Các phầntử có cùng kiểu
Các phầntử₫ượcsắpxếpkế tiếptrongbộ nhớ
C
hể
h
hầ
h
d
h
hỉ
ố
C
ót
hể
truy n
h
ậptừng p
hầ
nt
ử
mộtcác
h
t
ự
d
o t
h
eo c
hỉ
s
ố
hoặctheo₫ịachỉ
Chương 2: Tổng quan về C và C++
24
Khai báo mảng
Số phầntử củamảng phảilàhằng số nguyên.
Khai báo không khởitạo:
int a[5];
enum {index = 5};
double b[index];
const int N = 2;
char c[N];
Khai báo vớisố
p
hầnt
ử
và khởit
ạ
o
g
iá tr
ị
các
p
hầnt
ử
p
ạ
g
ị
p
int d[3]= {1, 2, 3};
double e[5]= {1, 2, 3};
char f
[
4
]
=
{
0
};
[
]{
};
Chương 2: Tổng quan về C và C++
25
Khai báo mảng (tiếp)
Khai báo và khởitạo giá trị các phầntử, số phầntử₫ượctự
₫ộng xác ₫ịnh
it
[] {1 2 3 4 5}
i
n
t
a
[]
=
{1
,
2
,
3
,
4
,
5}
;
double b[]= {1, 2, 3};
double c[]= {0};
h [] {‘ ’}
c
h
ar
s
[]
=
{‘
a
’}
;
Khai báo mảng nhiềuchiều
double M[2][3];
int X[3][]={{1,2},{3,4},{5,6}};
short T[3][2]={1,2,3,4,5,6};
Chương 2: Tổng quan về C và C++
26