
Ch ng 1ươ
C++ và l p tr nh h ng đ i t ngậ ỡ ướ ố ượ
Trong ch ng này tr nh b y c c v n đ sau:ươ ỡ ầ ỏ ấ ề
- Cách s d ng ph n m m TC++ 3.0ử ụ ầ ề
- Nh ng s a đ i c n thi t m t ch ng tr nh C đ bi n nóữ ử ổ ầ ế ộ ươ ỡ ể ế
thành m t ch ng tr nh C++ (ch y đ c trong môi tr ng C++)ộ ươ ỡ ạ ượ ườ
- Tóm l c v các ph ng pháp l p tr nh c u trỳc và l p tr nhượ ề ươ ậ ỡ ấ ậ ỡ
h ng đ i t ngướ ố ượ
- Nh ng m r ng c a C++ so v i Cữ ở ộ ủ ớ
§ 1. Làm vi c v i TC++ 3.0ệ ớ
Các ví d trong cu n sách này s vi t và th c hi n trên môiụ ố ẽ ế ự ệ
tr ng TC++ 3.0. B cài đ t TC++ 3.0 g m 5 đĩa. Sau khi cài đ tườ ộ ặ ồ ặ
(gi s vào th m c C:\TC) th trong th m c TC s g m các thả ử ư ụ ỡ ư ụ ẽ ồ ư
m c con sau:ụ
C:\TC\BGI ch a các t p đuôi BGI và CHRứ ệ
C:\TC\BIN ch a các t p ch ng tr nh (đuôi EXE) nh TC,ứ ệ ươ ỡ ư
TCC, TLIB, TLINK
C:\TC\INCLUDE ch a các t p tiêu đ đuôi Hứ ệ ề
C:\TC\LIB ch a các t p đuôi LIB, OBJứ ệ
Đ vào môi tr ng c a TC++ ch c n th c hi n t p ch ngể ườ ủ ỉ ầ ự ệ ệ ươ
tr nh TC trong th m c C:\TC\BIN . K t qu nh n đ c h menuỡ ư ụ ế ả ậ ượ ệ
chính c a TC++ v i m u n n xanh g n gi ng nh h menu quenủ ớ ầ ề ầ ố ư ệ
thu c c a TC (Turbo C). H menu c a TC++ g m các menu: File,ộ ủ ệ ủ ồ
Edit, Search, Run, Compile, Debug, Project, Options, Window,
Help.
Cách so n th o, biên d ch và ch y ch ng tr nh trong TC++ạ ả ị ạ ươ ỡ
cũng gi ng nh trong TC, ngo i tr đi m sau: T p ch ng tr nhố ư ạ ừ ể ệ ươ ỡ
trong h so n th o c a TC++ cú đuôi m c đ nh là CPP cũn trongệ ạ ả ủ ặ ị
TC th t p ch ng tr nh lu n có đuôi C.ỡ ệ ươ ỡ ụ
Trong TC++ có th th c hi n c ch ng tr nh C và C++. Để ự ệ ả ươ ỡ ể
th c hi n ch ng tr nh C c n d ng đuôi C đ đ t tên cho t pự ệ ươ ỡ ầ ự ể ặ ệ
ch ng tr nh, đ th c hi n ch ng tr nh C++ c n d ng đuôi CPPươ ỡ ể ự ệ ươ ỡ ầ ự
đ đ t tên cho t p ch ng tr nh.ể ặ ệ ươ ỡ
§ 2. C và C++
- Có th nói C++ là s m r ng (đáng k ) c a C. Đi u đó cóể ự ở ộ ể ủ ề
nghĩa là m i kh năng, m i khái ni m trong C đ u dùng đ cọ ả ọ ệ ề ượ
trong C++.
- V trong C++ s d ng g n nh toàn b các khái ni m, đ nhỡ ử ụ ầ ư ộ ệ ị
nghĩa, các ki u d li u, các c u trúc l nh, các hàm và các công cể ữ ệ ấ ệ ụ
khác c a C, nên yêu c u b t bu c đ i v i các đ c gi C++ là ph iủ ầ ắ ộ ố ớ ọ ả ả
bi t s d ng t ng đ i thành th o ngôn ng C.ế ử ụ ươ ố ạ ữ
- V C++ là s m r ng c a C, n n b n thõn m t ch ng tr nhỡ ự ở ộ ủ ờ ả ộ ươ ỡ
C đó là ch ng tr nh C++ (ch c n thay đuôi C b ng đuôi CPP).ươ ỡ ỉ ầ ằ
Tuy nhiên Tr nh bi n d ch TC++ y u c u m i hàm chu n dùngỡ ờ ị ờ ầ ọ ẩ
trong ch ng tr nh đ u ph i khai báo nguyên m u b ng m t câuươ ỡ ề ả ẫ ằ ộ
l nh #include, trong khi đi u này không b t bu c đ i v i Tr nhệ ề ắ ộ ố ớ ỡ
bi n d ch c a TC.ờ ị ủ
Trong C có th dùng m t hàm chu n mà b qua câu l nhể ộ ẩ ỏ ệ
#include đ khai báo nguyên m u c a hàm đ c dùng. Đi u nàyể ẫ ủ ượ ề
không báo l i khi biên d ch, nh ng có th d n đ n k t qu sai khiỗ ị ư ể ẫ ế ế ả
ch y ch ng tr nh.ạ ươ ỡ
Ví dụ khi biên d ch ch ng tr nh sau trong m i tr ng C sị ươ ỡ ụ ườ ẽ
không g p các dũng c nh b o (Warning) và th ng b o l i (error).ặ ả ỏ ụ ỏ ỗ
Nh ng khi ch y s nh n đ c k t qu sai.ư ạ ẽ ậ ượ ế ả
#include <stdio.h>
void main()
{
float a,b,c,p,s;
printf("\nNhap a, b, c ");
6 7

scanf("%f%f%f",&a,&b,&c);
p=(a+b+c)/2;
s= sqrt(p*(p-a)*(p-b)*(p-c));
printf("\nDien tich = %0.2f",s);
getch();
}
N u biên d ch ch ng tr nh này trong TC++ s nh n đ c cácế ị ươ ỡ ẽ ậ ượ
thông báo l i sau:ỗ
Eror: Funtion ‘sqrt’ should have a prototype
Eror: Funtion ‘getch’ should have a prototype
Đ bi n ch ng tr nh tr n thành m t ch ng tr nh C++ c n:ể ế ươ ỡ ờ ộ ươ ỡ ầ
+ Đ t tên ch ng ch ng v i đuôi CPPặ ươ ườ ớ
+ Thêm 2 câu l nh #include đ khai báo nguyên m u cho cácệ ể ẫ
hàm sqrt, getch:
#include <math.h>
#include <conio.h>
§ 3. L p tậrình c u trấúc và l p trậình h ng đ i t ngướ ố ượ
3.1. Ph ng pháp l p tr nh c u trỳcươ ậ ỡ ấ
- T t ng chính c a l p tr nh c u trỳc là t ch c ch ngư ưở ủ ậ ỡ ấ ổ ứ ươ
tr nh thành c c ch ng tr nh con. Trong PASCAL cú 2 ki uỡ ỏ ươ ỡ ể
ch ng tr nh con là th t c và hàm. Trong C ch cú m t lo iươ ỡ ủ ụ ỉ ộ ạ
ch ng tr nh con là hàm. ươ ỡ
Hàm là m t đ n v ch ng tr nh đ c l p dùng đ th c hi nộ ơ ị ươ ỡ ộ ậ ể ự ệ
m t ph n vi c nào đó nh : Nh p s li u, in k t qu hay th c hi nộ ầ ệ ư ậ ố ệ ế ả ự ệ
m t s tính toán. Hàm c n có đ i và các bi n, m ng c c b dùngộ ố ầ ố ế ả ụ ộ
riêng cho hàm.
Vi c trao đ i d li u gi a các hàm th c hi n thông qua các đ iệ ổ ữ ệ ữ ự ệ ố
và các bi n toàn b .ế ộ
Các ngôn ng nh C, PASCAL, FOXPRO là các ngôn ng choữ ư ữ
phép tri n khai ph ng pháp l p tr nh c u trỳc.ể ươ ậ ỡ ấ
M t ch ng tr nh c u trỳc g m c c c u trỳc d li u (nhộ ươ ỡ ấ ồ ỏ ấ ữ ệ ư
bi n, m ng, b n ghi) và các hàm, th t c.ế ả ả ủ ụ
Nhi m v chính c a vi c t ch c thi t k ch ng tr nh c uệ ụ ủ ệ ổ ứ ế ế ươ ỡ ấ
trỳc là t ch c ch ng tr nh thành c c hàm, th t c: Ch ngổ ứ ươ ỡ ỏ ủ ụ ươ
tr nh s bao g m c c hàm, th t c nào.ỡ ẽ ồ ỏ ủ ụ
Ví dụ xét yêu c u sau: Vi t ch ng tr nh nh p to đ (x,y)ầ ế ươ ỡ ậ ạ ộ
c a m t d y đi m, sau đó t m m t c p đi m cách xa nhau nh t. ủ ộ ẫ ể ỡ ộ ặ ể ấ
Trên t t ng c a l p tr nh c u trỳc cú th t ch c ch ngư ưở ủ ậ ỡ ấ ể ổ ứ ươ
tr nh nh sau:ỡ ư
+ S d ng 2 m ng th c toàn b x và y đ ch a to đ d yử ụ ả ự ộ ể ứ ạ ộ ẫ
đi mẻ
+ Xây d ng 2 hàm:ự
Hàm nhapsl dùng đ nh p to đ n đi m, hàm này có m t đ iể ậ ạ ộ ể ộ ố
là bi n nguyên n và đ c khai báo nh sau:ế ượ ư
void nhapsl(int n);
Hàm do_dai dùng đ tính đ dài đo n th ng đi qua 2 đi m cóể ộ ạ ẳ ể
ch s là i và j , nó đ c khai báo nh sau:ỉ ố ượ ư
float do_dai(int i, int j);
Ch ng tr nh C cho bài to n tr n đ c vi t nh sau:ươ ỡ ỏ ờ ượ ế ư
#include <stdio.h>
#include <conio.h>
#include <math.h>
float x[100],y[100];
float do_dai(int i, int j)
{
return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
}
void nhapsl(int n)
8 9

