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 11 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 3If 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 4Write('a[', i:2, ',', j:2, ']='); Readln(a[i, j]);
a[i, j]:=a[j, i];
Trang 5Write(' 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 68 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 7Writeln('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 8write('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 10Viế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 11for 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 12writeln('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 1312 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 14If (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 15If 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 16Readln(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 18If (st[l]='1')and(st[l-1]='1') then ghi1(l-1);
Repeat { biến đổi xâu con '11' }
Trang 1920 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 22Function 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 23Function 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 2411 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 25Until 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 261If (i<=N1) then inc(i) else i:=1;
1If SO[i]<>0 then inc(count);
1If count=k1 then
Trang 27Program 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 2818. 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 2919. (Đề 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 3020. (Đề 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 31Quá 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 32For 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 34While (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 35Program 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 36Read(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 379. 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 38If 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;