1. Trang chủ
  2. » Giáo án - Bài giảng

Bài tập pascal nâng cao (có lời giải)

113 13,6K 61

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 113
Dung lượng 457 KB

Nội dung

Các phần tử của bảng được điền theo qui luật sau: - Phần tử góc trái dưới được điền số đầu tiên: 0 1... - Các số tiếp theo của bảng sẽ được điền theo thứ tự từ dưới lên và từ trái qua ph

Trang 1

1 Cho số tự nhiên N và số tự nhiên k Tính chữ số thứ k trong biểu diễn thập phân của số N

Các phần tử của bảng được điền theo qui luật sau:

- Phần tử góc trái dưới được điền số đầu tiên: 0

1

Trang 2

- Các số tiếp theo của bảng sẽ được điền theo thứ tự từ dưới lên và từ trái qua phải theo nguyên tắc: số được điền sẽ là số nguyên không âm nhỏ nhất chưa được điền của các hàng và cột chứa ô hiện tại.

a Chứng minh rằng các ô trên đường chéo chính (45 độ) sẽ chứa toàn số không

b Bảng số trên sẽ đối xứng qua đường chéo trên

c Viết chương trình điền các số của bảng trên trong mảng 2 chiều NxN với N nhập từ bàn phím

3 a Ta chứng minh a[n,n]=0 (1) bằng qui nạp tiến theo n.

Với n=1 ta có a[1,1]=0 vì là phần tử góc trái dưới

Giả sử (1) đúng đến n, ta phải chứng minh (1) đúng với n+1, nghĩa là a[n+1,n+1]=0

Thực vậy, khi điền phần tử a[n+1, n+1] ta để ý rằng các phần tử đã điền ở cột thứ n+1, tức là các phần tử dạng a[k, n+1], k=1, 2, , n không thể là số 0 được vì trên các hàng thứ k (k=1, 2, n) đã có a[k,k]=0; tương tự như vậy: các phần tử đã điền ở hàng thứ n+1 dạng a[n+1,k], (k=1, 2, n), cũng không thể bằng 0 vì trên các cột thứ k (k=1, 2, n) đã có các phần tử đường chéo a[k, k]=0 Như vậy số 0 chính là số nguyên không âm nhỏ nhất chưa được điền trên hàng thứ n+1, và cột thứ n+1 Do đó a[n+1, n+1]=0

Vậy (1) đúng với mọi n = 1, 2,

b Để chứng minh a[i, j] = a[j, i] (2) ta để ý rằng trường hợp i=j thì a[i, i] = a[i, i] là hiển nhiên, như vậy ta chỉ cần chứng minh (2) cho i ạ j Không mất tính tổng quát ta giả sử i>j, tức

là phần tử a[j, i] được điền trước phần tử a[i, j]

Ta chứng minh a[i, j] =a[j, i] (2), i>j bằng qui nạp tiến theo thứ tự điền các phần tử

Với j=1, i=2 rõ ràng a[2, 1] = a[1, 2]

Giả sử (2) đúng đến a[i,j] và i>j+1, ta phải chứng minh (2) đúng với a[i,j+1], nghĩa là a[i,j+1]

=a[j+1,i]

Ta để ý rằng khi điền phần tử a[j+1, i] ta phải xét tập hợp A tất cả các số nguyên dạng a[k, i], k=1, ,j và a[j+1, l], l=1 i-1 là các phần tử đã điền trước a[j+1, i] nằm trên hàng thứ j+1 và cộtthứ K; sau đó chọn a[j+1, i] là số nguyên không âm nhỏ nhất không trùng với số nào trong tậpA

Khi điền phần tử a[i, j+1] ta phải xét tập hợp B các số nguyên đã điền trên hàng thứ i và cột thứ j+1, đó là các số dạng a[i, k], k=1 j và a[l, j+1], l=1 i-1 Nhưng theo giả thiết qui nạp ta

có a[k, i]=a[i, k], " k=1 j và a[j+1, l] =a[l, j+1], " l=1 i-1 Do đó tập A trùng với tập B và vì vậy a[i, j+1] cũng chính là số nguyên không âm nhỏ nhất không trùng với số nào trong tập A vậy a[i, j+1] =a[j+1, i]

