0
TP.HCM - Năm 2018
GV: PHẠM THỊ BÍCH TƯỜNG
EMAIL:bichtuong2312@gmail.com
KIỂU DỮ LIỆU CÓ CẤU TRÚC TRONG PASCAL
BÀI TẬP MẢNG
CƠ BẢN & NÂNG CAO
1
MỤC LỤC
BÀI TẬP CƠ BẢN................................................................................................................. 3
Bài tập 1: Viết chương trình tìm giá trị lớn nhất của một mảng chứa các số nguyên gồm
N phần tử. ................................................................................................................................. 3
Bài tập 2: Viết chương trình tính tổng bình phương của các số âm trong một mảng gồm
N phần tử. ................................................................................................................................. 3
Bài tập 3: Viết chương trình nhập vào một mảng gồm N số nguyên. Sắp xếp lại mảng theo
thứ tự tăng dần và in kết quả ra màn hình............................................................................. 4
Bài tập 4: Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào
một số nguyên X. Hãy kiểm tra xem phần tử X có trong mảng A hay không?..................... 4
Bài 5: Nhập vào mảng A có N phần tử. Tìm phần tử xuất hiện nhiều nhất trong mảng.... 5
Bài 6: Viết chương trình nhập vào một mảng số nguyên có N phần tử theo thứ tự giảm
dần và số M. Chèn số M vào mảng sao cho mảng vẫn có thứ tự giảm dần. In mảng sau
khi chèn..................................................................................................................................... 7
Bài7: Nhập vào mảng 1 chiều gồm 1 dãy số nguyên N phần tử. Hãy xóa các phần tử trùng
nhau trong mảng và in kết quả ra màn hình.......................................................................... 7
Bài 8: Viết chương trình Kiểm tra số chính phương trong mảng một chiều........................ 9
Bài 10: Viết chương trình nhập vào số nguyên dương N và dãy A gồm N số nguyên A1,
A2,... AN. Hãy sắp xếp dãy số trên sao cho các số chẵn chia hết cho 3 lên đầu.................11
dãy, các số lẻ chia hết cho 3 xuống cuối dãy, các số còn lại ở giữa dãy vẫn giữ được ......11
thứ tự trước khi nhập vào. In ra màn hình dãy trước và sau khi sắp xếp mỗi phần tử.....11
cách nhau một khoảng trắng.................................................................................................11
BÀI 11: Nhập vào một số n (5<=n<=10) và n phần tử của dãy a, 1<ai<100 (có kiểm tra dữ
liệu khi nhập...........................................................................................................................12
a) In ra các phần tử là số nguyên tố của dãy............................................................12
b) Tính ước chung lớn nhất của tất cả các phần tử của dãy. ..................................12
c) Tính biểu thức sau: ...............................................................................................12
d) Sắp xếp dãy tăng dần và in ra dãy sau sắp xếp.....................................................12
BÀI 12: Cho 1 dãy số gồm n phần tử n<=15. Giá trị từng phần tử là số thực. Thực hiện
các chương trình sau: ............................................................................................................16
a) Nhập từ bàn phím số phần tử và giá trị từng phần tử...................................................16
b) Tính tổng các phần tử âm của dãy .................................................................................16
c) Tính tổng và trung bình cộng của các phần tử chẵn của dãy ......................................16
d) Tìm phần tử có giá trị lớn nhất của dãy.........................................................................16
e) Tìm phần tử có giá trị nhỏ nhất......................................................................................16
2
f) Sắp xếp dãy theo chiều giảm dần về giá trị của từng phần tử......................................16
g) In các kết quả trên ra màn hình .....................................................................................16
Bài 14: Viết chương trình mảng một chiều gồm n phần tử n<=100 kiểu nguyên..............23
Bài 15: Nhập họ tên và năm sinh của người và cho biết người này thuộc lứa tuổi nào: sơ
sinh, nhi đồng, thiếu niên, thanh niên, trung niên, người lớn tuổi. Biết rằng:..................29
BÀI TẬP NÂNG CAO.........................................................................................................30
Bài tập 1: DHLOCO spoj ......................................................................................................30
Bài tập 2: Cho trước một dãy số dương có N phần tử. Bạn biết trước tổng của bất kì 2
phần tử nào trong dãy số, hãy tìm dãy số ban đầu. ..............................................................33
Bài tập 3: Một đoạn số có tổng bằng nhau trong một dãy số là một nhóm các số theo đúng
thứ tự ban đầu trong dãy mà nếu nhóm với nhau thì sẽ cho ra cùng một giá trị tổng. .....35
Bài tập 4: BONUS Spoj..........................................................................................................38
3
BÀI TẬP CƠ BẢN
Bài tập 1: Viết chương trình tìm giá trị lớn nhất của một mảng chứa các số nguyên
gồm N phần tử.
Uses Crt;
Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;
N,i,Max:Integer;
Begin
{Nhập mảng}
Write(‘Nhap N=’); Readln(N);
For i:=1 To N Do
Begin
Write(‘A[‘,i,’]=’); Readln(A[i]);
End;
{Tìm phần tử lớn nhất}
Max:=A[1];
For i:=2 To N Do
If Max<A[i] Then Max:=A[i];
{In kết quả ra màn hình}
Writeln(‘Phan tu lon nhat cua mang: ’, Max);
Readln;
End.
Bài tập 2: Viết chương trình tính tổng bình phương của các số âm trong một mảng gồm
N phần tử.
Uses Crt;
Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;
N,i,S:Integer;
Begin
Write(‘Nhap N=’); Readln(N);
For i:=1 To N Do
Begin
4
Write(‘A[‘,i,’]=’); Readln(A[i]);
End;
S:=0;
For i:=1 To N Do
If A[i]<0 Then S:=S+A[i]*A[i];
{In kết quả ra màn hình}
Writeln(‘S= ’, S);
Readln;
End.
Bài tập 3: Viết chương trình nhập vào một mảng gồm N số nguyên. Sắp xếp lại mảng
theo thứ tự tăng dần và in kết quả ra màn hình.
Uses Crt;
Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;
N,i,j,Tam:Integer;
Begin
Write(‘Nhap N=’); Readln(N);
For i:=1 To N Do
Begin
Write(‘A[‘,i,’]=’); Readln(A[i]);
End;
For i:=1 To N-1 Do
For j:=i+1 To N Do
If A[i]>A[j] Then
Begin
Tam:=A[i]; A[i]:=A[j]; A[j]:=Tam;
End;
Writeln(‘Ket qua sau khi sap xep:’);
For i:=1 To N Do Write(A[i]:5);
Readln;
End.
Bài tập 4: Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào
một số nguyên X. Hãy kiểm tra xem phần tử X có trong mảng A hay không?
5
Uses Crt;
Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;
N,i,x:Integer;
Begin
I:=1;
While (I <= N) and (X<>A[I]) do I:=I+1;
If I <= N Then Timkiem:=I Else Timkiem:=0;
End;
Begin
Write(‘Nhap N=’); Readln(N);
For i:=1 To N Do
Begin
Write(‘A[‘,i,’]=’); Readln(A[i]);
End;
Write(‘Nhap X=’); Readln(x);
If TimKiem(X,N,A)<>0 Then
Writeln(‘Vi tri cua X trong mang la:’, TimKiem(X,N,A))
Else Writeln(‘X khong co trong mang.’);
Readln;
End.
Bài 5: Nhập vào mảng A có N phần tử. Tìm phần tử xuất hiện nhiều nhất trong mảng.
Uses crt;
var a,b:array[1..100] of integer;
n,i,j,d,max,k:integer;
begin
write('N=');readln(n);
for i:=1 to n do
6
begin
write('a[',i,']=');readln(a[i]);
end;
for i:=1 to n do
begin
d:=0;
for j:=i to n do
if a[i]=a[j] then inc(d);
if d>max then
begin
max:=d;
b[1]:=a[i];
k:=1;
end
else
if d=max then
begin
inc(k);
b[k]:=a[i];
end;
end;
for i:=1 to k do write(b[i],' ');
readln;
end.
7
Bài 6: Viết chương trình nhập vào một mảng số nguyên có N phần tử theo thứ tự giảm
dần và số M. Chèn số M vào mảng sao cho mảng vẫn có thứ tự giảm dần. In mảng sau
khi chèn.
var a:array[1..100] of integer;
n,m,i,j:integer;
begin
write('N=');readln(n);
for i:=1 to n do
begin
write('a[',i,']=');readln(a[i]);
end;
write('M=');readln(m);
write('Mang sau khi chen: ');
for i:=1 to n do
begin
if (m>=a[i]) and (j=0) then
begin
write(m,' ');
j:=1;
end;
write(a[i],' ');
end;
if j=0 then write(m);
readln;
end.
Bài7: Nhập vào mảng 1 chiều gồm 1 dãy số nguyên N phần tử. Hãy xóa các phần tử trùng
nhau trong mảng và in kết quả ra màn hình.
8
Program Bo_so_trung;
Const
Max=100;
Var
a:Array[1..Max] Of Integer;
i,j,k,n:Integer;
Begin
Writeln('XOA BO CAC SO TRUNG NHAU');
Readln(n);
For i:=1 To N Do
Begin
Write('-Phan tu A[',i,']= ');
Readln(a[i]);
End;
i:=2;
While i <= N Do
Begin
j:=1;
While a[j] <> a[i] Do
j:=j+1;
If j < i Then
Begin
For k:=i to n-1 Do
9
a[k]:= a[k+1];
n:=n-1;
End
Else
i:=i+1;
End;
For i:=1 to n Do
Write(a[i]:8);
Writeln(' Bam phim <Enter> de ket thuc ');
Readln
End.
Bài 8: Viết chương trình Kiểm tra số chính phương trong mảng một chiều.
uses crt;
type ArrInt = array[1..250] of integer;
Var n,i,x : integer;
a: ArrInt;
BEGIN
clrscr;
write('Nhap so phan tu: ');
readln(n);
for i:=1 to n do
begin
write('Phan tu thu ',i,'= ');
readln(a[i]);
end;
writeln('Cac so chinh phuong co trong mang:');
for i:=1 to n do
begin
x:=trunc(sqrt(a[i]));
if sqr(x)=a[i] then
write(a[i]:4);
end;
readln;
END.
10
Bài 9: Viết chương trình nhập số nguyên N (0 < N ≤ 10 000) và mảng a gồm N số
nguyên. Tính và in ra trung bình cộng của các số âm, số dương trong a. Không tính số
0.
Ví dụ : a[] = {1, -6, 0, 3, -1}. Trung bình cộng là -0.75
PROGRAM tbc_am_duong_mang;
USES crt;
VAR a:ARRAY[1..100] OF REAL;
i,n,x,y:INTEGER;
tongam,tongduong,tba,tbd:REAL;
BEGIN
clrscr;
write('So phan tu cua day n= ');readln(n);
FOR i:=1 TO n DO
BEGIN
write('Nhap phan tu a[',i,']: ');
readln(a[i]);
END;
tongam:=0; x:=0;
FOR i:=1 TO n DO
IF a[i]<0 THEN
BEGIN tongam:=tongam+a[i];
x:=x+1;
END;
tba:=tongam/x;
write('TB cong cac so am la: ',tba:5:1);
writeln;
tongduong:=0; y:=0;
FOR i:=1 TO n DO
IF a[i]>0 THEN
BEGIN tongduong:=tongduong+a[i];
y:=y+1;
END;
tbd:=tongduong/y;
write('TB cong cac so duong la: ',tbd:5:1);
readln;
END.
11
Bài 10: Viết chương trình nhập vào số nguyên dương N và dãy A gồm N số nguyên A1,
A2,... AN. Hãy sắp xếp dãy số trên sao cho các số chẵn chia hết cho 3 lên đầu
dãy, các số lẻ chia hết cho 3 xuống cuối dãy, các số còn lại ở giữa dãy vẫn giữ được
thứ tự trước khi nhập vào. In ra màn hình dãy trước và sau khi sắp xếp mỗi phần tử
cách nhau một khoảng trắng
Output: Dãy trước khi sắp xếp: 1 6 5 9 12 3 4 15 7
Dãy sau khi sắp xếp: 6 12 1 5 4 7 9 3 15
Program bai1;
Uses crt;
Var A: array[1..250] of integer;
i, N: integer;
Begin
Clrscr;
Write(‘nhap so luong phan tu N= ‘); readln(N);
For i:= 1 to N do
Begin
Write(‘A[‘,I,‘] = ‘);readln(A[i]);
End;
Writeln(‘Day truoc khi sap xep‘);
For i:= 1 to N do write(A[i], ‘ ‘);
Writeln;
Writeln(‘Day sao khi sap xep‘);
For i:=1 to N do
If (A[i] mod 2=0) and (A[i] mod 3=0) write(A[i], ‘ ‘);
For i:=1 to N do
If ((A[i] mod 2=0) and (A[i] mod 3<>0)) or ((A[i] mod 2<>0) and
(A[i] mod 3<>0)) write(A[i], ‘ ‘);
For i:=1 to N do
If (A[i] mod 2<>0) and (A[i] mod 3=0) write(A[i], ‘ ‘);
12
BÀI 11: Nhập vào một số n (5<=n<=10) và n phần tử của dãy a, 1<ai<100
(có kiểm tra dữ liệu khi nhập.
a) In ra các phần tử là số nguyên tố của dãy.
b) Tính ước chung lớn nhất của tất cả các phần tử của dãy.
c) Tính biểu thức sau:
d) Sắp xếp dãy tăng dần và in ra dãy sau sắp xếp.
HƯỚNG DẪN
Ta nên chia chương trình thành các chương trình con, mỗi chương trình thực hiện một yêu
cầu. Ngoài ra ta cũng viết thêm các hàm kiểm tra nguyên tố, hàm mũ, hàm UCLN để thực hiện
các yêu cầu đó.
Chương trình như sau:
Khai báo dữ liệu:
uses crt;
var n : integer;
a : array[1..10] of integer; {n<=10 nên mảng có tối đa 10 phần tử}
Thủ tục nhập dữ liệu, có kiểm tra khi nhập.
procedure nhap;
var i : integer;
begin
clrscr;
write('NHAP VAO SO PHAN TU N = ');
repeat
readln(n);
if (5<=n) and (n<=10) then break; {nếu thoã mãn thì dừng vòng lặp}
writeln('Khong hop le (5<=n<=10). Nhap lai!!!'); {ngược lại thì báo lỗi}
until false;
writeln('NHAP VAO N PHAN TU (1<ai<100)');
13
for i := 1 to n do begin
write('a',i,'=');
repeat
readln(a[i]);
if (1<a[i]) and (a[i]<100) then break;
writeln('Khong hop le. Nhap lai!!!');
until false;
end;
end;
function ngto(n : integer): boolean; {hàm kiểm tra nguyên tố, xem giải thích ở phần trên}
var i : integer;
begin
ngto := false;
if n < 2 then exit;
for i := 2 to round(sqrt(n)) do
if n mod i = 0 then exit;
ngto := true;
end;
Thủ tục in các số nguyên tố của một mảng
procedure inngto;
var i :integer;
begin
writeln('CAC PHAN TU NGUYEN TO TRONG DAY:');
for i := 1 to n do {duyệt qua mọi phần tử từ 1 đến n}
14
if ngto(a[i]) then writeln(a[i]); {nếu ai là nguyên tố thì in ra}
end;
function UCLN(a,b: integer): integer;
var r : integer;
begin
while b<>0 do begin
r := a mod b;
a := b;
b := r;
end;
UCLN := a;
end;
Thủ tục tính UCLN của các phần tử của một mảng
procedure TinhUC;
var i,u : integer;
begin
u := a[1]; {u là UCLN của các phần tử từ 1 đến i}
for i := 2 to n do u := UCLN(u,a[i]); {là UCLN của các phần tử từ 1 đến i-1 và
ai}
writeln('UCLN cua ca day la:',u);
end;
function hammu(a : real; n : integer): real; {hàm mũ tính an}
var s : real; i : integer;
begin
15
s := 1;
for i := 1 to n do s := s * a;
hammu := s;
end;
Thủ tục tính tổng các phần tử có lấy mũ:
procedure tong;
var s : real; i : integer; {s phải khai báo là số thực để tránh tràn số}
begin
s := 0;
for i := 1 to n do s := s + hammu(a[i],i); {s := s + (ai)i}
writeln('Tong can tinh:',s:10:0);
end;
Thủ tục sắp xếp tăng dần các phần tử của một mảng:
procedure sxep;
var i,j,tg : integer;
begin
for i := 1 to n-1 do
for j := i + 1 to n do
if a[i] > a[j] then begin
tg := a[i]; a[i] := a[j]; a[j] := tg;
end;
writeln('DAY SAU KHI SAP XEP TANG DAN:');
for i := 1 to n do writeln(a[i]);
end;
16
Chương trình chính: lần lượt gọi từng thủ tục
BEGIN
nhap;
inngto;
tinhuc;
tong;
sxep;
END.
BÀI 12: Cho 1 dãy số gồm n phần tử n<=15. Giá trị từng phần tử là số thực. Thực hiện
các chương trình sau:
a) Nhập từ bàn phím số phần tử và giá trị từng phần tử
b) Tính tổng các phần tử âm của dãy
c) Tính tổng và trung bình cộng của các phần tử chẵn của dãy
d) Tìm phần tử có giá trị lớn nhất của dãy
e) Tìm phần tử có giá trị nhỏ nhất
f) Sắp xếp dãy theo chiều giảm dần về giá trị của từng phần tử
g) In các kết quả trên ra màn hình
program vd1;
var i,n :Byte;
ta, tb, b, c, d :real;
a: array[1..15] of real ;
begin
write(' nhập số lượng phần tử n ='); readln(n);
Writeln('Nhap mang a: ');
for i:=1 to n do
begin
write('a[',i,']= ');
readln(a[i])
end;
ta:=0;
17
for i:=1 to n do if a[i] <0 then ta= ta + a[i] ; { tính tổng âm}
tc:= 0; t:=1;
for i:=1 to n do if i mod 2 =0 then begin
t= t+1 ;
tc= tc + a[i] ; {tính tổng phần tư chẵn}
end;
ttc = tc/t ; { trung bình phần tử chẵn}
max:= a[1];
for i=2 to n do if max < a[i] then max =a[i] ; { tìm phần tử lớn nhất}
min:= a[1];
for i=2 to n do if min > a[i] then min =a[i] ; { tìm phần tử nhỏ nhất}
for i=2 to n do
for j=n down to i do
if (a[j]> a[j-1])
then begin
b:= a[j-1] ;
a[j-1]:=a[j];
a[j]:=b;
end; {sắp xếp các phần tử giảm dần về giá trị}
for i=1 to n then begin
write( a[i]);
writeln;
end; {in ra theo chiều dọc mảng}
end. hết
nếu muốn in theo chiều ngang
for i=1 to n then begin
write( a[i]);
write(' '); { dấu cách giữa 2 giấu ' }
end;
có gì sai sót thì bạn sửa nhe như khai báo các biến ấy có thể thiếu. cái này học hồi 11 nên
không nhớ rõ lắm
- Yêu cầu: Chạy lại chương trình với dãy A như sau: 12 4 6 9
Nhập số cần tìm là: 7
 Xem kết quả
e. Tính tích các số chắn trong dãy
vd: Dãy A gồm 7 phần tử: 5 13 4 7 2 10
 Tich cac so chan la: 80
BÀI GIẢI:
USES CRT;
VAR A: ARRAY[1..100] OF INTEGER;
I,N: INTEGER;
18
TICH: LONGINT;
BEGIN
WRITELN('NHAP SL PHAN TU: ');
READLN(N);
FOR I:=1 TO N DO
BEGIN
WRITELN('NHAP SO THU: ',I,' ');
READLN(A[I]);
END;
TICH:=1;
FOR I:=1 TO N DO
IF A[I] MOD 2 =0 THEN TICH:=TICH*A[I];
WRITELN('TICH CAC SO CHAN LA: ',TICH);
READLN
END.
Tính Trung Bình Cộng
Uses CRT;
Var i,n : Integer;
s : Real;
a : Array[1.. 100] of Real;
Begin
ClrScr;
Write( ‘ Ban muon nhap bao nhieu PT cho mang : ‘ );
Readln(n);
For i := 1 to n do
Begin
Write( ‘ PT A[ ‘ , i , ‘ ]= ’ );
Readln(a[i]); End;
s := 0;
For i := 1 to n do s := s + a[i];
Write( ‘ Trung binh cong cua day so = ‘ , s / n : 0 : 4 );
Readln; End.
Nếu cần tìm phần tử lớn nhất / nhỏ nhất hoặc sắp xếp 1 dòng (1 cột) của mảng 2 chiều thì ta cũng
coi dòng (cột) đó như 1 mảng 1 chiều. Chẳng hạn tất cả các phần tử trên dòng k đều có dạng chỉ số
là a[k,i] với i chạy từ 1 đến n (n là số cột).
Ví dụ 2. Tìm phần tử lớn nhất của dòng k và đổi chỗ nó về phần tử đầu dòng.
procedure timmax(k : integer);
var i, vt, tg : integer;
begin
19
vt := 1; {vt là vị trí của phần tử min dòng k}
for i := 1 to n do
if a[k,i] > a[k,vt] then vt := i; {các phần tử dòng k có dạng a[k,i]}
tg := a[k,1]; a[k,1] := a[k,vt]; a[k,vt] := tg;
end;
Ví dụ 3. Sắp xếp giảm dần cột thứ k.
procedure sapxep(k: integer);
var i,j,tg : integer;
begin
for i := 1 to m-1 do {mỗi cột có m phần tử, vì bảng có m dòng}
for j := i+1 to m do
if a[i,k] > a[j,k] then begin {các phần tử cột k có dạng a[i,k]}
tg := a[i,k]; a[i,k] := a[j,k]; a[j,k] := tg;
end;
end;
Đưa ra các số âm
1. Nhập vào 1 dãy số nguyên gồm N phần tử
(N <= 100)
a. Đưa ra các số âm có trong dãy và vị trí của chúng
Dãy A gồm 5 phần tử: 2 15 -7 4 -20
 Cac so am la:
-7 vi tri la: 3
-20 vi tri la: 5
20
BÀI GIẢI:
USES CRT;
VAR A: ARRAY[1..100] OF INTEGER;
I,N: INTEGER;
BEGIN
WRITELN('NHAP SL PHAN TU: ');
READLN(N);
FOR I:=1 TO N DO
BEGIN
WRITELN('NHAP SO THU: ',I,' ');
READLN(A[I]);
END;
WRITELN('CAC SO AM LA: ');
FOR I:=1 TO N DO
IF A[I] < 0 THEN
BEGIN
WRITE(A[I]:4);
WRITELN(' VI TRI LA: ',I);
END;
READLN
END.
Đếm và tính tổng các số lẻ có trong dãy
Dãy A gồm 6 phần tử: 2 5 8 7 12 3
 Co 3 so le
Tong la: 15
BÀI GIẢI:
USES CRT;
VAR A: ARRAY[1..100] OF INTEGER;
I,N,DEM,S: INTEGER;
BEGIN
WRITELN('NHAP SL PHAN TU: ');
READLN(N);
FOR I:=1 TO N DO
BEGIN
WRITELN('NHAP SO THU: ',I,' ');
READLN(A[I]);
END;
FOR I:=1 TO N DO
IF A[I] MOD 2 <> 0 THEN
21
BEGIN
DEM:=DEM+1;
S:=S+A[I];
END;
WRITELN('CO ',DEM,' SO LE');
WRITELN('TONG LA: ',S);
READLN
END.
Tính TB cộng các bội số của 3 và đưa ra các bội số đó
c. Tính TB cộng các bội số của 3 và đưa ra các bội số đó
vd: Dãy gồm 5 phần tử: 10 6 4 3 13
 Cac boi so cua 3 la:
6 3
TB Cong la: 4.5
BÀI GIẢI:
USES CRT;
VAR A: ARRAY[1..100] OF INTEGER;
I,N,DEM,S: INTEGER;
TBC: REAL;
BEGIN
WRITELN('NHAP SL PHAN TU: ');
READLN(N);
FOR I:=1 TO N DO
BEGIN
WRITELN('NHAP SO THU: ',I,' ');
READLN(A[I]);
END;
WRITELN('CAC BOI SO CUA 3 LA: ');
FOR I:=1 TO N DO
IF A[I] MOD 3 = 0 THEN
BEGIN
WRITE(A[I]:4);
DEM:=DEM+1;
S:=S+A[I];
END;
WRITELN; {XUONG DONG}
TBC:= S/DEM;
WRITELN('TB CONG LA: ',TBC:6:1);
READLN
END.
d) Nhập vào số nguyên K, tìm xem K có trong dãy không?
22
Nhập vào số nguyên K, tìm xem K có trong dãy không? Nếu có thì đưa ra các vị trí của
nó trong dãy. Nếu không thì thông báo “Không tìm thấy”.
Vd: Dãy A gồm 5 phần tử: 1 5 6 12 5
Nhap so can tim: 5
 Cac vi tri cua 5 la: 2 5
