Để học tốt ngôn ngữ lập trình C, ngoài việc bạn cần làm rất nhiều bài tập lập trình C, các bạn còn phải biết sử dụng các hàm build-in-function. Biết nhiều hàm sẽ giúp các bạn rút ngắn thời gian giải quyết vấn đề đặt ra.
Trong bài viết này, mình xin tổng hợp các hàm ngôn ngữ C hay sử dụng. Hy vọng rằng sẽ giúp ích cho các bạn!
Tài liệu được tổng hợp từ blog: http://vncoding.net/thu-vien-ham-ngon-ngu-c/
Để học tốt ngôn ngữ lập trình C, ngoài việc bạn cần làm rất nhiều bài tập lập trình C, các bạn còn phải biết sử dụng các hàm build-in-function. Biết nhiều hàm sẽ giúp các bạn rút ngắn thời gian giải quyết vấn đề đặt ra.
Trong bài viết này, mình xin tổng hợp các hàm ngôn ngữ C hay sử dụng. Hy vọng rằng sẽ giúp ích cho các bạn!
Tài liệu được tổng hợp từ blog: http://vncoding.net/thu-vien-ham-ngon-ngu-c/
Bài giảng Lập trình cơ bản - truongkinhtethucpham.commai_non
Tài liệu này trình bày tổng quan về ngôn ngữ lập trình C - ngôn ngữ lập trình cơ bản mà hầu như những ai học về công nghệ thông tin cũng cần phải biết đến nó.
Bài giảng Lập trình cơ bản - truongkinhtethucpham.commai_non
Tài liệu này trình bày tổng quan về ngôn ngữ lập trình C - ngôn ngữ lập trình cơ bản mà hầu như những ai học về công nghệ thông tin cũng cần phải biết đến nó.
Smartbiz_He thong MES nganh may mac_2024juneSmartBiz
Cách Hệ thống MES giúp tối ưu Quản lý Sản xuất trong ngành May mặc như thế nào?
Ngành may mặc, với đặc thù luôn thay đổi theo xu hướng thị trường và đòi hỏi cao về chất lượng, đang ngày càng cần những giải pháp công nghệ tiên tiến để duy trì sự cạnh tranh. Bạn đã bao giờ tự hỏi làm thế nào mà những thương hiệu hàng đầu có thể sản xuất hàng triệu sản phẩm với độ chính xác gần như tuyệt đối và thời gian giao hàng nhanh chóng? Bí mật nằm ở hệ thống Quản lý Sản xuất (MES - Manufacturing Execution System).
Hãy cùng khám phá cách hệ thống MES đang cách mạng hóa ngành may mặc và mang lại những lợi ích vượt trội như thế nào.
Tuyển tập 9 chuyên đề bồi dưỡng Toán lớp 5 cơ bản và nâng cao ôn thi vào lớp ...Bồi Dưỡng HSG Toán Lớp 3
Tuyển tập 9 chuyên đề bồi dưỡng Toán lớp 5 cơ bản và nâng cao ôn thi vào lớp 6 trường chuyên. Đăng ký mua tài liệu Toán 5 vui lòng liên hệ: 0948.228.325 (Zalo - Cô Trang Toán IQ).
Từ vay mượn trong tiếng Anh trên các phương tiện tin đại chúng
Lap trinh huong doi tuong voi c++ smith.n studio
1. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Mét sè tiÖn Ých vµ më réng cña C++ so
víi C
M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C
Nh p/xu t d li u s d ng toán t cin và cout
Vi t chú thích trên m t dòng, khai báo bi n m i nơi, c p phát và thu h i b nh
ng s d ng toán new và delete,
Gi i các bài t p có s d ng k thu t ch ng hàm, thâm s ng m nh.
A/ TÓM T T LÝ THUY T
- C++ là m t s m i r ng c a C, do ó có th s d ng m t chương trình biên d ch
C++ d ch và th c hi n các chương trình vi t b ng C
- C yêu c u các chú thích n m gi a /* và */. C++ cho phép t o m t chú thích b t u
b ng “//” cho n h t dòng
- C++ cho phép khai báo tuỳ ý. Th m chí có th khai báo bi n trong ph n kh i t o
c a câu lênh l p for
- C++ cho phép truy n tham s cho hàm b ng tham chi u. i u này tương t như
truy n tham bi n cho chương trình con trong ngôn ng l p trình PASCAL. Trong l i g i
hàm ta dùng tên bi n và bi n ó s ư c truy n cho hàm qua tham chi u. i u ó cho
phép thao tác tr c ti p trên bi n ư c truy n ch không ph i gián ti p qua bi n tr .
- Toán t new và delete trong C++ ư c dùng qu n lý b nh ng thay vì các
hàm c p phát ng c a C
- C++ cho phép ngư i vi t chương trình mô t các giá tr ng m nh cho các tham s
c a hàm, nh ó hàm có th ư c g i v i m t danh sách các tham s không .
- Toán t “::” cho phép truy nh p bi n toàn c c khi ng th i s d ng bi n c c b và
toàn c c cùng tên.
- Có th nh nghĩa các hàm cùng tên v i các tham s khác nhau. Hai hàm cùng tên
s ư c phân bi t nh giá tr tr v và danh sách ki u các tham s .
B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...)
Các l i thư ng g p
Quên óng */ cho các chú thích
Khai báo bi n sau khi bi n ư c s d ng
S d ng l nh return tr v giá tr nhưng khi nh nghĩa hàm l i mô t hàm ki u
void ho c ngư c l i, quên câu l nh này trong trư ng h p hàm yêu c u giá tr tr v .
Không có hàm nguyên m u cho các hàm
B qua kh i t o cho các bi n tham chi u
Thay i giá tr c a các h ng
T o các hàm cùng tên, cùng tham s .
M t s thói quen l p trình t t
S d ng “//” tránh l i không óng */ khi chú thích n m g n trong m t dòng.
S d ng các kh năng vào ra m i c a C++ chương trình d c hơn.
t các khai báo biên lên u kh i l nh.
Ch dùng t khoá inline v i các hàm “nh ”,”không ph c t p”.
S d ng con tr truy n tham s cho hàm khi c n thay i giá tr tham s , còn
tham chi u dùng truy n các tham s có kích thư c l n mà không có nhu c u
thay i n i dung.
Tránh s d ng bi n cùng tên cho nhi u m c ch khác nhau trong chương trình.
Trang 1
2. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
C/ BÀI T P M U
Ví d 1: C++ ch p nh n hai ki u chú thích. Các l p trình viên b ng C ã quen v i
cách chú thích b ng /*…*/. Trình biên d ch s b qua m i th n m gi a /*…*/.
Xét chương trình sau :
CT1_1.CPP
/*
Chương trình in các s t 0 n 9. 1.
*/
#include <iostream.h>
void main()
{
int I;
for(I = 0; I < 10 ; ++ I)// 0 - 9
cout<<I<<"n"; // In ra 0 - 9
}
2.
M i th n m gi a /*…*/ t dòng 1 n dòng 3 u ư c chương trình b qua.
Chương trình này còn minh h a cách chú thích th hai. ó là cách chú thích b t
u b ng // dòng 8 và dòng 9.
k t qu
Nói chung, ki u chú thích /*…*/ ư c dùng cho các kh i chú thích l n g m nhi u
dòng, còn ki u // ư c dùng cho các chú thích m t dòng.
Ví d 2: Chương trình nh p vào hai s . Tính t ng và hi u c a hai s v a nh p.
CT1_2.CPP
#include <iostream.h>
void main()
{
int X, Y;
cout<< "Nhap vao mot so X:";
Trang 2
3. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
cin>>X;
cout<< "Nhap vao mot so Y:";
cin>>Y;
cout<<"Tong cua chung:"<<X+Y<<"n";
cout<<"Hieu cua chung:"<<X-Y<<"n";
}
Ví d 3:
S d ng toán t xu t nh p vi t th c ơn cho chương trình:
CT1_2.CPP
#include <iostream.h>
void menu()
{
cout<<” Menu n”;
cout<<”1. Cong viec 1n”;
cout<<”2. Cong viec 2n”;
cout<<”3. Cong viec 3n”;
cout<<”4. Ket thuc chuong trinh nn”;
}
void main()
{
int lc;
do
{
// viet menu len man hinh
menu();
//lay lua chon
cout<<”Ban hay chon cong viec can thuc hien:1->4”;cin>>lc;
switch(lc)
{
case 1:cout<<”Thuc hien cong viec 1n”; break;
case 2:cout<<”Thuc hien cong viec 2n”; break;
case 3:cout<<”Thuc hien cong viec 3n”; break;
}
//lap cho den khi nguoi su dung lua chon 4
} while(lc!=4);
}
Ví d 4:
Tìm l i sai c a o n chương trình sau:
int n;
cin>>n;
for(int i=0;i<n;i++)
{ int a[100];
cin>>a[i];
}
for(i=0;i<n;i++)
cout<<a[i];
L ig i
Chương trình b l i trong vòng for th hai do bi n m ng a không ư c nh nghĩa.
M ng a ư c khai báo trong vòng for th nh t ch có t m ho t ng trong vòng for
ó mài thôi. Do v y, chương trình không th bi t trong vòng l p for th hai. Chú ý
Trang 3
4. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
bi n nguyên i ư c khai báo trong dòng l nh for có v trí tương ương v i vi c khai
báo i bên ngoài for. Vì v y, trong vòng for th hai ta s d ng bi n i nhưng chương
trình không báo l i.
Ví d 5:
Tìm l i sai cho các khai báo prototype hàm dư i ây (các hài này ư c khai báo
trong cùng m t chương trình)
int func1(int); // (1)
float func1(int); // (2)
int func1(float); //(3)
void func1(int=0,int); //(4)
void func2(int,int=0); //(5)
void func2(int); //(6)
void func2(float); //(7)
L i g i:
Trong nh nghĩa ch ng hàm, trình biên d ch phân bi t các hàm b i ki u d li u tr
ra c a hàm mà ch phân bi t b i danh sách tham s c a hàm. Do v y hàm 1 và hàm 2
b nh nghĩa ch ng lên nhau và trình biên d ch báo l i. Gi a hàm 2 và hàm 3 không có
l i b i chúng khác nhau b i ki u d li u c a tham s . Trong hàm 4 ta ã s d ng sai
cách truy n giá tr m c nh cho tham s . Không báo gi truy n giá tr m c nh cho
m t tham s trư c m t tham s không ư c truy n giá tr ng m nh.
Trong cách nh nghĩa hai hàm 5 và 6 có s nh p nh ng. Khi ta g i hàm func2 v i
tham s là m t s nguyên thì trình biên d ch không bi t là s g i hàm 5 hay hàm 6 b i
vì c hai hàm này u ư c. Trong trư ng h p này trình biên d ch cũng thông báo l i.
Ví d 6:
Tìm l i sai(l i cú pháp và b nh ) cho chương trình sau:
int & refl()
{
int a=5;
return a;
}
int & rè2(int a)
{
a++;
return a;
}
int & ref3(int & a)
{
a++;
return a;
}
int a=5;
int &r1;
int &r2=22;
int &r3=a;
int &r4=ref3(5);
int &r5=ref3(a);
Tr l i:
Trong các hàm có k t qu tr v là m t tham chi u, chúng ta luôn ph i chú ý r ng
bi n ư c tr l i có giá tr là tham chi u không b xoá kho i b nh chương trình khi k t
thúc th c hi n hàm. Do v y hai hàm ref1 và ref2 là sai b i vì nó tr v tham chi u t i
biên mà a l i là bi n c c b trong ref1 và là tham s trong ref2 ch ư c t o ra t m th i
Trang 4
5. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
trên stack khi g i hàm và xoá kh i stack khi k t thúc hàm. Hàm ref3 không có l i vì a là
m t tham chi u t i m t bi n không n m trong hàm.
Trong khái báo các tham chi u ph i ư c g n v i m t bi n nào ó trong b nh . Do
v y các khai báo r1, r2 là sai. L i g i ref3(5) cũng là sai b i vì tham s cho hàm ph i là
tham chi u n m t bi n, trong khi ó ta l i truy n vào h ng s .
Ví d 7:
Cho bi t k t qu th c hi n chương trình sau:
#include <iostream.h>
int & foo(int &a,int b)
{
b+=a;
if (b>5) a++;
return a;
}
void main()
{
int i=2,j=4;
int k=foo(i,j);
k++;
cout<<i<<” “<<j<<” “<<k<<endl;
int &l=foo(i,j);
l++ ;
cout<<i<<” “<<j<<” “<<l<<endl;
}
L i g i:
Trong chương trình trên c n chú ý hai i m. Thi nh t là ta truy n vào cho hàm
tham chi u c a bi n i ch không ph i bi n i. Do v y, m i thay i c a tham s này
trong hàm là thay i t i bi n i ư c tham chi u t i. Tương t như v y v i tham chi u
l. Tham chi u l ư c xác l p b ng tham chi u tr ra c a hàm chính là tham chi u t i
bi n i. Do v y m i thay i l chính là thay i i.
Ví d 8:
Vi t m t hàm hoanvi dùng hoán v hai s nguyên. Sau ó viêt chương trình nh p
và s p x p m t m ng s nguyên.
Tr l i:
CT1_8.CPP
#include <iostream.h>
void hoanvi(int &a,int &b)
{
int tam=a; a=b; b=tam;
}
void main()
{
// Nhap du lieu
int n;
cout<<” Ban hay cho so phan tu cua mang n=”;cin>>n;
//Cap phat bo nho cho mang
int *a=new int(n);
cout<<”n Hay nhap gia tri cho cac phan tu cua mang n”;
for(int i=0;i<n;++i)
{
cout<<”a[“<<i<<”]=”;cin>>a[i];
}
// Sap xep
for(i=0;i<n-1;i++)
for(int j=i++;j<n;j++)
Trang 5
6. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
if (a[i]>a[j]) hoanvi(a[i],a[j]);
// In ket qua
cout<<”n Cac phan tu cua mang sau khi da sap xep la n”;
for(i=0;i<n;i++)
cout<<a[i]<<” “;
delete a;
}
Ví d 9: Chương trình t o m t m ng ng, kh i ng m ng này v i các giá tr ng u
nhiên và s p x p chúng.
CT1_9.CPP
#include <iostream.h>
#include <time.h>
#include <stdlib.h>
void main()
{
int N;
cout<<"Nhap vao so phan tu cua mang:";
cin>>N;
int *P=new int[N];
if (P==NULL)
{
cout<<"Khong con bo nho de cap phatn";
}
srand((unsigned)time(NULL));
for(int I=0;I<N;++I)
P[I]=rand()%100; //T o các s ng u nhiên t 0 n 99
cout<<"Mang truoc khi sap xepn";
for(I=0;I<N;++I)
cout<<P[I]<<" ";
for(I=0;I<N-1;++I)
for(int J=I+1;J<N;++J)
if (P[I]>P[J])
{
int Temp=P[I];
P[I]=P[J];
P[J]=Temp;
}
cout<<"nMang sau khi sap xepn";
for(I=0;I<N;++I)
cout<<P[I]<<" ";
delete []P;
}
k t qu
Trang 6
7. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Ví d 10: Chương trình c ng hai ma tr n trong ó m i ma tr n ư c c p phát
ng.
Chúng ta có th xem m ng hai chi u như m ng m t chi u như hình 1.2 dư i ây
Hình 1.2: M ng hai chi u có th xem như m ng m t chi u.
G i X là m ng hai chi u có kích thư c m dòng và n c t.
A là m ng m t chi u tương ng.
N u X[i][j] chính là A[k] thì k = i*n + j
Chúng ta có chương trình như sau :
CT1_10.CPP
#include <iostream.h>
#include <conio.h>
//prototype
void AddMatrix(int * A,int *B,int*C,int M,int N);
int AllocMatrix(int **A,int M,int N);
void FreeMatrix(int *A);
void InputMatrix(int *A,int M,int N,char Symbol);
void DisplayMatrix(int *A,int M,int N);
int main()
{
int M,N;
int *A = NULL,*B = NULL,*C = NULL;
clrscr();
cout<<"Nhap so dong cua ma tran:";
cin>>M;
cout<<"Nhap so cot cua ma tran:";
cin>>N;
//C p phát vùng nh cho ma tr n A
if (!AllocMatrix(&A,M,N))
{ //endl: Xu t ra kí t xu ng dòng (‘n’)
cout<<"Khong con du bo nho!"<<endl;
return 1;
}
//C p phát vùng nh cho ma tr n B
if (!AllocMatrix(&B,M,N))
{
Trang 7
8. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
cout<<"Khong con du bo nho!"<<endl;
FreeMatrix(A);//Gi i phóng vùng nh A
return 1;
}
//C p phát vùng nh cho ma tr n C
if (!AllocMatrix(&C,M,N))
{
cout<<"Khong con du bo nho!"<<endl;
FreeMatrix(A);//Gi i phóng vùng nh A
FreeMatrix(B);//Gi i phóng vùng nh B
return 1;
}
cout<<"Nhap ma tran thu 1"<<endl;
InputMatrix(A,M,N,'A');
cout<<"Nhap ma tran thu 2"<<endl;
InputMatrix(B,M,N,'B');
clrscr();
cout<<"Ma tran thu 1"<<endl;
DisplayMatrix(A,M,N);
cout<<"Ma tran thu 2"<<endl;
DisplayMatrix(B,M,N);
AddMatrix(A,B,C,M,N);
cout<<"Tong hai ma tran"<<endl;
DisplayMatrix(C,M,N);
FreeMatrix(A);//Gi i phóng vùng nh A
FreeMatrix(B);//Gi i phóng vùng nh B
FreeMatrix(C);//Gi i phóng vùng nh C
return 0;
}
//C ng hai ma tr n
void AddMatrix(int *A,int *B,int*C,int M,int N)
{
for(int I=0;I<M*N;++I)
C[I] = A[I] + B[I];
}
//C p phát vùng nh cho ma tr n
int AllocMatrix(int **A,int M,int N)
{
*A = new int [M*N];
if (*A == NULL)
return 0;
return 1;
}
//Gi i phóng vùng nh
void FreeMatrix(int *A)
{
if (A!=NULL)
delete [] A;
}
//Nh p các giá tr c a ma tr n
void InputMatrix(int *A,int M,int N,char Symbol)
{
for(int I=0;I<M;++I)
for(int J=0;J<N;++J)
{
cout<<Symbol<<"["<<I<<"]["<<J<<"]=";
cin>>A[I*N+J];
}
}
//Hi n th ma tr n
void DisplayMatrix(int *A,int M,int N)
{
Trang 8
9. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
for(int I=0;I<M;++I)
{
for(int J=0;J<N;++J)
{
out.width(7);//Hien thi canh le phai voi chieu dai 7 ky tu
cout<<A[I*N+J];
}
cout<<endl;
}
}
k t qu
D/ BÀI T P T GI I
Câu h i tr c nghi m
Câu 1: Cho bi t giá tr c a k sau khi th c hi n o n chương trình
int i=5,k;
{
int i=6;
::i--;
k=i;
}
k-=i;
V i các k t qu :
a) k=0 b) k=1 c) k=2 d)k=3
Câu 2: Tìm l i g i hàm sai cho hàm sau:
void func(int i=0,int j=0);
a)func()
b)dunc(1);
Trang 9
10. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
c)func(1.5,2.5);
d)func(1,2);
Câu 3: Cho bi t giá tr c a y sau khi th c hi n:
int &foo(int &a)
{ a++;
return a;
}
int i=5;
int &r=foo(i);
r++;
a) i=5;
b) i=6;
c) i=7;
d) không câu nào úng
Câu 4: Tìm giá tr c a x, y:
void test(int &a, int b)
{ a+=b;
b=a;
}
int x=1,y=2;
test(x,y);
a) x=1,y=2;
b) x=1,y=3
c) x=3,y=2
d) x=3,y=3
Bài t p t gi i
Bài 1.1: Anh (ch ) hãy vi t l i chương trình sau b ng cách s d ng l i các dòng
nh p/xu t trong C++.
/*
Chương trình tìm m u chung nh nh t
*/
#include <stdio.h>
void main()
{
int a,b,i,min;
printf("Nhap vao hai so:");
scanf("%d%d",&a,&b);
min=a>b?b:a;
Trang 10
11. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
for(i = 2;i<min;++i)
if (((a%i)==0)&&((b%i)==0)) break;
if(i==min)
{
printf("Khong co mau chung nho nhat");
}
printf("Mau chung nho nhat la %dn",i);
}
Bài 1.2: Vi t chương trình nh p vào s nguyên dương h (2<h<23), sau ó in ra các tam
giác có chi u cao là h như các hình sau:
Bài 1.3: M t tam giác vuông có th có t t c các c nh là các s nguyên. T p c a ba s
nguyên c a các c nh c a m t tam giác vuông ư c g i là b ba Pitago. ó là t ng bình
phương c a hai c nh b ng bình phương c a c nh huy n, ch ng h n b ba Pitago (3,
4, 5). Vi t chương trình tìm t t c các b ba Pitago như th sao cho t t c các c nh
không quá 500.
Bài 1.4: Vi t chương trình in b ng c a các s t 1 n 256 dư i d ng nh phân, bát
phân và th p l c phân tương ng.
Bài 1.5: Vi t chương trình nh p vào m t s nguyên dương n. Ki m tra xem s nguyên
n có thu c dãy Fibonacci không?
Bài 1.6: Vi t chương trình nhân hai ma trân Amxn và Bnxp. M i ma tr n ư c c p phát
ng và các giá tr c a chúng phát sinh ng u nhiên (V i m, n và p nh p t bàn phím).
Trang 11
12. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Bài 1.7: Vi t chương trình t o m t m ng m t chi u ng có kích thư c là n (n nh p t
bàn phím). Các giá tr c a m ng này ư c phát sinh ng u nhiên trên o n [a, b] v i a
và b u nh p t bàn phím. Hãy tìm s dương nh nh t và s âm l n nh t trong m ng;
n u không có s dương nh nh t ho c s âm l n nh t thì xu t thông báo "không có s
dương nh nh t" ho c "không có s âm l n nh t".
Bài 1.8: Anh (ch ) hãy vi t m t hàm tính bình phương c a m t s . Hàm s tr v giá tr
bình phương c a tham s và có ki u cùng ki u v i tham s .
Bài 1.9: Trong ngôn ng C, chúng ta có hàm chuy n i m t chu i sang s , tùy thu c
vào d ng c a chu i chúng ta có các hàm chuy n i sau :
int atoi(const char *s);
Chuy n i m t chu i s thành s nguyên ki u int.
long atol(const char *s);
Chuy n i m t chu i s thành s nguyên ki u long.
double atof(const char *s);
Chuy n i m t chu i s thành s th c ki u double.
Anh (ch ) hãy vi t m t hàm có tên là aton (ascii to number) chuy n i chu i
sang các d ng s tương ng.
Bài 1.10: Anh ch hãy vi t các hàm sau:
Hàm ComputeCircle() tính di n tích s và chu vi c c a m t ư ng tròn
bán kính r. Hàm này có prototype như sau:
void ComputeCircle(float & s, float &c, float r = 1.0);
Hàm ComputeRectangle() tính di n tích s và chu vi p c a m t hình
ch nh t có chi u cao h và chi u r ng w. Hàm này có prototype như sau:
void ComputeRectangle(float & s, float &p, float h = 1.0, float w =
1.0);
Hàm ComputeTriangle() tính di n tích s và chu vi p c a m t tam giác
có ba c nh a,b và c. Hàm này có prototype như sau:
void ComputeTriangle(float & s, float &p, float a = 1.0, float b = 1.0,
float c = 1.0);
Hàm ComputeSphere() tính th tích v và di n tích b m t s c a m t
hình c u có bán kính r. Hàm này có prototype như sau:
void ComputeSphere(float & v, float &s, float r = 1.0);
Trang 12
13. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Hàm ComputeCylinder() tính th tích v và di n tích b m t s c a m t
hình tr có bán kính r và chi u cao h. Hàm này có prototype như sau:
void ComputeCylinder(float & v, float &s, float r = 1.0 , float h =
1.0);
Bài 1.11: Vi t chương trình qu n lý i m h c sinh v i c u trúc danh sách n i ơn.
Trong chương trình s d ng toán t vào ra và toán t new c p phát b nh ng.
Bài 1.12: Vi t m t hàm th c hi n vi c s p x p m t m ng s nguyên theo chi u tăng
d n ho c gi m d n. Hàm này t ng m c nh ki u s p x p theo chi u tăng d n.
Bài 1.13: Vi t m t hàm gi i phương trình b c hai. Hàm này tr l i thông báo r ng
phương trình có nghi m hay không có nghi m kép. N u có nghi m thì nghi m s ư c
lưu vào tham s x1, x2 và ư c truy n như là tham bi n.
Bài 1.14:Vi t m t hàm tìm v trí xu t hi n u tiên c a m t t khoá trong m t xâu. Hàm
này tr l i v trí tìm th y c a t khoá trong xâu(b t u t 0) và thay i con tr xâu
ư c truy n vào thành v trí c a ký t ngay sau ký t cu i cùng c a t khoá. T khoá
c n tìm ư c ưa vào như là m t tham s và có m t giá tr m c nh.
Trang 13
14. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
§èi t−îng vµ líp (Class and Object)
M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C
Phân tích ư c khái ni m óng gói d li u
Khai báo và s d ng m t l p
Khai báo và s d ng i tư ng.
S d ng hàm thi t l p và hàm hu b
Khai báo và s d ng hàm thi t l p sao chép
Vai trò c a hàm thi t l p ng m nh
A/ NH C L I LÝ THUY T
Trong C++, tên c u trúc là m t ki u d li u không c n kèm theo t khoá struct.
L p cho phép ngư i l p trình mô t các i tư ng th c t v i các thu c tính và hành
vi. Trong C++ thư ng s d ng t khoá class khai báo m t l p. Tên l p là m t ki u
d li u dùng khi khai báo các i tư ng thư c l p(các th hi n c th c a l p).
Thu c tính c a i tư ng trong m t l p ư c mô t dư i d ng các bi n th hi n.
Các hành vi là các hàm thành ph n bên trong l p.
Có hai cách nh nghĩa các hàm thành ph n c a m t l p; khi nh nghĩa hàm thành
ph n bên ngoài khai báo l p ph i t trư c tên hàm thành ph n tên c a l p và toán t
“::” phân bi t v i các hàm t do cùng tên. Ch nên nh nghĩa hàm thành ph n bên
trong khai báo l p khi nó không quá ph c t p cho chương trình d c.
Có th khai báo và s d ng các con tr i tư ng, tham chi u i tư ng.
Hai t khoá public và private dùng ch nh thu c tính truy nh p cho các thành
ph n( d li u/hàm) khai báo bên trong l p.
Thành ph n bên trong l p ư c khai báo public có th truy nh p t m i hàm khai
báo m t i tư ng thu c l p ó.
Thành ph n private trong m t i tư ng ch có th truy nh p ư c b i các hàm
thành ph n c a i tư ng ho c các hàm thành ph n c a l p dùng t o i tư ng(
ây tính c trư ng h p i tư ng là tham s c a hàm thành ph n)
Hai hàm thành ph n c bi t c a m t l p g i là hàm thi t l p và hàm hu b . Hàm
thi t l p ư c g i t ng(ng m nh) m i khi m t i tư ng ư c t o ra và hàm hu
b ư cg it ng khi i tư ng h t th i gian s d ng.
Hàm thi t l p có thu c tính public, cùng tên v i tên l p nhưng không có giá tr tr
v .
M t l p có ít nh t hai hàm thi t l p: hàm thi t l p sao chép ng m nh và hàm thi t
l p do ngư i l p trình thi t l p(n u không mô t tư ng minh thì ó là hàm thi t l p
ng m nh).
Hàm hu b cũng có thu c tính public, không tham s , không giá tr tr v và có tên
b t u b i ~ theo sau là tên c a l p.
Bên trong ph m v l p( nh nghĩa c a các hàm thành ph n), các thành ph n c a l p
ư c g i theo tên. Trư ng h p có m t i tư ng toàn c c cùng tên, mu n xác nh i
tư ng y ph i s d ng toán t “::”.
L p có th ch a các thành ph n d li u là các i tư ng c a l p khác. Các i
tư ng này ph i ư c kh i t o trư c i tư ng tương ng c a l p bao.
M i i tư ng có m t con tr ch n b n thân nó, ta g i ó là con tr this. Con tr
này có th ư c s d ng tư ng minh ho c ng m nh tham xác nh các thành
ph n bên trong i tư ng. Thông thư ng ngư i ta s d ng this dư i d ng ng m nh.
Hàm b n c a m t l p là hàm không thu c l p nhưng có quy n truy nh p t i các
thành ph n private c a l p.
Trang 14
15. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Khai báo b n b có th khai báo b t kỳ ch nào trong khai báo l p.
B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...)
Các l i thư ng g p
Quên d u “;” cu i khai báo l p
Kh i t o các thành ph n giá tr trong khai báo l p
nh nghĩa ch ng m t hàm thành ph n b ng m t hàm không thu c l p
Truy nh p n các thành ph n riêng c a l p t bên ngoài ph m vi l p
Khai báo giá tr tr v cho hàm thi t l p và hàm hu b
Khai báo hàm hu b có tham s , nh nghĩa ch ng hàm hu b
G i tư ng minh hàm thi t l p và hàm hu b
G i các thàm thành ph n bên trong hàm thi t l p
M t s thói quen l p trình t t
Nhóm t t c c các thành ph n có cùng thu c tính truy nh p m t nơi trương khái
báo l p, nh v y m i t khoá mô t truy nh p ch ư c xác nh m t l n. Khai báo
l p vì v y d c hơn. Theo kinh nghi m, các thành ph n private trư c tiên r i
n các thành ph n protectech, cu i cùng là t khoá public.
nh nghĩa t t c các hàm thành ph n bên ngoài khai báo l p. i u này nh m ph n
bi t gi a hai ph n giao di n và ph n cài t l p.
S d ng các ti n x lý #ifndef, #define, #endif cho các t p tin tiêu ch xu t
hi n m t l n bên trong chương trinhg ngu n.
Ph i nh nghĩa các hàm thi t l p m b o r ng các i tư ng u ư c kh i
t o n i dung m t cách úng n.
C/ BÀI T P M U
Ví d 1: nh nghĩa m t l p mô t và x lý các i m trên màn hình ho . V i tên l p
là point
L i gi i
+ Các thu c tính c a l p
int x;// hoành (c t)
int y;// tung ( hàng)
int m;// màu
+ Các phương th c
Nh p d li u m t i m
Hi n th m t i m
nm t i m
L p i m ư c xây d ng như sau:
class point
{
private:
int x,y,m;
public:
void nhapsl();
void hien();
void an()
{
putpixcel(x,y,getbkcolor());
}
void point::nhap()
{
cout<<”n Nh p hoành (c t) và tung (hàng) c i m:”; cin>>x>>y;
cout<<” Nh p màu c a i m:”;cin>>m;
}
void point::hien()
Trang 15
16. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
{
int mau_ht;
mau_ht=getcolor();
putpixcel(x,y,m);
setcolor(mau_ht);
}
Nh n xét:
+ Trong c ba phương th c( dù vi t trong hay vi t ngoài nh nghĩa l p) u ư c
truy nh p n các thu c tính x,y và m c a l p.
+ Các phương th c vi t bên trong nh nghĩa l p (như phương th c an()) ư c
vi t như m t hàm bình thư ng.
+Khi xây d ng các phương th c bên ngoài l p, c n dùng thêm tên l p và toán t
ph m vi :: t ngay trư c tên phương th c quy nh rõ ây là phương th c c a l p
nào.
Ví d 2: Chúng ta xây d ng ki u c u trúc Time v i ba thành viên s nguyên: Hour,
Minute và second. Chương trình nh nghĩa m t c u trúc Time g i là DinnerTime.
Chương trình in th i gian dư i d ng gi quân i và d ng chu n.
CT2_2.CPP
#include <iostream.h>
class Time
{
public:
Time(); //Constructor
void SetTime(int, int, int); //Thiet lap Hour,
Minute va Second
void PrintMilitary(); //In thoi gian duoi
dang gio quan doi
void PrintStandard(); //In thoi gian duoi
dang chuan
private:
int Hour; // 0 - 23
int Minute; // 0 - 59
int Second; // 0 - 59
};
//Constructor khoi tao moi thanh vien du lieu voi gia tri zero
//Bao dam tat ca cac doi tuong bat dau o trang thai thich hop
Time::Time()
{
Hour = Minute = Second = 0;
}
//Thiet lap mot gia tri Time moi su dung gio quan doi
//Thuc hien viec kiem tra tinh hop le tren cac gia tri du lieu
//Thiet lap ca gia tri khong hop le thanh zero
void Time::SetTime(int H, int M, int S)
{
Hour = (H >= 0 && H < 24) ? H : 0;
Minute = (M >= 0 && M < 60) ? M : 0;
Second = (S >= 0 && S < 60) ? S : 0;
}
//In thoi gian duoi dang gio quan doi
void Time::PrintMilitary()
{
cout << (Hour < 10 ? "0" : "") << Hour << ":"
Trang 16
17. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
<< (Minute < 10 ? "0" : "") << Minute << ":"
<< (Second < 10 ? "0" : "") << Second;
}
//In thoi gian duoi dang chuan
void Time::PrintStandard()
{
cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12)
<< ":" << (Minute < 10 ? "0" : "") << Minute
<< ":" << (Second < 10 ? "0" : "") << Second
<< (Hour < 12 ? " AM" : " PM");
}
int main()
{
Time T;
cout << "The initial military time is ";
T.PrintMilitary();
cout << endl << "The initial standard time is ";
T.PrintStandard();
T.SetTime(13, 27, 6);
cout << endl << endl << "Military time after SetTime is ";
T.PrintMilitary();
cout << endl << "Standard time after SetTime is ";
T.PrintStandard();
T.SetTime(99, 99, 99); //Thu thiet lap gia tri khong hop
le
cout << endl << endl << "After attempting invalid
settings:"
<< endl << "Military time: ";
T.PrintMilitary();
cout << endl << "Standard time: ";
T.PrintStandard();
cout << endl;
return 0;
}
k t qu
Trang 17
18. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Ví d 3
Nh p m t ngày tháng năm t bàn phím sau ó in ra màn hình.
L i gi i
CT2_3.CPP
#include <iostream.h>
#include <conio.h>
#define FALSE 0
#define TRUE !FALSE
char* Thang[]={"","gieng","hai","ba","bon","nam","sau","bay","tam",
"chin","muoi","muoi mot","chap"};
int NgayThang[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
class CDate
{
private:
int mNgay,mThang,mNam;
int laNamNhuan(int);
public:
void nhap();
int hopLe();
void in();
};
void CDate::nhap()
{
cout<<endl<<"Ngay: ";cin>>mNgay;
cout<<endl<<"Thang: "; cin>>mThang;
cout<<endl<<"Nam: ";cin>>mNam;
}
int CDate::hopLe()
{
if ((mThang<1)||(mThang>12))
return FALSE;
else
{
if ((mNgay>=1)&&(mNgay<=NgayThang[mThang]))
return TRUE;
else if ((mNgay==29)&&laNamNhuan(mNgay))
return TRUE;
else
return FALSE;
}
}
int CDate::laNamNhuan(int nam)
{
if (((nam%400)==0)||(((nam%4)==0)&&((nam%100)!=0)))
return TRUE;
else
return FALSE;
}
void CDate::in()
{
cout<<endl<<"Ban da nhap vao ngay "<<mNgay;
cout<<" thang "<<Thang[mThang];
cout<<" nam "<<mNam;
}
void main()
{
CDate ngay;
ngay.nhap();
if (ngay.hopLe())
ngay.in();
else
Trang 18
19. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
cout<<"BAN NHAP NGAY KHONG HOP LE";
getch();
}
Ví d 4
Ch ra các cách khai báo i tư ng có th cho các l p i tư ng dư i ây: class A
{
};
class B
{
B(int, int);
public:
B(int=0);
};
class C
{
C(C&);
public:
C();
};
class D
{
public:
D(D&);
};
L i gi i
V l pA
Cách 1: S d ng hàm thi t l p ng m nh
A a; ho c A a();
Cách 2: S d ng hàm thi t l p sao chép m c nh. Gi s a là m t i tư ng c a
l p A ã ư c khai báo trư c. Ta có th khai báo i tư ng a1 như sau:
A a1(a); ho c A a1=a;
Nh n xét:
Khi trong l p không có m t khai báo hàm thi t l p nào thì trình biên d ch t ng
t o ra m t hàm thi t l p m c nh cho l p ó. Do v y ta có th s d ng khai báo i
tư ng theo cách 1 cho l p A. Hai chách vi t khai báo
A a1(a); và A a1=a; là hoàn toàn gi ng nhau, chúng u s d ng hàm thi t l p sao
chép kh i t o i tư ng.
V l pB
Cách 1: S d ng hàm thi t l p B(int). Ví d :
B b(5);
Cách 2: S d ng hàm thi t l p B(int) v i tham s ng m nh là 0.
B b; tương ương v i B b(0);
Cách 3: S d ng hàm thi t l p sao chép tương t như l p A.
B b1=b;
Nh n xét
Chúng ta ch có th khai báo i tư ng theo các hàm thi t l p có thu c tính quy n
truy nh p là public
Trang 19
20. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Trong hàm thi t l p cũng có th s d ng tham s ng m nh gi ng như các hàm
thành ph n khác.
V l p C:
Ch có th khai báo i tư ng theo hàm thi t l p C() b i vì hàm thi t l p sao chép ã
ư c ngư i s d ng nh nghĩa và t quy n truy xu t là private. Do v y không th
dùng hàm thi t l p sao chép. Ví d :
C c;
V l p D:
Không th khai báo i tư ng cho l p D b i vì trong l p này ch có hàm thi t l p sao
chép. Hàm thi t l p chép mu n s d ng ư c thì ph i có m t i tư ng c a l p D. Do
v y mu n khai báo ư c m t i tư ng thu c l p D thì trong l p D c n có m t hàm
thi t l p khác sa chép.
Ví d 5
Có bao nhiêu l n hàm thi t l p sao chép ư c g i trong o n mã chương trình sau:
Widget f(Widget u)
{
Widget v(u);
Widget w=v;
return w;
}
void main()
{
Widget x;
Widget y=f(f(x));
}
L i gi i:
Hàm thi t l p sao chép ư c g i 7 l n trong o n mã chương trình này. M i l n g i
hàm f òi h i 3 l n g i n hàm thi t l p sao chép: khi tham sô truy n vào b ng giá tr
u, khi v và w ư c kh i t o. L nh g i th b y là kh i t o y.
Ví d 6
Cho bi t k t qu in ra màn hình c a chương trình sau:
L i gi i
CT 2_6.CPP
#include <iostream.h>
#include <conio.h> 3.
class A
{
static int count;
public:
A() { count++;}
~A() { count--;}
static void printNum()
{
cout<<” Gia tri cua count la:”<<count<<endl;
}
};
int A::count=0;
void main()
{
clrscr();
A::printNum();
A a1;
a1.printNum();
A *pa=new A;
a1.printNum();
Trang 20
21. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
delete pa;
a1.printNum();
A a2=a1;
a2.printNum();
getch();
}
4.
L i gi i
K t q in ra màn hình:
Gia tri cua count la 0
Gia tri cua count la 1
Gia tri cua count la 2
Gia tri cua count la 1
Gia tri cua count la 1
Trong l p A, thu c tính count và hàm thành ph n printNum là các thành ph n tĩnh
ư c chia s b i m i i tư ng c a A. Ban u thu c tính count ư c khai báo kh i
t o là 0( dòng int A::count=0), do v y dòng u tiên c a chương trình chính ư c g i
n phương th c printNum s ưa ra màn hình giá tr c a count là 0. Ti p theo ta t o
m t i tư ng a1 s d ng hàm thi t l p d ng A(). Hàm này làm tăng count lên 1. Do
v y, dòng g i phương th c printNum ti p theo s ưa ra màn hình giá tr c a count là
1. Tương t i v i l nh new ta cũng t o ra m t i tư ng m i và lúc này giá tr c a
count là 2. Sau khi s d ng l nh new t o i tư ng, chương trình s d ng delete
xoá i tư ng ó kh i b nh . Lúc này hàm hu b ư c g i và count gi m xu ng 1.
i tư ng a2 ư c khai báo s d ng hàm thi t l p sao chép m c nh, mà hàm này
không làm thay i giá tr count. Do v y, count v n gi giá tr 1.
Ví d 6
Tim ra ch sai v quy n truy xu t trong o n chương trình sau:
class A
{
int pri;
public:
int bub;
friend void funcA(A);
firend class B;
};
class B
{
void func(A a)
{
cout<<a.pri;
cout<<a.pub;
}
};
class C
{
void func(A a)
{
cout<<a.pri;
cout<<a.pub;
Trang 21
22. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
}
};
void funcA(A a)
{
cout<<a.pri;
cout<<a.pub;
}
void funcB(A a)
{
cout<<a.pri;
cout<<a.pub;
}
L i gi i
Truy xu t n thu c tính pri c a i tư ng a trong hàm funcB và trong hàm thành
ph n func c a l p C là không th ư c. T t c các truy xu t n thu c tính pub u
ư c b i vì ây là thu c tính public. Trong hàm funcA, ta có th truy nh p ư c thu c
tính pri b i vì hàm này ã ư c khai báo là b n bè c a l p A. Tương t , t t c các
hàm thành ph n c a l p B cũng u có th truy xu t t i thu c tính pri c a l p A b i vì
l p B ã ư c coi là b n bè c a l p A.
Ví d 7
qu n lý i m thi vào trư ng HSPKTHY c a các thí sinh, ta xây d ng l p
ThiSinh mô t các thí sinh bao g m các thu c tính và phương th c sau:
- Tên thí sinh
- i m c a ba môn thi Toán, Lý, Hoá
- Nh p thông tin c a các thí sinh g m tên và i m c a ba môn thi Toán, Lý, Hoá
- In thông tin tên, i m và t ng i m thi 3 môn
- Tính t ng i m thi c a thí sinh
Trên cơ s l p ã xây d ng ư c, vi t chương trình làm các công vi c sau.
- Nh p danh sách k t qu thi c a các thí sinh vào t bàn phím
- ưa ra màn hình danh sách thí sinh trung tuy n( i m chu n vào trư ng là 18)
L i gi i
CT2_7.CPP
#include <iostream.h>
#include <stdio.h> 5.
#include <conio.h>
class ThiSinh
{
// Các thu c tính
char ten[25];// Tên c a thí sinh khôngdài quá 24 ký t
int toan, ly, hoa;// i m ba môn toán, lý, hoá
public:
// Các phương th c
void nhapdl();//Nh p d li u cho thí sinh
void inkq();// In k t qu thi c a thí sinh
int tong();// Tính t ng i m c a thí sinh
};
void ThiSinh::nhapdl()
{
cout<<”Nhap ten:”;fflush(stdin);gets(ten);
cout<<”Nhap diem toan:”;cin>>toan;
cout<<”Nhap diem ly:”;cin>>ly;
cout<<”Nhap diem hoa:”;cin>>hoa;
}
Trang 22
23. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
void ThiSinh::inkq()
{ // K t qu thi c a thí sinh ư c in trên m t dòng theo nh d ng
// Ten Toan Ly Hoa
Tong
printf(“%-25s%6d%6d%6%6dn”,ten,toan,ly,hoa,tong());
}
int ThiSinh::tong()
{
return (toan+ly+hoa);
}
void main()
{ // Chương trình chính th c hi n nh p danh sách vào s lư ng thí
// sinh c n nh p
clrscr();
int n;
cout<<”Cho so thi sinh:”;cin>>n;
// T o n i tư ng thí sinh cho n thí sinh c n nh p d li u
ThiSinh *dsts=new ThiSinh[n];
// Nh p d li u cho t ng thí sinh
for(int i=0;i<n;++i)
{
cout<<” Nhap du lieu cho thi sinh thu:”<<i+1<<endl;
// G i phương th c nh p d li u c a thí sinh th i trong m ng
dsts[i].nhapdl();
}
// In danh sách các thí sinh truýng tuy n
cout<<”Danh sach nhung nguoi trung truyen n”;
printf(“%-25s%6s%6s%s%6sn”,”Ten”,”Toan”,”Ly”,”Hoa”,”Tong”);
for(i=0;i<n;++i)
if(dsts[i].tong()>=18)
dsts[i].inkq();
// Xoá các i tư ng ã t o và k t thúc chương trình
delete dsts;
getch();
}
6.
Ví d 8: Hàm thi t l p v i các tham s m c nh
CT2_8.CPP
#include <iostream.H>
class Time 7.
{
public:
Time(int = 0, int = 0, int = 0); //Constructor mac dinh
void SetTime(int, int, int);
void PrintMilitary();
void PrintStandard();
private:
int Hour;
int Minute;
int Second;
};
//Ham constructor de khoi dong du lieu private
//Cac gia tri mac dinh la 0
Time::Time(int Hr, int Min, int Sec)
{
Trang 23
24. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
SetTime(Hr, Min, Sec);
}
//Thiet lap cac gia tri cua Hour, Minute va Second
//Gia tri khong hop le duoc thiet lap la 0
void Time::SetTime(int H, int M, int S)
{
Hour = (H >= 0 && H < 24) ? H : 0;
Minute = (M >= 0 && M < 60) ? M : 0;
Second = (S >= 0 && S < 60) ? S : 0;
}
//Hien thi thoi gian theo dang gio quan doi: HH:MM:SS
void Time::PrintMilitary()
{
cout << (Hour < 10 ? "0" : "") << Hour << ":"
<< (Minute < 10 ? "0" : "") << Minute << ":"
<< (Second < 10 ? "0" : "") << Second;
}
//Hien thi thoi gian theo dang chuan: HH:MM:SS AM (hoac PM)
void Time::PrintStandard()
{
cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12)
<< ":" << (Minute < 10 ? "0" : "") << Minute
<< ":" << (Second < 10 ? "0" : "") << Second
<< (Hour < 12 ? " AM" : " PM");
}
int main()
{
Time T1,T2(2),T3(21,34),T4(12,25,42),T5(27,74,99);
cout << "Constructed with:" << endl
<< "all arguments defaulted:" << endl << " ";
T1.PrintMilitary();
cout << endl << " ";
T1.PrintStandard();
cout << endl << "Hour specified; Minute and Second defaulted:"
<< endl << " ";
T2.PrintMilitary();
cout << endl << " ";
T2.PrintStandard();
cout << endl << "Hour and Minute specified; Second defaulted:"
<< endl << " ";
T3.PrintMilitary();
cout << endl << " ";
T3.PrintStandard();
cout << endl << "Hour, Minute, and Second specified:"
<< endl << " ";
T4.PrintMilitary();
cout << endl << " ";
T4.PrintStandard();
cout << endl << "all invalid values specified:"
<< endl << " ";
T5.PrintMilitary();
cout << endl << " ";
T5.PrintStandard();
cout << endl;
return 0;
}
8.
Trang 24
25. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Chương trình ví d trên kh i t o năm i tư ng c a l p Time ( dòng 52). i
tư ng T1 v i ba tham s l y giá tr m c nh, i tư ng T2 v i m t tham s ư c mô
t , i tư ng T3 v i hai tham s ư c mô t , i tư ng T4 v i ba tham s ư c mô t
và i tư ng T5 v i các tham s có giá tr không h p l .
K t qu
Ví d 9:L p có hàm hu b
CT 2_9.CPP
#include <iostream.h>
class Simple 9.
{
private:
int *X;
public:
Simple(); //Constructor
~Simple(); //Destructor
void SetValue(int V);
int GetValue();
};
Simple::Simple()
{
X = new int; //Cap phat vung nho cho X
}
Simple::~Simple()
{
delete X; //Giai phong vung nho khi doi tuong bi huy bo
}
Trang 25
26. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
void Simple::SetValue(int V)
{
*X = V;
}
int Simple::GetValue()
{
return *X;
}
int main()
{
Simple S;
int X;
cout<<"Enter a number:";
cin>>X;
S.SetValue(X);
cout<<"The value of this number:"<<S.GetValue();
return 0;
}
10.
k t qu
Ví d 10: Chương trình sau minh h a khai báo và s d ng hàm friend.
CT2_10.CPP
#include <iostream.H>
class Count
{
friend void SetX(Count &, int); //Khai bao friend
public:
Count()//Constructor
{
X = 0;
}
void Print() const //Xuat
{
cout << X << endl;
}
private:
int X;
};
//Co the thay doi du lieu private cua lop Count vi
//SetX() khai bao la mot ham friend cua lop Count
void SetX(Count &C, int Val)
{
Trang 26
27. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
C.X = Val; //Hop le: SetX() la mot friend cua lop Count
}
int main()
{
Count Object;
cout << "Object.X after instantiation: ";
Object.Print();
cout << "Object.X after call to SetX friend function: ";
SetX(Object, 8); //Thiet lap X voi mot friend
Object.Print();
return 0;
}
k t qu
D/ BÀI T P T GI I
Câu h i tr c nghi m
Câu 1:
Ch có m t kh ng nh trong nh ng câu sau là sai. Câu nào?
a./ M i th hi n c a m t l p có s h u riêng các thu c tính thông thư ng
b./ Các th hi n c a m t l p cùng chia s các thu c tính tĩnh c a l p ó
c./ M i th hi n c a m t l p có các nh nghĩa riêng cho các phương th c c a nó.
d./ M i i tư ng là m t th hi n c a m t l p
Câu 2:
Các t khoá public và private dùng
a./ Cho phép ngư i thi t k l p che d u m t ph n thi hành c a l p trư c ngư i s
d ng l p.
b./ Trình biên d ch t i ưu hoá chương trình
c./ m b o na toàn c a l p khi thi t k
d./ H n ch vi c sao chép l p
Câu 3
Ch ra l i sai v i các khai báo cho l p A
class A
{
A(int i);
};
A a1;//(1)
A b2(5) //(2)
a./ Ch dòng 1 l i
b./ Ch dòng 2 l i
c./ C hai dòng l i
d./ Không dòng nào l i
Câu 4:
Cho bi t giá tr c a n v i các dòng l nh sau:
Trang 27
28. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
class A
{
public:
static int i;
};
int A::i=5;
A a1;
a1.i++;
A a2;
int n=a2.i+1;
a./ n=5;
b./ n=6;
c./ n=7;
d./ Không câu nào úng
Câu 5:
Ch ra l i v i các khai báo cho l p A
class A
{
public:
A(int i);
};
A a1(5);
A a3;// (1)
A a2=a1;// (2)
a./ Ch dòng 1 l i
b./ Ch dòng 2 l i
c./ C 2 dòng l i
d./ Không dòng nào l i
Bài tâp
Bài 2.1: Xây d ng l p Stack, d li u bao g m nh stack và vùng nh c a stack. Các
thao tác g m:
Kh i ng stack.
Ki m tra stack có r ng không?
Ki m tra stack có y không?
Push và pop.
Bài 2.2: Xây d ng l p hình tr Cylinder, d li u bao g m bán kính và chi u cao c a
hình tr . Các thao tác g m hàm tính di n tích toàn ph n và th tích c a hình tr ó.
Bài 2.3: Hãy xây d ng m t l p Point cho các i m trong không gian ba chi u (x,y,z).
L p ch a m t constructor m c nh, m t hàm Negate() bi n i i m thành i
lư ng có d u âm, m t hàm Norm() tr v kho ng cách t g c và m t hàm Print().
Bài 2.4: Xây d ng m t l p Matrix cho các ma tr n bao g m m t constructor m c nh,
hàm xu t ma tr n, nh p ma tr n t bàn phím, c ng hai ma tr n, tr hai ma tr n và nhân
hai ma tr n.
Trang 28
29. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Bài 2.5: Xây d ng m t l p Matrix cho các ma tr n vuông bao g m m t constructor m c
nh, hàm xu t ma tr n, tính nh th c và tính ma tr n ngh ch o.
Bài 2.6: Xây d ng l p Person qu n lý h tên, năm sinh, i m chín môn h c c a t t
c các h c viên c a l p h c. Cho bi t bao nhiêu h c viên trong l p ư c phép làm lu n
văn t t nghi p, bao nhiêu h c viên thi t t nghi p, bao nhiêu ngư i ph i thi l i và tên
môn thi l i. Tiêu chu n xét:
Làm lu n văn ph i có i m trung bình l n hơn 7 trong ó không có môn
nào dư i 5.
Thi t t nghi p khi i m trung bình không l n hơn 7 và i m các môn
không dư i 5.
Thi l i có môn dư i 5.
Bài 2.7: Xây d ng m t l p String. M i i tư ng c a l p String s i di n m t chu i ký
t . Các thành viên d li u là chi u dài chu i và chu i ký t th c. Ngoài constructor và
destructor còn có các phương th c như t o m t chu i v i chi u dài cho trư c, t o m t
chu i t m t chu i ã có.
Bài 2.8: Xây d ng m t l p Vector lưu tr vector g m các s th c. Các thành viên
d li u g m:
Kích thư c vector.
M t m ng ng ch a các thành ph n c a vector.
Ngoài constructor và destructor, còn có các phương th c tính tích vô hư ng c a hai
vector, tính chu n c a vector (theo chu n b t kỳ nào ó).
Bài 2.9: Xây d ng l p Employee g m h tên và ch ng minh nhân dân. Ngoài
constructor còn có phương th c nh p, xu t h tên và ch ng minh nhân dân ra màn
hình
Bài 2.10:
M t l p i tư ng sách trong h th ng qu n lí thư vi n có các thu c tính
- Tên sách
- T ng s quy n sách
- S quy n sách ã cho mư n
Xây d ng l p i tư ng trên v i các phương th như sau
- Phương th nh p d li u cho i tư ng t bàn phím. Các thông tin c n nh p là
tên sách, t ng s sách, s ã cho mư n.
- Phương th c in thông tin i tư ng ra màn hình bao g m tên, t ng s và s ã
cho mư n.
- Phương th c tính s sách còn l i trong thư vi n(t ng s - s mư n)
Trên cơ s l p xây d ng ư c, vi t chương trình chính th c hi n các công vi c.
- Nh p danh sách các quy n sách v i s lư ng sách c n nh p ư c cho vào t
bàn phím.
- ưa ra màn hình thông tin v các quy n sách hi n có trong thư vi n(s sách còn
l i ph i l n hơn 0)
Trang 29
30. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Bài 2.11:
Vi t m t l p bi u di n hình ch nh t có các thu c tính là dài hai c nh( chi u r ng
và chi u dài) và có các phương th c sau.
- Nh p d li u hai c nh cho hình ch nh t
- Tính chu vi và di n tích hình ch nh t
- In thông tin c a hình ch nh t ra màn hình(bao g m dài hai c nh, chu vi và
di n tích)
Trên cơ s l p xây d ng ư c vi t chương trình cho phép ngư i s d ng nh p d
li u c a m t hình ch nh t r i in thông tin v nó ra màn hình.
Bài 2.12:
Xây d ng m t l p Date mô t thông tin v ngày, tháng, năm(month, day, year). L p
Date có các hàm thành ph n:
- Hàm thi t l p v i ba tham s có giá tr m c nh( ó là ngày h th ng)
- Nh p d li u ngày, tháng và năm
- Hàm in thông tin v ngày tháng năm dư i d ng mm-dd-yy
- Hàm nextDay() tăng Date t ng ngày m t
Trên cơ s l p Date v a x y d ng vi t chương trình cho bi t kho ng cách ngày gi a
hai m c th i gian v i ngày b t u ư c nh p vào t bàn phím cho tơi ngày hi n th i.
Bài 2.13:
Xây d ng l p Stack và l p Queue mô t ho t ng c a ngăn x p và hàng i các sô
nguyên.
Bài 2.14:
Xây d ng m t l p mô t các b ng thi u bóng á g i là BangThiDau. Gi thi t m i
b ng có b n i và thi u chéo t ng c p. Có l ch các tr n u c a b ng. T o các
phương th c nh p k t qu thi u và tính i m cho t ng i. Yêu c u vi c nh p k t
q a thi u ph i theo th t th i gian. Thêm các phương th c hi n th thông tin thi u
c a t ng i và c a c b ng. Vi t chương trình ki m nghi m l p xây d ng ư c.
Bài 2.15:
M r ng bài t p trên v i l p DoiBong mô t các i bóng thi u. Thông tin c a m i
ôi bóng bao g m tên i bóng, danh sách c u th , và hu n luy n viên. L p
bangThiDau s d ng các i tư ng c a l p DoiBong làm i bóng thi u c a b ng.
Các b ng lúc này có th m thu c tính tên c a b ng thi u.
S d ng các l p ã xây d ng trên vi t chương trình qu n lý thi u c a cúp
bóng á th gi i có 32 i thi u ư c chia làm 8 b ng. T o thêm l p mô t l ch thi
u cho các vòng ti p theo c a gi i. Yêu c u c a chương trình như sau:
- Ban u ngư i s d ng nh p các thông tin v i bóng, sau ó phân b ng và l ch
thi u toàn gi i.
- K t qu các tr n thi u ư c vào theo th t l ch thi u
- Chương trình t ng ch n các i vào vòng ti p theo cho t i tr n trung k t.
- T i m i th i i m c a gi i chương trình có th ưa ra các thông tin v gi i.
Bài 2.16:
M t quy n s i n tho i ch a các th có thông tin v tên, a ch và s i n tho i.
Thi t k các l p tương ng v i các th thông tin và s i n tho i. Vi t chương trình cho
phép qu n lý s i n tho i d a trên các l p xây d ng ư c.
Trang 30
31. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
§Þnh nghÜa chång to¸n tö trªn líp
M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C
Cách nh nghĩa các phép toán cho ki u d li u l p và c u trúc
Các toán t chuy n ki u áp d ng cho ki u d li u l p
A/ NH C L I LÝ THUY T
Toán t ư c nh nghĩa ch ng b ng cách nh nghĩa m t hàm toán t . Tên hàm
toán t bao g m t khoá operator theo sau là ký hi u c a toán t ư c nh nghĩa
ch ng.
H u h t các toán t c a C++ u có th nh nghĩa ch ng. Không th t o ra các ký
hi u phép toán m i.
Ph i m b o các c tính nguyên thu c a toán t ư c nh nghĩa ch ng, ch ng
h n: ưu tiên, tr t t k t h p, sô ngôi.
Không s d ng tham s có giá tr ng m nh nh nghĩa ch ng toán t .
Các toán t (), [], ->, = yêu c u hàm toán t ph i là hàm thành ph n c a l p.
Hàm toán t có th là hàm thành ph n hay là hàm b n c a l p
Khi hàm toán t là hàm thành ph n, toán h ng bên trái luôn là i thu c l p.
N u toán h ng bên trái là i tư ng c a l p khác thì hàm toán t tương ng ph i là
hàm b n.
Chương trình d ch không t bi t cách chuy n ki u gi a ki u d li u chu n và ki u
d li u t nh nghĩa. Vì v y ngư i l p trình c n ph i mô t tư ng minh các chuy n i
này dư i d ng hàm thi t l p chuy n ki u hay hàm toán t chuy n ki u.
M t hàm toán t chuy n ki u th c hi n chuy n i t m t i tư ng thư c l p sang
i tư ng thu c l p khác ho c m t i tư ng có ki u ư c nh nghĩa trư c.
Hàm thi t l p chuy n ki u có m t tham s và th c hi n chuy n i t m t giá tr
sang i tư ng ki u l p.
Toán t gán là toán t hay ư c nh nhgiã ch ng nh t, c bi t khi l p có các thành
ph n d li u ng.
nh nghĩa ch ng toán t tăng, gi m m t ngôi, ph i phân bi t hai hàm toán t
tư ng ng cho d ng ti n t và d ng h u t .
B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...)
Các l i thư ng g p
T o m t toán t
Thay i nh nghĩa c a các toán t trên các ki u ư c nh nghĩa trư c
Cho r ng vi c nh nghĩa ch ng m t toán t s t ng kéo theo nh nghĩa ch ng
c a các toán t liên quan.
Quên nh nghĩa ch ng toán t gán và hàm thi t l p sao chép cho các l p có các
thành ph n d li u ng.
M t s thói quen l p trình t t
S d ng toán t nh nghĩa ch ng khi i u ó làm cho chương trình trong sáng
hơn.
Tránh l m d ng nh nghĩa ch ng toán t vì i u ó ãn n khó ki m soát chương
trình.
Chú ý n các tính ch t nguyên thu c a toán t ư c nh nghĩa ch ng.
Hàm thi t l p, toán t gán, hàm thi t l p sao chép c a m t l p thư ng i cùng
nhau.
Trang 31
32. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
C/ BÀI T P M U
Ví d 1:
M t l p phân s có toán t c ng(+) ư c nh nghĩa như sau:
class PS
{
public:
PS(int ts=0, int ms=1);
PS operator+(PS);
};
Trong các dòng l nh sau ây dòng nào sai?
PS a,b,c;
a=b+c;//(1)
a=b+3;//(2)
a=3+b;//(3)
L i gi i
Trong ba dòng l nh thì hai dòng u là úng b i vì lúc ó ta có:
(1) a=b.operator+(c) là toán t ã ư c nh nghĩa trong l p phân s
(2) a=b.operator+(3) v i 3 s t ng chuy n ki u thành phân s
Dòng l nh (3) sai vì ta không có toán t c ng m t s nguyên v i m t phân s .
có th th c hi n ư c t t c ba dòng l nh như trên thì toán t c ng trong l p PS
ph i ư c nh nghĩa là m t hàm b n.
class PS
{
public:
PS(int ts=0, int ms=1);
friend PS operator+(PS);
};
Khi ó các l i g i s tương ng v i toán t như sau:
(1) a=operator+(b,c)
(2) a=operator+(b,3)
(3) a=operator+(3,b)
Ví d 2:Chúng ta xây d ng l p s ph c v i tên l p là Complex và a năng hóa toán t
+ trên l p này.
CT3_1.CPP
#include <iostream.h>
class Complex 11.
{
private:
double Real,Imaginary;
public:
Complex(double R=0.0,double I=0.0);//Constructor mac
dinh
void Print();//Hien thi so phuc
Complex operator + (Complex Z);//Phep cong hai so phuc
Complex operator + (double R);//Phep cong mot so phuc
voi mot so thuc
};
Complex::Complex(double R,double I)
{
Real = R;
Imaginary = I;
}
Trang 32
33. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
void Complex::Print()
{
cout<<'('<<Real<<','<<Imaginary<<')';
}
Complex Complex::operator + (Complex Z)
{
Complex Tmp;
Tmp.Real = Real + Z.Real;
Tmp.Imaginary = Imaginary + Z.Imaginary;
return Tmp;
}
Complex Complex::operator + (double R)
{
Complex Tmp;
Tmp.Real = Real + R;
Tmp.Imaginary = Imaginary;
return Tmp;
}
int main()
{
Complex X,Y(4.3,8.2),Z(3.3,1.1);
cout<<"X: ";
X.Print();
cout<<endl<<"Y: ";
Y.Print();
cout<<endl<<"Z: ";
Z.Print();
X = Y + Z;
cout<<endl<<endl<<"X = Y + Z:"<<endl;
X.Print();
cout<<" = ";
Y.Print();
cout<<" + ";
Z.Print();
X = Y + 3.5;
cout<<endl<<endl<<"X = Y + 3.5:"<<endl;
X.Print();
cout<<" = ";
Y.Print();
cout<<" + 3.5";
return 0;
}
12.
k t qu
Trang 33
34. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Ví d 3:
Cho m t l p có toán t chuy n ki u như sau:
class A
{
public:
operator int ();
};
Khi ó ta có th s d ng câu l nh nào trong nh ng câu l n sau:
A a;
int i=a;//(1)
float f=a;//(2)
L i gi i
L nh (1) là úng b i vì ta ã có toán t ép ki u int nên chương trình t ng ép ki u
v m t s nguyên. Còn l nh 2 sai b i vì ta không có toán t ép ki u float.
Ví d 4 a năng hóa toán t [] truy c p n m t ph n t c a vector.
CT3_4.CPP
#include <iostream.h>
class Vector 13.
{
private:
int Size;
int *Data;
public:
Vector(int S=2,int V=0);
~Vector();
void Print() const;
int & operator [] (int I);
};
Vector::Vector(int S,int V)
{
Size = S;
Data=new int[Size];
for(int I=0;I<Size;++I)
Data[I]=V;
}
Vector::~Vector()
{
delete []Data;
}
void Vector::Print() const
{
cout<<"Vector:(";
Trang 34
35. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
for(int I=0;I<Size-1;++I)
cout<<Data[I]<<",";
cout<<Data[Size-1]<<")"<<endl;
}
int & Vector::operator [](int I)
{
return Data[I];
}
int main()
{
Vector V(5,1);
V.Print();
for(int I=0;I<5;++I)
V[I]*=(I+1);
V.Print();
V[0]=10;
V.Print();
return 0;
}
14.
k t qu
Ví d 5: a năng hóa toán t () truy c p n m t ph n t c a vector.
CT3_5.CPP
//Chuong trinh 4.6
#include <iostream.h> 15.
class Vector
{
private:
int Size;
int *Data;
public:
Vector(int S=2,int V=0);
~Vector();
void Print() const;
int & operator () (int I);
};
Vector::Vector(int S,int V)
{
Size = S;
Data=new int[Size];
for(int I=0;I<Size;++I)
Data[I]=V;
}
Vector::~Vector()
{
Trang 35
36. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
delete []Data;
}
void Vector::Print() const
{
cout<<"Vector:(";
for(int I=0;I<Size-1;++I)
cout<<Data[I]<<",";
cout<<Data[Size-1]<<")"<<endl;
}
int & Vector::operator ()(int I)
{
return Data[I];
}
int main()
{
Vector V(5,1);
V.Print();
for(int I=0;I<5;++I)
V(I)*=(I+1);
V.Print();
V(0)=10;
V.Print();
return 0;
}
16.
k t qu
Ví d 6: a năng hóa toán t () truy c p n ph n t c a ma tr n.
CT3_6.CPP
//Chuong trinh 4.7
#include <iostream.h> 17.
class Matrix
{
private:
int Rows,Cols;
int **Data;
public:
Matrix(int R=2,int C=2,int V=0);
~Matrix();
void Print() const;
int & operator () (int R,int C);
};
Matrix::Matrix(int R,int C,int V)
{
int I,J;
Rows=R;
Cols=C;
Trang 36
37. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Data = new int *[Rows];
int *Temp=new int[Rows*Cols];
for(I=0;I<Rows;++I)
{
Data[I]=Temp;
Temp+=Cols;
}
for(I=0;I<Rows;++I)
for(J=0;J<Cols;++J)
Data[I][J]=V;
}
Matrix::~Matrix()
{
delete [] Data[0];
delete [] Data;
}
void Matrix::Print() const
{
int I,J;
for(I=0;I<Rows;++I)
{
for(J=0;J<Cols;++J)
{
cout.width(5);//Hien thi canh ler phai voi chieu
dai 5 ky tu
cout<<Data[I][J];
}
cout<<endl;
}
}
int & Matrix::operator () (int R,int C)
{
return Data[R][C];
}
int main()
{
int I,J;
Matrix M(2,3,1);
cout<<"Matrix:"<<endl;
M.Print();
for(I=0;I<2;++I)
for(J=0;J<3;++J)
M(I,J)*=(I+J+1);
cout<<"Matrix:"<<endl;
M.Print();
return 0;
}
18.
k t qu
Trang 37
38. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Ví d 7: a năng hóa toán t ++ và --
CT3_7.CPP
#include <iostream.h>
19.
class Point
{
private:
int X,Y;
public:
Point(int A=0,int B=0);
Point operator ++();
Point operator --();
void Print() const;
};
Point::Point(int A,int B)
{
X = A;
Y = B;
}
Point Point::operator++()
{
++X;
++Y;
return *this;
}
Point Point::operator--()
{
--X;
--Y;
return *this;
}
void Point::Print() const
{
cout<<"X="<<X<<",Y="<<Y<<endl;
}
int main()
{
Point P1(2,6),P2(5,8);
cout<<"Point 1:";
P1.Print();
cout<<"Point 2:";
P2.Print();
++P1;
--P2;
cout<<"Point 1:";
P1.Print();
Trang 38
39. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
cout<<"Point 2:";
P2.Print();
return 0;
}
20.
K t qu
Ví d 8: a năng hóa toán t d u ph y.
CT3_8.CPP
#include <iostream.h>
21.
class Point
{
private:
int X,Y;
public:
Point(int A=0,int B=0);
Point operator +(Point P);
Point operator ,(Point P);
void Print() const;
};
Point::Point(int A,int B)
{
X = A;
Y = B;
}
Point Point::operator+(Point P)
{
Point Tmp;
Tmp.X=X+P.X;
Tmp.Y=Y+P.Y;
return Tmp;
}
Point Point::operator,(Point P)
{
Point Tmp;
Tmp.X=P.X;
Tmp.Y=P.Y;
cout<<P.X<<" "<<P.Y<<endl;
return Tmp;
}
void Point::Print() const
{
cout<<"X="<<X<<",Y="<<Y<<endl;
}
Trang 39
40. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
int main()
{
Point P1(2,6),P2(5,20),P3(1,1);
cout<<"Point 1:";
P1.Print();
cout<<"Point 2:";
P2.Print();
cout<<"Point 3:";
P3.Print();
P1=(P1,P1+P2,P3);
cout<<"Point 1:";
P1.Print();
return 0;
}
22.
k t qu
Ví d 9: a năng hóa toán t ->.
CT3_9.CPP
#include <iostream.h>
23.
class MyClass
{
public:
int Data;
MyClass * operator ->()
{
return this;
}
};
int main()
{
MyClass M;
M->Data = 10;
cout<<M.Data<<" "<<M->Data;
return 0;
}
24.
k t qu
Ví d 10: a năng hóa toán t gán.
CT3_10.CPP
Trang 40
41. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
#include <iostream.h>
#include <string.h> 25.
class String
{
private:
char *St;
int Len;
public:
String(char *S);
~String();
char *GetStr();
String & operator=(String &Obj);
};
String::String(char *S)
{
Len=strlen(S);
St=new char[Len+1];
strcpy(St,S);
}
String::~String()
{
delete []St;
}
char * String::GetStr()
{
return St;
}
String & String::operator=(String &Obj)
{
if (Len< Obj.Len)
{
delete [] St;
St=new char[Obj.Len+1];
}
Len=Obj.Len;
strcpy(St,Obj.St);
return *this;
}
int main()
{
String S1("Hello"), S2("Chao");
cout<<"S1="<<S1.GetStr()<<endl;
cout<<"S2="<<S2.GetStr()<<endl;
S2=S1;
cout<<"S1="<<S1.GetStr()<<endl;
cout<<"S2="<<S2.GetStr()<<endl;
return 0;
}
26.
k t qu
Trang 41
42. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Ví d 11: Chúng ta s xây d ng m t l p x lý vi c t o và thao tác trên các chu i
(string). C++ không cài s n ki u d li u chu i. Nhưng C++ cho phép chúng ta thêm
ki u chu i như m t l p thông qua cơ ch a năng hóa.
CT3_11.CPP
#include <iostream.h>
#include <iomanip.h> 27.
#include <string.h>
#include <assert.h>
class String
{
private:
char *Ptr; //Con tro tro den diem bat
dau cua chuoi
int Length; //Chieu dai chuoi
public:
String(const char * = ""); //Constructor
chuyen doi
String(const String &); //Constructor
sao chep
~String(); //Destructor
const String &operator=(const String &);
//Phep gan
String &operator+=(const String &);
int operator!() const;
int operator==(const String &) const;
int operator!=(const String &) const;
int operator<(const String &) const;
int operator>(const String &) const;
int operator>=(const String &) const;
int operator<=(const String &) const;
char & operator[](int); //Tra ve ky
tu tham chieu
String &operator()(int, int); //Tra ve mot
chuoi con
int GetLength() const;
friend ostream &operator<<(ostream &,
const String &);
friend istream &operator>>(istream &,
String &);
};
//Constructor sao chep: Chuyen doi char * thanh String
String::String(const char *S)
{
cout << "Conversion constructor: " << S << endl;
Length = strlen(S);
Ptr = new char[Length + 1];
assert(Ptr != 0);
strcpy(Ptr, S);
}
String::String(const String &Copy)
{
cout << "Copy constructor: " << Copy.Ptr << endl;
Trang 42
43. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Length = Copy.Length;
Ptr = new char[Length + 1];
assert(Ptr != 0);
strcpy(Ptr, Copy.Ptr);
}
//Destructor
String::~String()
{
cout << "Destructor: " << Ptr << endl;
delete [] Ptr;
}
const String &String::operator=(const String &Right)
{
cout << "operator= called" << endl;
if (&Right != this)
{
delete [] Ptr;
Length = Right.Length;
Ptr = new char[Length + 1];
assert(Ptr != 0);
strcpy(Ptr, Right.Ptr);
}
else
cout << "Attempted assignment of a String
to itself" << endl;
return *this;
}
String &String::operator+=(const String &Right)
{
char *TempPtr = Ptr;
Length += Right.Length;
Ptr = new char[Length + 1];
assert(Ptr != 0);
strcpy(Ptr, TempPtr);
strcat(Ptr, Right.Ptr);
delete [] TempPtr;
return *this;
}
int String::operator!() const
{
return Length == 0;
}
int String::operator==(const String &Right) const
{
return strcmp(Ptr, Right.Ptr) == 0;
}
int String::operator!=(const String &Right) const
{
return strcmp(Ptr, Right.Ptr) != 0;
}
int String::operator<(const String &Right) const
{
return strcmp(Ptr, Right.Ptr) < 0;
}
int String::operator>(const String &Right) const
Trang 43
44. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
{
return strcmp(Ptr, Right.Ptr) > 0;
}
int String::operator>=(const String &Right) const
{
return strcmp(Ptr, Right.Ptr) >= 0;
}
int String::operator<=(const String &Right) const
{
return strcmp(Ptr, Right.Ptr) <= 0;
}
char &String::operator[](int Subscript)
{
assert(Subscript >= 0 && Subscript < Length);
return Ptr[Subscript];
}
String &String::operator()(int Index, int SubLength)
{
assert(Index >= 0 && Index < Length && SubLength
>= 0);
String *SubPtr = new String;
assert(SubPtr != 0);
if ((SubLength == 0) || (Index + SubLength >
Length))
SubPtr->Length = Length - Index + 1;
else
SubPtr->Length = SubLength + 1;
delete SubPtr->Ptr;
SubPtr->Ptr = new char[SubPtr->Length];
assert(SubPtr->Ptr != 0);
strncpy(SubPtr->Ptr, &Ptr[Index], SubPtr->Length);
SubPtr->Ptr[SubPtr->Length] = '0';
return *SubPtr;
}
int String::GetLength() const
{
return Length;
}
ostream &operator<<(ostream &Output, const String &S)
{
Output << S.Ptr;
return Output;
}
istream &operator>>(istream &Input, String &S)
{
char Temp[100];
Input >> setw(100) >> Temp;
S = Temp;
return Input;
}
int main()
{
String S1("happy"), S2(" birthday"), S3;
cout << "S1 is "" << S1 << ""; S2 is "" << S2
<< ""; S3 is "" << S3 << '"' << endl
<< "The results of comparing S2 and S1:"
Trang 44
45. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
<< endl
<< "S2 == S1 yields " << (S2 == S1) <<
endl
<< "S2 != S1 yields " << (S2 != S1) <<
endl
<< "S2 > S1 yields " << (S2 > S1) <<
endl
<< "S2 < S1 yields " << (S2 < S1) <<
endl
<< "S2 >= S1 yields " << (S2 >= S1) <<
endl
<< "S2 <= S1 yields " << (S2 <= S1) <<
endl;
cout << "Testing !S3:" << endl;
if (!S3)
{
cout << "S3 is empty; assigning S1 to S3;"
<< endl;
S3 = S1;
cout << "S3 is "" << S3 << """ << endl;
}
cout << "S1 += S2 yields S1 = ";
S1 += S2;
cout << S1 << endl;
cout << "S1 += " to you" yields" << endl;
S1 += " to you";
cout << "S1 = " << S1 << endl;
cout << "The substring of S1 starting at" << endl
<< "location 0 for 14 characters, S1(0,
14), is: "
<< S1(0, 14) << endl;
cout << "The substring of S1 starting at" << endl
<< "location 15, S1(15, 0), is: "
<< S1(15, 0) <<endl; // 0 is "to end of
string"
String *S4Ptr = new String(S1);
cout << "*S4Ptr = " << *S4Ptr <<endl;
cout << "assigning *S4Ptr to *S4Ptr" << endl;
*S4Ptr = *S4Ptr;
cout << "*S4Ptr = " << *S4Ptr << endl;
delete S4Ptr;
S1[0] = 'H';
S1[6] = 'B';
cout <<"S1 after S1[0] = 'H' and S1[6] = 'B' is:
"<< S1 << endl;
cout << "Attempt to assign 'd' to S1[30] yields:"
<< endl;
S1[30] = 'd'; //Loi: Chi so vuot khoi mien!!!
return 0;
}
28.
k t qu
Trang 45
46. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
D/ BÀI T P T GI I
Câu h i tr c nghi m
Câu 1:
nh nghĩa nào úng cho toán t nh p(>>) c a m t l p T
a) istream& operator>>(istream&);
b) istream& operator>>(istream);
c) friend istream& operator>>(istream&, T&);
d) friend istream& operator>>(istream&, T);
Trang 46
47. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Câu 2
nh nghĩa nào phù h p nh t cho toán t l y thành ph n([]) c a l p m ng A
a) int operator [] (int)
b) int& operator [] (int)
c) friend int operator [] (A&, int)
d) friend int& operator [] (A&, int)
Câu 3:
Ch ra cách nh nghĩa toán t cho l p T b sai
a) T operator-(T&)
b) T operator-()
c) T operator-()
d) friend T opreator +(T&);
e) T operator +(T&);
Câu 4:
Ch ra cách nh nghĩa toán t cho l p T bíai
a) T& operator ++()
b) T operator ++();
c) T& operator++(int);
d) T&operator++(float)
Câu 5:
Cho l p A
class A
{
public:
operator int ();
};
A a;
int i=a;(1)
float f=a;(2)
Ch ra dòng nào có l i
a) Ch dòng 1 l i
b) Ch dòng 2 l i
c) C hai dòng u l i
d) Không dòng nào l i
Bài tâp
Bài 1:
T o ki u d li u Date bi u di n ngày, tháng, năm. Cài t các toán t tính m t
ngày trư c ho c sau m t ngày xác nh nào ó, tính kho ng cách thao ngày gi a hai
ngày xác nh, tính th trong tu n c a ngày. Các toán t
vào ra cho ngày.
Bài 2:
lưu tr m t ma tr n i x ng thì không c n ô nh cho t t c các ph n t c a
nó. Xây d ng l p bi u di n ma tr n i x ng có các toán t truy nh p t ng ph n t c a
ma tr n. Ch s d ng lư ng b nh c n thi t lưu ma tr n i x ng
Bài 3
Xây d ng l p bi u di n các a th c v i các toán t c ng, tr , nhân, chia và o d u.
nh nghĩa toán t xu t k t xu t.
Bài 4:
Xây d ng m t l p map cho phép bi u di n m t ánh x t m t chu i kí t thành m t
giá tr s nguyên. nh nghĩa toán t [] cho l p có th s d ng ánh x theo cách như
[“abc”]->5
Trang 47
48. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio.
Bài 5
Xây d ng m t l p bi u di n các vector n chi u v i các toán t c ng, tr , tích có
hư ng hai vector và tích vô hư ng m t vector v i m t s th c. nh nghĩa toán t cho
phép truy nh p các thành ph n c a vector.
Trang 48