Tải bản đầy đủ (.pdf) (18 trang)

kỹ thuật lập trình C chuyên nghiệp phần 10 pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (570.39 KB, 18 trang )

ii.ii. TìmTìm kiếmkiếmnhịnhị
p
hân
p
hân
pp
intint searchBinary(intsearchBinary(int left,intleft,int right,right, intx){intx){
if
(
left<ri
g
ht
){
if
(
left<ri
g
ht
){
(g){(g){
intint mid=(left+right)/mid=(left+right)/22;;
if
(
x==A
[
i
])
returnif
(
x==A
[


i
])
return ii
;;
([])([])
;;
if(x<A[i])returnif(x<A[i])return searchBinary(left,midsearchBinary(left,mid 11,x),x);;
returnreturn
searchBinary(mid
+
searchBinary(mid
+
11
,right,x),right,x)
;;
returnreturn
searchBinary(midsearchBinary(mid
11
,right,x),right,x)
;;
}}
returnreturn

11
;;
returnreturn
11
;;
}}
iiiiii

PhânPhân
tíchtích
mộtmột
sốsố
nguyênnguyên
rara
thừathừa
sốsố
nguyênnguyên
tốtố
((
BàiBài
iii
.
iii
.
PhânPhân
tíchtích
mộtmột
sốsố
nguyênnguyên
rara
thừathừa
sốsố
nguyênnguyên
tốtố
((
BàiBài
tậptập))
Phạm Thế Bảo

2.2. ĐệĐệ quyquy nhánhnhánh
LàLà dạngdạng đệđệ quyquy màmà trongtrong quáquá trìnhtrình đệđệ quy,quy, lờilờigọigọi đượcđượcthựcthựchiệnhiện
nhiềunhiềulầnlần
VíVí dụdụ::
i.i. ThápTháp HàHà nộinội
iiii
LiệtLiệt
kêkê
tấttất
cảcả
hoánhoán
vịvị
củacủa
nn
phầnphần
tửtử
kháckhác
nhaunhau
ii
.
ii
.
LiệtLiệt
kêkê
tấttất
cảcả
hoánhoán
vịvị
củacủa
nn

phầnphần
tửtử
kháckhác
nhaunhau

ThuậtThuậttoántoán::
XétXét tấttấtcảcả cáccác phầnphầntửtử aa
ii
vớivớii=i=11 nn
BỏBỏ
hầhầ
tửtử
khỏikhỏi
dãdã
ốố
BỏBỏ
phầ
n
phầ
n
tửtử
aa
ii
rara
khỏikhỏi

y

ys


s

GhiGhi nhậnnhận đãđãlấylấyrara phầnphầntửtử aa
ii
HoánHoán vịvị (Dãy(Dãy số)số)
ĐĐ
hầhầ
tửtử
àà
l il i
dãdã
ốố
Đ
ưa
Đ
ưa
phầ
n
phầ
n
tửtử
aa
ii
v
à
ov
à
o
l


il

i

y

ys

s

NếuNếu(Dãy(Dãy số)số)rỗngrỗng thìthì thứthứ tựtự cáccác phầnphầntửtửđượcđượclấylấyrara chínhchính làlà
mộtmột hoánhoán vịvị
BàiBài
toántoán
tôtô
màmà
(floodfill)(floodfill)
iii.iii.
BàiBài
toántoán
tôtô

u

u
(floodfill)(floodfill)
Phạm Thế Bảo
3.3. ĐệĐệ quyquy hỗhỗ tươngtương
LàLà d


n
g
d

n
g
đ

đ

q
u
yq
u
y
màmà tron
g
tron
g
đóđóvi

cvi

c
gọ
i
gọ
icócó xoa
y
xoa

y
vòn
g,
vòn
g,
nh
ư
nh
ư
AA
ạ gạ g
ệệ
qyqy
gg
ệệ
gọgọ
yy
g,g,
gọigọiB,B, BBgọigọiC,C, vàvà CCgọigọiAA ĐâyĐây làlà trườngtrường hợphợprấtrấtphứcphức
tạptạp
VíVí dụdụ::
i.i. ĐườngĐường HilbertHilbert
ii.ii. ĐườngĐường SierpinskiSierpinski
Phạm Thế Bảo
Cá h há khử đệCá h há khử đệ

c p
h
ương p


p
khử

đệ
quy

c p
h
ương p

p
khử

đệ
quy
1.1. VòngVòng lặplặp
BằBằ
kk
2.2.
Bằ
ng
Bằ
ng stac
k
stac
k
Phạm Thế Bảo
ĐệĐệ
Đệ
quy

Đệ
quy
 VíVí d

d

: : Vi
ế
tVi
ế
tchươn
g
chươn
g
trìnhtrình nh
ập
nh
ập
s

s

t

t

nhiênnhiên n n vàvà tínhtính
g
iai
g

iai thừathừa: n!.: n!.
ụụ
gg
ậpập
ựự
gg
 GiảiGiải quyếtquyếtbàibài toántoán bằngbằng vòngvòng lặplặp
1.1. #include <#include <stdio.hstdio.h>>
2.2. unsigned long unsigned long intint factorial(factorial(intint n)n)
3.3. { unsigned long f = 1;{ unsigned long f = 1;
4.4. for (for (intint ii= 1; = 1; ii<=n; <=n; ii++)++)
55
f*=f*=
ii
;;
5
.
5
.
f

*=

f

*=

ii
;;
6.6. return f;return f;

7.7. }}
8.8. intint main(void)main(void)
9.9. { { intint n;n;
10.10.
printfprintf
(

(

NhapNhap
n:

);n:

);
scanfscanf
(

%d

,&n);(

%d

,&n);
10.10.
printfprintf
((
NhapNhap
n: );


n: );

scanfscanf
(%d,

&n);(%d,

&n);
printfprintf(“n! = %d! = %l(“n! = %d! = %l
\\
n”, n, factorial(n));n”, n, factorial(n));
11.11. return 0;return 0;
12.12. }}
ĐệĐệ
Đệ
quy
Đệ
quy
 M

tM

thàmhàm đư

cđư

c
gọ
i

gọ
ilàlà đ

đ

q
u
yq
u
y
n
ếu
n
ếu
nh
ư
nh
ư
tron
g
tron
g
q
u
áq
u
á
trìnhtrình x

x


l
ý,
l
ý,
hàmhàm nà
y

y
cócó m

tm

tlờilời
gọ
i
gọ
i
ếế
ộộ
ợợ
gọgọ
ệệ
qyqy
gg
qq
ý,ý,
yy
ộộ
gọgọ

đ
ế

ế
n chínhchính nónó
 GiảiGiải quyếtquyếtbàibài toántoán bằngbằng đệđệ quyquy
1.1.
#include#include
<
stdio
<
stdio

h
>
h
>
1.1.
#include#include
stdiostdio

hh
2.2. unsignedunsigned longlong intint factorial(intfactorial(int n)n)
3.3. {{ if(n==if(n==00))
44
returnreturn
11
;;
4
.

4
.
returnreturn
11
;;
5.5. returnreturn (n*(n* factorial(nfactorial(n 11))));;
6.6. }}
7.7. intint main(void)main(void)
8.8. {{intint nn;;
9.9.
printf(

Nhapprintf(

Nhap
nn
::

)

)
;;
scanf(

scanf(

%%
d

,d


,
&n)&n)
;;
9.9.
printf( Nhapprintf( Nhap
nn
::
))
;;
scanf(scanf(
%%
d,d,
&n)&n)
;;
10.10. printf(“n!printf(“n! ==%%d!d! ==%%ll\\n”,n”, n,n, factorial(n))factorial(n));;
11.11. returnreturn 00;;
12.12. }}
LờiLời
gọ
i
gọ
ihàmhàm đ

đ

q
u
yq
u

y
vàvà Đi

uĐi

uki

nki

n
gọgọ
ệệ
qyqy
ệệ
dừngdừng củacủathuậtthuậtgiảigiải đệđệ quyquy
BàiBài
tátá
iảiiải
bằbằ
th ậtth ật
iảiiải
đệđệ
hảihải
óó
điềđiề
kiệkiệ

BàiBài
t
o

á
n
t
o
á
ng
iải
g
iải
bằ
ng
bằ
ng
th
u
ậtth
u
ật
g
iải
g
iải
đệđệ
quyquy
phảiphải
c
ó
c
ó
điề

u
điề
u
kiệ
n
kiệ
n
dừngdừng
 ThuậtThuậttoántoán đệđệ quyquy trêntrên máymáy tínhtính cócó thểthể bịbị giớigiớihạnhạnbởibởi
dungdung
lượnglượng
bộbộ
nhớnhớ
dodo
lờilời
gọigọi
hàmhàm
liênliên
tiếptiếp
dungdung
lượnglượng
bộbộ
nhớnhớ
dodo
lờilời
gọigọi
hàmhàm
liênliên
tiếptiếp


mainmain
factorial (4)factorial (4)
factorial (3)factorial (3) factorial (2)factorial (2) factorial (1)factorial (1)
HãyHãy
vẽvẽ
sơsơ
đồđồ
tiếntiến
trìnhtrình
gọigọi
hàmhàm
khikhi
thựcthực
hiệnhiện
tínhtính
dãydãy
fibonaccifibonacci
bằngbằng
HãyHãy
vẽvẽ
sơsơ
đồđồ
tiếntiến
trìnhtrình
gọigọi
hàmhàm
khikhi
thựcthực
hiệnhiện
tínhtính

dãydãy
fibonaccifibonacci
bằngbằng
đệđệ quyquy
Bài t á Thá Hà NộiBài t á Thá Hà Nội
Bài

t
o
á
n
Thá
p


NộiBài

t
o
á
n
Thá
p


Nội

CóCó
33
cáicái

cộtcột
vàvà
mộtmột
chồngchồng
đĩađĩa
ởở
cộtcột
thứthứ
nhấtnhất
HãyHãy
chuyểnchuyển

CóCó
33
cáicái
cộtcột
vàvà
mộtmột
chồngchồng
đĩađĩa
ởở
cộtcột
thứthứ
nhấtnhất

HãyHãy
chuyểnchuyển
chồngchồng đĩađĩasangsang cộtcộtthứthứ baba vớivới điềuđiềukiệnkiệnmỗimỗilầnlầndidi chuyểnchuyển
chỉchỉ mộtmột đĩađĩavàvà cáccác đĩađĩabébé luônluôn nằmnằmtrêntrên đĩađĩalớnlớn
Th ậtiảiTh ậtiải

Th
u
ật
g
iảiTh
u
ật
g
iải
Ch ểCh ể
((
11
))
đĩđĩ
ộtột
tt
ii

Ch
uy

n
Ch
uy

n
(
n
(
n

11
))
đĩ
a
đĩ
asangsang c
ột
c
ột
t
rung
t
rung g
i
ang
i
an
 ChuyểnChuyển đĩađĩalớnlớnnhấtnhấtsangsang cộtcột đíchđích
Ch ểCh ể
((
11
))
đĩđĩ
từtừ
ộtột
tt
ii
ộtột
đíhđíh


Ch
uy

n
Ch
uy

n
(
n
(
n
11
))
đĩ
a
đĩ
a
từtừ
c
ột
c
ột
t
rung
t
rung g
i
ang
i

an sangsang c
ột
c
ột
đí
c
hđí
c
h

Cài đặtbằ đệCài đặtbằ đệ
Cài

đặt

bằ
ng
đệ
quy
Cài

đặt

bằ
ng
đệ
quy
11
MoveDiskMoveDisk
((

disk numberdisk number
starting poststarting post
target posttarget post
1
.
1
.
MoveDiskMoveDisk
((
disk
_
numberdisk
_
number
, ,
starting
_
poststarting
_
post
, ,
target
_
posttarget
_
post
,,
intermediate_postintermediate_post))
2.2. {{
33

if(disk)number > 1)if(disk)number > 1)
3
.
3
.
if(disk)number

>

1)

if(disk)number

>

1)

4.4. {{
5.5. MoveDiskMoveDisk(disk_number(disk_number 1, 1, starting_poststarting_post, ,
intermediate postintermediate post
target posttarget post
););
intermediate
_
postintermediate
_
post
, ,
target
_

posttarget
_
post
););
6.6. printfprintf(“Move disk number %d, from post %d to post %d.(“Move disk number %d, from post %d to post %d.\\n”, n”,
disk_numberdisk_number, , starting_poststarting_post, , target_posttarget_post););
77
MoveDiskMoveDisk
(disk number(disk number

1 intermediate post1 intermediate post
7
.
7
.
MoveDiskMoveDisk
(disk
_
number(disk
_
number
1
,
intermediate
_
post
,
1
,
intermediate

_
post
,
target_posttarget_post, , starting_poststarting_post););
8.8. }}
99
elseelse
9
.
9
.
elseelse
10.10. printfprintf(“Move disk number 1 from post %d to post %d.(“Move disk number 1 from post %d to post %d.\\n”,n”,
starting_poststarting_post, , target_posttarget_post););
1111
}}
11
.
11
.
}}
Bài toán Xếp Hậu (8 Queens).