BÀI GIẢI:
USES CRT;
VAR A: ARRAY[1..100] OF INTEGER;
I,N,DEM,K: INTEGER;
BEGIN
WRITELN('NHAP SL PHAN TU: ');
READLN(N);
FOR I:=1 TO N DO
BEGIN
WRITELN('NHAP SO THU: ',I,' ');
READLN(A[I]);
END;
WRITE('NHAP SO CAN TIM: ');
READLN(K);
WRITELN('CAC VI TRI CUA ',K,' LA: ');
FOR I:=1 TO N DO
IF A[I] = K THEN
BEGIN
WRITE(I:4);
DEM:=DEM+1;
END;
WRITELN; {XUONG DONG}
IF DEM = 0 THEN WRITELN('KHONG TIM THAY VI TRI NAO');
READLN
END.
23
Bài 14: Viết chương trình mảng một chiều gồm n phần tử n<=100 kiểu nguyên
24
25
26
27
28
29
Bài 15: Nhập họ tên và năm sinh của người và cho biết người này thuộc lứa
tuổi nào: sơ sinh, nhi đồng, thiếu niên, thanh niên, trung niên, người lớn
tuổi. Biết rằng:
+ Sơ sinh tuổi từ 0->0
+ Nhi đồng tuổi từ 2->9
+ Thiếu niên tuổi từ 10->15
+ Thanh niên tuổi 16->32
+ Trung niên tuổi từ 33 -> 50
+ Người già tuổi từ 50 trở lên
30
uses crt;var
a:array[1..100] of longint;
i,n:longint;
begin
clrscr;
write('nhap so nguoi:');
readln(n);
for i:=1 to n do
begin
write('nhap tuoi cua nguoi thu ',i,':');
readln(a[i]);
end;
for i:=1 to n do
begin
write('nguoi thu',i,':');
case a[i] of
0:writeln('tre so sinh');
2..9:writeln('nhi dong');
10..5:writeln('thieu nien');
16..32:writeln('thanh nien');
33..50:writeln('trung nien');
Else writeln('nguoi gia');
end;
end;
readln;
end.
BÀI TẬP NÂNG CAO
Bài tập 1: DHLOCO spoj
Carnaval Hạ Long 2015 với chủ đề “Hội tụ tinh hoa – Lan tỏa nụ cười”, điểm
mới của lễ hội là sự song hành giữa biểu diễn nghệ thuật “Nơi tinh hoa hội tụ” và
diễu hành đường phố “Nụ cười Hạ Long” với sự góp mặt của hơn 2000 diễn viên
quần chúng. Có rất nhiều chương trình vui chơi được tổ chức, một trong những
trò chơi thu hút được nhiều du khách tham gia đó là trò chơi nhảy lò cò, cụ thể:
31
người chơi cần vượt qua một đoạn đường dài n mét, mỗi bước, người chơi có ba
cách nhảy với độ dài bước nhảy tương ứng là 1 mét, 2 mét, 3 mét. Một cách đi
chuyển đúng là dãy các bước nhảy có tổng đúng bằng n.
Yêu cầu: Cho n và M, gọi K là số cách đi chuyển đúng khác nhau để đi hết đoạn
đường n mét, hãy tính phần dư của K chia M.
Input
gồm một dòng chứa hai số nguyên dương n, M (M ≤ 2015);
Output
một số nguyên là phần dư của K chia M.
Example
Input:
5 100
Output
13
Ghi chú:
Có 20% số test ứng với 20% số điểm có n ≤ 20;
Có 40% số test ứng với 40% số điểm có n ≤ 106;
Có 40% số test còn lại ứng với 40% số điểm có n ≤ 1015.:
2. Gợi ý DHLOCO spoj Trò chơi lò cò
-Các bạn sử dụng thuật toán nhân ma trận là dễ nhất
ype matrix=array[1..3,1..3] of int64;
const fi='';
fo='';
var f:text;
a,b:matrix;
n:int64;
m:int64;
procedure input;
begin
32
assign(f,fi);
reset(f);
readln(f,n,m);
close(f);
end;
function nhan(a,b:matrix):matrix;
var c:matrix;
k,u,v:longint;
begin
for u:=1 to 3 do
for v:=1 to 3 do
begin
c[u,v]:=0;
for k:=1 to 3 do
c[u,v]:=(c[u,v]+a[u,k]*b[k,v])mod m;
end;
exit(c);
end;
function luythua(a:matrix;k:int64):matrix;
var b:matrix;
begin
if k=1 then exit(a)
else
begin
b:=luythua(a,k div 2);
b:=nhan(b,b);
if k mod 2 =1 then b:=nhan(b,a);
end;
exit(b);
end;
procedure solve;
begin
a[1,1]:=0; a[1,2]:=1; a[1,3]:=0;
a[2,1]:=0; a[2,2]:=0; a[2,3]:=1;
a[3,1]:=1; a[3,2]:=1; a[3,3]:=1;
b:=luythua(a,n-1);
end;
33
procedure output;
begin
assign(f,fo);
rewrite(f);
case n of
1: writeln(f,1);
2: writeln(f,2 mod m);
3: writeln(f,4 mod m);
else
begin
solve;
writeln(f,(b[1,1]+b[1,2]*2+b[1,3]*4)mod m);
end;
end;
close(f);
end;
BEGIN
input;
output;
END.
Bài tập 2: Cho trước một dãy số dương có N phần tử. Bạn biết trước tổng
của bất kì 2 phần tử nào trong dãy số, hãy tìm dãy số ban đầu.
Input
Dòng đầu tiên là N, số phần tử của dãy số. (2 <= N <= 1000)
N dòng sau, mỗi dòng gồm N số (mỗi số <= 100 000) mô tả ma trận biểu diễn
tổng của 2 phần tử trong dãy.
* S(i,j) = 0 nếu i = j.
* S(i,j) = A[i] + A[j] với i ≠ j, là tổng của phần tử thứ i và thứ j trong dãy số.
Output
In ra trên 1 dòng dãy số cần tìm. Input luôn đảm bảo có 1 đáp số duy nhất.
34
Example
Input1:
2
0 2
2 0
Ouput1:
1 1
Input2:
4
0 3 6 7
3 0 5 6
6 5 0 9
7 6 9 0
Ouput2:
2 1 4 5
const fi='';
nmax=1000;
type
data=longint;
var
f:text;
A:array[1..nmax,1..nmax] of data;
B:array[1..nmax] of data;
N:data;
procedure docfile;
var i,j:data;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do
for j:=1 to n do
35
read(f,a[i,j]);
close(f);
end;
procedure xuli;
var i,j:data;
begin
B[1]:=(A[1,2]+a[1,3]-a[2,3]) div 2;
B[2]:=(a[1,2]-a[1,3]+a[2,3]) div 2;
write(b[1],' ',b[2],' ');
for i:=3 to n do
write((A[1,2]-A[1,i]-a[2,i]) div (-2),' ');
end;
begin
docfile;
xuli;
end.
Bài tập 3: Một đoạn số có tổng bằng nhau trong một dãy số là một nhóm các
số theo đúng thứ tự ban đầu trong dãy mà nếu nhóm với nhau thì sẽ cho ra
cùng một giá trị tổng.
Ví dụ với dãy: 2 5 1 3 3 7 thì ta có thể nhóm thành: (2 5) (1 3 3) (7) cùng cho giá
trị tổng là 7.
Chú ý: đoạn đặc biệt chứa tất cả các phần tử của dãy cũng được coi là một đoạn
có tổng bằng nhau với chính giá trị tổng các số của dãy đó.
Yêu cầu: viết chương trình nhận vào các dãy số nguyên dương và trả về giá
trị tổng nhỏ nhất có thể của một đoạn tổng bằng nhau trong dãy.
Dữ liệu vào
Dòng đầu tiên chứa một số nguyên 1 ≤ t ≤ 1000 là số lượng bộ test. Mỗi bộ test
bao gồm:
 Dòng đầu tiên chứa thứ tự bộ test và số M (1≤ M ≤ 10000) là số phần tử
