Khai bá o:

Một phần của tài liệu GIAO AN HK I TIN HOC 11 (Trang 57 - 66)

 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ử > ;

 Khai báo gián tiếp :

Type < Tên kiểu mảng > = Array

 Bài 11 Kiểu Mảng (Một Chiều )

Var < Tên biến mảng > : < tên kiểu mảng > ;

Tiết

20

Ví dụ :

 Khai báo gián tiếp : Type Songuyen = Array[1..100] Of integer ; Sothuc = Array [1..50 ] Of Real ; Var A : Songuyen ; B : Sothuc ;

 Khai báo trực tiếp : Var X : Array [1..50 ] Of integer ;

Y : Array [ 1..50 ] Of Real ;

+ Đặt vấn đề : Ở tiết trước chúng ta đã học dạng cấu trúc của mảng một chiều, hôm nay chúng ta tiếp tục vận dụng cấu trúc này để viết chương trình.Ta xét một số thuật toán về tìm kiếm và sắp xếp.

? Thuật toán trên dừng lại khi nào ?

+ Dạng 2 tiện hơn Chỉ số phần tử Mảng

+ Dừng lại i > N thì đưa ra giá trị Max rồi kết thúc.

Trong đó :

- Kiểu chỉ số : thường là 1 đoạn số nguyên liên tục có dạng n1..n2, với n1, n2 là các hằng hoặc biểu thức nguyên xác định chỉ số đầu và chỉ số cuối ( n1 < n2 ).

- Kiểu phần tử : là kiểu của các phần tử trong mảng.

Ví dụ :

Var A :Array[ 1..50 ] of integer;

Type Lop = Array[1..50] of Byte;

Var B : Lop ; - Để truy cập vào phần tử mảng, ta viết : < Tên biến mảng > [ chỉ số ] ; Vd : A[20] ; truy cập đến phần tử thứ 20 trong mảng A. 1 2 20 99 100 b) Một số ví dụ :Ví dụ 1 : Tìm phần tử lớn nhất của dãy số nguyên.

- Input : Số nguyên dương N (N,250) và dãy N số nguyên từ a1 … aN

- Output :Số lớn nhất Max của dãy số.

Thuật toán: (Cách liệt kê ) Bước 1 : nhập N và dãy a1 ,… , aN . Bước 2 : Max ← a1 ,i ←2.

22 25 27 33 25 25 25

 Bài 11 Kiểu Mảng (Một Chiều )

Bước 3 : Nếu i > N thì đưa ra giá trị Max rồi kết thúc.

Bước 4 : Nếu ai > Max thì Max ←ai. Bước 5 : i←i + 1 ,rồi quay lại bước 3.

- Xây dựng thuậ toán ở lớp 10. (adsbygoogle = window.adsbygoogle || []).push({});

+ Thuật toán : (Cách liệt kê ) Bước1:Nhập N, các số hạng a1,a2,…,aN

Bước 2 : M ←N.

Bước 3 : Nếu M<2 thì đưa ra

Chương Trình : Program timmax ;

Uses crt ;

Const Nmax =250 ;

Type Arrint = array [ 1..Nmax ] Of integer ;

Var N, i, Max, csMax : integer ; A : Arrint ;

Begin

Clrscr ;

Write(‘nhap so luong phan tu cua day so , n= ‘) ; Readln(N) ; For i:= 1 to N do Begin Write(‘Phan tu thu ‘, i , ‘=’ ) ; Readln(A[i]) ; End ;

Max := A[1 ] ; csmax := 1 ;

For i := 2 to N do

If A[i] > Max then Begin

Max := A[i] ; Csmax := i ;

End ;

Writeln(‘gia tri cua phan tu Max :’, Max) ;

Writeln(‘Chi so cua phan tu Max : ‘, csmax) ;

Readln ;

End.

Ví dụ 2: Sắp xếp giải số nguyên bằng thuật toán tráo đổi. - Input : Số nguyên dương N(N<= 250) và dãy A gồm N số nguyên dương a1,a2,…,aN , mỗi số đều không

 Bài 11 Kiểu Mảng (Một Chiều )

dãy A đã được sắp xếp, rồi kết thúc.

Bước 4 : M ←M-1. i←0. Bước 5 : i ←i+1.

vượt quá 500.

- Output : Dãy A đã được sắp xếp thành dãy không giảm.

Tiết

21

Bước 6 : Nếu i>M thì quay lại bước 3.

Bước 7 : Nếu ai > ai +1 thì trao đổi ai và ai +1 cho nhau. (adsbygoogle = window.adsbygoogle || []).push({});

Bước 8 : Quay lại bước 5.