Liệt kê tất cả các cách xếp n quân hậu trên bàn cờ n x n sao cho chúng không ăn được nhau.

Bàn cờ có n hàng được đánh số từ 0 đến n-1, n cột được đánh số từ 0 đến n-1; Bàn cờ có n*2
-1 đường chéo xuôi được đánh số từ 0 đến 2*n -2, 2 *n -1 đường chéo ngược được đánh số từ
2*n -2. Ví dụ: với bàn cờ 8 x 8, chúng ta có 8 hàng được đánh số từ 0 đến 7, 8 cột được đánh
số từ 0 đến 7, 15 đường chéo xuôi, 15 đường chéo ngược được đánh số từ 0 . .15.
Vì trên mỗi hàng chỉ xếp được đúng một quân hậu, nên chúng ta chỉ cần quan tâm đến quân

hậu được xếp ở cột nào. Từ đó dẫn đến việc xác định bộ n thành phần x1, x2, . ., xn,trong đó
xi = j được hiểu là quân hậu tại dòng i xếp vào cột thứ j. Giá trị của i được nhận từ 0 đến n-1;
giá trị của j cũng được nhận từ 0 đến n-1, nhưng thoả mãn điều kiện ô (i,j) chưa bị quân hậu
khác chiếu đến theo cột, đường chéo xuôi, đường chéo ngược.
Việc kiểm soát theo hàng ngang là không cần thiết vì trên mỗi hàng chỉ xếp đúng một quân
hậu. Việc kiểm soát theo cột được ghi nhận nhờ dãy biến logic aj với qui ước aj=1nếu cột j
còn trống, cột aj=0 nếu cột j không còn trống. Để ghi nhận đường chéo xuôi và đường chéo
ngược có chiếu tới ô (i,j) hay không, ta sử dụng phương trình i + j = const và i - j = const,
đường chéo thứ nhất được ghi nhận bởi dãy biến bj, đường chéo thứ 2 được ghi nhận bởi dãy
biến cj với qui ướ
c nếu đường chéo nào còn trống thì giá trị tương ứng của nó là 1 ngược lại
là 0. Như vậy, cột j được chấp nhận khi cả 3 biến aj, bi+j, ci+j đều có giá trị 1. Các biến này
phải được khởi đầu giá trị 1 trước đó, gán lại giá trị 0 khi xếp xong quân hậu thứ i và trả lại
giá trị 1 khi đưa ra kết quả.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#define N 8
#define D (2*N-1)
#define SG (N-1)
#define TRUE 1
#define FALSE 0
void hoanghau(int);
void inloigiai(int loigiai[]);
FILE *fp;
int A[N], B[D], C[D], loigiai[N];
int soloigiai =0;
void hoanghau(int i){

int j;
for (j=0; j<N;j++){
if (A[j] && B[i-j+SG] && C[i+j] ) {
loigiai[i]=j;
A[j]=FALSE;
B[i-j+SG]=FALSE;
C[i+j]=FALSE;
if (i==N-1){
soloigiai++;
inloigiai(loigiai);
delay(500);
}
else
hoanghau(i+1);
A[j]=TRUE;
B[i-j+SG]=TRUE;
C[i+j]=TRUE;
}
}
}
void inloigiai(int *loigiai){
int j;
printf("\n Lời giải %3d:",soloigiai);
fprintf(fp,"\n Lời giải %3d:",soloigiai);
for (j=0;j<N;j++){
printf("%3d",loigiai[j]);
fprintf(fp,"%3d",loigiai[j]);
}
}
void main(void){

int i;
clrscr();
fp=fopen("loigiai.txt","w");
for (i=0;i<N;i++)
A[i]=TRUE;
for(i=0;i<D; i++){
B[i]=TRUE;
C[i]=TRUE;
}
hoanghau(0);
fclose(fp);
}




