Tải bản đầy đủ (.doc) (15 trang)

CHỦ đề KIỂU MẢNG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (127.98 KB, 15 trang )

CHỦ ĐỀ KIỂU MẢNG
Số tiết: 03 (Tiết 21+22+23)
I. Nội dung của chủ đề:
- Các thao tác trên mảng một chiều;
- Thời lượng: 3 tiết.
II. Mục tiêu
1. Kiến thức: HS hệ thống được các kiến thức cơ bản về kiểu mảng một chiều:
- Khái niệm mảng một chiều;
- Cấu trúc khai báo mảng một chiều;
- Nhập, xuất mảng một chiều;
- Sắp xếp mảng một chiều;
2. Kĩ năng: Giúp học sinh thành thạo các kĩ năng
- Thực hiện khai báo mảng một chiều trực tiếp và gián tiếp;
- Nhập, xuất mảng một chiều;
- Sắp xếp mảng một chiều theo chiều tăng dần, giảm dần;
- Thực hiện các tính tốn trên mảng.
3. Thái độ:
Rèn luyện tính cẩn thận, tỉ mỉ để tránh những sai lầm đáng tiếc làm mất điểm trong các bài kiểm tra.
III. Mô tả các mức độ nhận thức, biên soạn câu hỏi và bài tập
1. Bảng mô tả các chuẩn được đánh giá

1


Nội dung
Nhận biết
Thông hiểu
Vận dụng cơ bản
Khai báo mảng Mô tả: HS viết được cấu trúc Mô tả: HS lấy được ví dụ về khai Mơ tả: HS biết tìm ra khai báo
một chiều


khai báo mảng một chiều.

báo mảng một chiều.

đúng trong các khai báo cho trước

Ví dụ 1 :.Viết cấu trúc khai báo Ví dụ 2: Khai báo mảng gồm N số Ví dụ 3: Những khai báo nào sau
mảng một chiều (trực tiếp và nguyên (N≤ 500) (theo 2 cách: trực đây là đúng?
gián tiếp)

tiếp và gián tiếp).

Type
Arrayr=array[1..200] of real;
Arrayr=array[byte] of real;
Arrayb=array[-100..0]ofboolean;

Nhập

xuất Mô tả: HS biết nhập mảng một Mô tả: HS biết in mảng vừa nhập

mảng một chiều

chiều

ra màn hình theo chiều ngang,

Ví dụ 4: Viết chương trình nhập chiều dọc và theo thứ tự từ dưới
vào một mảng gồm n phần tử lên.
nguyên.


Ví dụ 5: Viết chương trình nhập
vào một mảng gồm n phần tử
nguyên. In mảng đó ra màn hình
theo chiều ngang, dọc và theo thứ

tự ngược lại.
Sắp xếp mảng Mô tả: HS hiểu được cách sắp xếp
một chiều

mảng một chiều bằng thuật tốn tráo
đổi
Ví dụ 6: Viết chương trình nhập vào
một mảng gồm n phần tử nguyên.
Sắp xếp mảng đã cho theo thứ tự

Vận dụng nâng cao


tăng dần
Tính tốn trên Mơ tả: HS tìm được phần tử lớn

Mô tả: HS biết sử dụng linh hoạt Mô tả: HS biết cách tính tổng các Mơ tả: HS biết cách

mảng một chiều

nhất của một mảng được nhập từ

cấu trúc lặp và kiểu mảng để làm phần tử của mảng thỏa mãn điều đếm xem trong mảng


bàn phím.

bài tập.

Ví dụ 7: Viết chương trình nhập

Ví dụ 8: Viết chương trình nhập Ví dụ 9: Viết chương trình nhập thỏa mãn điều kiện

vào một mảng gồm n phần tử

vào một mảng gồm n phần tử vào một mảng gồm n phần tử cho trước

nguyên. Tìm phần tử lớn nhất của

nguyên. Tính tổng tất cả các phần nguyên. Tính tổng các phần tử Ví dụ 10: Viết chương

mảng và vị trí của phần tử lớn nhất

tử của mảng.