? Thuật toán trên dừng lại khi nào ?

- HS dễ dàng nhận ra việc chuyển đổi ngôn ngữ từ ngôn ngữ thuật toán sang ngôn ngữ lập trình.

+ Sau lần duyệt thứ nhất giá trị lớn nhất được đưa ra ở cuối dãy.sau lượt thứ 2, giá trị lớn nhất thứ hai được xếp vào sát cuối.Tương tự , duyệt cho hết dãy. Giá trị của biến j chính là chỉ số phần tử cuối trong đoạn được duyệt của lượt. Giá trị của biến i chính là chỉ số phần tử được lấy so sánh với phần tử kề nhau trong dãy.

* Đoạn chương trình tráo đổi A[i] và A[i+1] :

For j := N Downto 2 do For i := 1 To j-1 do

If A[i] > A[i+1] then Begin T := A[i] ; A[i] := A[i+1] ; A[i+1] := t ; End ; + Đặt vấn đề : Ở bài toán tìm kiếm nhị phân, chúng ta đã được học ở lớp 10.trước hết ta xác định Input và Output của

+ Dừng lại khi M<2 thì đưa ra dãy A đã được sắp xếp, rồi kết thúc.  Chương Trình : Program sapxep ; Uses crt ; Const Nmax =250 ;

Type Arrint = array [ 1..Nmax ] Of integer ;

Var N, i, j, t : integer ; A : Arrint ;

Begin

Clrscr ;

Write(‘nhap so luong phan tu cua day so , n= ‘) ; Readln(N) ; For i:= 1 to N do Begin Write(‘Phan tu thu ‘, i , ‘=’ ) ; Readln(A[i]) ; End ;

Max := A[1 ] ; csmax := 1 ;

For j := N Downto 2 do For i := 1 To j-1 do

If A[i] > A[i+1] then Begin

T := A[i] ; A[i] := A[i+1] ; A[i+1] := t ;

End ;

Writeln(‘Day so duoc sap xep la :’) ;

For i:= 1 to N do

Writeln(A[i]) ; Readln ;

End.

Ví dụ 3 : Tìm kiếm nhị phân. - Input : Dãy A là dãy tăng gồm N (N<= 250) số nguyên dương a1,a2,…,aN

 Bài 11 Kiểu Mảng (Một Chiều )

bài toán. , và số nguyên k.

- Output : Chỉ số i mà ai = k hoặc thông báo không có số hạng nào của dãy A có giá trị bằng k.

? Khi nào thì quá trình lặp nói trên dừng lại ?

- Thuật toán tìm kiến nhị phân là thu hẹp nhanh phạm vi tìm kiếm sau mỗi lần so sánh khoá k với số hạng được chọn.

- Trong thuật toán, việc tìm kiếm thực chất là lặp lại một số lần chưa xáx định. Ta xét aGiua

với khoá k. (adsbygoogle = window.adsbygoogle || []).push({});

+ Quá trình lặp đó cần dừng lại khi 1 trong hai sự kiện sau xảy ra. ( tìm thấy hoặc tìm hết dãy mà không thấy )

Thuật toán : (Cách liệt kê ) Bước 1 :Nhập N,các số hạng a1,a2,..aN

và khoá k.

Bước 2 : Dau ←1 , Cuoi←N. Bước 3 : Giua←(Dau + Cuoi)/2. Bước 4 : Nếu aGiua = k thì thông báo chỉ số Giua,rồi kết thúc.

Bước 5 : Nếu aGiua > k thì đặt Cuoi= Giua –1 ,rồi chuyển đến bước 7. Bước 6 : Dau ← Giua + 1.

Bước 7 : Nếu Dau > Cuoi thì thông báo dãy A không có số hạng có giá trị = k ,rồi kết thúc.

Bước 8 : Quay lại bước 3.

Chương trình :

Program TK_nhiphan ;

Uses crt ;

Const Nmax =250 ;

Type Arrint = array [ 1..Nmax ] Of integer ;

Var N, i, k, Dau, Cuoi,Giua: integer ; A : Arrint ;

Tim_thay : Boolean ;

Begin

Clrscr ;

Write(‘nhap so luong phan tu cua day so , n= ‘) ; Readln(N) ;

Writeln(‘nhap vao các phan tu cua day so tang’) ; For i:= 1 to N do Begin Write(‘Phan tu thu ‘, i , ‘=’ ) ; Readln(A[i]) ; End ;

Write(‘nhap vao khoa k = ‘) ; Readln(k) ;

 Bài 11 Kiểu Mảng (Một Chiều )

Dau :=1 ; Cuoi :=N ; Tim_thay := False ;

