- 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.[r]
Trang 1TÀI LIỆU ÔN TẬP
TIN HỌC TRẺ
(Free Pascal)
Biên soạn: KS Nguyễn Thanh Sang
0908 811 528 nguyenthanhsang.1980@gmail.com
Tháng 05/2017
Tài liệu có sử dụng tư liệu từ internet và đồng nghiệp
Trang 2TÀI LIỆU ÔN TẬP
TIN HỌC TRẺ
(Free Pascal)
Biên soạn: KS Nguyễn Thanh Sang
0908 811 528 nguyenthanhsang.1980@gmail.com
Trang 3BẢNG B (THCS) VÀ BẢNG C (THPT)
Lập trình bằng FREE PASCAL để giải các bài toá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)
I CÁC THÀNH PHẦN CƠ BẢN CỦA FREE PASCAL:
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
then
to true type unit until uses var while with xor
Trang 4Exp
Ln Odd Ord Round Trunc Spr Pred Succ Dispose New Get Put Read readln
Write Writeln Reset Rewrite
5 Danh hiệu (identifier) tự đặt:
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
6 Các phím chức năng cần biết:
- 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
I CẤU TRÚC CỦA MỘT CHƯƠNG TRÌNH FREE PASCAL:
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
Type…; Khai báo kiểu
Trang 5Var…; Khai báo biến
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
* Giải thích:
- 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 “.”
III MỘT VÀI CHƯƠNG TRÌNH ĐƠN GIẢN LÀM QUEN VỚI FREE PASCAL:
Ví dụ 1:
Trang 6Program 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
* Giải thích chương trình GioiThieu:
- 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
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
* Giải thích chương trình GioiThieu:
- 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
- Readln: dừng màn hình xem kết quả
Trang 7- End: cho biết kết thúc chương trình
IV MỘT VÀI KIỂU DỮ LIỆU CƠ BẢN CỦA FREE PASCAL:
Dữ liệu (data) là tất cả những gì mà máy tính xử lý
Chương trình = thuật toán + cấu trúc dữ liệu
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 (file)
- Kiểu con trỏ (pointer)
1 Kiểu số nguyên (Integer Type):
* Từ khóa: Free Pascal đã khắc phục được những bài toán số lớn trong Turbo Pascal 7.0:
0 65535 smallint - longint
longword -2147483648 2147483647
0 4294967295 -9223372036854775808 9223372036854775807
succ(n) n + 1 (tăng n lên 1 đơn vị)
odd(n) TRUE nếu n lẻ, FALSE nếu n chẵn
2 Kiểu số thực (Real type):
Trang 8* Từ khóa: 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
Abs(x) Lấy trị tuyệt đối của số x
Sqrt(x) Lấy căn bậc hai 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
3 Kiểu logic (Boolean):
* Các phép toán: thể hiện qua 2 giá trị TRUE (đúng) và FALSE (sai) Qui ước TRUE >
FALSE
False False True False False False
- Phép AND: Cho kết quả TRUE khi A=B=TRUE
Trang 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
4 Kiểu ký tự (Char type) :
* Từ khóa: 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
* Các hàm chuẩn:
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
V CÁC HÀM THÔNG DỤNG TRONG PASCAL
HÀM THÔNG DỤNG
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) căn bậc 2 của x
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) Tăng biến nguyên X lên 1 đơn vị
Delay(Tine) Tạo ra thời gian trễ time (miligiay) Time là một số
Trang 10HÀM CHỨC NĂNG
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 toàn bộ dòng màn hình chứa con trỏ sau đó dồn các
dòng ở dưới lên
Exit Thoát vô điều kiện ra khỏi chương trình
Halt Dừng hẳn chương trình
Break Thoá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) Đổi ký tự ch thà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) Đổi chuỗi S thành sô x.Nêu đổi chuỗi thành công biên
Code nhận giá trị 0 Nêu không đổi đc,code là sô nguyên cho biêt vtrí gây lỗi
INC(x,r) Tăng giá trị của x nên r đơn vị Tương đương với x=x+r;
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) Xoá L ký tự từ vị trí P ra khỏi
Break kết thúc vòng lặp
Copy(S,P,L) Trích chuỗi S một chuỗi con dài L ký tự bắt đầu từ vtrí
P
Trang 11HÀM CHỨC NĂNG
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
NormVideo Định độ sang bình thường
LowVideo Định độ sáng yếu đi
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 Đọc một kí tự từ bàn phím vào biến
XỬ LÝ FILE (với F1 là biến kiểu file)
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
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)
SeekEOF(F1) Kiểm tra EOF, có bỏ qua các dấu cách Space, Tab và
dấu cách dòng (File văn bản)
Trang 12HÀM CHỨC NĂNG
SeekEOLn(F1) Kiểm tra EOLn, có bỏ qua các dấu cách Space và Tab
(File 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) Xoá file, không được xoá một file đang mở
Rename(F1, tên mới) Đổi tên file F1 thành tên mới, không được đổi tên file
VI PHẦN BÀI TẬP THAM KHẢO
Cấu trúc chương trình dùng file văn bản cho nhập và xuất dữ liệu:
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
Thủ tục đọc dữ liệu từ File văn bản:
Trang 13For i:=1 to N do writeln(F,A[i]);
Close(F);
End;
Bài 1: Tìm mối liên hệ
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
- Dữ liệu vào: file văn bản moilienhe.inp chứa số tự nhiên N (N41.108)
- Dữ liệu ra: file văn bản moilienhe.out 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:
Trang 14Bài 2: Tìm mối liên hệ
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
- Dữ liệu vào: file văn bản moilienhe.inp chứa số nguyên dương N
Writeln(F,((n-1) div 2)*n);
close(F);
END
Bài 3: In dãy số xuất hiện từ k lần trở lên
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ữ ‘NO’
- Dữ liệu vào: từ file văn bản indayso.inp 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)
- Dữ liệu ra: file văn bản indayso.out 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:
Trang 15xuly;
END
Bài 4: Đổi số hệ nhị phân sang hệ thập phân
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
- Dữ liệu vào: file văn bản 2to10.inp chứa chuổi nhị phân S (dài không quá 63 ký tự)
- Dữ liệu ra: file văn bản 2to10.out chứa kết quả là số thập phân vừa đổi từ chuổi S Xem
read(F,St); close(F);
D2_10(St);
assign(F,'2to10.out'); rewrite(F); write(F,N); close(F);
END
Trang 16Bài 5: Tìm ẩn
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]
- Dữ liệu vào: file văn bản timan.inp chứa số nguyên dương n (n < 119)
- Dữ liệu ra: file văn bản timan.out 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:
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 hoán vị) Nếu không có cặp M, N nào thì điền số 0
- Dữ liệu vào: file văn bản solaban.inp chứa số nguyên dương K
- Dữ liệu ra: file văn bản solaban.out 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ụ:
Trang 17while i<= (k div 2) do begin if (k
mod i) =0 then tong:=tong+i; inc(i);
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ài 6: Chuỗi Fibo nhị phân
Xét dãy các xâu F1, F2, F3, , FN, trong đó: F1 = ‘0’, F2 = ‘1’, F3 = ‘01’, F4 = ‘100’, F5
= ‘01110’, FK+1 = FK + FK-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 FK (Chú ý: hai lần xuất hiện của S trong FK không nhất thiết phải
là các xâu rời nhau hoàn toàn)
- Dữ liệu vào: file văn bản fibo01.inp bao gồm i dòng, mỗi dòng có dạng K S (K và S
cách nhau đúng 01 khoảng cách)
- Dữ liệu ra: file văn bản fibo01.out, 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ụ:
Trang 18Dem:=0;
while i<= 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);
Bài 7: Phân tích số hoàn hảo
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:
- Dữ liệu vào: file văn bản sohoanhao.inp chứa số nguyên dương N (N10.107)
- Dữ liệu ra: file văn bản sohoanhao.out 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:
Trang 19str(i,st);
if hoanhao='' then hoanhao:=st else hoanhao:=hoanhaớ '+st;
assign(F, Fo); rewrite(F);
write(F,hoanhao(n)); Close(F);
END
Bài 8: Đảo ký tự
Đả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ự “abc” thì kết quả đảo ký tự sẽ là các chuỗi “abc”, “acb”, “bac”, “bca”, “cab”, “cba”)
Yêu cầu: viết chương trình thực hiện đảo ký tự như cách trên
- Dữ liệu vào: tệp văn bản daokytụinp 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ự);
- Dữ liệu ra: tệp văn bản daokytụout 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ụ:
daokytụinp daokytụout
2
ab cde
ab
ba cde ced dce dec ecd edc
1
Trang 20Test daokytu.inp daokytu.out Điểm
eKt etK tKe teK
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;
close(fi);close(fo);
END
Trang 21Bài 9: Đếm tam giác cân
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?
- Dữ liệu vào : 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 <=100) nguyên thể hiện tọa độ điểm thứ
Trang 22Test demtgcan.inp demtgcan.out Điểm
(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;
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
y[i])*(y[j]-y[i]);
y[j])*(y[k]-y[j]);
y[k])*(y[i]-y[k]);
if (d1=d2) or (d2=d3) or (d3=d1) then inc(dem);
end;
end;
Xuat;
END
Bài 10: Chuỗi Fibonacci
Xét dãy các xâu F1, F2, F3, , FN, trong đó: F1 = 'A', F2 = 'B', FK+1 = FK + FK-1 (K 2)
Trang 23- Dữ liệu vào: 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
- Dữ liệu ra: đư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ụ:
Trang 24Test fibistr.inp fibistr.out Điểm
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}
Solve := F[n];
Exit;
end;
OddCount := Count(Copy(OddCenter, OddP - t, t + t));
EvenCount := Count(Copy(EvenCenter, EvenP - t, t + t));
for i := k + 2 to n do