You are on page 1of 5

TRƯỜNG THPT LƯƠNG THẾ VINH ĐỀ THI CHỌN ĐỘI TUYỂN TIN HỌC TRẺ CẤP TỈNH

TỔ TIN HỌC BẢNG C – TRUNG HỌC PHỔ THÔNG, NĂM HỌC 2019 – 2020
Thời gian làm bài: 150 phút (Không kể thời gian phát đề)

TỔNG QUAN

Tên bài File chương trình File dữ liệu vào File kết quả
Bài 1 Đếm số kí tự bai1.pas COUNT.INP COUNT.OUT
Bài 2 Tổ ng phầ n tử dã y số ĐQ bai2.pas TONGDEQUY.INP TONGDEQUY.OUT
Bài 3 Tổ ng phầ n tử dã y số QHĐ bai3.pas TONGQHD.INP TONGQHD.OUT
Bài 4 Dã y nhị phâ n bai4.pas NHIPHAN.INP NHIPHAN.OUT

Hãy lập trình giải các bài toán sau:

Bài 1: Đếm số kí tự
Đếm số lần xuất hiện của một chữ cái tiengs Anh trong xâu S (Không phân biệt kí tự là chữ hoa hay chữ
thường).
Dữ liệu: Vào từ tệp văn bản COUNT.INP
Một dòng duy nhất chứa xâu S.
Kết quả: Ghi ra file văn bản COUNT.OUT, mỗi dòng chứa kí tự trong xâu S và Số lượng kí tự đó trong xâu S.
Ví dụ:
COUNT.INP COUNT.OUT COUNT.INP COUNT.OUT COUNT.INP COUNT.OUT
ABAC A: 2 Aabcdd A: 2 AaBbC A:2
B:1 B:1 B:2
C:1 C:1 C:1
D:2

Bài 2: Tổng phần tử dãy số ĐQ


Tính tổng các phần tử của dãy số (Yêu cầu sử dụng đệ quy để giải quyết bài toán)
Dữ liệu: Vào từ tệp văn bản TONGDEQUY.INP
- Dòng đầu tiên chứa số nguyên dương N (N≤100)
- Dòng tiếp theo chứa N số nguyên a1, a2,..,an (ai≤100)
Kết quả: Ghi ra file văn bản TONGDEQUY.OUT, gồm một số nguyên duy nhất là tổng của dãy số.
Ví dụ:
TONGDEQUY.INP TONGDEQUY.OUT
4 7
1231
Bài 3: Tổng phần tử dãy số QHĐ
Tính tổng các phần tử của dãy số (Yêu cầu sử dụng Quy hoạch động để giải quyết bài toán)
Dữ liệu: Vào từ tệp văn bản TONGQHD.INP
- Dòng đầu tiên chứa số nguyên dương N (N≤100)
- Dòng tiếp theo chứa N số nguyên a1, a2,..,an (ai≤100)
Kết quả: Ghi ra file văn bản TONGQHD.OUT, gồm một số nguyên duy nhất là tổng của dãy số.
Ví dụ:
TONGQHD.INP TONGQHD.OUT
4 7
1231

Bài 4: Dãy nhị phân


Liệt kê và đếm dãy nhị phân có độ dài N; Nhưng không chứa 00 liền nhau. (Yêu cầu sử dụng Quay lui để
giải quyết bài toán)
Với n=3. {Ta có các xâu: 000, 001, 010, 011, 100, 101, 110, 111. Có 8 dãy nhị phân}

Dữ liệu: Vào từ tệp văn bản NHIPHAN.INP


Dòng đầu tiên chứa số nguyên dương N (N≤100)
Kết quả: Ghi ra file văn bản NHIPHAN.OUT
- Gồm k dòng, mỗi dòng là một dãy nhị phân;
- Dòng cuối cùng là số nguyên dương k (k là số lượng xâu không chứa 00 liền nhau)
Ví dụ:
NHIPHAN.INP NHIPHAN.OUT
3 010
011
101
110
111
5