Bài tốn Tháp Hà Nội (Tower of Hanoi)

Truyền thuyết 1: Một nhà toán học Pháp sang thăm Đông Dương đến một ngôi chùa cổ ở
Hà Nội thấy các vò sư đang chuyển một chồng đóa qúy gồm 64 đóa với kích thước khác
nhau từ cột A sang cột C theo cách:
- Mỗi lần chỉ chuyển 1 đóa .
- Khi chuyển có thể dùng cột trung gian B .
- Trong suốt qúa trình chuyển các chồng đóa ở các cột luôn được xếp đúng (đóa có kích
thước bé được đặt trên đóa có kích thước lớn ) .
Khi được hỏi các vò sư cho biết khi chuyển xong chồng đóa thì đến ngày tận thế !

Truyền thuyết 2: Lúc thế giới hình thành, trong ngơi đền thờ Brahma có một chồng 64 cái
đĩa. Mỗi ngày, có một thầy tu di chuyển một đĩa. Đến khi hết đĩa thì đó là ngày tận thế.


Như sẽ chỉ ra sau này với chồng gồm n đóa cần 2
n
- 1 lần chuyển cơ bản (chuyển 1 đóa ). 2n
Giả sử thời gian để chuyển 1 đỉa là t giây thì thời gian để chuyển xong chồng 64 đóa sẽ là:
T = ( 2
64
-1 ) * t giây = 11.84*10
19
*t giây
Với t = 1/100 giây thì T =5.8*10
9
năm = 5.8 tỷ năm.
Ta có thể tìm thấy giải thuật (dãy các thao tác cơ bản ) cho bài toán một cách dễ dàng
ứng với trường hợp chồng đóa gồm 0, 1, 2, 3 đóa . Với chồng 4 đóa giải thuật bài toán đã
trở nên phức tạp . Tuy nhiên giải thuật của bài toán lại được tìm thấy rất dễ dàng nhanh
chóng khi ta khái quát số đóa là n bất kỳ và nhìn bài toán bằng quan niệm đệ quy .
a) Thông số hóa bài toán .
Xét bài toán ở mức tổng quát nhất : chuyển n (n>=0) đóa từ cột X sang cột Z lấy cột Y làm
trung gian .
Ta gọi giải thuật giải bài toán ở mức tổng quát là thủ tục THN(n ,X ,Y,Z) chứa 4 thông số
n,X,Y,Z ; n thuộc tập số tự nhiên N (kiểu nguyên không dấu ); X ,Y,Z thuộc tập các ký tự
(kiểu ký tự ).
Bài toán cổ ở trên sẻ được thực hiện bằng lời gọi THN(64,A,B,C) .
Dễ thấy rằng : trong 4 thông số của bài toán thì thông số n là thông số quyết đònh độ phức
tạp của bài toán ( n càng lớn thì số thao tác chuyển đỉa càng nhiều và thứ tự thực hiện
chúng càng khó hình dung ) , n là thông số điều khiển .
b) Trường hợp suy biến và cách giải .
Với n =1 bài toán tổng quát suy biến thành bài toán đơn giản THN (1,X,Y,Z) : tìm dãy
thao tác để chuyển chồng 1 đóa từ cột X sang cột Z lấy cột Y làm trung gian . Giải thuật
giải bài toán THN (1,X,Y,Z) là thực hiện chỉ 1 thao tác cơ bản : Chuyển 1 đóa từ X sang Z

( ký hiệu là Move (X , Z) ) . THN(1,X,Y,Z) ≡ { Move( X, Z ) }
Chú ý : Hoàn toàn tương tự ta cũng có thể quan niện trường hợp suy biến là trường hợp n=
0 tương ứng với bài toán THN(0,X,Y,Z) : chuyển 0 đóa từ X sang Z lấy Y làm trung gian
mà giải thuật tương ứng là không làm gì cả ( thực hiện thao tác rỗng ) .
THN(0,X,Y,Z) ≡ {φ }
c) Phân rã bài toán :
Ta có thể phần rã bài toán TH N (k,X,Y,Z) : chuyển k đóa từ cột X sang cột Z lấy cột Y
làm trung gian thành dãy tuần tự 3 công việc sau :
+ Chuyển (k -1) đóa từ cột X sang cột Y lấy cột Z làm trung gian :
THN (k -1,X,Z,Y) (bài toán THN với n = k-1,X= X , Y = Z , Z = Y )
+ Chuyển 1 đóa từ cột X sang cột Z : Move ( X, Z ) (thao tác cơ bản ).
+ Chuyển (k - 1 ) đóa từ cột Y sang cột Z lấy cột X làm trung gian :
THN( k -1,Y,X,Z) ( bài toán THN với n = k-1 , X = Y , Y = X , Z = Z ) .
Vậy giải thuật trong trường hợp tổng quát (n > 1) là :
THN(n,X,Y,Z) ≡ {
THN (n -1,X,Z,Y) ;
Move ( X, Z ) ;
THN (n -1,Y,X,Z) ;
}
Với n đóa thì cần bao nhiêu bước chuyển 1 đóa? Thực chất trong thủ tục THN các lệnh gọi
đệ qui chỉ nhằm sắp sếp trình tự các thao tác chuyển 1 đóa
Số lần chuyển 1 đóa được thực hiện là đặc trưng cho độ phức tạp của giải thuật .
Với n đóa , gọi f(n) là số các thao tác chuyển _một_đóa .
Ta có : f(0) = 0 .
f(1) =1 .
f(n) = 2f(n -1) + 1 với n > 0
Do đo ù : f(n) = 1+ 2 + 2
2
+ + 2
n-1

= 2
n
- 1
Để chuyển 64 đóa cần 2
64
- 1 bước hay xấp xỉ 10
20
bước . Cần khoảng 10 triệu năm với
một máy tính nhanh nhất hiện nay để làm việc này .

Hàm thực hiện:
void THN(int n, char X,Y,Z){
if(n > 0) {
THN(n -1,X,Z,Y ) ;
Move ( X , Z ) ;
THN(n - 1,Y,X,Z ) ;
}
return ;
}
hoặc :
void THN( int n , char X,Y,Z) {
if(n = = 1) Move ( X , Z ) ;
else {
THN(n -1,X,Z,Y ) ;
Move ( X, Z ) ;
THN(n - 1,Y,X,Z ) ;
}
return ;
}



Bài toán tìm cặp điểm gần nhất trong mặt phẳng (Closest
Pair).


Bài tập
Phần 1: Mảng và chuỗi ký tự
1. Nhập vào một dãy số nguyên gồm n phần tử. Tìm cặp phần tử có tổng đúng bằng k (k
nhập từ bàn phím).
2. Nhập dãy n số (n ≤ 1000). Xác định đường chạy dài nhất, xuất lên màn hình vị trí phần tử
đầu tiên và độ dài của đường chạy đó. Đường chạy là một dãy liên tiếp các phần tử không
giảm của dãy ban đầu.
Ví dụ : Nhập dãy 1 4 2 3 1 2 6 8 3 5 7
Đường chạy dài nhất là : 4 4
3. Nhập dãy n số (n ≤ 1000). Xét dãy số có đối xứng không?
4. Viết chương trình nhập/ xuất một ma trận số thực n x m (n, m ≤ 100). Sắp xếp các giá trị
các phần tử của ma trận không giảm theo đường zigzag
Ví dụ:
1 2 3 1 2 3
4 5 6 kết quả 6 5 4
7 8 9 7 8 9
5. Viết chương trình nhập/ xuất một ma trận vuông số nguyên dương n x n (n≤ 100 và n lẻ).
Xét ma trận có đối xứng qua:
a. Đường chéo chính.
b. Theo dòng, cột.
c. Tâm.
6. Viết chương trình nhập chuỗi ký S:
a. Đếm và cho biết số lượng khoảng trắng, số lượng ký số, số lượng chữ cái latin, số
lượng các ký tự khác.
b. Đếm và cho biết số lượng từ của chuỗi – các từ cách nhau bởi khoảng trắng.

