- GV: Đa ra một số ví dụ cần lập trình đa ra một dãy các số nguyên, hãy tìm cách l-u trữ một dãy số ngl-uyên trong lập trình?. - KN: Mảng một chiều là một dãy hữu hạn các phần tử có cùng
Trang 1Tuần :
Tiết : 21+22+23+24 Ngày soạn: Ngày giảng:
Bài 11 Kiểu mảng
I mục tiêu của bài:
1 Kiến thức
- Hiểu khái niệm mảng một chiều và mảng hai chiều
- Hiểu cách khai báo và truy cập đến các phàn tử trong mảng
2 Kĩ năng
- Cài đặt một số 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 khai báo mảng, truy cập, tính toán các phần tử của mảng
3 Thái độ
- Tiếp tục khơi gợi lòng ham thích giải toán bằng lập trình trên máy tính
- Tiếp tục rèn luyện các phẩm chất cần thiết của ngời lập trình
II Chuẩn bị của Giáo viên và học sinh:
1 Giáo viên: SGK, giáo án, STK (máy chiếu nếu có)
2 Học sinh: SGK, chuẩn bị trớc bài ở nhà
III Phơng pháp giảng dạy
- Thuyết trình, đàm thoại
IV Tiến trình bài học và các hoạt động:
1 ổn định tổ chức: 1’
2 Kiểm tra bài cũ: (Không kiểm tra bài cũ)
3 Bài mới:
Tiết 21
* Hoạt động 1: Trình bày cho HS biết khái niệm của kiểu mảng một chiều.
- GV: ĐVĐ Với những kiểu dự liệu đã
biết, làm thế nào để lu trữ đợc một dãy
số?
- HS: Suy nghĩ và trả lời.
- GV: Các ngôn ngữ lập trinhg thờng
cung cấp một số kiểu dự liệu đợc xây
dựng từ những kiểu dự liệu chuẩn đợc gọi
là kiểu dự liệu có cấu trúc Bây giờ chúng
ta tìm hiểu kiểu mảng một chiều
- GV: Đa ra một số ví dụ cần lập trình đa
ra một dãy các số nguyên, hãy tìm cách
l-u trữ một dãy số ngl-uyên trong lập trình?
Bằng cách nào lu trữ một dãy các số
nguyên dới dạng bảng?
- HS: Suy nghĩ và trả lời câu hỏi
- GV: Nhận xét câu trả lời của HS sau đó
đa ra khái niệm mảng một chiều và một
số yếu tố liên quan
1 Kiểu mảng một chiều.
- KN: 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, mảng đợc
đặt tên và mỗi phần tử mang một chỉ số
Để mô tả mảng một chiều ta cần xác định kiểu của các phần tử và cách đánh chỉ số các phần tử
- Với mảng một chiều ta cần quan tâm
đến:
+ Tên mảng một chiều
Trang 2- GV: Em nào hãy xác định Input và
Output của bài toán?
- HS: Đứng tại chỗ trả lời câu hỏi
- GV: Ghi nháp lên bảng
- GV: Ghi hai chơng trình lên bảng và
Phân tích rõ hai chơng trình để HS nhận
thấy sự tiện lợi khi sử dụng mảng
- HS: Trong khi GV phân tích hai chơng
trình, HS đa ra ý kiến nhậm xét hai chơng
trình
+ Số lợng các phần tử trong mảng
+ Kiểu dữ liệu của các phần tử
+ Cách khai báo biến mảng một chiều + Cách truy cập đến từng phần tử trong mảng
* Xét hai ví dụ:
+ Ví dụ 1: 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 có nhiệt độ TB cao hơn nhiệt trung bình trong tuần?
Input: t1, t2, t3,t4, t5, t6, t7
Output: tb, dem
Program Nhietdotrungbinh;
Uses Crt;
Var t1, t2, t3,t4, t5, t6, t7: Integer;
TB: Real; dem:byte;
Begin
Writeln(‘Nhap vao nhiet do cua bay ngay’);
Readln(t1,t2,t3,t4,t5,t6,t7);
TB:= (t1+t2+t3+t4+t5+t6+t7)/7; Dem:=0;
If t1 > TB then Dem :=dem + 1;
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; Writeln(‘Nhiet do trung binh tuan
la ’,TB:6:2);
Writeln(‘So ngay co nhiet do cao hon nhiet do trung binh la:’,dem);
Readln;
End.
+ Ví dụ 2: Nhập vào nhiệt độ (trung bình)
của mỗi ngày trong năm Tính và đa ra màn hình nhiệt độ trung bình của năm và
số lợng ngày có nhiệt độ TB cao hơn nhiệt trung bình trong năm?
Program Nhietdo_Nngay;
Uses Crt;
Var Nhietdo : Array[1 365] of Integer;
Dem, i, n: Byte; Tong, TB:Real;
Begin
Write(‘Nhap so ngay n = ’); readln(n); Tong:=0; Dem:=0
For i:=1 to n do Begin
Write(Nhap nhiet do ngay thu
‘,i,’=’); Readln(Nhietdo[i]);
Trang 3- GV: Nhận xét ý kiến của HS và đa ra ý
kiến để HS hiểu rõ hơn sự cần thiết của
mảng một chiều trong cài đặt thuật toán
Tong:= Tong+Nhietdo[i];
End;
TB:=tong/n;
For i:=1 to n do
If Nhietdo[i]>TB then dem:=dem+1;
Writeln(‘Nhiet do trung binh ’,n,’ ngay
la = ‘,TB:6:2);
Writeln(‘So ngay co nhiet do cao hon nhiet do trung binh la: ‘,dem’);
Readln;
End.
- GV: Củng cố.
- Nêu sự khác nhau giữa hai bài
toán và sự cần thiết phải sử dụng mảng
một chiều
Tiết 22
* Hoạt động 2 : Giới thiệu cách hai báo mảng một chiều và Phân tích một số các
ví dụ để HS hiểu và biết cách vận dụng khai báo mảng một chiều trong cài đặt
* ổn định lớp: (1 phút)
- Kiểm tra bài cũ (lồng trong bài
giảng)
- GV: Đặt vấn đề, và đa ra cách khai báo
mảng một chiều trong ngôn ngữ lập trình
Pascal Giải thích các từ khoá mới
- GV: Khai báo bằng cách nào thuận tiện
hơn?
- HS: Suy nghĩ và trả lời.
- GV: Tuỳ vào từng trờng hợp cụ thể
những thờng sử dụng cách 2
- GV: Lấy ví dụ cụ thể để HS truy vấn
đến các phần tử trong mảng, sau đó lấy
một số ví dụ có sử dụng kiểu mảng trong
cài đặt
a Khai báo mảng một chiều.
* Cách 1: Khai báo gián tiếp.
Type <tên kiểu mảng>=array[<chỉ số
đầu> <chỉ số cuối>] of <kiểuphần tử>;
Var <ds biến mảng> : <tên kiểu mảng>;
* Ví dụ:
Type nhietdo = array[1 365] of integer; Var A: nhietdo;
* Cách 2: Khai báo trực tiếp
Var <Ds biến mảng> : array[<chỉ số
đầu> <chỉ số cuối>] of <kiểuphần tử>;
* Ví dụ:
Var nhietdo : array[1 365] of integer; Var A,B : array[1 100] of real;
- Trong đó:
+ Type là từ khoá dùng để khai báo Kiểu dự liệu Array là từ khoá dùng để
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, n2
là chỉ số cuối
+ Kiểu phần tử là kiểu dự liệu của các phần tử trong mảng
+ Để truy cập đến các phần tử trong mảng, ta làm:
<Tên biến mảng>[chỉ số]
b Các ví dụ
* Ví dụ 1: Tìm phần tử lớn nhất của dãy
Trang 4- GV: Em nào hãy xác định Input và
Output của bài toán?
- HS: Suy nghĩ và trả lời
- GV: Ghi lên bảng Input và Output.
- GV: Hãy nêu ý tởng của thuật toán tìm
max?
- HS: Suy nghĩ và trả lời.
- GV: Nhận xét, bổ xung và viết ý tởng
thuật toán lên bảng
- GV: Viết chơng trình để HS có thể dễ
dàng nhận ra các thao tác phải thực hiện
khi viết chơng trình
- GV: Vừa viết chơng trình vừa phân tích
cho HS hiểu rõ cách thực hiện chơng
trình GV trình bày rõ các thao tác khi
viết chơng trình
- GV: Phát vấn HS về kiến thức đã học ở
những bài trớc để xây dựng bài toán mới
- HS: Xem lại toàn bộ kiến thức đã học
và trả lời
các số nguyên
- Input: Số nguyên dơng n và dãy
A1,A2, ,An N<250
- Output: Giá trị của số lớn nhất trong
dãy và vị trí của số đó
- ý tởng:
+ Đặt A1 là số lớn nhất (Max)
+ Cho i lặp từ 2 đến n, nếu A[i]>Max thì đổi Max:=A[i] và lu lại vị trí i
Program Search_Max;
Uses Crt;
Var A: Array[1 100] of Integer;
N, i, Vt: Byte; Max: Integer;
Begin
Write(‘Nhap so cac phan tu n = ‘); Readln(n);
For i:=1 to n do Begin
Write(‘A[‘,i,’]= ‘); readln(a[i]);
End;
Max:=A[i]; Vt:=1;
For i:=2 to n do
If A[i] > Max then Begin
Max:=A[i]; Vt:=i;
End;
Writeln(‘Gia tri phan tu max = ’,Max); Writeln(‘Vi tri phan tu max = ’,Vt);
Readln;
End.
* Củng cố
- Nhắc lại cách khai báo mảng một
chiều
Tiết 23
* ổn định lớp: (4 phút)
- Kiểm tra bài cũ: Em hãy viết
cách cú pháp khai báo mảng một chiều
và trình bày chức năng các từ khoá trong
cú pháp khai báo?
b Các ví dụ (Tiếp)
* Ví dụ 2: Sắp xếp dãy các số nguyên
bằng thuật toán tráo đổi
- Input: Số nguyên dơng n, và dãy A1,
A2, ,An
- Output: Dãy A đợc sắp xếp theo thứ tự
tăng dần
- ý tởng:
+ Đổi để đa số lớn nhất về vị trí cuối
Trang 5- GV: Em nào hãy xác định Input và
Output của bài toán sắp xếp?
- HS: Suy nghĩ và trả lời.
- GV: Ghi lên bảng Input và Output.
- GV: Hãy nêu ý tởng của thuật toán sắp
xếp?
- HS: Suy nghĩ và trả lời.
- GV: Nhận xét, bổ xung và viết ý tởng
thuật toán lên bảng
- GV: Viết chơng trình để HS có thể dễ
dàng nhận ra các thao tác phải thực hiện
khi viết chơng trình
cùng
+ Làm tơng tự đối với những số còn lại
Program Sort;
Uses Crt;
Var A: Array[1 100] of Integer;
N,i,j: Byte; tg: Integer;
Begin
Write(‘Nhap so cac phan tu 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
Tg:=A[i];
A[i]:=A[j];
A[j]:=tg;
End;
Writeln(‘Mang sau khi sap xep la’);
For i:=1 to n do Write(A[i]:5);
Readln;
End.
- GV: Em nào hãy xác định Input và
Output của bài toán?
- HS: Suy nghĩ và trả lời.
- GV: Ghi lên bảng Input và Output.
- GV: Hãy nêu ý tởng của thuật toán tìm
max?
- HS: Suy nghĩ và trả lời.
- GV: Nhận xét, bổ xung và viết ý tởng
thuật toán lên bảng
- GV: Viết chơng trình để HS có thể dễ
dàng nhận ra các thao tác phải thực hiện
khi viết chơng trình
* Ví dụ 3: Tìm kiếm nhị phân.
- Input: Số nguyên dơng n, và dãy A1,
A2, ,An đã đợc sắp xếp tăng dần Và số nguyên k
- Output: Có hay không chỉ số i mà
A[i]=k hoặc thông báo không tìm thấy
- ý tởng:
+ Ta sử dụng tính chất tăng dần của dãy A, ta so sánh k với số hạng AGiữa trong
đó Giữa = (n+1/2) Khi đó sảy ra 1 trong 3 trờng hợp
Nếu AGiữa=k thì Giữa là chỉ số cần tìm Việc tìm kiếm kết thúc
Nếu Agiữa>k thì việc tìm kiếm trong phạm vi từ A1,A2, ,AGiữa
Nếu Agiữa<k thì việc tìm kiếm trong phạm vi từ AGiữa, Agiữa+1, ,An
+ Việc tìm kiếm sẽ lặp lại một số lần hoặc đã tìm thấy khoá k trong dãy A hoặc phạm vi tìm kiếm bằng rỗng
Program Binary_Search;
Uses Crt;
Var A: Array[1 250] of Integer;
Trang 6N, i, Dau, Cuoi, Giua: Byte;
k: Integer; ok: Boolean;
Begin
Write(‘Nhap so cac phan tu n = ‘); Readln(n);
For i:=1 to n do Begin
Write(‘A[‘,i,’]= ‘); readln(a[i]);
End;
Write(‘Nhap so k = ’); Readln(k);
Dau:=1; Cuoi:=n; ok:=false;
While Dau <=Cuoi and not ok do Begin
Giua:=(Dau+Cuoi) div 2;
If A[giua] = k then ok:=true Else If A[giua] = k then
Cuoi:=Giua-1
Else Dau:=Giua+1; End;
If ok then Writeln(‘Chi so can tim
la:’,Giua) Else Writeln(‘Khong tim thay’);
Readln;
End.
* Củng cố.
- Nhấn mạnh một số kiến thức cơ
bản trong khi cài đặt
Tiết 24
* ổn định lớp: (1 phút)
- Kiểm tra bài cũ: (Lồng trong bài
giảng)
- GV: Đặt vấn đề, và đa ra những vấn đề
cần thiết về nlu trữ dự liệu dới dạng bảng
để các em thấy nhu cầu sử dụng mảng hai
chiều trong lập trình
- GV: Khai báo bằng cách nào thuận tiện
hơn?
- HS: Suy nghĩ và trả lời.
2 Kiểu mảng hai chiều
- KN: Mảng hai chiều là một bảng các phần tử cùng kiểu
- Với mảng hai chiều ta cần quan tâm đến: + Tên kiểu mảng hai chiều
+ Số lợng các phần tử của mỗi chiều trong mảng
+ Kiểu dữ liệu của các phần tử
+ Cách khai báo biến mảng hai chiều + Cách truy cập đến từng phần tử trong mảng
a Khai báo mảng hai chiều.
* Cách 1: Khai báo gián tiếp.
Type <tên kiểu mảng>=array[<Kiểu chỉ
số hàng>,<Kiểu chỉ số cột>] of
<kiểuphần tử>;
Trang 7- GV: Tuỳ vào từng trờng hợp cụ thể
những thờng sử dụng cách 2
- GV: Khi khai báo mảng hai chiều cần
chú ý điều gì?
- HS: Tìm câu trả lời Gv gợi ý để các em
chỉ ra đợc chỉ số của mảng, số dòng, số
cột và kiểu của mỗi phần tử trong mảng
- GV: Gọi HS lên bảng khai báo một số
biến mảng hai chiều theo yêu cầu của
GV
- HS: Lên bảng và làm theo yêu cầu của
GV
- GV: Lấy ví dụ cụ thể để HS truy vấn
đến các phần tử trong mảng, sau đó lấy
một số ví dụ có sử dụng kiểu mảng hai
chiều trong cài đặt
Var <ds biến mảng> : <tên kiểu mảng>;
* Ví dụ:
Type MaTran = array[1 100,1 100] of
integer;
Var A: MaTran;
* Cách 2: Khai báo trực tiếp
Var <Ds biến mảng> : array[<Kiểu chỉ
số hàng>,<Kiểu chỉ số cột>] of <kiểuphần
tử>;
* Ví dụ:
Var A : array[1 100,1 100] of integer;
+ Để truy cập đến các phần tử trong mảng, ta làm:
<Tên biến mảng>[chỉ số hàng,chỉ số cột]
* Ví dụ: A[2,13], B[23,55],…
- GV: Viết chơng trình để HS có thể dễ
dàng nhận ra các thao tác phải thực hiện
khi viết chơng trình Và giải thích và
phân tích các câu lệnh trong chơng trình
và cách thực hiện của các câu lệnh
- HS: Chú ý nghe giảng và ghi bài
- GV: Vừa viết chơng trình, vừa phát vấn
HS về những câu lệnh đã học ở những bài
trớc
- HS: Xem lại kiến thức đã học và trả lời
b Ví dụ.
* Ví dụ 1: Viết chơng trình đa ra màn
hình bảng cửu chơng
Program Cuuchuong;
Uses Crt;
Var A: Array[1 9,1 10] of integer;
i,j: Byte;
Begin For i:=1 to 9 do For j:=1 to 10 do
A[i,j]:=i*j;
For i:=1 to 9 do Begin
For j:=1 to 10 do Write(A[i,j]:5)
Writeln; Writeln;
End;
Readln;
End.
* Ví dụ 2: Viết chơng trình nhập vào từ
bàn phím các phần tử của mảng 2 chiều A gồm n hàng, m cột với các phần tử là các
số nguyên và một số nguyên k Đa ra màn hình các phần tử của mảng nhỏ hơn k và
có bao nhiêu số
Program Mang_hai_chieu;
Uses Crt;
Var A: Array[1 100,1 100] of integer;
d, i, j: Byte; ;: Integer;
Begin
Trang 8Write(‘ Nhap vao so dong, cot:’);
Readln(n,m);
For i:=1 to n do For j:=1 to m do Begin
Write(a[‘,i,’,’,j,’]=’);
Readln(a[i,j]);
End;
Write(‘Nhap vao gia tri k = ’);
Readln(k); d:=0;
For i:=1 to n do For j:=1 to m do
If a[i,j] < k then Begin
Write(a[i.j]:6); d:= d+1;
End;
If d = 0 then Writeln(‘Khong co phan
tu nao nho hon ’,k)
Else Writeln(‘Co ’,d,’ so nho hon’,k); 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 4 đồng thời gọi bôn HS 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
VI Dặn dò
- Vê nhà xem lại bài và làm bài tập 5, 6, 7, 8, 9 SGK 11/trang 79-80
- Xem trớc bài tập và thực hành 3 trang 63