của dãy.
 Các dòng tiếp theo mỗi dòng ghi 10 số của dãy phân cách bởi 1 dấu cách.
Dòng cuối cùng có thể có ít hơn 10 số. (Các số trong dãy đều nhỏ hơn
20000).
36
Dữ liệu ra
Với mỗi bộ test, in ra trên một dòng gồm số thứ tự bộ test và tổng nhỏ nhất có
thể đạt được của các đoạn số có tổng bằng nhau.
Example
INPUT OUTPUT
31 6
2 5 1 3 3 7
2 6
1 2 3 4 5 6
3 20
1 1 2 1 1 2 1 1 2 1
1 2 1 1 2 1 1 2 1 1
1 72 21
3 2
onst fi='';
nmax=10000;
type data=longint;
var
f:text;
A:array[0..nmax+1] of data;
n,test:data;
function tknp(dau,cuoi,x:data):data;
var giua:data;
begin
while dau<=cuoi do
begin
giua:=(dau+cuoi) div 2;
if a[giua]=x then
exit(giua)
else
if a[giua]>x then
cuoi:=giua-1
else
dau:=giua+1;
end;
exit(0);
37
end;
function check(X,sl:data):boolean;
var i,j,id,vt:data;
begin
id:=0;
for i:=1 to sl do
begin
vt:=tknp(id,n,a[id]+x);
if vt=0 then exit(false);
id:=vt;
end;
exit(true);
end;
procedure xuli;
var i,j:data;
begin
i:=a[n];
if a[n] mod i = 0 then
if check(a[n] div i, i) then
begin
writeln(test,' ',a[n] div i);
exit;
end;
i:=a[n] div 2;
if a[n] mod i = 0 then
if check(a[n] div i, i) then
begin
writeln(test,' ',a[n] div i);
exit;
end;
for i:=trunc(sqrt(a[n])) downto 2 do
if a[n] mod i = 0 then
if check(a[n] div i, i) then
begin
writeln(test,' ',a[n] div i);
38
exit;
end;
writeln(test,' ',a[n]);
end;
procedure docfile;
var i,j,sl:data;
begin
assign(f,fi); reset(f);
read(f,sl);
a[0]:=0;
for i:=1 to sl do
begin
read(f,test,n);
for j:=1 to n do
begin
read(f,a[j]);
a[j]:=a[j-1]+a[j];
end;
xuli;
end;
close(f);
end;
begin
docfile;
end.
Bài tập 4: BONUS Spoj
Tuấn là người chiến thắng trong một cuộc thi “tìm hiểu kiến thức vũ trụ” và
được nhận các phần thưởng do công ty XYZ tài trợ. Các phần thưởng được bố trí
trên một bảng hình vuông nxn có dạng một lưới ô vuông kích thước đơn vị. Các
dòng của bảng được đánh số từ 1 đến n, từ trên xuống dưới và các cột của bảng
được đánh số từ 1 đến n, từ trái qua phải. Ô nằm trên giao của dòng i và cột j
được gọi là ô (i,j) và trên ô đó chứa một món quà có giá trị là a[i,j] (1 <= i, j
<= n)
39
Đề nhận phần thưởng, Tuấn được phép chọn một hình vuông kích thước k x k
chiếm trọn trong một số ô của bảng và nhận tất cả các phần quà có trong các ô
nằm trong hình vuông đó.
Yêu cầu: Hãy xác định tổng giá trị lớn nhất của món quà mà Tuấn có thể nhận
được.
Dữ liệu:
 Dòng thứ nhất chứa hai sô nguyên dương n, k (n <= 1000, n/3 <= k <= n).
 Dòng thứ i trong số n dòng tiếp theo chứa n số nguyên dương, số thứ j là