c. Biến đổi chuỗi sao cho các ký tự đầu mỗi từ là ký tự in hoa, các ký tự khác in
thường.
2. Viết chương trình nhập chuỗi ký S, đếm và in cho biết số lượng của mỗi chữ cái latin
trong chuỗi (không phân biệt chữ in hoa và chữ in thường).
7. Viết chương trình nhập 3 chuỗi ký tự S, S
1
, S
2
. Hãy tìm trên chuỗi S tất cả những lần xuất
hiện của S
1
và thay bằng S
2
.
8. Một số tự nhiên là Palindrom nếu các chữ số của nó viết theo thứ tự ngược lại thì số tạo
thành là chính số đó ( Ví dụ: 4884, 393). Hãy tìm: Tất cả các số tự nhiên nhỏ hơn 100 mà
khi bình phương lên thì cho một Palindrom.
9. Viết chương trình đảo ngược vị trí các từ trong câu. Ví dụ: “KIEN AN CA” đổi thành
“CA AN KIEN”.
10. Nhập một câu không quá 20 từ, mỗi từ không quá 10 ký tự. Viết chương trình tách các từ
trong câu và in các từ theo thứ tự Alphabet. Ví dụ: “PHAN VIEN CONG NGHE
THONG TIN” tách thành [PHAN], [VIEN], [CONG], [NGHE], [THONG], [TIN] và in
ra: CONG NGHE PHAN THONG TIN VIEN

