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ể.
Chươ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: Phương pháp: Thuyết trình, vấn đáp 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 . - 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 mỗ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. - 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ừ bà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 For- 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 - 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 - HS: trả lời câu hỏi - GV: Cho học sinh viết chương trình - 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ố - 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 : Array [kiểu chỉ số] of ; * 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 = array [kiểu chỉ số] of ; Var : ; * 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) - 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: [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. 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 ‘); 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]; 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); 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
Tài liệu đính kèm: