ôn tập tin học pascal tham khảo - Pdf 23

NHẮC LẠI KIẾN THỨC CƠ BẢN TRONG PASCAL
I.Cấu trúc điều khiển
1.Cấu trúc rẽ nhánh if…then
a.Dạng thiếu if <Điều kiện> then <Câu lệnh>;
*Hoạt động: Kiểm tra điều kiện, nếu điều kiện đúng thì thực hiện Câu lệnh
b.Dạng đủ If <Điều kiện> then <Câu lệnh 1>
Else <Câu lệnh 2>;
*Hoạt động: Kiểm tra điều kiện, nếu điều kiện đúng thì thực hiện Câu lệnh 1, điều kiện sai thì
thực hiện Câu lệnh 2.
2.Câu lệnh rẽ nhánh Case…of
*Cú pháp: Case <Biểu thức số nguyên hoặc kí tự> of
<Danh sách 1>: Câu lệnh 1;
<Danh sách 2>: Câu lệnh 2;
…….
<Danh sách n>: Câu lệnh n
[Else Câu lệnh n+1];
End;
*Hoạt động: Khi gặp câu lệnh case…of máy tính tính giá trị biểu thức nếu trả về giá trị nào
thì thực hiện câu lệnh tương ứng trong danh sách, nếu khác thì thực hiện câu lệnh n+1.
*Ví dụ: Nhập vào 2 số nguyên là tháng và năm. Cho biết tháng đó có bao nhiêu ngày?
Program vidu1;
Uses crt;
Var T,N,SN:integer;
Begin
Clrscr;
Write(‘Nhap thang va nam’); readln(T,N);
Case T of
4,6,9,11: SN:=30;
2: if (N mod 400=0) or ((N mod 100<>0) and (N mod 4=0)) then SN:=29
Else SN:=28;
Else SN:=31;

Var A:array[1 9,1 10] of integer;
i,j:integer;
begin
for i:=1 to 9 do
for j:=1 to 10 do
a[i,j]:=i*j;
2
for i:=1 to 9 do
begin
for j:=1 to 10 do
write(a[i,j]:4);
writeln;
end;
readln;
end.
*Bài tập về nhà:
Bài 1:Cho mảng 2 chiều m hàng, n cột. Hãy điền các số nguyên dương từ 1 đến m*n vào
mảng 2 chiều sao cho mảng được sắp thứ tự theo hình vẽ: (ví dụ m=3, n=4 thì mảng có
dạng sau:
1 2 3 4
8 7 6 5
9 10 11 12
Bài 2: Nhập vào số nguyên dương N (2<N<10000) và một dãy a1, a2,….an các phần tử
nguyên dương. Cho biết dãy trên có bao nhiêu phần tử khác nhau.
Bài 3: Cho N gói kẹo (N<200) đánh số từ 1 đến N, gói kẹo thứ i có ai cái kẹo(ai<200). Hãy
sắp các gói kẹo thành 2 phần sao cho độ chênh lệch nhau là ít nhất.
*Chữa bài tập về nhà
Bài 1: Gợi ý dùng vòng for để điền các số vào mảng
Nếu chỉ số hàng lẻ thì ta điền theo chỉ số cột tăng
Nếu chỉ số hàng chẵn thì ta điền theo chỉ số cột giảm

for j:=1 to n do
begin
a[i,j]:=T;
inc(T);
end;
end
else
for j:=n downto 1 do
begin
a[i,j]:=T;
inc(T);
end;
end;
for i:=1 to m do
begin
for j:=1 to n do
write(a[i,j]:4);
writeln;
end;
readln
end.
4
Bài 2: Để làm bài này ta dùng thuật toán “lùa bò vào chuồng”, Các phần tử bằng nhau sẽ nhốt
chung một chuồng, có bao nhiêu chuồng thì có bấy nhiêu phần tử khác nhau trong dãy ban
đầu.
Ta đóng dãy chuồng C, đánh số chuồng lần lượt từ 1,2….32000 ( ai là các số nguyên dương,
ai<32000), ban đầu các chuồng đều trống) Duyệt mảng A ban đầu, phần tử ai sẽ được “nhốt”
vào chuồng có số ai (tăng C[a[i]] lên một đơn vị) Đếm số chuồng khác trống đó chính là số
phần tử khác nhau của dãy ban đầu.
……

tổng lớn nhất về tổng nhỏ nhất là 0). Mỗi khi sinh ra tổng mới, cần ghi nhớ số hiệu vừa gộp
vào để có tổng mới này.