{
int i;
for (i=1;i<=n;++i)
{
printf("\nNhap toa do x, y cua diem thu %d : ",i);
scanf("%f%f",&x[i],&y[i]);
}
}
void main()
{
int n,i,j,imax,jmax;
float d,dmax;
printf("\nSo diem N= ");
scanf("%d",&n);
nhapsl(n);
dmax=do_dai(1,2); imax=1;jmax=2;
for (i=1;i<=n-1;++i)
for (j=i+1;j<=n;++j)
{
d=do_dai(i,j);
if (d>dmax)
{
dmax=d;
imax=i;
jmax=j;
}
}
printf("\nDoan thang lon nhat co do dai bang: %0.2f",dmax);
printf("\n Di qua 2 diem co chi so la %d va %d",imax,jmax);
getch();
}
3.2. Ph ng pháp l p tr nh h ng đ i t ngươ ậ ỡ ướ ố ượ
+ Kh i ni m trung tõm c a l p tr nh h ng đ i t ng là l pỏ ệ ủ ậ ỡ ướ ố ượ ớ
(class). Có th xem l p là s k t h p các thành ph n d li u vàể ớ ự ế ợ ầ ữ ệ
các hàm. Cũng có th xem l p là s m r ng c a c u trúc trong Cể ớ ự ở ộ ủ ấ
(struct) b ng cách đ a thêm vào các ph ng th c (method) hay cũnằ ư ươ ứ
g i là hàm thành vi n (member function). M t l p đ c đ nh nghĩaọ ờ ộ ớ ượ ị
nh sau:ư
class Tên_L pớ
{
// Khai báo các thành ph n d li uầ ữ ệ
// Khai báo các ph ng th cươ ứ
};
+ Các ph ng th c có th đ c vi t (xây d ng) bên trong ho cươ ứ ể ượ ế ự ặ
bên ngoài (phía d i) ph n đ nh nghió l p. C u trỳc (c ch vi t)ướ ầ ị ớ ấ ỏ ế
ph ng th c t ng t nh hàm ngo i tr quy t c sau: Khi xâyươ ứ ươ ự ư ạ ừ ắ
d ng m t ph ng th c bên ngoài đ nh nghĩa l p th trong dũngự ộ ươ ứ ị ớ ỡ
đ u tiên c n dùng tên l p và 2 d u : đ t tr c tên ph ng th c đầ ầ ớ ấ ặ ướ ươ ứ ể
ch r ph ng th c thu c l p nào (xem ví d bên d i).ỉ ừ ươ ứ ộ ớ ụ ướ
+ S d ng các thành ph n d li u trong ph ng th c: Vử ụ ầ ữ ệ ươ ứ ỡ
ph ng th c và các thành ph n d li u thu c cùng m t l p và vươ ứ ầ ữ ệ ộ ộ ớ ỡ
ph ng th c đ c l p lên c t đ x lý c c thành ph n d li u,ươ ứ ượ ậ ố ể ử ỏ ầ ữ ệ
n n trong thõn c a ph ng th c có quy n truy nh p đ n các thànhờ ủ ươ ứ ề ậ ế
ph n d li u (c a cùng l p). ầ ữ ệ ủ ớ
+ Bi n l p: Sau khi đ nh nghĩa m t l p, có th dùng tên l p đế ớ ị ộ ớ ể ớ ể
khai báo các bi n ki u l p hay cũn g i là đ i t ng. M i đ iế ể ớ ọ ố ượ ỗ ố
t ng s có các thành ph n d li u và các ph ng th c. L i g iượ ẽ ầ ữ ệ ươ ứ ờ ọ
m t ph ng th c c n ch a tên đ i t ng đ xác đ nh ph ngộ ươ ứ ầ ứ ố ượ ể ị ươ
th c th c hi n t đ i t ng nào.ứ ự ệ ừ ố ượ
10 11

