Tải bản đầy đủ (.docx) (48 trang)

Giao an boi duong hoc sinh gioi tin hoc91415 - Website Trường THCS Lê Quý Đôn - Đại Lộc - Quảng Nam

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (320.75 KB, 48 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<i><b>Tuần:</b></i>


<i><b> </b></i> <i><b> Ngày soạn:</b></i> <i><b>21/09/2015</b></i>
<b>Tiết 1 - 2 - 3: CÂU LỆNH CÓ CẤU TRÚC: IF..THEN, FOR..DO,…</b>
<b>A.MỤC TIÊU</b>


<b>1.Kiến thức: Học sinh nắm được các lệnh có cấu trúc, làm được các bài tập sữ dụng các lệnh có</b>
cấu trúc


<b>2.Kỹ năng: Rèn kỹ năng viết câu lệnh chính xác, kỹ năng vận dụng các câu lẹnh vào từng bài</b>
toán cụ thể


<b>3.Thái độ: Học sinh tích cực chính xác khi viết các câu lệnh, biết vận dụng vào các bài toán thực</b>
tế


<b>B. PHƯƠNG PHÁP</b>
Nêu vấn đề, gợi mở


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
Gv: Giáo án, tài liệu tham khảo.
Hs: Ôn tập các câu lệnh cơ bản
<b>D. TIẾN TRÌNH LÊN LỚP</b>
1. Ổn định: Sĩ số


2. Kiểm tra bài cũ: Kiểm tra việc nắm các câu lệnh
3. Bài mới


<b>I. CÂU LỆNH ĐIỀU KIỆN (RẼ NHÁNH)</b>
<b>1.1. Lệnh IF</b>


Cú pháp:



<b>(1) Dạng thiếu:</b> <b> IF B THEN S;</b>


<b>(2) Dạng đủ : IF B THEN S1 ELSE S2;</b>
Sơ đồ thực hiện:


<i><b>Chú ý: Khi sử dụng câu lệnh IF thì đứng trước từ khố ELSE khơng được có dấu chấm phẩy (;).</b></i>
<b>1.2. Lệnh CASE</b>


<b>Cú pháp:</b>



<b>Dạng 1</b> <b>Dạng 2</b>


<b>CASE B OF</b>
<b>Const 1:</b>
<b>S1;</b>


<b>Const 2:</b>


<b>CASE B OF</b>
<b>Const 1:</b>
<b>S1;</b>


<b>Const 2:</b>
<b>(2)</b>


<b>B</b>


+



<b>-S1</b> <b>S2</b>


<b>...</b>
<b>(1)</b>


<b>R</b>
<b>B</b>


+


<b>-S</b>


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

<b>S2;</b>
<b>...</b>


<b>Const n:</b>
<b>Sn;</b>


<b>END;</b>


<b>S2;</b>
<b>...</b>


<b>Const n:</b>
<b>Sn;</b>


<b>ELSE Sn+1;</b>
<b>END;</b>
Trong đó:



 B: Biểu thức kiểu vô hướng đếm được như kiểu nguyên, kiểu logic, kiểu ký tự, kiểu liệt
kê.


 Const i: Hằng thứ i, có thể là một giá trị hằng, các giá trị hằng (phân cách nhau bởi dấu
phẩy) hoặc các đoạn hằng (dùng hai dấu chấm để phân cách giữa giá trị đầu và giá trị
cuối).


 Giá trị của biểu thức và giá trị của tập hằng i (i=1¸n) phải có cùng kiểu.
Khi gặp lệnh CASE, chương trình sẽ kiểm tra:


- Nếu giá trị của biểu thức B nằm trong tập hằng const i thì máy sẽ thực hiện lệnh Si tương ứng.


- Ngược lại:


+ Đối với dạng 1: Khơng làm gì cả.
+ Đối với dạng 2: thực hiện lệnh Sn+1.


<b>II. CÂU LỆNH LẶP</b>


<b>2.1. Vòng lặp biết trước số lần lặp</b>
Có hai dạng sau:


 <i><b>Dạng tiến</b></i>


<b>FOR <biến đếm>:=<giá trị Min> TO <giá trị Max> DO S;</b>
 <i><b>Dạng lùi</b></i>


<b>FOR <biến đếm>:=<giá trị Max> DOWNTO <giá trị Min> DO S;</b>
Sơ đồ thực hiện vòng lặp FOR:



<i><b>Chú ý: Khi sử dụng câu lệnh lặp FOR cần chú ý các điểm sau:</b></i>


<i>Không nên tuỳ tiện thay đổi giá trị của biến đếm bên trong vịng lặp FOR vì làm như vậy có</i>
<i>thể sẽ khơng kiểm sốt được biến đếm.</i>


<i>Giá trị Max và Min trong câu lệnh FOR sẽ được xác định ngay khi vào đầu vịng lặp. Do đó</i>
<i>cho dù trong vịng lặp ta có thay đổi giá trị của nó thì số lần lặp cũng khơng thay đổi.</i>


<b>Dạng tiến</b>


Biến đếm:=Min


Biến đếm<=Max


<b>+</b>


<b></b>


<b>-Thốt</b>


S;
INC(Biến đếm);


<b>Dạng lùi</b>


Biến
đếm:=Max


Biến đếm>=Max



<b>+</b>


<b></b>


<b>-Thốt</b>


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

<i><b>2.2 Vịng lặp chưa biết trước số lần lặp </b></i>


<b>Dạng REPEAT</b> <b>Dạng WHILE</b>
<b>Repeat</b>


<b>S;</b>
<b>Until B;</b>


<b>While B Do S;</b>


<b>Ý nghĩa: </b>


<i><b>Dạng REPEAT: Lặp lại công việc S cho đến khi biểu thức B=TRUE (đúng) thì dừng.</b></i>
<i><b>Dạng WHILE: Trong khi biểu thức B=TRUE (đúng) thì tiếp tục thực hiện công việc S.</b></i>


Bài tập 1: Viết chương trình nhập vào một số nguyên và kiểm tra xem số vừa nhập là số chẵn
hay số lẻ.


Uses crt;
Var x:integer;
Begin


Write('Nhap vao mot so nguyen : '); Readln(x);
If x MOD 2=0 Then



Writeln('So vua nhap vao la so chan')
Else


Writeln('So vua nhap vao la so le');
Readln;


End.


Bài tập 2: Viết chương trình giải phương trình bậc nhất ax+b=0
Uses Crt;


Var a,b,x : real;
Begin


Write('a = '); Readln(a);
Write('b = '); Readln(b);


If a = 0 Then { Nếu a bằng 0 }


If b = 0 Then { Trường hợp a = 0 và b = 0 }
Writeln('Phuong trinh co vo so nghiem')
Else { Trường hợp a=0 và b  0 }


Writeln('Phuong trinh vo nghiem')
<b>Repeat</b>


S


B



<b>đ</b>
<b></b>


<b>-Thoát</b>


<b>While</b>


<b>B</b>
<b>đú</b>
<b>ng</b>
<b>+</b>


<b></b>


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

Else { Trường hợp a  0 }
Begin


x:= -b/a;


Writeln('Phuong trinh co nghiem la :',x:0:2);
End;


Readln;
End.


Bài tập 3: Viết chương trình nhập vào tuổi của một người và cho biết người đó là thiếu niên,
thanh niên, trung niên hay lão niên. Biết rằng: nếu tuổi nhỏ hơn 18 là thiếu niên, từ 18 đến 39 là
thanh niên, từ 40 đến 60 là trung niên và lớn hơn 60 là lão niên.



<b>Program bai3;</b>
Uses crt;


Var tuoi:Byte;
Begin


Write(Nhap vao tuoi cua mot nguoi:'); Readln(tuoi);
Case tuoi Of


1..17: Writeln(Nguoi nay la thieu nien');


18..39: Writeln(Nguoi nay la thanh nien');
40..60: Writeln(Nguoi nay la trung nien');
Else Writeln(Nguoi nay la lao nien');
End;


Readln;
<b>End.</b>


<b>4. CỦNG CỐ</b>


Hãy nêu sự giống nhau và khác nhau của hai dạng lệnh lặp Repeat...Until và While....do
<b>5. HƯỚNG DẪN, DẶN DÒ</b>


Bài tập về nhà


Bài tập 1: Viết chương trình tính tổng S = 1+2+...+N.


Bài tập 2: Viết chương trình nhập vào N số nguyên từ bàn phím. Hãy tính và in ra màn hình tổng
của các số vừa được nhập vào.



<i><b>Ý tưởng:</b></i>


Bài tập 3: Viết chương trình tính số Pi với độ chính xác Epsilon, biết:
Pi/4 = 1-1/3+1/5-1/7+...


<i><b>Ý tưởng:</b></i>


Ta thấy rằng, mẫu số là các số lẻ có qui luật: 2*i+1 với i=1,...,n. Do đó ta dùng i làm biến
chạy.


Vì tính số Pi với độ chính xác Epsilon nên khơng biết trước được cụ thể số lần lặp, do đó
ta phải dùng vịng lặp WHILE hoặc REPEAT. Có nghĩa là phải lặp cho tới khi t=4/(2*i+1) 
Epsilon thì dừng.


Dùng phương pháp cộng dồn. Cho vòng lặp FOR chạy từ 1 tới N, ứng với lần lặp thứ i, ta
nhập vào số nguyên X và đồng thời cộng dồn X vào biến S.


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

<i><b>Tuần:</b></i>


<i><b> Ngày soạn: 28/09/2015</b></i>
<b> Tiết 4 - 5 – 6: THỰC HÀNH CÂU LỆNH CÓ CẤU TRÚC</b>


<b>A.MỤC TIÊU</b>


<b>1.Kiến thức: Học sinh biết vận dụng các câu lệnh có cấu trúc trong khi giải bài tập</b>
<b>2.Kỹ năng: Rèn kỹ năng vận dụng câu lệnh có cấu trúc vào giải các bài tốn</b>


<b>3.Thái độ: Học sinh tích cực trong thực hành, linh họat khi vận dụng vào thực tế</b>
<b>B. PHƯƠNG PHÁP</b>



Thực hành


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
Gv: Bài tập thực hành


Hs: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
1. Ổn định: Sĩ số


2. Kiểm tra bài cũ: Kiểm tra việc nắm các câu lệnh
3. Bài mới


Bài tập 1: Viết chương trình tính tổng S = 1+2+...+N.


<i><b>Hướng dẫn: Cho giá trị S ban đầu băng 0, biếm đếm I chạy từ 1 đến n và thực hiên phép công</b></i>
dồn I vào biến S rồi in ra giá trị tỏng S.


<i><b>Cách 1: Dùng vòng lặp FOR.</b></i>
Program TinhTong;


Uses crt;


Var N,i,S:integer;
Begin


Clrscr;


Write('Nhap vao gia tri cua N :'); Readln(N);
S:=0;



For i:=1 to N do S:=S+i;
Writeln('Ket qua la :',S);
Readln;


End.


<i><b>Cách 2: Dùng vòng lặp REPEAT.</b></i>
Program TinhTong;


Uses crt;


Var N,i,S:integer;
Begin


Clrscr;


Write('Nhap vao gia tri cua N :'); Readln(N);
S:=0; i:=1;


Repeat


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

Writeln('Ket qua la :',S);
Readln;


End.


<i><b>Cách 3: Dùng vòng lặp WHILE.</b></i>
Program TinhTong;



Uses crt;


Var N,i,S:integer;
Begin


Clrscr;


Write('Nhap vao gia tri cua N :'); Readln(N);
S:=0; i:=1;


While i<=N Do
Begin


S:=S+i;
i:=i+1;
End;


Writeln('Ket qua la :',S);
Readln;


End.


<b>Bài tập 2: Viết chương trình nhập vào N số nguyên từ bàn phím. Hãy tính và in ra màn hình tổng</b>
của các số vừa được nhập vào.


<i><b>Ý tưởng:</b></i>


Dùng phương pháp cộng dồn. Cho vòng lặp FOR chạy từ 1 tới N, ứng với lần lặp thứ i, ta
nhập vào số nguyên X và đồng thời cộng dồn X vào biến S.



Program Tong;
Uses crt;


Var N,S,i,X : Integer;
Begin


Clrscr; S:=0;
For i:=1 To n Do


Begin


Write('Nhap so nguyen X= '); Readln(X);
S:=S+X;


End;


Writeln(‘Tong cac so duoc nhap vao la: ‘,S);
Readln;


End.


<b>Bài tập 3: Viết chương trình nhập vào các số nguyên cho đến khi nào gặp số 0 thì kết thúc. Hãy</b>
đếm xem có bao nhiêu số chẵn vừa được nhập vào.


<i><b>Ý tưởng:</b></i>


Bài tốn này khơng biết chính xác số lần lặp nên ta khơng thể dùng vịng lặp FOR. Vì phải
nhập vào số ngun N trước, sau đó mới kiểm tra xem N=0? Do đó ta nên dùng vòng lặp
REPEAT.



</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

Uses crt;


Var N,dem : Integer;
Begin


Clrscr; dem:=0;
Repeat


Write('Nhap vao mot so nguyen N= '); Readln(N);
If N MOD 2 = 0 Then dem:=dem+1;


Until N=0;


Writeln(‘Cac so chan duoc nhap vao la: ‘,dem);
Readln;


End.


<b>Bài tập 4: Viết chương trình tính số Pi với độ chính xác Epsilon, biết: </b>
Pi/4 = 1-1/3+1/5-1/7+...


<i><b>Ý tưởng:</b></i>


Ta thấy rằng, mẫu số là các số lẻ có qui luật: 2*i+1 với i=1,...,n. Do đó ta dùng i làm biến
chạy.


Vì tính số Pi với độ chính xác Epsilon nên khơng biết trước được cụ thể số lần lặp, do đó
ta phải dùng vịng lặp WHILE hoặc REPEAT. Có nghĩa là phải lặp cho tới khi t=4/(2*i+1) 
Epsilon thì dừng.



Uses Crt;


Const Epsilon=1E-4;
Var Pi,t:real;


i,s:Integer;
Begin


Pi:=4; i:=1; s:=-1;
t:=4/(2*i+1);


While t>Epsilon Do
Begin


Pi:=Pi+s*t;
s:=-s; i:=i+1;
t:=4/(2*i+1);
End;


Writeln('So Pi = ',Pi:0:4);
Readln;


End.


<b>Bài tập 5:</b> Viết chương trình nhập vào số nguyên N. In ra màn hình tất cả các ước số của N.
<i><b>Ý tưởng:</b></i>


Cho biến i chạy từ 1 tới N. Nếu N MOD i=0 thì viết i ra màn hình.
Uses Crt;



Var N,i : Integer;
Begin


Clrscr;


Write('Nhap so nguyen N= '); Readln(N);
For i:=1 To N Do


If N MOD i=0 ThenWrite(i:5);
Readln;


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

<b>4.CÚNG CỐ: Nhận xét giờ thực hành</b>
<b>5. HƯỚNG DẪN VỀ NHÀ</b>


<b>Bài tập1:</b> Viết chương trình tìm USCLN và BSCNN của 2 số a, b được nhập vào từ bàn phím.
<i><b>Ý tưởng:</b></i>


- Tìm USCLN: Lấy số lớn trừ số nhỏ cho đến khi a=b thì dừng. Lúc đó: USCLN=a.
- BSCNN(a,b) = a*b DIV USCLN(a,b).


<b>Bài tập 2: Viết chương trình tìm các số có 3 chữ số </b> abc sao cho: abc = a3<sub> + b</sub>3<sub> + c</sub>3<sub>.</sub>


<i><b>Ý tưởng:</b></i>


Dùng phương pháp vét cạn. Ta biết rằng: a có thể có giá trị từ 19 (vì a là số hàng trăm),
b,c có thể có giá trị từ 09. Ta sẽ dùng 3 vòng lặp FOR lồng nhau để duyệt qua tất cả các trường
hợp của a,b,c.


Ứng với mỗi bộ abc, ta sẽ kiểm tra: Nếu 100.a + 10.b + c = a3<sub> + b</sub>3<sub> + c</sub>3<sub> thì in ra bộ abc đó. </sub>



*********************************************************
<i><b>Tuần:</b></i>


<i><b> Ngày soạn: 4/10/2015</b></i>
<b>Tiết 7 - 8 – 9: CÁC CÂU LỆNH CÓ CẤU TRÚC (Tiếp theo)</b>


<b>A.MỤC TIÊU</b>


<b>1.Kiến thức: Học sinh nắm được các lệnh có cấu trúc, làm được các bài tập sữ dụng các lệnh có</b>
cấu trúc


<b>2.Kỹ năng: Rèn kỹ năng viết câu lệnh chính xác, kỹ năng vận dụng các câu lệnh vào từng bài</b>
tốn cụ thể


<b>3.Thái độ: Học sinh tích cực chính xác khi viết các câu lệnh, biết vận dụng vào các bài toán thực</b>
tế


<b>B. PHƯƠNG PHÁP</b>
Nêu vấn đề, gợi mở


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
Gv: Giáo án, phấn màu viết sơ đồ
Hs: Ôn tập các câu lệnh cơ bản
<b>D. TIẾN TRÌNH LÊN LỚP</b>
1. Ổn định: Sĩ số


2. Kiểm tra bài cũ: Kiểm tra việc nắm các câu lệnh
3. Bài mới


<b>Bài tập 1:</b> Viết chương trình tìm USCLN và BSCNN của 2 số a, b được nhập vào từ bàn phím.


<i><b>Ý tưởng:</b></i>


- Tìm USCLN: Lấy số lớn trừ số nhỏ cho đến khi a=b thì dừng. Lúc đó: USCLN=a.
- BSCNN(a,b) = a*b DIV USCLN(a,b).


Uses crt;


Var a,b,aa,bb:integer;
Begin


Write('Nhap a : '); Readln(a);
Write('Nhap b : '); Readln(b);
aa:=a; bb:=b;


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

Begin


If aa>bb Then aa:=aa-bb Else bb:=bb-aa;
End;


Writeln('USCLN= ',aa);


Writeln('BSCNN= ',a*b DIV aa);
Readln;


End.


<b>Bài tập 2: Viết chương trình tìm các số có 3 chữ số </b> abc sao cho: abc = a3<sub> + b</sub>3<sub> + c</sub>3<sub>.</sub>


<i><b>Ý tưởng:</b></i>



Dùng phương pháp vét cạn. Ta biết rằng: a có thể có giá trị từ 19 (vì a là số hàng trăm),
b,c có thể có giá trị từ 09. Ta sẽ dùng 3 vòng lặp FOR lồng nhau để duyệt qua tất cả các trường
hợp của a,b,c.


Ứng với mỗi bộ abc, ta sẽ kiểm tra: Nếu 100.a + 10.b + c = a3<sub> + b</sub>3<sub> + c</sub>3<sub> thì in ra bộ abc đó. </sub>


Uses crt;


Var a,b,c : Word;
Begin


For a:=1 To 9 Do


For b:=0 To 9 Do


For c:=0 To 9 Do


If (100*a + 10*b + c)=(a*a*a + b*b*b + c*c*c) Then Writeln(a,b,c);
Readln;


End.


<b>Bài tập 3: Viết chương trình nhập vào số tự nhiên N rồi thơng báo lên màn hình số đó có phải là</b>
số ngun tố hay không.


<i><b>Ý tưởng:</b></i>


N là số nguyên tố nếu N khơng có ước số nào từ 2  N div 2. Từ định nghĩa này ta đưa ra
giải thuật:



- Đếm số ước số của N từ 2  N div 2 lưu vào biến d.
- Nếu d=0 thì N là số nguyên tố.


Uses crt;


Var N,i,d : Word;
Begin


If N<2 Then Writeln(N,’ khong phai la so nguyen to’)
Else


Begin


{Đếm số ước số}
d:=0;


For i:=2 To N div 2 Do


If N MOD i=0 Thend:=d+1;
{Kiểm tra}


If d=0 Then Writeln(N,’ la so nguyen to’)
Else Writeln(N,’ khong phai la so nguyen to’);
End;


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

End.


<b>Bài tập 4: Viết chương trình giải phương trình bậc hai: ax</b>2<sub> + bx + c = 0, a0.</sub>


<i><b>Gợi ý:</b></i>



- Tính Delta=b*b-4*a*c.
- Biện luận:


Delta<0: Phương trình vơ nghiệm.


Delta=0: Phương trình có nghiệm kép: x = -b/(2*a).


Delta>0: Phương trình có 2 nghiệm phân biệt: x1,2 = (-bSQRT(Delta))/(2*a).


<b>4.CỦNG CỐ:</b>


Khi nào thì ta sữ dụng câu lệnh lặp While ...do


cần lưu ý trước else khơng có dấu ; cần chú ý khi khia báo kiểu dữ liệu
<b>5. HƯỚNG DẪN, DẶN DỊ</b>


Bài tập 1: Viết chương trình nhập vào ngày, tháng, năm. Máy sẽ hiện lên ngày, tháng, năm hôm
sau.


<i><b>Gợi ý:</b></i>


Biện luận theo tháng. Gom tháng thành 3 nhóm: tháng có 31 ngày (1,3,5,7,8,10,12), tháng
có 30 ngày (4,6,9,11) và tháng 2 (có 28 hoặc 29 ngày tùy theo năm nhuận).


Dùng lệnh lựa chọn:
CASE thang OF
1,3,5,7,8,10,12: ...
4,6,9,11: ...
2: ...


END;


Bài tập 2: Viết chương trình in ra màn hình các giá trị của bảng mã ASCII từ 0255.
<i><b>Gợi ý:</b></i>


Cho biến i chạy từ 0  255. In ra màn hình i và CHR(i).


***************************************************
<i><b>Tuần:</b></i>


<i><b> </b></i> <i><b> Ngày soạn:11/10/2015</b></i>
<b>Tiết 10 - 11 – 12: THỰC HÀNH (Tiếp theo)</b>


<b>A.MỤC TIÊU</b>


<b>1.Kiến thức: Học sinh vận dụng các câu lệnh có cấu trúc trong giải bài tập</b>
<b>2.Kỹ năng: Rèn kỹ năng vận dụng câu lệnh có cấu trúc vào giải các bài tốn</b>
<b>3.Thái độ: Học sinh tích cực trong thực hành, linh họat khi vận dụng vào thự tế</b>
<b>B. PHƯƠNG PHÁP</b>


Thực hành


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
Gv: Bài tập thực hành


Hs: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
1. Ổn định: Sĩ số


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

<b>Bài tập 1: Viết chương trình nhập vào từ bàn phím: giờ, phút, giây. Cọng thêm một số giây cũng</b>


được nhập từ bàn phím. Hãy in ra kết quả sau khi cọng xong.


<i><b>Gợi ý:</b></i>


- Gọi số giây được cộng thêm là: ss. Gán giây:=giây+ss.


- Nếu giây60 thì: phút:=phút + giây DIV 60 và giây:=giây MOD 60.
- Nếu phút60 thì: giờ:=giờ + phút DIV 60 và phút:=phút MOD 60.
<b>Bài tập 2: Viết chương trình tìm Max, Min của 4 số: a, b, c, d.</b>


<b>Bài tập 3: Viết chương trình in ra màn hình các số nguyên từ 1 đến 100 sao cho cứ 10 số thì</b>
xuống dịng.


<i><b>Gợi ý:</b></i>


Cho biến i chạy từ 1  100. In ra màn hình i và kiểm tra: nếu i MOD 10=0 thì WRITELN.
<b>Bài tập 4: Viết chương trình in ra màn hình bảng cữu chương.</b>


<i><b>Gợi ý:</b></i>


Dùng 2 vòng lặp FOR lồng nhau: i là số bảng cữu chương (2...9), j là số thứ tự trong từng
bảng cữu chương (1...10).


For i:=2 To 9 Do


For j:=1 To 10 Do Writeln(i,’x’,j,’=’,i*j);
Bài tập 5: Viết chương trình để tìm lời giải cho bài toán sau:


Trong giỏ vừa thỏ vừa gà,
Một trăm cái cẳng bốn ba cái đầu.



Hỏi có mấy gà mấy thỏ?


Bài tập 6: Viết chương trình để tìm lời giải cho bài tốn sau:
Trăm trâu trăm bó cỏ


Bó lại cho tròn
Trâu đứng ăn năm
Trâu nằm ăn ba


Năm trâu nghé ăn một.


Hỏi có bao nhiêu trâu đứng, trâu nằm, trâu nghé?


Bài tập 7: Viết chương trình nhập vào các số nguyên từ bàn phím cho đến khi nào gặp số ngun
tố thì kết thúc nhập. Tính tổng các số chẵn và trung bình cọng các số lẻ.


<i><b>Gợi ý:</b></i>


Dùng vịng lặp REPEAT ... UNTIL NTo; để nhập. Trong đó, NTo là biến kiểu Boolean để
kiểm tra số được nhập vào có phải là số ngun tố hay khơng.


Bài tập 8: Viết chương trình nhập vào một số nguyên dương. Hãy thơng báo lên màn hình số đó
có bao nhiêu chữ số và tổng các chữ số của số đó.


<i><b>Gợi ý:</b></i>


Dùng vịng lặp WHILE. Trong khi N>0 thì: lấy ra chữ số cuối cùng của N để tính bằng
phép tốn MOD 10, sau đó bỏ bớt đi chữ số cuối cùng của N bằng phép toán DIV 10.



<b>4. CỦNG CỐ:</b>


Nhận xét giờ thực hành
<b>5. HƯỚNG DẪN, DẶN DÒ</b>


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

Bài tập 10: Viết chương trình phân tích một số ra thừa số nguyên tố. Ví dụ: N=100 sẽ in ra màn
hình:


100 | 2
50 | 2
25 | 5
5 | 5
1 |


Bài tập 11: Số hồn thiện là số tự nhiên có tổng các ước của nó (khơng kể chính nó) bằng chính
nó. Viết chương trình kiểm tra xem một số được nhập vào từ bàn phím có phải là số hồn thiện
hay khơng? Ví dụ: 6, 28 là các số hồn thiện.


<i><b>Gợi ý:</b></i>


- Tính tổng các ước số của N: từ 1  N div 2 lưu vào biến S.
- Nếu S=N thì N là số hồn thiện.


<b>***************************************************</b>
<i><b>Tuần:</b></i>


<i><b> Ngày soạn:</b></i> <i><b>19/10/2015</b></i>
<b>Tiết 13 - 14 – 15: THỰC HÀNH ( Tiếp theo)</b>


<b>A.MỤC TIÊU</b>



<b>1.Kiến thức: Học sinh biết vận dụng các câu lệnh có cấu trúc trong khi giải bài tập</b>


<b>2.Kỹ năng: Rèn kỹ năng vận dụng câu lệnh có cấu trúc For…do, While..do và If ..then vào giải</b>
các bài toán


<b>3.Thái độ: Học sinh tích cực trong thực hành, linh họat khi vận dụng vào thực tế</b>
<b>B. PHƯƠNG PHÁP</b>


Thực hành


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
Gv: Bài tập thực hành


Hs: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
1. Ổn định: Sĩ số


2. Kiểm tra bài cũ: Kiểm tra việc nắm các câu lệnh
3. Bài mới


<b>Bài tập 1: nhap 2 so x,y từ bàn phím. In ra man hinh tat ca cac so chan chia het cho 3 tu x toi y. Đếm</b>
cac so chan chia het cho 3 tu x toi y.


<b>Hướng dẫn : - Cho biến đếm chạy từ x đến y</b>


- Nếu có số I nào chia hết cho 6 thì in ra màn hinh các só I đó
- Dùng biến d để đếm các số chăn chia hết cho 3


<b>Chương trình:</b>


var x,y,i,dem:integer;
begin


write('nhap 2 so duong x,y (x<y):'); readln(x,y);
for i:=x to y do


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

writeln('co ',dem,' so chan chia het cho 3 tu x toi y, do la:');
for i:= x to y do


if i mod 6=0 then write(i,',');
readln


end.


<b>Bài tập 2: Viết chương trình để tìm lời giải cho bài tốn sau: </b>
Trăm trâu trăm bó cỏ


Bó lại cho trịn
Trâu đứng ăn năm
Trâu nằm ăn ba


Năm trâu nghé ăn một.


Hỏi có bao nhiêu trâu đứng, trâu nằm, trâu nghé?
<b>Chương trình:</b>


var d,n,g:integer;
begin


for d:=1 to 20 do


for n:=1 to 33 do
for g:=1 to 98 do
if d*5+n*3+g=100


then writeln('Trau dung:',d,' trau nam:',n,' trau gia:',g);
readln;


end.


<b>Bài tập 3. </b>


Viết chương trình nhập 2 số tự nhiên x, y từ bàn phím, in ra màn hình:
a) Tất cả các ước chung lớn hơn 0 của x và y


b) Tổng các bình phương của các ước chung đó.
c) BCNN của x và y.


<b>Hướng dẫn :</b>


-cho i chạy từ x đến y, nếu có số x và số y cùng chia hết cho số i thì I là ước chung cua
x va y,


-dùng biến S để lưu các giá trị cộng dồn của i*i vào để tính tổng bình phương.


- trong khi có số a nào khơng chia hết cho x và y thì tăng a lên. A là BCNN của x và y.
<b>Chương trình:</b>


var a,x,y,i,s:integer;
begin



write('nhap vao x y:');readln(x,y);
s:=0; a:=1;


write('cac uoc so la: ') ;
for i:=1 to x do


if (x mod i=0) and (y mod i = 0) then
begin


write(i,' '); s:=s+ i*i;
end;


writeln;


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

while (a mod x<>0) or (a mod y<> 0) do
a:=a+1;


writeln('BCNN: ',a);
readln


<b>Bài tập 4 </b>


Viết chương trình nhập từ bàn phím hai số nguyên dương a, b từ bàn phím, in ra màn hình rút
gọn đến tối giản cho phân số a / b.


Hướng dẫn :


<b>-</b> Nhập vào tử t và mẫu m của phân số, gán <b>a:=t;b:=m;</b>


<b>-</b> Dùng vòng lặp repeat.. until để tìm UCLN của hai số t và m.


<b>-</b> Chia a/b cho UCLN đó.


<b>Chương trình:</b>


var t,m,i,a,b,u: integer;
begin


writeln('nhap tu va mau:');
write('tu ='); readln(t);
write('mau='); readln(m);
a:=t;b:=m;


repeat


if t>m then t:=t-m;
if m>t then m:=m-t;
until m=t ;


writeln('phan so toi gian la: ',trunc(a/m),'/',trunc(b/m));
readln


end.


<b>Bài tập 5. Nhập 2 số ngun x và n bất kỳ. Viết chương trình tính giá trị của x lũy thừa n.</b>


<b>Hướng dẫn : Nhập vào số x và n, gán I bằng 1 và biến gt bằng 1. Nhân dồn số x vào biến gt và</b>
dung vòng lặp While do để tăng biếm đếm i.


<b>Chương trình:</b>
var a,i :integer;


n,gt: real;
begin


write('nhap x va n: ');readln(x,n);
i:=1;


gt:=1;


while i<=n do
begin


gt:=gt*x;
i:=i+1;
end;


writeln('',a,' luy thua ',n:4:0,' bang: ',gt:4:0);
readln


end.


<b>4. CỦNG CỐ:</b>


</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

Bài tập 6 Viết chương trình nhập số ngun n từ bàn phím (n < 100), in ra màn hình tổng các ước
số và số lượng ước của n.


Bài tập 7


Bạn Tý có T đồng đem gởi ngân hàng với lãi suất hằng tháng là L %. Sau mỗi tháng tiền lãi được
nhập vào để tính lãi suất tháng sau. Hỏi sau N tháng, số tiền của bạn Tý sẽ được tăng lên bao
nhiêu đồng?



Hãy viết chương trình để giải bài toán trên, với T, L, N là các số nhập từ bàn phím.
<i><b> ***************************************************</b></i>


<i><b>Tuần:</b></i>


<i><b>Ngày soạn: 26/10/2015</b></i>
<b>Tiết 16 - 17 – 18 : THỰC HÀNH ( Tiếp theo)</b>


<b>A.MỤC TIÊU</b>


<b>1.Kiến thức: Học sinh biết vận dụng các câu lệnh có cấu trúc trong khi giải bài tập</b>


<b>2.Kỹ năng: Rèn kỹ năng vận dụng câu lệnh có cấu trúc For…do, While..do và If ..then vào giải</b>
các bài toán


<b>3.Thái độ: Học sinh tích cực trong thực hành, linh họat khi vận dụng vào thực tế</b>
<b>B. PHƯƠNG PHÁP</b>


Thực hành


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
Gv: Bài tập thực hành


Hs: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
1. Ổn định: Sĩ số


2. Kiểm tra bài cũ: Kiểm tra việc nắm các câu lệnh
3. Bài mới



<b>Bài tập 1:</b>


Viết chương trình in ra các số lẻ nhỏ hơn hoặc bằng n ( Với n được nhập).
<i><b>a. Hướng dẫn: </b></i>


- Sử dụng kiến thức số lẻ đầu tiên bằng 1. Số lẻ sau bằng số trước cộng với 2.
- Cho biến i có giá trị ban đầu bằng 1.


- Dùng vòng lặp while do với điều kiện i < n và công việc bên trong là in i và tăng i lên 2.
<i><b>b. Mã chương trình:</b></i>


Program In_So_Le;
uses crt;


var i,n:integer;
begin


clrscr;


write('Nhap so n: ');readln(n);
i:=1;


while i<=n do
begin


write(i:3,', ');
i:=i+2;


end;


readln


end.


<b>Nhận xét: </b>


</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

- Trong vòng lặp while nhất thiết phải có một câu lệnh làm thay đổi điều kiện lặp. Ở đây là
i:=i+2. Nếu khơng có sẽ dẫn đến trường hợp lặp vơ hạn. Chương trình chạy mãi mà khơng có lối
ra (Khơng thốt ra khỏi vịng lặp được).


<b>Bài tập 2:</b>


Viết chương trình tính n! với n! được định nghĩa như sau:
- n! = 1 với n = 0


- n! = 1.2.3...n (Tích của n số từ 1 đến n).


Yêu cầu: Sử dụng vòng lặp với số lần chưa biết trước:
a. Hướng dẫn:


- Có thể viết lại: n! = n.(n-1)... 3.2.1.
- Lặp gt = gt*n; n = n-1 với điều kiện n>0.
b. Mã chương trình:


Program Giai_Thua_while;
uses crt;


var n, gt:longint;
begin



clrscr;


write('Nhap n: ');readln(n);
gt:=1;


while n>0 do
begin


gt:=gt*n;
n:=n-1;
end;


writeln('Giai thua cua n la: ',gt);
readln


end.


<i><b>c. Nhận xét: Tiết kiệm được một biến i để chạy nhưng làm thay đổi n nên khi xuất ra chỉ có thể </b></i>
xuất một câu chung chung “Giai thua cua n la:”


<b>Bài tập 3:</b>


Viết chương trình tính n! với n! được định nghĩa như sau:
- n!! = 1 với n = 0


- n!! = 1.3.5..n với n lẻ.
- n!! = 2.4.6..n với n chẵn.


Yêu cầu: Sử dụng vòng lặp với số lần chưa biết trước:
a. Hướng dẫn:



- Hai số chẵn liên tiếp hơn kém nhau 2. Hai số lẻ liên tiếp cũng vậy.
- Thực hiện tính như giai thừa đơn nhưng với bước nhảy là 2.


b. Mã chương trình:
Program Giai_thua_kep;
uses crt;


var n,gt:longint;
begin


write('Nhap n: ');readln(n);
gt:=1;


while n>0 do
begin


gt:=gt*n;
n:=n-2;
end;


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

end.


<i><b>c. Nhận xét:</b></i>


- Với thuật toán trên ta không cần xét n là chẵn hay lẻ.
<b>Bài tập 4:</b>


Viết chương trình để tìm các số nguyên tố trong khoang từ x đến y. X, y là số nhâp từ bàn
phím.



<b>a. Hướng dẫn:</b>
<b>b. Mã chương trình:</b>


var d,x,y,i,j:integer; nt:boolean;


begin



write('nhap x y:');readln(x,y);


d:=0;



for i:=x to y do


begin



if i>1 then nt:=true


else nt:=false;


if x>2 then


for j:=2 to i-1 do



if i mod j =0 then nt:=false;



if nt then begin writeln(i); d:=d+1; end;


end;



readln


end.


<b>Bài tập 5</b>


Viết chương trình tìm ước chung lớn nhất (UCLN) của hai số với yêu cầu sử dụng thuật
toán Euclid.



Thuật toán Euclid: Nếu a chia hết cho b (a chia b dư 0) thì UCLN(a,b) bằng b
Nếu a chia b dư r thì UCLN(a,b) = UCLN(b,r)


<i><b>a.Hướng dẫn:</b></i>


- Nhập a, b và gán r = a mod b.


- Lặp với điều kiện r <> 0: b = r, a = b, r = a mod b.
<i><b>b.Mã chương trình:</b></i>


Program UCLN;
uses crt;


var a,b,r:byte;
begin


clrscr;


writeln('CHUONG TRINH TIM UCLN CUA HAI SO');
write('Nhap a: ');readln(a);


write('Nhap b: ');readln(b);
r:=a mod b;


while r<> 0 do
begin


b:=r;
a:=b;



r:=a mod b;
end;


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

end.
<b>Bài tập 6</b>


Dãy Fibonacy có hai phần tử đầu là 1, 1. Các phần tử sau bằng tổng hai phần tử đứng ngay
trước nó: 1, 1, 2, 3, 5, 8, 13, 21, ...


Viết chương trình in ra dãy Fibonacy có phần tử lớn nhất nhỏ hơn n?
<i><b>a.Hướng dẫn:</b></i>


- Cần hai biến F_1 và F có giá trị đầu là 1, 1.
- Thực hiện lặp cho đến khi F >= n.


- Do yêu cầu chỉ in các số bé hơn n nên khi in cần thêm một lệnh kiểm tra.
<i><b>b.Mã chương trình:</b></i>


Program Fi_Bo_na_xi;
Var n, F_2,F_1, F: Longint;
Begin


Write('Nhap n: ');Readln(n);
F_1:=1; F_2:=1;


Write(F_2,';',F_1,';');
Repeat


F:=F_2+F_1;



if F< n then Write(F,';');
F_2:=F_1; F_1:=F;
Until F>n;


Readln;
End.


<i><b>Nhận xét: Giữa Repeat ... until có thể chứa nhiều lệnh mà không cần ghép.</b></i>


Hãy phát triển bài tập theo hướng chỉ in một phần tử trong dãy lớn nhất nhưng bé hơn n hoặc theo
hướng phần tử thứ k của dãy.


<b>4. CỦNG CỐ:</b>


Nhận xét giờ thực hành
<b>5. HƯỚNG DẪN, DẶN DỊ</b>


Bài tập<b> 7. </b>Viết chương trình tính tổng các số chẵn từ m đến n với m, n là 2 số nguyên bất kỳ nhập
từ bàn phím.


Bài tập 8 Viết chương trình nhập vào một số tự nhiên n (n > 5) từ bàn phím:
a. In ra màn hình các số nguyên tố nhỏ hơn n.


b. Phân tích n thành tổng 3 số nguyên tố.


************** *************************************
<i><b>Tuần:</b></i>


<i><b> Ngày soạn:02/11/2015</b></i>
<b>Tiết 19 - 20 – 21: CHƯƠNG TRÌNH CON: THỦ TỤC VÀ HÀM </b>


<b>A.MỤC TIÊU</b>


<b>1.Kiến thức: Học sinh nắm được khái niệm chương trình con, biết được cách vận dụng chương</b>
trình con


<b>2.Kỹ năng: Rèn kỹ năng viết các bài tốn sữ dụng chương trình con</b>
<b>3.Thái độ: Hoc sinh thấy được sự cần thiết phải viết chương trình con</b>
<b>B. PHƯƠNG PHÁP</b>


Nêu vấn đề, gợi mở, vấn đáp


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

<b>D. TIẾN TRÌNH LÊN LỚP</b>
1. Ổn định: Sĩ số


2. Kiểm tra bài cũ: Kiểm tra việc nắm các câu lệnh
3. Bài mới


<b>I. KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON</b>


Chương trình con (CTC) là một đoạn chương trình thực hiện trọn vẹn hay một chức năng
nào đó. Trong Turbo Pascal, có 2 dạng CTC:


 Thủ tục (PROCEDURE): Dùng để thực hiện một hay nhiều nhiệm vụ nào đó.


 Hàm (FUNCTION): Trả về một giá trị nào đó (có kiểu vơ hướng, kiểu string hoặc kiểu
con trỏ). Hàm có thể sử dụng trong các biểu thức.


Ngồi ra, trong Pascal cịn cho phép các CTC lồng vào nhau.


<b>II. CẤU TRÚC CHUNG CỦA MỘT CHƯƠNG TRÌNH CĨ SỬ DỤNG CTC</b>


PROGRAM Tên_chương_trình;


USES CRT;
CONST ...;
TYPE ...;
VAR ...;


PROCEDURE THUTUC[(Các tham số)];
[Khai báo Const, Type, Var]


BEGIN


...
END;


FUNCTION HAM[(Các tham số)]:<Kiểu dữ liệu>;
[Khai báo Const, Type, Var]


BEGIN


...


HAM:=<Giá trị>;
END;


BEGIN {Chương trình chính}
...


THUTUC[(...)];
...


A:= HAM[(...)];
...
END.


<i><b>Chú ý: Trong quá trình xây dựng CTC, khi nào thì nên dùng thủ tục/hàm?</b></i>


<b>Dùng hàm</b> <b>Dùng thủ tục</b>


- Kết quả của bài toán trả về 1 giá trị duy
<i><b>nhất (kiểu vô hướng, kiểu string hoặc</b></i>
<i><b>kiểu con trỏ).</b></i>


- Lời gọi CTC cần nằm trong các biểu
thức tính tốn.


- Kết quả của bài tốn khơng trả về giá trị
<i><b>nào hoặc trả về nhiều giá trị hoặc trả về</b></i>
<i><b>kiểu dữ liệu có cấu trúc (Array, Record,</b></i>
<i><b>File).</b></i>


- Lời gọi CTC không nằm trong các biểu
thức tính tốn.


Ví dụ 1: Viết CTC để tính n! = 1.2...n.


<i><b>Ý tưởng: Vì bài tốn này trả về 1 giá trị duy nhất nên ta dùng hàm.</b></i>
Function GiaiThua(n:Word):Word;


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

Begin
P:=1;



For i:=1 To n Do P:=P*i;
GiaiThua:=P;


End;


<i><b>CHÚ Ý: Trong 2 ví dụ trên:</b></i>


 <b>n, x, y được gọi là tham trị (khơng có từ khóa var đứng trước) vì sau khi ra khỏi CTC giá</b>
trị của nó khơng bị thay đổi.


 <b>xx, yy được gọi là tham biến (có từ khóa var đứng trước) vì sau khi ra khỏi CTC giá trị</b>
của nó bị thay đổi.


<b>III. BIẾN TỒN CỤC VÀ BIẾN ĐỊA PHƯƠNG</b>


 <b>Biến toàn cục: là các biến được khai báo trong chương trình chính. Các biến này có tác</b>
dụng ở mọi nơi trong tồn bộ chương trình.


 <b>Biến địa phương: là các biến được khai báo trong các CTC. Các biến này chỉ có tác dụng</b>
trong phạm vi CTC đó mà thơi.


Chú ý: Trong một CTC, nếu biến tồn cục trùng tên với biến địa phương thì biến địa phương
được ưu tiên hơn.


Ví dụ:1


Program KhaoSatBien;


Var a,b: Integer; {biến toàn cục}


Procedure ThuBien;


Var a: Integer; {biến địa phương}
Begin


a:=10;


Writeln(‘A=’,a,’B=’,b);
End;


Begin


a:=50;
b:=200;


ThuBien; {A=10 B=200}


Writeln(‘A=’,a,’B=’,b); {A=50 B=200}
End.


Bài tập 2: Viết hàm LOWCASE( c:char):char; để đổi chữ cái hoa c thành chữ thường.
<i><b>Ý tưởng:</b></i>


Trong bảng mã ASCII, số thứ tự của chữ cái hoa nhỏ hơn số thứ tự của chữ cái thường là
32. Vì vậy ta có thể dùng 2 hàm CHR và ORD để chuyển đổi.


Uses crt;
Var ch:Char;


Function LOWCASE(c:Char):Char;


Begin


If c IN [‘A’..’Z’] Then LOWCASE:=CHR(ORD(c)+32)
Else LOWCASE:=c;


End;
Begin


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

Readln;
End.


Bài tập 3: Viết thủ tục để hoán đổi hai gía trị x,y cho nhau.
Var a,b:Real;


Function Swap(Var x,y:Real);
Var Tam:Real;


Begin


Tam:=x; x:=y; y:=Tam;
End;


Begin


Write(‘Nhap a=’); Readln(a);
Write(‘Nhap b=’); Readln(b);
Swap(a,b);


Writeln(‘Cac so sau khi hoan doi: a=‘, a:0:2,’ b=’,b:0:2);
Readln;



End.


<b>4.CŨNG CỐ:</b>


Chương trình con là gì? vì sao phải viết chương trình con. Hãy nêu sựu giống nahu và khác nhau
của hai chương trình con là Prcedure và Function


<b>5.HƯỚNG DẪN, DẶN DÒ</b>


Bài tập 1: Viết hàm XMU(x:Real;n:Byte):Real; để tính giá trị xn<sub>.</sub>


Bài tập 2: Viết thủ tục PHANTICH(n:Integer); để phân tích số nguyên n ra thừa số nguyên tố.
Bài tập 3: Viết hàm tìm BSCNN của 2 số nguyên a,b được khai báo như sau:


Function BSCNN (a,b:word ):word ;


<b>***********************************************************</b>
<i><b>Tuần:</b></i>


<i><b> </b></i> <i><b>Ngày soạn: 9/11/2015</b></i>


<b>Tiết 22 - 23 – 24: THỰC HÀNH: CHƯƠNG TRÌNH CON</b>
<b>A.MỤC TIÊU</b>


<b>1.Kiến thức: Học sinh vận dụng được cách viết chương trình con vào làm các bài tập</b>
<b>2.Kỹ năng: Rèn kỹ năng viết chương trình con</b>


<b>3.Thái độ: Hoc sinh thấy được sự cần thiết phải viết chương trình con</b>
<b>B. PHƯƠNG PHÁP</b>



Thực hành


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
Gv: Bài tập thực hành


Hs: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
1. Ổn định: Sĩ số


2. Kiểm tra bài cũ: Kiểm tra học sinh làm bài tập ở nhà
3. Bài mới


<b>Bài 1: Viết chương trình con tìm diện tích hình chữ nhật khi biết kích thước hai cạnh</b>
Program Bai1;


</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

{...}


procedure tinhdientich(a,b:real;var S:real);
Begin


S:= a*b;
end;


{...}


Write(‘ Nhap vao kich thuoc hinh chu nhat ‘);
Readln(dai,rong);


Tinhdientich(dai,rong,dientich);



Write(‘dien ich hinh chu nhat la:’, dientich);
end.


<b>Bài 2:Nhập từ bàn phím số ngun dương N(0<N<=10000) . Viết chương trình kiểm tra xem số</b>
đó có phải là số đối gương hay không? ( số đối gương gọi là số Palindrome, đó là số mà khi viết
các chữ số của nó theo ngược lạivẫn đuwocj chính nó). Ví dụ, 12521 gọi là số đối gương.


Program Bai2;
Var x,L:longint;
ok:Boolean;


Function sochuso(a:longint):byte;
var p:byte;


begin
p:=0;


While a>0 do
Begin


a:=a div 10;
inc(P):
end;
sochuso:=p;
end;


Function DG(a:longint;L:byte):boolean;
var i,j:byte;



m;array[1..10] 0f byte;
begin


For i:=L downto 1 do
Begin


m[i]:=a mod 10;
a:=a div 10;
end;


i:=1;
j:=L;
DG:=false;
While i<j do
Begin


</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>

dec(j);
end;


DG:=true;
end;


BEGIN


write(‘ nhap so x =’);
readln(x);


L:=sochuso(x);
ok:=DG(x,L);



if ok then write(x, ‘ doi guong’)
else write(x, ‘ khong la doi guong’);
readln;


END.


<b>Bài 3: Viết chương trình xây dựng chương trình con tính số các ước của một số nguyên dương.</b>
Sữ dụng chương trình con này tìm những số nguyên dương không vượt quá số nguyên dương h
cho trước (h<=5000) có số lượng các ước nhiều nhất


program bai3;
cosnt h= 5000;


var x,max_sl,p:integer;


Function sl_uoc(a:integer):integer;
Var i, sl:integer;


Begin
sl:=1;


For i:=2 to a div 2 do
if a mod i= 0 then
inc(sl);


sl+uoc:=sl+1;
end;


BEGIN



max_sl:=0;
For x:= 1 to h do
Begin


p:=sl_uoc(x);


if p>max_sl then max_sl:=p;
end;


Writeln(‘ so uoc nhieu nhat la:’,max_sl);
Writeln(‘ cac so co’,Max-sl,’ uoc la:’);
If sl_uoc(x) = max_sl then write(x:8);
readln;


END.


<b>4.CŨNG CỐ</b>


</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

Bài tập 2: Lập hàm đệ qui để tính dãy Fibonaci:
F(n) =

{

<i><sub>F</sub></i> 1 <i>, n</i>=1<i>Ún</i>=2


(<i>n −</i>1)+<i>F</i>(<i>n −</i>2) <i>, n</i>>2


********************************************************
<i><b>Tuần:</b></i>


<i><b> Ngày soạn: 16/11/2015</b></i>
<b>Tiết 25 - 26 – 27: CHƯƠNG TRÌNH CON</b>
<b>A.MỤC TIÊU</b>



<b>1.Kiến thức: Học sinh nắm được chương trình con sữ dụng thuật tóan đệ quy</b>
<b>2.Kỹ năng: Rèn kỹ năng viết các bài tốn sữ dụng chương trình con đệ quy</b>
<b>3.Thái độ: Hoc sinh thấy được sự quan trọng của chương trình con đệ quy</b>
<b>B. PHƯƠNG PHÁP</b>


Nêu vấn đề, gợi mở, vấn đáp


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
Gv: Giáo án, phấn màu viết sơ đồ
Hs: Ơn tập cách viết chương trình con
<b>D. TIẾN TRÌNH LÊN LỚP</b>


1. Ổn định: Sĩ số


2. Kiểm tra bài cũ: Kiểm tra việc nắm các câu lệnh
3. Bài mới


<b>IV. ĐỆ QUI</b>


<b>4.1. Khái niệm đệ qui</b>


Trong một chương trình, một CTC có thể gọi một CTC khác vào làm việc. Nếu như CTC
đó gọi lại chính nó thì gọi là sự đệ qui.


<b>4.2. Phương pháp thiết kế giải thuật đệ qui</b>
 Tham số hóa bài tốn


 Tìm trường hợp suy biến.


 Phân tích các trường hợp chung (đưa về các bài tốn cùng loại nhưng nhỏ hơn).


Ví dụ: Viết hàm đệ qui để tính n! = 1.2...n.


 Tham số hóa: n! = Factorial(n);


 Factorial(0) = 1 (trường hợp suy biến)


 Factorial(n) = n*Factorial(n-1) (trường hợp chung)
Function Factorial(N:integer):Longint;


Begin


If N=0 Then Factorial:=1


Else Factorial:=N*factorial(N-1); { lời gọi đệ qui }
End;


<b>4.3. Giải thuật quay lui</b>
<i><b>Bài toán:</b></i>


Hãy xây dựng các bộ giá trị gồm n thành phần (x1,...,xn) từ một tập hữu hạn cho trước sao


</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

Giả sử đã xác định được k-1 phần tử đầu tiên của dãy: x1,...,xk-1. Ta cần xác định phần tử


thứ k. Phần tử này được xác định theo cách sau:


- Giả sử Tk: tập tất cả các giá trị mà phần tử xk có thể nhận được. Vì tập Tk hữu hạn nên ta


có thể đặt nk là số phần tử của Tk theo một thứ tự nào đó, tức là ta có thể thành lập một ánh xạ 1-1


từ tập Tk lên tập {1, 2, ..., nk}.



- Xét j{1, 2, ..., nk}. Ta nói rằng “j chấp nhận được” nếu ta có thể bổ sung phần tử thứ j


trong Tk với tư cách là phần tử xk vào trong dãy x1,...,xk-1 để được dãy x1,...,xk.


- Nếu k=n: Bộ (x1,...,xk) thỏa mãn yêu cầu B, do đó bộ này được thu nhận.


- Nếu k<n: Ta thực hiện tiếp quá trình trên, tức là phải bổ sung tiếp các phần tử xk+1 vào


dãy x1,...,xk.


Sau đây là thủ tục đệ qui cho giải thuật quay lui:
Procedure THU(k:Integer);


Var j:Integer;
Begin


For j:=1 To nk Do


If <j chấp nhận được> Then
Begin


<Xác định xk theo j>;


If k=n Then <Ghi nhận một bộ giá trị>
Else THU(k+1); {Quay lui}


End;
End;



Ví dụ 1: Liệt kê các dãy nhị phân có độ dài n.
Program DayNhiPhan;


Var b:Array[1..20] Of 0..1; {Dãy nhị phân có độ dài tối đa là 20}
n:Byte;


Procedure InKetQua;
Var i:Byte;


Begin


For i:=1 To n Do Write(b[i]);
Writeln;


End;


Procedure THU(k:Byte);
Var j:Byte;


Begin


For j:=0 To 1 Do {Tập giá trị của dãy nhị phân}
Begin


b[k]:= j;


If k=n Then InKetQua
Else THU(k+1); {Quay lui}
End;



End;
Begin


</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>

THU(1);
Readln;
End.


Bài tập 2: Viết hàm XMU(x:Real;n:Byte):Real; để tính giá trị xn<sub>.</sub>


Var x:Real;


n:Byte;


Function XMU(x:Real;n:Byte):Real;
Var i:Byte; S:Rea;


Begin
S:=1;


For i:=1 To n Do S:=S*x;
XMU:=S;


End;
Begin


Write(‘Nhap x=’); Readln(x);
Write(‘Nhap n=’); Readln(n);


Writeln(‘x mu n = ‘, XMU(x,n):0:2);
Readln;



End.


Bài tập 3: Viết thủ tục PHANTICH(n:Integer); để phân tích số nguyên n ra thừa số nguyên tố.
Uses crt;


Var n:Integer;


Procedure PHANTICH(n:Integer);
Var i:Integer;


Begin
i:=2;


While n<>1 Do
Begin


While n MOD i=0 Do
Begin


Writeln(n:5,'|',i:2);
n:=n Div i;


End;
i:=i+1;
End;


Writeln(n:5,'|');
End;



Begin


Write('Nhap n='); Readln(n);
PHANTICH(n);


Readln;
End.


<b>4.CŨNG CỐ:</b>


Thế nào là chương trình con đệ quy ?


Hãy cho biết cấu trúc chương trình con đệ quy
<b>5.HƯỚNG DẪN, DẶN DỊ</b>


Bài tập 1: Viết hàm tìm BSCNN của 2 số nguyên a,b được khai báo như sau:
Function BSCNN (a,b:word ):word ;


</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>

Bài tập 3: Viết các hàm đệ quy để tính:
S1 = 1+2 +3+...+n ;


***************************************************
<i><b>Tuần:</b></i>


<i><b>Ngày soạn: 24/11/2015</b></i>


<b>Tiết 28- 29 - 30: THỰC HÀNH CHƯƠNG TRÌNH CON( Tiếp theo)</b>
<b>A.MỤC TIÊU</b>


<b>1.Kiến thức: Học sinh vận dụng được cách viết chương trình con vào làm các bài tập</b>


<b>2.Kỹ năng: Rèn kỹ năng viết chương trình con</b>


<b>3.Thái độ: Hoc sinh thấy được sự cần thiết phải viết chương trình con</b>
<b>B. PHƯƠNG PHÁP</b>


Thực hành


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
Gv: Bài tập thực hành


Hs: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
1. Ổn định: Sĩ số


2. Kiểm tra bài cũ: Kiểm tra học sinh làm bài tập ở nhà
3. Bài mới


<b>Bài 1: Hoán vị của dãy {1,2,3...,N} là dãy N số nguyên khác nhau và có giá trị thuộc tập số</b>
nguyên từ 1 đến N. Ví dụ dãy P={5,9,1,8,2,6,4,7,3} là một hóan vị của dãy {1,2,3,4,5,6,7,8,9}.
Người ta xây dựng bảng nghịch thế của hoán vị P={p1,p2,p3....pn} là dãy T= {t1,t2,....tN} theo quy


tắc, ti bằng số các phần tử của P đứng bên trái số i của P và lớn hon i (1<=i<=N).


<b>Hướng dẫn: Trước hết, tìm xem số i nằm ở vị trí nào của hoán vị P. Giả sử i là phần tử thứ j của</b>
P


Duyệt dãy P từ vị trí thứ 1 đến vị trí thứ j-1, đếm số lượng các phần tử lớn hơn số i. Số lượng này
là giá trị ti cần tìm


Giải:



<b>Program bai1;</b>
const max = 20;


type m1 = array[1..max] of integer;
var n:byte;


p,t:m1;


<b>Procedure nhap_input;</b>
var i:byte;


Begin


write(‘nhap so nguyn duong n<20’);
readln(n);


begin


write(‘P[‘,i:2,’]=’);
readln(P[i]);
end;


</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>

Begin


for i:=1 to n do
write(m[i]:4);
end;


<b>Function tinh(p:m;i:byte):byte;</b>


var k,j,dem:byte;


Begin
j:=1;


while p[j] <>i then inc(j);
dem:=0;


for k:= 1 to j-1 do
if p[k] >i then
inc(dem);
tinh:=dem;
end;


<b>Procedure thuchien;</b>
var i:byte;


Begin


for i:= 1 to n do
t[i]:= tinh(p,i);
end;


<b>BEGIN</b>


nhap_input;
thuchien;
hien_output;
readln;
<b>END.</b>



<b>Bài 2: Bài toán hay trò chơi tháp Hà Nội của nhà sư. Tương truyền rằng ở một ngôi đền lớn tai</b>
Bénares ( Ấn Độ) có một tấm để bằng đồng trên đó có 3 cái cọc bằng kim cương trong đó
Thượng đế khi khai sinh ra thế giới đã xếp 64 cái đĩa bằng vàng trên một cái cọc với đường kính
giảm dần. Ngày đêm các nhà sư dịch chuyển đĩa sang một chiếc cọc khác với nguyên tắc sau:
+ Mỗi lần chỉ được dịch chuyển một đĩa


+Một đĩa có thể được dịch chuyển từ một cọc này sang cọc khác bất kì


+Khơng được đem một đĩa trên một đĩa khác có đường kính nhỏ hơn. Và ngày tận thế sẽ đến khi
64 chiếc đĩa vàng được dịhc chuyển và để làm việc này phải mất trên 58 tỉ năm!


Giải


<b>Program thap_HN;</b>
var n;integer;


<b> Procedure Dichuyen(n,C1,C2,C3;Integer);</b>
Begin


if n= 1 then


writeln(‘C1’,C1)
else


</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>

Dichuyen(n-1,C1,C3,C2);
Dichuyen(1,C1,C2,C3);
Dichuyen(n-1,C3,C2,C1);
end;



end;
end;


<b>BEGIN</b>


write(‘Nhap n’);
readln(n);


writeln(‘ chuong trinh dich chuyen dia nhu sau’);
Dichuyen(N,1,2,3);


readln;
<b>END.</b>


<b>4.CŨNG CỐ:</b>


Nhận xét giờ thực hành
<b>5.HƯỚNG DẪN, DẶN DÒ</b>


<b>Bài tập 1: Viết chương trình in ra màn hình các hốn vị của n số nguyên đầu tiên.</b>


<b>Bài 2: Xây dựng hàm daonguoc(n:word) có giá trị trả về của hàm là số nguyên có được bằng</b>
cách lấy đảo ngược các chữ số của n. Ví dụ khi đảo ngược số 12305 thì có kết quả là 50321


<b>*********************************************</b>
<i>Tuần:</i>


<i> Ngày soạn:</i> <i>30/11/2015</i>
<i><b>Tiết 31-32-33: MẢNG MỘT CHIỀU (DÃY SỐ)</b></i>



<b>A. MỤC TIÊU</b>


<b>1.Kiến thức: Học sinh nắm được cách viết dữ liệu dạng mảng một chiều, làm được các bài tốn </b>
trên mảng một chiều


<b>2.Kỹ năng:Có kỹ năng phân tích bài tốn, viết câu lệnh chính xác</b>


<b>3.Thái độ: Học sinh tích cực, tự giác, hứng thú trong giải tốn bằng mảng</b>
<b>B. PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp</b>


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
GV: Giáo án, phấn màu vẽ sơ đồ


HS: Ôn tập các câu lệnh cơ bản
<b>D. TIẾN TRÌNH LÊN LỚP</b>
<b>1. Ổn định: Sĩ số </b>


<b>2.Kiểm tra bài cũ:</b>
<b>3. Bài mới </b>


<b>DỮ LIỆU KIỂU MẢNG (ARRAY)</b>
<b>I. KHAI BÁO MẢNG</b>


Cú pháp:


<b>TYPE<Kiểu mảng> = ARRAY [chỉ số] OF <Kiểu dữ liệu>; </b>
<b>VAR <Biến mảng>:<Kiểu mảng>;</b>


hoặc khai báo trực tiếp:



<b>VAR</b> <b><Biến mảng> : ARRAY [chỉ số] OF <Kiểu dữ liệu>; </b>
Ví dụ:


TYPE Mangnguyen = Array[1..100] of Integer;


</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>

MangKytu = Array[Byte] of Char;
VAR A: Mangnguyen;


M: Matrix;
C: MangKytu;
hoặc:


VAR A: Array[1..100] of Integer;
C: Array[Byte] of Char;
<b>II. XUẤT NHẬP TRÊN DỮ LIỆU KIỂU MẢNG</b>


- Để truy cập đến phần tử thứ k trong mảng một chiều A, ta sử dụng cú pháp: A[k].
- Để truy cập đến phần tử (i,j) trong mảng hai chiều M, ta sử dụng cú pháp: M[i,j].


- Có thể sử dụng các thủ tục READ(LN)/WRITE(LN) đối với các phần tử của biến kiểu
mảng.


<b>BÀI TẬP MẪU</b>


Bài tập 1:Viết chương trình tìm giá trị lớn nhất của một mảng chứa các số nguyên gồm N phần tử.
<i><b>Ý tưởng:</b></i>


- Cho số lớn nhất là số đầu tiên: Max:=a[1].


- Duyệt qua các phần tử a[i], với i chạy từ 2 tới N: Nếu a[i]>Max thì thay Max:=a[i];


<b>Program Bai1;</b>


Uses Crt;


Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;


N,i,Max:Integer;
<b> Begin</b>


{Nhập mảng}


Write(‘Nhap N=’); Readln(N);
For i:=1 To N Do


Begin


Write(‘A[‘,i,’]=’); Readln(A[i]);
End;


{Tìm phần tử lớn nhất}
Max:=A[1];


For i:=2 To N Do


If Max<A[i] Then Max:=A[i];
{In kết quả ra màn hình}


Writeln(‘Phan tu lon nhat cua mang: ’, Max);
Readln;



<b>End.</b>


Bài tập 2:Viết chương trình tính tổng bình phương của các số âm trong một mảng gồm N phần tử.
<i><b>Ý tưởng:</b></i>


Duyệt qua tất cả các phần tử A[i] trong mảng: Nếu A[i]<0 thì cộng dồn (A[i])2<sub> vào biến S.</sub>


</div>
<span class='text_page_counter'>(31)</span><div class='page_container' data-page=31>

Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;


N,i,S:Integer;
<b> Begin</b>


{Nhập mảng}


Write(‘Nhap N=’); Readln(N);
For i:=1 To N Do


Begin


Write(‘A[‘,i,’]=’); Readln(A[i]);
End;


{Tính tổng}
S:=0;


For i:=1 To N Do


If A[i]<0 Then S:=S+A[i]*A[i];


{In kết quả ra màn hình}


Writeln(‘S= ’, S);
Readln;


<b> End.</b>


Bài tập 3: Viết chương trình nhập vào một mảng gồm N số nguyên. Sắp xếp lại mảng theo thứ tự
tăng dần và in kết quả ra màn hình.


<i><b>Ý tưởng:</b></i>


Cho biến i chạy từ 1 đến N-1, đồng thời cho biến j chạy từ i+1 đến N: Nếu A[i]>A[j] thì
đổi chổ A[i], A[j].


<b>Program bai3;</b>
Uses Crt;


Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;


N,i,j,Tam:Integer;
<b> Begin</b>


{Nhập mảng}


Write(‘Nhap N=’); Readln(N);
For i:=1 To N Do


Begin



Write(‘A[‘,i,’]=’); Readln(A[i]);
End;


{Sắp xếp}


For i:=1 To N-1 Do


For j:=i+1 To N Do
If A[i]>A[j] Then


Begin


Tam:=A[i]; A[i]:=A[j]; A[j]:=Tam;
End;


{In kết quả ra màn hình}


</div>
<span class='text_page_counter'>(32)</span><div class='page_container' data-page=32>

For i:=1 To N Do Write(A[i]:5);
Readln;


<b> End.</b>


<b>4. CŨNG CỐ:Nhắc lại cách khai báo kiểu mảng một chiều, muốn truy xuất phần tử thứ i ta làm</b>
thế nào ? cần lưu ý khi ghi hai phần tử liên tiếp phải có ít nhất một khỏng trắng


<b>5. HƯỚNG DẪN , DẶN DÒ</b>


<b>Bài 1:Nhập n số thực từ bàn phím vào một mảng, tính trung bình cộng của các số này.</b>



<b>Bai 2:Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào một số</b>
nguyên X. Hãy kiểm tra xem phần tử X có trong mảng A hay khơng?


<b>B i 3:à</b> Cho một mảng số nguyên gồm n phần tử. Tìm dãy con gồm m phần tử (mn) sao cho


dãy con này có tổng lớn nhất. (Dãy con là dãy các phần tử liên tiếp nhau trong mảng).


<b>*****************************************************************************</b>


<i>Tuần:</i>


<i> Ngày soạn: 07/12/2015</i>
<i><b>Tiết 34-35-36: THỰC HÀNH: MẢNG MỘT CHIỀU</b></i>


<b>1.Kiến thức: Học sinh vận dụng các kiến thức đã học làm được các bài tốn về mảng một chiều</b>
<b>2.Kỹ năng: Có kỹ năng thưch hành trên máy nhanh, chính xác</b>


<b>3.Thái độ: Học sinh tích cực, tự giác, hứng thú tỷong thực hành</b>
<b>B. PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp</b>


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRỊ</b>
GV: Bài tập, phịng máy


HS: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
<b>1. Ổn định: Sĩ số </b>


<b>2. Thực hành</b>


<b>Bài tập 1: Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào một số</b>


nguyên X. Hãy kiểm tra xem phần tử X có trong mảng A hay khơng?


<i><b>Ý tưởng:</b></i>


Dùng thuật tốn tìm kiếm tuần tự. So sánh x với từng phần tử của mảng A. Thuật toán
dừng lại khi x=A[i] hoặc i>N.


Nếu x=A[i] thì vị trí cần tìm là i, ngược lại thì kết quả tìm là 0 (khơng tìm thấy).
<b>Program Bài 1;</b>


Uses Crt;


Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;


N,i,x:Integer;


<b>Function TimKiem(x, N: Integer; A:Mang):Integer;</b>
Var i:Integer;


Begin
I:=1;


While (I <= N) and (X<>A[I]) do I:=I+1;
If I <= N Then Timkiem:=I Else Timkiem:=0;
End;


</div>
<span class='text_page_counter'>(33)</span><div class='page_container' data-page=33>

{Nhập mảng}


Write(‘Nhap N=’); Readln(N);


For i:=1 To N Do


Begin


Write(‘A[‘,i,’]=’); Readln(A[i]);
End;


Write(‘Nhap X=’); Readln(x);
{Kết quả tìm kiếm}


If TimKiem(X,N,A)<>0 Then


Writeln(‘Vi tri cua X trong mang la:’, TimKiem(X,N,A))
Else Writeln(‘X khong co trong mang.’);


Readln;
End.


<b>Bài tập 2: Giả sử mảng A đã được sắp xếp theo thứ tự tăng dần. Viết hàm để kiểm tra xem phần</b>
tử X có trong mảng A hay không?


<i><b>Ý tưởng:</b></i>


So sánh x với phần tử ở giữa mảng A[giua]. Nếu x=A[giua] thì dừng (vị trí cần tìm là chỉ
số của phần tử giữa của mảng). Ngược lại, nếu x>A[giua] thì tìm ở đoạn sau của mảng
[giua+1,cuoi], ngược lại thì tìm ở đoạn đầu của mảng [dau,giua-1].


<b>Bài tập 3: Cho một mảng số nguyên gồm n phần tử. Tìm dãy con gồm m phần tử (mn) sao cho</b>
dãy con này có tổng lớn nhất. (Dãy con là dãy các phần tử liên tiếp nhau trong mảng).



<b>Program Bai3;</b>
Uses Crt;


Type Mang=ARRAY[1..50] Of Integer;
Var A:Mang;


n,m,i,j,k:Byte;
S,Max:Integer;
<b>Begin</b>


Write('So phan tu cua mang: n= '); Readln(n);
For i:=1 To n Do


Begin


Write('a[',i,']='); Readln(a[i]);
End;


Write('Nhap so phan tu cua day con: m= '); Readln(m);
k:=1; {Vị trí phần tử đầu tiên của dãy con}


{Giả sử m phần tử đầu tiên của mảng A là dãy con có tổng lớn nhất}
Max:=0;


For i:=1 To m Do Max:=Max+A[i];
{Tìm các dãy con khác}


For i:=2 To n-m+1 Do
Begin



{Tính tổng của dãy con thứ i}
S:=0;


For j:=i To i+m-1 Do S:=S+A[j];


</div>
<span class='text_page_counter'>(34)</span><div class='page_container' data-page=34>

Begin


Max:=S; {Thay tổng mới}


k:=i; {Thay vị trí đầu tiên của dãy con mới}
End;


End;


Writeln('Day con co tong lon nhat la:');
For i:=k To k+m-1 Do Write(A[i]:5);
Readln;


<b>End.</b>
<b>Bài 4:</b>


Nhập n số thực từ bàn phím vào một mảng, tính trung bình cộng của các số này.
<b>Program Bai4;</b>


Uses CRT;
Var i,n : Integer;
s : Real;


a : Array[1.. 100] of Real;
<b> Begin</b>



ClrScr;


Write( ‘ Ban muon nhap bao nhieu PT cho mang : ‘ );
Readln(n);


For i := 1 to n do
Begin


Write( ‘ PT A[ ‘ , i , ‘ ]= ’ );
Readln(a[i]);


End;
s := 0;


For i := 1 to n do
s := s + a[i];


Write( ‘ Trung binh cong cua day so = ‘ , s / n : 0 : 4 );
Readln;


End.


<b>3.CŨNG CỐ: Nhận xét giờ thực hành</b>
<b>4.HƯỚNG DẪN DẶN DỊ</b>


<b>5.1. Viết chương trình nhập vào một dãy n số a[1], a[2],..., a[n] và in ra màn hình các thơng tin</b>
sau:


- Tổng các phần tử của dãy.



- Số lượng số dương và tổng của các số dương của dãy.
- Số lượng số âm và tổng của các số âm của dãy.


- Trung bình cộng của dãy.


<b>5.2. Viết chương trình nhập vào một dãy n số a[1], a[2],..., a[n] và in ra màn hình các thơng tin</b>
sau:


- Số hạng dương lớn nhất của dãy và chỉ số (vị trí) của nó.
- Số hạng dương nhỏ nhất của dãy và chỉ số (vị trí) của nó.
- Số hạng âm lớn nhất của dãy và chỉ số (vị trí) của nó.
- Số hạng âm nhỏ nhất của dãy và chỉ số (vị trí) của nó.


******************************************************
<i>Tuần:</i>


<i> Ngày soạn: 14/12/2015</i>
<i><b>Tiết 37-38-39: THỰC HÀNH: MẢNG MỘT CHIỀU(TT)</b></i>


</div>
<span class='text_page_counter'>(35)</span><div class='page_container' data-page=35>

<b>2.Kỹ năng:Có kỹ năng phân tích bài tốn, viết câu lệnh chính xác</b>


<b>3.Thái độ: Học sinh tích cực, tự giác, hứng thú trong giải tốn bằng mảng</b>
<b>B. PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp</b>


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
GV: Giáo án, phấn màu vẽ sơ đồ


HS: Ôn tập các câu lệnh cơ bản
<b>D. TIẾN TRÌNH LÊN LỚP</b>


<b>1. Ổn định: Sĩ số </b>


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


Bài tập 1: Viết chương trình in ra màn hình tam giác Pascal. Ví dụ, với n=4 sẽ in ra hình sau:
1


1 1


1 2 1


1 3 3 1


1 4 6 4 1


<i><b>Ý tưởng:</b></i>


Tam giác Pascal được tạo ra theo qui luật sau:
+ Mỗi dòng đều bắt đầu và kết thúc bởi số 1.


+ Phần tử thứ j ở dòng k nhận được bằng cách cộng 2 phần tử thứ j-1 và j ở dòng thứ k-1.
<b>Program Bai1;</b>


Uses Crt;


Var Dong:Array[0..20] Of Byte;
n,i,j:Byte;


<b> Begin</b>



Write('n= '); Readln(n);
Clrscr;


Dong[0]:=1;


Writeln(Dong[0]:4);


{Khoi tao gia tri cua dong}
For i:=1 To n Do Dong[i]:=0;
{Voi moi dong i}


For i:=1 To n Do
Begin


For j:=i DownTo 1 Do
Begin


Dong[j]:=Dong[j-1]+Dong[j];
Write(Dong[j]:4);


End;


Writeln(Dong[i]:4);
End;


Readln;
<b>End.</b>


Bài tập 2: Viết chương trình nhập vào 2 mảng số nguyên A, B đại diện cho 2 tập hợp (khơng thể
có 2 phần tử trùng nhau trong một tập hợp). Trong quá trình nhập, phải kiểm tra: nếu phần tử vừa


nhập vào đã có trong mảng thì khơng bổ sung vào mảng. In ra màn hình các phần tử là giao của 2
tập hợp A, B.


<i><b>Ý tưởng:</b></i>


</div>
<span class='text_page_counter'>(36)</span><div class='page_container' data-page=36>

<b>Program Bai2;</b>
Uses Crt;


Type Mang=ARRAY[1..50] Of Integer;
Var A,B:Mang;


n,m:Byte;


<b> Function KiemTra(x:Integer; n:Byte; A:Mang):Boolean;</b>
Var i:Byte; Found:Boolean;


Begin


Kiemtra:=False;
i:=1;


While (i<=n) AND (not Found) Do


If x=A[i] Then Found:=True Else i:=i+1;
KiemTra:=Found;


End;


<b>Procedure NhapMang(Var n:Byte; Var A:Mang);</b>
Var ch:Char;



x:Integer;
Begin


n:=0;
Repeat


Write('x='); Readln(x);


If not KiemTra(x,n,A) Then
Begin


n:=n+1; A[n]:=x;
End;


Writeln('An ESC de ket thuc nhap!');
ch:=Readkey;


Until ch=#27;
End;


<b>Procedure GiaoAB(n:Byte; A:Mang;m:Byte; B:Mang);</b>
Var i:Byte;


Begin


For i:=1 To n Do


If KiemTra(A[i],m,B) Then Write(A[i]:4);
End;



<b>Begin</b>
Clrscr;


Writeln('Nhap mang A: ');
NhapMang(n,A);


Writeln('Nhap mang B: ');
NhapMang(m,B);


Writeln('Giao cua 2 mang A&B la: ');
GiaoAB(n,A,m,B);


Readln;
<b>End.</b>


Bài tập 3: Nhập vào một mảng các số nguyên.
a/ Xếp lại mảng đó theo thứ tự giảm dần.


b/ Nhập vào một số nguyên từ bàn phím. Chèn số đó vào mảng sao cho mảng vẫn có thứ
tự giảm dần. (khơng được xếp lại mảng)


<i><b>Gợi ý:</b></i>


</div>
<span class='text_page_counter'>(37)</span><div class='page_container' data-page=37>

- Đẩy các phần tử từ vị trí i tới n sang phải 1 vị trí.
- Gán: A[i]=x;


<b>4. CŨNG CỐ: Học sinh nhắc lại thuật toán sắp xếp dãy tăng dần</b>
<b>5. HƯỚNG DẪN, DẶN DÒ</b>



Bài tập 1: Cho 2 mảng số nguyên: Mảng A có m phần tử, mảng B có n phần tử.
a/ Sắp xếp lại các mảng đó theo thứ tự giảm dần.


b/ Trộn 2 mảng đó lại thành mảng C sao cho mảng C vẫn có thứ tự giảm dần (Khơng được
xếp lại mảng C).


<i><b>Gợi ý:</b></i>


- Dùng 2 chỉ số i,j để duyệt qua các phần tử của 2 mảng A, B và k là chỉ số cho mảng C.
- Trong khi (i<=m) và (j<=n) thì:


{Tức là khi đồng thời cả 2 dãy A, B đều chưa duyệt hết}
+ Nếu A[i]>B[j] thì: C[k]:=A[i]; i:=i+1;


+ Ngược lại: C[k]:=B[j]; j:=j+1;


- Nếu dãy nào hết trước thì đem phần cịn lại của dãy kia bổ sung vào cuối dãy C.


Bài tập 2: Viết chương trình nhập vào một dãy số nguyên a1, a2, ..., an. Tìm trong dãy {a} một
dãy con tăng dần dài nhất (có số phần tử lớn nhất) và in ra màn hình dãy con đó.


***************************************************************
<i>Tuần:</i>


<i> Ngày soạn:</i> <i>21/12/2015</i>
<i><b>Tiết 40-41-42: THỰC HÀNH (Tiếp theo)</b></i>


<b>1.Kiến thức: Học sinh vận dụng các kiến thức đã học làm được các bài toán về mảng một chiều</b>
<b>2.Kỹ năng: Có kỹ năng thực hành trên máy nhanh, chính xác</b>



<b>3.Thái độ: Học sinh tích cực, tự giác, hứng thú trong thực hành</b>
<b>B. PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp</b>


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
GV: Bài tập, phòng máy


HS: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
<b>1. Ổn định: Sĩ số </b>


<b>2. Thực hành</b>


Bài tập 1: Cho 2 mảng số nguyên: Mảng A có m phần tử, mảng B có n phần tử.
a/ Sắp xếp lại các mảng đó theo thứ tự giảm dần.


b/ Trộn 2 mảng đó lại thành mảng C sao cho mảng C vẫn có thứ tự giảm dần (Khơng được
xếp lại mảng C).


<i><b>Gợi ý:</b></i>


- Dùng 2 chỉ số i,j để duyệt qua các phần tử của 2 mảng A, B và k là chỉ số cho mảng C.
- Trong khi (i<=m) và (j<=n) thì:


{Tức là khi đồng thời cả 2 dãy A, B đều chưa duyệt hết}
+ Nếu A[i]>B[j] thì: C[k]:=A[i]; i:=i+1;


+ Ngược lại: C[k]:=B[j]; j:=j+1;


- Nếu dãy nào hết trước thì đem phần cịn lại của dãy kia bổ sung vào cuối dãy C.



</div>
<span class='text_page_counter'>(38)</span><div class='page_container' data-page=38>

Bài 3:Hãy nghiên cứu quy luật tạo ra các bảng số sau đây và lập chương trình để in ra các bảng số
đó. Cho biết số phần tử N của dòng đầu tiên và các phần tử của dòng đầu tiên đựợc nhập từ bàn
phím


1 4 9 12


3 5 3


2 -2
-4


21 8 2 13


-13 -6 11


7 17


10
<b>Bài 3:</b>


<b>Program Inbang;</b>


<b> Var A:Array [1..16] of integer;</b>
N,I,p,q;Integer;


BEGIN
Repeat


Write(‘Cho biet hang dau co may so’);
Readln(N);



Until N<=16;
For i:=1 to N do
Begin


Write(‘A[‘,i,’]=’);
Readln(A[i]);
End;


p;=1; q:=5;
While N>0 do
Begin


For i:=1 to N do
Begin


Gotoxy(p+6*i,q);
Write(A[i]:6);


If i<N then A[i]:=A[i+1]-A[i];
End;


Writeln;


n:=n-1; q:=q+1; p:=p+3;
end;


Readln;
END.



<b>4.CŨNG CỐ: Nhận xét giừo thực hành</b>
<b>5. HƯỚNG DẪN DẶN DÒ</b>


<b>Bài 1: Dãy số Fibonaci là dãy số</b>


1 1 2 3 5 8 13 21 ...


được xác định như sau: a1=a2 =1


An = an-1+an-2 với n>=3


Lập chương trình tìm và in ra các số Fibonaci nhỏ hơn hoặc bằng một số K cho trước


<b>Bài 2: Viết chương trình nhập vào mảng a gồm 10 phần tử nguyên, sau đó, nhập một giá trị x.</b>
Tìm trong mảng a nếu có phần tử nào có giá trị bằng với x thì hiển thị lên màn hình vị trí của nó
trong mảng a.


</div>
<span class='text_page_counter'>(39)</span><div class='page_container' data-page=39>

<i>Tuần:</i>


<i> Ngày soạn:</i> <i>10/11/2014</i>
<i><b>Tiết 43-44 -45: XÂU KÍ TỰ ( STRING)</b></i>


<b>1.Kiến thức: Học sinh năm được cấu trúc dữ liệu kiểu xâu, biết viết các chương trình xữ lí các </b>
bài tốn trên xâu kí tự


<b>2.Kỹ năng: Có kĩ năng phân tích bài tốn, sữ dụng chính xác các thủ tục xữ lí xâu kí tự</b>
<b>3.Thái độ: Học sinh tích cực, tự giác, hứng thú trong giờ học</b>


<b>B. PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp</b>
<b>C. CHUẨN BỊ CỦA THẦY VÀ TRỊ</b>



GV: Bài tập, phịng máy
HS: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
<b>1. Ổn định: Sĩ số </b>


<b>2. Bài mới</b>


<b>XÂU KÝ TỰ (STRING)</b>
<b>I. KHAI BÁO KIỂU STRING</b>


<b>TYPETênKiểu = STRING[Max];</b>
<b>VAR</b> <b>Tên biến : TênKiểu;</b>
hoặc khai báo biến trực tiếp:


<b>VAR</b> <b>Tên biến : STRING[Max];</b>


Trong đó Max là số ký tự tối đa có thể chứa trong chuỗi (Max  [0,255]). Nếu khơng có khai báo
[Max] thì số ký tự mặ mặc định trong chuỗi là 255.


Ví dụ:


Type Hoten = String[30];
St80 = String[80];
Var Name : Hoten;


Line : St80;


St : String; {St có tối đa là 255 ký tự}
<b>II. TRUY XUẤT DỮ LIỆU KIỂU STRING</b>



- Có thể sử dụng các thủ tục xuất nhập Write, Writeln, Readln để truy xuất các biến kiểu
String.


- Để truy xuất đến ký tự thứ k của xâu ký tự, ta sử dụng cú pháp sau: Tênbiến[k].
<b>III. CÁC PHÉP TOÁN TRÊN XÂU KÝ TỰ</b>


<b>3.1. Phép nối xâu: +</b>


<b>3.2. Các phép toán quan hệ: =, <>, <, <=, >, >=.</b>


<i><b>Chú ý: Các phép toán quan hệ được so sánh theo thứ tự từ điển.</b></i>
<b>IV. CÁC THỦ TỤC VÀ HÀM VẾ XÂU KÝ TỰ</b>


<b>4.1. Hàm lấy chiều dài của xây ký tự</b>


<b>LENGTH(St : String):Integer;</b>


<b>4.2. Hàm COPY(St : String; Pos, Num: Byte): String;</b>


</div>
<span class='text_page_counter'>(40)</span><div class='page_container' data-page=40>

Kiểm tra xâu con SubSt có nằm trong xâu St hay khơng? Nếu xâu SubSt nằm trong xâu St thì
hàm trả về vị trí đầu tiên của xâu con SubSt trong xâu St, ngược lại hàm trả về giá trị 0.


<b>4.4. Thủ tục DELETE(Var St:String; Pos, Num: Byte);</b>
Xoá trong xâu St Num ký tự bắt đầu từ vị trí Pos.


<b>4.5. Thủ tục INSERT(SubSt: String; Var St: String; Pos: Byte);</b>
Chèn xâu SubSt vào xâu St bắt đầu tại vị trí Pos.


<b>4.6. Thủ tục STR(Num; Var St:String);</b>



Đổi số nguyên hay thực Num thành dạng xâu ký tự, kết quả lưu vào biến St.
<b>4.7. Thủ tục VAL(St:String; Var Num; Var Code:Integer);</b>


Đổi xâu số St thành số và gán kết quả lưu vào biến Num. Nếu việc chuyển đổi thành cơng thì biến
Code có giá trị là 0, ngược lại biến Code có giá trị khác 0 (vị trí của lỗi).


<b>BÀI TẬP MẪU</b>


Bài tập 1: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Đổi xâu ký tự đó sang chữ in
hoa rồi in kết quả ra màn hình.


Ví dụ :Xâu abcdAbcD sẽ cho ra xâu ABCDABCD.
Uses Crt;


Var St:String;
i:Byte;
Begin


Write(‘Nhap xau St: ‘); Readln(St);


For i:=1 to length(St) do St[i]:=Upcase(St[i]);
Write(‘Xau ket qua: ‘, St);


Readln;
End.


Bài tập 2: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Đổi xâu ký tự đó sang chữ
thường rồi in kết quả ra màn hình.



Ví dụ :Xâu abCdAbcD sẽ cho ra xâu abcdabcd.
Uses Crt;


Var St:String;
i:Byte;
Begin


Write(‘Nhap xau St: ‘); Readln(St);
For i:=1 to length(St) do


If St[i] IN [‘A’..’Z’] Then St[i]:=CHR(ORD(St[i])+32);
Write(‘Xau ket qua: ‘, St);


Readln;
End.


Bài tập 3: Viết chương trình đếm số ký tự chữ số trong một xâu ký tự được nhập vào từ bàn phím.
Uses Crt;


Var St:String;
i,d:Byte;
Begin


Write(‘Nhap xau St: ‘); Readln(St);
For i:=1 to length(St) do


If St[i] IN [‘0’..’9’] Then d:=d+1;
Write(‘So ky tu chu so trong xau: ‘, d);
Readln;



</div>
<span class='text_page_counter'>(41)</span><div class='page_container' data-page=41>

Bài tập 4: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Tìm xâu đảo ngược của xâu đó
rồi in kết quả ra màn hình theo 2 cách: Đệ qui và không đệ qui.


<i><b>Ý tưởng:</b></i>


- Nếu xâu St có 1 ký tự thì xâu đảo = St.


- Ngược lại: Xâu đảo = Ký tự cuối + Đệ qui(Phần cịn lại của xâu St).
Uses Crt;


Var St:String;


{Giải thuật khơng đệ qui}


Function XauDao(St:String):String;
Var S:String;


i:Byte;
Begin


S:=’’;


For i:=Length(St) DowTo 1 Do S:=S+St[i];
XauDao:=S;


End;


{Giải thuật đệ qui}


Function DeQui(St:String):String;


Begin


If Length(St)<=1 Then DeQui:=St


Else DeQui:=St[Length(St)] + DeQui(Copy(St,1,Length(St)-1));
End;


Begin


Write(‘Nhap xau St: ‘); Readln(St);
Write(‘Xau dao nguoc: ‘, XauDao(St));
Readln;


End.


<b>IV. CŨNG CỐ : Học sinh nhắc lại thủ tục đổi chữ thường sang chữ hoa. Muốn đổi chữ hoa sang</b>
chữ thường ta làm thế nào?


<b>V. HƯỚNG DẪN DẶN DÒ </b>


Bài tập 1: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Thơng báo lên màn hình các
chữ cái có trong xâu và số lượng của chúng ( Không phân biệt chữ hoa hay chữ thường).


Bài tập 2: Viết chương trình xóa các ký tự chữ số trong một xâu ký tự được nhập vào từ bàn
phím.


<i><b>**************************************************</b></i>
<i>Tuần:</i>


<i> Ngày soạn:</i> <i> / /2013</i>


<i><b>Tiết 46-47 -48: THỰC HÀNH: XÂU KÍ TỰ</b></i>


<b>1.Kiến thức: Học sinh vận dụng được các phép tốn xữ lí trên xâu kí tự để làm bài tập</b>
<b>2.Kỹ năng: Có kĩ năng phân tích bài tốn, vận dụng trong thự hành trên máy</b>


<b>3.Thái độ: Học sinh tích cực, tự giác, hứng thú trong thực hành</b>
<b>B. PHƯƠNG PHÁP: nêu vấn đè, gợi mỡ</b>


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRỊ</b>
GV: Bài tập, phịng máy


HS: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
<b>1. Ổn định: Sĩ số </b>


</div>
<span class='text_page_counter'>(42)</span><div class='page_container' data-page=42>

Bài tập 1: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Thơng báo lên màn hình các
chữ cái có trong xâu và số lượng của chúng ( Không phân biệt chữ hoa hay chữ thường).


<i><b>Ý tưởng:</b></i>


- Dùng một mảng dem với chỉ số là các chữ cái để lưu trữ số lượng của các chữ cái trong
xâu.


- Duyệt qua tất cả các ký tự của xâu St: Nếu ký tự đó là chữ cái thì tăng ơ biến mảng
dem[St[i]] lên 1 đơn vị.


Uses Crt;


Var St:String;



dem: Array[‘A’..’Z’] Of Byte;
i:Byte;


ch:Char;
Begin


Write(‘Nhap xau St: ‘); Readln(St);
{Khởi tạo mảng}


For ch:=’A’ To ‘Z’ Do dem[ch]:=0;
{Duyệt xâu}


For i:=1 To Length(St) Do


If Upcase(St[i]) IN [‘A’..’Z’] Then Inc(dem[Upcase(St[i])]);
{Liệt kê các ký tự ra màn hình}


For ch:=’A’ To ‘Z’ Do


If dem[ch]>0 Then Writeln(ch,’ : ’,dem[ch]);
Readln;


End.


Bài tập 2: Viết chương trình xóa các ký tự chữ số trong một xâu ký tự được nhập vào từ bàn
phím.


Uses Crt;


Var St:String;



{Hàm POSNUM kiểm tra xem trong xâu St có ký tự chữ số hay khơng? Nếu có, hàm trả về vị trí
đầu tiên của ký tự chữ số, ngược lại hàm trả về giá trị 0}


Function POSNUM(St:String):Byte;
Var OK:Boolean;


i:Byte;
Begin


OK:=False;
i:=1;


While (i<=Length(St)) AND (Not OK) Do
If St[i] IN [‘0’..’9’] Then OK:=True
Else i:=i+1;


If OK Then POSNUM:=i Else POSNUM:=0;
End;


Begin


Write(‘Nhap xau St: ‘); Readln(St);


While POSNUM(St)<>0 Do Delete(St,POSNUM(St),1);
Write(‘Xau sau khi xoa: ‘,St);


</div>
<span class='text_page_counter'>(43)</span><div class='page_container' data-page=43>

Bài tập 3: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Tìm và in ra màn hình một từ
có độ dài lớn nhất trong xâu.



<i><b>Gợi ý:</b></i>


Tách từng từ để so sánh


<b>IV. CŨNG CỐ: Nhận xét giờ thực hành</b>
<b>V.HƯỚNG DẪN, DẶN DỊ</b>


Bài tập 1: Viết chương trình nhập một xâu vào từ bàn phím và thơng báo lên màn hình xâu đó có
phải đối xứng khơng theo 2 cách: Đệ qui và khơng đệ qui. (Ví dụ: abba, abcba là các xâu đối
xứng).


<i><b>Gợi ý:</b></i>


- Nếu xâu Length(st)<=1 thì st là xâu đối xứng
- Ngược lại:


+ Nếu st[1]<>st[Length(st)] thì st không đối xứng


+ Ngược lại: Gọi đệ qui với xâu st sau khi bỏ đi ký tự đầu và ký tự cuối.
*******************************************************
<i>Tuần:</i>


<i> Ngày soạn:</i> <i> / /2014</i>
<i><b>Tiết 49-50 -51: THỰC HÀNH XÂU KÍ TỰ ( STRING)</b></i>


<b>1.Kiến thức: Học sinh năm được cấu trúc dữ liệu kiểu xâu, biết viết các chương trình xữ lí các </b>
bài tốn trên xâu kí tự


<b>2.Kỹ năng: Có kĩ năng phân tích bài tốn, sữ dụng chính xác các thủ tục xữ lí xâu kí tự</b>
<b>3.Thái độ: Học sinh tích cực, tự giác, hứng thú trong giờ học</b>



<b>B. PHƯƠNG PHÁP: Thuyết trình, gợi mở, vấn đáp</b>
<b>C. CHUẨN BỊ CỦA THẦY VÀ TRỊ</b>


GV: Bài tập, phịng máy
HS: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
<b>1. Ổn định: Sĩ số </b>


<b>2. Bài mới</b>


<b>Bài 1: Viết chương trình tìm các vị trí xuất hiện chuổi S1 trong chuổi S ? </b>
<b>Dữ liệu vào: Chuổi s và chuổi s1.</b>


<b>Kết quả ra: Các v ị trí tìm thấy s1 trong s.</b>
<b>Ví dụ:</b>


Input Output


Test 1 ‘aaahocjhochoc’


‘hoc’ 4 8 11


Test 2 ‘adddddee’
‘dd’


2 3 4 5
Giải


var s,s1:string;


begin


readln(s);
readln(s1);


while pos(s1,s)>0 then
begin


write(pos(s1,s):4);
s[pos(s1,s)]:=chr(1);
end;


</div>
<span class='text_page_counter'>(44)</span><div class='page_container' data-page=44>

<b>Bài 2:</b>


Nhập vào một chuổi sau đó xuất ra các từ dài nhất trong chuỗi
Dữ liệu vào: một chuổi.


Kết quả ra: các từ dài nhất trong chuỗi
Ví dụ:


Input Output


Test 1 Tran Nguyen dao Nguyen
Test 2 Tran quang dao bgggg quang


bgggg
Giải


var s,s1:string;



a:array[1..128]of string;
i,j,max:integer;


begin
readln(s);


while s[1]=#32 do delete(s,1,1);


while s[length(s)]=#32 do delete(s,length(s),1);
while pos(#32#32,s)>0 do delete(s,pos(#32#32,s),1);
j:=1;


for i:=1 to length(s) do
begin


if s[i]<>#32 then a[j]:=a[j]+s[i]
else inc(j);


end;


max:=length(a[1]);
for i:=1 to j do


if length(a[i])>max then max:=length(a[i]);
writeln('(cac) tu dai nhat: (co ',max,' ky tu:)');
for i:=1 to j do


if length(a[i])=max then writeln(a[i]);
readln;



end.
<b>Bài 3:</b>


Bờm và cuội là 2 học sinh rất giỏi tin học và thường liên lạc với nhau bằng thư điện tử
(Email). Nhưng những bức thư mà hai bạn gởi cho nhau chỉ toàn là dãy những chữ số liền
nhau. Cả hai bạn đều có chương trình mã hố các con số thành những ký tự và ngược lại
giải mã các con số thành ký tự, theo qui định hai bạn sẽ chuyển những ký tự mình định
gởi thành các con số là thứ tự của ký tự đó trong bảng mã ASCII (ví dụ : A:65; B:66) từ
chữ thường máy chuyển thành chữ hoa rồi mã hoá thành các con số.(ví dụ: a<sub></sub>A<sub></sub>65, b<sub></sub>B<sub></sub>66).
Sau khi mã hố sẽ chuyển thư đi. Người nhận có chương trình để giải mã các con số thành
những ký tự in hoa (vdụ: 6566326768<sub></sub>AB CD). Em hãy viết


a) Chương trình 1 để mã hố 1 xâu ký tự thành các chữ số.
Ví dụ:


Input Output


Di an che? 68733265783267726963
b) Chương trình để giải mã 1 chuổi số thành các ký tự


Ví dụ:


Input Output


</div>
<span class='text_page_counter'>(45)</span><div class='page_container' data-page=45>

Giải


a. Mahoa.pas
uses crt;


var s:string;


i:integer;
begin
clrscr;


writeln('Nhap chuoi can ma hoa:');
readln(s);


writeln('Ma hoa thanh cac con so la:');
for i:=1 to length(s) do


begin


s[i]:=upcase(s[i]);
write(ord(s[i]));
end;


readln;
end.


b. Giaima.pas
uses crt;


var s,s2:string;
ch:char;
i,x,d:integer;
begin


clrscr;


writeln('Nhap chuoi so mat ma:');


readln(s);


writeln('Giai ma chuoi so tren la:');
while length(s)>0 do


begin


s2:=copy(s,1,2); {lay moi lan 2 ky tu dau tien}
delete(s,1,2); {xoa 2 ky tu da lay di}


val(s2,x,i); {chuyen thanh so x}


write(chr(x)); {chuyen thanh ma asscii}
end;


readln;
end.


<b>IV. CŨNG CỐ</b>

: Khi muốn xữ lí một xâu kí tự mà ta cần chuyển từ kí tự số sang kí tự chữ


hoặc ngược lại thì ta cần chuyển nó theo số thứu tự các chữ cái trong bảng mã Asci



<b>V. HƯỚNG DẪN DẶN DÒ</b>



Về nhà làm các bài tập sau



Bài tập 1: Viết chương trình đảo ngược thứ tự các từ trong một xâu được nhập vào từ bàn phím.
Ví dụ: Xâu Nguyen Van An sẽ thành An Van Nguyen.


<i><b>Gợi ý:</b></i>



Tách từng từ nối vào đầu xâu mới


Bài tập 2: Viết chương trình nhập vào 2 xâu ký tự s1 và s2. Kiểm tra xem xâu s2 xuất hiện bao
nhiêu lần trong xâu s1. (Lưu ý: length(s2)<= length(s1)).


<i><b>Gợi ý:</b></i>


</div>
<span class='text_page_counter'>(46)</span><div class='page_container' data-page=46>

<i>Tuần:</i>


<i> Ngày soạn:</i> <i> / /2014</i>
<i><b>Tiết 52-53 -54: THỰC HÀNH</b></i>


<b>1.Kiến thức: Học sinh vận dụng được các phép toán xữ lí trên xâu kí tự để làm bài tập</b>
<b>2.Kỹ năng: Có kĩ năng phân tích bài tốn, vận dụng trong thự hành trên máy</b>


<b>3.Thái độ: Học sinh tích cực, tự giác, hứng thú trong thực hành</b>
<b>B. PHƯƠNG PHÁP: nêu vấn đè, gợi mỡ</b>


<b>C. CHUẨN BỊ CỦA THẦY VÀ TRÒ</b>
GV: Bài tập, phòng máy


HS: Làm các bài tập ở nhà
<b>D. TIẾN TRÌNH LÊN LỚP</b>
<b>1. Ổn định: Sĩ số </b>


<b>2. Thực hành</b>


<b>Bài tập 1: Viết chương trình nhập vào một dịng văn bản, hiệu chỉnh văn bản theo những yêu cầu</b>
sau đây và in văn bản sau khi hiệu chỉnh ra màn hình:



a. Xóa tất cả các ký tự trắng thừa.


b. Trước các dấu câu khơng có các ký tự trắng, sau các dấu câu có một ký tự trắng.
c. Đầu câu in hoa.


<b>Bài tập 2: Viết chương trình thực hiện phép nhân 2 số nguyên lớn. </b>
<i><b>Gợi ý:</b></i>


- Viết hàm để nhân một số lớn với số có 1 chữ số.
- Áp dụng hàm tính tổng 2 số lớn (xem bài tập 10).


<b>Bài 3: Viết chương trình nhập vào từ bàn phím một xâu ký tự và in ra màn hình xâu ký tự ngược</b>
tương ứng. Ví dụ: nhập ‘TRUNG TAM KTTHHN GIO LINH’




‘HNIL OIG NHHTTK MAT GNURT’.
Program DaoChuoi;


Uses CRT;


Var Cau : String[80];
i : Byte;


Begin


Write(‘ Nhap vao mot cau : ‘);
Readln(Cau);


For i := Length(Cau) DownTo 1 do


Write(Cau[i]);


Readln;
End.


<b>Bài 4: Hiển thị chuỗi con trong chuỗi mẹ được nhập từ bàn phím, vị trí và số ký tự hiển thị cũng</b>
được nhập từ bàn phím.


Program SubString;
Uses CRT;


Var St : String;
Pos, Len : Byte;
Begin


Write(‘ Nhap vao mot chuoi : ‘); Readln(St);


Write(‘ Muon hien thi xau tu vi tri nao : ‘); Readln(Pos);


Write(‘ Do dai xau ky tu con : ‘); Readln(Len);
Write(‘ Xau ky tu con la : ‘,Copy(St, Pos, Len));


Readln;
End.


</div>
<span class='text_page_counter'>(47)</span><div class='page_container' data-page=47>

Var i : Byte;
Begin


For i := Length(s) do
s[i] := UPCASE(s[i]);


CHUHOA := s;
End;


(******************************)
Function CHUTHUONG(s : String) : String;
Var i : Byte;


Begin


For i := Length(s) do
If s[i] In ['A'..'Z'] then


s[i] := Chr(Ord(s[i]) + 32);
CHUTHUONG := s;
End;


End.


<b>IV. CŨNG CỐ: Nhận xét giờ thực hành</b>
<b>V. HƯỚNG DẪN DẶN DỊ</b>


Bài tập 1: Viết chương trình để nén và giải nén một xâu ký tự .


</div>

<!--links-->

×