đó.

kiện nào đó.

có bao nhiêu phần tử

chẵn và tổng các phần tử lẻ của trình nhập vào một
mảng

mảng gồm n phần tử

ngun.

Đếm

xem

trong mảng có bao
nhiêu phần tử chia hết
cho 3


2. Lý thuyết và bài tập:
1. Kiểu mảng một chiều:
Mảng một chiều là dãy hữu hạn các phần tử cùng kiểu. Mảng được đặt tên và mỗi phần tử của
nó có một chỉ số. Để mơ tả mảng một chiều cần xác định kiểu của các phần tử và cách đánh số các
phần tử của nó.
Để người lập trình có thể xây dựng và sử dụng kiểu mảng một chiều, các ngơn ngữ lập trình có
quy tắc, cách thức cho phép xác định:


Tên kiểu mảng một chiều;



Số lượng phần tử;



Cách khai báo biến mảng;




Cách tham chiếu đến phần tử.

a, Khai báo
Khai báo biến mảng một chiều có dạng:
_ Cách 1. Khai báo trực tiếp biến mảng một chiều:
Var <tên biến mảng>:array[kiểu chỉ số] of <kiểu phần tử>;
_ Cách 2. Khai báo gián tiếp biến mảng qua kiểu mảng một chiều:
Type <tên kiểu mảng> = array[kiểu chỉ số] of <kiểu phần tử>;
Var <tên biến mảng>: <tên kiểu mảng>;
Trong đó:


Kiểu chỉ số thường là một đoạn số nguyên liên tục có dạng n1…n2 với n1, n2 là các hằng
hoặc biểu thức nguyên xác định chỉ số đầu và chỉ số cuối ( n1≤ n2);



Kiểu phần tử là kiểu của các phần tử mảng.

Tham chiếu tới phần tử của mảng một chiều được xác định bởi tên mảng cùng với chỉ số, được
viết trong cặp ngoặc [ và ].
Ví dụ khai báo mảng như sau:
Type AI = array[1..10] of integer;
AC = array[1..10] of char;
Color = (red, blue, green, white, black);
Var
A, B, C : AI;
X, Y: AC;

MM: array[Color] of boolean;
Ví dụ: Ta xét bài tốn nhập vào nhiệt độ (trung bình) của mỗi ngày trong tuần, tính và đưa ra màn
hình nhiệt độ trung bình của tuần và số lượng ngày trong tuần có nhiệt độ cao hơn nhiệt độ trung bình
của tuần.


Ta có thể dùng bảy biến thực để lưu trữ nhiệt độ của các ngày trong tuần. Thuật toán cụ thể như
sau:
Program nhietdo_tuan;
Uses crt;
Var t2, t3, t4, t5, t6, t7, CN, TB: real;
Dem: integer;
Begin
Clrscr;
Writeln(‘Nhap vao nhiet do cua 7 ngay: ‘);
Readln(t2, t3, t4, t5, t6, t7, CN);
TB: = (t2 + t3 + t4 + t5 + t6 + t7 + CN)/7;
Dem : = 0;
If t2 > TB then Dem: = Dem + 1;
If t3 > TB then Dem: = Dem + 1;
If t4 > TB then Dem: = Dem + 1;
If t5 > TB then Dem: = Dem + 1;
If t6 > TB then Dem: = Dem + 1;
If t7 > TB then Dem: = Dem + 1;
If CN > TB then Dem: = Dem + 1;
Writeln(‘Nhiet do trung binh cua tuan la : ‘, TB:4:2);
Writeln( ‘So ngay nhiet do cao hon nhiet do trung binh la:’,Dem);
Readln
End.
Khi cần giải bài toán trên với N ngày ( N khá lớn ) thì cách làm tương tự khơng những địi hỏi

