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 ế ươ ế
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 d trong cu n sách này s vi t 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 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++ đuôi m c đ nh CPP cũn trong
TC th t p ch ng tr nh lu n có đuôi C. ươ
Trong TC++ th th c hi n c ch ng tr nh C 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++
- th nói C++ s m r ng (đáng k ) c a C. Đi u đó
nghĩa 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 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++ 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 đó 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 th dùng m t hàm chu n 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 th d n đ n k t qu sai khi ư ế ế
ch y ch ng tr nh. ươ
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) 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 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 trì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 t ch c ch ngư ưở ươ
tr nh thành c c ch ng tr nh con. Trong PASCAL 2 ki u ươ
ch ng tr nh con th t c hàm. Trong C ch m t lo iươ
ch ng tr nh con là hàm. ươ
Hàm 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 đ i 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 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 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.
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 th t ch c ch ngư ưở ươ
tr nh nh sau: ư
+ S d ng 2 m ng th c toàn b x 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 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
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 p ướ ượ
(class). th xem l p s k t h p các thành ph n d li u ế
các hàm. Cũng th xem l p 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 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 các thành ph n d li u thu c cùng m t l p vươ
ph ng th c đ c l p lên c t đ x c c thành ph n d li u,ươ ượ
n n trong thõn c a ph ng th cquy 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, th dùng tên l p đế
khai báo các bi n ki u l p hay cũn g i đ i t ng. M i đ iế ượ
t ng s các thành ph n d li u 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 ươ ướ ượ
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 t p trung xácƯ ế ế ướ ượ
đ nh các l p đ 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 xây d ng luôn các ph ng ươ
th c đ x 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 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 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đ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 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 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. 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 ế
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