<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
TÀI LIỆU ÔN TẬP
<b>TIN HỌC TRẺ </b>
<b>(Free Pascal) </b>
Biên so
ạn
:
KS. Nguy
ễn Thanh Sang
0908 811 528
<i>Tháng 05/2017 </i>
</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>
TÀI LIỆU ÔN TẬP
<b>TIN HỌC TRẺ </b>
<b>(Free Pascal) </b>
Biên so
ạn:
KS. Nguy
ễn Thanh Sang
0908 811 528
</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>
<i><b>B</b></i>
<i><b>ẢNG B (THCS) V</b></i>
<i><b>À B</b></i>
<i><b>ẢNG C (THPT)</b></i>
L
ập tr
ình b
ằng FREE PASCAL để giải các b
ài tốn khó ho
ặc lập tr
ì
nh để thực hiện một
s
ố cơng việc thơng thường bằng máy vi tính.
- M
ức độ khó tương ứng với mặt bằng tr
ình
độ chung của mỗi cấp học. N
êu cao tính sáng
t
ạo của học sinh trong việc xác định thuật toán để giải, phương pháp kiểm tra tính đúng đắn
c
ủa dữ liệu đầ
u vào.
-
Đặc biệt y
êu c
ầu học sinh phải thao tác th
ành th
ạo tr
ên các lo
ại dữ liệu có cấu trúc (dữ
li
ệu kiểu mảng, kiểu xâu, kiểu tệp, kiểu bản ghi,...).
- H
ọc sinh phải nắm r
õ các ph
ương pháp nhập dữ liệu v
ào (t
ừ tệp văn bản) và phương
pháp xu
ất kết quả ra
(in vào t
ệp văn bản).
<b>I. CÁC THÀNH PH</b>
<b>ẦN CƠ BẢN CỦA FREE PASCAL:</b>
<b>1. B</b>
<b>ộ ký tự:</b>
- B
ộ 26 chữ Latin
:
A - Z a - z
- B
ộ số thập phân
:
0 - 9
- B
ộ số thập lục phân
:
0 - 9 A - F a - f
- Ký t
ự gạch nối dưới
:
_
- Ký hi
ệu toán tử, toán học
:
+ - * / = < > [ ] . , ( ) : ^ @ { } $ #
và theo sau là
<= >= := += -= *= /= (* *) (. .) //
<b>2. Chú thích: </b>
(*Chú thích kho
ảng*)
{Chú thích kho
ảng}
//Chú thích dịng
<b>3. T</b>
<b>ừ khóa:</b>
absolute
and
array
asm
begin
case
const
constructor
destructor
div
do
downto
dispose
else
end
exit
file
for
function
false
goto
if
implementation
in
inherited
inline
interface
label
mod
nil
not
new
object
of
on
operator
or
packed
procedure
program
record
reintroduce
repeat
self
set
shl
shr
string
</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>
<b>4. Tên chu</b>
<b>ẩn:</b>
Integer
Shortint
SmallInt
Longint
Longword
Int64
Byte
Word
Cardinal
QWord
Boolean
ByteBool
WordBool
LongBool
Char
False
True
Maxint
Abs
Arctan
Chr
Cos
Sin
Eof
Eoln
Exp
Ln
Odd
Ord
Round
Trunc
Spr
Pred
Succ
Dispose
New
Get
Put
Read
readln
Write
Writeln
Reset
Rewrite
<b>5. Danh hi</b>
<b>ệu (identifier) tự đặt:</b>
Dùng danh hi
ệu để đặt t
ên cho bi
ến, kiểu, hằng, chương tr
ình con (hàm - Function, th
ủ tục
-
Procedure). Cách đặt như sau
:
- B
ắt đầu bằng chữ cái, sau đó có thể l
à ch
ữ cái, chữ số hay l
à d
ấu nối,
không được có
kho
ảng trắng và độ d
ài t
ối đa cho phép l
à 127.
Ví d
ụ:
x; S1; Delta; PT_bac_2
- Danh hi
ệu khơng phân biệt chữ hoa, chữ thường
Ví d
ụ:
aZ, az, Az, AZ
là m
ột
- Danh hi
ệu nên đặt sao cho chúng nói l
ên các ý ngh
ĩa của đối tượng m
à chúng ta bi
ểu thị.
Điều n
ày s
ẽ giúp chúng ta dễ gọi khi viết chương tr
ình.
<b>6. Các phím ch</b>
<b>ức năng cần biết:</b>
- F2
: Lưu chương tr
ình trong khi so
ạn thảo
- F3 : T
ạo một file .pas mới hoặc mở file cũ
- F9 : D
ịch thử chương tr
ình
để kiểm tra lỗi
- Ctrl + F9: Ch
ạy chương tr
ình (biên d
ịch file .exe)
- Alt + F5 : Xem k
ết quả chạy chương tr
ình
- Alt + X : Thoát kh
ỏi FreePascal
<b>I. C</b>
<b>ẤU TRÚC CỦA MỘT CHƯƠNG TR</b>
<b>ÌNH FREE PASCAL: </b>
Program Tên_chương_tr
ình;
Tên chương tr
ình
Uses…;
Khai báo thư viện
Label…;
Khai báo nhãn
Const…;
Khai báo h
ằng
</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>
Var…;
Khai báo bi
ến
Procedure…;
Th
ủ tục
Function…;
Hàm
BEGIN
B
ắt đầu chương
trình chính
…
Th
ực hiện các lệnh chương tr
ình chính
END.
K
ết thúc chương
trình chính (có “.”)
Ví d
ụ:
PROGRAM Hello;
USES Crt;
VAR Ten: String;
Procedure Nhap;
Begin
Clrscr;
Write(‘Hello! Ban ten gi?…’);
Readln(Ten);
End;
BEGIN
Nhap;
Writeln(‘Chao mung ban: ’, Ten);
Readln;
END.
K
ết quả chương tr
ình khi gõ Ctrl + F9 và Alt + F5
để xem:
Hello! Ban ten gi?...
(ta gõ)
Nguyen Thi An An
(gõ enter)
Chao mung ban: Nguyen Thi An An
<b>* Gi</b>
<b>ải thích:</b>
-
Tên chương tr
ình là Hello.
- S
ử dụng thư viện Crt
-
liên quan đến chế độ text của chương tr
ình.
- Bi
ến Ten có kiểu l
à String (chu
ỗi).
- Th
ủ tục có t
ên Nhap
để thực hiện việc nhập tham số v
ào bi
ến Ten của chương tr
ình.
- Ph
ần chương tr
ình chính t
ừ BEGIN đến END (có dấu chấm “.”) kết thúc chương tr
ình.
- Sau các câu l
ệnh v
à t
ừ End của các chương tr
ình con và
đoạn lệnh phải có dấu chấm phẩy
“;”. Sau Begin khơng có d
ấu, sau End kết thúc chương tr
ình là d
ấu chấm “.”.
<b>III. M</b>
<b>ỘT VÀI CHƯƠNG TR</b>
<b>ÌNH </b>
<b>ĐƠN GIẢN L</b>
<b>ÀM QUEN V</b>
<b>ỚI FREE PASCAL:</b>
</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>
Program GioiThieu;
Begin
Writeln(‘Trung tam Tin hoc va Thong tin KHCN Vinh Long‘);
Write(‘111 - Nguyen Hue - P2 - TP. Vinh Long - Tel: 0703 862339‘);
Readln;
End.
<i>* Gi</i>
<i>ải thích chương tr</i>
<i>ình GioiThieu:</i>
- Program
: tên chương tr
ình
- Begin : t
ừ khóa cho biết bắt đầu chương tr
ình
- Writeln : xu
ất ra m
àn hình dịng ch
ữ đặt trong dấu nháy đơn và chuyển con trỏ xuống
dịng.
- Write : xu
ất
ra màn hình dịng ch
ữ trong dấu nháy đơn nhưng khơng chuyển con trỏ xuống
dịng.
- Readln : d
ừng m
àn hình xem k
ết quả
- End : cho bi
ết kết thúc chương tr
ình.
<b></b>
<b> Ví d</b>
<b>ụ 2:</b>
Program DonXinPhep;
Uses CRT;
Begin
ClrScr;
Writeln(‘**********************************’);
Writeln(‘Cong hoa Xa hoi Chu nghia Viet Nam‘);
Writeln(‘ Doc Lap - Tu Do - Hanh Phuc ‘);
Writeln(‘ * DON XIN PHEP NGHI HOC * ‘);
Writeln(‘**********************************’);
Writeln(‘...‘);
Readln;
End.
<i>* Gi</i>
<i>ải thích chương tr</i>
<i>ình GioiThieu:</i>
- Program
: tên chương tr
ình
- Uses Crt
: dùng thư viện Crt (có lệnh
ClrScr;
)
- Begin : t
ừ khóa cho biết bắt đầu chương tr
ình
- ClrScr : l
ệnh xóa sạch m
àn hình.
- Writeln: xu
ất ra m
àn hình dịng ch
ữ đặt trong dấu nháy đơn và chuyển con trỏ xuống d
òng.
- Write: xu
ất
ra màn hình dịng ch
ữ trong dấu nháy đơn nhưng khơng xuống d
ịng.
</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>
- End: cho bi
ết kết thúc chương tr
ình.
<b>IV. M</b>
<b>ỘT V</b>
<b>ÀI KI</b>
<b>ỂU DỮ LIỆU CƠ BẢN CỦA FREE PASCAL:</b>
D
ữ liệu (data) l
à t
ất cả những g
ì mà máy tính x
ử lý.
<b>Chương tr</b>
<b>ình = thu</b>
<b>ật toán + cấu trúc dữ liệu</b>
Ki
ểu dữ liệu gồm các loại sau:
- Ki
ểu đơn giản: số nguy
ên (integer), s
ố thực (real), logic (boolean), ký tự (char).
- Ki
ểu có cấu trúc (structure type): mảng (array), chuỗi (string), bản ghi (record), tập hợp
(set), t
ập tin (f
ile).
- Ki
ểu con trỏ (pointer).
<b>1. Ki</b>
<b>ểu số nguy</b>
<b>ên (Integer Type):</b>
<i><b>* T</b></i>
<i><b>ừ khóa:</b></i>
Free Pascal đ
ã kh
ắc phục được những b
ài tốn s
ố lớn trong Turbo Pascal 7.0:
T
ừ khóa
Ph
ạm vi
byte
Byte
Shortint
Smallint
Word
Integer
Cardinal
Longint
Longword
Int64
QWord
0 .. 255
-128 .. 127
-32768 .. 32767
0 .. 65535
smallint - longint
longword
-2147483648 .. 2147483647
0 .. 4294967295
-9223372036854775808 .. 9223372036854775807
0 .. 18446744073709551615
1
1
2
2
2-4
4
4
4
8
8
<i><b>* Các phép toán s</b></i>
<i><b>ử dụng:</b></i>
Ký hi
ệu
Ý ngh
ĩa
+
C
ộng
-
Tr
ừ
*
Nhân
/
Chia cho k
ết quả l
à s
ố thực
div
Chia l
ấy phần nguy
ên
mod
Chia l
ấy phần dư
succ(n)
n + 1
(tăng
n
lên 1 đơn vị)
pred(n)
n - 1
(gi
ảm
n
1 đơn vị)
</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>
<i><b>* T</b></i>
<i><b>ừ khóa:</b></i>
s
ố thực có thể
vi
ết theo kiểu có dấu chấm thập phân b
ình th
ường hoặc viết theo
ki
ểu thập phân có phần mũ v
à ph
ần định trị.
T
ừ khóa
Ph
ạm vi
byte
Real
Single
Double
Extended
Comp
Currency
platform dependant
1.5E-45 .. 3.4E38
5.0E-324 .. 1.7E308
1.9E-4932 .. 1.1E4932
-2E64+1 .. 2E63-1
-922337203685477.5808 .. 922337203685477.5807
4-8
4
8
10
8
8
<b>* Các phép toán s</b>
<b>ử dụng:</b>
Ký hi
ệu
Ý ngh
ĩa
+
C
ộng
-
Tr
ừ
*
Nhân
/
Chia cho k
ết quả l
à s
ố thực
Abs(x)
L
ấy trị tuyệt đối của số x
Sqr(x)
L
ấy b
ình ph
ương của số x
Sqrt(x)
L
ấy căn
b
ậc hai của số x
Sin(x)
L
ấy sin của số x
Cos(x)
L
ấy cosin của số x
Arctan(x)
L
ấy arctang của số x
Ln(x)
L
ấy logarit nepe của số x (e=2.71828)
Exp(x)
L
ấy logarit nepe cơ số e của số x (ex)
Trunc(x)
L
ấy phần nguy
ên l
ớn nhất < x
Round(x)
Làm tròn x, l
ấ
y s
ố nguy
ên g
ần x nhất
<b>3. Ki</b>
<b>ểu logic</b>
<b> (Boolean): </b>
<i><b>* Các phép toán:</b></i>
th
ể hiện qua 2 giá trị TRUE (đúng) và FALSE (sai). Qui ước TRUE >
FALSE.
A
B
Not A
A and B A or B
A xor B
True
True
False
True
True
False
True
False
False
False
True
True
False
True
True
False
True
True
False False
True
False
False False
</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>
- Phép OR : Cho k
ết quả FALSE khi A=B=FALSE
- Phép XOR: Cho k
ết quả TRUE khi A khác B.
<i><b>* Các phép so sánh: </b></i>
Ký hi
ệu
Ý ngh
ĩa
=
B
ằng nhau
>
L
ớn hơn
<
Nh
ỏ hơn
>=
L
ớn hơn hoặc bằng
<=
Nh
ỏ hơn hoặc bằng
<>
Khác nhau
<b>4. Ki</b>
<b>ểu ký tự</b>
<b> (Char type) : </b>
<i><b>* T</b></i>
<i><b>ừ khóa:</b></i>
t
ất cả các dữ liệu viết ở dạng chữ ký tự đều được khai báo bởi từ khóa CHAR.
<i><b>* Các hàm chu</b></i>
<i><b>ẩn:</b></i>
Ký hi
ệu
Ý ngh
ĩa
Ord(c)
Cho th
ứ tự của c trong bảng m
ã ASCII
Chr(n) hay #n
Cho ký t
ự có số thứ tự l
à n trong b
ảng m
ã ASCII
Pred(c)
Cho ký t
ự đứng trước ký tự c
Succ(c)
Cho ký t
ự đứng sau ký tự c
….. VÀ NHI
ỀU KIỂU DỮ LIỆU KHÁC
<b>V. CÁC HÀM THÔNG D</b>
<b>ỤNG TRONG PASCAL</b>
<b>HÀM </b>
<b>CHỨC NĂNG </b>
<b>HÀM THÔNG DỤNG </b>
ORD(kytu)
Tr
ả về số thứ tự của kytu trong bảng m
ã ASCII.
CHR(so)
Tr
ả về kí tự ở vị trí so (có thể viết tắt l
à #so).
PRED(kytu)
Tr
ả về kí tự nằm trước kí tự kytu trong bảng m
ã ASCII.
SUCC(kytu)
Tr
ả về kí tự nằm sau kí tự kytu trong bảng m
ã ASCII.
ASB(x)
Giá tr
ị tuyệt đối của x.
SQR(x)
x bình ph
ương.
SQRT(x)
<sub>căn bậc 2 của x.</sub>
ROUND(x)
làm tròn ph
ần lẻ thập phân của x, số nguy
ên g
ần với x
nh
ất.
TRUNC(x)
L
ấy phần nguy
ên c
ủa x.
INC(x)
<sub>Tăng biến nguyên X lên 1 đơn vị.</sub>
</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>
<b>HÀM </b>
<b>CHỨC NĂNG </b>
nguyên. Delay thường dùng để l
àm ch
ậm chương tr
ình
l
ại cho ta xem v
à kh
ảo sát.
Sound(F)
T
ạo ra dao động âm thanh với tần số F; số nguy
ên, cho
đến khi ta gọi Nosound
InsLine
chèn m
ột d
ịng tr
ống v
ào màn hình
ở vị trí con trỏ.
DelLine
Xóa tồn b
ộ d
ịng màn hình ch
ứa con trỏ sau đó dồn các
dịng
ở dưới l
ên.
Exit
<sub>Thốt vơ điều kiện ra khỏi chương tr</sub>
ình.
Halt
D
ừng hẳn chương tr
ình
Break
Thốt kh
ỏi v
ịng l
ặp chứa lệnh Break.
KeyPressed
cho giá tr
ị True khi ta nhấn phím nào đó trên bàn phím,
và kí t
ự đó c
ịn ch
ờ trong bộ nhớ đệm của b
àn phím,
chưa được đưa ra xử lí.
Int(X)
L
ấy phần nguy
ên c
ủa số thực X.
Frac(x)
Cho giá tr
ị phần thập phân của số thực X.
Randomize
Kh
ởi động chế độ phát sinh số ngẫu nhi
ên.
Random
Cho giá tr
ị số thực Random. Random l
à m
ột số
ng
ẫu
nhiên n
ằm trong khoảng 0 v
à 1 (0 <= Random < 1)
Random(Number)
cho giá tr
ị số nguy
ên Random, Random là m
ột số ngẫu
nhiên n
ằm trong khoảng 0 v
à Number (0 <= Random <
Number. Number ph
ải l
à m
ột số nguy
ên)
Upcase(ch)
<sub>Đổi ký tự ch th</sub>
ành ch
ữ hoa.
SizeOf(x)
Cho bi
ết kích thước của biến hoặc kiểu có t
ên là X (tính
theo đơn vị Byte).
Str(x,S)
Ð
ổi giá trị kiểu số X sang dạng chuỗi S.
Val(S,x,code)
<sub>Đổi chuỗi S thành sô x.Nêu đổi chuỗi th</sub>
ành công biên
Code nh
ận giá trị 0. Nêu không đổi đc,code l
à sơ ngun
cho biêt vtrí gây l
ỗi.
INC(x,r)
<sub>Tăng giá trị của x nên r đơn vị. Tương đương với x=x+r; </sub>
Th
ủ tục INC(x) tăng x 1 đơn vị
DEC(x,r)
Gi
ảm giá trị của x xuống r đơn vị. Tương đương với
x=x-
r. DEC(x) xem như 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)
Xố L ký t
ự từ
v
ị trí P ra khỏi
Break
<sub>k</sub>
<sub>ết thúc v</sub>
<sub>òng l</sub>
<sub>ặp</sub>
</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>
<b>HÀM </b>
<b>CHỨC NĂNG </b>
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.
FillChar(a,SizeOf(a),0)
Gán giá tr
ị cho to
àn b
ộ các phần tử của mảng a = 0
<b>TH</b>
<b>Ủ TỤC TRONG</b>
<b> Unit Crt</b>
Clrscr
xóa tồn b
ộ m
àn hình và
đưa con trỏ về góc trái tr
ên.
ClrEol
Xóa các ký t
ự nằm b
ên ph
ải con trỏ.
Gotoxy(x,y)
<sub>đặt con trỏ tới tọa độ x, y của m</sub>
àn hình (x t
ọa độ cột từ 1
– 80, y t
ọa độ hang từ 1
– 25).
TextColor(Color)
<sub>Định màu cho văn bản (với Color có giá trị từ 0 </sub>
– 15).
TextBackGround(color)
<sub>Đặt m</sub>
àu n
ền của văn bản.
NormVideo
<sub>Định độ sang b</sub>
ình th
ường.
LowVideo
<sub>Định độ sáng yếu đi.</sub>
WhereX
T
ọa độ cột con trỏ m
àn hình hi
ện h
ành.
WhereY
T
ọa độ h
àng con tr
ỏ m
àn hình hi
ện h
ành.
Readkey
<sub>Đọc một kí tự từ b</sub>
àn phím vào bi
ến.
<b>X</b>
<b>Ử LÝ FILE</b>
<b> (v</b>
<b>ới F1 l</b>
<b>à bi</b>
<b>ến kiểu file)</b>
Assign(F1,<Tên t
ậ
p
tin>)
Gán tên file vào bi
ến.
Rewrite(F1)
M
ở File mới để ghi v
ào.
Reset(F1)
M
ở File đ
ã có
để đọc.
Append(F1)
M
ở File đ
ã có
để ghi nối v
ào cu
ối (chỉ dùng cho File văn
b
ản).
Read(F1, <DS bi
ến>)
Đọc dữ liệu từ File v
ào bi
ến.
Readln(F1, <DS sách
bi
ế
n>)
Đọc dữ liệu từ File v
ào bi
ến, con trỏ tự động xuống
dòng.
Write(F1, <DS bi
ến>)
Ghi d
ữ liệu từ biến v
ào File, xong có them d
ấu hết v
ào
dịng File.
Close(F1)
Đóng File.
Flush(F1)
C
ập nhật l
ên File.
EOF(F1)
có giá tr
ị True khi con trỏ ở cuối File.
EOln(F1)
có giá tr
ị True khi con trỏ ở sau ký tự cuối c
ùng c
ủa một
dòng (File v
ăn bản).
</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>
<b>HÀM </b>
<b>CHỨC NĂNG </b>
SeekEOLn(F1)
Ki
ểm tra EOLn, có bỏ qua các dấu cách Space v
à Tab
(Fil
e văn bản).
FileSize(F1)
cho bi
ết số record trong tập tin kiểu Record.
FilePos(F1)
Cho bi
ết vị trí hiện h
ành c
ủa con trỏ file đang ở Record
nào (tính t
ừ 0, nghĩa l
à n
ếu con trỏ File đang ở Record
đầu ti
ên, FilePos(F1) s
ẽ trả về giá trị 0).
Seek(F1, n)
Đưa con trỏ file đến cuối Record thứ n.
Erase(F1)
<sub>Xố file, khơng được xố một file đang mở.</sub>
Rename(F1, tên m
ới)
Đổi t
ên file F1 thành tên m
ới, không được đổi t
ên file
đang mở.
<b>CÁC HÀM XU</b>
<b>ẤT V</b>
<b>À NH</b>
<b>ẬP</b>
write()
in ra màn hình li
ền sau kí tự cuối.
writeln()
in xu
ống một h
àng.
read()
đọc biến.
readln(' ')
<sub>đọc biến v</sub>
à xu
ống d
òng
<b>VI. PH</b>
<b>ẦN B</b>
<b>ÀI T</b>
<b>ẬP THAM KHẢO</b>
<b>C</b>
<b>ấu trúc chương tr</b>
<b>ình dùng file v</b>
<b>ăn bản cho nhập v</b>
<b>à xu</b>
<b>ất dữ liệu:</b>
PROGRAM
Tên_chương_tr
ình;
Tên chương tr
ình chính
Const Fi=’Tên_File_D
ữ_Liệu_V
ào.inp’;
Khai báo h
ằng
Fi=’Tên_File_D
ữ_Liệu_Ra.out’;
Type…;
Khai báo ki
ểu (nếu có)
Var F:text;
Khai báo bi
ến to
àn c
ục
Procedure Tên_Th
ủ_Tục(Biến);
Th
ủ tục
Var …;
Begin
End;
Function Tên_Hàm(Bi
ến): Kiểu_Dữ_Liệu;
Hàm
Var …;
Begin
End;
BEGIN
B
ắt đầu chương tr
ình chính
G
ọi_H
àm;
G
ọi_Thủ_Tục;
…
Các l
ệnh chương tr
ình chính
END.
K
ết thúc chương tr
ình chính
<b>Th</b>
<b>ủ tục đọc dữ liệu </b>
<b>t</b>
<b>ừ File văn bản:</b>
<i><b>N</b></i>
<i><b>ếu file chỉ có số N. </b></i>
Procedure Nhap;
Var …;
Begin
<i><b>N</b></i>
<i><b>ếu file có N d</b></i>
<i><b>ịng trên N ph</b></i>
<i><b>ần tử thuộc </b></i>
<i><b>m</b></i>
<i><b>ảng số A nào đó.</b></i>
</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>
assign(F,Fi); reset(F);
readln(F,n);
Close(F);
End;
Begin
assign(F,Fi); reset(F);
FillChar(a,SizeOf(a),0);
i:=1;
While not EOF(F) do
begin
readln(F,A[i]);inc(i);
end;
Close(F);
End;
<b>Th</b>
<b>ủ tục ghi dữ liệu ỉa File văn bản:</b>
<i><b>N</b></i>
<i><b>ếu chỉ </b></i>
<i><b>ghi ra s</b></i>
<i><b>ố N. </b></i>
Procedure Xuat;
Begin
assign(F,Fo); rewrite(F);
write(F,n);
Close(F);
End;
<i><b>N</b></i>
<i><b>ếu </b></i>
<i><b>ghi N ph</b></i>
<i><b>ần tử th</b></i>
<i><b>u</b></i>
<i><b>ộc mảng số A nào đó</b></i>
<i><b>ra N dịng c</b></i>
<i><b>ủa file</b></i>
<i><b>. </b></i>
Procedure xuat;
Begin
assign(F,Fo);rewrite(F);
For i:=1 to N do
writeln(F,A[i]);
Close(F);
End;
<b>Bài 1: Tìm m</b>
<b>ối li</b>
<b>ên h</b>
<b>ệ</b>
C
ứ mỗi 02 điểm cho trước sẽ có 02 mối li
ên h
ệ qua lại với nhau. Xem
hình minh h
ọa b
ên, ta th
ấy, với 03 điểm cho trước A, B, C sẽ có 6 mối li
ên
h
ệ qua lại với nhau: AB, BA, AC, CA, BC, CB. H
ãy vi
ết chương tr
ình tìm
t
ất cả các mối li
ên h
ệ qua lại từ N điểm cho trước.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>moilienhe.inp</b>
ch
ứa số tự nhi
ên N (N
41.10
8
)
<b>- D</b>
<b>ữ liệu </b>
<b>ra: </b>
file văn bản
<b>moilienhe.out</b>
ch
ứa kết quả l
à t
ổng số tất cả
các m
ối li
ên h
ệ qua lại.
Xem ví d
ụ bên dưới:
moilienhe.inp moilienhe.out
3
6
<b>ĐÁP ÁN, </b>
<b>CH</b>
<b>ẤM</b>
<b>Test </b> <b>moilienhe.inp </b> <b>moilienhe.out </b> <b>Điểm </b>
1 3 6 1
2 999 997002 1
3 9999999 99999970000002 1
4 1000000000 999999999000000000 1
5 4100000000 16809999995900000000 1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program MoiLienHe;
Var n: Qword;
fi,fo:text;
BEGIN
assign(fi,'moilienhe.inp'); reset(fi);
readln(fi,n);
assign(fo,'moilienhe.out');
rewrite(fo); Writeln(fo,n*(n-1));
close(fi);close(fo);
END.
A
B
</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>
<b>Bài 2: Tìm m</b>
<b>ố</b>
<b>i liên h</b>
<b>ệ</b>
C
ứ mỗi 02 điểm A, B cho trước sẽ có 01 mối li
ên h
ệ với nhau AB
ho
ặc BA. Xem h
ình bên ta th
ấy, với 3 điểm A, B, C cho trước sẽ có 3
m
ối li
ên h
ệ với nhau: AB, BC, CA. H
ãy vi
ết chương tr
ình tìm t
ất cả c
ác
m
ối li
ên h
ệ thoả điều kiện tr
ên t
ừ N điểm cho trước.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>moilienhe.inp</b>
ch
ứa số nguyên dương N
(N
60.10
8
).
<b>- D</b>
<b>ữ liệu ra: </b>
file văn bản
<b>moilienhe.out</b>
ch
ứa kết quả. Xem v
í d
ụ bên dưới:
moilienhe.inp moilienhe.out
3
3
<b>ĐÁP ÁN, CHẤM</b>
<b>Test moilienhe.inp </b> <b>moilienhe.out </b> <b>Điểm </b>
1 2 1 0,5
2 3 3 0,5
3 110 5995 0,5
4 1000000 499999500000 0,5
5 123456789 7620789313366866 0,5
6 6000000000 17999999997000000000 0,5
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program TimMoiLienHe;
Var n: Qword;
F:text;
BEGIN
assign(F,'moilienhe.inp'); reset(F);
readln(F,n);
close(F);
assign(F,'moilienhe.out'); rewrite(F);
if n mod 2=0 then
Writeln(F,(n div 2)*(n-1))
else
Writeln(F,((n-1) div 2)*n);
close(F);
END.
<b>Bài 3: In dãy s</b>
<b>ố xuất hiện từ k lần trở l</b>
<b>ên </b>
Cho dãy A có N (N
100) s
ố tự nhi
ên (A[i]
100 (1
i
N), m
ỗi số cách nhau đúng 01 dấu
cách) và s
ố tự nhi
ên K (K
N
100). Hãy vi
ết chương tr
ình ghi ra các ph
ần tử trong d
ãy A có
s
ố lần xuất hiện từ K lần trở l
ên theo th
ứ tự tăng dần, nếu khơng có th
ì ghi ch
ữ ‘N
O’.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào: </b>
t
ừ file văn bản
<b>indayso.inp</b>
g
ồm 2 d
òng: dòng 1 ghi 2 s
ố N v
à K cách
nhau b
ởi 01 dấu cách; d
òng 2 là dãy A (các s
ố cách nhau đúng 01 dấu cách).
<b>- D</b>
<b>ữ liệu ra: </b>
file văn bản
<b>indayso.out</b>
ch
ỉ một d
òng duy nh
ất chứa kết quả (mỗi số cách
nhau đú
ng 01 d
ấu cách). Xem ví dụ bên dưới:
indayso.inp
indayso.out
10 2
1 2 1 1 5 5 20 20 5 5
1 5 20
5 2
0 1 2 3 4
NO
<b>ĐÁP ÁN, CHẤM</b>
<b>Test indayso.inp </b> <b>indayso.out </b> <b>Điểm </b>
1 5 5
5 5 5 5 5
5 1
2 10 1
0 1 2 3 2 3 4 5 4 5
0 1 2 3 4 5 1
A
B
</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>
3 10 6
5 5 5 5 5 10 10 10 10 10
NO 1
4 13 3
12 15 15 15 20 20 17 19 17 17 20 19 19
15 17 19 20 1
5 20 4
1 1 2 5 50 5 2 2 5 1 1 100 100 100 100 1 1 1 5 1
1 5 100 1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program InDaySoKLan;
var a,b:array[0..100] of integer;
n,j,i,k:integer;
f:text;
Procedure Nhap;
begin
assign(f,'InDaySo.inp');
reset(f);
i:=0;
FillChar(a,SizeOf(a),0);
read(f,n);
readln(f,k);
While not eof(f) do
begin
read(f,a[i]);
inc(i);
end;
close(f);
end;
Procedure xuly;
begin
assign(f,'InDaySo.out');
rewrite(f);
FillChar(b,SizeOf(b),0);
j:=0;
For i:=0 to n do inc(b[a[i]]);
For i:=0 to 100 do
if ((b[i]<>0) and (b[i]>=k))
then begin
write(f,i,' ');inc(j); end;
if j=0 then write(f,'NO');
close(f);
end;
BEGIN
Nhap;
xuly;
END.
<b>Bài 4</b>
<b>: Đổi số hệ nhị phân sang hệ thập phân </b>
S
ố nhị phân l
à s
ố chỉ sử dụng số 0 v
à 1. Hãy vi
ết chương tr
ình
đổi chuỗi nhị phân S cho
trước th
ành s
ố thập phân.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>2to10.inp</b>
ch
ứa chuổi nhị phân S (d
ài không quá 63 ký t
ự).
<b>- D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>2to10.out</b>
ch
ứa kết quả l
à s
ố thập phân vừa đổi từ chuổi S. Xem
ví d
ụ:
2to10.inp
2to10.out
011
3
<b>ĐÁP ÁN</b>
<b>, CH</b>
<b>ẤM</b>
<b>Test 2to10.inp </b> <b>2to10.out </b> <b>Điểm </b>
1 0011 3 1
2 111110000011111 31775 1
3 1001010100000010111110001111111111 9999999999 1
4 10...60 số 0...1 4611686018427387905 1
5 11...60 số 1...1 9223372036854775807 1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program Doi2_10;
const So:array['0'..'1'] of byte=(0,1);
var St:string;h,N:Qword;F:text;
procedure D2_10 (S: string);
var i:integer;
begin
h:=1; N:=0;i:=length(S);
while i>0 do begin
N:=N+So[S[i]]*h; h:=2*h; dec(i);
end; end;
BEGIN
assign(F,'2to10.inp'); reset(F);
read(F,St); close(F);
D2_10(St);
assign(F,'2to10.out'); rewrite(F);
write(F,N); close(F);
</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>
<b>Bài 5: Tìm </b>
<b>ẩn</b>
V
ới một d
ãy s
ố tự nhi
ên: a[1]=a[2]=a[3]=1 và a[n]=a[n-1]+a[n-3].
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>timan.inp</b>
ch
ứa số nguyên dương n (n < 119).
<b>- D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>timan.out</b>
ch
ứa kết quả l
à giá tr
ị a[n] cần t
ìm (khơng ch
ứa số 0
ở đầu). Xem ví dụ bên dưới:
timan.inp
timan.out
4
2
<b>ĐÁP ÁN</b>
<b>, CH</b>
<b>ẤM </b>
<b>Test timan.inp </b> <b>timan.out </b> <b>Điểm </b>
1 3 1 1
2 10 19 1
3 50 83316385 1
4 101 24382819596721629 1
5 118 16188319274058017956 1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program TimAn;
Uses Crt;
Const Fi='timan.INP';
Fo='timan.OUT';
Var i,n,a,b,c,d: Qword;
F:text;
BEGIN
assign(F, Fi); reset(F); Readln(F,n);
Close(F);
If n<=3 then a:=1 else Begin
i:=4;b:=1;c:=1;d:=1;
while i<=n do
begin
a:=b+d;d:=c;c:=b;b:=a;inc(i);
end;
End;
assign(F, Fo); rewrite(F);
write(F,a); Close(F);
END.
<b>Bài 6: Hai s</b>
<b>ố l</b>
<b>à b</b>
<b>ạn </b>
Hai s
ố được coi l
à b
ạn của nhau khi tổng các ước số của số n
ày b
ằng số kia và ngược lại,
c
ụ thể: tổng ước số của M = N v
à t
ổng ước số của N = M th
ì M và N là b
ạn.
Hãy vi
ết chương tr
ình nh
ập một số nguyên dương K (K
20.000) và li
ệt k
ê t
ất
c
ả các cặp
s
ố M, N l
à b
ạn của nhau (1
M, N
K; M < N và c
ặp M, N l
à duy nh
ất, khơng tính cặp
hốn v
ị). Nếu khơng có cặp M, N n
ào thì
điền số 0.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>solaban.inp</b>
ch
ứa số nguyên dương K.
<b>- D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>solaban.out</b>
ch
ứa
i dòng, m
ỗi d
òng là m
ột cặp số M, N thoả
điều kiện nêu trên (M và N cách nhau đúng 01 khoảng cách). Xem ví dụ:
solaban.inp
solaban.out
300
220 284
10
0
<b>ĐÁP ÁN, </b>
<b>CH</b>
<b>ẤM </b>
<b>Test </b> <b>solaban.inp </b> <b>solaban.out </b> <b>Điểm </b>
1 200 0 1
2 500 220 284 1
3 3000
220 284
1184 1210
2620 2924
1
4 6300
220 284
1184 1210
2620 2924
</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>
5020 5564
5 18000
220 284
1184 1210
2620 2924
5020 5564
6232 6368
10744 10856
12285 14595
1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
PROGRAM SoLaBan;
Const Fi='solaban.INP';
Fo='solaban.OUT';
VAR n:QWord;
kq:array[1..100] of QWord;
F:text;
Function TongUoc(k:QWord):QWord;
Var i,tong:QWord;
Begin
tong:=0;
i:=1;
while i<= (k div 2) do begin if (k
mod i) =0 then tong:=tong+i; inc(i);
end;
TongUoc:=tong;
End;
Function KiemTraKQ(a:QWord):boolean;
var i:integer;
Begin
KiemTraKQ:=false;
i:=1;
while ((KiemTraKQ=false) and (i<=100))
do
begin
KiemTraKQ:=(kq[i]=a);
inc(i);
end;
End;
Procedure GanKQ;
Var m:QWord;
j:integer;
Begin
FillChar(kq,SizeOf(kq),0);
m:=1;
j:=1;
while m<=n do
begin
if ((TongUoc(TongUoc(m))= m) and
(TongUoc(m)<>m) and TongUoc(m)<=n and
(not KiemTraKQ(m))) then
begin
kq[j]:=TongUoc(m);
kq[j+1]:=m;
j:=j+2;
writeln(F,m,' ',TongUoc(m));
end;
inc(m);
end;
if j=1 then writeln(F,'0')
End;
BEGIN
assign(F, Fi); reset(F); Readln(F,n);
Close(F);
assign(F, Fo); rewrite(F);
GanKQ; Close(F);
END.
<b>Bài 6: Chu</b>
<b>ỗi Fibo nhị phân</b>
Xét dãy các xâu F
1
, F
2
, F
3
, ..., F
N
, ... trong đó: F
1
= ‘0’, F
2
= ‘1’, F
3
= ‘01’, F
4
= ‘100’, F
5
= ‘01110’, F
K+1
=
F
K
+
F
K-1
(
là ph
ủ định v
à 2
K
13) được xếp li
ên t
ục nhau.
Cho xâu S độ d
ài không quá 255, ch
ỉ bao gồm các ký tự ‘0’ v
à ‘1’. Hãy xác
định số lần
xu
ất hiện xâu S trong xâu F
K
. (Chú ý: hai l
ần xuất hiện của S trong F
K
không nh
ất thiết phải
là các xâu r
ời nhau ho
àn toàn).
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>fibo01.inp</b>
bao g
ồm i d
ịng, m
ỗi d
ịng có d
ạng K S (K v
à S
cách nhau đún
g 01 kho
ảng cách).
<b>- D</b>
<b>ữ liệu ra: </b>
file văn bản
<b>fibo01.out</b>
, bao g
ồm i d
òng, m
ỗi d
òng là k
ết quả ứng với một
dòng t
ừ dữ liệu v
ào. Xem ví d
ụ:
fibo01.inp
fibo01.out
3 1
3 10
8 011
1
0
3
<b>ĐÁP ÁN, </b>
<b>CH</b>
<b>ẤM</b>
<b>Test </b> <b>fibo01.inp </b> <b>fibo01.out </b> <b>Điểm </b>
1 3 1
3 10
1
</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>
8 011 3
2
8 111
9 0110
7 10001
2
2
1
1
3
10 00
11 11000
12 101010
13
2
0
1
4 13 10 64 1
5 12 1011011
13 10110100000
5
0 1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program Fibo01;
const
InputFile = 'fibo01.INP';
OutputFile = 'fibo01.OUT';
var
S: array[1..13] of String;
n: Integer;
Source: String;
tmp:char;
fi, fo: Text;
procedure TaoFibo;
var
i,j: Integer;
tam1,tam2:string;
begin
S[1] := '0';
S[2] := '1';
for i := 3 to 13 do
begin
tam1:=S[i-1];
tam2:=S[i-2];
for j:=1 to length(tam1) do if
tam1[j]='0' then tam1[j]:='1' else
tam1[j]:='0';
for j:=1 to length(tam2) do if
tam2[j]='0' then tam2[j]:='1' else
tam2[j]:='0';
S[i] := tam1+tam2;
end;
end;
Function Dem:longint;
Var i:integer;
tam1:string;
Begin
i:=1;
Dem:=0;
while i<=
length(S[n])-length(Source)+1 do
begin
tam1:=Copy(S[n],i,length(Source));
if tam1=Source then inc(Dem);
inc(i);
end;
End;
BEGIN
TaoFibo;
Assign(fi, InputFile); Reset(fi);
Assign(fo, OutputFile); Rewrite(fo);
while not SeekEof(fi) do
begin
Readln(fi, n, tmp, Source);
Writeln(fo, Dem);
end;
Close(fi);
Close(fo);
END.
<b>Bài 7: Phân tích s</b>
<b>ố ho</b>
<b>àn h</b>
<b>ảo </b>
S
ố ho
àn h
ảo l
à s
ố có tổng các ước của nó (trừ nó) bằng chính nó (ví dụ: 6 = 1 + 2 + 3).
Hãy vi
ết chương tr
ình
để phân tích số ho
àn h
ảo:
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>sohoanhao.inp</b>
ch
ứa số nguyên dương N (N
10.10
7
).
<b>- D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>sohoanhao.out</b>
k
ết quả phân tích số ho
àn h
ảo (mỗi số cách
nhau đúng 01 khoảng cách). Nếu khơng thể phân tích được th
ì ghi s
ố 0. Xem ví dụ dưới:
sohoanhao.inp sohoanhao.out
6
1 2 3
7
0
<b>ĐÁP ÁN</b>
<b>, CH</b>
<b>ẤM</b>
<b>Test sohoanhao.inp </b> <b>sohoanhao.out </b> <b>Điểm </b>
1 28 1 2 4 7 14 1
2 29 0 1
</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>
4 8128 1 2 4 8 16 32 64 127 254 508 1016 2032 4064 1
5 100000000 0 1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
PROGRAM SoHoanHao;
Const Fi='sohoanhao.INP';
Fo='sohoanhao.OUT';
var n:QWord;
ch:char;
F:text;
Function hoanhao(m:Qword):string;
Var i,S:Qword;
st:string;
begin
hoanhao:='';
S:=0;
i:=1;
while i<=(m div 2) do
begin
if (m mod i)=0 then
begin
S:=S+i;
str(i,st);
if hoanhao='' then
hoanhao:=st else hoanhao:=hoanhaớ
'+st;
end;
inc(i);
end;
if S<>m then hoanhao:='0';
end;
BEGIN
assign(F, Fi); reset(F); readln(F,n);
Close(F);
assign(F, Fo); rewrite(F);
write(F,hoanhao(n)); Close(F);
END.
<b>Bài 8: Đảo ký tự </b>
Đảo ký tự là đưa ra tất cả các cách thay đổi vị trí của các ký tự đó trong một chuỗi ký tự
cho trước để tạo th
ành các chu
ỗi ký tự khác nhau (Ví dụ: cho chuỗi ký tự
<b> “abc”</b>
thì k
ết quả
đảo ký tự sẽ l
à các chu
ỗi
<b>“abc”, “acb”, “bac”, “bca”, “cab”, “cba”</b>
)
Yêu c
ầu
: vi
ết chương tr
ình th
ực hiện đảo ký tự như cách trên.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
t
ệp văn bản
<b>daokytu.inp</b>
g
ồm:
+ Dòng
đầu ti
ên: ch
ứa số nguyên dương N;
+ N dòng ti
ếp theo: d
òng th
ứ i (1 ≤ i ≤ N) chứa chuỗi S[i] (S[i] ≤ 9 ký tự);
<b>- D</b>
<b>ữ </b>
<b>li</b>
<b>ệu ra:</b>
t
ệp văn bản
<b>daokytu.out</b>
g
ồm tất cả các cách thay đổi vị trí của các ký tự trong
chu
ỗi S[i], mỗi cách nằm tr
ên m
ột d
ịng.
Ví d
ụ:
daokytu.inp daokytu.out
2
ab
cde
ab
ba
cde
ced
dce
dec
ecd
edc
<b>ĐÁP ÁN, CHẤM</b>
<b>Test daokytu.inp </b> <b>daokytu.out </b> <b>Điểm </b>
1 1
Le
Le
eL
1
2 2
Le
Ket
Le
eL
Ket
Kte
</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>
<b>Test daokytu.inp </b> <b>daokytu.out </b> <b>Điểm </b>
eKt
etK
tKe
teK
3 3
Ket
Nap
Dang
Ket
Kte
eKt
etK
tKe
teK
Nap
Npa
aNp
apN
pNa
paN
Dang
.... (22 từ)
gnaD
1
4 5
a
ab
c
d
abc
a
ab
ba
c
d
abc
acb
bac
bca
cab
cba
1
5 1
012
012
021
102
120
201
210
1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program DaoKyTu;
var x: array[1..255] of char;
c: array[1..255] of boolean;
n,l,k,m: integer;
fi,fo:text; chuoi:string;
procedure InKQ;
var i: integer;
begin
for i:=1 to l do write(fo,x[i]);
writeln(fo);
end;
procedure GhiChuoi(i:integer);
var j:integer;
begin
for j:=1 to l do if c[j] then
begin
x[i]:=chuoi[j];
if i=l then InKQ
else begin
c[j]:=false; GhiChuoi(i+1);
c[j]:=true; end; end; end;
BEGIN
assign(fi,'daokytu.inp'); reset(fi);
readln(fi,n);
assign(fo,'daokytu.out'); rewrite(fo);
for k:=1 to n do
begin
readln(fi,chuoi);l:=length(chuoi);
fillchar(c,sizeof(c),true);
GhiChuoi(1);
end;
</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>
<b>Bài 9:</b>
<b>Đếm tam giác cân</b>
Cho N (N<=100) điểm trên lưới tọa độ Oxy, tính xem các điểm đó có thể tạo ra tối đa
bao nhiêu tam giác cân?
<b>- D</b>
<b>ữ liệu v</b>
<b>ào :</b>
file văn bản
+ Dòng 1 : ghi s
ố N l
à s
ố điểm trên lưới tọa độ Oxy
+ N dòng ti
ếp: d
òng th
ứ i ghi 2 số x, y (x, y <=10
0) nguyên th
ể hiện tọa độ điểm thứ
i, cách nhau ít nh
ất một dấu cách.
<b>- D</b>
<b>ữ liệu ra</b>
<b> :</b>
file văn bản chứa 1 số duy nhất l
à s
ố tam giác cân tối đa có thể tạo được.
Xem ví d
ụ:
demtgcan.inp demtgcan.out
4
0 0
1 0
2 0
1 1
3
<b>ĐÁP ÁN, </b>
<b>CH</b>
<b>ẤM ĐIỂM</b>
<b>Test demtgcan.inp </b> <b>demtgcan.out </b> <b>Điểm </b>
1 4
0 0
1 0
2 0
1 1
3 3
2 6
0 0
1 1
2 2
-1 0
-2 0
-3 0
0 <sub>1 </sub>
3 6
0 1
-2 0
0 2
-1 0
-2 -2
0 -2
4 <sub>1 </sub>
4 11
0 0
2 0
-1 0
-3 0
7 -2
14 8
0 1
23 23
4 -12
8 1
-4 -10
2 <sub>1 </sub>
5 15
0 0
1 0
2 0
-1 0
-3 0
</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>
<b>Test demtgcan.inp </b> <b>demtgcan.out </b> <b>Điểm </b>
25 11
7 -2
-11 -9
14 8
0 1
23 23
4 -12
-5 -7
8 1
-4 -10
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program DemTGCan;
const inFile='DemTGCan.inp';
outFile='DemTGCan.out';
max=100;
var
x:array[1..max] of real;
y:array[1..max] of real;
n,i,j,k,dem:integer;
d1,d2,d3:real;
f: text;
procedure Nhap;
begin
assign(f,inFile); reset(f);
readln(f,n);
for i:=1 to n do
readln(f,x[i],y[i]);
close(f);
end;
procedure Xuat;
begin
assign(f,outFile); rewrite(f);
write(f,dem);
close(f);
end;
function
KT(x1,y1,x2,y2,x3,y3:real):Boolean;
var a,b,d,da,db:real;
begin
d:=x1-x2;
da:=y1-y2;
db:=x1*y2-x2*y1;
if (((x1=0) or (x2=0) or (x3=0)) and
(y1=y2) and (y2=y3)) or
(((y1=0) or (y2=0) or (y3=0)) and
(x1=x2) and (x2=x3)) or
((x1=y1) and (x2=y2) and (x3=y3))
then KT:=true;
if d<>0 then
begin
a:=da/d;
b:=db/d;
if y3=a*x3+b then KT:=true else
KT:=false;
end;
end;
BEGIN
Nhap;
dem:=0;
for i:=1 to n-2 do
for j:=i+1 to n-1 do
for k:=j+1 to n do
begin
if not
KT(x[i],y[i],x[j],y[j],x[k],y[k]) then
begin
d1:=(x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]);
d2:=(x[k]-x[j])*(x[k]-x[j])+(y[k]-y[j])*(y[k]-y[j]);
d3:=(x[i]-x[k])*(x[i]-x[k])+(y[i]-y[k])*(y[i]-y[k]);
if (d1=d2) or (d2=d3) or (d3=d1)
then inc(dem);
end;
end;
Xuat;
END.
<b>Bài 10: Chu</b>
<b>ỗi Fibonacci</b>
Xét dãy các xâu F
1
, F
2
, F
3
, ..., F
N
, ... trong đó: F
1
= 'A', F
2
= 'B', F
K+1
= F
K
+ F
K-1
(K
2).
<i>Ví d</i>
<i>ụ:</i>
F
1
= 'A'
F
<sub>2</sub>
= 'B'
F
3
= 'BA'
F
4
= 'BAB'
F
5
= 'BABBA'
</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>
F
<sub>7</sub>
= 'BABBABABBABBA'
F
8
= 'BABBABABBABBABABBABAB'
F
<sub>9</sub>
= 'BABBABABBABBABABBABABBABBABABBABBA'
Cho xâu S độ d
ài không quá 255, ch
ỉ bao gồm các ký tự 'A' v
à 'B'. Hãy xác
định số lần
xu
ất hiện xâu S trong xâu F
N
, N
35. Chú ý: hai l
ần xuất hiện của S trong F
N
không nh
ất
thi
ết phải l
à các xâu r
ời nhau ho
àn toàn.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào: </b>
t
ừ file văn bản FIBISTR.INP, bao gồm nhiều d
ịng, m
ỗi d
ịng có d
ạng N
S. Gi
ữa N và S có đúng 1 dấu cách. Dữ liệu v
ào là chu
ẩn, không cần kiểm tra.
<b>- D</b>
<b>ữ liệu ra: </b>
đưa ra file văn bản FIBISTR.OUT, mỗi d
òng d
ữ liệu ứng với một d
ịng k
ết
qu
ả ra. Xem ví dụ:
FIBISTR.INP
FIBISTR.OUT
3 A
3 AB
8 BABBAB
1
0
4
<b>ĐÁP ÁN, </b>
<b>CH</b>
<b>ẤM ĐIỂM</b>
<b>Test fibistr.inp </b> <b>fibistr.out </b> <b>Điểm </b>
1 26 ABBABABBABBABABBA
30 ABBABBABABBABBABABBABABB
11 ABBABABBABBABABBABABBA
34 BABABBABABBABBABABBABBAB
25 BBA
24 ABBA
10945
28656
4
196417
17711
10945
1
2 32 ABBABABBABABBABBABABBA
30 BABBABABBABBABABBABA
27 BBABB
16 ABABBABBABABBABA
30 BABBABABBABABBABBABABB
29 B
27 ABBABBABABB
19 ABABBABBAA
23 ABBABABBABBABABBABABBABBA
13 ABBABABBABBABABBABBABAB
33 ABBABBABABBABABBABBABA
32 ABBABABBABBABABBABABBB
29 ABBABABBABBABABBABBABA
31 BABABBABBABABBA
19 BABBABABBABBABAB
121392
46368
17711
55
46367
317811
17710
0
1596
7
196417
0
17710
121392
376
1
</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>
<b>Test fibistr.inp </b> <b>fibistr.out </b> <b>Điểm </b>
25 BABB
32 BBABABBABABBABBABABBAB
19 ABABBABABBABBABABBABBABAB
14 BBABABBABBABABBABBABABBAA
10 ABBABABBABBABABBABABBABB
12 BABA
17711
121392
143
0
2
21
4 15 BABABBABBABABBABABBABBAB
12 ABBABABBABABBABBABABBABB
27 ABBABABBABBABABBABA
23 BABABBABB
15 BB
25 BBABABBABBABABBABAB
24 B
25 BBABBABAB
16 ABB
21 BABABBABABB
25 BABBABABB
34 BABABBABABBABBABABBAA
22 ABBABBA
18 ABABBABB
22 BBABABBABBABABBABBABABBB
11 BBABBABABBABABBABBABAB
15 ABBABABBABBABA
33 BABBABBABABBABBABABBABABB
28 ABABBABABBABBABABBABBABAB
29 BABBABABBABBABABB
19 BABABBABBABABBABABBAB
25 ABBABBABABBABBABABBABABBA
13 BABBAB
21 ABBABBABABBABB
34 ABABBABBABABBAA
25 A
20 BBABAB
23 BBABBABABBABBABAB
10 BBABABBABABBA
23 BBABBABABBABABBABBABAB
31 BABAB
13 A
33
4
10945
2584
144
4180
28657
6764
232
609
10945
0
1596
232
0
4
54
121392
10945
46367
232
2583
54
377
0
28657
987
986
2
1596
196417
89
1
5 29 B 317811 1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program FibinacciString;
const
InputFile = 'FIBISTR.INP';
OutputFile = 'FIBISTR.OUT';
max = 35;
var
S: array[1..13] of String;
F: array[1..40] of LongInt;
OddCenter, EvenCenter: String;
OddCount, EvenCount, OddP, EvenP:
Integer;
n, l: Integer;
Source: String;
tmp: Char;
fi, fo: Text;
function Count(S: String): Integer;
{How many Source in S}
var
i, c: Integer;
p: ^String;
function Solve: LongInt;
var
i, k, t: Integer;
begin
l := Length(Source);
t := l - 1;
k := 1;
while Length(S[k]) < l do Inc(k);
FillChar(F, k shl 2, 0);
F[k] := Count(S[k]);
F[k + 1] := Count(S[k + 1]);
if n <= k + 1 then
begin
Solve := F[n];
Exit;
end;
OddCount := Count(Copy(OddCenter,
OddP - t, t + t));
EvenCount := Count(Copy(EvenCenter,
EvenP - t, t + t));
</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>
begin
c := 0;
for i := 0 to Length(S) - l do
begin
S[i] := Chr(l);
p := @S[i];
if p^ = Source then Inc(c);
end;
Count := c;
end;
procedure CommonInit;
var
i: Integer;
begin
S[1] := 'A';
S[2] := 'B';
for i := 3 to 13 do
S[i] := S[i - 1] + S[i - 2];
OddCenter := S[12] + S[11];
EvenCenter := S[11] + S[10];
OddP := Length(S[12]) + 1;
EvenP := Length(S[11]) + 1;
end;
if Odd(i) then F[i] := F[i - 1] +
F[i - 2] + OddCount
else F[i] := F[i - 1] + F[i - 2] +
EvenCount;
Solve := F[n];
end;
BEGIN
CommonInit;
Assign(fi, InputFile); Reset(fi);
Assign(fo, OutputFile); Rewrite(fo);
while not SeekEof(fi) do
begin
Readln(fi, n, tmp, Source);
Writeln(fo, Solve);
end;
Close(fi);
Close(fo);
END.
<b>Bài 11: Bài toán kinh doanh </b>
M
ột doanh nhân, sau khi thực hiện mua bán N (N ≤ 100) chuyến h
àng, m
ỗi chuyến h
àng có
t
ổng giá trị mua M v
à t
ổng giá trị bán B (M, B có thể lên đến 20 chữ số
) m
ới tính xem m
ình hu
ề
v
ốn, lời hay lỗ, bao nhi
êu ti
ền. H
ãy vi
ết chương tr
ình
để giúp doanh nhân tr
ên tính tốn k
ết quả
kinh doanh.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào: </b>
file văn bản
<b>kinhdoanh.inp</b>
g
ồm:
+ Dòng
đầu ti
ên ch
ứa số N.
+ N dòng ti
ếp theo, mỗi d
òng ch
ứa hai số M v
à B c
ách nhau đúng 01 khoảng cách.
<b>- D</b>
<b>ữ liệu ra: </b>
file văn bản
<b>kinhdoanh.out</b>
ch
ứa kết quả l
à s
ố tiền huề vốn, lời hoặc lỗ.
Xem ví d
ụ bên dưới:
kinhdoanh.inp kinhdoanh.out
2
5 4
6 7
0
2
5 10
6 6
5
2
5 4
6 5
-2
<b>ĐÁP ÁN, CHẤM</b>
Test kinhdoanh.inp kinhdoanh.out Điểm
1 5
50 65
150 141
15 30
121 200
</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>
300 300
2 11
50 65
150 135
50 65
150 135
50 65
150 135
50 65
150 135
50 65
150 135
99999 99999
0 0,5
3 6
123456 123489
1111 2222
456789 234567
1234567 123456
5678910 567899
1500000000000000000 1500000000000000010
-6443190 0,5
4 3
15000000000000000000 16000000000000000000
9999999999999999999 15999999999999999999
12345678910111213140 15345678910111213139
9999999999999999999 0,5
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program KinhDoanh;
Const Fi='kinhdoanh.INP';
Fo='kinhdoanh.OUT';
var m,b,b_m,m_b:Qword;
i,n:integer;
F: text;
BEGIN
b_m:=0;
m_b:=0;
assign(F, Fi); reset(F); readln(F,n);
for i:=1 to n do
begin
readln(F,m,b);
if b>=m then b_m:=b_m+(b-m) else
m_b:=m_b+(m-b);
end;
Close(F);
assign(F, Fo); rewrite(F);
if b_m>=m_b then
writeln(F,b_m-m_b)
else
writeln(F,'-',m_b-b_m);
Close(F);
END.
<b>Bài 12: C</b>
<b>ộng hai số</b>
Cho trước hai số nguyên dương A và B. H
ãy tính t
ổng của chúng.
<b>- D</b>
<b>ữ liệu:</b>
file văn bản
<b>sum.inp</b>
ch
ứa hai số nguyên dương A và B, mỗi số nằm tr
ên 01
dòng (A, B
≤ 10
250
).
<b>- D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>sum.out</b>
ch
ứa kết quả l
à giá tr
ị tổng cần t
ìm. Xem ví d
ụ b
ên
dưới:
sum.inp sum.out
2
3
5
<b>ĐÁP ÁN, CHẤM</b>
<b>Test sum.inp </b> <b>sum.out </b> <b>Điểm </b>
1 12345
02016
</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>
2 097984
002016
100000 1
3 012345678910999990000
2016
12345678910999992016 1
4 4545454545454545………45 (200 số 45)
5454545454545454………54 (200 số 54)
9999…9 (200 số 9) 1
5 999999………9999 (250 số 9)
100000………0001 (248 số 0)
1100…0 (249 số 0) 1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program Sum;
Const Fi='sum.inp';
Fo='sum.out';
Var s1,s2: string;
m: array[1..255] of integer;
F: text;
Function Tong2S(s1,s2:string):string;
Var i,c,l1,l2:integer;
s3:string;
Begin
Tong2S:='';
l1:=length(s1); l2:=length(s2);
while(length(s1)<250) do s1:='0'+s1;
while(length(s2)<250) do s2:='0'+s2;
i:=1;c:=0;
while (i<=l1) or (i<=l2) do begin
c:=c+ord(s1[length(s1)-i+1])+ord(s2[length(s2)-i+1])-96;
m[i]:=c mod 10;
c:=c div 10;
inc(i);
end;
if c>0 then begin m[i]:=c;inc(i) end;
l1:=i;
for i:=l1-1 downto 1 do begin
Str(m[i],s3); Tong2S:=Tong2S+s3; end;
i:=1;
While Tong2S[i]='0' do inc(i);
Delete(Tong2S,1,i-1);
End;
BEGIN
assign(F, Fi); reset(F);
readln(F,s1); readln(F,s2); Close(F);
assign(F, Fo); rewrite(F);
write(F,Tong2S(s1,s2));
Close(F);
END.
<b>Bài 13: Chia bánh</b>
T
ại buổi sinh nhật của An có một cái bánh kem
hình trịn, bánh
được viền quanh bởi một
lo
ạt các quả Dâu v
à Táo. M
ột bạn gái bỗng n
êu m
ột câu hỏi
<i>“Đố các bạn cắt bánh bằng </i>
<i>m</i>
<i>ột nhát dao th</i>
<i>ành 2 ph</i>
<i>ần sao cho số lượng quả Dâu v</i>
<i>à Táo trong 2 ph</i>
<i>ần bánh bằng </i>
<i>nhau”</i>
.
Hãy vi
ết chương tr
ình
để giúp An v
à các b
ạn
trong bu
ổi sinh nhật giải câu đố tr
ên.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào: </b>
file văn bản
<b>chiabanh.inp</b>
g
ồm hai d
òng:
+ Dòng
đầu ti
ên ch
ứa số N (N ≤ 255) l
à t
ổng số lượng quả Dâu v
à Táo trên bánh;
+ Dòng th
ứ hai l
à dãy g
ồm N ký tự l
à ‘D’ ho
ặc ‘T’ (trong đó, ký tự thứ i l
à ‘D’ n
ế
u v
ị trí
th
ứ i l
à qu
ả Dâu, ‘T’ nếu ký tự thứ i l
à qu
ả Táo). Các vị trí gắn quả trên bánh được đánh số
th
ứ tự từ 1 đến N theo chiều kim đồng hồ bắt đầu từ một vị trí t
ùy ý.
<b>- D</b>
<b>ữ liệu ra: </b>
file văn bản
<b>chiabanh.out</b>
ch
ứa kết quả:
+ S
ố
-1 n
ếu khơng t
ìm
được các
h c
ắt bánh thoả y
êu c
ầu.
+ Ghi t
ất cả các cách cắt bánh tr
ên K dòng, m
ỗi d
òng ghi 2 s
ố nguyên dương i, j cho biết
các qu
ả ở vị trí từ i đến j (theo thứ tự chiều kim đồng hồ) l
à các qu
ả thuộc một trong hai
ph
ần bánh (i v
à j cách nh
au đúng 01 khoảng cách).
</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>
chiabanh.inp chiabanh.out
6
DTTTDT
1 3
3 5
4 6
6 2
5
DTDDT
-1
<b>ĐÁP ÁN, CHẤM</b>
<b>Test chiabanh.inp </b> <b>chiabanh.out </b> <b>Điểm </b>
1 8
DTDDTTTT
-1 0,5
2 12
DTTDDTTDDTTD
1 6
3 8
5 10
7 12
9 2
11 4
0,5
3 12
TDTDTDTDTDTD
1 6
2 7
3 8
4 9
5 10
6 11
7 12
8 1
9 2
10 3
11 4
12 5
0,5
4 20
TTTTTTTTTTDDDDDDDDDD
6 15
16 5
0,5
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program ChiaBanh;
Const fi='chiabanh.inp';
fo='chiabanh.out';
Var S:array[1..256] of char;
f:text; n,dau:integer;
Procedure Nhap;
Var ch:char; i:integer;
Begin
assign(f,fi); reset(f); readln(f,n);
for i:=1 to n do S[i]:='T';
for i:=1 to n do
begin
read(f,ch);
if ch='D' then inc(dau);
S[i]:=ch;
end;
Close(f);
End;
Function CatDuoc(i,j:integer):boolean;
Var k,Sd,St:integer;
Begin
Sd:=dau div 2;
if i<j then
if j<i then
begin
for k:=i to n do if S[k]='D' then
dec(Sd);
for k:=1 to j do if S[k]='D' then
dec(Sd);
end;
CatDuoc:=(Sd=0);
End;
Procedure XuLy;
Var i,j,c: integer;
Begin
assign(f,fo); rewrite(f);
if (n mod 2=1) or (dau mod 2=1) then
begin write(f,-1); Close(f); halt; end
else begin
c:=n div 2;
for i:=1 to n do
begin
j:=i+c-1;
if j>n then j:=j-n;
if CatDuoc(i,j) then
</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>
for k:=i to j do if S[k]='D' then
dec(Sd);
Close(f);
End;
BEGIN
dau:=0; Nhap; XuLy;
END.
<b>Bài 14: Tìm s</b>
<b>ố</b>
Dãy các s
ố tự nhiên được viết li
ên t
ục vô hạn: 123456789101112131415…… H
ãy vi
ết
chương tr
ình tìm s
ố ở vị trí thứ K của d
ãy s
ố tr
ên (ch
ạy c
àng nhanh càng t
ốt).
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>timso.inp</b>
ch
ứa số nguyên dương K (K ≤ 16.10
18
).
<b>- D</b>
<b>ữ liệu ra</b>
<b>: </b>
file văn bản
<b>timso.out</b>
ch
ứa kết quả. Xem v
í d
ụ bên dưới:
timso.inp timso.out
10
1
<b>ĐÁP ÁN, CHẤM</b>
<b>Test timso.inp </b> <b>timso.out </b> <b>Điểm </b>
1 11 0 0,5
2 99999 1 0,5
3 1234567890 8 0,5
4 789789789789 7 0,5
5 111222333444555 9 0,5
6 15000000000000000000 6 0,5
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program TimSo;
Var k: QWord;
kq:integer;
F:text;
Procedure Nhap;
Begin
assign(F,'timso.inp'); reset(F);
read(F,k);
Close(F);
End;
Procedure XuLy;
var
i, tongso, coso, chuso: QWord;
Begin
tongso:= 9; coso:= 1; chuso:= 1;
while tongso < k do
begin
coso := coso * 10; Inc(chuso);
Inc(tongso, coso * 9 * chuso);
end;
Dec(tongso, coso * 9 * chuso);
Dec(k, tongso);
coso:= coso+ (k - 1) div chuso;
k:= (k - 1) mod chuso + 1;
i:=1;
while i<=chuso-k do begin coso:=coso
div 10; inc(i); end;
kq:= coso mod 10;
End;
Procedure Xuat;
Begin
assign(F,'timso.out'); rewrite(F);
write(F,kq);
Close(F)
End;
BEGIN
Nhap;
XuLy;
Xuat;
END.
<b>Bài 15: Phân tích s</b>
<b>ố</b>
M
ọi số tự nhiên đều có thể phân tích dướ
i d
ạng tổng của 02 số nguy
ên t
ố. Viết chương
trình th
ực hiện tách một số tự nhi
ên thành t
ổng của 2 số nguy
ên t
ố (tất cả các trường hợp),
n
ếu khơng phân tích được th
ì ghi l
ại chính nó.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>ptso.inp</b>
ch
ứa số tự nhi
ên N
18.000
<b>- D</b>
<b>ữ liệu ra: </b>
file văn bản
<b>ptso.out</b>
ch
ứa kết quả (mỗi d
òng là m
ột trường hợp, mỗi số
trên dòng cách nhau
đúng 01 khoảng cách).
Xem ví d
ụ bên dưới:
ptso.inp
ptso.out
</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>
5 5
11
11
<b>ĐÁP ÁN, CHẤM</b>
<b>Test ptso.inp </b> <b>ptso.out </b> <b>Điểm </b>
1 20 3 17
7 13 1
2 59 59 1
3 150
11 139
13 137
19 131
23 127
37 113
41 109
43 107
47 103
53 97
61 89
67 83
71 79
1
4 999 2 997 1
5 18000
11 17989
13 17987
19 17981
23 17977
...
8941 9059
8951 9049
8971 9029
8999 9001
1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program PhanTichSo;
Var n:Qword;
i:Qword;
fi,fo:text;
Function NT(a:Qword):Boolean;
Var ok: Boolean; j:QWord;
Begin
ok:=true; j:=2;
while j<a do
begin
if (a mod j) = 0 then ok:=ok and
false;
j:=j+1; end;
if a>=2 then NT:=ok else NT:=false;
End;
BEGIN
assign(fi,'ptso.inp');reset(fi);
readln(fi,n);
assign(fo,'ptso.out');
rewrite(fo); i:=2;
while i<(n div 2)+1 do begin
if (NT(i) and NT(n-i)) then
Writeln(fo,i,' ',n-i);
i:=i+1; end;close(fi);close(fo);
END.
<b>Bài 16: Tìm a[n] </b>
Cho m
ột d
ãy s
ố tự nhi
ên g
ồm n
ph
ần tử tăng dần như sau:
a[1]=3, a[2]=8, a[3]=15, a[4]=24, ..., a[n]. Tìm a[n].
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>timan.inp</b>
ch
ứa số nguyên dương n (n ≤10
9
).
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>timan.out</b>
ch
ứa kết quả l
à giá tr
ị a[n] cần t
ìm. Xem ví d
ụ
m
ẫu:
timan.inp
timan.out
</div>
<span class='text_page_counter'>(31)</span><div class='page_container' data-page=31>
<b>ĐÁP ÁN, CHẤM</b>
<b>Test timan.inp </b> <b>timan.out </b> <b>Điểm </b>
1 4 24 1,5
2 50 2600 1,5
3 99999 9999999999 1,5
4 1000000000 1000000002000000000 1,5
<b>TỔNG CỘNG </b> <b>6 </b>
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program TimAn;
Const Fi='timan.inp';
Fo='timan.out';
Var n: Qword;
F:text;
BEGIN
assign(F, Fi); reset(F); readln(F,n);
Close(F);
assign(F, Fo); rewrite(F);
write(F,n*(n+2)); Close(F);
END.
<b>Bài 17: S</b>
<b>ắp xếp chuỗi </b>
Cho m
ột chuỗi S gồm các ký tự chữ v
à s
ố, bắt đầu ký số. H
ãy vi
ết chương tr
ình
để sắp
x
ếp chuỗi S t
heo th
ứ tự
<b>tăng dần</b>
n
ếu
<b>ký t</b>
<b>ự đầu l</b>
<b>à ‘1’</b>
,
<b>ngồi ra</b>
thì
<b>gi</b>
<b>ảm dần</b>
(khơng phân
bi
ệt hoa, thường).
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>xepchuoi.inp</b>
ch
ứa chuỗi S.
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>xepchuoi.out</b>
ch
ứa kết quả l
à chu
ỗi S đ
ã s
ắp xếp theo thứ tự
tăng dần hoặc giảm
d
ần theo điều kiện n
êu trên. Xem ví d
ụ mẫu:
xepchuoi.inp
xepchuoi.out
1Ba9Cc30b
0139aBbCc
Ba9Cc30b
CcBba930
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>xepchuoi.inp </b> <b>xepchuoi.out </b> <b>Điểm </b>
1 1
2 a a 1
3 19JJk40lmmjAbx5abdD77 0145779AabbdDJJjklmmx 1
4 09JJk40lmmjAbx5abdD77 xmmlkJJjdDbbAa9775400 1
<b>CỘNG </b> <b>4 </b>
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program XepChuoi;
Const Fi='xepchuoi.inp';
Fo='xepchuoi.out';
var s: string;
i,j: integer;
ch:char;
F:text;
Procedure hoanvi(var x,y: char);
var tam:char;
begin
tam:=x;
x:=y;
y:=tam;
end;
Procedure XepTang;
Var
l:integer;
Begin
l:=length(s);
if l>1 then
Procedure XepGiam;
Var
l:integer;
Begin
l:=length(s);
if l>1 then
For i:=2 to l do
For j:=l downto i do
if upcase(s[j])>upcase(s[j-1])
then hoanvi(s[j],s[j-1]);
End;
BEGIN
assign(F, Fi); reset(F);
readln(F,s); Close(F);
if s[1]='1' then XepTang else XepGiam;
assign(F, Fo); rewrite(F);
</div>
<span class='text_page_counter'>(32)</span><div class='page_container' data-page=32>
For i:=2 to l do
For j:=l downto i do
if upcase(s[j])<upcase(s[j-1])
then hoanvi(s[j],s[j-1]);
End;
<b>Bài 18: Tìm ngày/tháng/n</b>
<b>ăm</b>
T
ừ chuỗi ngày/tháng/năm theo cấu trúc dd/mm/yyyy v
à s
ố N (N ≤ 10.10
8
) cho trước.
Hãy cho bi
ết ngày/tháng/năm (dd/mm/yyyy) sau N ngày.
-
<b> D</b>
<b>ữ liệu v</b>
<b>ào: </b>
file văn
b
ản
<b>ngaythangnam.inp</b>
g
ồm một d
òng duy nh
ất chứa
ngày/tháng/năm và số N cách nhau đúng một khoảng cách.
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>ngaythangnam.out</b>
ch
ứa kết quả là ngày/tháng/năm sau N
ngày. Xem ví d
ụ mẫu:
ngaythangnam.inp
ngaythangnam.out
22/04/2017 30
22/05/2017
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>ngaythangnam.inp </b> <b>ngaythangnam.out </b> <b>Điểm </b>
1 22/04/2017 30 22/05/2017 1,5
2 01/02/2017 30 03/03/2017 1,5
3 15/03/2017 100 23/06/2017 1,5
4 18/05/2017 1000000000 01/03/2739868 1,5
<b>TỔNG CỘNG </b> <b>6 </b>
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program NgayThangNam;
var th:integer; s:string;
n,ng,na:QWord; F:text;
procedure Nhap;
begin
assign(F,'ngaythangnam.inp');reset(F);
read(F,s); Close(F);
val(copy(s,1,2),ng);
val(copy(s,4,2),th);
val(copy(s,7,4),na);
val(copy(s,12,length(s)-11),n);
end;
Function SoNgay:byte;
begin
case th of
2:if (na mod 4=0) then SoNgay:=29
else SoNgay:=28;
1,3,5,7,8,10,12:SoNgay:=31;
4,6,9,11:SoNgay:=30;
end;
end;
Procedure TinhNgay;
Begin
ng:=ng+n;
While ng>SoNgay Do
Begin ng:=ng-SoNgay; th:= th+1;
IF th>12 Then Begin th:= 1;na:= na+1;
End; End;
End;
Procedure Xuat;
var sngay, sthang, snam: string;
begin
assign(F,'ngaythangnam.out');
rewrite(F);
if ng<10 then begin str(ng,sngay);
sngay:='0'+sngay; end else
str(ng,sngay);
if th<10 then begin str(th,sthang);
sthang:='0'+sthang; end else
str(th,sthang);
str(na,snam);
write(F,sngay+'/'+sthang+'/'+snam);
Close(F); End;
BEGIN
Nhap;
TinhNgay;
Xuat;
END.
<b>Bài 19: Phân tích s</b>
<b>ố</b>
Cho trước số tự nhi
ên N. Hãy vi
ết chương tr
ình cho bi
ết N
có th
ể biểu diễn th
ành t
ổng
c
ủa hai hoặc nhiều số tự nhi
ên liên ti
ếp hay khơng? Nếu có, th
ì bao nhiêu cách và hãy li
ệt k
ê
t
ất cả các cách có thể có. Nếu khơng, th
ì thơng báo b
ằng số 0 v
à ghi l
ại số đó.
</div>
<span class='text_page_counter'>(33)</span><div class='page_container' data-page=33>
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>phantichso.out</b>
ch
ứa kết quả l
à i dịng. Dịng
đầu ti
ên ghi s
ố
cách phân tích, i-1 dòng ti
ếp theo, mỗi d
òng là m
ột cách, các số tự nhi
ên liên ti
ếp tr
ên m
ột
dòng cách nhau
đúng 01 dấu +.
Chú ý: th
ứ tự sắp xếp các phần tử từ
nh
ỏ đến lớn, từ trái sang phải v
à t
ừ ít đến nhiều
s
ố, từ tr
ên xu
ống). Xem ví dụ mẫu:
phantichso.inp
phantichso.out
9
2
4+5
2+3+4
11
0
11
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>kytu.inp </b> <b>kytu.out </b> <b>Điểm </b>
1 9 2
4+5
2+3+4
1
2 2048 0
2048
1
3 76 1
6+7+8+9+10+11+12+13
1
4 99 5
49+50
32+33+34
14+15+16+17+18+19
7+8+9+10+11+12+13+14+15
4+5+6+7+8+9+10+11+12+13+14
1
<b>CỘNG </b> <b>4 </b>
Program PhanTichSo;
const inFile='phantichso.inp';
outFile='phantichso.out';
var N:longint;
m,dem,i,a,limit:longint;
fi,fo: text;
Procedure SoCach;
begin
limit:=trunc(sqrt(1+8*N)+1) div 2;
for m:=2 to limit-1 do
if ((N-m*(m-1) div 2) mod m =0)
then inc(dem);
end;
Procedure PhanTich;
begin
limit:=trunc(sqrt(1+8*N)+1) div 2;
for m:=2 to limit-1 do
if ((N-m*(m-1) div 2) mod m =0)
then
begin
a:=(N-m*(m-1) div 2) div m;
writeln(fo);
for i:=a to a+m-2 do
begin
write(fo,i,'+');
if a+m-1-i=1 then
write(fo,i+1);
end; end;
end;
BEGIN
assign(fi,inFile); reset(fi);
readln(fi,N);
assign(fo,outFile); rewrite(fo);
dem:=0;
SoCach;
if dem=0 then begin writeln(fo,0);
write(fo,N); end
else
begin
write(fo,dem);
PhanTich;
end;
close(fi); close(fo);
END.
<b>Bài 20: Tìm a[n] </b>
Cho m
ột d
ãy s
ố tự nhi
ên g
ồm
n ph
ần tử với:
a[1] = 0, a[2] = 2, a[3] = 6, a[4] = 12, a[5]=20, …, a[n]. Tìm a[n].
</div>
<span class='text_page_counter'>(34)</span><div class='page_container' data-page=34>
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>timan.out</b>
ch
ứa kết quả l
à giá tr
ị a[n] cần t
ìm. Xem ví d
ụ:
timan.inp
timan.out
5
20
<b>ĐÁP ÁN, CHẤM</b>
<b>Test timan.inp </b> <b>timan.out </b> <b>Điểm </b>
1 5 20 1,5
2 1 0 1,5
3 99999 9999700002 1,5
4 1000000000 999999999000000000 1,5
<b>CỘNG </b> <b>6 </b>
Program TimAn;
Const Fi='timan.inp';
Fo='timan.out';
Var n: QWord;
F:text;
BEGIN
assign(F, Fi); reset(F); readln(F,n);
Close(F);
assign(F, Fo); rewrite(F);
write(F,n*(n-1)); Close(F);
END.
<b>Bài 21: Tách chu</b>
<b>ỗi </b>
Cho m
ột chuỗi ký tự S (gồm chữ v
à s
ố). H
ãy vi
ết chương tr
ình tách ch
ữ v
à s
ố th
ành
hai chu
ỗi ri
êng bi
ệt.
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>tachchuoi.inp</b>
ch
ứa chuỗi S.
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>tachchuoi.out</b>
ch
ứa kết quả gồm 2 d
òng. Dòng 1 là chu
ỗi
ch
ữ, d
òng 2 là chu
ỗi số. Nếu như chuỗi n
ào r
ỗng th
ì ghi d
ấu trừ ‘
-’. Xem ví d
ụ mẫu:
<b>tachchuoi.inp </b> <b>tachchuoi.out </b> <b>tachchuoi.inp tachchuoi.out tachchuoi.inp tachchuoi.out </b>
a1B2c3 aBc
123
123 -
123
aBc aBc
-
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b>
<b>tachchuoi.inp </b>
<b>tachchuoi.out </b>
<b>Điểm</b>
1
a1B2c34d
aBcd
1234
1
2
0987654321
-
0987654321
1
3
abghcGGG
abghcGGG
-
1
4
-
-
1
<b>C</b>
<b>ỘNG</b>
<b>4 </b>
Program TachChuoi;
Const Fi='tachchuoi.inp';
Fo='tachchuoi.out';
var s,chu,so: string;
i,j: integer;
F:text;
BEGIN
assign(F, Fi); reset(F);
readln(F,s); Close(F);
chu:='';
so:='';
for i:=1 to length(s) do
begin
if (s[i] in ['0'..'9']) then
so:=so+s[i];
if (s[i] in ['A'..'Z'] + ['a'..'z'])
then chu:=chu+s[i];
end;
assign(F, Fo); rewrite(F);
</div>
<span class='text_page_counter'>(35)</span><div class='page_container' data-page=35>
<b>Bài 22: Phân tích s</b>
<b>ố</b>
M
ọi số tự nhiên N đều có thể phân tích dưới dạng tổng của 02 số nguy
ên t
ố. Viết
chương tr
ình tìm t
ổng số cách để tách một số tự nhi
ên thành t
ổng của 02 số nguy
ên t
ố.
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>phantichso.inp</b>
ch
ứa duy nhất số N
18.000.
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>phantichso.out</b>
ch
ứa kết quả l
à K cách tách s
ố. Xem ví dụ
m
ẫu:
phantichso.inp
phantichso.out
10
2
11
0
<b>ĐÁP ÁN, CHẤM</b>
<b>Test ptso.inp </b> <b>ptso.out </b> <b>Điểm </b>
1 59 0 1,5
2 150 12 1,5
3 999 1 1,5
4 18000 419 1,5
<b>Tổng điểm </b> <b>6 </b>
Program PhanTichSo;
const fi='phantichso.inp';
fo='phantichso.out';
Var i,n:Qword;
dem:integer;
F:text;
Function NT(a:Qword):Boolean;
Var ok: Boolean;
j:QWord;
Begin
ok:=true;
j:=2;
while j<a do
begin
if (a mod j) = 0 then ok:=ok and
false;
j:=j+1;
end;
if a>=2 then NT:=ok else NT:=false;
End;
BEGIN
assign(F,fi); reset(F);
readln(F,n);close(F);
assign(F,fo); rewrite(F);
i:=2;
dem:=0;
while i<(n div 2)+1 do
begin
if (NT(i) and NT(n-i)) then
inc(dem);
inc(i);
end;
write(F,dem);
close(F);
END.
<b>Bài 23: Dãy 0-1 xen k</b>
<b>ẽ </b>
T
ừ một d
ãy n ph
ần tử gồm các số 0, 1 cho trước. H
ãy vi
ết chương tr
ình ki
ểm tra xem
dãy này có ch
ứa các số 0 v
à 1 xen k
ẽ nhau khơng, nếu có th
ì m
ấy cặp 01, nếu khơng th
ì v
ị
trí i, j sai đầu ti
ên là m
ấy?
-
<b> D</b>
<b>ữ liệu v</b>
<b>ào:</b>
t
ừ file văn bản
<b>day01xenke.inp</b>
ch
ứa duy nhất d
ãy 01.
-
<b> D</b>
<b>ữ liệu ra: </b>
file văn bản
<b>day01xenke.out</b>
ch
ứa kết quả l
à K c
ặp 01 xen kẽ nếu thoả
điều kiện, ngược lại ghi số i j (trong đó, i v
à j là hai v
ị trí sai đầu ti
ên, i<j, i và j cách nhau
đúng một dấu cách). Xem ví dụ dưới:
day01xenke.inp
day01xenke.out
10101
2
10011
2 3
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>day01xenke.inp </b> <b>day01xenke.out </b> <b>Điểm </b>
1 101010100 8 9 1
</div>
<span class='text_page_counter'>(36)</span><div class='page_container' data-page=36>
3 0101010101010101010 9 1
4 01010110101101010101 6 7 1
TỔNG <b>4 </b>
Program Day01xenke;
Var S:string;
i,k,n,dem:integer;
flag:boolean;
F: text;
BEGIN
Assign(F,'day01xenke.inp'); reset(F);
readln(F,S);
Close(F);
i:=1;dem:=0;flag:=true;
while (i<length(S)) and flag do
begin
if S[i]<>S[i+1] then
begin
flag:=true;
if S[i]='0' then inc(dem);
end
else flag:=false;
inc(i);
end;
Assign(F,'day01xenke.out');
rewrite(F);
if flag then write(F,dem) else
write(F,i-1,' ',i);
close(F);
END.
<b>Bài 24: Tìm s</b>
<b>ố </b>
Cho m
ột d
ãy s
ố tự nhi
ên g
ồm n phần tử với:
a[1]=a[2]=a[3]=1, a[4]=3, a[5]=5, …, a[n]=
<sub></sub>
1
3
<i>n</i>
<i>n</i>
<i>a</i>
<i>i</i>
. Tìm a[n].
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>timso.inp</b>
ch
ứa số nguyên dương n (n ≤ 75).
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>timso.out</b>
ch
ứa kết quả l
à giá tr
ị a[n] cần t
ìm. Xem ví d
ụ
m
ẫu:
timso.inp
timso.out
5
5
<b>ĐÁP ÁN, CHẤM</b>
<b>Test timso.inp timso.out </b> <b>Điểm </b>
1 3 1 1
2 25 978793 1
3 60 1792344042191491 1
4 75 16717180390659349953 1
<b>CỘNG </b> <b>4 </b>
Program TimSo;
Const Fi='timso.inp';
Fo='timso.out';
Var i,n:integer;
an,a,b,c: Qword;
F:text;
BEGIN
assign(F, Fi); reset(F); readln(F,n);
Close(F);
If n<=3 then an:=1 else
Begin
i:=4;
a:=1;b:=1;c:=1;
while i<=n do
begin
an:=a+c;
a:=b;
b:=c;
c:=an;
inc(i);
end;
End;
assign(F, Fo); rewrite(F);
write(F,an); Close(F);
END.
<b>Bài 25: Ký t</b>
<b>ự xuất hiện nhiều nhất </b>
Vi
ết chương tr
ình tìm nh
ững ký tự xuất hiện nhiều nhất (chỉ sử dụng chữ thường)
trong m
ột xâu ký tự S cho trước (có thể sử dụng chữ hoa, thường).
</div>
<span class='text_page_counter'>(37)</span><div class='page_container' data-page=37>
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>kytu.out</b>
ch
ứa kết quả l
à xâu liên t
ục chứa những ký tự xuất
hi
ện nhiều nhất trong chuỗi S (theo thứ tự alphabet). X
em ví d
ụ mẫu:
kytu.inp
kytu.out
aEbeEcddcC
ce
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>kytu.inp </b> <b>kytu.out </b> <b>Điểm </b>
1 1
2 aEbeEcddcC ce 1
3 Z z 1
4 ZzaaabcjJjSSSZZzzAKtAAsCCsjBbjfjs ajsz 1
<b>CỘNG </b> <b>4 </b>
Program KyTu;
const inFile='kytu.inp';
outFile='kytu.out';
var x:array['a'..'z'] of integer;
s:string;
i,max:integer;
j:char;
fi,fo: text;
BEGIN
FillChar(x,SizeOf(x),0);
assign(fi,inFile); reset(fi);
readln(fi,s);
assign(fo,outFile); rewrite(fo);
for i:=1 to length(s) do
inc(x[lowercase(s[i])]);
max:=0;
for j:='a' to 'z' do if (x[j]>max)
and (max>0) then max:=x[j];
for j:='a' to 'z' do
if x[j]=max then write(fo,j);
close(fi); close(fo);
END.
<b>Bài 26: Phân tích s</b>
<b>ố</b>
Cho trước số tự nhi
ên N. Hãy vi
ết chương tr
ình cho bi
ết N có thể biểu diễn th
ành t
ổng
c
ủa hai hoặc nhiều số tự nhi
ên liên ti
ếp hay khơng? Nếu có, h
ãy li
ệt k
ê t
ất cả các cách có thể
có. N
ếu khơng, th
ì thông báo b
ằng số 0.
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>phantichso.inp</b>
ch
ứa duy nhất số N.
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn
b
ản
<b>phantichso.out</b>
ch
ứa kết quả l
à i dòng, m
ỗi d
òng là m
ột
cách, các s
ố tự nhi
ên liên ti
ếp tr
ên m
ột d
òng cách nhau
đúng 01 dấu +.
Chú ý: th
ứ tự sắp xếp các phần tử từ nhỏ đến lớn, từ trái sang phải, từ tr
ên xu
ống).
Xem ví d
ụ mẫu:
phantichso.inp
phantichso.out
9
2+3+4
4+5
2
0
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>phantichso.inp </b> <b>phantichso.out </b> <b>Điểm </b>
1 9 2+3+4
4+5
0,5
2 2048 0 0,5
3 76 6+7+8+9+10+11+12+13 0,5
4 99 4+5+6+7+8+9+10+11+12+13+14
7+8+9+10+11+12+13+14+15
14+15+16+17+18+19
32+33+34
49+50
0,5
</div>
<span class='text_page_counter'>(38)</span><div class='page_container' data-page=38>
Program PhanTichSo;
const fi='phantichso.inp';
fo='phantichso.out';
var N:longint;
m,dem,i,a,limit:longint;
f: text;
Procedure PhanTich;
begin
limit:=trunc(sqrt(1+8*N)+1) div 2;
for m:=limit-1 downto 2 do
if ((N-m*(m-1) div 2) mod m =0)
then
begin
a:=(N-m*(m-1) div 2) div m;
inc(dem);
if dem>1 then writeln(f);
for i:=a to a+m-2 do
begin
write(f,i,'+');
if a+m-1-i=1 then
write(f,i+1);
end;
end;
end;
BEGIN
assign(f,fi); reset(f);
readln(f,N); close(f);
assign(f,fo); rewrite(f);
dem:=0;
PhanTich;
if dem=0 then write(f,0);
close(f);
END.
<b>Bài 27: Tìm t</b>
<b>ổng các số nguy</b>
<b>ên t</b>
<b>ố có N chữ số </b>
S
ố nguy
ên t
ố l
à s
ố tự nhi
ên l
ớn hơn 1, chỉ có 2 ước số l
à 1 và ch
ính nó. Cho trước một
s
ố tự nhi
ên N, tìm t
ổng tất cả các số nguy
ên t
ố có N chữ số.
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>sumnt.inp</b>
ch
ứa duy nhất số N.
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>sumnt.out</b>
ch
ứa kết quả l
à T
ổng các số nguy
ên t
ố có N chữ
s
ố. Xem ví dụ mẫu:
sumnt.inp
sumnt.out
0
0
1
17
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>sumnt.inp </b> <b>sumnt.out </b> <b>Điểm </b>
1 0 0 1,5
2 2 1043 1,5
3 3 75067 1,5
4 6 37096005486 1,5
<b>TỔNG CỘNG </b> <b>6 </b>
Program SumNT;
const Fi='sumnt.inp';
Fo='sumnt.out';
var n:integer;
Tong,tu,den:Qword;
F: text;
function aLTb(a,b:integer):QWord;
var i:integer;
begin
aLTb:=1;
for i:=1 to b do aLTb:=aLTb*a;
end;
function KTnt(a:Qword):boolean;
var b:Qword;
kt:boolean;
begin
kt:=true; b:=2;
while (b<=trunc(sqrt(a))) do begin
if (a mod b)=0 then begin
kt:=false;break;end else kt:=true;i
nc(b);
end;
KTnt:=kt;
end;
BEGIN
assign(F,Fi); reset(F);
read(F,n);close(F);
tu:=aLTb(10,n-1)+1;
den:=aLTb(10,n);
if (tu=2) and (n>0) then begin
Tong:=tu; inc(tu); end else Tong:=0;
while tu<=den do
begin
if KTnt(tu) then Tong:=Tong+tu;
inc(tu,2);
end;
assign(F,Fo); rewrite(F);
write(F,Tong);
</div>
<span class='text_page_counter'>(39)</span><div class='page_container' data-page=39>
<b>Bài 28</b>
<b>: Đếm cặp 01 </b>
T
ừ một chuỗi v
ịng trịn khép kín S g
ồm các số 0, 1 cho
trước. H
ãy vi
ết chương tr
ình
đếp số cặp 01 trong chuỗi v
ịng trịn
này (xem ví d
ụ ở h
ình bên ta th
ấy có 03 cặp 01).
-
<b> D</b>
<b>ữ liệu v</b>
<b>ào:</b>
t
ừ file văn bản
<b>cap01.inp</b>
ch
ứa duy nhất
chu
ỗi S.
-
<b> D</b>
<b>ữ liệu ra: </b>
file văn bản
<b>cap01.out</b>
ch
ứa kết quả l
à K c
ặp
01. Xem ví d
ụ dưới:
cap01.inp
cap01.out
101010
3
10011
1
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>cap01.inp </b> <b>cap01.out </b> <b>Điểm </b>
1 00000 0 1
2 1001100011010101 5 1
3 10010101000000101111100011111111110 7 1
4 10001010110001110010001100000100100010011110100000000
00000000000
12 1
<b>TỔNG CỘNG </b> <b>4 </b>
Program Cap01;
Var S:string;
i,dem:integer;
F: text;
BEGIN
Assign(F,'cap01.inp'); reset(F);
readln(F,S);
Close(F);
i:=1;dem:=0;
while i<length(S) do
begin
if (S[i]='0') and (S[i+1]='1') then
inc(dem);
inc(i);
end;
if (S[i]='0') and (S[1]='1') then
inc(dem);
Assign(F,'cap01.out'); rewrite(F);
write(F,dem);
close(F);
END.
<b>Bài 29: Tìm a[n] </b>
Cho m
ột d
ãy s
ố tự nhi
ên g
ồm n phần tử với:
a[1]=1, a[2]=3 và a[n]=
<sub></sub>
<sub>1</sub><i>n</i>1
<i>a</i>
[
<i>i</i>
]
+a[n-1]+1 (ví d
ụ: a[3]=8, a[4]=21)
. Tìm a[n].
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn
b
ản
<b>timan.inp</b>
ch
ứa số nguyên dương n (0<n≤46).
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>timan.out</b>
ch
ứa kết quả l
à giá tr
ị a[n] cần t
ìm. Xem ví d
ụ
m
ẫu
:
timan.inp
timan.out
4
21
<b>ĐÁP ÁN, CHẤM</b>
<b>Test timan.inp timan.out </b> <b>Điểm </b>
1 1 1 1,5
2 5 55 1,5
3 35 190392490709135 1,5
4 46 7540113804746346429 1,5
<b>CỘNG </b> <b>6 </b>
Program TimAn;
Const Fi='timan.inp';
Fo='timan.out';
an_1:=1;
i:=2;
while (i<=n) do
1
0
1
0
</div>
<span class='text_page_counter'>(40)</span><div class='page_container' data-page=40>
Var an_1,tong,an:Qword;
i,n:integer;
F:text;
BEGIN
assign(F, Fi); reset(F); readln(F,n);
Close(F);
if n=1 then an:=n else
begin
tong:=1;
begin
an:=tong+an_1+1;
an_1:=an;
tong:=tong+an_1;
inc(i);
end;
end;
assign(F, Fo); rewrite(F);
write(F,an); Close(F);
END.
<b>Bài 30: Rút g</b>
<b>ọn d</b>
<b>ãy s</b>
<b>ố </b>
Cho m
ột d
ãy s
ố li
ên t
ục gồm các phần tử từ 0 đến
9. Phép rút g
ọn l
à ch
ỉ ghi lại một
ph
ần tử (0..9) m
à t
ổng của các phần tử giống nhau đó l
à l
ớn nhất. H
ãy tìm dãy s
ố li
ên t
ục
m
ới l
à rút g
ọn của d
ãy
đ
ã cho (theo th
ứ tự tăng dần).
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>rutgon.inp</b>
ch
ứa d
ãy s
ố li
ên t
ục.
-
<b>D</b>
<b>ữ liệu ra:</b>
f
ile văn bản
<b>rutgon.out</b>
ch
ứa kết quả l
à dãy s
ố rút gọn cần t
ìm. Xem ví
d
ụ mẫu (d
ãy 1934334 có dãy rút g
ọn l
à 39, vì s
ố 9 v
à 3+3+3=9 là l
ớn nhất):
rutgon.inp
rutgon.out
1934334
39
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>rutgon.inp </b> <b>rutgon.out </b> <b>Điểm </b>
1 1934334 39 1
2 1122113451231 123 1
3 1 1 1
4 0000111222222222222944545556774848784333336
663393
23468 1
<b>CỘNG </b> <b>4 </b>
Program RutGon;
const inFile='rutgon.inp';
outFile='rutgon.out';
var a:array['0'..'9'] of integer;
s:string;
i,max:integer;
j:char;
fi,fo: text;
BEGIN
FillChar(a,SizeOf(a),0);
assign(fi,inFile); reset(fi);
readln(fi,s);
assign(fo,outFile); rewrite(fo);
for i:=1 to length(s) do
inc(a[s[i]]);
max:=0;
for j:='0' to '9' do if
(a[j]*(ord(j)-48))>max then
max:=a[j]*(ord(j)-48);
for j:='0' to '9' do
if (a[j]*(ord(j)-48))=max then
write(fo,j);
close(fi); close(fo);
END.
<b>Bài 31</b>
<b>: Đổi hệ 10 sang hệ 2</b>
S
ố nhị phân l
à s
ố chỉ sử dụng số 0 v
à 1. Hãy vi
ết chương tr
ình
đổi số hệ thập phân N
(N
≤10
19
) sang s
ố hệ nhị phân.
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>doi10to2.inp</b>
ch
ứa số N.
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>doi10to2.out</b>
ch
ứa kết quả l
à s
ố nhị phân vừa đổi từ số N.
Xem ví d
ụ mẫu:
doi10to2.inp
doi10to2.out
3
11
</div>
<span class='text_page_counter'>(41)</span><div class='page_container' data-page=41>
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>doi10to2.inp </b> <b>doi10to2.out </b> <b>Điểm </b>
1 10 1010 1,5
2 9999999999 1001010100000010111110001111111111 1,5
3 9223372036854775807 111111111111111111111111111111111111111111
111111111111111111111 1,5
4 10000000000000000000 100010101100011100100011000001001000100111
1010000000000000000000 1,5
<b>TỔNG CỘNG </b> <b>6 </b>
Program Doi10to2;
Const Fi='doi10to2.inp';
Fo='doi10to2.out';
var St:string;
N:Qword;
du:byte;
F:text;
BEGIN
assign(F,Fi); reset(F); read(F,N);
close(F);
if N=0 then St:='0' else St:='';
while N>0 do
begin
du:=N mod 2;
N:=N div 2;
St:=chr(du+48)+St;
end;
assign(F,Fo);
rewrite(F); write(F,St);
close(F);
END.
<b>Bài 32: Bài tốn ni th</b>
<b>ỏ</b>
Bài toán c
ổ về việc sinh sản của các cặp thỏ được đặt ra như sau:
(1) Gi
ả sử các con thỏ không bao giờ chết;
(2) 02 tháng sau khi ra đời, mỗi cặp
th
ỏ mới sẽ sinh ra 01 cặp thỏ con (01 đực, 01 cái);
(3) Khi đ
ã sinh con r
ồi th
ì c
ứ mỗi tháng tiếp theo chúng lại sinh được 01 cặp con mới
(01 đực, 01 cái).
Gi
ả sử từ giữa tháng 1 có 01 cặp thỏ th
ì
đến giữa tháng thứ n (n ≤ 1.000) sẽ có tổng
c
ộng bao nhi
êu con th
ỏ. H
ãy vi
ết chương tr
ình
để giải b
ài toán trên.
-
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>nuoitho.inp</b>
ch
ứa duy nhất một số tự nhi
ên n (tháng th
ứ n).
-
<b>D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>nuoitho.out</b>
ch
ứa kết quả l
à t
ổng số thỏ có được ở tháng thứ n.
nuoitho.inp
nuoitho.out
5
10
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b> <b>nuoitho.inp </b> <b>nuoitho.out </b> <b>Điểm </b>
1 5 10 1
2 50 25172538050 1
3 92 15080227609492692858 1
4 1000 8693311537387491287137705535008125160512932103474356
0804963458179073110835898103780807759680158510338591
8451861606452695504193792464797466449423232859928818
1306637587659793929985703200740895227559033369845775
0
1
<b>TỔNG CỘNG </b> <b>4 </b>
PROGRAM NuoiTho;
VAR thang,i:integer;
tn, tn_1, tn_2:string;
F:text;
function Tong2S(s1,s2:string):string;
var i,c,l1,l2:integer;
BEGIN
assign(F,'nuoitho.inp'); reset(F);
readln(F,thang);close(F);
if thang>2 then
Begin
</div>
<span class='text_page_counter'>(42)</span><div class='page_container' data-page=42>
m: array[1..250] of integer;
begin
Tong2S:='';
l1:=length(s1); l2:=length(s2);
while(length(s1)<220) do s1:='0'+s1;
while(length(s2)<220) do s2:='0'+s2;
i:=1;c:=0;
while (i<=l1) or (i<=l2) do begin
c:=c+ord(s1[length(s1)-i+1])+ord(s2[length(s2)-i+1])-96;
m[i]:=c mod 10;
c:=c div 10;
inc(i);
end;
if c>0 then begin m[i]:=c;inc(i) end;
l1:=i;
for i:=l1-1 downto 1 do begin
Str(m[i],s3); Tong2S:=Tong2S+s3; end;
i:=1;
While Tong2S[i]='0' do inc(i);
Delete(Tong2S,1,i-1);
End;
cap tho}
i:=3;
while i<=thang dO
begin
tn:=Tong2S(tn_1,tn_2);
tn_2:=tn_1;
tn_1:=tn;
inc(i);
end;
end
else
tn:='1';
assign(F,'nuoitho.out'); rewrite(F);
write(F,Tong2S(tn,tn));close(F);
END.
<b>Bài 33: Tìm s</b>
<b>ố ho</b>
<b>àn h</b>
<b>ảo </b>
S
ố ho
àn h
ảo l
à s
ố có tổng các ước của nó (trừ nó) bằ
ng chính nó (ví d
ụ: 6 = 1 + 2 + 3). Từ số
nguyên dương N cho trước, h
ãy vi
ết chương tr
ình
để t
ìm s
ố ho
àn h
ảo lớn nhất từ 1 đến N:
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản
<b>timsohh.inp</b>
ch
ứa số nguyên dương N
(N
10.000).
<b>- D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>timsohh.out</b>
ch
ứa
k
ết q
u
ả
là s
ố ho
àn h
ảo vừa t
ìm
được
. N
ếu
khơng có thì ghi s
ố 0.
Xem ví d
ụ dưới:
timsohh.inp
timsohh.out
5
0
6
6
<b>ĐÁP ÁN, CHẤM</b>
<b>Test timsohh.inp </b> <b>timsohh.out </b> <b>Điểm </b>
1 3 0 1
2 28 28 1
3 500 496 1
4 10000 8128 1
PROGRAM timsohh;
Const Fi='timsohh.inp';
Fo='timsohh.out';
var n,j:integer;
F:text;
Function hoanhao(m:integer):boolean;
Var i,S:integer;
Begin
S:=0;
i:=1;
while i<=(m div 2) do
begin
if (m mod i)=0 then S:=S+i;
inc(i);
end;
hoanhao:=(S=m);
End;
BEGIN
assign(F, Fi); reset(F); readln(F,n);
Close(F);
j:=n;
while (j>1) and (not hoanhao(j)) do
dec(j);
assign(F, Fo); rewrite(F);
if j=1 then write(F,0) else write(F,j);
Close(F);
</div>
<span class='text_page_counter'>(43)</span><div class='page_container' data-page=43>
<b>Bài 34: S</b>
<b>ắp xếp chuỗi </b>
Cho m
ột chuỗi S bất kỳ (không l
à chu
ỗi rỗng
) và m
ột số nguy
ên N, hãy vi
ết chương tr
ình
tách riêng chu
ỗi chữ theo chữ (không phân biệt hoa thường, số theo số v
à s
ắp xếp theo thứ
t
ự tăng dần (nếu N=0) hoặc giảm dần (nếu N=1), nếu chuỗi không có chữ hoặc số th
ì
để dấu
tr
ừ ‘
-’.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn
b
ản
<b>sapxepchuoi.inp</b>
g
ồm 02 d
òng, dòng 01 ch
ứa số N, d
òng 2
ch
ứa
chu
ỗi S (S
255 ký t
ự)
.
<b>- D</b>
<b>ữ liệu ra:</b>
file văn bản
<b>sapxepchuoi.out</b>
ch
ứa
k
ết
qu
ả gồm 02 d
òng, dòng 1 là chu
ỗi
s
ố, d
òng 2 là chu
ỗi chữ đ
ã s
ắp xếp thứ tự
. Xem ví d
ụ dưới:
sapxepchuoi.inp sapxepchuoi.out
0
06aba7c910kh
001679
aabchk
1
azaba
-
zbaaa
1
62710
76210
-
<b>ĐÁP ÁN, CHẤM</b>
<b>Test sapxepchuoi.inp </b> <b>sapxepchuoi.out </b> <b>Điểm </b>
1 0
Zm973b9jf022gg
0223799
bfggjmZ
1
2 1
0123456789
9876543210
-
1
3 1
AbcdefGHijk
-
kjifedcbHGA
1
4 0
0FF1j234tmk9p5KKK
0123459
FFjkKKKmpt
1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program sapxepchuoi;
Const Fi='sapxepchuoi.inp';
Fo='sapxepchuoi.out';
var chu,so,S: string;
k:byte;
F:text;
Procedure tachchu_so;
Var i, n: byte;
Begin
chu:=''; so:='';
n:= length(S);
if (n > 0) then
For i:=1 to n do
If (S[i] in ['0'..'9'])
then so:=so+S[i]
else chu:=chu+S[i];
End;
Procedure hoanvi(var x,y: char);
var tam:char;
begin
tam:=x;
x:=y;
y:=tam;
end;
Function XepTang(chuoi:string): string;
Var i,j,n:byte;
if
(upcase(chuoi[j])<upcase(chuoi[j-1]))
then hoanvi(chuoi[j],chuoi[j-1]);
XepTang:=chuoi;
End;
Function XepGiam(chuoi:string): string;
Var
i,j,n:byte;
Begin
n:=length(chuoi);
For i:=2 to n do
For j:=n downto i do
if (chuoi[j]>chuoi[j-1]) then
hoanvi(chuoi[j],chuoi[j-1]);
XepGiam:=chuoi;
End;
BEGIN
assign(F, Fi); reset(F);
readln(F,k); readln(F,S); Close(F);
tachchu_so;
assign(F, Fo); rewrite(F);
if so='' then writeln(F,'-') else
if k=0 then writeln(F,XepTang(so))
else writeln(F,XepGiam(so));
</div>
<span class='text_page_counter'>(44)</span><div class='page_container' data-page=44>
Begin
n:=length(chuoi);
For i:=2 to n do
For j:=n downto i do
else write(F,XepGiam(chu));
Close(F);
END.
<b>Bài 35: X</b>
<b>ếp khách</b>
M
ột khách sạn có N ph
ịng
đơi (ph
ịng cho 2 ng
ười) được đánh số từ 1 đến N. Khi có
m
ột đồn khách đến thu
ê phòng, ti
ếp tân của khách sạn sẽ xếp khách v
ào phòng theo
nguyên t
ắc sau: mỗi cặp khách sẽ được xếp v
ào phòng có ch
ỉ số nhỏ nhất trong số các
phòng tr
ống. Nếu số lượng khách của đo
àn là s
ố lẻ th
ì ng
ười cuối c
ùng c
ủa đo
àn khách s
ẽ
được xếp v
ào phịng có ch
ỉ số nhỏ nhất trong số các ph
òng còn tr
ống. Nếu khơng c
ịn phịng
tr
ống th
ì s
ố khách chưa có ph
ịng s
ẽ được xếp tuầ
n t
ự từng người một v
ào phòng có ch
ỉ số
nh
ỏ nhất trong số các ph
ịng m
ới có một khách (của đoàn khách trước đó). Đầu ti
ên các
phịng c
ủa khách sạn đều trống v
à gi
ả thiết rằng, khơng có 2 đoàn khách nào đến khách sạn
cùng th
ời điểm v
à t
ổng số khách của tất cả
các đồn khơng vượt quá sức chứa của khách sạn
(
2N).
Yêu c
ầu
Cho trước tr
ình t
ự đến của các đo
àn khách và s
ố lượng khách của mỗi đo
àn. Hãy xác
định số lượng khách trong mỗi ph
òng c
ủa khách sạn.
<b>- D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản ROOMS.INP
+ Dòng
đầu ti
ên ch
ứa
2 s
ố nguyên dương N (1<=N<=100) và G được ghi cách nhau
b
ởi dấu cách. N l
à s
ố ph
òng c
ủa khách sạn, G l
à s
ố lượng đồn khách đến khách sạn.
+ Dịng th
ứ i trong số G d
òng ti
ếp theo chứa số lượng khách của đo
àn khách th
ứ i
(các đoàn khách được đánh số theo số
th
ứ tự đến khách sạn, bắt đầu từ 1).
<b>- K</b>
<b>ết quả:</b>
file văn bản ROOMS.out gồm N d
òng. Dòng th
ứ i chứa số lượng khách
c
ủa ph
òng th
ứ i (1 <= i <= N).
Ví d
ụ:
rooms.inp
rooms.out
7 3
3
1
4
2
1
1
2
2
0
0
<b>ĐÁP ÁN, CHẤM</b>
<b>Test rooms.inp </b> <b>rooms.out </b> <b>Điểm </b>
1 8 4
1
5
3
6
2
2
2
2
2
1
2
2
1
2 10 7
3
4
2
6
2
2
2
2
2
</div>
<span class='text_page_counter'>(45)</span><div class='page_container' data-page=45>
2
2
1
2
2
2
2
2
3 10 5
3
2
7
2
1
2
1
2
2
2
2
1
2
1
0
1
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
PROGRAM XepKhach;
Const
max=1001;
Fi='Rooms.inp';
Fo='Rooms.out';
Var
P:array[0..max] of 0..2;
n,g,t,t1,i,x:integer;
F:text;
{---}
BEGIN
assign(F,Fi); reset(F);
readln(F,n,g);
t:=0;
FillChar(P,SizeOf(P),0);
for i:=1 to g do
begin
readln(F,x);
while (t<n) and (x>1) do
begin
inc(t);
P[t]:=2;
dec(x,2);
end;
if (x=1) and (t<n) then
begin
inc(t);
P[t]:=1;
dec(x);
end;
if (t=n) and (x>0) then
begin
t1:=0;
while (P[t1]<>1) and (t1<n) do
begin
inc(t1);
if (P[t1]=1) and (x>0) then
begin
P[t1]:=2;
dec(x);
end;
end;
end;
end;
Close(F);
assign(F,Fo); Rewrite(F);
for i:=1 to n do Writeln(F,P[i]);
Close(F);
END.
<b>Bài 36:</b>
<b>S</b>
<b>ắp xếp d</b>
<b>ãy s</b>
<b>ố </b>
Cho dãy s
ố nguy
ên a
1
, a
2
, …, a
N
, v
ới N ≤ 1.000
<i><b>Yêu c</b></i>
<i><b>ầu: </b></i>
Hãy tìm cách th
ực hiệ
n m
ột số ít nhất phép đổi chỗ 2 số hạng bất kỳ của d
ãy
để thu được d
ãy s
ố m
à s
ố lẻ đứng ở vị trí lẻ, số chẵn đứng ở vị trí chẵn.
<i><b>- D</b></i>
<i><b>ữ liệu v</b></i>
<i><b>ào: file văn bản DAYSO.INP </b></i>
+ Dòng
đầu ti
ên ch
ứa số nguyên dương N.
+ Dòng th
ứ i trong số N d
òng ti
ếp theo chứa số
h
ạng a
i
c
ủa d
ãy s
ố đ
ã cho (-32767
≤
a
i
≤
32767, i = 1, 2, …, N).
<i><b>- K</b></i>
<i><b>ết quả:</b></i>
file văn bản DAYSO.OUT. D
òng
đầu ti
ên ghi s
ố lượng phép đổi chỗ cần được
</div>
<span class='text_page_counter'>(46)</span><div class='page_container' data-page=46>
Ví d
ụ:
DAYSO.INP DAYSO.OUT DAYSO.INP DAYSO.OUT
6
1
2
3
4
6
5
1
5 6
4
1
3
2
5
-1
<b>ĐÁP ÁN, CHẤM</b>
<b>Test </b>
<b>DAYSO.INP </b>
<b>DAYSO.OUT </b>
<b>Điểm </b>
1
6
10
12
14
13
15
11
2
1 4
3 6
1
2
6
10
12
14
15
16
13
-1
1
<b>CỘNG </b>
<sub>2 </sub>
<b>Ph</b>
<b>ụ lục chương tr</b>
<b>ình tham kh</b>
<b>ảo</b>
Program SapXepDaySo;
Const
max=100;
fi='Dayso.inp';
fo='Dayso.out';
Var
A:array[1..max] of 0..2;
d1,d2,n:integer;
f:text;
procedure Nhap;
var i,x:integer;
begin
assign(f,fi); reset(f);readln(f,n);
d1:=0; d2:=0;
for i:=1 to n do
begin
readln(f,x);
if x mod 2=0 then
if i mod 2=0 then A[i]:=0 else
begin A[i]:=2;inc(d2); end;
if x mod 2=1 then
if i mod 2=1 then A[i]:=0 else
begin A[i]:=1;inc(d1); end;
end;
Close(f);
end;
procedure XuLy;
var i,j,k:integer;
begin
assign(f,fo); Rewrite(f);
if d1<>d2 then
begin
write(f,-1); Close(f); halt;
end;
writeln(f,d1);
for k:=1 to d1 do
begin
i:=1; j:=1;
while A[i]<>1 do inc(i);
while A[j]<>2 do inc(j);
if (A[i]=1) and (A[j]=2) then
begin
A[i]:=0; A[j]:=0;
if i<j then write(f,i,' ',j) else
writeln(f,j,' ',i);
end;
end;
Close(f);
end;
</div>
<span class='text_page_counter'>(47)</span><div class='page_container' data-page=47>
<b>Bài 3: Chu</b>
<b>ỗi chuẩn</b>
(2 điểm)
Chu
ỗi chuẩn l
à chu
ỗi được qui định:
-
Đầu chuỗi phải l
à m
ột ký tự chữ (‘a’ .. ‘z’ hoặc ‘A’ .. ‘Z’).
- Các d
ấu câu (chấm, phẩy, hai chấm, chấm than, chấm hỏi, chấm phẩy) đi liền với
ch
ữ trước nó, sau dấu câu th
ì có m
ột ký tự
tr
ắng v
à ký t
ự đầu ti
ên ti
ếp theo viết thường (nếu
sau d
ấu phẩy, dấu chấm phẩy v
à d
ấu hai chấm), viết hoa nếu dấu câu khác.
- Cu
ối câu l
à d
ấu chấm.
Trong m
ột đoạn văn nếu không tính tới các lỗi sai về chính tả m
à ch
ỉ tính các lỗi sai
nêu trên thì hãy vi
ết chương tr
ình s
ửa lỗi đó.
<b>D</b>
<b>ữ liệu v</b>
<b>ào:</b>
file văn bản IN.INP chứa đoạn văn
<b>D</b>
<b>ữ liệu ra: </b>
file văn bản OUT.OUT chứa đoạn văn bản chuẩn
Ví d
ụ:
IN.INP OUT.OUT
! , chung ta ,toi va moi nguoi,minh
cung lam cho toi !cong viec .neu chua tot
se bi khien trach ;:’
Chung ta, toi va moi nguoi, minh
cung lam cho toi! Cong viec. Neu
chua tot se bi khien trach.
<b>ĐÁP ÁN, CHẤM</b>
<b>IN.INP </b> <b>OUT.OUT </b>
!: \? , ,tOi va moi ngUOi.chung
mInh , Phai cung lam ; cho tot ?cONg
viec ! neu chua tot, se bi :cap TRen
KHIEN trach ,Phe binh ;: / !’
Toi va moi nguoi. Chung minh, phai cung
lam; cho tot? Cong viec! Neu chua tot,
se bi: cap tren khien trach, phe binh.
Program ChuoiChuan;
const inFile='in.inp';outFile='out.out';
var s:string;f: text;
<b>procedure Nhap; </b>
begin
assign(f,inFile); reset(f);
readln(f,s); close(f);
end;
<b>procedure Xuat; </b>
begin
assign(f,outFile); rewrite(f);
write(f,s); close(f);
end;
<b>Procedure CatDauChuoi; </b>
var kt:boolean;
begin
kt:=false;
while not kt do
if lowercase(s[1]) in ['a'..'z']
then kt:=true else
begin delete(s,1,1); kt:=false; end;
end;
Procedure CatCuoiChuoi;
var kt:boolean;
begin
kt:=false;
while not kt do
if lowercase(s[length(s)]) in
['a'..'z'] then kt:=true else begin
<b>Function </b>
<b>CatKhoangTrang(chuoi:string):string; </b>
var i:integer; kt:boolean;
Begin
i:=2; kt:=false;
while (i<length(chuoi)) and
(kt=false) do
begin
if (chuoi[i]=' ') and
(chuoi[i+1]=' ') then
begin
delete(chuoi,i+1,1);
CatKhoangTrang:=CatKhoangTrang(chuoi);
kt:=true;end;inc(i);end;
if kt=false then
CatKhoangTrang:=chuoi;
End;
<b>procedure ChuanChuoi; </b>
var i: integer;
begin
s:=lowercase(s);
s:=CatKhoangTrang(s);
s[1]:=Upcase(s[1]);i:=2;
while i<=length(s) do
begin
if (s[i]=',') or (s[i]=':') or
(s[i]=';') then
s[i+2]:=lowercase(s[i+2]);
if (s[i]='.') or (s[i]='!') or
(s[i]='?') then s[i+2]:=Upcase(s[i+2]);
inc(i);
</div>
<span class='text_page_counter'>(48)</span><div class='page_container' data-page=48>
delete(s,length(s),1);kt:=false;end;
end;
<b>procedure XuLy; </b>
var i: integer;
begin
CatDauChuoi;
CatCuoiChuoi;
i:=1;
while i<=length(s) do
begin
if (s[i]=',') or (s[i]=':') or
(s[i]=';') or (s[i]='!') or (s[i]='?')
or (s[i]='.') then
begin
while s[i-1]=' ' do
begin
dec(i);
delete(s,i,1);
end;
while s[i+1]<>' ' do insert('
',s,i+1);
end;
inc(i);
end;
end;
insert('.',s,length(s)+1);
end;
BEGIN
Nhap;
XuLy;
ChuanChuoi;
Xuat;
END.
</div>
<!--links-->