While ( Dau <= Cuoi ) And not ( Tim_thay ) Do

Begin

Giua := (Dau + Cuoi ) Div 2 ; If A[Giua] = k Then

Tim_thay := true Else

If A[Giua] > k Then Cuoi := Giua – 1 ; Else Dau := Giua +1 ;

End ;

If Tim_thay Then

Writeln(‘Chi so tim duoc la :’, Giua)

Else (adsbygoogle = window.adsbygoogle || []).push({});

Writeln(‘tim khong thay;) ; Readln ;

End.

4. Củng cố :(4’)

- Nhắc lại các cấu trúc mảng một chiều.

 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ử > ;

 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 > ;

- Kiểu mảng là một kiểu dữ liệu có cấu trúc được dùng nhiều trong lập trình, những bài toán tìm kiếm, sắp xếp dãy các phần tử là những bài toán thường gặp và có ý nghĩa quan trọng.

- Cách khai báo và cách tham chiếu đến một phần tử của mảng. 5. Dặn dò :(1’)

- VCT nhập vào 1 dãy số nguyên bất kỳ sau đó sắp xếp các số nguyên lại từ bé đến lớn. - Có 2 đội A và B tham gia cuộc thi lập trình cho máy tính. Đội A có 11 người, đội B có 12 người, mỗi người có một số điểm nguyên từ 1 đến 10.VCT tính điểm trung bình của mỗi đội, biết rằng số điểm của mỗi đội được nhập từ bàn phím.

- Học bài và chuẩn bị Bài Tập Và Thực Hành 3 trong SGK trang 63.

Hòa Lợi,ngày……Tháng ……Năm 2008

Duyệt

Bài Tập Và Thực Hành 3

Tuần: 11,12 Ngày soạn: 30/09/08 Tiết: 22,23 Ngày Dạy: / /

Bài Tập Và Thực Hành 3

I/- Mục đích – yêu cầu :

 Về kiến thức :

+ Củng cố cho học sinh những hiểu biết về kiểu dữ liệu mảng.

+ Tổ chức những 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, cụ thể là :

- Khai báo kiểu dữ liệu mảng.

- Nhập dữ liệu cho mảng, đưa ra màn hình chỉ số và giá trị các phần tử của mảng.

- Duyệt qua tất cả các phần tử của mảng để xử lí từngnphần tử.

+ Cung cấp cho HS ba thuật toán cơ bản và đơn giản thường gặp với dữ liệu kiểu mảng.

- Tính tổng các phần tử thoả mãn điều kiện nào đó.

- Đếm số các phần tử thoả mãn điều kiện nào đó.

- Tìm phần tử lớn nhất( hay nhỏ nhất) của mảng cùng với vị trí của nó trong mảng.

- Giới thiêu hàm random(N) cho HS thấy có thể dùng lệnh để máy lấy ngẫu nhiên 1 số nguyên trong khoảng từ 0 đến N-1, giới hạn N do người lập trình đưa ra. (adsbygoogle = window.adsbygoogle || []).push({});

 Về kỹ năng :

+ Nâng cao kĩ năng sử dụng 1 số câu lệnh và 1 số kiểu dữ liệu thông qua việc tìm hiểu, chạy thử các chương trình có sẵn.

+ Góp phần hình thành và rèn luyện tư duy lập trình, tác phong của người lập trình.  Về thái độ :

+ Tiếp tục xây dựng lòng ham thích lập trình, nhằm giải quyết các bài toán bằng máy tính. + Có trách nhiệm bảo vệ tốt các trang thiết bị và không được tự động sử dụng máy tính khi chưa có sự cho phép của giáo viên.

II/- Chuẩn bị :

 GV : + Phải có giáo án và bài tập thực hành 3.

+ Chuẩn bị sẳn chương trình ở câu a bài 1 trên đĩa ( đĩa cứng của từng máy hay đĩa mềm) và cung cấp cho 1 số HS vào những thời điểm thích hợp.

+ Phân nhóm để thực hành.

 HS : + Đọc trước sách giáo khoa ở nhà để chuẩn bị cho bài tập và thực hành 3.  PP : + Hướng dẫn và phát vấn.

III/- Hoạt động dạy học :

1. Ổn định lớp : Kiểm tra sĩ số (1’)

2. Kiểm tra bài cũ :

- Trước khi vào phòng máy tính để thực hành và sau khi ra khỏi phòng máy thì chúng ta cần phải làm gì?

Bài Tập Và Thực Hành 3

TG Hoạt Động Của GV Hoạt Động Của HS Nội Dung Ghi Bài

Tiết

22 + Trước hết chúng ta mở máytính bằng cách ấn nút power để tính bằng cách ấn nút power để khởi động máy tính.