Vậy (2) đúng với mọi i>j

c Program P2323c;

Var

a: array[1 100, 1 100] of byte;

Trang 3

If a[i, k]=b then d:=TRUE; {đã dùng}

If i>1 then For k:=1 to i-1 do {cột j}

If a[K, j] = b then d:=TRUE; {đã dùng}

b:=b+1; {Kiểm tra số tiếp theo}

Until not d

a[i, j] =b-1;

End;

End.

4 a Viết chương trình nhập dữ liệu từ dãy đối xứng vào mảng một chiều.

b Viết chương trình nhập dữ liệu là ma trận đối xứng vào mảng hai chiều

Write('Nhập số phần tử của dãy đối xứng:'); Readln(n);

Writeln('Nhập các phần tử của dãy:');

For i:=1 to (n+1) div 2 do

3

Trang 4

Write('a[', i:2, ',', j:2, ']='); Readln(a[i, j]);

a[i, j]:=a[j, i];

Trang 5

Write(' Nhap do dai cua day : ');Readln(n);

Writeln('Day con lien nhau cuc dai cac phan tu bang nhau cua day : ');

For i:=id to id+kmax-1 do Write(a[i]:4);

Readln;

END.

7 Cho trước số tự nhiên N Viết chương trình in ra tất cả các ước số khác nhau của N.

(Gợi ý: sử dụng chương trình của bài trên)

Trang 6

8 Cho dãy số được nhập từ bàn phím Hãy chỉ ra một dãy con liên tục đơn điệu tăng có độ dài

lớn nhất Chương trình phải in ra được dãy con đó

Trang 7

Writeln('Day con lien tuc don dieu tang co do dai lon nhat la');

For i:=d to c do write(A[i]:5);

End

Else Writeln('Khong ton tai day con don dieu tang co >1 phan tu');

Readln;

END.

9 Cho xâu ký tự S Viết chương trình tính xem trong S có bao nhiêu chữ cái tiếng Anh

(không phân biệt chữ in hoa hay thường) Ví dụ với S là "Ha thanh" ta có đáp số là 4

While (Upcase (S[j]) <> Upcase(S[i])) and (j<=(i-1)) do inc(j);

if j=i then dem:= dem+1;

inc(i);

end;

7

Trang 8

write('Số chữ cái tiếng Anh trong xâu là: ', dem:4);

write(' Nhap do dai cua day so nguyen: ');readln(n);

writeln(' Nhap cac phan tu cua day : ');

Trang 10

Viết chương trình tách các phần là "số" của xâu trên và đưa ra một mảng số nguyên Trong ví

writeln('Chuong trinh xu li xau co so :');

write('Nhap mot xau co so : ');readln(st);

Trang 11

for i:=1 to n do write(a[i]:8);

writeln('Chuong trinh tim mot day con chung lien tuc cua hai day so: ');

write('Nhap do dai N cua hai day : ');readln(N);

Trang 12

writeln('Hai day a va b co day con chung lien tuc dai nhat la :');

for j:=jmax to jmax+kmax-1 do write(b[j]:8);

end;

readln;

END.

Trang 13

12 Viết chương trình nhập số tự nhiên N và in ra dòng thứ N của tam giác Pascal.

For j:=i downto 0 do

If (j=i)or(j=0) then a[j]:=1

Cho trước k vị trí, trên đó đã xếp k quân hậu: (i1,j1), (i2,j2), , (ik,jk)

Viết chương trình kiểm tra xem k quân hậu trên có ở trong trạng thái độc lập hay không (tức

là không quân nào có thể khống chế quân nào)

Trường hợp các quân trên đã độc lập hãy kiểm tra xem có thể bổ xung thêm một quân hậu nữa mà vẫn bảo đảm tính độc lập được hay không, nếu được hãy chỉ ra vị trí của quân hậu mới

Uses crt;

Var

ih, jh: array[1 8] of byte;

13

Trang 14