a[i,j] (a[i,j] <= 1000)
Kết quả:
 Ghi ra một số nguyên duy nhất là tổng giá trị lớn nhất của các món quà mà
Tuấn có thể nhận được.
Ví dụ:
INPUT OUTPUT
Code tham khảo
const fi='';
nmax=1000;
type data=longint;
var
f:text;
A:array[0..nmax+1,0..nmax+1] of longint;
n,k:data;
procedure xuli;
var i,j:data;
4 3
1 9 1 1
9 9 9 9
1 9 9 9
1 9 9 14
86
40
res:data;
begin
assign(f,fi); reset(f);
readln(f,n,k);
for i:=0 to n do
begin
a[i,0]:=0;
a[0,i]:=0;
end;
res:=low(data);
for i:=1 to n do
for j:=1 to n do
begin
read(f,a[i,j]);
A[i,j]:=a[i,j]+a[i-1,j]+a[i,j-1]-a[i-1,j-1];
end;
for i:=k to n do
for j:=k to n do
if res<A[i,j]-A[i-k,j]-A[i,j-k]+a[i-k,j-k] then
res:=A[i,j]-A[i-k,j]-A[i,j-k]+a[i-k,j-k];
writeln(res);
close(f);
end;
begin
xuli;
end.

More Related Content

DOCX
Bai tập mảng
PDF
Bài tập xâu cơ bản-nâng cao
DOC
Bồi dưỡng HSG Tin chuyên đề thuật toán
DOCX
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
PDF
Mot so ham do hoa trong c c++
PPT
Mô hình bài toán xếp TKB cho trường ĐH, CĐ và phần mềm TKBU
PDF
Toán rời rạc-Dành cho sinh viên,người thi cao học
PDF
Phần 3: Các kiểu dữ liệu cơ sở
Bai tập mảng
Bài tập xâu cơ bản-nâng cao
Bồi dưỡng HSG Tin chuyên đề thuật toán
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Mot so ham do hoa trong c c++
Mô hình bài toán xếp TKB cho trường ĐH, CĐ và phần mềm TKBU
Toán rời rạc-Dành cho sinh viên,người thi cao học
Phần 3: Các kiểu dữ liệu cơ sở

What's hot (20)

PDF
Cac ham va thu tuc trong pascal
PDF
Ngôn ngữ lập trình pascal (bổ trợ tin 11)
DOC
Bai tap pascal tong hop
PDF
Sử dụng máy tính cầm tay giải nhanh trắc nghiệm lượng giác – Trần Anh Khoa
PDF
Bai tap-pascal-lop-11
PDF
Quy hoạch động
PPTX
Slide bài tập lớn ngôn ngữ lập trình - phần mềm quản lý thư viện
PDF
Giáo trình môn học lập trình windows với mfc[bookbooming.com]
DOC
Lap trinh c++ có lời giải 1
PDF
Bảng công thức tích phân + mũ lôga
PDF
Bài tập mẫu C và C++ có giải
PDF
Đệ Quy, Quay Lui, Nhánh Cận
PPT
các phân phối xác xuất thường gặp
PPTX
Biến ngẫu nhiên liên tục - Xác suất thống kê
PDF
XAC SUAT THONG KE BUOI 2.pdf
PPTX
Unit 6 nâng cao. Bài 6. Xử lý số và xâu ký tự.
PDF
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
PDF
Chuyên đề, các dạng toán tổ hợp xác suất
PDF
Hd th sql server_tuan5_n_khanh
PDF
Câu hỏi trắc nghiệm PHP
Cac ham va thu tuc trong pascal
Ngôn ngữ lập trình pascal (bổ trợ tin 11)
Bai tap pascal tong hop
Sử dụng máy tính cầm tay giải nhanh trắc nghiệm lượng giác – Trần Anh Khoa
Bai tap-pascal-lop-11
Quy hoạch động
Slide bài tập lớn ngôn ngữ lập trình - phần mềm quản lý thư viện
Giáo trình môn học lập trình windows với mfc[bookbooming.com]
Lap trinh c++ có lời giải 1
Bảng công thức tích phân + mũ lôga
Bài tập mẫu C và C++ có giải
Đệ Quy, Quay Lui, Nhánh Cận
các phân phối xác xuất thường gặp
Biến ngẫu nhiên liên tục - Xác suất thống kê
XAC SUAT THONG KE BUOI 2.pdf
Unit 6 nâng cao. Bài 6. Xử lý số và xâu ký tự.
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Chuyên đề, các dạng toán tổ hợp xác suất
Hd th sql server_tuan5_n_khanh
Câu hỏi trắc nghiệm PHP
Ad

Similar to Bài tập cơ bản-nâng cao mảng (20)

DOC
Bài tập CTDL và GT 4
DOC
Bo de on luyen hsg tin hoc
DOC
Bai tap lam quen java
DOC
Bai tap lam quen java (1)
PDF
Baitapjava
PDF
Java exercises part 2
DOC
Bai tapep ctunglop
PDF
Danhsach baitap
DOC
Bai tap lam quen java
PDF
Baitap ktlt
DOC
Bai tapktlt phan3
DOC
Baitap ktlt
DOCX
Giao an tin hoc 11 - Tuan 08 - On tap chuong 04 - vtq ngoc
DOCX
Data Structures and Algorithms Gụidance
DOC
Bai tap mau pascal
PDF
Homework - C programming language
DOC
Bai tap thuc hanh nhap mon tin hoc
PDF
Ex chapter 6
PPT
PDF
Bài tập CTDL và GT 1
Bài tập CTDL và GT 4
Bo de on luyen hsg tin hoc
Bai tap lam quen java
Bai tap lam quen java (1)
Baitapjava
Java exercises part 2
Bai tapep ctunglop
Danhsach baitap
Bai tap lam quen java
Baitap ktlt
Bai tapktlt phan3
Baitap ktlt
Giao an tin hoc 11 - Tuan 08 - On tap chuong 04 - vtq ngoc
Data Structures and Algorithms Gụidance
Bai tap mau pascal
Homework - C programming language
Bai tap thuc hanh nhap mon tin hoc
Ex chapter 6
Bài tập CTDL và GT 1
Ad

