I. MỤC ĐÍCH, YÊU CẦU.
- 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
BÀ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. MỤC ĐÍCH, YÊU CẦU. 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. 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. NỘI DUNG. Ổn định tổ chức lớp. Sĩ số: vắng: có phép: không phép: 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 : array [kiểu chỉ số] of ; Cách 2: Khai báo gián tiếp: Type = array [kiểu chỉ số] of ; Var : ; Ví dụ: Var A: array [1..20] of integer; Bài mới Hoạt động của giáo viên Hoạt động của học sinh TG 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ể: 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ỏ. ? 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 phầ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À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 A1, A2, , AN, N <= 100, |Ai|<=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. 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. 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. 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 dương và số các phần tử nguyên âm trong mảng? Đưa ra chương trình hoàn chỉnh. Đọc bài và xác định: Input: Mảng A gồm N số nguyên A1, A2, , AN, N <= 100, |Ai|<=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. 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 If (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. Đọc bài và xác định: Input: Mảng A gồm N số nguyên A1, A2, , AN, 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ị. 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. NHẬN XÉT VÀ ĐÁNH GIÁ.
Tài liệu đính kèm: