If…then dạng đủ, nếu điều kiện không đúng thì thực hiện lệnh thứ hai, sau đó mới thoát khỏi tổ chức rẽ nh¸nh vµ thùc hiÖn c©u lÖnh tiÕp theo của chương trình.. - NhËn xÐt bµi lµm cña häc[r]
Trang 1BàI TậP Và THựC HàNH 2
Ngày soạn: …………
Ngày giảng: ………
Người soạn: ………
I Mục đích – yêu cầu
1 Kiến thức
- Củng cố thêm về cấu trúc rẽ nhánh và lặp
- Luyện tập cấu trúc lặp, chú ý với bài toán tìm tổng của dãy số
2 Kỹ năng
Sau khi đã chuẩn bị bài tập ở nhà, học sinh cần:
- Nắm đựơc cấu trúc của câu lệnh rẽ nhánh, và lặp, biết được cách thức hoạt động của từng cấu trúc
- Biết một số thao tác hiệu chỉnh chương trình, và một số chú ý về các vòng lặp vô hạn
- Biết cách viết một chương trình hoàn chỉnh và khoa học, cách kiểm tra một chương trình cụ thể thông qua bộ test thử
III Chuẩn bị của Giáo viên và Học sinh
II Hoạt động dạy và học
1 ổn định lớp
- Kiểm tra sĩ số: Tổng số: Vắng:
Có phép: Không phép:
2 Triển khai bài mới
Hoạt động của giáo viên Hoạt động của học sinh
I Tóm tắt lí thuyết
1 Câu lệnh rẽ nhánh
- Lắng nghe và ghi bài
Trang 2a Dạng thiếu:
If <điều kiện > Then <câu lệnh>;
b Dạng đủ:
If < điều kiện 1> Then <câu lệnh1>
Else <câu lệnh 2>;
2 Cấu trúc lặp
a Lặp với số lần chưa biết trước
While <điều kiện> Do <câu lệnh>;
b Lặp với số lần biết trước
Dạng tiến:
For <biến đếm>:= <giá trị đầu> To
<giá trị cuối> Do <câu lệnh>;
Dạng lùi:
For <biến đếm> := <giá trị cuối>
DownTo <giá trị đầu> Do <câu lệnh>;
Chữa bài tập:
Bài 1(Sgk_Tr50): Gọi một học sinh
đọc đầu bài và trả lời câu hỏi đó?
Đề bài: Hãy cho biết sự giống và khác
nhau của hai dạng câu lệnh If…then
- Giống nhau: cùng là tổ chức rẽ nhánh, khi gặp một điều kiện nào đó thì lựa chọn thực hiện thao tác thích hợp
- Khác nhau: trong câu lệnh If…then dạng thiếu, nếu điều kiện không
đúng thì thoát khỏi tổ chức rẽ nhánh,
và thực hiện câu lệnh tiếp theo của chương trình; còn trong câu lệnh
Trang 3If…then dạng đủ, nếu điều kiện không đúng thì thực hiện lệnh thứ hai, sau đó mới thoát khỏi tổ chức rẽ nhánh và thực hiện câu lệnh tiếp theo của chương trình
- Nhận xét bài làm của học sinh sau
đó nếu thấy chỉ có một ít học sinh
làm đúng thì củng cố lại;
Bài 2(Sgk_Tr50): Gọi một học sinh
đọc đầu bài và trả lời câu hỏi đó?
Đề bài: Câu lệnh ghép là gì? Tại sao
phải có câu lệnh ghép?
- Lấy một ví dụ cụ thể về việc dùng
câu lệnh ghép cho học sinh hình
dung được trực quan hơn:
VD: Chương trình tính nghiệm của
phương trình bậc 2
TL: Câu lệnh ghép là một câu lệnh
được hình thành từ nhiều câu lệnh thành phần Câu lệnh ghép nhằm thực hiện thao tác gồm nhiều thao tác thành phần Mỗi thao tác thành phần ứng với một câu lệnh thành phần hoặc câu lệnh ghép khác Về mặt ngôn ngữ lập trình, câu lệnh ghép là một trong các yếu tố để tạo khả năng chương trình có cấu trúc
Bài 3(Sgk_Tr51): Có thể dùng câu
lệnh While…do để thay cho câu lệnh
for…do được không? Nếu được, hãy
thực hiện điều đó với chương trình
Tong_1a.
- Với thuật toán Tong_1a câu lệnh
for…do được thể hiện ở bước nào và
câu lệnh đó như thế nào?
- Thể hiện ở bước 2 và 3
- Câu lệnh:
For N:=1 to 100 do S :=S +1.0/(a+N);
- Câu lệnh trên thể hiện vòng lặp với - Có thể thay thế đoạn chương trình
Trang 4số lần biết trước, cụ thể là 100 lần
(câu lệnh for…do dạng tiến) Vậy ta
có thể dùng câu lệnh While…do thay
cho đoạn câu lệnh For…do trên được
không? Đoạn chương trình được sau
khi thay thế như thế nào?
chứa câu lệnh for…do (dạng tiến) bằng
đoạn chương trình chứa câu lệnh While…do Đoạn chương trình như sau
i := 1;
While i<100 do Begin
S :=S +1.0/(a+N);
i := i + 1;
end;
Bài 4(Sgk_Tr51): Viết câu lệnh rẽ
nhánh tính:
a)
x y va y
x neu
x y va y
x neu y
x
y x neu y
x
z
1 5
.
0
1 1
2 2
2 2
2 2 2
2
b)
y
x
y x
z | | | |
- Sử dụng câu lệnh rẽ nhánh dạng nào?
a) Câu lệnh rẽ nhánh dạng đủ:
if (sqr(x)+sqr(y))<=1 then z:=sqr(x)+sqr(y) else
if y>=x then z:=x+y else z:=0.5;
b) Câu lệnh rẽ nhánh dạng đủ:
if (sqr(x-a)+sqr(y-b))<=sqr(r) then z:=abs(x) + abs(y)
else z:= x+y;
- Thể hiện câu lệnh đó?
- Gọi 2 học sinh lên bảng thể hiện 2
câu lệnh tương ứng với phần a) và b)
- Sử dụng câu lệnh rẽ nhánh dạng thiếu: a) If (sqr(x)+sqr(y)) <=1 then
z:=sqr(x)+Sqr(y);
If (sqr(x)+sqr(y)>1) and (y>=x) then z:= x+y;
If (sqr(x)+sqr(y)>1) and (y<x) then z:=0.5;
b) if (sqr(x-a)+sqr(y-b))<=sqr(r) then z:=abs(x) + abs(y);
Trang 5if (sqr(x-a)+sqr(y-b))>sqr(r) then z:= x+y;
- Nhận xét bài của hai em Để từ đó
chỉ ra đựơc những lỗi hay mắc phải
của HS
Lưu ý: Lỗi mà HS hay mắc phải là:
thiếu ngoặc ở trong từng vế của phép
toán đặt trong câu lệnh If…then
- Gọi một em HS nhận xét để nhằm
nêu bật được tiện lợi khi dùng lệnh
dạng đủ và lệnh dạng thiếu với bài
này và một số bài khác
Bài 5(Sgk_Tr51): Lập trình tính:
50
n n
n
Y
!
1
! 2
1
! 1
1 1
)
n n
e
khi < 2 x 10-6
!
1
n
Đưa giá trị e(n) ra màn hình
Gợi ý:
a)
51
50
4
3 3
2 2
1 1
50
1
n n
n
Y
- Xác định câu lệnh ở đây là câu lệnh
gì? Số lần thực hiện của câu lệnh đó?
- Viết câu lệnh đó
- Câu lệnh lặp biết trước số lần lặp
- Lặp với số lần n=50
- Câu lệnh:
For n:=1 to 50 do Y:=Y+n/(n+1);
- Gọi học sinh lên bảng viết chương Program Bai5_a;
Trang 6trình hoàn chỉnh Var Y: real;
n: byte;
Begin Y:=0;
For n:=1 to 50 do Y:=Y+n/(n+1); Writeln(‘Ket qua:’,Y:14:6);
Readln End
b) Điều kiện dừng củ bài toán < 2
!
1
n
x 10-6 hay <2*1E-6
!
1
n
- Xác định câu lệnh ở đây là câu lệnh
gì? Số lần thực hiện của câu lệnh đó?
- Viết câu lệnh đó
- Câu lệnh lặp chưa biết trước số lần
- Sử dụng thêm biến s để lưu trữ giá trị
!
1
n
- Câu lệnh:
While s>=2*1E-6 do Begin
n:=n+1;
s:=s*(1/n);
e:=e+s;
end;
- Gọi học sinh lên bảng viết chương
trình
Program Bai5_b;
Var n : longint;
e, s : real;
Begin
s := 1/2;
n := 2;
e := 2 + s;
While s>=2*1E-6 do Begin
Trang 7s:=s*(1/n);
e:=e+s;
end;
Writeln(‘Gia tri e(n) la:’,e:10:6); Readln
End
- Nhận xét và hoàn thiện chương
trình của học sinh
Bài 6(Sgk_Tr51): Lập trình giải bài
toán cổ:
Vừa gà vừa chó
Bó lại cho tròn
Ba mươi sáu con
Một trăm chân chẵn
Hỏi có bao nhiêu con mỗi loại?
- Xác định Input, Output của bài toán - Input: tổng số gà, chó; tổng số chân
- Output: số gà, số chó
- Vì gà + chó = 36 con nên biết số gà
sẽ suy ra được số chó
- Gọi số gà là x -> số chó sẽ là 36–x,
số chân là: 2x+4(36-x)
- Ta cần tìm những giá trị x thoả mãn
2x+4(36-x)=100
- Vậy x có thể nhận những giá trị
nào? Để thử điều kiện của bài toán có
thể sử dụng câu lệnh nào để biểu
- TL: x có thể nhận các giá trị từ 1
đến 35, hữu hạn nên ta có thể sử dụng cấu trúc lặp xác định trước số
Trang 8diễn được? lần để thử từng trường hợp của x.
- Câu lệnh:
For x:=1 to 35 do
If 2*x+4*(36-x)=100 then Writeln(‘So ga:’,x,’So cho:’,36-x);
- Gọi học sinh lên bảng viết chương
trình hoàn chỉnh
Program Bai6;
Var x:byte;
Begin For x:=1 to 35 do
If 2*x+4*(36-x)=100 then Writeln(‘So ga:’,x,’So cho:’,36-x); Readln
End
- Trường hợp ngược lại nếu ta đặt số
chó là x, vậy có tìm được kết quả
không? Vòng lặp ở đây thực hiện bao
nhiêu lần?
- Trường hợp nếu ta đặt số chó là x thì số gà sẽ là 36-x Hoàn toàn thu
được kết quả như trên Vì chó có 4 chân nên x có thể nhận các giá trị từ
1 đến 24 Vòng lặp giảm đi 10 lần
- Vậy sử dụng cách nào tối ưu? - Nên sử dụng cách đặt số chó là x sẽ
tối ưu vì giảm được số lần lặp, tiết kiệm thời gian và bộ nhớ
IV Củng cố và dặn dò Học sinh
- Giáo viên nhận xét khâu chuẩn bị bài và học bài của các em và nhấn mạnh những điểm mà các em hay m
-Về nhà các em làm lại cho hoàn chỉnh các chương trình đã chữa và chuẩn bị các bài sau: bài 7, 8 trang 51