More from Tường Tường (16)

PDF
Một Số Phương Pháp Hỗ Trợ dạy Học
PDF
Bài tập pascal
PPTX
Bài 12: Kiểu Xâu (Tiết 3)
PPTX
Bai12 kieuxau3
PPTX
Bai12 kieuxau 2
PPTX
Bai12 kieuxau3
PPTX
Bai12 kieuxau 2
PPTX
Bai12 kieuxaut1
PPTX
Bai12 kieuxau
PPTX
PPT
Ho sotrinhchieu intel
PPT
Ho sotrinhchieu intel (1)
PPT
Ho sotrinhchieu intel
PPT
Ho sotrinhchieu intel (1)
PPTX
Kịch bản dạy học bài 16 tin học lớp 10
Một Số Phương Pháp Hỗ Trợ dạy Học
Bài tập pascal
Bài 12: Kiểu Xâu (Tiết 3)
Bai12 kieuxau3
Bai12 kieuxau 2
Bai12 kieuxau3
Bai12 kieuxau 2
Bai12 kieuxaut1
Bai12 kieuxau
Ho sotrinhchieu intel
Ho sotrinhchieu intel (1)
Ho sotrinhchieu intel
Ho sotrinhchieu intel (1)
Kịch bản dạy học bài 16 tin học lớp 10

Recently uploaded (20)

PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PPTX
CHƯƠNG I excel,,,,,,,,,,,,,,,,,,,,,,,,,,
PPTX
Bai 11.1 Tuan hoan mau.cấu tạo và vai trò pptx
PDF
SÁNG KIẾN THIẾT KẾ MÔ HÌNH HỆ SINH THÁI HƯỚNG NGHIỆP CHO HỌC SINH THPT TRONG ...
PDF
GIẢI PHÁP NÂNG CAO CÔNG TÁC CHỦ NHIỆM QUA CÁC TIẾT SINH HOẠT THEO CHỦ ĐỀ NHẰ...
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PDF
BÁO CÁO THỰC TẬP KỸ SƯ 2 ĐỀ TÀI TÌM HIỂU QUY TRÌNH CÔNG NGHỆ SẢN XUẤT BÁNH SN...
PPTX
Ứng dụng AI trong hệ thống cơ điện của nhóm 3.pptx
PPTX
Chương 5 của Tâm lí học - Tâm Lí Học Giáo Dục Đạo Đức
PDF
BỘ TÀI LIỆU CHINH PHỤC ĐỈNH CAO TIẾNG ANH NĂM 2026 CHUYÊN ĐỀ ÔN HỌC SINH GIỎI...
PPTX
Slide chương 3 môn thẩm định tài chính dự án
PDF
Cơ bản về matlab simulink cho người mới bắt đầu
PDF
Dao tao va Phat trien NỘI DUNG ÔN THI CHO SINH VIÊN
PDF
TeétOrganicChemistryFromVietNamVeryHardd
PPT
Slide Nguyên lý bảo hiểm đại học knh tế quốc dân
PDF
SÁNG KIẾN “NGHIÊN CỨU VÀ ĐỀ XUẤT GIẢI PHÁP TỰ RÈN LUYỆN KỸ NĂNG MỀM CHO HỌC S...
DOCX
Ôn tập văn học phương đông thi giữa kì ..
PPTX
slide chương 2 excel cơ bản...........,,
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PDF
BÀI HỌC ÔN TẬP CHO THI NỘI DUNG MÔN HOẠCH ĐỊNH
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
CHƯƠNG I excel,,,,,,,,,,,,,,,,,,,,,,,,,,
Bai 11.1 Tuan hoan mau.cấu tạo và vai trò pptx
SÁNG KIẾN THIẾT KẾ MÔ HÌNH HỆ SINH THÁI HƯỚNG NGHIỆP CHO HỌC SINH THPT TRONG ...
GIẢI PHÁP NÂNG CAO CÔNG TÁC CHỦ NHIỆM QUA CÁC TIẾT SINH HOẠT THEO CHỦ ĐỀ NHẰ...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
BÁO CÁO THỰC TẬP KỸ SƯ 2 ĐỀ TÀI TÌM HIỂU QUY TRÌNH CÔNG NGHỆ SẢN XUẤT BÁNH SN...
Ứng dụng AI trong hệ thống cơ điện của nhóm 3.pptx
Chương 5 của Tâm lí học - Tâm Lí Học Giáo Dục Đạo Đức
BỘ TÀI LIỆU CHINH PHỤC ĐỈNH CAO TIẾNG ANH NĂM 2026 CHUYÊN ĐỀ ÔN HỌC SINH GIỎI...
Slide chương 3 môn thẩm định tài chính dự án
Cơ bản về matlab simulink cho người mới bắt đầu
Dao tao va Phat trien NỘI DUNG ÔN THI CHO SINH VIÊN
TeétOrganicChemistryFromVietNamVeryHardd
Slide Nguyên lý bảo hiểm đại học knh tế quốc dân
SÁNG KIẾN “NGHIÊN CỨU VÀ ĐỀ XUẤT GIẢI PHÁP TỰ RÈN LUYỆN KỸ NĂNG MỀM CHO HỌC S...
Ôn tập văn học phương đông thi giữa kì ..
slide chương 2 excel cơ bản...........,,
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
BÀI HỌC ÔN TẬP CHO THI NỘI DUNG MÔN HOẠCH ĐỊNH