Phần 2: Cấu trúc
Xây dựng cấu trúc điểm, đường thẳng, hình chữ nhật, đường tròn.
1. Xét vị trí tương đối của 03 điểm trên mặt phẳng.
2. Xét vị trí tương đối giữa hai đoạn thẳng.
3. Xét 1 điểm có nằm trong 1 : hình chữ nhật, tròn hay không
4. Xét vị trí tương đối của 1 đường thẳng và hình chữ nhật, tròn

5. Viết chương trình nhập thông tin của một sinh viên, xuất thông tin sinh viên vừa nhập ra
màn hình. Thông tin một sinh viên gồm: Mã sinh viên (chuỗi 8 ký tự), họ và tên sinh viên
(chuỗi 30 ký tự), giới tính (nam/nữ), địa chỉ liên hệ (chuỗi 50 ký tự), điểm 6 môn học.
6. Viết chương trình quản lý một lớp học gồm tối đa 150 sinh viên, mỗi sinh viên có các
thông tin như bài trước. Chương trình phải đảm bảo một số tính năng:
a. Nhập mới một danh sách sinh viên.
b. Tìm một sinh viên trong danh sách theo mã sinh viên.
c. Thêm một sinh viên vào danh sách.
d. Hủy một sinh viên ra khỏi danh sách.
e. Xuất danh sách sinh viên ra màn hình.
f. Xuất danh sách các sinh viên còn nợ điểm (điểm < 5) của ít nhất một môn học.