Từ điểm X là điểm đánh dấu nửa tổng tất cả số kẹo (Nếu có) hoặc điểm đánh dấu gần x nhất
(Nếu X không được đánh dấu) biết được gói cuối cùng thêm vào, trừ đi số kẹo của gói đó ta
đến tổng mới, lại biết số kẹo nào vừa thêm vào để tạo ra tổng mới này….Quá trình tiếp tục
khi ta về điểm đánh dấu 0.
Chương trình sau lay dl từ tệp chiakeo.int sau do ket qua ghi ở tệp chiakeo.out
program chiakeo;
uses crt;
const fi='chiakeo.int'; fo='chikeo.out';
maxn=200; maxk=200; maxs=40000;
type m1=array[0 maxs] of byte;
m2=array[1 maxn] of byte;
var a:m2;
t:m1;
sum:word;
n:byte;
{ }
procedure nhap;
var f:text; i:byte;
begin
sum:=0;
assign(f,fi); reset(f);
readln(f,n); {so goi keo lan n}
for i:=1 to n do
6
begin
read(f,a[i]);
sum:=sum+a[i]; {sum la tong so keo}

repeat
kq[t[tong]]:=1;
tong:=tong-a[t[tong]]
until tong=0;
for i:=1 to n do
if kq[i]=1 then write(f,'Cac goi thuoc phan 1 ',i,' ');
writeln(f);
for i:=1 to n do
if kq[i]=0 then write(f,'Cac goi thuoc phan 2 ',i,' ');
close(f);
end;
{ }
Begin
clrscr;
nhap;
danhdau;
timkq;
end.
3.Kiểu xâu.
*Khai báo Var <biến xâu>:string[độ dài];
* Một số hàm và thủ tục liên quan đến xâu
-Length(S): Cho độ dài xâu S
-Upcase(ch): Cho kí tự in hoa ứng với ch
-Pos(s1,s2): Cho vị trí xuất hiện đầu tiên của S1 trong S2, nếu s1 không có trong s2
hàm cho giá trị 0.
-Insert(s1,s2,vt): Chèn xâu s1 vào xâu s2 tại vị trí vt
-Delete(s,vt,n): Xóa trong xâu s n kí tự từ vị trí vt
-Copy(s,vt,n): Sao chép trong xâu S n kí tự từ vị trí vt
-str(x,s): Biến đối số x thành 1 xâu kí tự biểu diễn số đó.
-Val(s,x,loi): Đổi xâu s thành số chứa trong x, nếu đổi thành công loi nhận giá trị 0,

S1=’aabbbccccb’ và xâu S2=’aabccccaaaaa’ là bạn bè. Viết chương trình nhập 2 xâu từ bàn
phím, kiểm tra 2 xâu có là bạn bè không?
Thuật toán: Ta đổi 2 xâu thành chữ in hoa, tạo 2 tập hợp t1, t2 rỗng. Duyệt xâu s1 kiểm tra
từng kí tự nếu kí tự đang xét s1[i] chưa có trong tệp t1 thì thêm kí tự này vào tệp. Tương tự
với xâu s2 và tập hợp t2. So sánh 2 tập hợp nếu chúng bằng nhau thì kết luận 2 xâu là bạn bè.
9
uses crt;
type kt=set of char;
var t1,t2:kt;
s1,s2:string;
i,n,m,j:byte;
begin
clrscr;
writeln('Nhap xau 1='); readln(s1);
writeln('Nhap xau 2='); readln(s2);
for i:=1 to length(s1) do s1[i]:=upcase(s1[i]);
for j:=1 to length(s2) do s2[j]:=upcase(s2[j]);
t1:=[]; t2:=[];
for i:=1 to length(s1) do if not(s1[i] in t1) then t1:=t1+[s1[i]];
for j:=1 to length(s2) do if not(s2[j] in t2) then t2:=t2+[s2[j]];
if t1=t2 then writeln('Hai xau la ban be ')
else writeln('Hai xa khong la ban be');
readln
end.
Bài 2: Như các bạn đã biết dãy số Fibonaci là dãy 1, 1, 2, 3, 5, 8, Dãy này cho bởi công
thức đệ qui sau:
F
1
= 1, F
2





phải là số

nguyên tố

hay
không?
Với bài này các em viết một hàm kiểm tra tính nguyên tố của một số dương n bất kỳ, hàm
trả về giấ trị True nếu N nguyên tố, ngược lại hàm trả về giá trị False
Function NT(n:longint):Boolean;
Var i:longint; kq:boolean;
Begin
If

(n=0) or (n=1) then
kq:=false
Else
i:=1;
Repeat
i:=

i+1;
Until

(n mod

i= 0) or

var i:longint; kq:boolean;
begin
if (n=0) or (n=1) then kq:=false
else begin
i:=1;
repeat
i:=i+1;
until (n mod i=0) or (i*i>n);
if i*i>n then kq:=true
else kq:=false;
end;
NT:=kq;
end;
begin
clrscr;
writeln('Nhap so n='); readln(N);
if n<2 then writeln('Khong co so nt nao nho hon ',n)
else
for i:=2 to N do if NT(i) then write(i:4);
readln
end.
Thuật toán này dễ cài đặt nhưng có hạn chế là thời gian thực hiện lâu vì với mỗi số lại phải
kiểm tra lần lượt các ước của nó do vậy thời gian thực hiện được tính là n
2
. Với n càng lớn
thời gian thực hiện sẽ lâu. Có một thuật toán được xem là tốt hơn đó là thuật toán sàng các số
nguyên tố.
Biểu diễn các só nguyên trên trục số bắt đầu từ số 2 đến N sau đó tìm cách xóa dần các điểm
biểu diễn hợp số, các điểm còn lại trên trục số sẽ biểu diễn số nguyên tố. cụ thể:
-Ban đầu tất cả các điểm nguyên trên trục số chưa bị xóa;

