C¸c phÇn tö trong - HS: Khai b¸o nhiÒu biÕn m¶ng cã cïng chung mét tªn vµ ph©n biÖt Chương trình viết rất dài víi nhau bëi chØ sè * DiÔn gi¶i: §Ó kh¾c phôc nh÷ng h¹n chÕ trên , người ta [r]
Trang 1Chương IV: Kiểu dữ liệu có cấu trúc
Ngày soạn: 26/12/2009
Ngày dạy:
Tiết 20, 21: Bài 11: Kiểu mảng
I Mục tiêu:
1 Kiến thức
- Biết được một kiểu dữ liệu mới là kiểu mảng 1 chiều Biết một loại biến có chỉ số
- Hiểu khái niệm mảng một chiều,
- Biết cấu trúc tạo kiểu mảng một chiều
- Hiểu cách khai báo và truy cập đến các phần tử của mảng
2 Kỹ năng
- Cài đặt được thuật toán của một số bài toán đơn giản với kiểu dữ liệu mảng một chiều
- Thực hiện được khai báo mảng, truy cập, tính toán các phần tử của mảng
- Tạo được kiểu mảng một chiều và sử dụng biến mảng một chiều trong ngôn ngữ lập trình Pascal để giả quyết 1 số bài toán cụ thể
II Phương pháp, phương tiện dạy học:
1 Phương pháp: Thuyết trình, vấn đáp
2 Phương tiện: Máy tính, máy chiếu, phông chiếu và bảng
III Nội dung bài giảng:
1 ổn định lớp và kiểm tra sĩ số
2 Kiểm tra bài cũ:
Viết chương trình tính:
a S= 12 + 22 + + n2 với n được nhập vào từ bàn phím
b S= 13 + 33 + + n3 với n được nhập vào từ bàn phím
3 Bài mới:
Hoạt động của giáo viên và học sinh Nội dung ghi bảng
- GV: Cho học sinh làm ví dụ trong sgk:
Nhập vào nhiệt độ trung bình của mỗi ngày
trong tuần tính và in ra màn hình nhiệt độ
trung bình của 1 tuần và số lượng ngày trong
tuần có nhiệt độ cao hơn nhiệt độ trung bình
tính được
Trang 2- GV: Hãy cho biết input và output của bài
toán
-HS: Input: t2, t3, t4, t5, t6, t7, cn,
Output: tb và giá trị đếm
- GV: Gợi ý để học sinh viết chương trình
Var t2, t3, t4, t5, t6, t7, cn,tb: real;
Dem: byte;
Begin
Write(‘nhap vào 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+2;
If t4>tb then dem:=dem+3;
If t5>tb then dem:=dem+4;
If t6>tb then dem:=dem+5;
If t7>tb then dem:=dem+6;
If cn>tb then dem:=dem+7;
Writeln (‘nhiet do trung binh cua tuan la’,
tb:4:2);
Writeln(‘so luong ngay co nhiet do cao hon
nhiet do trung binh la’,dem:3);
Readln;
End
- GV: Trong bài toán trên, số lượng ngày tính
là 7 ngày Nếu ta cần tính số lượng ngày là N
ngày thì chương trình trên sẽ có hạn chế gì?
- HS: Khai báo nhiều biến
Chương trình viết rất dài
* Diễn giải: Để khắc phục những hạn chế
trên , người ta ghép 7 biến trên thành một dãy
và đặt nó chung chung một tên và đánh cho
1 Kiểu mảng một chiều
- Mảng một chiều là một dãy hữu hạn các phần tử có cùng kiểu Các phần tử trong mảng có cùng chung một tên và phân biệt với nhau bởi chỉ số
Trang 3mỗi phần tử trên một chỉ số Đó là mảng một
chiều
- GV: Tham khảo sgk và cho biết thế nào là
mảng một chiều?
- HS: Đọc sgk và trả lời
- Hỏi: Để mô tả mảng một chiều ta cần xác
định yếu tố nào?
GV: Đưa ra cách khai báo mảng một chiều
trong NNLT Pascal, giải thích ý nghĩa các từ
khoá mới
GV: Khai báo bằng cách nào tiện lợi hơn?
HS: Thường trả lời cách một
GV: Tuỳ từng trường hợp cụ thể mà ta dùng
cách một hay cách hai, thường thì sử dụng
cách một nhiều hơn
GV: Đưa ra một số khai báo mảng trong
Pascal, đưa ra ví dụ:
GV: Khai báo cách nào tiện lợi hơn?(tương
tự mảng một chiều)
HS : Chọn cách 1
GV: Tuỳ theo từng trường hợp cụ thể nhưng
thương thì cách 1 hay được dùng hơn
GV: Gọi một số HS lên khai báo một số biến
mảng một chiều theo yêu cầu của GV
- Với mảng một chiều ta quan tâm đến:
+ Tên mảng một chiều + Số lượng phần tử trong mảng + Kiểu dữ liệu phần tử
+ Cách khai báo mảng một chiều + Cách truy cập vào từng phần tử của mảng
a)Khai báo mảng một chiều
- Trong ngôn ngữ Pascal,mảng một chiều
được khai báo bằng hai cách như sau:
Cách 1: Khai báo trực tiếp
Var <tên biến mảng>: Array
[kiểu chỉ số] of <kiểu phần tử>;
* Ví dụ:
Var M1:array [1 5] of integer;
- Khai báo mảng có tên biến mảng là M1 gồm 5 phần tử thuộc kiểu nguyên ứng với các chỉ số 1, 2, 3, 4, 5 nghĩa là M1[1], M1[2], M1[3], M1[4], M1[5]
Cách 2: Khai báo gián tiếp 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>;
* Ví dụ:
Type M1= array [1 5] of integer;
Var a: M1;
* Giải thích
- Type là từ khoá dùng để khai báo biến
- Array là từ khoá để khai báo mảng
- Kiểu chỉ số thường là đoạn số nguyên liên tục có n1 n2, với n1 là chỉ số đầu và n2 là chỉ số cuối
(n1<= n2)
Trang 4- GV: Cho một số khai báo mảng sau
Type
Manga= array [1 200] of real;
Mangb = array [byte] of real;
Mangc = array [-100 0] of real ;
Mangd = array[ 1 100] of real;
- Hỏi: Hãy cho biết khai báo mảng nào
đúng?
- Hỏi: ở ví dụ này, yêu cầu ta phải làm những
việc gì?
- HS: Có 2 việc phải làm: Nhập dãy A gồm N
phần tử, và in dãy đó ra màn hình
- Hỏi: Xác định Input và output của bài toán?
- HS: Input: Số nguyên dương N ( N<100)
Output: Hiển thị dãy ra màn hình
- Hỏi: Ta cần khai báo những gì?
- HS: Khai báo mảng 1 chiều và các biên liên
quan
- GV: Yêu cầu học sinh viết khai báo mảng,
và các biến có liên quan?
- HS: Var A: array [1 100] of integer ;
i, n: Byte;
- Hỏi: Để nhập được một dãy gồm N phần tử
ta phải sử dụng lệnh nào?
- HS: Ta sử dụng lệnh For- do
- Hỏi: Để nhập phần tử thứ i của mảng A từ
- Kiểu thành phần là kiểu dữ liệu của phần tử mảng
-Để truy cập vào phần tử mảng, ta viết: <Tên biến mảng>[Chỉ số]
Ví dụ
- M1[3] là phần tử ở vị trí thứ 3 của mảng M1
- A[i] là phần tử ở vị trí thứ i của mảng A
B Một số ví dụ.
Ví dụ 1: Viết chương trình nhập vào một dãy A gồm N số nguyên (N <100) Hãy hiển thị dãy A ra màn hình
program vi_du1;
Uses crt;
var a:array[1 100] of integer;
i, n:integer;
begin
Write(‘Nhap so phan tu cua mang n = ’); readln(n);
For i:=1 to n do Begin
Write(‘Nhap a[‘,i,’]= ’);
readln(a[i]);
End;
{hoặc write (‘ nhap phân tu thu’,i,’=’) ; readln(A[i]) ;
Write(‘Cac phan tu cua mang A la: ‘); For i:=1 to n do Write(a[i],’ ‘);
Readln;
End.
Trang 5bàn phím ta viết lệnh thế nào?
- HS: Ta viết Readln (A[i]) ;
- GV: Hướng dẫn học sinh viết tiếp đoạn
nhập các phần tử của mảng
- Hỏi: Để đọc tất cả các phần tử của mảng A
ta thực hiện lệnh nào?
- HS: Kết hợp giữa For- do và write(A[i]) ;
- HS: Viết chương trình theo hướng dẫn của
giáo viên
- GV: Có thể dùng máy chiếu minh hoạ
chương trình để học sinh thấy rõ
- Hỏi: Xác định input và output của bài toán
- HS: Trả lời câu hỏi
- GV: Hướng dẫn học sinh dựa vào ví dụ 1 để
giải quyết ví dụ 2:
- HS: Viết chương trình theo sự hướng dẫn
của giáo viên
- Hỏi: ở ví dụ 2 có yêu cầu gì mới?
- HS: yêu cầu mới: Tìm giá trị lớn nhất Max
và cho biết vị trí của nó
- GV: Gợi nhớ lại cho học sinh nhớ lại thuật
toán tìm giá trị lớn nhất của một dãy số đã
học trong chương trình lớp 10
- Hỏi: Theo thuật toán thì đầu tiên ta phải
làm gì?
- HS: Ta cho giá trị đầu tiên của dãy là số
lớn nhất, sau đó ta đi so sánh giá trị lớn nhất
này với các số hạng còn lại trong dãy A
- Hỏi: Ta dùng những lệnh nào:
- HS: Lệnh gán Max:= A[i] ; và dùng lệnh
Ví dụ 2: Cho số nguyên dương N và dãy
A gồm N số nguyên A1, A2, AN
Hãy hiển thị mảng A ra màn hình và tìm giá trị lớn nhất của dãy A và cho biết vị trí của nó trong dãy A
Gợi ý:
Input: số nguyên N và các phần tử,
A1, A2, AN
Output: - Hiển thi mảng A ra màn hình
- Giá trị lớn nhât Max và vị trí của
số đó trong mảng A
program vi_du2;
Uses crt;
var a:array[1 100] of integer;
i, n, max, vitri : integer;
Begin
Write(‘Nhap so phan tu cua mang n=’) ; readln(n);
For i:=1 to n do Begin
Write(‘Nhap a[‘,i,’]= ’);
readln(a[i]);
End;
Write(‘Cac phan tu cua mang la ‘);
Trang 6For- do
- Hỏi: Vậy biến chỉ số i chạy từ giá trị nào:
- HS: Biến chỉ số i nhận giá trị từ 2 đến N.
- GV: Hướng dẫn học sinh viết chương trình,
kiểm tra và giải thích cho học sinh hiểu
những lệnh này
- HS: Học sinh viết chương trình.
- GV: Nhắc lại thuật toán cho học sinh
B1: Nhập N và dãy số nguyên
B2: M N
B3: Nếu M< 2 thì đưa ra dãy đã được sắp
xếp rồi kết thúc
B4: M M-1; i 0
B5: i i+1;
b6: Nếu i> M thì quay lại B3
B7: Nếu ai > ai+1 thì tráo đổi ai và ai+1 cho
nhau
b8: Quay lại B5
For i:=1 to n do Write(a[i],’ ‘);
writeln;
Max:=a[1] ; vitri :=1;
For i:=2 to n do
If a[i]> Max then Begin
Max:=a[i] ; vitri :=i End;
Writeln(‘ gia tri lon nhat Max= ‘,Max); Writeln(‘Vi tri: ‘, vitri);
Readln;
End.
Ví dụ 3: Viết chương trình nhập vào một
dãy gồm N số nguyên ( N< 100).In dãy số
ra màn hình Sắp xếp dãy theo thứ tự không giảm bằng phương pháp tráo đổi
program vi_du3;
Uses crt;
var a:array[1 100] of integer;
i,j,n,tam:integer;
begin
clrscr;
Write(‘Nhap n : ’);readln(n);
For i:=1 to n do Begin
Write(‘Nhap a[‘,i,’]= ’);
readln(a[i]);
End;
Write(‘mang A vua nhap la: ‘);
For i:=1 to n do Write(a[i],’ ‘);writeln;
For j:=n downto 2 do For i:=1 to j-1 do
If a[i]>a[i+1] then Begin
Tam:=a[i];
a[i:=a[i+1];
Trang 7- Hỏi: ở ví dụ náy ta có thể áp dụng thuật
toán nào?
- HS: Thuật toán tìm kiếm tuần tự
- Hỏi: Có thể áp dụng thuạt toán tìm kiếm
nhị phân được không?
- HS: áp dụng được nếu dãy A đã được sắp
xếp theo thứ tự tăng dần
- Hỏi: Vậy để áp dụng ví dụ 4 vào thuật toán
timg kiếm nhị phân ta phải làm gì?
- HS: Phải sắp xếp dãy A theo thứ tự tăng
dần
- GV: Cho HS áp dụng ví dụ 2 hãy viết đoạn
chương trình nhập vào dãy A và sắp xếp dãy
A theo thứ tự tăng dần
- GV: Nhắc lại thuật toán tìm kiếm nhị phân
đã học trong chương trình lớp 10
- Hỏi: Khi nào thuật toán dừng
- HS: Khi Dau> Cuoi
- Hỏi: Điều này có nghĩa là gì?
- HS: Nghĩa là khi Dau <= Cuoi thì thuật toán
vẫn còn tiếp tục
- Hỏi: Trong ví dụ này ta dùng cấu trúc lặp
nào?
- HS: Dùng cấu trúc lặp với số lần chưa bíêt
trước
- GV: Hãy viết lại câu lệnh While- do
a[i+1]:=tam;
End;
Writeln(‘Day sau khi sap xep: );
For i:=1 to n do Write(a[i],’ ‘);
Readln;
End
Ví dụ 4: Viết chương trình nhập vào một
dãy số gồm N số nguyên (n<100).in dãy
số đó ra màn hình Nhập vào một số nguyên k bất kỳ Tìm xem trong dãy A có
số hạng nào có giá trị bằng k hay không? Nếu có hãy cho biết vị trí của nó
program vi_du4;
Uses crt;
var a:array[1 100] of integer;
i,j,n,tam,k, dau, cuoi:integer;
begin
clrscr;
Write(‘Nhap n : ’);readln(n);
For i:=1 to n do Begin
Write(‘Nhap a[‘,i,’]= ’);
readln(a[i]);
End;
Write(‘Cac phan tu cua day vua nhap la: ‘); For i:=1 to n do
Write(a[i],’ ‘);writeln;
For j:=n downto 2 do For i:=1 to j-1 do
If a[i]>a[i+1] then Begin
Tam:=a[i];
a[i:=a[i+1];
a[i+1]:=tam;
End;
Writeln(‘Day sau khi sap xep: );
For i:=1 to n do Write(a[i],’ ‘);
Write(‘Nhap so cam tim: ‘);readln(k);
Trang 8- HS: trả lời câu hỏi
- GV: Cho học sinh viết chương trình
-
Dau := 1 ; Cuoi := n ; Giua := (Dau + Cuoi) DIV 2 ; While (dau<=cuoi) and not(a[giua]=k]) do begin
Giua := (Dau + Cuoi) DIV 2 ;
If a[giua] > k then Cuoi := Giua 1 ;
If a[giua]< k then Dau := Giua + 1 ; End;
If dau > cuoi then Write( ‘ day khong chua ‘,k) Else Write( k, ‘ Nam o vi tri : ‘, giua);
Readln;
End.
V Củng cố
Nhắc lại một số khái niệm mới
- Nhắc lại cấu trúc câu lệnh bằng cách chia bảng thành bốn phần đồng thời gọi 4HS lên bảng viết lại các cách khai báo,truy xuất, và hiển thị để nhập dữ liệu
- Ra bài tập về nhà
* Một số bài tập về nhà
Bài 1: Viết chương trình nhập vào mảng một chiều A gồm N phần tử nguyên Đưa các giá trị của mảng A ra màn hình
a Tính tổng các phần tử của mảng A Đưa kết quả của tổng ra màn hình
b Tính tổng các số âm, dương, chẵn, lẻ trong dãy A Đưa kết quả ra màn hình
c tính tổng các số chẵn ở vị trí lẻ có trong dãy A Đưa kết quả ra màn hình
d Tính tổng các số lẻ ở vị trí chẵn trong dãy A Đưa kết quả ra màn hình