Phần 3: Con trỏ và tập tin
1. Viết chương trình ghi vào tập tin sochan.dat các số nguyên chẵn từ 0 đến 100.
2. Cho mảng các số nguyên, tính tổng các phần tử của mảng.
Dữ liệu vào : tập tin văn bản ARRAY.INP gồm hai dòng
- Dòng 1 chứa số nguyên n mô tả số phần tử của mảng
- Dòng 2 chứa n số nguyên
Kết quả : Đưa ra tập tin văn bản ARRAY.OUT gồm một dòng ghi tổng các phần
tử trong mảng.
3. Viế
t chương trình sao chép 2 file văn bản
4. Viết chương trình giả lặp lệnh copy con của dos để tạo file văn bản.
5. Cho mảng các số nguyên, hãy liệt kê các phần tử là số nguyên tố
Dữ liệu vào : tập tin văn bản NT.INP gồm hai dòng
- Dòng 1 chứa số nguyên n ( n < = 100)
- Dòng 2 chứa n số nguyên
Kết quả : đưa ra tập tin văn bản NT.OUT gồm hai dòng:
- Dòng 1 chứa số lượng các phần tử nguyên t
ố trong mảng.

- Dòng 2 liệt kê các số nguyên tố đó.
6. Tạo file văn bản có tên là “INPUT.TXT” có cấu trúc như sau:
- Dòng đầu tiên ghi N (N là số nguyên dương nhập từ bàn phím).
- Trong các dòng tiếp theo ghi N số nguyên ngẫu nhiên trong phạm vi từ 0 đến
100, mỗi dòng 10 số (các số cách nhau ít nhất một khoảng trắng). Hãy đọc dữ
liệu của file “INPUT.TXT” và lưu vào mảng một chiều A.
Thực hiện các công việc sau :
• Tìm giá trị lớn nhất c
ủa mảng A.
• Đếm số lượng số chẵn, số lượng số lẻ của mảng A.
• Hãy sắp xếp các phần tử theo thứ tự tăng dần.
• Hãy ghi các kết quả vào file văn bản có tên OUTPUT.TXT theo mẫu sau

7. Hoàn thiện phần 2, câu 6 bằng cách lưu trữ dữ liệu mảng sinh viên vào tập tin nhị phân có
tên sinhvien.dat. Và khi đọc dữ liệu từ tập tin sinhvien.dat sẽ được đưa vào một mảng một
chiều (dùng con trỏ để khai báo) sẽ được cấp phát số lượng phần tử linh động tùy thuộc
vào số lượng phần tử trong tập tin.
Phần 4: Đệ quy
1. Tính tổng giá trị các phần tử của một mảng bằng phương pháp đệ quy.
2. Cài đặt bài toán tám hậu và vẽ bàn cờ tương ứng với các vị trí đặt hậu.
3. Cài đặt bài toán tháp Hà Nội với số đĩa nhỏ hơn 5.

×