If (i<>j)and((ih[i]=ih[j])or(jh[i]=jh[j]) or(abs(ih[i]-ih[j])=abs(jh[i]-jh[j]))) then dl:=false;

If not(dl) then Writeln('Các con hậu trên không ở trong trạng thái độc lập.')

Trang 15

If ok then Writeln(' Có thể bổ sung thêm một quân hậu nữa vào vị trí',ihm-1:3,jhm-1:3)

Else Writeln(' Không thể bổ sung thêm một quân hậu nào nữa.');

Nguyen Van Hung 15 G

Bui Quang Than 14 K

Tran Minh Quang 16 G

Le Van Minh 15 T

Dữ liệu ghi trong file này có ý nghĩa như sau:

- Dòng đầu tiên ghi đúng một số n chỉ số lượng học sinh trong lớp

- n dòng tiếp theo mỗi dòng ghi dữ liệu của một học sinh

- Mỗi học sinh được ghi các dữ liệu sau:

Họ và tên: 20 ký tự

Tuổi: 3 ký tự

Xếp loại: 1 ký tự

15.Hãy viết chương trình nhập dữ liệu học sinh từ file trên và đưa vào các mảng dữ liệu tương

ứng, tên file cũng được đọc từ bàn phím

Program P4609;

Uses crt;

15

Trang 16

Readln(f, ht[i], t[i], xl[i]);

close(f); {kiểm tra}

For i:=1 to n do

Writeln(ht[i],t[i]:4,xl[i]:3);

Readln;

End.

17 Cho trước một xâu nhị phân độ dài bất kỳ được đưa vào từ file văn bản INPUT.TXT Cần

biến đổi xâu nhị phân này về dạng toàn số 0 Các phép biến đổi có thể chỉ là một trong các loại sau:

- Biến đổi xâu con 11 thành 00

- Biến đổi xâu con 010 thành 000

Hãy chỉ một cách biển đổi xâu đã cho thành xâu có toàn 0 Kết quả thể hiện trong file

OUTPUT.TXT như sau:

Dòng đầu tiên của OUTPUT.TXT chứa xâu ban đầu, sau đó mỗi dòng là một xâu tiếp theo sau một phép biến đổi, xâu cuối cùng là xâu toàn 0

Uses crt;

Trang 18

If (st[l]='1')and(st[l-1]='1') then ghi1(l-1);

Repeat { biến đổi xâu con '11' }

Trang 19

20 Tại một sân ga người ta xét hành lý của hành khách và ghi kết quả vào file có tên

KHACH.INF sao cho mỗi hành khách được ghi trên một dòng, mỗi kiện hàng được ghi rõ số cân trên hàng đó Ví dụ một file như vậy có dạng sau:

Hãy viết chương trình thực hiện các công việc sau:

Tính tổng số cân của mỗi hành khách và in kết quả ra file có tên CAN.KQ, mỗi hành khách làmột số trên một hàng Ví dụ với file đầu vào như trên thì kết quả sẽ là:

fin, fou, fhuy: text;

sum, can: real;

n, i, k: byte;

Begin

Clrscr;

19

Trang 22

Function chuso(NN: longint): char;