Bài tập cơ bản-nâng cao mảng

  • 1. 0 TP.HCM - Năm 2018 GV: PHẠM THỊ BÍCH TƯỜNG EMAIL:bichtuong2312@gmail.com KIỂU DỮ LIỆU CÓ CẤU TRÚC TRONG PASCAL BÀI TẬP MẢNG CƠ BẢN & NÂNG CAO
  • 2. 1 MỤC LỤC BÀI TẬP CƠ BẢN................................................................................................................. 3 Bài tập 1: Viết chương trình tìm giá trị lớn nhất của một mảng chứa các số nguyên gồm N phần tử. ................................................................................................................................. 3 Bài tập 2: Viết chương trình tính tổng bình phương của các số âm trong một mảng gồm N phần tử. ................................................................................................................................. 3 Bài tập 3: Viết chương trình nhập vào một mảng gồm N số nguyên. Sắp xếp lại mảng theo thứ tự tăng dần và in kết quả ra màn hình............................................................................. 4 Bài tập 4: Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào một số nguyên X. Hãy kiểm tra xem phần tử X có trong mảng A hay không?..................... 4 Bài 5: Nhập vào mảng A có N phần tử. Tìm phần tử xuất hiện nhiều nhất trong mảng.... 5 Bài 6: Viết chương trình nhập vào một mảng số nguyên có N phần tử theo thứ tự giảm dần và số M. Chèn số M vào mảng sao cho mảng vẫn có thứ tự giảm dần. In mảng sau khi chèn..................................................................................................................................... 7 Bài7: Nhập vào mảng 1 chiều gồm 1 dãy số nguyên N phần tử. Hãy xóa các phần tử trùng nhau trong mảng và in kết quả ra màn hình.......................................................................... 7 Bài 8: Viết chương trình Kiểm tra số chính phương trong mảng một chiều........................ 9 Bài 10: Viết chương trình nhập vào số nguyên dương N và dãy A gồm N số nguyên A1, A2,... AN. Hãy sắp xếp dãy số trên sao cho các số chẵn chia hết cho 3 lên đầu.................11 dãy, các số lẻ chia hết cho 3 xuống cuối dãy, các số còn lại ở giữa dãy vẫn giữ được ......11 thứ tự trước khi nhập vào. In ra màn hình dãy trước và sau khi sắp xếp mỗi phần tử.....11 cách nhau một khoảng trắng.................................................................................................11 BÀI 11: Nhập vào một số n (5<=n<=10) và n phần tử của dãy a, 1<ai<100 (có kiểm tra dữ liệu khi nhập...........................................................................................................................12 a) In ra các phần tử là số nguyên tố của dãy............................................................12 b) Tính ước chung lớn nhất của tất cả các phần tử của dãy. ..................................12 c) Tính biểu thức sau: ...............................................................................................12 d) Sắp xếp dãy tăng dần và in ra dãy sau sắp xếp.....................................................12 BÀI 12: Cho 1 dãy số gồm n phần tử n<=15. Giá trị từng phần tử là số thực. Thực hiện các chương trình sau: ............................................................................................................16 a) Nhập từ bàn phím số phần tử và giá trị từng phần tử...................................................16 b) Tính tổng các phần tử âm của dãy .................................................................................16 c) Tính tổng và trung bình cộng của các phần tử chẵn của dãy ......................................16 d) Tìm phần tử có giá trị lớn nhất của dãy.........................................................................16 e) Tìm phần tử có giá trị nhỏ nhất......................................................................................16
  • 3. 2 f) Sắp xếp dãy theo chiều giảm dần về giá trị của từng phần tử......................................16 g) In các kết quả trên ra màn hình .....................................................................................16 Bài 14: Viết chương trình mảng một chiều gồm n phần tử n<=100 kiểu nguyên..............23 Bài 15: Nhập họ tên và năm sinh của người và cho biết người này thuộc lứa tuổi nào: sơ sinh, nhi đồng, thiếu niên, thanh niên, trung niên, người lớn tuổi. Biết rằng:..................29 BÀI TẬP NÂNG CAO.........................................................................................................30 Bài tập 1: DHLOCO spoj ......................................................................................................30 Bài tập 2: Cho trước một dãy số dương có N phần tử. Bạn biết trước tổng của bất kì 2 phần tử nào trong dãy số, hãy tìm dãy số ban đầu. ..............................................................33 Bài tập 3: Một đoạn số có tổng bằng nhau trong một dãy số là một nhóm các số theo đúng thứ tự ban đầu trong dãy mà nếu nhóm với nhau thì sẽ cho ra cùng một giá trị tổng. .....35 Bài tập 4: BONUS Spoj..........................................................................................................38
  • 4. 3 BÀI TẬP CƠ BẢN Bài tập 1: Viết chương trình tìm giá trị lớn nhất của một mảng chứa các số nguyên gồm N phần tử. Uses Crt; Type Mang = ARRAY[1..50] Of Integer; Var A:Mang; N,i,Max:Integer; Begin {Nhập mảng} Write(‘Nhap N=’); Readln(N); For i:=1 To N Do Begin Write(‘A[‘,i,’]=’); Readln(A[i]); End; {Tìm phần tử lớn nhất} Max:=A[1]; For i:=2 To N Do If Max<A[i] Then Max:=A[i]; {In kết quả ra màn hình} Writeln(‘Phan tu lon nhat cua mang: ’, Max); Readln; End. Bài tập 2: Viết chương trình tính tổng bình phương của các số âm trong một mảng gồm N phần tử. Uses Crt; Type Mang = ARRAY[1..50] Of Integer; Var A:Mang; N,i,S:Integer; Begin Write(‘Nhap N=’); Readln(N); For i:=1 To N Do Begin
  • 5. 4 Write(‘A[‘,i,’]=’); Readln(A[i]); End; S:=0; For i:=1 To N Do If A[i]<0 Then S:=S+A[i]*A[i]; {In kết quả ra màn hình} Writeln(‘S= ’, S); Readln; End. Bài tập 3: Viết chương trình nhập vào một mảng gồm N số nguyên. Sắp xếp lại mảng theo thứ tự tăng dần và in kết quả ra màn hình. Uses Crt; Type Mang = ARRAY[1..50] Of Integer; Var A:Mang; N,i,j,Tam:Integer; Begin Write(‘Nhap N=’); Readln(N); For i:=1 To N Do Begin Write(‘A[‘,i,’]=’); Readln(A[i]); End; For i:=1 To N-1 Do For j:=i+1 To N Do If A[i]>A[j] Then Begin Tam:=A[i]; A[i]:=A[j]; A[j]:=Tam; End; Writeln(‘Ket qua sau khi sap xep:’); For i:=1 To N Do Write(A[i]:5); Readln; End. Bài tập 4: Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào một số nguyên X. Hãy kiểm tra xem phần tử X có trong mảng A hay không?
  • 6. 5 Uses Crt; Type Mang = ARRAY[1..50] Of Integer; Var A:Mang; N,i,x:Integer; Begin I:=1; While (I <= N) and (X<>A[I]) do I:=I+1; If I <= N Then Timkiem:=I Else Timkiem:=0; End; Begin Write(‘Nhap N=’); Readln(N); For i:=1 To N Do Begin Write(‘A[‘,i,’]=’); Readln(A[i]); End; Write(‘Nhap X=’); Readln(x); If TimKiem(X,N,A)<>0 Then Writeln(‘Vi tri cua X trong mang la:’, TimKiem(X,N,A)) Else Writeln(‘X khong co trong mang.’); Readln; End. Bài 5: Nhập vào mảng A có N phần tử. Tìm phần tử xuất hiện nhiều nhất trong mảng. Uses crt; var a,b:array[1..100] of integer; n,i,j,d,max,k:integer; begin write('N=');readln(n); for i:=1 to n do
  • 7. 6 begin write('a[',i,']=');readln(a[i]); end; for i:=1 to n do begin d:=0; for j:=i to n do if a[i]=a[j] then inc(d); if d>max then begin max:=d; b[1]:=a[i]; k:=1; end else if d=max then begin inc(k); b[k]:=a[i]; end; end; for i:=1 to k do write(b[i],' '); readln; end.
  • 8. 7 Bài 6: Viết chương trình nhập vào một mảng số nguyên có N phần tử theo thứ tự giảm dần và số M. Chèn số M vào mảng sao cho mảng vẫn có thứ tự giảm dần. In mảng sau khi chèn. var a:array[1..100] of integer; n,m,i,j:integer; begin write('N=');readln(n); for i:=1 to n do begin write('a[',i,']=');readln(a[i]); end; write('M=');readln(m); write('Mang sau khi chen: '); for i:=1 to n do begin if (m>=a[i]) and (j=0) then begin write(m,' '); j:=1; end; write(a[i],' '); end; if j=0 then write(m); readln; end. Bài7: Nhập vào mảng 1 chiều gồm 1 dãy số nguyên N phần tử. Hãy xóa các phần tử trùng nhau trong mảng và in kết quả ra màn hình.
  • 9. 8 Program Bo_so_trung; Const Max=100; Var a:Array[1..Max] Of Integer; i,j,k,n:Integer; Begin Writeln('XOA BO CAC SO TRUNG NHAU'); Readln(n); For i:=1 To N Do Begin Write('-Phan tu A[',i,']= '); Readln(a[i]); End; i:=2; While i <= N Do Begin j:=1; While a[j] <> a[i] Do j:=j+1; If j < i Then Begin For k:=i to n-1 Do
  • 10. 9 a[k]:= a[k+1]; n:=n-1; End Else i:=i+1; End; For i:=1 to n Do Write(a[i]:8); Writeln(' Bam phim <Enter> de ket thuc '); Readln End. Bài 8: Viết chương trình Kiểm tra số chính phương trong mảng một chiều. uses crt; type ArrInt = array[1..250] of integer; Var n,i,x : integer; a: ArrInt; BEGIN clrscr; write('Nhap so phan tu: '); readln(n); for i:=1 to n do begin write('Phan tu thu ',i,'= '); readln(a[i]); end; writeln('Cac so chinh phuong co trong mang:'); for i:=1 to n do begin x:=trunc(sqrt(a[i])); if sqr(x)=a[i] then write(a[i]:4); end; readln; END.
  • 11. 10 Bài 9: Viết chương trình nhập số nguyên N (0 < N ≤ 10 000) và mảng a gồm N số nguyên. Tính và in ra trung bình cộng của các số âm, số dương trong a. Không tính số 0. Ví dụ : a[] = {1, -6, 0, 3, -1}. Trung bình cộng là -0.75 PROGRAM tbc_am_duong_mang; USES crt; VAR a:ARRAY[1..100] OF REAL; i,n,x,y:INTEGER; tongam,tongduong,tba,tbd:REAL; BEGIN clrscr; write('So phan tu cua day n= ');readln(n); FOR i:=1 TO n DO BEGIN write('Nhap phan tu a[',i,']: '); readln(a[i]); END; tongam:=0; x:=0; FOR i:=1 TO n DO IF a[i]<0 THEN BEGIN tongam:=tongam+a[i]; x:=x+1; END; tba:=tongam/x; write('TB cong cac so am la: ',tba:5:1); writeln; tongduong:=0; y:=0; FOR i:=1 TO n DO IF a[i]>0 THEN BEGIN tongduong:=tongduong+a[i]; y:=y+1; END; tbd:=tongduong/y; write('TB cong cac so duong la: ',tbd:5:1); readln; END.
  • 12. 11 Bài 10: Viết chương trình nhập vào số nguyên dương N và dãy A gồm N số nguyên A1, A2,... AN. Hãy sắp xếp dãy số trên sao cho các số chẵn chia hết cho 3 lên đầu dãy, các số lẻ chia hết cho 3 xuống cuối dãy, các số còn lại ở giữa dãy vẫn giữ được thứ tự trước khi nhập vào. In ra màn hình dãy trước và sau khi sắp xếp mỗi phần tử cách nhau một khoảng trắng Output: Dãy trước khi sắp xếp: 1 6 5 9 12 3 4 15 7 Dãy sau khi sắp xếp: 6 12 1 5 4 7 9 3 15 Program bai1; Uses crt; Var A: array[1..250] of integer; i, N: integer; Begin Clrscr; Write(‘nhap so luong phan tu N= ‘); readln(N); For i:= 1 to N do Begin Write(‘A[‘,I,‘] = ‘);readln(A[i]); End; Writeln(‘Day truoc khi sap xep‘); For i:= 1 to N do write(A[i], ‘ ‘); Writeln; Writeln(‘Day sao khi sap xep‘); For i:=1 to N do If (A[i] mod 2=0) and (A[i] mod 3=0) write(A[i], ‘ ‘); For i:=1 to N do If ((A[i] mod 2=0) and (A[i] mod 3<>0)) or ((A[i] mod 2<>0) and (A[i] mod 3<>0)) write(A[i], ‘ ‘); For i:=1 to N do If (A[i] mod 2<>0) and (A[i] mod 3=0) write(A[i], ‘ ‘);
  • 13. 12 BÀI 11: Nhập vào một số n (5<=n<=10) và n phần tử của dãy a, 1<ai<100 (có kiểm tra dữ liệu khi nhập. a) In ra các phần tử là số nguyên tố của dãy. b) Tính ước chung lớn nhất của tất cả các phần tử của dãy. c) Tính biểu thức sau: d) Sắp xếp dãy tăng dần và in ra dãy sau sắp xếp. HƯỚNG DẪN Ta nên chia chương trình thành các chương trình con, mỗi chương trình thực hiện một yêu cầu. Ngoài ra ta cũng viết thêm các hàm kiểm tra nguyên tố, hàm mũ, hàm UCLN để thực hiện các yêu cầu đó. Chương trình như sau: Khai báo dữ liệu: uses crt; var n : integer; a : array[1..10] of integer; {n<=10 nên mảng có tối đa 10 phần tử} Thủ tục nhập dữ liệu, có kiểm tra khi nhập. procedure nhap; var i : integer; begin clrscr; write('NHAP VAO SO PHAN TU N = '); repeat readln(n); if (5<=n) and (n<=10) then break; {nếu thoã mãn thì dừng vòng lặp} writeln('Khong hop le (5<=n<=10). Nhap lai!!!'); {ngược lại thì báo lỗi} until false; writeln('NHAP VAO N PHAN TU (1<ai<100)');
  • 14. 13 for i := 1 to n do begin write('a',i,'='); repeat readln(a[i]); if (1<a[i]) and (a[i]<100) then break; writeln('Khong hop le. Nhap lai!!!'); until false; end; end; function ngto(n : integer): boolean; {hàm kiểm tra nguyên tố, xem giải thích ở phần trên} var i : integer; begin ngto := false; if n < 2 then exit; for i := 2 to round(sqrt(n)) do if n mod i = 0 then exit; ngto := true; end; Thủ tục in các số nguyên tố của một mảng procedure inngto; var i :integer; begin writeln('CAC PHAN TU NGUYEN TO TRONG DAY:'); for i := 1 to n do {duyệt qua mọi phần tử từ 1 đến n}
  • 15. 14 if ngto(a[i]) then writeln(a[i]); {nếu ai là nguyên tố thì in ra} end; function UCLN(a,b: integer): integer; var r : integer; begin while b<>0 do begin r := a mod b; a := b; b := r; end; UCLN := a; end; Thủ tục tính UCLN của các phần tử của một mảng procedure TinhUC; var i,u : integer; begin u := a[1]; {u là UCLN của các phần tử từ 1 đến i} for i := 2 to n do u := UCLN(u,a[i]); {là UCLN của các phần tử từ 1 đến i-1 và ai} writeln('UCLN cua ca day la:',u); end; function hammu(a : real; n : integer): real; {hàm mũ tính an} var s : real; i : integer; begin
  • 16. 15 s := 1; for i := 1 to n do s := s * a; hammu := s; end; Thủ tục tính tổng các phần tử có lấy mũ: procedure tong; var s : real; i : integer; {s phải khai báo là số thực để tránh tràn số} begin s := 0; for i := 1 to n do s := s + hammu(a[i],i); {s := s + (ai)i} writeln('Tong can tinh:',s:10:0); end; Thủ tục sắp xếp tăng dần các phần tử của một mảng: procedure sxep; var i,j,tg : integer; begin for i := 1 to n-1 do for j := i + 1 to n do if a[i] > a[j] then begin tg := a[i]; a[i] := a[j]; a[j] := tg; end; writeln('DAY SAU KHI SAP XEP TANG DAN:'); for i := 1 to n do writeln(a[i]); end;
  • 17. 16 Chương trình chính: lần lượt gọi từng thủ tục BEGIN nhap; inngto; tinhuc; tong; sxep; END. BÀI 12: Cho 1 dãy số gồm n phần tử n<=15. Giá trị từng phần tử là số thực. Thực hiện các chương trình sau: a) Nhập từ bàn phím số phần tử và giá trị từng phần tử b) Tính tổng các phần tử âm của dãy c) Tính tổng và trung bình cộng của các phần tử chẵn của dãy d) Tìm phần tử có giá trị lớn nhất của dãy e) Tìm phần tử có giá trị nhỏ nhất f) Sắp xếp dãy theo chiều giảm dần về giá trị của từng phần tử g) In các kết quả trên ra màn hình program vd1; var i,n :Byte; ta, tb, b, c, d :real; a: array[1..15] of real ; begin write(' nhập số lượng phần tử n ='); readln(n); Writeln('Nhap mang a: '); for i:=1 to n do begin write('a[',i,']= '); readln(a[i]) end; ta:=0;
  • 18. 17 for i:=1 to n do if a[i] <0 then ta= ta + a[i] ; { tính tổng âm} tc:= 0; t:=1; for i:=1 to n do if i mod 2 =0 then begin t= t+1 ; tc= tc + a[i] ; {tính tổng phần tư chẵn} end; ttc = tc/t ; { trung bình phần tử chẵn} max:= a[1]; for i=2 to n do if max < a[i] then max =a[i] ; { tìm phần tử lớn nhất} min:= a[1]; for i=2 to n do if min > a[i] then min =a[i] ; { tìm phần tử nhỏ nhất} for i=2 to n do for j=n down to i do if (a[j]> a[j-1]) then begin b:= a[j-1] ; a[j-1]:=a[j]; a[j]:=b; end; {sắp xếp các phần tử giảm dần về giá trị} for i=1 to n then begin write( a[i]); writeln; end; {in ra theo chiều dọc mảng} end. hết nếu muốn in theo chiều ngang for i=1 to n then begin write( a[i]); write(' '); { dấu cách giữa 2 giấu ' } end; có gì sai sót thì bạn sửa nhe như khai báo các biến ấy có thể thiếu. cái này học hồi 11 nên không nhớ rõ lắm - Yêu cầu: Chạy lại chương trình với dãy A như sau: 12 4 6 9 Nhập số cần tìm là: 7  Xem kết quả e. Tính tích các số chắn trong dãy vd: Dãy A gồm 7 phần tử: 5 13 4 7 2 10  Tich cac so chan la: 80 BÀI GIẢI: USES CRT; VAR A: ARRAY[1..100] OF INTEGER; I,N: INTEGER;
  • 19. 18 TICH: LONGINT; BEGIN WRITELN('NHAP SL PHAN TU: '); READLN(N); FOR I:=1 TO N DO BEGIN WRITELN('NHAP SO THU: ',I,' '); READLN(A[I]); END; TICH:=1; FOR I:=1 TO N DO IF A[I] MOD 2 =0 THEN TICH:=TICH*A[I]; WRITELN('TICH CAC SO CHAN LA: ',TICH); READLN END. Tính Trung Bình Cộng Uses CRT; Var i,n : Integer; s : Real; a : Array[1.. 100] of Real; Begin ClrScr; Write( ‘ Ban muon nhap bao nhieu PT cho mang : ‘ ); Readln(n); For i := 1 to n do Begin Write( ‘ PT A[ ‘ , i , ‘ ]= ’ ); Readln(a[i]); End; s := 0; For i := 1 to n do s := s + a[i]; Write( ‘ Trung binh cong cua day so = ‘ , s / n : 0 : 4 ); Readln; End. Nếu cần tìm phần tử lớn nhất / nhỏ nhất hoặc sắp xếp 1 dòng (1 cột) của mảng 2 chiều thì ta cũng coi dòng (cột) đó như 1 mảng 1 chiều. Chẳng hạn tất cả các phần tử trên dòng k đều có dạng chỉ số là a[k,i] với i chạy từ 1 đến n (n là số cột). Ví dụ 2. Tìm phần tử lớn nhất của dòng k và đổi chỗ nó về phần tử đầu dòng. procedure timmax(k : integer); var i, vt, tg : integer; begin
  • 20. 19 vt := 1; {vt là vị trí của phần tử min dòng k} for i := 1 to n do if a[k,i] > a[k,vt] then vt := i; {các phần tử dòng k có dạng a[k,i]} tg := a[k,1]; a[k,1] := a[k,vt]; a[k,vt] := tg; end; Ví dụ 3. Sắp xếp giảm dần cột thứ k. procedure sapxep(k: integer); var i,j,tg : integer; begin for i := 1 to m-1 do {mỗi cột có m phần tử, vì bảng có m dòng} for j := i+1 to m do if a[i,k] > a[j,k] then begin {các phần tử cột k có dạng a[i,k]} tg := a[i,k]; a[i,k] := a[j,k]; a[j,k] := tg; end; end; Đưa ra các số âm 1. Nhập vào 1 dãy số nguyên gồm N phần tử (N <= 100) a. Đưa ra các số âm có trong dãy và vị trí của chúng Dãy A gồm 5 phần tử: 2 15 -7 4 -20  Cac so am la: -7 vi tri la: 3 -20 vi tri la: 5
  • 21. 20 BÀI GIẢI: USES CRT; VAR A: ARRAY[1..100] OF INTEGER; I,N: INTEGER; BEGIN WRITELN('NHAP SL PHAN TU: '); READLN(N); FOR I:=1 TO N DO BEGIN WRITELN('NHAP SO THU: ',I,' '); READLN(A[I]); END; WRITELN('CAC SO AM LA: '); FOR I:=1 TO N DO IF A[I] < 0 THEN BEGIN WRITE(A[I]:4); WRITELN(' VI TRI LA: ',I); END; READLN END. Đếm và tính tổng các số lẻ có trong dãy Dãy A gồm 6 phần tử: 2 5 8 7 12 3  Co 3 so le Tong la: 15 BÀI GIẢI: USES CRT; VAR A: ARRAY[1..100] OF INTEGER; I,N,DEM,S: INTEGER; BEGIN WRITELN('NHAP SL PHAN TU: '); READLN(N); FOR I:=1 TO N DO BEGIN WRITELN('NHAP SO THU: ',I,' '); READLN(A[I]); END; FOR I:=1 TO N DO IF A[I] MOD 2 <> 0 THEN
  • 22. 21 BEGIN DEM:=DEM+1; S:=S+A[I]; END; WRITELN('CO ',DEM,' SO LE'); WRITELN('TONG LA: ',S); READLN END. Tính TB cộng các bội số của 3 và đưa ra các bội số đó c. Tính TB cộng các bội số của 3 và đưa ra các bội số đó vd: Dãy gồm 5 phần tử: 10 6 4 3 13  Cac boi so cua 3 la: 6 3 TB Cong la: 4.5 BÀI GIẢI: USES CRT; VAR A: ARRAY[1..100] OF INTEGER; I,N,DEM,S: INTEGER; TBC: REAL; BEGIN WRITELN('NHAP SL PHAN TU: '); READLN(N); FOR I:=1 TO N DO BEGIN WRITELN('NHAP SO THU: ',I,' '); READLN(A[I]); END; WRITELN('CAC BOI SO CUA 3 LA: '); FOR I:=1 TO N DO IF A[I] MOD 3 = 0 THEN BEGIN WRITE(A[I]:4); DEM:=DEM+1; S:=S+A[I]; END; WRITELN; {XUONG DONG} TBC:= S/DEM; WRITELN('TB CONG LA: ',TBC:6:1); READLN END. d) Nhập vào số nguyên K, tìm xem K có trong dãy không?
  • 23. 22 Nhập vào số nguyên K, tìm xem K có trong dãy không? Nếu có thì đưa ra các vị trí của nó trong dãy. Nếu không thì thông báo “Không tìm thấy”. Vd: Dãy A gồm 5 phần tử: 1 5 6 12 5 Nhap so can tim: 5  Cac vi tri cua 5 la: 2 5 BÀI GIẢI: USES CRT; VAR A: ARRAY[1..100] OF INTEGER; I,N,DEM,K: INTEGER; BEGIN WRITELN('NHAP SL PHAN TU: '); READLN(N); FOR I:=1 TO N DO BEGIN WRITELN('NHAP SO THU: ',I,' '); READLN(A[I]); END; WRITE('NHAP SO CAN TIM: '); READLN(K); WRITELN('CAC VI TRI CUA ',K,' LA: '); FOR I:=1 TO N DO IF A[I] = K THEN BEGIN WRITE(I:4); DEM:=DEM+1; END; WRITELN; {XUONG DONG} IF DEM = 0 THEN WRITELN('KHONG TIM THAY VI TRI NAO'); READLN END.
  • 24. 23 Bài 14: Viết chương trình mảng một chiều gồm n phần tử n<=100 kiểu nguyên
  • 25. 24
  • 26. 25
  • 27. 26
  • 28. 27
  • 29. 28
  • 30. 29 Bài 15: Nhập họ tên và năm sinh của người và cho biết người này thuộc lứa tuổi nào: sơ sinh, nhi đồng, thiếu niên, thanh niên, trung niên, người lớn tuổi. Biết rằng: + Sơ sinh tuổi từ 0->0 + Nhi đồng tuổi từ 2->9 + Thiếu niên tuổi từ 10->15 + Thanh niên tuổi 16->32 + Trung niên tuổi từ 33 -> 50 + Người già tuổi từ 50 trở lên
  • 31. 30 uses crt;var a:array[1..100] of longint; i,n:longint; begin clrscr; write('nhap so nguoi:'); readln(n); for i:=1 to n do begin write('nhap tuoi cua nguoi thu ',i,':'); readln(a[i]); end; for i:=1 to n do begin write('nguoi thu',i,':'); case a[i] of 0:writeln('tre so sinh'); 2..9:writeln('nhi dong'); 10..5:writeln('thieu nien'); 16..32:writeln('thanh nien'); 33..50:writeln('trung nien'); Else writeln('nguoi gia'); end; end; readln; end. BÀI TẬP NÂNG CAO Bài tập 1: DHLOCO spoj Carnaval Hạ Long 2015 với chủ đề “Hội tụ tinh hoa – Lan tỏa nụ cười”, điểm mới của lễ hội là sự song hành giữa biểu diễn nghệ thuật “Nơi tinh hoa hội tụ” và diễu hành đường phố “Nụ cười Hạ Long” với sự góp mặt của hơn 2000 diễn viên quần chúng. Có rất nhiều chương trình vui chơi được tổ chức, một trong những trò chơi thu hút được nhiều du khách tham gia đó là trò chơi nhảy lò cò, cụ thể:
  • 32. 31 người chơi cần vượt qua một đoạn đường dài n mét, mỗi bước, người chơi có ba cách nhảy với độ dài bước nhảy tương ứng là 1 mét, 2 mét, 3 mét. Một cách đi chuyển đúng là dãy các bước nhảy có tổng đúng bằng n. Yêu cầu: Cho n và M, gọi K là số cách đi chuyển đúng khác nhau để đi hết đoạn đường n mét, hãy tính phần dư của K chia M. Input gồm một dòng chứa hai số nguyên dương n, M (M ≤ 2015); Output một số nguyên là phần dư của K chia M. Example Input: 5 100 Output 13 Ghi chú: Có 20% số test ứng với 20% số điểm có n ≤ 20; Có 40% số test ứng với 40% số điểm có n ≤ 106; Có 40% số test còn lại ứng với 40% số điểm có n ≤ 1015.: 2. Gợi ý DHLOCO spoj Trò chơi lò cò -Các bạn sử dụng thuật toán nhân ma trận là dễ nhất ype matrix=array[1..3,1..3] of int64; const fi=''; fo=''; var f:text; a,b:matrix; n:int64; m:int64; procedure input; begin
  • 33. 32 assign(f,fi); reset(f); readln(f,n,m); close(f); end; function nhan(a,b:matrix):matrix; var c:matrix; k,u,v:longint; begin for u:=1 to 3 do for v:=1 to 3 do begin c[u,v]:=0; for k:=1 to 3 do c[u,v]:=(c[u,v]+a[u,k]*b[k,v])mod m; end; exit(c); end; function luythua(a:matrix;k:int64):matrix; var b:matrix; begin if k=1 then exit(a) else begin b:=luythua(a,k div 2); b:=nhan(b,b); if k mod 2 =1 then b:=nhan(b,a); end; exit(b); end; procedure solve; begin a[1,1]:=0; a[1,2]:=1; a[1,3]:=0; a[2,1]:=0; a[2,2]:=0; a[2,3]:=1; a[3,1]:=1; a[3,2]:=1; a[3,3]:=1; b:=luythua(a,n-1); end;
  • 34. 33 procedure output; begin assign(f,fo); rewrite(f); case n of 1: writeln(f,1); 2: writeln(f,2 mod m); 3: writeln(f,4 mod m); else begin solve; writeln(f,(b[1,1]+b[1,2]*2+b[1,3]*4)mod m); end; end; close(f); end; BEGIN input; output; END. Bài tập 2: Cho trước một dãy số dương có N phần tử. Bạn biết trước tổng của bất kì 2 phần tử nào trong dãy số, hãy tìm dãy số ban đầu. Input Dòng đầu tiên là N, số phần tử của dãy số. (2 <= N <= 1000) N dòng sau, mỗi dòng gồm N số (mỗi số <= 100 000) mô tả ma trận biểu diễn tổng của 2 phần tử trong dãy. * S(i,j) = 0 nếu i = j. * S(i,j) = A[i] + A[j] với i ≠ j, là tổng của phần tử thứ i và thứ j trong dãy số. Output In ra trên 1 dòng dãy số cần tìm. Input luôn đảm bảo có 1 đáp số duy nhất.
  • 35. 34 Example Input1: 2 0 2 2 0 Ouput1: 1 1 Input2: 4 0 3 6 7 3 0 5 6 6 5 0 9 7 6 9 0 Ouput2: 2 1 4 5 const fi=''; nmax=1000; type data=longint; var f:text; A:array[1..nmax,1..nmax] of data; B:array[1..nmax] of data; N:data; procedure docfile; var i,j:data; begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n do for j:=1 to n do
  • 36. 35 read(f,a[i,j]); close(f); end; procedure xuli; var i,j:data; begin B[1]:=(A[1,2]+a[1,3]-a[2,3]) div 2; B[2]:=(a[1,2]-a[1,3]+a[2,3]) div 2; write(b[1],' ',b[2],' '); for i:=3 to n do write((A[1,2]-A[1,i]-a[2,i]) div (-2),' '); end; begin docfile; xuli; end. Bài tập 3: Một đoạn số có tổng bằng nhau trong một dãy số là một nhóm các số theo đúng thứ tự ban đầu trong dãy mà nếu nhóm với nhau thì sẽ cho ra cùng một giá trị tổng. Ví dụ với dãy: 2 5 1 3 3 7 thì ta có thể nhóm thành: (2 5) (1 3 3) (7) cùng cho giá trị tổng là 7. Chú ý: đoạn đặc biệt chứa tất cả các phần tử của dãy cũng được coi là một đoạn có tổng bằng nhau với chính giá trị tổng các số của dãy đó. Yêu cầu: viết chương trình nhận vào các dãy số nguyên dương và trả về giá trị tổng nhỏ nhất có thể của một đoạn tổng bằng nhau trong dãy. Dữ liệu vào Dòng đầu tiên chứa một số nguyên 1 ≤ t ≤ 1000 là số lượng bộ test. Mỗi bộ test bao gồm:  Dòng đầu tiên chứa thứ tự bộ test và số M (1≤ M ≤ 10000) là số phần tử của dãy.  Các dòng tiếp theo mỗi dòng ghi 10 số của dãy phân cách bởi 1 dấu cách. Dòng cuối cùng có thể có ít hơn 10 số. (Các số trong dãy đều nhỏ hơn 20000).
  • 37. 36 Dữ liệu ra Với mỗi bộ test, in ra trên một dòng gồm số thứ tự bộ test và tổng nhỏ nhất có thể đạt được của các đoạn số có tổng bằng nhau. Example INPUT OUTPUT 31 6 2 5 1 3 3 7 2 6 1 2 3 4 5 6 3 20 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 1 72 21 3 2 onst fi=''; nmax=10000; type data=longint; var f:text; A:array[0..nmax+1] of data; n,test:data; function tknp(dau,cuoi,x:data):data; var giua:data; begin while dau<=cuoi do begin giua:=(dau+cuoi) div 2; if a[giua]=x then exit(giua) else if a[giua]>x then cuoi:=giua-1 else dau:=giua+1; end; exit(0);
  • 38. 37 end; function check(X,sl:data):boolean; var i,j,id,vt:data; begin id:=0; for i:=1 to sl do begin vt:=tknp(id,n,a[id]+x); if vt=0 then exit(false); id:=vt; end; exit(true); end; procedure xuli; var i,j:data; begin i:=a[n]; if a[n] mod i = 0 then if check(a[n] div i, i) then begin writeln(test,' ',a[n] div i); exit; end; i:=a[n] div 2; if a[n] mod i = 0 then if check(a[n] div i, i) then begin writeln(test,' ',a[n] div i); exit; end; for i:=trunc(sqrt(a[n])) downto 2 do if a[n] mod i = 0 then if check(a[n] div i, i) then begin writeln(test,' ',a[n] div i);
  • 39. 38 exit; end; writeln(test,' ',a[n]); end; procedure docfile; var i,j,sl:data; begin assign(f,fi); reset(f); read(f,sl); a[0]:=0; for i:=1 to sl do begin read(f,test,n); for j:=1 to n do begin read(f,a[j]); a[j]:=a[j-1]+a[j]; end; xuli; end; close(f); end; begin docfile; end. Bài tập 4: BONUS Spoj Tuấn là người chiến thắng trong một cuộc thi “tìm hiểu kiến thức vũ trụ” và được nhận các phần thưởng do công ty XYZ tài trợ. Các phần thưởng được bố trí trên một bảng hình vuông nxn có dạng một lưới ô vuông kích thước đơn vị. Các dòng của bảng được đánh số từ 1 đến n, từ trên xuống dưới và các cột của bảng được đánh số từ 1 đến n, từ trái qua phải. Ô nằm trên giao của dòng i và cột j được gọi là ô (i,j) và trên ô đó chứa một món quà có giá trị là a[i,j] (1 <= i, j <= n)
  • 40. 39 Đề nhận phần thưởng, Tuấn được phép chọn một hình vuông kích thước k x k chiếm trọn trong một số ô của bảng và nhận tất cả các phần quà có trong các ô nằm trong hình vuông đó. Yêu cầu: Hãy xác định tổng giá trị lớn nhất của món quà mà Tuấn có thể nhận được. Dữ liệu:  Dòng thứ nhất chứa hai sô nguyên dương n, k (n <= 1000, n/3 <= k <= n).  Dòng thứ i trong số n dòng tiếp theo chứa n số nguyên dương, số thứ j là a[i,j] (a[i,j] <= 1000) Kết quả:  Ghi ra một số nguyên duy nhất là tổng giá trị lớn nhất của các món quà mà Tuấn có thể nhận được. Ví dụ: INPUT OUTPUT Code tham khảo const fi=''; nmax=1000; type data=longint; var f:text; A:array[0..nmax+1,0..nmax+1] of longint; n,k:data; procedure xuli; var i,j:data; 4 3 1 9 1 1 9 9 9 9 1 9 9 9 1 9 9 14 86
  • 41. 40 res:data; begin assign(f,fi); reset(f); readln(f,n,k); for i:=0 to n do begin a[i,0]:=0; a[0,i]:=0; end; res:=low(data); for i:=1 to n do for j:=1 to n do begin read(f,a[i,j]); A[i,j]:=a[i,j]+a[i-1,j]+a[i,j-1]-a[i-1,j-1]; end; for i:=k to n do for j:=k to n do if res<A[i,j]-A[i-k,j]-A[i,j-k]+a[i-k,j-k] then res:=A[i,j]-A[i-k,j]-A[i,j-k]+a[i-k,j-k]; writeln(res); close(f); end; begin xuli; end.