Ý tưởng thuật toán: Bắt đầu từ vị trí đầu tiên, nếu thấy 2 phần tử liền kề nhau mà phần tử đứng trước lớn hơn phần tử sau thì đổi chổ chúng.. Để ý: Sau 1 lượt đổi chổ thì số lớn nhất sẽ
Trang 1Bt1: đếm số phần tử khác nhau trong dãy
{16- Dem so cac phan tu khac nhau cua day}
d2:=n;
for i:=1 to n-1 do for j:=i+1 to n do
if a[i]=a[j] then d2:=d2-1;
writeln('So phan tu khac nhau trong day la: ',d2);
Bt2: xóa phần tử ở vị trí z
{15- Xoa phan tu o vi tri z } writeln;
write('Nhap vao vi tri can xoa z= ');
repeat readln(z);
if (z<1) or (z>10) then write('Moi ban nhap lai');
until (z>=1) and (z<=10);
for i:=z to n-1 do a[i]:=a[i+1];
n:=n-1;
for i:=1 to n do write(a[i]:5);
Bt3: sắp xếp phần tử theo chiều âm giảm, dương tăng
{5- Sap xep cac phan tu am giam dan duong tang dan} writeln;
d:=0;
for i:=1 to n do
if a[i]<=0 then begin
d:=d+1;
tg:=a[i];
a[i]:=a[d];
a[d]:=tg;
end;
for i:=1 to d-1 do for j:=i+1 to d do
if a[i]<=a[j] then begin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
Trang 2end;
for i:=d+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('Cac phan tu duoc sap xep theo thu tu am giam dam va duong tang dan la:');
for i:=1 to n do write(a[i]:5);
Bt4: chèn phần tử vào dãy
program Chen;
uses crt;
Const Max=1000;
Type Day=array[1 Max] of longint;
Var A:Day;
N,i,k, m:integer;
BEGIN Clrscr;
Write('So phan tu cua day so la N=');readln(N);
Writeln('Nhap cac phan tu cua day so');
For i:=1 to N do Begin
Write('A[',i,']=');readln(A[i]);
End;
Write('Nhap vao phan tu can chen vao day so da cho la:');
Readln(m);
A[N]:=m;
For i:=1 to N do write(A[i]:8:2);
Readln;
For i:=N downto 2 do A[i]:=A[i-1];
A[1]:=m;
For i:=1 to N do write(A[i]:8:2);
Readln;
Trang 3Repeat {chèn vào vị trí trong dãy} Write('Vi tri thu k can chen la :');readln(k);
Until (k>=1)and(k<=N);
inc(N);
For i:=N downto k+1 do A[i]:=A[i-1]; {Keo}
A[k]:=m;
For i:=1 to N do write(A[i]:8:2);
Readln;
END
Bt5: Tim doan dai nhat gom cac so 0 lien tiep
var a:array[1 100] of integer;
n,dem,i,j,tong,max,vt:integer;
begin write('Nhap so phan tu cua mang:');readln(n);
for i:=1 to n do begin
write('Nhap a[',i,']:');readln(a[i]);
end;
dem:=0;
for i:=1 to n do begin
if a[i] =0 then dem:=dem+1 else dem:=0;
if dem>max then max:=dem;
end;
write('Doan dai nhat gom cac so 0 lien tiep la ',max);
readln;
end
Bt6: xóa bỏ các số trùng nhau trong dãy
PROGRAM Bo_so_trung;
VAR a:ARRAY[1 100] OF INTEGER;
i,j,k,n:INTEGER;
BEGIN Writeln('XOA BO CAC SO TRUNG NHAU'); Writeln(' -');
Writeln;
Write('-Nhap so phan tu mang: ');
Readln(n);
FOR i:=1 TO N DO BEGIN
Write('-Phan tu A[',i,']= ');
Trang 4Readln(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 a[k]:= a[k+1];
n:=n-1;
END ELSE i:=i+1;
END;
Writeln;
Write('-Mang con lai: ');
FOR i:=1 TO n DO Write(a[i]:8);
Writeln;
Writeln(' Bam phim <Enter> de ket thuc ');
Readln END.
Bài 2: Bài toán tìm vị trí phần tử đầu tiên của dãy A có giá trị bằng một số nguyên
K cho trước
Để ý: Dãy A có thể tồn tại phần tử có giá trị bằng K, tuy nhiên cũng có thể không tồn tại phần tử nào có giá trị bằng K Vì vậy output của bài toán có thể là một trong hai trường hợp trên
Ý tưởng thuật toán:
Lần lượt xét các phần tử thứ i của dãy A bắt đầu từ phần tử đầu tiên Ta tiến hành kiểm tra phần tử đó có giá trị bằng K không Nếu A[i] bằng K thì ta kết thúc việc tìm kiếm và đưa ra vị trí i, ngược lại, ta tiếp tục kiểm tra phần tử tiếp theo cho đến hết dãy nếu không có A[i] nào bằng K
Đoạn chương trình xử lý:
i:=1;
while (A[i]<>K) and (i<=N) do i:=i+1;
if A[i]=K then writeln(‘Vi tri phan tu co gia tri bang ‘,K, ‘ la:’,i)
else writeln(‘Khong co phan tu nao trong day co gia tri bang ‘, K);
+ Một cách tổng quát: Ta có thể khái quát Thuật toán giải bài toán tìm kiếm phần tử đầu tiên của dãy thỏa một điều kiện nào đó như sau:
i:=1;
while (A[i] <chưa thỏa đk tìm kiếm>) and (i<=N) do i:=i+1;
Trang 5if A[i] <thỏa đk tìm kiếm> then
writeln(‘Vi tri phan tu dau tien cua day A thoa dk tim kiem la: ‘, i)
else write(‘Day A khong co phan tu nao thoa dk tim kiem’);
Ví dụ: Bài toán Tìm số nguyên âm đầu tiên của dãy sẽ có thuật toán như sau:
i:=1;
while (A[i]>=0) and (i<=N) do i:=i+1;
if A[i]<0 then writeln(‘Vi tri phan tu am dau tien cua day la:’,i)
else writeln(‘Day A khong co phan tu co gia tri am’);
Bài toán mở rộng: Tìm phần tử âm nhỏ nhất trong dãy(đây là bài toán kết hợp 2 bài toán tìm phần tử nhỏ nhất và bài toán tìm kiếm)
Chẳng hạn cho dãy A: 2 -1 6 -5 3 -2 thì phần tử âm nhỏ nhất trong dãy là A[4]=-5
Ý tưởng: b1- Tìm phần tử âm đầu tiên; gán phần tử âm nhỏ nhất là phần tử âm đầu tiên
b2- Xét các phần tử tiếp theo, nếu phần tử đó nhỏ hơn phần tử âm vừa tìm được thì gán lại phần tử âm nhỏ nhất là nó
Đoạn chương trình:
i:=1;
while (A[i]>=0) and (i<=N) do i:=i+1;
If A[i]<0 then Nmin:=A[i];
For j:=i+1 to N do
If A[j]<Nmin then Nmin:=A[j];
Writeln(‘Phan tu am nho nhat la:’,Nmin);
Bài toán 3: tìm kiếm tất cả các phần tử của dãy thỏa một điều kiện nào đó cho trước
Ý tưởng:
Duyệt từ vị trí đầu tiên tới cuối dãy, Tại mỗi vị trí I, thực hiện kiểm tra A[i] có thỏa điều kiện tìm kiếm không, nếu đúng thì thực hiện công việc hậu tìm kiếm, nếu không thì bỏ qua
Đoạn chương trình
For i:=1 to N do
If A[i] <thỏa đk> then <thực hiện công việc hậu tìm kiếm>;
Ví dụ1: Đoạn chương trình tính tổng các số nguyên dương trong dãy
Tong:=0;
For i:=1 to N do
If A[i]>0 then tong:=tong+A[i];
Writeln(‘tong cac so nguyen duong trong day la:’,tong);
Ví dụ 2: Đoạn chương trình hiển thị tất cả các số nguyên tố trong dãy A và tính tổng các số nguyên tố đó:
Tong:=0;
For i:=1 to N do
J:=2;
While (A[i] mod j <>0) and (j<=sqrt(A[i])) do j:=j+1;
If j>sqrt(A[i]) then
Begin
Trang 6write( A[i]:5);
tong:=tong+A[i];
End;
Writeln;
Writeln(‘Tong cac so nguyen to trong day la:’, tong);
Trong đó đoạn chương trình từ j:=2; đến câu lệnh if là đoạn lệnh kiểm tra A[i] có phải là số nguyên tố hay không
Bài toán 4: Sắp xếp dãy số nguyên A thành dãy không giảm (không tăng);
Đối với bài toán này có rất nhiều thuật toán, ở đây ta chỉ xét thuật toán sắp xếp tráo đổi (nổi bọt)
Ý tưởng thuật toán: Bắt đầu từ vị trí đầu tiên, nếu thấy 2 phần tử liền kề nhau mà phần tử đứng trước lớn hơn phần tử sau thì đổi chổ chúng
Để ý: Sau 1 lượt đổi chổ thì số lớn nhất sẽ nằm ở vị trí cuối dãy(vì vậy nên thuật toán
có tên là thuật toán nổi bọt)
Đoạn chương trình xử lý:
For i:=N downto 2 do
For j:=1 to i-1 do
If A[j]>A[j+1] then begin tam:=A[j]; A[j]:=A[j+1]; A[j+1]:=tam; end; {trao doi A[j] và A[j+1]}
Phần 2: Một số bài toán hay kiểu Mảng 1 chiều Bài toán 1:Cho dãy số nguyên A tìm và đưa ra dãy con liên tiếp tăng có số phần tử lớn nhất Ví dụ:
A= 1 3 4 2 7 5 8 9 11 thì đưa ra dãy con tăng lớn nhất là 5 8 9 11
Ý tưởng: Cần 1 biến để đếm số phần tử của dãy con tăng tăng tạm thời Ta tạm đặt là dem;
1 Biến để lưu số lượng phần tử của dãy con tăng lớn nhất là Cmax; 2 biến dau và cuoi để lưu vị trí phần tử đầu và phần tử cuối trong dãy con tăng lớn nhất -b1: Khởi tạo dãy con lớn nhất có số phần tử là 0
-b2: Xét các phần tử của dãy Bắt đầu từ vị trí đầu tiên của dãy, Kiểm tra nếu phần tử tiếp theo lớn hơn hoặc bằng phần tử đang xét thì nạp phần tử tiếp theo vào dãy con tạm thời, xét tiếp phần tử tiếp theo Đến khi nào gặp phần tử kế tiếp nhỏ hơn phần tử hiện tại thì ta kiểm tra dãy con hiện thời xem có lớn hơn dãy con lớn nhất không Nếu lớn hơn thì gán lại dãy con lớn nhất bằng dãy con tạm thời Tiếp tục xem các dãy sau cho đến hết dãy A
Chương trình
Cmax:=0;
I:=1;
WHILE i<=N DO
BEGIN
Dem:=1; j:=i;
WHILE (A[j]<=A[j+1]) AND(j<=N) DO
BEGIN
Dem:=dem+1;
Trang 7j:=j+1;
END;
IF dem>Cmax THEN BEGIN Cmax:=dem;dau:=i; cuoi:=j; END;
i:=j+1;
END;
Write('Day con tang lon nhat la:');
FOR i:=dau TO cuoi DO write(A[i]:5);
Bài toán 2: Lập trình in ra mảng B với mỗi phần tử B[i] là tổng của i phần tử đầu tiên của mảng A(Thuật toán có trong sách Tin học 11-bài tập thực hành 4)
Bài toán 3: Sử dụng mảng một chiều để chuyển đổi 1 số nguyên dương N thành số nhị phân
Ý tưởng thuật toán:
+ Nhớ lại cách chuyển số thập phân sang nhị phân: Chia số nguyên N liên tiếp cho 2 tới khi N=0 thì dừng Lấy phần thập phân theo chiều ngược lại ta được xâu nhị phân tương ứng Sử dụng mảng để lưu xâu nhị phân
Đoạn chương trình xử lý:
I:=1;
While N> 0 do
Begin
A[i]:=N mod 2;
N:=N div 2;
I:=i+1;
End;
write(‘Gia tri nhi phan thu duoc la:’);
For j:=I downto 1 do write(A[j]);
Bài toán 4: Đếm và đưa ra các giá trị cực tiểu trong mảng A
+ Một phân tử được gọi là cực tiểu khi nó nhỏ nhất trong những phần tử liền kề bên trái và bên phải nó
Ví dụ: A=1 3 2 6 8 7 9 thì các phần tử cực tiểu của dãy A là: 1; 2; 7
Ý tưởng thuật toán:
+ Duyệt tất cả các phần tử I của mảng So sánh nó với phần tử đứng trước (i-1) và phần tử đứng sau(i+1) Nếu số thứ I bé nhất trong 3 số thì số thứ I là phần tử cực tiểu Đối với phần tử đầu dãy thì chỉ so sánh với số phía sau, nếu phần tử cuối dãy thì chỉ
so sánh với số trước
Đoạn chương trình:
Dem:=0;
Write(‘Cac gia tri cuc tieu trong day A la:’);
If A[1]<A[2] then begin dem:=dem+1; write(A[1];
For i:=2 to n-1 do if (A[i]<A[i-1])and(A[i]<A[i+1]) then
Begin
Dem:=dem+1;
Write(A[i]);
End;
Trang 8Writeln(‘So luong phan tu cuc tieu trong day la:’, dem);
Bài toán 5: Trộn 2 mảng A gồm N phần tử và mảng B gồm M phần tử đã được sắp xếp tăng thành 1 dãy cũng được sắp xếp tăng.
Ví dụ: Cho mảng A: 1 3 5 7 8 ; B: 2 3 6 9 10 14 ta được dãy C: 1 2 3 3 6 7 8 9 10
Ý tưởng: + Lấy lần lượt từng phần tử từ 2 mảng A và B ra So sánh giá trị của 2 phần
tử, nếu phần tử nào nhỏ hơn thì ghi vào mảng C, sau đó tiếp tục lấy ra 1 phần tử từ mảng chứa số vừa ghi vào mảng C đó và so sánh với số chưa được ghi cho đến khi một hoặc cả 2 mảng A và B được lấy hết
+ Nếu 1 trong 2 mảng còn một số phần tử chưa được lấy ra thì ta tiếp tục lấy rồi ghi vào mảng C
Đoạn chương trình xử lý:
i:=1;j:=1;r:=0;
WHILE (i<=N )AND(j<=M) DO
IF A[i]<B[j] THEN
BEGIN
r:=r+1;
C[r]:=A[i];
i:=i+1;
END
ELSE BEGIN
r:=r+1;
C[r]:=B[j];
J:=j+1;
END;
WHILE i<n DO BEGIN r:=r+1;C[r]:=A[i]; i:=i+1; END;
WHILE j<m DO BEGIN r:=r+1;C[r]:=B[j]; j:=j+1; END;
write('Ket qua cua tron 2 mang la:');
FOR i:=1 TO r DO write(C[i]:5);
Còn rất nhiều bài toán hay về kiểu mảng một chiều Các bạn có thể tự tìm hiểu để giải Ngoài ra, bạn có thể giải một số bài toán toán học thường gặp trong thực tế Sẽ rất có lợi cho kiến thức lập trình của bạn.