một khối lượng khai báo khá lớn, mà đoạn chương trình tính tốn cũng khá dài.
Để giải quyết vấn đề đó, ta sử dụng kiểu dữ liệu mảng một chiều để mô tả dữ liệu. Chương trình
giải bài tốn tổng qt với N ngày trong Pascal có thể như sau:
Program Nhietdo_N_ngay;
Const Max = 366; { gia thiet N lon nhat la 366}
Type mang = array[1..Max] of Real;
Var nhietdo: mang;
Dem, i, N : integer;
Tong, TB : real;
Begin
Write(‘nhap so ngay:’); readln(N);
Tong: = 0;


For i: = 1 to N do
Begin
Write(‘ Nhap nhiet do ngay’, i, ‘ : ‘);
Readln(nhietdo[i]);
Tong: = Tong + nhietdo[i];
End;
Dem: = 0;
TB : = Tong/N;
For i: = 1 to N do
If nhietdo[i] > TB then Dem: = Dem + 1;
Writeln (‘Nhiet do trung binh’, N, ‘ngay:’, TB:8:3);
Writeln(‘So ngay nhiet do cao hon TB: ‘, Dem);
Readln
End.
BÀI TẬP:
Bài 1: Viết chương trình nhập vào một dãy số nguyên dương không quá 100 số và tìm phần tử lớn

nhất của dãy số ngun đó.
Lời giải:
Trước đây trong phần cấu trúc rẽ nhánh với câu lệnh if-then chúng ta đã làm bài tốn tìm số lớn
nhất trong hai, ba hoặc bốn số. Nhưng bây giờ mở rộng hơn đối với một dãy số có nhiều số thì để tìm
được phần tử lớn nhất của dãy về phương pháp ta cũng làm hoàn toàn tương tự như với bài tốn trước
chỉ khác là trong dãy có nhiều số ta dùng kiểu mảng để thuật toán ngắn gọn hơn.
Thuật toán cụ thể như sau:
Program tim_max;
Uses crt;
Var A: array[1..100] of integer;
Max, i, N: integer;
Begin
Clrscr;
Write(‘ Nhap so phan tu cua day N = ‘);
Readln(N);
For i: = 1 to N do
Begin
Writeln(‘Phan tu thu ‘, i, ‘ la: A[’, i, ‘]=’);
Readln(A[i]);


End;
Max : = A[1];
For i: = 1 to N do
If A[i] > Max then Max : = A[i];
Writeln (‘Phan tu lon nhat cua day la:’,Max);
Readln
End.
Nếu bây giờ bài toán là tìm phần tử nhỏ nhất của dãy thì cách làm hoàn toàn tương tự.
Program tim_min;

Uses crt;
Var A: array[1..100] of integer;
Min, i, N: integer;
Begin
Clrscr;
Write(‘ Nhap so phan tu cua day N = ‘);
Readln(N);
For i: = 1 to N do
Begin
Writeln(‘Phan tu thu ‘, i, ‘ la: A[’, i, ‘]=’);
Readln(A[i]);
End;
Min : = A[1];
For i: = 1 to N do
If A[i] < Min then Min : = A[i];
Writeln (‘Phan tu nho nhat cua day la:’,Min);
Readln
End.
* Sắp xếp các phần tử của mảng theo một trật tự tăng hoặc giảm là một ví dụ rất bổ ích cho
việc xử lý các bài tốn liên quan đến mảng. Sau đây sẽ trình bày một số phương pháp sắp xếp mảng
qua các ví dụ.
Giả sử ta có một dãy dữ liệu (số nguyên, số thực, kí tự,…) được chứa trong một mảng. Sau đây
là một số ví dụ về một số phương pháp sắp xếp mảng các số nguyên. Việc các phần tử của mảng là
các số ngun chỉ là một ví dụ, nó có thể là mảng các số thực hoặc mảng các xâu kí tự.
Phương pháp sắp xếp theo thứ tự tăng dần


Đầu tiên đem phần tử thứ nhất so sánh với các phần tử tiếp theo nếu nó lớn hơn thì đem đổi chỗ
giá trị của hai phần tử so sánh. Kết quả sau lượt đầu tiên giữ GTNN. Tiếp theo vòng 2, đem phần tử
thứ hai so sánh với các phần tử tiếp theo. Cách làm cứ tiếp tục như vậy cho đến phần tử cuối cùng.