+ M t ch ng tr nh h ng đ i t ng s bao g m các l p cóộ ươ ỡ ướ ố ượ ẽ ồ ớ
quan h v i nhau.ệ ớ
+ Vi c phân tích, thi t k ch ng tr nh theo ph ng phápệ ế ế ươ ỡ ươ
h ng đ i t ng nh m thi t k , xây d ng các l p.ướ ố ượ ằ ế ế ự ớ
+ T khái ni m l p n y sinh hàng lo t khái ni m khác nh :ừ ệ ớ ẩ ạ ệ ư
Thành ph n d li u, ph ng th c, ph m vi, s đóng gói, hàm t o,ầ ữ ệ ươ ứ ạ ự ạ
hàm hu , s th a k , l p c s , l p d n xu t, t ng ng b i,ỷ ự ừ ế ớ ơ ử ớ ẫ ấ ươ ứ ộ
ph ng th c o, ... ươ ứ ả
+ u đi m c a vi c thi t k h ng đ i t ng là t p trung xácƯ ể ủ ệ ế ế ướ ố ượ ậ
đ nh các l p đ mô t các th c th c a bài toán. M i l p đ a vàoị ớ ể ả ự ể ủ ỗ ớ ư
các thành ph n d li u c a th c th và xây d ng luôn các ph ngầ ữ ệ ủ ự ể ự ươ
th c đ x lý d li u. Nh v y vi c thi t k ch ng tr nh xu tứ ể ử ữ ệ ư ậ ệ ế ế ươ ỡ ấ
ph t t c c n i d ng, c c v n đ c a bài toán.ỏ ừ ỏ ộ ụ ỏ ấ ề ủ
+ C c ng n ng thu n tuý h ng đ i t ng (nh Smalltalk) chỏ ụ ữ ầ ướ ố ượ ư ỉ
h tr các khái ni m v l p, không có các khái ni m hàm.ỗ ợ ệ ề ớ ệ
+ C++ là ngôn ng lai , nó cho phép s d ng c các công c c aữ ử ụ ả ụ ủ
l p và hàm.ớ
Đ minh ho các khái ni m v a nêu v l p tr nh h ng đ iể ạ ệ ừ ề ậ ỡ ướ ố
t ng ta tr l i xét bài toán t m đ dài l n nh t đi qua 2 đi m.ượ ở ạ ỡ ộ ớ ấ ể
Trong bài toán này ta g p m t th c th là d y đi m. Các thànhặ ộ ự ể ẫ ể
ph n d li u c a l p d y đi m g m:ầ ữ ệ ủ ớ ẫ ể ồ
- Bi n nguyên n là s đi m c a d yế ố ể ủ ẫ
- Con tr x ki u th c tr đ n vùng nh ch a d y hoành đỏ ể ự ỏ ế ớ ứ ẫ ộ
- Con tr y ki u th c tr đ n vùng nh ch a d y tung đỏ ể ự ỏ ế ớ ứ ẫ ộ
Các ph ng th c c n đ a vào theo yêu c u bài toán g m:ươ ứ ầ ư ầ ồ
- Nh p to đ m t đi mậ ạ ộ ộ ể
- Tính đ dài đo n th ng đi qua 2 đi mộ ạ ẳ ể
D i đây là ch ng tr nh vi t theo thi t k h ng đ i t ng.ướ ươ ỡ ế ế ế ướ ố ượ
Đ th c hi n ch ng tr nh này nh đ t tên t p có đuôi CPP. Xemể ự ệ ươ ỡ ớ ặ ệ
ch ng tr nh ta th y th m m t đi u m i trong C++ là: ươ ỡ ấ ờ ộ ề ớ
Các khai báo bi n, m ng có th vi t b t kỳ ch nào trongế ả ể ế ấ ỗ
ch ng tr nh (t t nhi n ph i tr c khi s d ng bi n, m ng).ươ ỡ ấ ờ ả ướ ử ụ ế ả
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <alloc.h>
class daydiem
{
public:
int n;
float *x,*y;
float do_dai(int i, int j)
{
return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
}
void nhapsl(void);
};
void daydiem::nhapsl(void)
{
int i;
printf("\nSo diem N= ");
scanf("%d",&n);
x=(float*)malloc((n+1)*sizeof(float));
y=(float*)malloc((n+1)*sizeof(float));
for (i=1;i<=n;++i)
{
printf("\nNhap toa do x, y cua diem thu %d : ",i);
scanf("%f%f",&x[i],&y[i]);
}
}
void main()
12 13

