Mục đích yêu cầu: * Học sinh hiểu được: - Kiểu dữ liệu mảng và cách khai báo mảng: một chiều và hai chiều.. * Học sinh nắm được: - Cách khai báo hay định nghĩa kiểu dữ liệu mảng một chi
Trang 1BÀI TẬP VÀ THỰC HÀNH MẢNG
I Mục đích yêu cầu:
* Học sinh hiểu được:
- Kiểu dữ liệu mảng và cách khai báo mảng: một chiều và hai chiều
* Học sinh nắm được:
- Cách khai báo (hay định nghĩa) kiểu dữ liệu mảng một chiều và hai chiều
- Nhập dữ liệu mảng Đưa ra màn hình chỉ số và giá trị của mảng
- Duyệt qua từng phần tử của mảng
II Chuẩn bị của giáo viên và học sinh:
1 Giáo viên: SGK, SGV, giáo án, giáo án điện tử, đèn chiếu, phòng máy, một số chương trình mẫu khổ lớn
2 Học sinh: Xem kỹ bài thực hành trong SGK Tìm hiểu kỹ từng dòng lệnh
III Nội dung:
Hoạt động của thầy và trò Nội dung bài giảng
GV: Các em hãy đọc đề và gõ Bài thực hành 3
Trang 2chương trình trong SGK trang
77-78 vào máy
GV: Myarray là tên kiểu dữ liệu
hay tên biến
HS: Trả lời
GV: Vai trò của nmax và n? Có
thể thay nmax bằng n trong khai
báo kiểu mảng được không? Vì
sao?
HS:
GV: Nhập số phần tử của mảng?
1) Bài 1
Cho mảng A gồm n số nguyên (n ≤ 100), mỗi số theo trị tuyệt đối không vượt quá 300 Tính tổng các phần tử của mảng là bội số của một số nguyên dương k cho trước
a) Gõ nội dung chương trình: Program sum1;
Uses crt;
Const nmax = 100;
Type MyArray = Array[1 nmax] Of Integer;
Var A : MyArray;
s,n,i,k: integer;
Begin Clrscr; Randomize;
Trang 3HS: Nhập n
GV: Những dòng lệnh nào nhằm
tạo ra mảng A?
GV:Lệnh A[i]:=
Random(301)-Random(301); dùng để làm gì?
GV: Câu lệnh FOR-DO cuối
cùng thực hiện nhiệm vụ gì? Giải
thích?
GV: Câu lệnh s:=s+A[i]; được
thực hiện bao nhiêu lần?
Write('Nhap n = ');
Readln(n);
{Tạo ngẫu nhiên mảng gồm n số nguyên}
For i:=1 To n Do A[i]:= Random(301)-Random(301);
{Duyệt qua từng phần tử của mảng: xuất chỉ số và giá trị}
For i:=1 To n Do Writeln(' A[',i,'] = ',A[i]:5);
Write('NHap k :'); Readlk(k);
s:=0;
For i:=1 to n Do
If A[i] Mod k = 0 Then s:=s+A[i];
Trang 4Nên cho học sinh lưu lại chương
trình này Sau đó dùng Save as để
lưa lại với tên khác để dùng cho
câu b
Writeln('Tong can tinh la : ',s);
Readln End
b) Hãy thay các câu lệnh sau vào vị trí cần thiết để sửa đổi chương trình trên nhằm để tính và đưa ra số lượng
số dương và số âm trong mảng
posi,neg: integer;
posi:=0; neg:=0;
If A[i] > 0 Then Posi:=posi+1
Else If A[i] < 0 Then Neg:=neg+1;
Writeln(posi:4, neg:4);
Chương trình trên được viết lại như sau:
Trang 5Program sum1;
Uses crt;
Const nmax = 100;
Type MyArray = Array[1 nmax] Of Integer;
Var A : MyArray;
s,n,i,k,posi,neg: integer;
Begin Clrscr; Randomize;
Write('Nhap n = ');
Readln(n);
{Tạo ngẫu nhiên mảng gồm n số nguyên}
For i:=1 To n Do A[i]:= Random(301)-Random(301);
{Duyệt qua từng phần tử của mảng:
Trang 6xuất chỉ số và giá trị}
For i:=1 To n Do Writeln(' A[',i,'] = ',A[i]:5);
Write('NHap k :'); Readlk(k);
{s:=0;}
posi:=0; neg:=0;
For i:=1 to n Do
If A[i] > 0 Then Posi:=posi+1
Else If A[i] < 0 Then Neg:=neg+1;
Writeln(posi:4, neg:4);
{If A[i] Mod k = 0 Then s:=s+A[i];
Writeln('Tong can tinh la : ',s);}
Readln
Trang 7HS: Dùng một mảng hai chiều để
lưu Bảng cộng
End
Bài 2 Chương trình tính và đưa ra màn hình bảng cộng
1 2 3 4 5 6 7 8 9
2 4 5 6 7 8 9 10 11
3 5 6 7 8 9 10 11 12
4 6 7 8 9 10 11 12 13
5 7 8 9 10 11 12 13 14
6 8 9 10 11 12 13 14 15
7 9 10 11 12 13 14 15 16
8 10 11 12 13 14 15 16 17
9 11 12 13 14 15 16 17 18
Bảng Cộng Program Bangcong;
Uses Crt;
Trang 8GV: Khai báo?
HS: Khai báo
GV: Gọi i là chỉ số dòng, j là chỉ
số cột thì miền giá trị của i, j như
thế nào?
HS: Trả lời
GV: Nhận xét gì về phần tử B[i,j]
của bảng cộng?
HS: B[i,j]=i+j
GV: Yêu cầu học sinh viết đọan
chương trình tính B[i,j]
GV: Viết kết quả ra màn hình?
HS: lên bảng thực hiện
VAR B: Array[1 9,1 9] OF Integer;
i, j : Integer;
Begin Clrscr;
For i:=1 to 9 Do {Tính giá trị cho từng phần tử}
For j:=1 to 9 Do
B[i,j]:= i+j;
{Xuất ra màn hình}
For i:=1 to 9 Do Begin
For j:=1 to 9 Do
Write(B[i,j]:3); Writeln;
End;
Readln
Trang 9GV: Chương trình trên chỉ đưa ra
max với chỉ số lớn nhất Do đó
muốn đưa ra max với chỉ số nhỏ
nhất nên gợi cho hs:
- Vai trò của biến j: thông qua kết
quả Lệnh gán khởi trị biến j sau
khi duyệt qua từng phần tử, câu
lệnh IF - THEN dùng để kiểm tra
phần tử thứ i có lớn nhất không,
End
Bài 2:Viết chương trình tìm phần tử lớn nhất của mảng và đưa ra màn hình chỉ số và giá trị của phần tử tìm được Nếu có nhiều phần tử cùng giá trị lớn nhất thì đưa ra phần tử có chỉ
số nhỏ nhất
Program MaxElement;
Uses crt;
Const nmax = 100;
Type MyArray = Array[1 nmax] Of Integer;
Var A : MyArray;
n,i,j: integer;
Begin Clrscr; Randomize;
Write('Nhap n = ');
Trang 10nếu có lưu giữ vào biến j
- Nếu dùng bộ dữ liệu lớn thì làm
như chương trình của SGK
Trong trường hợp nếu muốn nhập
thì hướng dẫn hs viết đoạn
chương trình sau:
FOR i:=1 to n Do
Begin
Write('A[',i'] =');
Readln(A[i]);
End;
GV: Mô phỏng với 10 phần tử
GV:Vòng lặp FOR khi duyệt qua
từng phần tử để tìm số lớn nhất ở
trên có thể đảo để chạy ngược lại
được không (Downto)
GV: Hãy thử cho vòng FOR trên
Readln(n);
{Tạo ngẫu nhiên mảng gồm n số nguyên}
For i:=1 To n Do A[i]:= Random(300)-Random(300);
{Duyệt qua từng phần tử của mảng: xuất chỉ số và giá trị}
For i:=1 To n Do Writeln(' A[',i,'] = ',A[i]:5);
j:=1;
For i:=1 to n Do
If A[i] > A[j] Then j:=i;
Writeln('Chỉ số : ',j, ' Gia tri : ',A[j]:5;
Readln End
Trang 11chạy từ n đến 1, lúc đó j:=n và
xem kết quả
GV:Dựa vào chương trình trên để
tìm phần tử bé nhất
For i:=1 to n Do
If A[i] > A[j] Then j:=i;
Viết lại
If A[i] < A[j] Then j:=i;
b) Chương trình được viết lại để
đưa ra các chỉ số các phần tử có
cùng giá trị lớn nhất
Gợi để học sinh viết được đoạn
chương trình sau:
GV: Chương trình trên có cần lưu
giữ đoạn chương trình tìm phần
b FOR i:=1 to n Do IF A[i]=A[j] Then
Writeln('Chỉ số : ',i, ' Gia tri : ',A[i]:5)
Trang 12tử lớn nhất?
GV: Để đưa ra chỉ số và phần tử đạt giá trị lớn nhất có cần duyệt qua tất cả các phần tử của mảng không?
IV Củng cố, dặn dò:
Nhắc lại các lỗi học sinh thường gặp
Chuẩn bị bài thực hành tiết sau