------------------Hết----------------
Hướng dẫn giải:
Bài 1: Viết chương trình nhập từ bàn phím 1 xâu kí tự S và thông báo ra màn hình số lần xuất hiện của một chữ
cái tiếng Anh trong S (Không phân biệt chữ hoa hay chữ thường).
Cách 1:
Var S: String; i:Byte; Ch: Char;
Solan:array[‘A’..’Z’] of byte;
Begin
Write(‘Hãy nhập xâu:’); readln(S);
For i:=1 to length(S) do
solan[upcase(S[i])] := solan[upcase(S[i])] +1;
for ch:=’A’ to ‘Z’ do
if solan[ch] >0 then
writeln(‘Kí tự ‘, ch, ‘có’, Solan[ch]);
readln;
end.
Cách 2:
Var S: String; i:Byte; Ch: Char;
dem:array[‘A’..’Z’] of byte;
Begin
Write(‘Hãy nhập xâu:’); readln(S);
For ch:=’A’ to ‘Z’ do
For i:=1 to length(S) do
If ch=upcase(s[i]) then
Dem[ch]:=dem[ch] +1;
for ch:=’A’ to ‘Z’ do
if dem[ch] >0 then
writeln(‘Kí tự ‘, ch, ‘có’, dem[ch]);
readln;
end.

Bài 2: Lập chương trình Tính tổng của dãy số: Có thể tổng quát lên tính tổng các số của một dãy (mảng)
Giải bằng thuật toán đệ quy
{Code Pascal}
Var a:array[1..100] of longint;
n,i:longint;
Function S(k:longint):longint;
Begin
If k=1 then S:=a[1]
else S:=S(k-1) + a[k];
End;
Begin
write('Nhap n:');
readln(n);
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
Writeln('Tong cac phan tu day la:',S(n));
readln;
End.
Bài 3: Lập chương trình Tính tổng của dãy số: Có thể tổng quát lên tính tổng các số của một dãy (mảng)
Giải bằng thuật toán quy hoạch động (lập bảng phương án).
Gọi T[i] là tổng giá trị các phần tử a1, a2, …, ai (1  i  n).
Ta có công thức quy hoạch động để tính T[i] như sau:
T[i] := T[i - 1] + A[i];
Như vậy, việc tính T[n] được thực hiện bằng vòng lặp:
T[0] := 0;
For i:=1 to n do
T[i] := T[i - 1] + A[i];
{Code Pascal}
uses crt;
var a:array[1..100] of byte;
T:array[0..100] of longint;
i,n:byte;
begin
write('Nhap n:'); readln(n);
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
T[0]:=0;
T[1]:=a[1];
for i:=2 to n do
T[i]:=T[i-1]+a[i];
write('Tong cac phan tu day:',T[n]);
readln;
end.
Bài 4: Liệt kê và đếm dãy nhị phân có độ dài n (Nhưng không chứa 00 liền nhau)
VD: Input: n=3. {Ta có các xâu: 000, 001, 010, 011, 100, 101, 110, 111. Có 8 dãy nhị phân}
Output: Xâu không chứa 00 liền nhau: 010, 011, 101, 110, 111. Có 5 dãy thỏa mãn bài toán.
Uses crt;
Var a:array[1..100] of integer;
n,dem:integer;
Procedure try(i:integer);
Var j,k:integer;
Begin
for j:=0 to 1 do
begin
if (i>=2)and(a[i-1]=0)and(j=0) then continue;
a[i]:=j;
if i=n then
begin
for i:=1 to n do
write(a[i]);
writeln;
dem:=dem+1;
end
else try(i+1);
end;
End;
Begin
write('Nhap n:'); readln(n);
dem:=0;
try(1);
writeln('SL xau thoa man:', dem);
readln;
End.

You might also like