{
daydiem p;
p.nhapsl();
int n,i,j,imax,jmax;
float d,dmax;
n=p.n;
dmax=p.do_dai(1,2); imax=1;jmax=2;
for (i=1;i<=n-1;++i)
for (j=i+1;j<=n;++j)
{
d=p.do_dai(i,j);
if (d>dmax)
{
dmax=d;
imax=i;
jmax=j;
}
}
printf("\nDoan thang lon nhat co do dai bang: %0.2f",dmax);
printf("\n Di qua 2 diem co chi so la %d va %d",imax,jmax);
getch();
}
§ 4. M t s m r ng đ n gi n c a C++ so v i Cộ ố ở ộ ơ ả ủ ớ
Trong m c này tr nh b y m t s m r ng c a C++ , tuy đ nụ ỡ ầ ộ ố ở ộ ủ ơ
gi n, ng n g n nh ng đem l i r t nhi u ti n l i.ả ắ ọ ư ạ ấ ề ệ ợ
4.1. Vi t c c dũng ghi chỳế ỏ
Trong C++ v n cú th vi t c c dũng ghi chỳ trong c c d u /* vàẫ ể ế ỏ ỏ ấ
*/ nh trong C. Cách này cho ph p vi t c c ghi chỳ tr n nhi uư ộ ế ỏ ờ ề
dũng ho c tr n m t dũng. Ngoài ra trong C++ cũn cho ph p vi tặ ờ ộ ộ ế
ghi chỳ tr n m t dũng sau 2 d u g ch ch o, v d :ờ ộ ấ ạ ộ ớ ụ
int x,y ; // Khai báo 2 bi n th cế ự
4.2. Khai báo linh ho tạ
Trong C t t c các câu l nh khai báo bi n, m ng c c b ph iấ ả ệ ế ả ụ ộ ả
đ t t i đ u kh i. Do v y nhi u khi, v trí khai báo và v trí s d ngặ ạ ầ ố ậ ề ị ị ử ụ
c a bi n khá xa nhau, gây khó khăn trong vi c ki m soát ch ngủ ế ệ ể ươ
tr nh. C++ đó kh c ph c nh c đi m này b ng cách cho phép cácỡ ắ ụ ượ ể ằ
l nh khai báo bi n, m ng có th đ t b t kỳ ch nào trong ch ngệ ế ả ể ặ ấ ỗ ươ
tr nh tr c khi các bi n, m ng đ c s d ng. Ví d ch ngỡ ướ ế ả ượ ử ụ ụ ươ
tr nh nh p m t d y s th c r i s p x p theo th t tăng d n cóỡ ậ ộ ẫ ố ự ồ ắ ế ứ ự ầ
th vi t trong C++ nh sau: ể ế ư
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
int n;
printf("\n So phan tu cua day N= ");
scanf("%d",&n);
float *x= (float*)malloc((n+1)*sizeof(float));
for (int i=1;i<=n;++i)
{
printf("\nX[%d]= ",i);
scanf("%f",x+i);
}
for (i=1;i<=n-1;++i)
14 15