- Sau khi khởi động máy tính xong ta Start Program

Pascal7.

+ Điểm khác nhau cơ bản của các chương trình ở câu a và câu b là chương trình ở câu a kiểm tra lần lượt từng phần tử của mảng để quyết định có cộng tích luỹ hay không, còn chương trình ở câu b kiểm tra từng phần tử của mảng để quyết định đếm tăng cho số các số dương hay đếm tăng cho số các số âm. + Thủ tục randomize khởi tạo bộ lấy số ngẫu nhiên trước khi dùng lệnh random(n) để lấy 1 số nguyên nga64u nhiên trong phạm vi từ 0 đến n-1.

 Một số câu hỏi cho HS : ? MyArray là tên một kiểu dữ liệu hay tên 1 biến?

? Vai trò của nmax và n khác nhau như thế nào ? có thể bỏ khai báo hằng nmax và viết n thay cho nmax trong khai báo kiểu mảng được không ? vì sao? ? Những dòng lệnh nào nhằm tạo ra mảng A ?

? Lệnh gán :

A[i] := random(300) – random(300) ; có ý nghĩa gì ? ? Câu lệnh For – do cuối cùng thực hiện nhiệm vụ nào trong những nhiệm vụ đặt ra cho chương trình ? giải thích ? + Là tên kiểu dl của mảng. + Không thể bỏ khai báo hằng nmax và viết n thay cho nmax trong khai báo kiểu mảng được.

+ Write(A[i] :5) ; + Tạo mảng A[i] ngẫu nhiên nhiên trong đoạn từ 0 đến n –1.

Bài 1 : Tạo mảng A gồm n (n <= 100) số nguyên, mỗi số có 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ộ số của một số nguyên dương k cho trước. a) Hãy tìm hiểu và chạy thử chương trình sau đây :

Program Sum1 ;

Uses crt ;

Const Nmax =100 ;

Type MyArray = array [1 .. Nmax ] (adsbygoogle = window.adsbygoogle || []).push({});

of integer ; Var s, n, i, k : integer ; A : MyArray ; 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(300) – random(300) ;

For i := 1 to n do Write(A[i] :5) ; Writeln ; For i := 1 to n do Write(‘Nhap n ‘) ; readln(k) ; S :=0 ; For i := 1 to n do

If A[i] mod k = 0 Then

S := s + A[i} ;

Writeln(Tong can tinh :’, s); Readln ;

End.

Chú ý : Hàm chuẩn random(n) cho giá trị là số nguyên ngẫu nhiên trong đoạn từ 0 đến n –1, còn thủ tục randomize khởi tạo cơ chế sinh số ngẫu nhiên.

Bài Tập Và Thực Hành 3

Tiết

23

? Câu lệnh : S := S + A{i} ; được thực hiện bao nhiêu lần ?

? Cho biết ý nghĩa của biến posi và biến neg .Vì sao lại biết biến posi dùng để đếm số lượng phần tử có giá trị dương của mảng ? - Có thể dùng save as để lưu lại câu b với 1 tên khác câu a.

+ Chương trình này thể hiện thuật toán tìm phần tử lớn nhất (mặc dù khác với chương trình ở bài 11, mục 1b, ví dụ 1).

Tìm hiểu vai trò của biến j : Qua câu lệnh đưa kết quả ra màn hình, qua lệnh gán khởi trị cho biến j trước khi duyệt từng phần tử của mảng bằng vòng lặp For – do, qua câu lệnh if – then dùng để kiểm tra phần tử thứ i của mảng và lưu trữ chỉ số i của phần tử này trong biến j.

- Có thể cho HS chay chương trình này trên giấy nháp với bộ input nhỏ(mảng A có khỏng 4 đến 8 phần tử ) và hướng dẫn cho HS khá giỏi chạy đoạn chương trình này với công cụ Debug của Pascal.

- So sánh phần tử thứ A[i] với A[j]( từ phần tử thứ nhất đến

+ Tuỳ thuộc vào mảng A có bao nhiêu phần tử thoả mãn điều kiện là bội của số cho trước, số này được lưu trữ bởi biến k.

b) Hãy đưa các câu lệnh sau đây vào những vị trí cần thiết nhằm sửa đổi chương trình trong câu a) để có được chương trình đưa ra số các số dương và số các 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) ;

Bài 2 : Viết chương trình tìm phần tử có giá trị 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ó phần tử có cùng giá trị lớn nhất thì đưa ra phần tử có chỉ số nhỏ nhất.

Một phần của tài liệu GIAO AN HK I TIN HOC 11 (Trang 57 - 66)