- Tổ chức hoạt động trong phòng máy để học sinh có được các kĩ năng cơ bản làm việc với kiểu mảng một chiều trong lập trình.. - Cung cấp cho học sinh một số thuật toán đơn giản thường gặ
Trang 1BÀI TẬP THỰC HÀNH 3
Người soạn: Nguyễn Thị Huê
SV lớp: SP Tin K40
Ngày soạn: 27/10/08
Người hướng dẫn: Nguyễn Văn Trường
- Củng cố cho học sinh những hiểu biết về kiểu dữ liệu mảng
- Tổ chức hoạt động trong phòng máy để học sinh có được các kĩ năng cơ bản làm việc với kiểu mảng một chiều trong lập trình
- Cung cấp cho học sinh một số thuật toán đơn giản thường gặp trong lập trình, như: tính tổng phần tử thoả mãn điều kiện, đếm số phàn tử thoả mãn điều kiện
II CHUẨN BỊ
Giáo viên chuẩn bị: máy chiếu, chương trình phần a và phần b bài 1, cài đặt chương trình phần a bài 1 lên các máy học sinh thực hành
III NỘI DUNG
1 Ổn định tổ chức lớp.
2 Kiểm tra bài cũ
Câu hỏi: Em hãy nêu cách khai báo biến mảng 1 chiều (7 điểm) và lấy 1 ví
dụ (3 điểm)?
Đáp án:
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ử>;
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ụ:
Var A: array [1 20] of integer;
Trang 23 Bài m iới
Các em đã được tìm hiểu về kiểu dữ
liệu có cấu trúc đầu tiên là kiểu mảng
Để hiểu hơn về nó, chúng ta cùng xét
một số bài tập cụ thể trong buổi thực
hành hôm nay
Bài 1 (trang 63 SGK):
a, Hãy chạy thử chương trình sau:
? Em hãy đọc đề bài và xác định
Input, Output của bài toán?
Với bài toán này, ta có thể chia thành
các công việc nhỏ:
- Nhập N và k.
- Nhập dãy A.
- Tính tổng các phần tử chia hết cho
k.
Trong chương trình có: thủ tục
Randomize dùng để khởi tạo bộ lấy số
ngẫu nhiên; hàm Random(n) để lấy
một số ngẫu nhiên trong phạm vi từ 0
đến n – 1
VD: lệnh n:=Random(20) thì n sẽ
được gán một giá trị bất kì trong
khoảng từ 0 đến 19
Ta đi xét từng công việc cụ thể:
BÀI TẬP THỰC HÀNH 3
Bài 1:
Đọc bài và xác định:
- Input: Mảng A gồm N số nguyên
A 1 , A 2 , …, A N , N <= 100, |A i |
<=300, 1<=i<=N, số k nguyên dương.
- Output: Tổng các phần tử chia hết cho k.
Nghe và ghi bài
Trang 3 Nhập N và nhập k.
? Trong chương trình, đoạn lệnh nào
dùng để nhập N, đoạn lệnh nào dùng
để nhập k?
Nhập dãy A
? Câu lệnh A[i] := random(300) –
random(300) có ý nghĩa gì?
Vậy nên câu lệnh For i:=1 to n do
A[i]:= random(300) – random(300);
chính là câu lệnh tạo mảng A thoả
mãn: giá trị tuyệt đối mỗi phần tử
không quá 300
Tính tổng các phần tử chia hết
cho k
Việc này ta làm như sau: Dùng S để
lưu tổng cần tìm, khởi tạo bằng 0
Duyệt từ đầu đến cuối mảng, nếu
phần tử nào chia hết cho k thì cộng
thêm phần tử đó vào S
? Đoạn chương trình nào thực hiện
công việc này?
? Lệnh S:=S+A[i] được thực hiện
bao nhiêu lần?
Để kiểm tra kết quả của chương trình,
chúng ta cùng test thử với một vài bộ
Input nhỏ
Trả lời: đoạn lệnh nhập N:
Write(‘nhap n=’); readln(n);
đoạn lệnh nhập k:
Write(‘nhap k=’); readln(k);
Trả lời: lấy hiệu của 2 số ngẫu nhiên trong khoảng từ 0 đến 299, rồi gán cho A[i]
-Trả lời: đoạn chương trình:
S:=0;
For i:=1 to n do
If A[i] mod k = 0 then S:=S+A[i];
Trả lời: số lần thực hiện tuỳ thuộc vào số phần tử trong mảng A chia hết cho k
Test thử chương trình
Trang 4? Em hãy bỏ câu lệnh xoá màn hình
Clrscr, bỏ thủ tục Randomize, chạy
thử chương trình 2,3 lần với một bộ
Input và đưa ra nhận xét?
→ Ý nghĩa của thủ tục Randomize:
xáo trộn bộ sinh số ngẫu nhiên để mỗi
lần thực hiện chương trình sẽ có kết
quả ngẫu nhiên khác nhau
Thấy rằng, nếu dùng đoạn lệnh nhập
N như trên thì ta có thể nhập N có giá
trị bất kì
? Nếu nhập N=103 thì chuyện gì sảy
ra?
Để tránh nhập N sai, ta phải kiểm tra
ngay sau khi nhập Nếu N<=100 thì
thôi không nhập nữa, nếu không thì
phải nhập lại N
Gợi ý: Dùng biến KT kiểu Boolean,
khởi tạo bằng False Thực hiện lặp
trong khi KT còn bằng False: nhập N;
kiểm tra N; nếu đúng thì gán lại KT :=
True, không thì nhập lại N
Tương tự như vậy, ta cũng có thể
nhập lại mảng A từ bàn phím thoả
mãn |A[i]| <=300
Gợi ý: Không dùng biến KT kiểu
Boolean nữa, mà khởi tạo biến i:=1
Thực hiện lặp trong khi i<=N: nhập
A[i]; kiểm tra A[i] thoả mãn |A[i]|
<=300 thì tăng 1 lên 1 đơn vị để nhập
Nhận xét: Dãy A được tạo không thay đổi giá trị các phần tử
Trả lời: nếu nhập n=103 thì chương trình bị thoát ngay lập tức
Trang 5phần tử tiếp theo.
BTVN: Hãy sửa lại chương trình để
nhập N, dãy A từ bàn phím thoả mãn
yêu cầu của bài toán
b, Sửa đổi chương trình.
? Em hãy đọc đề bài và xác định
Input, Output của bài toán?
? Em hãy cho biết: từng đoạn chương
trình sau có ý nghĩa gì?
+ 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);
? Vậy thì 2 biến posi neg dùng để làm
gì?
? Em hãy thay các đoạn lệnh đó vào
chương trình ở những vị trí cần thiết,
để đưa ra số các phần tử nguyên
Đọc bài và xác định:
- Input: Mảng A gồm N số nguyên
A 1 , A 2 , …, A N , N <= 100, |A i |
<=300, 1<=i<=N, số k nguyên dương.
- Output: Số các số nguyên dương
và số các số nguyên âm trong mảng.
Trả lời:
+ Khai báo 2 biến posi và neg thuộc kiểu dữ liệu Integer
+ Khởi tạo giá trị cho posi và neg bằng 0
+ Kiểm tra nếu A[i] lớn hơn 0 thì tăng biến posi lên 1 đơn vị, còn nếu A[i] nhỏ hơn 0 thì tăng biến neg lên 1 đơn vị
+ Viết ra màn hình giá trị của posi
và neg
Trả lời: biến posi dùng để lưu số các phần tử lớn 0, neg lưu số các phần tử nhỏ hơn 0 trong dãy
Thay các đoạn lệnh và chương trình
Trang 6dương và số các phần tử nguyên âm
trong mảng?
Đưa ra chương trình hoàn chỉnh
Bài 4.9 (trang 32 SBT):
? Em hãy đọc đề bài và xác định
Input, Output của bài toán?
? Với bài toán này, ta có thể chia
thành những công việc nhỏ nào?
Việc nhập N thoả mãn 3 <= N <=
100 giống như cô đã hướng dẫn ở bài
1, em hãy tìm hiểu cách viết đoạn lệnh
này ở nhà
Việc nhập dãy A: làm như một
dãy thông thường
Việc đếm số phần tử:
? Em hãy cho biết: điều kiện A[i] ở vị
trí chẵn và có giá trị lẻ thì được biểu
diễn dưới dạng biểu thức logic như
thế nào?
? Em hãy nêu cách đếm số phần tử ở
vị trí chẵn có giá trị lẻ?
Đoạn lệnh như sau:
For i := 1 to n do
Đọc bài và xác định:
- Input: Mảng A gồm N số nguyên
A 1 , A 2 , …, A N , 3 <= N <= 100.
- Output: Số phần tử ở vị trí chẵn
có giá trị là lẻ.
Trả lời: Ta có thể cha thành các công việc nhỏ sau:
+ Nhập N
+ Nhập dãy A
+ Đếm số phần tử ở vị tí chẵn có giá trị lẻ
Trả lời:
i mod 2 = 0 and A[i] mod 2 <> 0
Trả lời: Duyệt từ đầu đến cuối dãy, nếu A[i] thoả mãn điều kiện trên thì tăng biến đếm lên 1 đơn vị
Trang 7If (i mod 2 = 0) and (A[i] mod 2
<> 0) then dem := dem + 1;
Về nhà, em hãy hoàn thiện chương
trình của bài này
IV C ỦNG CỐ VÀ DẶN DÒ
- Sau bài thực hành hôm nay, các em cần nhớ và hiểu được tính tổng phần tử thoả mãn điều kiện, đếm số phần tử thoả mãn điều kiện
- BTVN: 4.10, 4.12, đọc và tìm hiểu trước bài 2 trang 64 GSK