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

Tài liệu ôn tập thi Tin học trẻ

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

<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-->

×