Professional Documents
Culture Documents
Giới thiệu
Trong tài liệu này tuyển chọn một số bài toán tin cơ bản ở nhiều nguồn khác nhau. Nó thường xuất
hiện trong các kỳ thi học sinh giỏi các cấp.
Các bài tập trong tài liệu này tương đối đơn giản. Không sử dụng bất kỳ một thuật toán đặc biệt
(đệ quy - quay lui, quy hoạch động, tham lam ...) nào, mỗi bài có thể có nhiều cách giải khác nhau.
Nhằm mục đích ôn lại các loại cấu trúc dữ liệu đơn giản và mối tương quan giữa các cấu trúc này.
Nhằm hình thành tư duy lập trình bước đầu cho bạn đọc.
Để có thể tham khảo tốt nhất về tài liệu này các bạn cần đọc thêm kiến thức về chương trình con,
nhập xuất dữ liệu bằng tệp văn bản.
Nếu cảm thấy thú vị các bạn có thể tham khảo thêm một số tài liệu sau:
o Tuyển chọn 100 bài tập lập trình cơ bản (code pascal và c++). o Tuyển
chọn 50 bài toán đệ quy - quay lui - vét cạn (code pascal và c++). o Tuyển
chọn 50 bài toán quy hoạch động (code pascal và c++). o Tuyển chọn 50 toán
đồ thị (code pascal và c++).
o Tuyển chọn 20 bài toán về cấu trúc dữ liệu đặc biệt
Chương trình:
Program ChuSo;
Var f i , f o : text;
n,Nghin,Tram,Chuc,DonVi:integer;
Begin assign( f i , ' C h u S o . i n p ' ) ; reset( f i ) ; r e a d ( f i , n ) ;
close( f i ) ; n:=n mod 10 00;
Nghin:=n div 1000; n:=n mod 10 0;
Tram:=n div 100; DonVi:=n mod 10;
Chuc:=n div 10; assign( f o , ’ C h u S o . o u t ’ ) ;
rewrite( f o ) ;
writeln(fo,’Chu so hang nghin: ’,Nghin);
writeln(fo,’Chu s o hang t r a m : ’ , Tr a m ) ;
writeln(fo,’Chu s o hang chuc:’ , C h u c ) ;
writeln(fo,’Chu s o hang don vi: ’ , D o n Vi ) ;
close( f o ) ;
End.
Bài 2: Hình chữ nhật
Tính diện tích và chu vi hình chữ nhật
Dữ liệu vào: Lưu trong tệp Hcn.inp hai số nguyên dương (<104) thể hiện chiều dài và chiều rộng của
hình chữ nhật.
Dữ liệu ra: Ghi vào tệp Hcn.out chu vi và diện tích hình chữ nhật.
Ví dụ:
Hcn.inp Hcn.out
56 22 30
Chương trình:
Program HCN;
Var fi,fo:text;
a , b , C V, D t : l o n g i n t ;
Begin
assign( f i , ’ H c n . i n p ’ ) ;
reset( f i ) ;
read(fi,a,b);
close( f i ) ;
Dt:=a*b;
Cv:=(a+b)*2;
assign( f o , ’ H c n . o u t ’ ) ;
rewrite( f o ) ;
w r i t e ( f o , C v, ’ ’ , D t ) ;
close( f o ) ;
End.
Bài 3: Tam giác
Kiểm tra ba số nguyên có thể tạo thành 3 cạnh của một tam giác hay không? Nếu có thì tính chu vi
và diện tích của tam giác đó.
Dữ liệu vào: Lưu trong tệp Tamgiac.inp ba số nguyên dương (<104).
Dữ liệu ra: Ghi vào tệp Tamgiac.out với cấu trúc như sau:
+ Nếu ba số nguyên không tạo thành 3 cạnh của tam giác thì ghi “No”.
+ Nếu tạo thành thì ghi ra chu vi và diện tích của tam giác.
Ví dụ:
Ta m g i a c . i n p Ta m g i a c . o u t
2 3 4 9 2.90
Ta m g i a c . i n p Ta m g i a c . o u t
2 3 6 No
Chương trình:
Program Tamgiac;
Var fi,fo: text;
a , b , c , C V: l o n g i n t ;
Dt,p: real;
K t : boolean;
Begin assign( f i , ’ Ta m g i a c . i n p ’ ) ;
reset( f i ) ; r e a d ( f i , a , b , c ) ;
close( f i ) ;
if (a+b>c)and(b+c>a)and(c+a>b)then Kt:=true else Kt:=false;
i f ( k t = t r u e ) then Begin
Cv:=a+b+c; p : = C v / 2 ;
Dt:=sqrt(p*(p-a)*(p-b)*(p-c));
End;
assign( f o , ’ Ta m g i a c . o u t ’ ) ; rewrite( f o ) ;
i f ( K t = f a l s e ) then w r i t e ( f o , ’ N o ’ ) ; i f ( K t = t r u e ) then w r i t e ( f o , C v, ’
’ , D t : 4 : 2 ) ; close( f o ) ;
End.
+ Dòng thứ hai: Lưu 2 số nguyên nằm trong phạm vi từ 9 đến 23. Số nguyên thứ nhất cho
biết giờ bắt đầu sử dụng dịch vụ, số nguyên thứ hai cho biết giờ kết thúc sử dụng dịch vụ. Hai số
nguyên cách nhau một khoảng trắng và số nguyên thứ hai luôn lớn hơn số nguyên thứ nhất.
Dữ liệu ra: Lưu vào tệp karaoke.out 1 số nguyên duy nhất cho biết số tiền khách hàng phải trả để
sử dụng dịch vụ.
Yêu cầu: Viết chương trình nhập dữ liệu từ tệp karaoke.inp và ghi kết quả ra tệp karaoke.out.
Ví dụ:
karaoke.inp karaoke.out
5 148000
9 13
Chương trình:
Program X e p l o a i ;
Var fi,fo: text;
Tbm: r e a l ;
Xeploai: string;
Begin assign( f i , ' X e p L o a i . i n p ' ) ;
reset( f i ) ; r e a d ( f i , T b m ) ;
close( f i ) ;
if (Tbm>=8)then Xeploai:='Gioi'
e l s e i f ( T b m > = 6 . 5 ) then X e p l o a i : = ' K h a '
e l s e i f ( T b m > = 5 ) then X e p l o a i : = ' Tr u n g B i n h '
e l s e X e p l o a i : = ' Ye u ' ; assign( f o , ’ X e p L o a i . o u t ’ ) ;
rewrite( f o ) ; w r i t e ( f o , X e p l o a i ) ; close( f o ) ;
End.
Bài 7. Tiền điện
Công ty điện lực Việt Nam đưa ra bảng giá tiền điện tiêu dùng như sau:
+ 100 Kw đầu giá 1000/1kw
+ 100 Kw tiết theo giá 2000/1kw
+ Các Kw tiếp theo giá 3000/1kw
Yêu cầu: Cho biết chỉ số điện kế tháng trước và chỉ số điện kế tháng này. Tính tiền điện tiêu
dùng phải trả trong tháng.
Dữ liệu vào: Lưu trong tệp Tiendien.inp gồm 2 số nguyên dương (<104) thể hiện chỉ số điện kế của
tháng trước và tháng này.
Dữ liệu ra: Ghi vào tệp TienDien.out số tiền phải trả trong tháng.
Ví dụ
Ti e n D i e n . i n p Ti e n D i e n . o u t
1 202 303000
Giải thích: Số điện đã sử dụng là 201 Kw thì tiền điện phải trả là:
100*1000+100*2000+1*3000=303000 (đ)
Chương trình:
Program Ti e n D i e n ;
Var fi,fo: text;
a , b , S o D i e n , Ti e n : l o n g i n t ;
Begin assign( f i , ' Ti e n D i e n . i n p ' ) ;
reset( f i ) ; r e a d ( f i , a , b ) ;
close( f i ) ;
SoDien:=b-a;
i f ( S o D i e n > 2 0 0 ) then Ti e n : = 1 0 0 * 1 0 0 0+10 0*2 0 0 0 + ( S o D i e n - 2 0 0 ) * 3 0 0 0
e l s e i f ( S o D i e n > 1 0 0 ) t h e n Ti e n : = 1 0 0 * 1 0 0 0 + ( S o D i e n - 1 0 0 ) * 2 0 0 0
e l s e Ti e n : = S o D i e n * 1 0 0 0 ; assign( f o , ' Ti e n D i e n . o u t ' ) ; rewrite( f o ) ;
w r i t e ( f o , Ti e n ) ; close( f o ) ;
End.
Bài 8: Trò chơi
Ba bạn Hùng, Dũng, Cường cùng tham gia một trò chơi như sau: Mỗi bạn nắm trong tay một
đồng xu, mỗi đồng xu có hai trạng thái : sấp và ngửa. Theo hiệu lệnh, cả ba bạn cùng đưa đồng xu của
mình ra phía trước. Nếu cả ba đồng xu cùng sấp hoặc cùng ngửa thì chưa phát hiện người thua cuộc
(hòa nhau). Nếu một bạn có trạng thái đồng xu khác với hai bạn kia (nghĩa là đồng xu của bạn ấy sấp
còn hai người kia ngửa và ngược lại đồng xu của bạn ấy ngửa thì hai người kia sấp) thì bạn đó thắng
cuộc. Hãy viết chương cho biết kết quả của trò chơi.
Quy ước: Sấp là 0; ngửa là 1.
Dữ liệu vào: Lưu trong tệp TroChoi.inp 3 số nguyên 0 hoặc 1 cho biết trạng thái đồng xu của 3
bạn theo thứ tự là Hùng, Dũng, Cường.
Dữ liệu ra: Ghi vào tệp TroChoi.out kết quả của trò chơi. Nếu bạn nào thắng thì ghi tên bạn đó,
nếu hòa thì ghi kết quả là “Hoa”.
Ví dụ:
Tr o C h o i . i n p Tr o C h o i . o u t
0 0 0 Hoa
Tr o C h o i . i n p Tr o C h o i . o u t
0 10 Dung
Chương trình:
Program Tr o C h o i ;
Var fi,fo: text;
Hung,Dung,Cuong:integer; KetQua:string;
Begin assign( f i , ' Tr o C h o i . i n p ' ) ;
reset( f i ) ;
read(fi,Hung,Dung,Cuong);
close( f i ) ;
if(Hung=Dung)and(Hung=Cuong) then KetQua:='Hoa';
if(Hung<>Dung)and(Hung<>Cuong) then KetQua:='Hung';
if(Dung<>Hung)and(Dung<>Cuong) then KetQua:='Dung';
if(Cuong<>Hung)and(Cuong<>Dung) then KetQua:='Cuong';
Chương trình:
Program SoNguyenTo; var n : i n t e g e r ;
Procedure Nhap;
Var fi:text;
Begin
assign(fi,'baitap\5 0btcb\songuyento.inp'); reset (fi);
read(fi,n); close (fi);
End;
Function N g u y e n To ( k : i n t e g e r ) : b o o l e a n ;
Var i:integer;
Begin
i:=1;
repeat i : = i + 1 ;
until (k mod i =0) or (i*i>k);
i f ( i * i > k ) t h e n N g u y e n To : = Tr u e e l s e N g u y e n To : = F a l s e ;
End;
Procedure X u a t ;
Var fo:text;
Begin
assign(fo,'baitap\5 0btcb\songuyento.out'); rewrite(fo);
i f ( N g u y e n t o ( n ) = t r u e ) t h e n w r i t e ( f o , ' Ye s ' ) e l s e
write(fo,'No'); close (fo);
End;
Begin
Nhap ;
Xuat;
End.
Bài 2: Đảo ngược số
Viết chương trình đảo ngược một số nguyên dương.
Dữ liệu vào: Lưu trong tệp DaoNguocSo.inp một số nguyên dương (<1018).
Dữ liệu ra: Ghi vào tệp DaoNguocSo.out số đảo
ngược. Ví dụ:
DaoNguocSo.inp DaoNguocSo.out
123456 654321
Chương trình:
Program DaoNguocSo;
Var fi,fo: text;
a: int64;
Begin assign( f i , ' D a o N g u o c S o . i n p ' ) ; reset( f i ) ;
r e a d ( f i , a ) ; close( f i ) ;
assign( f o , ' D a o N g u o c S o . o u t ' ) ;
rewrite( f o ) ;
While (a>0) do
Begin
w r i t e ( f o , a m o d 1 0 ) ; end; a : = a d i v 1 0 ; close( f o ) ;
End.
Bài 3: Đổi tiền
Cho một lượng tiền cần đổi và 3 mệnh giá tiền khác nhau. Hãy cho biết có bao nhiêu cách đổi. Dữ
liệu vào: Lưu trong tệp DoiTien.inp có cấu trúc như sau:
+ Dòng thứ nhất lưu số tiền cần đổi (<106).
+ Dòng thứ hai lưu 3 mệnh giá tiền.
Dữ liệu ra: Ghi vào tệp DoiTien.out số cách đổi.
Ví dụ:
D o i Ti e n . i n p D o i Ti e n . o u t
200 4
20 30 50
Giải thích: Có 4 cách đổi như sau: (1,1,3)-(1 tờ 20, 1 tờ 30, 3 tờ 50); (2,2,2); (3,3,1); (6,1,1)
Program D o i Ti e n ;
Var fi,fo: text;
T: l o n g i n t ;
a,b,c,dem,i,j,k:integer;
Begin assign( f i , ' D o i Ti e n . i n p ' ) ; reset( f i ) ;
readln(fi,T); read(fi,a,b,c);
close( f i ) ; d e m : = 0 ;
for i:=1 to (T div a) do
for j:=1 to (T div b) do
for k:=1 to (T div c) do
i f ( i * a + j * b + k * c = T ) t h e n dem:=dem+1;
assign( f o , ' D o i Ti e n . o u t ' ) ; rewrite( f o ) ; w r i t e ( f o , d e m ) ; close( f o ) ;
End.
Bài 4: Tạo hình
Tạo hình với cấu trúc như sau:
****
***
**
*
Dữ liệu vào: Lưu trong tệp Taohinh.inp một số nguyên dương cho biết chiều cao của hình (<104).
Dữ liệu ra: Ghi vào tệp TaoHinh.out hình với chiều cao từ input.
Ví dụ:
Ta o H i n h . i n p Ta o H i n h . o u t
5 *****
****
***
**
*
Chương trình:
Program Ta o H i n h ;
Var fi,fo: text;
a,i,j:integer;
Begin assign( f i , ' Ta o H i n h . i n p ' ) ;
reset( f i ) ; r e a d l n ( f i , h ) ;
close( f i ) ;
assign( f o , ’ Ta o H i n h . o u t ’ ) ;
rewrite( f o ) ; f o r i : = h downto 1
do Begin
for j : = 1 t o i d o w r i t e ( f o , ' * ' ) ; End;
writeln(fo);
close( f o ) ;
End
. Bài 5: Tạo hình
Tạo hình với cấu trúc như sau:
*
***
Dữ liệu vào: Lưu trong tệp Taohinh.inp một số nguyên dương cho biết chiều cao của hình (<104).
Dữ liệu ra: Ghi vào tệp TaoHinh.out hình với chiều cao từ input.
Ví dụ:
Ta o H i n h . i n p Ta o H i n h . o u t
5 *
***
Chương trình:
Program Ta o H i n h ;
Var fi,fo: text;
h,i,j:integer;
Begin assign( f i , ' Ta o H i n h . i n p ' ) ;
reset( f i ) ; r e a d l n ( f i , h ) ;
close( f i ) ;
assign( f o , ’ Ta o H i n h . o u t ’ ) ;
rewrite( f o ) ; f o r i : = 1 t o h d o
Begin
for j:=1 to h-i do write(fo,’ ’); for
j:=1 to i*2-1 do write(fo,'*'); for j:=1 to h-i do
w r i t e ( f o , ’ ’ ) ; End; w r i t e l n ( f o ) ; close( f o ) ;
End.
Bài 6: Ước chung lớn nhất
Tìm ước chung lớn nhất của hai số nguyên dương.
Dữ liệu vào: Lưu trong tệp Ucln.inp hai số nguyên dương.
Dữ liệu ra: Ghi vào tệp Ucln.out ước chung lớn nhất.
Ví dụ:
Ucln.inp Ucln.out
15 25 5
Ví dụ:
LuyThua.inp LuyThua.out
500 0 500
1 100
2 20
3 4
Chương trình:
Program LuyThua;
Var n,m,p:longint;
fi,fo:text;
Function L u y t h u a ( a : l o n g i n t ; b : b y t e ) : l o n g i n t ; Var
i,lt:longint;
Begin
if b=0 then
begin y = ; exit;
lu thua: 1
end;
lt:=1;
for i:=1 to b do lt:=lt*a; luythua:=lt;
End;
Begin
assign( f i , ’ L u y T h u a . i n p ’ ) ; reset( f i ) ;
r e a d l n ( f i , n ) ; close( f i ) ;
assign( f o , ’ L u y T h u a . o u t ’ ) ;
rewrite( f o ) ;
m:=0;
repeat
if(n mod LuyThua(5,m)=0) then
writeln(fo,m,’ ’,n div LuyThua(5,m));
i n c ( m ) ; u n t i l ( L u y T h u a ( 5 , m ) > n ) ; close( f o ) ;
End.
Bài 8: Giai thừa
Tính tổng sau: 1+1.2+1.2.3+1.2.3.4+.. .+1.2.3.. .(n-l).n Dữ liệu vào: Lưu trong
tệp GiaiThua.inp m ột số tự nhiên n.
Dữ liệu ra: Ghi vào tệp GiaiThua.out tổng các giai thừa.
Ví dụ:
GiaiThua.inp GiaiThua.out
3 9
Chương trình:
Program G i a i T h u a ;
Var n,gt,tong,i,j:longint;
fi,fo:text;
Begin assign( f i , ’ G i a i T h u a . i n p ’ ) ; reset( f i ) ;
r e a d l n ( f i , n ) ; close( f i ) ; g t : = 1 ; t o n g : = 0 ;
for i:= 1 to n do
Begin
for j:=1 to i do gt:=gt*j; tong:=tong+gt; gt:=1;
End;
assign( f o , ’ G i a i T h u a . o u t ’ )
; rewrite( f o ) ; w r i t e ( f o , t o n g ) ; close( f o ) ;
End.
Nhận xét: Ta thấy i! bằng (i-1)!*i từ đó ta có thuật toán độ phức tạp O(n) như sau:
Program G i a i T h u a ;
Var n,gt,tong,i:longint;
fi,fo:text;
Begin assign( f i , ’ G i a i T h u a . i n p ’ ) ; reset( f i ) ;
r e a d l n ( f i , n ) ; close( f i ) ; g t : = 1 ;
tong:=0; for i:= 1 to n do
Begin
gt:=gt*i;
tong:=tong+gt;
End;
assign( f o , ’ G i a i T h u a . o u t ’ )
; rewrite( f o ) ; w r i t e ( f o , t o n g ) ;
close( f o ) ;
End
rewrite( f o ) ;
write(fo,Max-Min);
close( f o ) ;
End.
Bài 2: Chẵn-Lẻ
Cho dãy số gồm n số nguyên. Hãy cho biết độ chênh lệnh giữa số lượng các phần tử chẵn và số
lượng các phần tử lẻ.
Dữ liệu vào: Lưu trong tệp ChanLe.inp có cấu trúc như sau:
+ Dòng thứ nhất lưu số nguyên n (n < 107) cho biết số phần tử trong dãy.
+ Dòng thứ hai lưu n số nguyên mỗi số cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Ghi vào tệp ChanLe.out độ chênh lệnh giữa số lượng chẵn và lẻ.
Ví dụ:
ChanLe.inp ChanLe.out
5 1
2 5 17 4
Chương trình:
Program ChanLe;
Var fi,fo: text;
n,i,DemChan,DemLe:integer;
A:array[1..10000000] of longint;
Begin assign( f i , ’ C h a n L e . i n p ’ )
; reset( f i ) ; r e a d l n ( f i , n ) ;
f o r i : = 1 t o n d o r e a d ( f i , A [ i ] ) ; close( f i ) ;
DemChan:=0; D e m L e : = 0 ; f o r i : = 1 t o n d o Begin
i f ( A [ i ] m o d 2 = 0 ) t h e n DemChan:=DemChan+1;
i f ( A [ i ] mod 2=1) t h e n DemLe:=DemLe+1;
End;
assign( f o , ’ C h a n L e . o u t ’ ) ; rewrite( f o ) ;
w r i t e ( f o , a b s ( D e m C h a n - D e m L e ) ) ; close( f o ) ;
End.
Bài 3: Tổng nguyên tố
Cho dãy số gồm n số nguyên. Hãy cho biết tổng của các số nguyên tố trong dãy.
Dữ liệu vào: Lưu trong tệp TongNguyenTo.inp có cấu trúc như sau:
+ Dòng thứ nhất lưu số nguyên n (n < 107) cho biết số phần tử trong dãy.
+ Dòng thứ hai lưu n số nguyên mỗi số cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Ghi vào tệp TongNguyenTo.out tổng của các số nguyên tố.
Ví dụ:
To n g N g u y e n To . i n p To n g N g u y e n To . o u t
5 14
2 5 17 4
Chương trình:
Program TongNguyenTo;
Var fi,fo: text;
n,i:integer;
To n g : i n t 6 4 ; a : l o n g i n t ;
Function N g u y e n To ( k : i n t e g e r ) : b o o l e a n ;
Var i:integer;
Begin
i:=1;
repeat i : = i + 1 ;
until (k mod i=0) or (i*i>k);
i f i * i > k then N g u y e n To : = Tr u e e l s e N g u y e n To : = F a l s e ;
End;
Begin
assign( f i , ’ To n g N g u y e n To . i n p ’ ) ; reset( f i ) ; r e a d l n ( f i , n ) ; To n g : = 0 ;
for i:=1 to n do
Begin r e a d ( f i , a ) ;
i f ( N g u y e n To ( a ) = Tr u e ) t h e n To n g : = To n g + a ;
End;
close (fi);
assign( f o , ’ To n g N g u y e n To . o u t ’ ) ;
rewrite( f o ) ; w r i t e ( f o , To n g ) ; close( f o ) ;
End.
Giải thích: Số 5 và số 7 là hai số nguyên tố có tần suất là lớn nhất (4). Nhưng số nguyên tố 7 là
số nguyên tố lớn hơn.
Chương trình:
Program Ta n S u a t ;
Var B : a r r a y [ 1 . . 1 0 0 0 0 0 0 ] o f
longint;
i,max,vt,a,n:longint;
fi,fo:text;
Function N T ( c : l o n g i n t ) : b o o l e a n ;
var k : l o n g i n t ;
Begin
k:=1;
repeat k : = k + 1 ;
until (c mod k =0) or (k*k>c);
i f k * k > c t h e n N T: = t r u e e l s e N T: = F a l s e ;
End;
Begin
Assign( f i , ’ t a n s u a t . i n p ’ ) ; reset ( f i ) ;
w h i l e E O F ( f i ) = f a l s e d o Begin
read(fi,a); if n<a then n:=a;
if nt(a)=true then B[a]:=B[a]+1;
End; close( f i ) ;
Assign( f o , ’ t a n s u a t . o u t ’ ) ; rewrite( f o ) ;
max:=b[1];
f o r i : = 2 t o n d o i f m a x < = b [ i ] t h e n Begin
max:=b[i];
i f max>0 t h e n V t : = i ;
End;
w r i t e ( f o , v t , ’ ’ , m a x ) ; close( f o ) ;
End.
Bài 5: Sắp xếp
Cho dãy số gồm n số nguyên. Hãy sắp xếp dãy số theo thứ tự tăng dần.
Dữ liệu vào: Lưu trong tệp SapXep.inp có cấu trúc như sau:
+ Dòng thứ nhất lưu số nguyên n (n < 107) cho biết số phần tử trong dãy.
+ Dòng thứ hai lưu n số nguyên mỗi số cách nhau ít nhất một khoảng trắng. Dữ liệu ra:
Ghi vào tệp SapXep.out dãy đã được sắp tăng.
Ví dụ:
SapXep.inp SapXep.out
5 12457
2 5 17 4
Chương trình:
Program SapXep;
Var fi,fo: text;
n,i,j:integer;
A:array[1..10000000] of longint;
Procedure D o i C h o ( v a r a , b : l o n g i n t ) ;
Var tam:integer;
Begin
tam:=a; a: =b ; b:=tam;
End;
Begin
assign( f i , ’ S a p X e p . i n p ’ )
; reset( f i ) ; r e a d l n ( f i , n ) ;
for i:=1 to n do read(fi,A[i]);
close( f i ) ;
for i:=1 to n-1 do
for j:=i to n do
i f ( A [ i ] > A [ j ] ) then D o i C h o ( A [ i ] , A [ j ] ) ;
assign( f o , ’ S a p X e p . o u t ’ ) ; rewrite( f o ) ;
F o r i : = 1 t o n d o w r i t e ( f o , A [ i ] , ’ ’ ) ; close( f o ) ;
End
. Bài 6: Dãy con dương
Cho dãy số gồm n số nguyên. Hãy cho biết số lượng các số dương liên tiếp nhiều
nhất. Dữ liệu vào: Lưu trong tệp DayconDuong.inp có cấu trúc như sau:
+ Dòng thứ nhất lưu số nguyên n (n < 107) cho biết số phần tử trong dãy.
+ Dòng thứ hai lưu n số nguyên mỗi số cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Ghi vào tệp DayConDuong.out số lượng các số dương liên tiếp nhiều
nhất. Ví dụ:
DayConDuong.inp DayConDuong.out
8 3
2 5 - 1 7 4 3 - 2 - 2
Chương trình:
Giải thích: Dãy con dương dài nhất là 7 4 3 có độ dài là 3.
Program DayConDuong;
Var fi,fo: text;
n,i,dem,max: integer;
A:array[1..10000000] of longint;
Begin assign( f i , ’ D a y C o n D u o n g . i n p ’ ) ;
reset( f i ) ; r e a d l n ( f i , n ) ;
for i:=1 to n do read(fi,A[i]);
close( f i ) ; d e m : = 0 ; m a x : = 0 ; f o r
i : = 1 t o n d o Begin
if(A[i]>0) then
Begin dem:=dem+1;
if(max<dem) then max:=dem;
End;
if(A[i]<=0) then dem:=0;
End;
assign( f o , ’ D a y C o n D u o n g . o u t ’ ) ;
rewrite( f o ) ; w r i t e ( f o , m a x ) ;
close( f o ) ;
End.
Bài 7: Dãy con chẵn
Cho dãy số gồm n số nguyên. Hãy cho biết số lượng các số chẵn liên tiếp nhiều nhất.
Dữ liệu vào: Lưu trong tệp DayconChan.inp có cấu trúc như sau:
+ Dòng thứ nhất lưu số nguyên n (n < 107) cho biết số phần tử trong dãy.
+ Dòng thứ hai lưu n số nguyên mỗi số cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Ghi vào tệp DayConchan.out có cấu trúc như sau;
+ Dòng thứ nhất ghi số lượng các số chẵn liên tiếp nhiều nhất.
+ Dòng thứ 2 ghi dãy con chẵn đó (nếu có nhiều dãy bằng nhau thì chỉ ghi dãy đầu tiên)
.Ví dụ:
DayConChan.inp DayConChan.out
8 3
2 5 2 2 4 3 - 2 - 2 2 2 4
rewrite( f o ) ; w r i t e l n ( f o , m a x ) ;
for i:=vt1 to vt2 do write(fo,A[i],’ ’);
close( f o ) ;
End.
Bài 8: Dãy con đổi dấu
Cho dãy số gồm n số nguyên. Hãy cho biết dãy số hạng đổi dấu nhiều nhất có bao nhiêu phần
tử. Dữ liệu vào: Lưu trong tệp DayDoiDau.inp có cấu trúc như sau:
+ Dòng thứ nhất lưu số nguyên n (n < 107) cho biết số phần tử trong dãy.
+ Dòng thứ hai lưu n số nguyên mỗi số cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Ghi vào tệp DayDoiDau.out số lượng phần tử của dãy đổi dấu nhiều nhất.
Ví dụ:
DayDoiDau.inp DayDoiDau.out
8 3
2 5 - 1 7 4 3 - 2 - 2
6 10 3
3 7 2 8 4 3
Chương trình:
Program To n g X ;
Var fi,fo: text;
n,i,j,X,Dem:longint;
A:array[1..10000000] of longint;
Begin assign( f i , ' To n g X . i n p ' ) ; reset( f i ) ;
readln(fi,n,X);
for i:=1 to n do read(fi,A[i]);
close( f i ) ;
Dem:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
if(A[i]+A[j]=X) then
i n c ( D e m ) ; assign( f o , ’ To n g X . o u t ’ ) ; rewrite( f o ) ;
w r i t e l n ( f o , D e m ) ; close (f o ) ;
End.
Thuât toán trên có đô phức tạp là O(n2). Chúng ta có thể giải bài toán trên với đô phức tạp O(n)
như sau:
Program To n g X ;
Var fi,fo: text;
n,i,j,X,Dem:longint;
A,B:array[1..10000000] of longint;
Begin assign( f i , ’ To n g X . i n p ’ ) ; reset( f i ) ; r e a d l n ( f i , n , X ) ;
for i:=1 to n do read(fi,A[i]);
close( f i ) ;
for i:=1 to n do inc(B[A[i]]);
Dem:=0;
for i:=1 to n-1 do
i f ( B [ X - A [ i ] ] > 0 ) t h e n Begin
dem:=Dem+B[A[i]]*B[X-A[i]];
B[A[i]]:=0;
End; B[X-A[i]]:=0;
assign( f o , ’ To n g X . o u t ’ ) ; rewrite( f o ) ;
w r i t e l n ( f o , D e m ) ; close( f o ) ;
End
. Mảng 2 chiều
Bài 1: Max Min
Tìm phần tử đạt giá trị Max, và phần tử đạt giá trị Min trong ma trận các số nguyên có kích
thước mxn.
Dữ liệu vào: Lưu trong tệp MaxMinX.inp có cấu trúc như sau:
+ Dòng đầu tiên lưu hai số nguyên dương (m,n < 104).
+ m dòng tiếp theo mỗi dòng lưu n số nguyên. Mỗi số cách nhau ít nhất một khoảng
trắng. Dữ liệu ra: Ghi vào tệp MaxMin.out có cấu trúc như sau:
+ Dòng thứ nhất ghi phần tử đạt giá trị Max và vị trí của nó.
+ Dòng thứ hai ghi phần tử đạt giá trị Min và vị trí của nó.
+ Nếu có nhiều phần tử đạt giá trị Max hoặc Min thì phần tử Max hoặc Min là phần tử
trắng. Dữ liệu ra: Ghi vào tệp NguyenTo.out số lượng số nguyên tố thỏa điều kiện Ví dụ:
N g u y e n To . i n p N g u y e n To . o u t
3 4 2
3 7 2 8
5 5 7 9
2 4 5 6
Giải thích: Có hai số nguyên tố nằm ở hàng chẵn và cột lẻ là 5 (2,1) và 7 (2,3). Chương trình:
Program NguyenTo;
Var fi,fo: text;
n,m,i,j,Dem:integer;
A:array[1..10000,1..10000] of longint;
Function N g u y e n To ( k : l o n g i n t ) : b o o l e a n ;
Var i:integer;
Begin
i:=1;
repeat
inc(i);
until (k mod i =0) or (i*i>k);
i f i * i < k t h e n N g u y e n To : = F a l s e e l s e N g u y e n To : = Tr u e ;
End;
Begin
assign( f i , ’ N g u y e n To . i n p ’ )
; reset( f i ) ;
readln(fi,m,n)
; for i:=1 to m
d o Begin
for j:=1 to n do read(fi,A[i,j]);
readln(fi);
End; close( f i ) ;
Dem:=0;
For i:=1 to m do
for j:=1 to n do
i f ( N g u y e n To ( A [ i , j ] ) ) a n d ( i m o d 2 = 0 ) a n d ( j mod
2=1) t h e n i n c ( D e m ) ; assign( f o , ’ N g u y e n To . o u t ’ ) ; rewrite( f o ) ;
w r i t e ( f o , D e m ) ; close( f o ) ;
End.
Bài 3: Cực trị
Cho mảng A(n x m) các số nguyên. Phần tử Ai,j với ( 1 ( 1 < i < n , 1 < j < m ) được
gọi là phần tử cực trị nếu nó nhỏ hơn hoặc lớn hơn tất cả các phần tử lân cận với nó.
Dữ liệu vào: Lưu trong tệp CucTri.inp với cấu trúc:
+ Dòng đầu tiên lưu hai số nguyên dương cách nhau một khoảng trắng thể hiện giá trị
n và m (1 < n ,m < 100 ).
+ n dòng tiếp theo mỗi dòng lưu m số nguyên (-30.000<Ai,j<30.000), mỗi số cách
nhau một khoảng trắng.
Dữ liệu ra: Ghi vào tệp CucTri.out một số nguyên duy nhất thể hiện tổng số phần tử cực trị
trong mảng.
Yêu cầu: Viết chương trình nhập dữ liệu từ tệp CucTri.inp và ghi kết quả ra tệp CucTri.out.
Ví dụ:
C u c Tr i . i n p C u c Tr i . o u t C u c Tr i . i n p C u c Tr i . o u t
3 3 1 3 3 2
3 2 3 3 2 3
2 5 2 15 2
3 2 4 3 2 4
Giải thích:
+ Ở ví dụ 1 có 1 cực trị: Số 5 (5>{3,2,3,2,4,2,3,2})
+ Ở ví dụ 2 có 2 cực trị: Số 5 (5>{3,2,3,2,4,2,3,1}) và số 1 (1<{3,2,5,2,3}) Chương
trình:
Program C u c Tr i ;
Var A:array[1..100,1..100] of integer;
fi,fo:text;
n,m,t,p:integer;
Function K t L a n C a n ( i , j : i n t e g e r ) : b o o l e a n ;
Begin
KtLanCan:=false;
if (i>=1)and(j>=1)and(i<=n)and(j<=m)
then KtLanCan:=true;
End;
Function C u c D a i ( d , c : i n t e g e r ) : b o o l e a n ;
Var i , j : i n t e g e r ;
Begin
CucDai:=true;
for i:=d-1 to d+1 do
for j:=c-1 to c+1 do
if KtLanCan(i,j) then
if (i<>d)or(j<>c) then
if a[i,j] >= a[d,c] the
n Begin C u c D a i : = f a l s e ; b r e a k ;
End;
End;
Function C u c Ti e u ( d , c : i n t e g e r ) : b o o l e a n ;
Var i , j : i n t e g e r ;
Begin
C u c Ti e u : = t r u e ;
for i:=d-1 to d+1 do
for j:=c-1 to c+1 do
if KtLanCan(i,j) then
if (i<>d)or(j<>c) then
i f a [ i , j ] < = a [ d , c ] t h e n Begin
C u c Ti e u : = f a l s e ; End;
break;
End;
Procedure X u Ly ( v a r t , p : i n t e g e r ) ;
Var i , j : i n t e g e r ;
Begin
t:=0;
p:=0;
for i:=1 to n do
for j:=1 to m do
Begin i f C u c Ti e u ( i , j ) t h e n i n c ( t ) ;
if CucDai(i,j) then inc(p);
End;
End;
Procedure Nhap;
Var i , j : i n t e g e r ;
Begin
a s s i g n ( f i , ’ C u c Tr i . i n p ’ ) ; r e s e t ( f i ) ;
readln(fi,n,m); for i:=1 to n do
for j:=1 to m do
read(fi,a[i,j]);
close (fi);
End;
procedure X u a t ; begin
a s s i g n ( f o , ’ C u c Tr i . o u t ’ ) ; r e w r i t e ( f o ) ;
writeln(fo,t+p); close (fo);
End;
Begin
Nhap ;
X u Ly ( t , p ) ;
Xuat;
End.Bài 4: Sắp xếp
Cho một ma trận các số nguyên có kích thước nxm. Hãy sắp xếp ma trận tăn dần theo cấu trúc dưới
đây:
>
*
> >
Dữ liệu vào: Lưu trong tệp SapXep.inp có cấu trúc như sau:
+ Dòng đầu tiên lưu hai số nguyên dương (m,n < 104).
+ m dòng tiếp theo mỗi dòng lưu n số nguyên. Mỗi số cách nhau ít nhất một khoảng trắng.
Bui Hong Dan Page 24
Tuyển chọn một số bài toán tin cơ bản
Dữ liệu ra: Ghi vào tệp SapXep.out ma trận sau khi được sắp xếp.
Ví dụ:
SapXep.inp SapXep.out
3 3
H
T
N
<
n
c
13 5 456
4 7 6 789
8 9 2
Hướng dẫn:
Bước 1: Nhập ma trận từ file SapXep.inp.
Bước 2: Chuyển ma trận thành mảng 1 chiều.
Bước 3: Sắp xếp mảng 1 chiều.
Bước 4: Chuyển mảng 1 chiều thành 2 chiều theo đúng vị trí của từng phần tử.
Bước 5: Ghi ma trận đã được sắp xếp ra file SapXep.out Chương trình:
Program NguyenTo;
Var fi,fo: text;
n,m,i,j:integer;
k,t:longint;
A:array[1..10000,1..10000] of longint;
B:array[1..100000000] of longint;
Procedure H o a n D o i ( v a r a , b : l o n g i n t ) ;
Var Ta m : l o n g i n t ;
Begin
Ta m : = a ; a : = b ; b : = Ta m ;
End;
Procedure Nhap;
Begin
assign(fi,’SapXep.inp’); reset (fi);
r e a d l n ( f i , m , n ) ; f o r i : = 1 t o m d o Begin
for j:=1 to n do read(fi,A[i,j]);
readln(fi);
End;
close (fi)
; End;
Procedure Chuyen1Chieu;
Begin
k:=1;
for i:=1 to m do
for j:=1 to n do
Begin B [ k ] : = A [ i , j ] ; k : = k + 1 ;
End;
End;
Procedure SapXep1Chieu;
Begin
for k : = 1 t o m*n-1 do
for t : = k + 1 t o m * n d o
if B[k]>B[t] then HoanDoi(B[k],B[t]);
End;
Procedure Chuyen2Chieu;
Begin
k:=1;
Bùi Hồng Dân Page 25
Tuyển chọn một số bài toán tin cơ bản
For i:=1 to m do
for j:=1 to n do
Begin A [ i , j ] : = B [ k ] ; k : = k + 1 ;
End;
End;
Procedure X u a t ;
Begin
Assign(fo,’SapXep.out ’ )
; rewrite(fo); for i:=1 to
m d o Begin
for j:=1 to n do write(fo,A[i,j]:3);
End; writeln(fo);
close (fo);
End;
Begin Nhap;
Chuyen1Chieu;
SapXep1Chieu;
Chuyen2Chieu;
Xuat;
End.
Bài 5: Sắp xếp 2
Cho một ma trận các số nguyên có kích thước nxm. Hãy sắp xếp ma trận tăn dần theo cấu trúc dưới
đây:
Dữ liệu vào: Lưu trong tệp SapXep.inp có cấu trúc như sau:
+ Dòng đầu tiên lưu hai số nguyên dương (m,n < 104).
+ m dòng tiếp theo mỗi dòng lưu n số nguyên. Mỗi số cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Ghi vào tệp SapXep.out ma trận sau khi được sắp xếp.
Ví dụ:
SapXep.inp SapXep.out
3 3 1 2 3
1 3 5 6 5 4
4 7 6 7 8 9
8 9 2
Hướng dẫn:
Bước 1: Nhập ma trận từ file SapXep.inp.
Bước 2: Chuyển ma trận thành mảng 1 chiều.
Bước 3: Sắp xếp mảng 1 chiều.
Bước 4: Chuyển mảng 1 chiều thành 2 chiều theo đúng vị trí của từng phần tử. Bước 5: Ghi
ma trận đã được sắp xếp ra file SapXep.out.
Chương trình:
Program SapXep;
Var fi,fo: text;
n,m,i,j,Dem:integer;
k,t:longint;
A:array[1..10000,1..10000] of longint; B:array[1..100000000] of
Bùi Hồng Dân Page 26
Tuyển chọn một số bài toán tin cơ bản
longint;
Procedure H o a n D o i ( v a r a , b : l o n g i n t ) ;
Var Ta m : l o n g i n t ;
Begin
Ta m : = a ; a : = b ;
b : = Ta m ;
End;
Procedure Nhap;
Begin
assign(fi,’SapXep.inp’);
reset (fi); readln(fi,m,n);
f o r i : = 1 t o m d o Begin
for j:=1 to n do read(fi,A[i,j]);
End; readln(fi);
close (fi);
End;
Procedure Chuyen1Chieu;
Begin
k:=1;
for i:=1 to m do
f o r j : = 1 t o n d o Begin
B[k]:=A[i,j];
End; k:=k+1;
End;
Procedure SapXep1Chieu;
Begin
for k : = 1 t o m*n-1 do
for t : = k + 1 t o m * n d o
if B[k]>B[t] then HoanDoi(B[k],B[t]);
End;
Procedure Chuyen2Chieu;
Begin
k:=1; i:=1;
While(i<=m) do
Begin i f ( i mod 2=1) t h e n
f o r j : = 1 t o n d o Begin
A[i,j] :=B[k]
; inc(k);
End;
if(i mod 2=0) then
for j:=n downto 1 do
Begin
A[i,j]:=B[k];
End; i n c ( k ) ;
inc(i);
End;
End;
Procedure X u a t ;
Begin
Assign(fo,’SapXep.out’);
rewrite(fo); for i:=1 to
m d o Begin
for j:=1 to n do write(fo,A[i,j]:3);
End; writeln(fo);
close (fo);
End;
Begin Nhap;
Chuyen1Chieu;
SapXep1Chieu;
Chuyen2Chieu;
Xuat;
End.
Bài 6: Sắp xếp 3
Cho một ma trận các số nguyên có kích thước nxm. Hãy sắp xếp ma trận tăn dần theo cấu trúc dưới
đây:
------------------------>
A ------------------->
f->]
^— l
Dữ liệu vào: Lưu trong tệp SapXep.inp có cấu trúc như sau:
+ Dòng đầu tiên lưu hai số nguyên dương (m, n < 104).
+ m dòng tiếp theo mỗi dòng lưu n số nguyên. Mỗi số cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Ghi vào tệp SapXep.out ma trận sau khi được sắp xếp.
Ví dụ:
SapXep. np SapXep.out
3i 7 1 2 3 4 5 6 7
3 1 2 1 0 11 1 2 2 0 16 17 18 19 20 21 8
4 6 5 14 15 13 21 15 14 13 12 11 10 9
7 9 17 19 16
O
O
C
C
1
Hướng dẫn:
Bước 1: Nhập ma trận từ file SapXep.inp.
Bước 2: Chuyển ma trận thành mảng 1 chiều.
Bước 3: Sắp xếp mảng 1 chiều.
Bước 4: Chuyển mảng 1 chiều thành 2 chiều theo đúng vị trí của từng phần tử.
Bước 5: Ghi ma trận đã được sắp xếp ra file SapXep.out.
Chú ý: Đối với ma trận vuông cấp (nxn) thì thuật toán chuyển từ mảng 1 chiều sang 2 chiều đơn
giản hơn.
Chương trình;
Program SapXep;
Var fi,fo: text;
Dem:integer;
k,t:longint;
A:array[1..10000,1..10000] of longint;
B:array[1..100000000] of longint;
Procedure H o a n D o i ( v a r a , b : l o n g i n t ) ;
Var Ta m : l o n g i n t ;
Begin
Ta m : = a ; a : = b ; b : = Ta m ;
End;
Bùi Hồng Dân Page 28
Tuyển chọn một số bài toán tin cơ bản
Procedure Nhap;
Begin
assign(fi,’SapXep.inp’); reset (fi);
r e a d l n ( f i , m , n ) ; f o r i : = 1 t o m d o Begin
for j:=1 to n do read(fi,A[i,j]); readln(fi)
for i:=1 to m do
Begin f o r j : = 1 t o n d o w r i t e ( f o , A [ i , j ] : 3 ) ;
writeln(fo);
End;
close (fo);
End;
Begin
Nhap ;
ChuyenlChieu;
SapXeplChieu;
Chuyen2Chieu;
End.
X u a t ; Xâu ký tự
Bài 1: Đối Xứng
Xâu đối xứng là xâu bằng chính xâu đảo của nó. Hãy kiểm tra xem một xâu có phải là xâu đối
xứng hay không?
Dữ liệu vào: Lưu trong tệp DoiXung.inp một xâu ký tự.
Dữ liệu ra: Ghi vào tệp DoiXung.out “Yes” nếu là xâu đối xứng, “No” nếu là xâu không đối xứng.
Ví dụ:
DoiXung.inp DoiXung.out
ABCBA Yes
DoiXung.inp DoiXung.out
ABCDE No
Hướng dẫn: Tao xâu đảo ngược, so sánh xâu ban đầu với xâu đảo ngược. Chương trình:
Program DoiXung;
Var f i , f o : text;
s,t: string; i:integer;
Begin assign( f i , ’ D o i X u n g . i n p ’ ) ;
reset( f i ) ; r e a d l n ( f i , s ) ;
close( f i ) ;
f o r i : = l e n g t h ( s ) downto 1 do t : = t + s [ i ] ;
assign( f o , ’ D o i X u n g . o u t ’ ) ; rewrite( f o ) ;
i f s = t then w r i t e ( f o , ’ Ye s ’ ) e l s e w r i t e ( f o , ’ N o ’ ) ;
close( f o ) ;
End.
Hoặc có thể dụng thuật toán nhanh hơn như sau:
Program DoiXung;
Var fi,fo: text;
s: string;
kt:boolea
n;
i:integer;
Begin assign( f i , ’ D o i X u n g . i n p ’ ) ;
reset( f i ) ; r e a d l n ( f i , s ) ;
close( f i ) ;
for i:=1 to (length(s)div 2) do
i f ( s [ i ] = s [ l e n g t h ( s ) - i + 1 ] ) then k t : = t r u e e l s e
Begin k t : = f a l s e ;
break;
End;
assign( f o , ’ D o i X u n g . o u t ’ ) ; rewrite( f o ) ; i f k t = t r u e then w r i t e ( f o , ' Ye s ' )
e l s e w r i t e ( f o , ' N o ' ) ; close( f o ) ;
End.
Bài 2: Sửa lỗi
Lỗi thừa khoảng trắng giữa các từ trong một xâu văn bản rất thường gặp. Hãy viết chương trình
sửa lỗi một xâu văn bản bị lỗi khoảng trắng cho trước.
Dữ liệu vào: Lưu trong tệp SuaLoi.inp một xâu ký tự bị lỗi khoảng trắng.
Dữ liệu ra: Ghi vào tệp SuaLoi.out xâu đã được sửa hết lỗi.
Ví dụ:
SuaLoi.inp SuaLoi.out
To i d i h o c To i d i h o c
Chú ý: #32= ‘
Chương trình:
Program DoiXung;
Var fi,fo: text;
s: string;
kt:
boolean; i:
integer;
Begin assign( f i , ' S u a L o i . i n p ' )
; reset( f i ) ;
readln(fi,s);
close( f i ) ;
while(s[1]=#32) do delete(s,1,1); //Xoa ky tu trang o dau xau.
w h i l e ( s [ l e n g t h ( s ) ] = # 3 2 ) d o d e l e t e ( s , l e n g t h ( s ) , 1 ) ; / / X o a cuoi x a u .
while(pos(#32#32,s)<>0) do delete(s,pos(#32#32,s),1);//Xoa giua.
assign( f o , ’ S u a L o i . o u t ’ ) ;
rewrite( f o ) ;
write(fo,s);
close( f o ) ;
End.
B à i 3 : Liệt kê
Viết chương trình liệt kê tất cả các từ trong một xâu văn bản.
Dữ liệu vào: Lưu trong tệp LietKe.inp một xâu ký tự bị lỗi khoảng trắng.
Dữ liệu ra: Ghi vào tệp LietKe.out tất cả từ trong xâu văn bản đã cho, mỗi từ nằm trên một dòng.
Ví dụ
LietKe.inp LietKe.out
hom nay toi di hoc hom
nay
toi
di
hoc
Chương trình:
Program L i e t K e ;
Var fi,fo: text;
s: string;
Begin
assign( f i , ’ L i e t K e . i n p ’ )
; reset( f i ) ;
readln(fi,s);
close( f i ) ;
assign( f o , ’ L i e t K e . o u t ’ )
; rewrite( f o ) ;
s:=s+#32;
w h i l e ( p o s ( # 3 2 , s ) < > 0 ) d o Begin
writeln(fo,copy(s,1,pos(#32,s)-1));
End; d e l e t e ( s , 1 , p o s ( # 3 2 , s ) ) ;
close( f o ) ;
End.
L ư u ý : X â u v ă n b ả n trong input của trương trình trên là không có lỗi khoảng trắng, không có
dấu câu. Nếu input có lỗi khoảng trắng thì gọi thủ tục sửa lỗi (bài 2) trước khi liệt kê các từ. Nếu
xâu văn bản có các dấu câu thì chương trình sửa lại như sau:
LietKe.inp LietKe.out
h o m n a y, h o m q u a . hom
nay
hom
qua
Chương trình:
Program L i e t K e ;
Var fi,fo: text;
s,t: string;
Begin assign( f i , ’ L i e t K e . i n p ’ )
; reset( f i ) ;
readln(fi,s);
close( f i ) ;
assign( f o , ’ L i e t K e . o u t ’ )
; rewrite( f o ) ;
s:=s+#32;
w h i l e ( p o s ( # 3 2 , s ) < > 0 ) d o Begin
t:=copy(s,1,pos(#32,s)-1) ;
if(t[length(t)]=’,’) or (t[length(t)]=’.’)
/ / C o t h e c o nhieu dau cau khac n u a .
then delete(t,length(t),1); writeln(fo,t);
End; d e l e t e ( s , 1 , p o s ( # 3 2 , s ) ) ;
close( f o ) ;
End.
B à i 4 : Liệt kê 2
Cho một xâu văn bản, hãy liệt kê tất cả các chữ cái và số lượng của nó (không phân biệt chữ hoa
và chữ thường.
Dữ liệu vào: Lưu trong tệp LietKe.inp một xâu ký tự bị lỗi khoảng trắng.
Dữ liệu ra: Ghi vào tệp LietKe.out tất cả các chữ cái và số lượng của nó theo thứ tự từ điển. Có cấu
trúc như ví dụ sau:
Ví dụ:
SuaLoi.inp SuaLoi.out
ABC DEF ABF A 2
B 2
C 1
D 1
E 1
F 2
Chương trình:
Program L i e t K e ;
Var fi,fo: text;
s: string;
D e m : a r r a y [ ’ A’ . . ’ Z ’ ] o f b y t e ;
i:integer; ch:char;
Begin assign( f i , ’ L i e t K e . i n p ’ )
; reset( f i ) ;
readln(fi,s);
close( f i ) ;
for i:=1 to length(s) do
i f ( u p c a s e ( s [ i ] ) i n [ ’ A’ . . ’ Z ’ ] )
then inc(Dem[upcase(s[i])]);
assign( f o , ’ L i e t K e . o u t ’ ) ; rewrite( f o ) ; f o r c h : = ’ A’
to ’Z’ do
i f D e m [ c h ] > 0 then w r i t e l n ( f o , c h , ’ ’ , D e m [ c h ] ) ;
close( f o ) ;
End.
Bài 5: Đếm từ
C h o m ộ t x â u v ă n b ả n v à m ộ t t ừ (mỗi từ ngăn cách với từ khác bằng một khoảng trắng).
Hãy cho biết từ đó xuất hiện bao nhiêu lần trong xâu văn bản đã cho.
Dữ liệu vào: Lưu trong tệp DemTu.inp có cấu trúc như sau:
+ Dòng 1: Lưu từ cần đếm.
+ Dòng 2: Lưu xâu văn bản.
Dữ liệu ra: Ghi vào tệp Demtu.out số lượng từ đã cho xuất hiện trong xâu.
Ví dụ:
D e m Tu . i n p D e m Tu . o u t
AB 3
A B ABCD AB BCAB AB
Chương trình:
Program DemTu;
Var fi,fo: text;
s,tu: string; Dem:integer;
Begin
assign( f i , ’ D e m Tu . i n p ’ ) ;
reset( f i ) ;
readln(fi,tu);
read(fi,s);
close( f i ) ;
Dem:=0;
if(pos(tu+#32,s)=1) then inc(Dem); // KT tu dau;
if(copy(s,length(s)-length(tu),length(tu)+1)=#32+tu)
then inc(Dem); //Kiem tra ky tu o cuoi;
tu:=#32+tu+#32;
while(pos(tu,s)>0) do //Kiem tra cac tu o giua;
Begin
inc(Dem);
delete(s,pos(tu,s),length(tu)-1);
End;
assign( f o , ’ D e m Tu . o u t ’ ) ; rewrite( f o ) ; w r i t e ( f o , D e m ) ;
close( f o ) ;
End.
B à i 6 : Palindrom
Một số nguyên gọi là palindrom nếu nó đọc từ trái sang cũng bằng đọc từ phải sang. Cho một dãy
gồm nhiều phần tử nguyên dương. Hãy cho biết có bao nhiêu số là palindrom và hiển thị các số
đó theo thứ tự xuất hiện trong dãy.
Dữ liệu vào: Lưu trong tệp Palindrom.inp một dãy số (<108 phần tử) nguyên dương. Mỗi số
(<108) cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Ghi vào tệp Palindrom.out có cấu trúc như sau: Mỗi dòng ghi một số palindrom theo
thứ tự xuất hiện trong dãy.
Ví dụ:
Palindrom.inp Palindrom.out
121 1 1234 22 235 121
1
22
Chương trình:
Program P a l i n d r o m ;
Var fi,fo: text;
s: string;
i:integer;
a:longint;
Function D o i X u n g ( k : s t r i n g ) : b o o l e a n ;
var t:string;
Begin
f o r i : = l e n g t h ( k ) downto 1 do t : = t + k [ i ] ; i f t = k t h e n
D o i X u n g : = Tr u e e l s e D o i X u n g : = F a l s e ;
End;
Begin
assign( f i , ’ p a l i n d r o m . i n p ’ ) ; reset( f i )
F(n)={
()()
Yêu cầu: Tìm số Fibonacci thứ n.
Dữ liệu vào: Lưu trong tệp Fibo.inp một số nguyên dương n (n < 108).
Dữ liệu ra: Ghi vào tệp Fibo.out số Fibonacci thứ n.
Ví dụ:
Fibo.inp Fibo.out
8 21
Chương trình:
Program F i b o n a c c i ;
Var fi,fo: text;
i , n , x , y, z : i n t e g e r ;
Begin assign( f i , ' F i b o . i n p ' ) ;
reset( f i ) ; r e a d l n ( f i , n ) ;
close( f i ) ; x : = 0 ; y : = 1 ;
f o r i : = 2 t o n d o begin
z:=x+y;
x : =y;
y:=z;
End;
assign( f o , ’ F i b o . o u t ’ ) ;
rewrite( f o ) ;
w r i t e ( f o , z ) ; close( f o ) ;
End.
B à i 2 : S ố hoàn hảo
Số hoàn hảo được định nghĩa như sau:
+ 1 không phải là số hoàn hảo.
+ Có tổng các ước nhỏ hơn nó bằng chính nó.
Yêu cầu: Hãy liệt kê tất cả các số hoàn hảo nhỏ hơn một số nguyên cho trước.
Dữ liệu vào: Lưu trong tệp SoHH.inp một số nguyên dương n (n < 104).
Dữ liệu ra: Ghi vào tệp SoHH.out tất cả cá số hoàn hảo nhỏ hơn n.
Ví dụ:
SoHH.inp SoHH.out
10000 6
28
496
8128
Chương trình:
Program S o H o a n H a o ;
Var fi,fo: text;
i,n:integer;
Function S o H H ( x : i n t e g e r ) : b o o l e a n ;
Var sum,j:integer;
Begin
sum:=0;
for j:=1 to x-1 do
if(x mod j=0) then inc(sum,j); if(sum=x) then SoHH:=true else
SoHH:=false;
End;
Begin
assign( f i , ’ S o H H . i n p ’ ) ; reset( f i ) ;
r e a d l n ( f i , n ) ; close( f i ) ;
assign( f o , ’ S o H H . o u t ’ ) ; rewrite( f o ) ;
f o r i : = 2 t o n - 1 d o i f ( S o H H ( i ) = t r u e ) t h e n w r i t e l n ( f o , i ) ; close( f o ) ;
End.
B à i 3 : Thừa số nguyên tố
Hãy phân tích một số ra thành thừa số nguyên tố.
Dữ liệu vào: Lưu trong tệp TSNT.inp một số nguyên dương n (n < 106).
Dữ liệu ra: Ghi vào tệp TSNT.out tích các thừa số nguyên tố.
Ví dụ:
T S N T. i n p T S N T. o u t
18
*
*
2
3
3
Chương trình:
Program ThuaSoNguyenTo;
Var fi,fo: text;
i,n:integer;
Begin assign( f i , ’ T S N T. i n p ’ ) ; reset( f i ) ;
r e a d l n ( f i , n ) ; close( f i ) ;
assign( f o , ’ T S N T. o u t ’ ) ; rewrite( f o ) ;
i : = 2 ; repeat
while(n mod i<>0) do i:=i+1; write(fo,i);
n:=n div i;
i f n > 1 then w r i t e ( f o , ’ * ’ ) ; u n t i l n=1;
close( f o ) ;
End.
B à i 4 : X ó a phần tử trùng nhau
Cho dãy số gồm n số nguyên. Nếu số nguyên nào xuất hiện nhiều lần thì chỉ giữ lại 1 số xuất hiện
đầu tiên trong dãy.
Dữ liệu vào: Lưu trong tệp Xoa.inp có cấu trúc như sau:
+ Dòng thứ nhất lưu số nguyên n (n < 107) cho biết số phần tử trong dãy.
+ Dòng thứ hai lưu n số nguyên mỗi số cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Ghi vào tệp Xoa.out tổng của các số nguyên tố.
Ví dụ:
Xoa.inp Xoa.out
5 2 3 4
2 3 4 3 2
Hướng dẫn: Duyệt mảng bằng 2 biết, nếu phát hiện phần tử nào bằng nhau thì xóa bớt một phần
từ ra khỏi mảng.
Chương trình:
Program XoaPhanTu;
Var fi,fo: text;
n,i,j,k:longint;
A:array[1..10000000] of longint;
Begin assign( f i , ' X o a . i n p ' ) ;
reset( f i ) ; r e a d l n ( f i , n ) ;
for i:=1 to n do read(fi,A[i]);
close( f i ) ; i : = 2 ;
while(i<=n)
d o Begin
j:=1;
while(A[j]<>A[i]) do inc(j);
if ( j < i ) then begin
for k:=i to n-1 do A[k]:=A[k+1];
End dec(n);
else i n c ( i ) ;
End;
assign( f o , ’ X o a . o u t ’ ) ; rewrite( f o ) ;
for i:=1 to n do write(fo,A[i],’ ’);
close( f o ) ;
End.
L ư u ý : Thuật toán trên có độ phức tạp O(n3). Ngoài ra còn có thuật toán độ phức tạp O(n) gợi ý
như dưới đây:
+ Sử dụng biến kiểu cấu trúc có 2 thành phần, một thành phần lưu giá trị, một thành phần lưu vị trí dầu
tiên
.+ Sử dụng mảng để lưu số lần xuất hiện của mỗi phần tử.
+ Sắp xếp lại theo vị trí xuất hiện (sử dụng thuật toán sắp xếp có độ phức tạp O(n)). +
Xuất ra mảng được sắp xếp theo vị trí xuất hiện.
Bài 5: Tổng m số
Cho số tự nhiên n và một số nguyên dương m. Hãy tính tổng m số tận cùng của n.
Dữ liệu vào: Lưu trong tệp TongM.inp hai số n và m cách nhau ít nhất một khoảng trắng. Dữ
liệu ra: Ghi vào tệp TongM.out tổng m số tận cùng của n.
Ví dụ:
To n g M . i n p To n g M . o u t
123456 3 15
Chương trình:
Program TongM;
Var fi,fo: text;
n,i,m,tong:longint;
Begin assign( f i , ’ To n g M . i n p ’ ) ; reset( f i ) ;
r e a d ( f i , n , m ) ; close( f i ) ;
tong:=0;
f o r i : = 1 t o m d o Begin
tong:=tong+(n mod 10);
n:=n div 10;
End;
assign( f o , ’ To n g M . o u t ’ ) ;
rewrite( f o ) ; w r i t e ( f o , t o n g ) ;
close( f o ) ;
End.
B à i 6 : B ộ i chung nhỏ nhất.
Cho dãy số gồm n số nguyên dương. Hãy tìm bội chung nhỏ nhất của dãy số đó. Dữ
liệu vào: Lưu trong tệp BCNN.inp có cấu trúc như sau:
+ Dòng thứ nhất lưu số nguyên n (n < 107) cho biết số phần tử trong dãy.
+ Dòng thứ hai lưu n số nguyên mỗi số cách nhau ít nhất một khoảng trắng. Dữ liệu ra:
Ghi vào tệp BCNN.out tổng của các số nguyên tố.
Ví dụ:
BCNN.inp BCNN.out
5 2 3 4
2 3 4 3 2
Hướng dẫn: Để tìm BCNN của {2,3,4,3,2) ta tìm
BCNN(BCNN(BCNN(BCNN(2,3),4),3),2). Chương trình:
Program BoiChungNhoNhat;
Var fi,fo: text;
n,i,BCNN,UCLN:longint;
A:array[1..10000000] of longint;
Function F U C L N ( a , b : i n t e g e r ) : i n t e g e r ;
Begin
While(a<>b) do
i f a > b then a : = a - b e l s e b : = b - a ;
UCLN:=a;
End;
Begin
assign( f i , ’ B C N N . i n p ’ ) ; reset( f i ) ;
readln(fi,n);
f o r i : = 1 t o n d o r e a d ( f i , A [ i ] ) ; close( f i ) ;
UCLN:=F_UCLN(A[1],A[2]);
BCNN:=(A[1]*A[2])div UCLN;; for
i : = 3 t o n d o Begin
UCLN:= F_UCLN(BCNN,A[i]);
BCNN:=((BCNN*A[i])div UCLN);
End;
assign( f o , ’ B C N N . o u t ’ ) ; rewrite( f o ) ;
w r i t e ( f o , B C N N ) ; close( f o ) ;
End.
B à i 7 : Đ ả o ngược.
Cho một xâu văn bản. Hãy đưa ra xâu đảo theo từ.
Dữ liệu vào: Lưu trong tệp DaoNguoc.inp một xâu văn bản:
Dữ liệu ra: Ghi vào tệp DaoNguoc.out xâu đảo theo từ.
Ví dụ:
D a o Tu . i n p D a o Tu . o u t
ban di hoc hoc di ban
Chương trình:
Program DaoNguoc;
Var fi,fo: text;
s : string; x,j,i:integer;
Begin assign( f i , ’ D a o N g u o c . i n p ’ ) ; reset( f i ) ;
r e a d l n ( f i , s ) ; close( f i ) ;
assign( f o , ’ D a o N g u o c . o u t ’ )
; rewrite( f o ) ; x : = l e n g t h ( s ) ; f o r i : = x - 1
downto 1 do Begin
if(s[i]=’ ’) then
Begin
for j:=i+1 to x do write(fo,s[j]);
write( fo,’ ’);
x:=i-1;
End;
End; if(i=1) then f o r j : = 1 t o x d o w r i t e ( f o , S [ j ] ) ;
close (fo);
End.
Bài 8: Đếm ký tự.
C h o m ộ t x â u v ă n bản. Hãy cho biết có bao nhiêu ký tự chữ và bao nhiêu ký tự số.
Dữ liệu vào: Lưu trong tệp DemKyTu.inp một xâu văn bản:
Dữ liệu ra: Ghi vào tệp DemKyTu.out có cấu trúc như sau:
+ Dòng 1 : Ghi số ký tự chữ.
+ Dòng 2: Ghi số ký tự số.
Ví dụ:
DemKyTu.inp DemKyTu.out
123ABCcde12 3 6
6
Chương trình:
Program DemKyTu;
Var fi,fo: text;
s : string;
Dem1,Dem2,i: integer ;
Begin assign( f i , ’ D e m K y Tu . i n p ’ ) ;
reset ( f i ) ; r e a d l n ( f i , s ) ;
close( f i ) ;
Dem1:=0; D e m 2 : = 0 ; f o r i : = 1
t o l e n g t h ( S ) d o Begin
if(s[i] in ['0'..'9']) then inc(Dem2);
i f ( s [ i ] i n [ ' A ' . . ' Z ' ] + [ ' a ' . . ' z ' ] ) then i n c ( D e m 1 ) ;
End;
assign( f o , ’ D e m K y Tu . o u t ’ ) ;
rewrite( f o ) ;
writeln(fo,Dem1);
w r i t e ( f o , D e m 2 ) ; close( f o ) ;
End.
Bài 9: Connect
Cho n số nguyên dương a i, a 2, . . . , a i, . . . , a n. T ừ c á c s ố nguyên này người ta tạo ra một số
nguyên mới bằng cách kết nối tất cả các số đã cho viết liên tiếp nhau. Ví dụ, với n=4 và các số 12, 34,
567, 890 ta có thể tạo ra các số mới như sau: 1234567890, 3456789012, 8905673412,. Dễ thấy rằng có
4!=24 cách tạo mới như vậy.
Trong trường hợp này, số lớn nhất có thể tạo thành là 8905673412.
Yêu cầu: Cho n (1<n<100) và các số a1, a2,., ai,., an (0<ai<109). Hãy xác định số lớn nhất có thể kết
nối được theo nguyên tắc trên.
Dữ liệu vào: Lưu trong tệp văn bản Connect.inp gồm n+1 dòng.
+ Dòng đầu tiên ghi số nguyên n.
+ Trong các dòng còn lại, dòng thứ i+1 ghi số ai.
Dữ liệu ra: Ghi vào tệp Connect.out số lớn nhất được kết nối thành từ các số ban đầu. Ví
dụ:
Connect.inp Connect.out
4 8905673412
12
34
567
890
Hướng dẫn: Gọi a là dãy gồm n chuỗi số đã cho. Sắp xếp theo tiêu chuẩn nếu ai+aj<aj+aithì ta
hoán vị ai và aj. Xuất dãy a ta được kết quả.
Chương trình:
Program C o n n e c t ;
Var fi,fo: text;
n,i,j,x:longint; tam: string[10];
A:array[1..100] of string[10];
Begin assign( f i , ’ C o n n e c t . i n p ’ ) ;
reset( f i ) ; r e a d l n ( f i , n ) ; f o r i : = 1 t o n
d o Begin
readln(fi,x);
str(x,A[i]);
End;
for i:=1 to n-1 do
for j:=i+1 to n do
i f A [ i ] < A [ j ] t h e n Begin
tam:=A[i];
A[i] :=A[j];
A [ j ] : =Tam;
End;
close( f i ) ;
assign( f o , ’ C o n n e c t . o u t ’ ) ;
rewrite( f o ) ;
for i:=1 to n do write(fo,A[i]);
close( f o ) ;
End.
B à i 1 0 : D ấ u ngoặc
Cho một xâu S không vượt quá 1000 ký tự chỉ bao các dấu mở ngoặc “(” và các dấu đóng ngoặc “)”,
theo quy tắc ưu tiên tính toán trong biểu thức. Tương ứng dấu mở ngoặc đứng trước là một dấu đóng
ngoặc đứng sau được gọi là một cặp dấu ngoặc.
Yêu cầu: Hãy viết chương trình đưa ra vị trí của các cặp dấu ngoặc trong xâu S theo thứ tự ưu tiên tính
toán trong biểu thức (nếu các cặp dấu ngoặc bao nhau thì vị trí cặp dấu ngoặc được bao bên trong
trước, vị trí cặp dấu ngoặc bao bên ngoài sau.
Dữ liệu vào: Lưu trong tệp DauNgoac.inp chỉ một dòng chứa xâu S.
Dữ liệu ra: Ghi vào tệp DauNgoac.out, mỗi dòng là một cặp số chỉ vị trí của dấu “(” và dấu “)”
theo đúng thứ tự ưu tiên tính toán.
Ví dụ:
DauNgoac.inp DauNgoac.out
()(()) 1 2
4 5
3 6
Hướng dẫn: Dùng biến k để đếm xem có bao nhiêu dấu mở ngoặc chưa gặp dấu đóng ngoặc. Dùng
mảng A để lưu vị trí các dấu mở ngoặc chưa đóng. Nếu gặp dấu đóng ngoặc thì hiển thị vị trí dấu
mở ngoặc chưa đóng cuối cùng trước nó và vị trí của nó, đồng thời giảm biến k xuống một đơn vị
để kiểm soát số ngoặc còn lại chưa được đóng.
Chương trình:
Program DauNgoac;
Var fi,fo: text;
i,k:integer;
s:ansistring; //Kieu xau dai;
A:array[1..1000] of integer;
Begin assign( f i , ’ D a u N g o a c . i n p ’ ) ;
reset( f i ) ; r e a d l n ( f i , S ) ;
close( f i ) ;
assign( f o , ’ D a u N g o a c . o u t ’ ) ;
rewrite( f o ) ; k : = 0 ;
for i:=1 to length(s) do
i f ( s [ i ] = ’ ( ’ ) then Begin
inc(k);
A[k]:=i;
End
e l s e i f ( S [ i ] = ’ ) ’ ) t h e n Begin
writeln(fo,A[k],’ ’,i);
End; d e c ( k ) ;
close( f o ) ;
End.
Bài 11: Chuỗi con đối xứng dài nhất
Cho một chuỗi S dài không quá 255 ký tự. Hãy cho biết độ dài chuỗi con đối xứng dài nhất
trong chuỗi S.
Dữ liệu vào: Lưu trong tệp CCDX.inp chỉ một dòng chứa xâu S.
Dữ liệu ra: Ghi vào tệp CCDX.out độ dài chuỗi con đối xứng dài nhất
Ví dụ:
CCDX.inp CCDX.out
ABCDDCBDE 6
Hướng dẫn:
Cách 1: Cho lần lượt từng số hạng của n vào mảng A. Sau đó hiển thị các phần tử của mảng A
không phải là 5 hoặc 0.
Cách 2: Chuyển số n thành xâu. Hiển thị xâu loại bỏ ký tự „5" và ký tự „0".
Chương trình:
Program L o a i B o ;
Var n,i,dem:longint;
fi,fo:text;
A:array[1..100]of integer;
Begin
assign( f i , ’ L o a i B o . i n p ’ ) ;
reset( f i ) ; r e a d ( f i , n ) ; close( f i ) ;
i:=0; dem:=0; while(n>0) do
Begin i n c ( i ) ; i n c ( d e m ) ;
A[i]:= n mod
10; n:= n div
10;
End;
assign( f o , ’ L o a i B o . o u t ’ ) ;
rewrite( f o ) ;
f o r i : = d e m downto 1 do
if(A[i]<>0)and(A[i]<>5) then write(fo,A[i]);
close (fo);
End.
Bài 13: Dãy con.
Cho một dãy số gồm n số nguyên dương, hãy cho biết xem có bao nhiêu dãy con liên tiếp có
tổng bằng một số nguyên k cho trước.
Dữ liệu vào: Lưu trong tệp DayCon.inp có cấu trúc như sau:
Dòng 1 :Lưu hai số nguyên n và k (n<107).
Dòng 2: Lưu n số nguyên dương, mỗi số cách nhau một khoảng trắng.
Dữ liệu ra: Ghi vào tệp DayCon.out số dãy con có tổng bằng k.
Ví dụ:
DayCon.inp DayCon.out
7 5 3
3 2 1 5 4 3 2
nt o n g : = t o n g - A [ j ] ; i n c ( j ) ;
End;
i f ( t o n g = k ) then i n c ( d e m ) ;
End;
assign( f o , ’ D a y C o n . o u t ’ ) ; rewrite( f o ) ;
w r i t e ( f o , d e m ) ; close( f o ) ;
End.MỘT SỐ THỦ TỤC VÀ HAM THÔNG
DỤNG CÁC THỦ TỤC THÔNG DỤNG Str(x,S) đổi giá trị kiểu số X sang
dạng chuỗi S.
Val(S,x,code) đổi chuỗi S thành sô x. Nếu đổi chuỗi thành công biến Code nhận giá trị 0. Nếu
không đổi được code là số nguyên cho biêt vị trí gây lỗi.
Inc(x,r) tăng giá trị của x nên r đơn vị. Tương đương với x:=x+r;
Dec(x,r) giảm giá trị của x xuống r đơn vị. Tương đương với x:=x-r. (thủ tục Inc(x), Dec(x) xem
như tăng, giảm x một đơn vị)
Insert(S,T,vt) chèn chuoi S vào chuoi T vtrí vt.
Delete(S,P,L) xoá L ký tự từ vị trí P ra khỏi.
Break kết thúc vòng lặp
CÁC HÀM THÔNG DỤNG
Ord(x) lấy thứ tự của ký tự x trong bản mã ASCII.
Chr(x) lấy ký tự thứ x trong bảng mã ASCII.
Pred(x) cho phần tử đứng trước x.
Succ(x) cho ra phần tử đứng sau x.
Round(x) làm tròn x.
Trunc(x) lấy phần nguyên.
Int(x) lấy phần nguyên.
Frac(x) lấy phần lẻ.
Abs(x) lấy giá trị tuyệt đối.
Copy(S,P,L) trích chuỗi S một chuỗi con dài L ký tự bắt đầu từ vtrí P.
Odd(i:Integer) cho True khi i là sô lẻ và False khi i là sô chẵn.
Pos(X,S) cho vị trí bắt đầu của chuỗi con X trong S. Nêu X không thuộc S thì hàm POS cho giá trị
0
.CÁC LỖI EXIT CODE DO RUN -TIME CỦA FREEPASCAL
Applications generated by Free Pascal might generate Run-time error when certain abnormal
conditions are detected in the application. This appendix lists the possible run-time errors and gives
information on why they might be produced.
Chương trình được viết bởi Free Pascal có thể sinh ra các lỗi chạy thực (Run-Time Error) khi nhưng
điều kiện khác thường được dò thấy trong chương trình. Danh sách sau liệt kê các lỗi chạy thực (Run-
time Error) và các thông tin về lỗi đó.
2 File not found Reported when trying to erase, rename or open a non-existent file.
Không tìm thấy file. Lỗi được báo khi có những lệnh Erase, Rename hoặc là Mở một file không tồn
tại.
3 Path not found Reported by the directory handling routines when a path does not exist or is
invalid.
Không tìm thấy file. Lỗi được báo khi đường dẫn đến file không tìm thấy được hoặc vô nghĩa.
Also reported when trying to access a non-existent file.
Cũng có thể được báo khi có lệnh truy cập 1 file không tồn tại.
4 Too many open files The maximum number of currently opened files by your process has been
reached. Certain operating systems limit the number of files which can be opened concurrently, and
this error can occur when this limit has been reached.
Quá nhiều file đã mở. Chương trình đã đạt tới giới hạn file được mở. Tuỳ hệ điều hành mà giới hạn
file được mở khác nhau, và lỗi này được báo khi số file mở đạt tới giới hạn đó.
5 File access denied Permission accessing the file is denied. This error might be caused by several
reasons:
Sự truy cập file bị từ chối. Lỗi này xảy ra khi 1 trong những lỗi sau xãy ra:
• Trying to open for writing a file which is read only, or which is actually a directory.
Có lệnh thực hiện ghi lên file có thuộc tính chỉ đọc (Read-only) hoặc đó chỉ là đường dẫn.
• File is currently locked or used by another process.
File hiện thời bị khoá hoặc bị chiến dụng bởi 1 ứng dụng khác.
• Trying to create a new file, or directory while a file or directory of the same name alreadyexists.
Có lệnh tạo 1 file mới, hoặc 1 đường dẫn mới trùng với 1 file hoặc 1 đường dẫn đã tồn tại.
• Trying to read from a file which was opened in write only mode.
Có lệnh thực hiện đọc 1 file chỉ có thuộc tính chỉ ghi (Write-only)
• Trying to write from a file which was opened in read only mode.
Có lệnh thực hiện ghi vào 1 file đã mở với chế độ chỉ đọc (Read-only)
• Trying to remove a directory or file while it is not possible.
Có lệnh thực hiện xoá (gỡ) 1 đường dẫn hoặc 1 file không có thực
• No permission to access the file or directory.
Quyền truy cập vào file bị khoá.
6 Invalid file handle If this happens, the file variable you are using is trashed; it indicates that
your memory is corrupted.
File thực hiện vô nghĩa. Nếu lỗi này xảy ra, biến file đang được sử dụung đã bị lỗi; có nghĩa là bộ
nhớ đã bị lỗi.
12 Invalid file access code Reported when a reset or rewrite is called with an invalid FileMode
value.
Mã truy cập file vô nghĩa. Lỗi được báo khi lệnh Reset hoặc Rewrite được gọi với 1 giá trị chế độ
File vô nghĩa.
15Invalid drive number The number given to the Getdir or ChDir function specifies a nonexistent
disk.
ô đĩa vô nghĩa. Số được trả bởi hàm Getdir hoặc ChDir chỉ 1 ổ đĩa không tồn tại
16Cannot remove current directory Reported when trying to remove the currently active
directory. Không thể xoá đường dẫn hiện thời. Lỗi được báo khi có lệnh xoá 1 đường dẫn đang
được sử dụng.
17Cannot rename across drives You cannot rename a file such that it would end up on another
disk or partition.
Không thể đổi tên file mà trỏ đến 1 ổ đĩa khác hoặc 1 phân vùng khác của ổ đĩa.
100 Disk read error An error occurred when reading from disk. Typically when you try to read
past the end of a file.
Lỗi đọc đĩa. Lỗi xãy ra trong khi đọc file từ đĩa. Điển hình khi có lệnh tiếp tục đọc phần tiếp theo
của cuối file.
101 Disk write error Reported when the disk is full, and you"re trying to writeto it.
Lỗi ghi đĩa. Lỗi được báo khi đĩa đã đầy và có lệnh ghi vào đĩa đó.
File not assigned This is reported by Reset, Rewrite, Append, Rename and Erase, if you cal
lthem with an unassigned file as a parameter.
File chưa được khai báo. Lỗi được báo khi lệnh Reset, Rewrite, Append, Rename và Erase được
gọi với 1 biến chưa được khai báo.
102File not open Reported by the following functions : Close, Read, Write, Seek, EOf, FilePos,
FileSize, Flush, BlockRead, and BlockWrite if the file is not open.
File chưa được mở. Lỗi được báo khi các lệnh sau được gọi: Close, Read, Write, Seek, Eof,
FilePos, FileSize, Flush, BlockRead, và BlockWrite nếu chưa mở file.
103File not open for input Reported by Read, BlockRead, Eof, Eoln, SeekEof or SeekEoln if
the file is not opened with Reset.
File chưa mở để đọc. Lỗi được báo khi các lệnh sau được gọi: Read, BlockRead, Eof, Eoln,
SeekEof hoặc SeekEoln nếu file chưa được mở bằng lệnh Reset.
105 File not open for output Reported by write if a text file isn"t opened withRewrite.
File chưa được mở để ghi. Lỗi được báo khi 1 biến kiểu Text chưa được mở bằng lệnh Rewrite.
106 Invalid numeric format Reported when a non-numeric value is read from a text file, when a
numeric value was expected.
Sai kiểu số. Lỗi được báo khi 1 giá trị ký tự được đọc từ file kiểu Text, khi mà biến đọc vào là 1
biến số.
152 Drive not ready (Critical error) ô đĩa chưa chuẩn bị.
201Range check error If you compiled your program with range checking on, then you can get this
error in the following cases:
Lỗi kiểm tra vùng xãy ra. Nếu trình biên dịch có chế độ Kiểm tra vùng (Range-Checking) được
mở, thì có thể xãy ra các lỗi sau:
1. An array was accessed with an index outside its declared range.
Có lệnh truy cập vào 1 vùng nằm ngoài khai báo 1 Array.
2. Trying to assign a value toa variable outside its range (for instance an enumerated type).
Có lệnh gán giá trị vượt quá giới hạn giá trị củabiến.
202Stack overflow error The stack has grown beyond its maximum size (in which case the size of
local variables should be reduced to avoid this error), or the stack has become corrupt. This error is
only reported when stack checking is enabled.
Tràn chồng đợi (Stack). Chồng đợi đã vượt qua giới hạn (có thể giảm dung lượng hoặc không xài
biến cục bộ để giảm thiểu lỗi này) hoặc chồng đợi có lỗi. Lỗi này chỉ được báo khi trình biên dịch có
chế độ Kiểm tra Chồng đợi (Stack Checking) được mở.
203Heap overflow error The heap has grown beyond its boundaries. This is caused when trying
to allocate memory exlicitly with New, GetMem or ReallocMem, or when a class or object instance i
screated and no memory is left. Please note that, by default, Free Pascal provides a growing heap,
i. e. the heap will try to allocate more memory if needed. However, if the heap has reached the
maximum size allowed by the operating system or hardware, then you will get this error.
Tràn Heap. Heap đã đạt tới giới hạn. Lỗi xãy ra khi có lệnh chỉ định Memory Exlicitly (?) với lệnh
New, GetMen hoặc ReallocMem, hoặc khi 1 lớp đối tượng được tạo ra và tràn bộ nhớ. Lưu ý:
FreePascal cung cấp 1 Heap tự động: Ví dụ nếu Heap đã đạt giá trị cực đại, FreePascal sẽ chỉ định
thêm vùng nhớ nếu cần. Nhưng nếu Heap đã đạt giá trị cực đại cho phép bởi hệ điều hành hoặc phần
cứng thì lỗi sẽ xảy ra.
204 Invalid pointer operation This you will get if you call Dispose or Freemem with an invalid
pointer (notably, Nil)
Lỗi phép toán Con trỏ. Lỗi xảy ra khi có lệnh Dispose hoặc FreeMem một con trỏ Nil hoặc không
xác định.
205 Floating point overflow You are trying to use or produce too large real numbers.
Lỗi tràn số. Lỗi xãy ra khi có lệnh sử dụng hoặc sinh ra 1 số thực quá lớn.
206 Floating point underflow You are trying to use or produce too small real numbers.
Lỗi tràn số. Lỗi xãy ra khi có lệnh sử dụng hoặc sinh ra 1 số thực quá nhỏ.
207 Invalid floating point operation Can occur if you try to calculate the square root or logarithm of
a negative number.
Lỗi số không xác định. Lỗi xảy ra khi có phép tính toán một căn thức hoặc hàm Log của 1 số âm.
210 Object not initialized When compiled with range checking on, a program will report this error
if you call a virtual method without having called istr constructor.
Đối tượng không có giá trị ban đầu. Khi biên dịch với trình có Kiểm tra Vùng (Range-Checking)
được mở, chương trình sẽ báo lỗi này nếu có lệnh gọi 1 phương pháp ảo (?) không có đối tượng xây
dựng (?)
211 Call to abstract method Your program tried to execute an abstract virtual method. Abstract
methods should be overridden, and the overriding method should be called.
Trừu tượng hoá phương pháp (?) Chương trình đang có thi hành 1 phương pháp ảo trừu tượng (?).
Phương pháp trừu tượng nên được ghi đè, và phương pháp đã được ghi đè nên được gọi thay.
212 Stream registration error This occurs when an invalid type is registered in the objects unit.
Lỗi đăng ký luồng. Lỗi xảy ra khi 1 kiểu biến không hợp lệ đăng ký trên thư viện Object.
213 Collection index out of range You are trying to access a collection item with an invalid
index(objects unit).
Thu thập danh mục ngoài vùng. Lỗi xãy ra khi có lệnh truy cập những thông tin thu thập được với
danh mục không xác định (lỗi trong thư viện Object)
214 Collection overflow error The collection has reached its maximal size, and you are trying to add
another element (objects unit).
Thông tin thu thập tràn bộ nhớ. Những thông tin thu thập được đã đạt giới hạn lưu trữ, và có lệnh
thêm vào 1 thông tin (lỗi trong thư viện Object)
215 Arithmetic overflow error This error is reported when the result of an arithmetic operation is
outside of its supported range. Contrary to Turbo Pascal, this error is only reported for 32-bit or 64-
bit arithmetic overflows. This is due to the fact that everything is converted to 32-bit or 64-bit before
doing the actual arithmetic operation.
Lỗi tràn số học. Lỗi xảy ra khi kết quả của 1 phép toán số học nằm ngoài giới hạn hỗ trợ của biến.
Trái với Turbo Pascal, lỗi này chỉ báo cho các phép toán số học trên hệ 32-bit hoặc 64-bit. Nguyên
nhân là các dữ liệu đều được dịch sang thông tin 32-bit hoặc 64-bit trước khi thực hiện các thao tác
tính toán số học.
216 General Protection fault The application tried to access invalid memory space. This can be
caused by several problems:
Lỗi bảo vệ chung (?) Ứng dụng đã truy cập vào vùng bộ nhớ không hợp lệ. Lỗi xãy ra khi:
1. Deferencing a nil
pointer Truy cập vào 1
con trỏ Nil.
2. Trying to access memory which is out of bounds (for example, calling move with an invalid
length).
Truy cập vào vùng nhớ nằm ngoài giới hạn.
217 Unhandled exception occurred An exception occurred, and there was no exception handler
present. The sysutils unit installs a default exception handler which catches all excpetions and exits
gracefully.
219 Invalid typecast Thrown when an invalid typecast is attempted on a class using the as operator.
This error is also thrown when an object or class is typecast to an invalid class or object and a virtual
method of that class or object is called. This last error is only detected if the -CR compiler option is
used.
227 Assertion failed error An assertion failed, and no AssertErrorProc procedural variable was
installed.