{Trả về chữ số thứ NN của dãy vô hạn các số nguyên không âm lẻ

Trang 23

Function chuso(NN: longint): char;

{Trả về chữ số thứ N của dãy vô hạn các số chính phương 1491625364981100121144 } Var Bp, M, dem: longint;

Trang 24

11 Viết chương trình thực hiện trò chơi sau:

Có N số 1, 2, 3, , N được lần lượt xếp trên vòng tròn theo chiều kim đồng hồ Các số tự nhiên N, k được đọc vào từ bàn phím ngay từ đầu trò chơi Để mỗi lần thực hiện trò chơi trên máy sẽ làm các việc sau:

Yêu cầu người chơi nhập một số tự nhiên A (1 <= A <= N) Đây chính là số mà người chơi muốn máy xóa đi chậm nhất

Bắt đầu từ số 1 máy bắt đầu đi dạo theo chiều kim đồng hồ, cứ đến số thứ k máy sẽ xóa số đó

đi khỏi vòng tròn và thông báo ngay với người chơi

Chương trình dừng khi máy xóa đến số A, máy sẽ thông báo số điểm mà bạn đạt được: xóa mỗi số trước số A sẽ được một điểm Như vậy bạn chơi càng giỏi thì điểm càng cao

Trang 25

Until Ni>=1;

Repeat

Write('Chữ số thứ K cần xoá k='); Readln(ki);

If ki<1 then Write('Nhập lại.');

Until ki>=1;

Repeat

1 Write('Số bạn muốn máy xoá đi chậm nhất là');

1Write(' A='); Readln(Ai);

1If (Ai>Ni)or(Ai<1) then Write('Nhập lại.');

Trang 26

1If (i<=N1) then inc(i) else i:=1;

1If SO[i]<>0 then inc(count);

1If count=k1 then

Trang 27

Program P100217; {Thu duoc so co 4 chu so lon nhat tu xau ki tu}

Repeat {Xoa cac ki tu khong la chu so}

If (S[i] in ['0' '9']) then Inc(i)

For j:=i to Length(S)+i-4 do If (S[k]<S[j]) then k:=j;

If k>i then Delete(S,i,k-i);

Trang 28

18. Cho trước một xâu kí tự gồm toàn các chữ số Hãy loại bỏ một số kí tự khỏi xâu sao cho các kí tự cuối cùng còn lại là một dãy giảm dần và theo đúng thứ tự đó tạo nên một số lớn nhất Ví dụ nếu cho xâu '64562372361247120686005007710137667690' thì số lớn nhất còn lại là 764210 Hãy thử giải bài toán trên với các xâu:

• '865258964125278632545'

• '12505565701399720215300453620146982302120418'

Xâu dữ liệu cho trong tệp IN.TXT, xâu kết quả trong tệp OUT.TXT

Program P100218;{Tim xau dai va lon nhat}

For i:=length(s) downto 1 do

For j:=i-1 downto 1 do

If (s[j]>s[i]) and (d[j]<=d[i]+1) then

Trang 29

19. (Đề thi OLYMPIC tin học toàn quốc năm 1995)

Xâu kí tự bao gồm cả các chữ số được lưu trong tệp INPUT.TXT

Ví dụ: ast25xyz4ghi20mno

Cần "sắp xếp" lại các "số" nằm xen kẽ trong xâu trên Kết quả được ghi trong tệp có tên OUTPUT.TXT Vị trí các kí tự khác số được giữ nguyên

Trong ví dụ trên kết quả sẽ là xâu: ast4xyz20ghi25mno

Chú ý: Khi sắp xếp nếu gặp số bắt đầu bằng chữ số 0 thì sẽ cắt các chữ số 0 đó đi Ví dụ nếu gặp số 021 thì chỉ cần sắp lại số 21

Trang 30

20. (Đề thi OLYMPIC tin học toàn quốc năm 1995)

Một văn bản đã mã hóa được ghi trong tệp văn bản có tên INPUT.TXT Văn bản này chứa các từ, mỗi từ là một dãy liên tục các chữ cái in hoa Các từ cách nhau bởi các ký tự phụ Ký

tự phụ là một ký tự bất kỳ khác với các chữ cái in hoa

Ví dụ một văn bản đã mã hóa sau đây:

YQ#PTU&&^()JUFA*%PQG

Để giải mã ta làm như sau:

• Lập bảng Đổi chỉ số bao gồm 26 số tự nhiên Các số này phải nằm trong phạm vi từ 1 đến 26 Bảng này được ghi trong tệp có tên INDEX.DAT Dãy số chỉ số được ghi trên một dòng, các số cách nhau bởi ký tự trống

• Lập bảng Mã bao gồm 26 chữ cái in hoa được xếp theo một thứ tự cố định nào đó Bảng này dùng để giải mã và được ghi trên tệp có tên CODE.DAT trên một dòng, các chữ cách nhau bởi ký tự trống

Trang 31

Quá trình giải mã được tiến hành như sau: Với mỗi chữ cái thuộc từ đã mã hóa ta tính số thứ

tự của nó trong bảng chữ cái (ví dụ chữ C có thứ tự 3) Dựa vào bảng Đổi chỉ số tính ra được chỉ số giải mã của chữ cái này Bảng Mã sẽ tìm ra được chữ cái đã giải mã

Viết chương trình thực hiện các công việc sau:

a Đọc tệp văn bản, giải mã và ghi kết quả vào tệp có tên OUTPUT.TXT, trong tệp kết quả các ký tự phụ thuộc được thay bằng dấu cách

b Kiểm tra xem qui tắc giải mã theo các bảng trên có là đúng đắn hay không?

Trang 32

For i:=1 to 26 do Read(f,ma[i]);

For i:=1 to length(s) do

If s[i] in ['A' 'Z'] then s[i]:=ma[vt[s[i]]] else s[i]:=' ';

1. Cho text file f

a Hãy xác định xem trong file f có từ "anh" hay không

b Hãy đếm số lượng từ "anh" có trong file f

Program P100301; {Tim va dem so luong tu 'anh' trong file f}

If d=0 then Write('Khong co tu ''anh'' nao trong file f.')

Else Write('Co ',d,' tu ''anh'' trong file f.');

Readln;

END

2. Cho hai text file f1 và f2 Hãy xác định xem các từ của file f1 có trùng với các từ của file f2

hay không Nếu không trùng, hãy chỉ ra thứ tự của từ đầu tiên không trùng nhau Trong trường hợp một file có đúng n từ lại trùng với n từ đầu tiên của file kia thì đáp số là n+1

Program P100302; {So sanh 2 file}

Uses Crt;

Var S1,Tu1,S2,Tu2: String;

Trang 34

While (S<>'')and(S[1]=' ') do Delete(S,1,1);

If Length(TuMax)=0 then Write('Khong co tu nao trong file f.')

Else Write('Tu chua ''e'' dai nhat trong file f la ',TuMax,'.');

Readln;

END

4. Cho text file f

a Hãy đếm xem trong file f có bao nhiêu từ gồm 1 kí tự, 2 kí tự,

b Hãy đếm xem trong file f có tổng số bao nhiêu từ

Program P100304; {Dem cac loai tu trong file f}

Writeln('Tong cong trong file co ',d[0],' tu.');

For i:=1 to Max do

If d[i]<>0 then Writeln('Co ',d[i],' tu co do dai ',i,'.');

Readln;

END

9. Cho text file f chứa các từ là các số nguyên Hãy ghi vào file g1 tất cả các số lẻ, vào file g2

tất cả các số chẵn của file f theo đúng thứ tự của chúng trong f

Trang 35

Program P100309; {Ghi tu file f sang files g1 va g2}

If Odd(i) then Write(g1,i,' ') Else Write(g2,i,' ');

If SeekEoLn(f) then begin Writeln(g1); Writeln(g2); end;

end;

Close(f); Close(g1); Close(g2);

END

10. Cho text file f chứa các từ là các số nguyên Hãy ghi vào file g tất cả các số đó theo thứ tự ngược lại.

Program P100310; {Ghi tu file f sang file g theo thu tu nguoc lai}

Trang 36

Read(f,a[n]);

Trung:=0; For i:=1 to n-1 do If a[i]=a[n] then inc(Trung);

If Trung=0 then Write(g,a[n],' ');

If SeekEoLn(f) then Writeln(g);

end;

Close(f); Close(g);

END

14. Cho text file f chứa các từ là các số nguyên khác 0, số các số dương đúng bằng số các số

âm Sử dụng file trung gian h, hãy ghi vào file g tất cả các số của file f sao cho trong file g:

a Các số dương đứng trước, các số âm đứng sau

b Hai số liền nhau phải khác dấu

c Cứ 2 số dương lại tới 2 số âm

Program P100314a; {Ghi tu file f sang file g co sap xep}

Trang 37

9. Cho mảng A = (aij) kích thước m k và mảng B = (b ij) kích thước k n Hãy lập mảng C 

= (cij) kích thước m n với c ij = ai1 b1j+ ai2 b2j+ ai3 b3j+ + aik bkj (Ma trận C được lập như vậy được gọi là tích của ma trận A với ma trận B và kí hiệu C = AB).Program P100409; {Tinh tich hai ma tran A va B}

Write('Nhap cac kich thuoc cua hai ma tran (m, k, n): '); Readln(m,k,n);

Writeln('Nhap ma tran A kich thuoc ',m,'*',k,': ');

12. Cho mảng A = (aij) kích thước m n Hãy lập mảng B = (b i) với các phần tử là:

a Tổng của các phần tử trên hàng tương ứng của A

b Tích của các phần tử trên hàng tương ứng của A

c Phần tử nhỏ nhất của các hàng tương ứng của A

d Trung bình cộng của các phần tử trên hàng tương ứng của A

e Hiệu của phần tử lớn nhất và phần tử nhỏ nhất của các hàng tương ứng của A

Program P100412; {Lap mang B tu mang A}

Uses Crt;

Var a: array[1 50,1 50] of integer;

Tong,Tich,Min,Max: array[1 50] of integer;

Trang 38

If Min[i]>a[i,j] then Min[i]:=a[i,j];

If Max[i]<a[i,j] then Max[i]:=a[i,j];

end;

end;

Writeln('Ma tran B la:');

Writeln(' a.Tong: b.Tich: c.Min: d.Trung binh cong: e.Max-Min: ');

For i:=1 to m do

Writeln(Tong[i]:6,Tich[i]:10,Min[i]:10,Tong[i]/n:20:2,Max[i]-Min[i]:12);

Readln;

END

17. Một "ảnh đen trắng" được mã hoá thành một xâu kí tự theo 2 bước như sau:

• Bước 1 Điểm đen (ảnh) được ghi bằng kí tự "c", điểm trắng (nền) được ghi bằng kí tự

"k" Thứ tự ghi theo từng dòng từ trái qua phải, hết dòng này tới dòng khác theo thứ tự

từ trên xuống dưới Ví dụ "ảnh" sau sẽ được ghi thành xâu gồm 8 8=64 kí tự là: 'kkccccckkckkkkckckkkkkckckkkkkckckkkkkckckkkkkckkckkkcckkkccckck'

• Bước 2 Xâu được nén theo cách đã chỉ ở bài P100214 Như vậy xâu trên sẽ được ghi thành '2k5c2kc4kckc5kckc5kckc5kckc5kc2kc3k2c3k3ckck'

Cho trước kích thước m n của ảnh cùng xâu mã hoá ảnh (0 < m < 25, 0 < n < 80) Hãy viết chương trình hiển thị ảnh lên màn hình Yêu cầu ảnh phải nằm giữa màn hình, điểm ảnh "c" hiển thị bằng kí tự "*", điểm nền "k" để trống bằng dấu cách #32 Dữ liệu nhập từ tệp văn bản

có dạng IMAGE.DAT có dạng: dòng thứ nhất ghi hai số m, n Dòng thứ hai ghi lại xâu ký tự ảnh đã mã hóa của ảnh

Program P100417; {Giai nen anh}

Write('Nhap kich thuoc anh (m,n): '); Readln(m,n);

Write('Nhap xau ma hoa anh: '); Readln(S1);

{Giai nen S1 vao S2}

i:=0; S2:='';S:='';

Repeat

Trang 39

{Dua anh ra Man hinh}

For i:=1 to Length(S2) do

• Các số lẻ thuộc Đông hoặc Tây, các số chẵn thuộc Nam hoặc Bắc

• Tổng các số thuộc Đông bằng tổng các số thuộc Tây, tổng các số thuộc Nam bằng tổng các số thuộc Bắc

Ví dụ: n = 7 thì Đông = (1, 7), Tây = (3, 5), Nam = (2, 4), Bắc = (6)

Hãy giải bài tập trên cho n = 8, n = 15 và n = 16 Hỏi với n = 20 thì bài toán có lời giải

le,chan: array[1 nmax] of byte;

d,pre: array[0 10000] of byte;

Ngày đăng: 10/06/2016, 12:32

TỪ KHÓA LIÊN QUAN

w