Bài 2: Viết chương trình nhập vào một dãy số ngun dương khơng q 100 số và sắp xếp dãy số đó
theo thứ tự không giảm.
Bài giải:
Program sap_xep;
Uses crt;
Var A: array[1..100] of integer;
N, i, j, t: integer;
Begin
Clrscr;
Write(‘Nhap so luong phan tu cua day so: N= ‘);
Readln(N);
For i:= 1 to N do
Begin
Write(‘ Nhap phan tu thu ‘, i, ‘: 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
t:= A[i];
A[i]: = A[j];
A[j]: = t;
End;
Writeln(‘ Day so sau khi sap xep la : ‘);
For i: = 1 to N do
Write(A[i]: 6);
Readln
End.
Nếu thay đổi đề bài của bài tập này thành sắp xếp các số trong dãy theo thứ tự khơng giảm thì

cách làm hồn toàn tương tự. Ta cũng so sánh số đầu tiên với các số cịn lại trong dãy nếu như nó nhỏ
hơn thì đem đổi chỗ của hai số so sánh với nhau. Kết quả sau phép so sánh này sẽ giữ giá trị lớn nhất.


Tiếp theo ta sẽ lấy số thứ hai so sánh với các số tiếp theo. Cứ làm lần lượt như vậy cho đến số cuối
cùng của dãy.
Cụ thể thuật toán sắp xếp theo thứ tự không giảm sẽ như sau:
Program sap_xep;
Uses crt;
Var A: array[1..100] of integer;
N, i, j, t: integer;
Begin
Clrscr;
Write(‘Nhap so luong phan tu cua day so: N= ‘);
Readln(N);
For i:= 1 to N do
Begin
Write(‘ Nhap phan tu thu ‘, i, ‘: 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
t:= A[i];
A[i]: = A[j];
A[j]: = t;
End;
Writeln(‘ Day so sau khi sap xep la : ‘);
For i: = 1 to N do

Write(A[i]: 6);
Readln
End.
Bài 3: Nhập một dãy số từ bàn phím. Hãy viết chương trình nhập một số a rồi liệt kê tất cả các số
trong dãy lớn hơn a.
Lời giải:
Program bai_3;
Uses Crt ;
Var B : Array[1..100] of Real;


a : Real ;
N, i : Byte ;
BEGIN
Clrscr ;
Write ('Nhap so luong phan tu cua day so : N= ') ;
Readln(N) ;
For i := 1 To N Do
Begin
Write (‘ Nhap phan tu thu ‘ , i, ‘ : B[‘, i, ‘]=’) ;
Readln( B[i] ) ;
End ;
Write (' Nhap so thuc a : ') ;
Readln(a) ;
Writeln (' Cac phan tu cua day lon hon a la : ') ;
For i:= 1 to N do
If B[i]>a then write(B[i]:8:2);
Readln
END.
Bài 4: Viết chương trình nhập một dãy số nguyên từ bàn phím:

a, Tính tổng các số dương của dãy số
b, Tính tổng bình phương các số chẵn của dãy số và số các số chẵn của dãy số
Lời giải:
a, Với bài toán này ta hồn tồn có thể làm theo cách dùng vịng lặp for-do mà không cần dùng đến
mảng một chiều. Tuy nhiên nếu như số lượng các phần tử của dãy số quá lớn thì việc dùng mảng sẽ
tối ưu hơn nhiều. Chương trình sẽ ngắn gọn và đẹp hơn.
Thuật tốn như sau:
Program so_duong;
Uses crt;
Var A: array[1..100] of integer;
N, i, S: integer;
Begin
Clrscr;
Write(‘Nhap so luong phan tu cua day so: N= ‘);
Readln(N);
For i:= 1 to N do


Begin
Write(‘ Nhap phan tu thu ‘, i, ‘: A[‘, i, ‘]=’);
Readln(A[i]);
End;
S:=0;
For i: = 1 to N do
If A[i] > 0 then S: = S + A[i];
Writeln(‘ Tong cac so duong cua day la: S= ‘, S);
Readln
End.
b, Thuật toán như sau:
Program so_chan;

Uses crt;
Var A: array[1..100] of integer;
N, i, j, S: integer;
Begin
Clrscr;
Write(‘Nhap so luong phan tu cua day so: N= ‘);
Readln(N);
For i:= 1 to N do
Begin
Write(‘ Nhap phan tu thu ‘, i, ‘: A[‘, i, ‘]=’);
Readln(A[i]);
End;
S:=0; j:= 0;
For i: = 1 to N do
If A[i] mod 2 = 0 then
Begin
S: = S + sqr(A[i]);
j: = j + 1;
end;
Writeln(‘ Tong binh phuong cac so chan cua day la: ‘, S);
Writeln(‘So cac so chan cua day la: ‘, j );
Readln
End.


Bài 5: 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ử.
Ý tưởng:
Duyệt qua tất cả các phần tử A[i] trong mảng: Nếu A[i]<0 thì cộng dồn ( A[i ]) vào biến S.
2


Lời giải:
Program Bai_5;
Uses Crt;
Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;
N,i,S: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ính tổng}
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 6: Cho mảng gồm n phần tử là số thực.
a.Tìm hai phần tử liên tiếp nhau có tổng bằng n.
b. Tính khoảng cách giữa hai vị trí của phần tử lớn nhất và bé nhất đầu tiên trên A.
Lời giải:
Program bai_6;
Uses crt;
Var
A: array[1..100] of real;
max, min : real;

i, n, Vtmax, Vtmin : integer;


Begin
Clrscr;
Writeln(‘Nhap so phan tu cua day n= ’); readln(n);
{Nhap cac phan tu cua day}
For i:= 1 to n do
Begin
Write(‘Nhap phan tu thu ‘, i, ’: A[‘, i, ‘]=’); readln(A[i]);
End;
{Tìm hai phần tử liên tiếp nhau có tổng bằng n}
i:=1;
While (A[i] + A[i+1]) <> n) and (i<= n-1) do Inc(i);
If i>=n then write (‘Day khong co hai phan tu lien tiep co tong bang ’, n)
Else writeln(‘Hai phan tu co chi so la: ’, i, ‘va’, i+1);
{Tính khoảng cách giữa hai vị trí của phần tử lớn nhất và bé nhất đầu tiên trên A}
Max:=A[1];
For i:=1 to n do
If max < A[i] then
Begin
Vtmax:= i; Max:=A[i];
End;
Min:= A[1];
For i:=1 to n do
If min > A[i] then
Begin
Vtmin:= i; Min:=A[i];
End;
Writeln (‘khoang cach giua 2 phan tu lon nhat va be nhat la:’,abs(Vtmax –

Vtmin);
Readln;
End.
Bài 7: Nhập vào chương trình vào 1 mảng số ngun, sau đó liệt kê các số dương trong mảng rồi
in ra màn hình
Program bt;
Var a:array [1..1000] of longint;
i,n:word;


Begin
write('nhap so phan tu cua mang: '); readln(n);
for i:=1 to n do
begin
write('nhap phan tu a[',i,']: ');
readln(a[i]);
end;
write('cac phan tu duong la: ');
for i:=1 to n do
if a[i]>0 then write(a[i],' ');
readln;
End.
Bài 8: Nhập vào một dãy các số nguyên bất kỳ, in ra màn hình các số khác nhau trong dãy số đó.
uses crt;
var a:array [1..1000] of longint;
i,k,m,n:longint;
Begin
clrscr;
Repeat
Write('Ban hay nhap so phan tu cua day:');Readln(n);

if n<=0 then Write('Ban phai nhap so>0.');
Until n>0;
For i:=1 to n do
begin
Write('Ban hay nhap so thu ',i,':');Readln(a[i]);
end;
Writeln('Cac so khac nhau trong day la:');
For i:=1 to n do
begin
m:=0;
For k:=1 to i-1 do
if a[i]=a[k] then
begin m:=1;break;end;
if m=0 then Write(a[i],' ');
end;


Readln;
End.



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×