L P TRÌNH HƯ NG
I TƯ NG V I C++
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 tố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 .
- Tố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à
tồ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
Qn ó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 ngun 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
L P TRÌNH HƯ NG
I TƯ NG V I C++
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.
*/
#include <iostream.h>
void main()
{
int I;
for(I = 0; I < 10 ; ++ I)// 0 - 9
cout<
}
1.
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
L P TRÌNH HƯ NG
}
I TƯ NG V I C++
cin>>X;
cout<< "Nhap vao mot so Y:";
cin>>Y;
cout<<"Tong cua chung:"<
cout<<"Hieu cua chung:"<
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 1\n”;
cout<<”2. Cong viec 2\n”;
cout<<”3. Cong viec 3\n”;
cout<<”4. Ket thuc chuong trinh \n\n”;
}
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 1\n”; break;
case 2:cout<<”Thuc hien cong viec 2\n”; break;
case 3:cout<<”Thuc hien cong viec 3\n”; 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
{ int a[100];
cin>>a[i];
}
for(i=0;i
cout<
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
L P TRÌNH HƯ NG
I TƯ NG V I C++
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 ngồ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 ngun 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 xố 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
L P TRÌNH HƯ NG
I TƯ NG V I C++
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<
int &l=foo(i,j);
l++ ;
cout<
}
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
hốn v hai s ngun. 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
{
cout<<”a[“<
}
// Sap xep
for(i=0;i
for(int j=i++;j
Trang 5
L P TRÌNH HƯ NG
}
I TƯ NG V I C++
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
cout<
delete a;
Ví d 9: Chương trình t o m t m ng
nhiên và s p x p chúng.
ng, kh i
ng m ng này v i các giá tr ng u
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 phat\n";
}
srand((unsigned)time(NULL));
for(int I=0;I
P[I]=rand()%100; //T o các s ng u nhiên t 0
cout<<"Mang truoc khi sap xep\n";
for(I=0;I
cout<
for(I=0;I
for(int J=I+1;J
if (P[I]>P[J])
{
int Temp=P[I];
P[I]=P[J];
P[J]=Temp;
}
cout<<"\nMang sau khi sap xep\n";
for(I=0;I
cout<
delete []P;
}
n 99
k t qu
Trang 6
L P TRÌNH HƯ NG
I TƯ NG V I C++
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!"<
return 1;
}
//C p phát vùng nh cho ma tr n B
if (!AllocMatrix(&B,M,N))
{
Trang 7
L P TRÌNH HƯ NG
I TƯ NG V I C++
cout<<"Khong con du bo nho!"<
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!"<
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"<
InputMatrix(A,M,N,'A');
cout<<"Nhap ma tran thu 2"<
InputMatrix(B,M,N,'B');
clrscr();
cout<<"Ma tran thu 1"<
DisplayMatrix(A,M,N);
cout<<"Ma tran thu 2"<
DisplayMatrix(B,M,N);
AddMatrix(A,B,C,M,N);
cout<<"Tong hai ma tran"<
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
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
for(int J=0;J
{
cout<
cin>>A[I*N+J];
}
}
//Hi n th ma tr n
void DisplayMatrix(int *A,int M,int N)
{
Trang 8
L P TRÌNH HƯ NG
}
I TƯ NG V I C++
for(int I=0;I
{
for(int J=0;J
{
out.width(7);//Hien thi canh le phai voi chieu dai 7 ky tu
cout<
}
cout<
}
k t
D/ BÀI T P T
qu
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
L P TRÌNH HƯ NG
I TƯ NG V I C++
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)
b)
c)
d)
x=1,y=2;
x=1,y=3
x=3,y=2
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
nh p/xu t trong C++.
d ng l i các dịng
/*
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
L P TRÌNH HƯ NG
I TƯ NG V I C++
for(i = 2;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 %d\n",i);
}
Bài 1.2: Vi t chương trình nh p vào s nguyên dương h (2
giác có chi u cao là h như các hình sau:
Bài 1.3: M t tam giác vng 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
phân và th p l c phân tương ng.
1
n 256 dư i d ng nh phân, bát
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
L P TRÌNH HƯ NG
I TƯ NG V I C++
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)
sang các d ng s tương ng.
chuy n
i chu i
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
L P TRÌNH HƯ NG
I TƯ NG V I C++
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 khố. T khố
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