F
1
= 1, F
2
=1, F
n
= F
n-1
+ F
n-2
với n > 2
1. Chứng minh khẳng định sau:
Mọi số tự nhiên N đều có thể biểu diễn duy nhất dưới dạng tổng của một số số trong dãy số
Fibonaci.
N = a
k
F
k
+ a
k-1
F
k-1
+ a
1
F
1
Với biểu diễn như trên ta nói N có biểu diễn Fibonaci là a
k
a
k-1

begin
Assign(hfi, Inp);
Reset(hfi);
Assign(hfo, Out);
Rewrite(hfo);
while not Eof(hfi) do
begin
Readln(hfi, n);
Write(hfo, n, ' = ');
i := Ind; while Fibo[i] > n do Dec(i);
Write(hfo, Fibo[i]);
Dec(n, Fibo[i]); { giảm n Fibo[i] đơn vị}
while n > 0 do
begin
Dec(i);
if n >= Fibo[i] then
begin
Write(hfo, ' + ', Fibo[i]);
Dec(n, Fibo[i]);
end;
end;
Writeln(hfo);
end;
Close(hfo);
Close(hfi);
end;
begin
Init;
Solution;
end.

SUM:=SUM+GT(x);
n:=n div 10;
end;
write('Giai thua cua ',t,'=',sum);
readln
end.
Bài 7: (Đề thi HSG tỉnh năm 2010-2011) Dãy số Fibinaci
Cho số nguyên dương N (N<=2.10
9
). Hãy kiểm tra xem n có là số thuộc dãy Fibinaci không?
Nếu có thì là số bao nhiêu trong dãy?
Yêu cầu hs dựa vào chương trình bài 5 tự viết chương trình.
{$R+}
uses crt;
const
Ind = 46;
var
n: LongInt;
Fibo: array[1 Ind] of LongInt;
procedure Init;
var
i: LongInt;
begin
Fibo[1] := 1; Fibo[2] := 1;
for i := 3 to Ind do Fibo[i] := Fibo[i - 1] + Fibo[i - 2];
end;
procedure Solution;
var
i: LongInt;
begin

end;
GT:=T;
end;
begin
write('Nhap n='); readln(N);
SUM:=GT(n);
t:=0;
str(SUM,s); {Hàm str(SUM,s) đổi số SUM thành xâu S để đếm số 0 ở cuối xâu}
i:=length(s);
while s[i]='0' do
begin
inc(t);
dec(i);
end;
writeln('Cho so o tan cung cua ',N,'=',t);
readln
end.
Buổi 5. Một số bài tập
Bài 1:
Bài tập tìm các số siêu nguyên tố có n chữ số
Bài này có thuật toán không đệ quy
Tạo các số siêu nguyên có i chữ số từ các số siêu nguyên tố có i-1 chữ số
Code
Khởi tạo a mảng chứa các số nguyên tố 1 9
Gs: có đem so trong a
For i:=2 to N do
Begin
For j:=1 to dem do
{tạo mảng b số siêu nguyên tố có i chữ số dựa vào i-1)
For k:=0 to 9 do

clrscr;
writeln('Nhap n='); readln(n);
dem:=1;
a[1]:=0;
for i:=1 to N do
begin
t:=0;
for j:=1 to dem do
for k:=0 to 9 do
begin
x:=a[j]*10+k;
if Prime(x) then
begin
t:=t+1;
b[t]:=x;
end;
end;
a:=b;
dem:=t;
end;
for i:=1 to t do
begin
write(a[i],' ');
if i mod 10=0 then writeln;
end;
writeln;
writeln('co ',t,' so sieu nguyen to');
readln
end.
Bài 2 (Đề thi HSG Tỉnh năm 2009-2010)

Var
cs:array[1 7] of longint = (9,180,2700,36000,450000,5400000,63000000);
n:longint;
f,g:text;
Function num(n:longint):char;
Var
k,so,mu:longint;
s:string;
Begin
k:=1;
mu:=1;
While (k<9) and (cs[k]<n) do
Begin
n:=n-cs[k];
inc(k);
mu:=mu*10;
End;
If mu=1 then
so:=n div k
Else
so:=n div k+mu+ord(n mod k>0)-1;
Str(so,s);
s:=s[k]+s;
num:=s[n mod k + 1];
End;
Begin
Assign(f,fi);
Reset(f);
Assign(g,fo);
Rewrite(g);

màn hình
uses crt;
var st: string;
j,n,d,x: longint;
i: integer;
begin
clrscr;
write('Nhap n: ');readln(n);
i:=1;
j:=1;
d:=9;
x:=0;
while (n > d) do
begin


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status