Do vậy khi học lập trình cái khó khăn ban đầu của học sinh chính là tìm thuật toán để giải bài toán đã cho.. Giải một bài, gợi ý nhiều bài .• Có nhiều bài toán tuy phát biểu khác nhau n
Trang 1Chuyên đề :
RÈN LUYỆN KỸ NĂNG LẬP TRÌNH
Cho HSG tin THCS
Trang 2
Nội dung chuyên đề
I Rèn luyện PP tìm tòi thuật toán
II Rèn luyện phong cách lập trình.
III Các dạng toán bồi dưỡng HSG THCS
Trang 3I Rèn luyện PP tìm tòi thuật toán
Trang 4Chương trình=Thuật toán+CTDL
Trang 5• Thuật toán là phần quan trong bậc nhất để
tạo nên một chương trình
• Ở tiểu học, học sinh chưa được làm quen
với khái niệm thuật toán Do vậy khi học lập trình cái khó khăn ban đầu của học sinh chính là tìm thuật toán để giải bài toán đã cho.
• Một học sinh muốn tiến sâu, tiến xa trong
tương lai phải có tư duy thuật toán tốt.
Trang 6• Làm quen và rèn luyện tư duy thuật toán cho
học sinh mới bắt đầu học lập trình là một yêu cầu thiết yếu
• Không nên vội vàng cho học sinh làm việc
trên máy tính luôn khi mới bắt đầu học
Trang 9Ví dụ: Kiểm tra số n có nguyên tố?
Phương án thô:
Nhập n
Có ước Thực sự
n
N không NT
N là sô NT
+ -
BĐ
KT
Trang 10
+
Trang 11
-• Phương án mịn 2:
• Duyệt nếu có ước trong khoảng từ
• 2 đến căn n thì n không phải NT
+ -
+
Trang 124 Giải một bài, gợi ý nhiều bài
• Có nhiều bài toán tuy phát biểu khác nhau
nhưng cùng thuật toán, cùng cách giải
• Khi ra và hướng dẫn HSG giải một bài tập,
phải chỉ cho họ biết nhiều bài toán khác có các giải hoàn toàn tương tự
Trang 13+ Khởi tạo giá trị ban đầu
+ Duyệt, lưu lại giá trị tối ưu hơn
Trang 14Cho học sinh đề xuất các bài toán tương tự
và cách giải: Cho dãy số nguyên ai
+ Tìm ai mà tổng chữ số của nó là lớn nhất.+ Tìm số nguyên tố lớn nhất trong dãy
+ Tìm số ai có nhiều chữ số nhất
+ Tìm 3 số liên tiếp có tổng lớn nhất…
+ Tìm 2 chỉ số i≠ j để ai+aj max
+ Tìm đoạn nhiều nhất các số liên tiếp bằng nhau
+ Tìm đoạn các số liên tiếp mà tổng max
Trang 15II Rèn luyện phong cách lập trình.
.
CHƯƠNG TRÌNH=TT+CTDL+NTLT
Trang 16• Tuân theo các quy chuẩn, các quy ước
• Cách trình bày rõ ràng, sáng sủa nổi bật
được cấu trúc logic của chương trình
• Người dùng dễ đọc, dễ hiểu nó.
Trang 17Lợi ích của việc trình bày cẩn thận:
• Thể hiện tốt cấu trúc lôgic của mã lệnh
• Cải thiện khả năng đọc
• Bảo đảm sự chính xác trong các thay đổi
• Các lợi ích hệ quả của các lợi ích trên
+ Chương trình ít mắc lỗi và dễ sửa
chữa khi mắc lỗi.
+ Tăng khả năng làm việc theo nhóm,
Trang 181 Quy ước về cách đặt tên cho các
định danh.
a) Đặt tên cho biến
• Tên biến nên thể hiện được ý nghĩa: thông
thường các biến nguyên như i, j, k, n dùng làm biến lặp; x, y dùng làm biến tọa độ…
• Biến lưu trữ nên đặt tên gợi nhớ
Trang 19b) Đặt tên hằng: Tất cả các ký tự nên viết hoa.
Ví dụ: Const MAXN = 10000;
INPUT = ‘Baitap.inp’;
OUTPUT = ‘Baitap.out’;
c) Đặt tên cho chương trình con:
Tên chương trình con thường bắt đầu bằng chữ hoa Vì chương trình con thường thực hiện một chức năng nào đó nên tên hay bắt đầu bằng động từ
Trang 202 Phong cách viết mã nguồn
a) Trình bày tổng thể chương trình :
• Chương trình nên tách thành nhiều đơn
thể, mỗi đơn thể thực hiện một công việc, (chương trình con)
• Nên sử dụng các tham số khi truyền thông
tin cho các chương trình con Tránh sử
dụng các biến toàn cục để truyền thông tin
Trang 21• Cách trình bày chương trình phải nhất
quán dễ đọc, dễ hiểu
• Tính đơn giản, rõ ràng.
• Văn bản chương trình không trườn ra khỏi
màn hình
• Thứ tự: khai báo đơn vị, khai báo
hằng, khai báo kiểu, khai báo biến toàn cục, khai báo chương trình con
• Không nên sử dụng Goto vì sẽ phá vỡ tính
tuần tự khi thực hiện chương trình
Trang 22• Sử dụng tab để canh lề chương trình
(các lệnh ngang cấp thì phải tab vào như nhau): Điều này sẽ giúp chương trình rõ ràng và dễ quản lý
Trang 27e) Dùng biến, chú thích
• Biến chạy i, j…phải dùng biến địa phương
• Cách đặt tên biến phải gợi nhớ,
• Viết chú thích cho chương trình: Biến, hàm khi
định nghĩa nên viết chú thích ý nghĩa Chú
thích ngắn gọn nhưng đầy đủ và dễ hiểu.
{ đếm số cách thực hiện}
• Procedure Try( i: Integer); {Tìm từ
I }
Trang 283 Tối ưu sự thực thi mã
Trang 30bkt := False;
Break;
Trang 31Nhiều kết quả xử lý ngay khi
• s := s+a[i];
• end;
Trang 334 Kiểm nghiệm chương trình với các bộ test đầy đủ nhất.
• Test đầu bài,
• Các test đơn giản
• Test các trường hợp đặc biệt.
• Test lớn
Trang 34II Các dạng toán bồi dưỡng
HSG THCS
• Nhóm các bài toán số học:
• Nhóm các bài toán thao tác trên mảng
• Nhóm các bài toán xử lý xâu .
• Các bài toán khác.
Trang 351 Các bài toán số học .
• Để giải các bài toán về số học giáo viên
cần cho học sình ứng dụng nhuần nhuyễn các kiến thức số học ở THCS chủ yếu dựa vào 2 phép toán DIV, MOD
Trang 36Thuật toán tìm UCLN
• Cho 2 số nguyên m, n>0 UCLN(m,n)=?
Trang 37• Thuật toán 2: (Đối với HSG nên hướng các
em sử dụng thuật toán này)
Trang 38• So sánh 2 thuật toán:
• Với m=1000000000, n=1
• Thuật toán 1 thực hiện 1000000000 thao
tác mới cho UCLN=1
• Thuật toán 2 chỉ thực hiện 3 thao tác đã
cho UCLN=1
Trang 39Hàm kiểm tra số nguyên tố.
• FUNCTION Ngto(P:Integer): Boolean;
• Var NT: Boolean; I: integer;
Trang 42Bài 2 Rút gọn phân số.
• Đề bài: Cho phân số a/ b
(a, b nguyên, b>0) Tìm c, d nguyên (d>0) sao cho c/ d tối giản và a/b=c/d
• + Thuật toán:
• Dau:=1; If a<0 then dau:=-1 ; a:=abs(a);
• c:=a div UCLN(a,b);
• d:=b div UCLN(a, b);
• Writeln(dau*c,’/ ‘, d);
Trang 43Bài 3 Giai thừa.
• Cho số tự nhiên n P=n! Hỏi:
• a/ P có bao nhiêu chữ số không tận cùng.
• b/ Số khác 0 tận cùng của P là chứ số
nào
Trang 44?
Trang 45a/ Số chữ số 0 cuối cùng chính là số ước
bằng 10 của P! mà p!=a.10k=a.2k.5k
• Do số ước 2 nhiều hơn ước 5, nên số 0
tận cùng là số ước 5 của P Vậy ta cần
tính số lượng ước 5 của P !
Trang 46?
?
Trang 48• b) Câu này dễ mắc sai lầm vừa nhân vừa
xóa 0 cuối và chỉ giữ lại chữ số khác 0
cuối cùng
+ Thuật toán:
• - Xóa hết ước 2 (số lượng S2) và ước 5
(số lượng S5) Gọi k=S2-S5
• - Nhân các số còn lại được số p (các phép
toán chỉ giữ chữ số cuối)
• Tính a=2k a*p là đáp số
Trang 51• Thuật toán :
• + Lập hàm TongCS(K) để tính tổng các
chữ số trong K
• + Dùng mảng a[0], a[1],…,a[9], trong đó
a[i] số lần xuất hiện của chữ số i:
• + Khởi tạo
• Nhập n;
• Sum:=0; fillchar(a, sizeof(a),0);
Trang 53• Anh / Chị hãy phát biểu một bài
toán có cùng các giải.
Trang 54Bài 5 Số siêu nguyên tố
Đề bà i :Số P gọi lầ số siêu nguyên tố, nếu
nó nguyên tố và khi ta lần lượt bỏ các chữ
số ở hàng đơn vị từ tái qua phải thì số mới
nhận được vẫn là một số nguyên tố.
• Ví dụ: 239 là số siêu nguyên tố vì 239 là số
nguyên tố và 23, 2 cũng là các số nguyên tố , còn 431 không phải là số siêu nguyên tố Cho một số n (0<n<10) Hãy đếm số lượng
Trang 55???
Trang 56• Phương án 1: Duyệt toàn bộ:
+ Tìm số nhỏ nhất lớn nhất có n chữ số
Chẳng hạn với n=3 thì số nhỏ nhất và lớn nhất có 3 chữ số là: n1=100 và n2=999
+ Dùng một biến chạy p:
For p:= n1 to n2 do
If p thỏa mãn then tăng biến đếm
+ Thuật toán này cũng được 40 % số test
Trang 57Suy nghĩ thêm về ví dụ:
+ Khi n=1 thì các số 2, 3 , 5, 7 là số nguyên
tố => có 4 số siêu nguyên tố có 1 chữ số+ Khi n=2 thì có các số siêu nguyên tố có 2 chữ số: 23, 29, 31, 37, 53, 59, 71, 73, 79
Do đó xuất phát từ số siêu nguyên tố có 1
Trang 59Begin if NT(a[k]*10+c[g]) then
Begin inc(tg); b[tg]:= NT(a[k]*10+c[g]) End
End;
a:=b;Slg:=tg; tg:=0;
Until scs=n.
Trang 60• Anh/Chị hãy phát biểu một bài
toán mà có thể áp dụng thuật
toán vừa trình bày
Trang 61• Ta có thể nêu các bài toán tương tự sau:
• Số n gọi là số SNT phải nếu n là NT và khi
ta lần lượt bỏ đi các chữ số bên trái thì số còn lại vẫn là một số nguyên tố
Vd: n=317 là SNT phải vì 317 , 17 , 7 là
các số NT
Yêu cầu cho N đếm số lượng SNT phải có
N chữ số
• Gọi số SNT như trong bài 5 là số SNT trái,
còn N gọi là SNT nếu nó vừa siêu NT trái vừa SNT phải Tính số lượng các SNT có
Trang 62• Kiểm tra tinh đơn điệu của dãy.
• Tìm kiếm trên dãy…
Trang 63Bài 1 Tìm tổng max
Đề bài: Cho dãy n số nguyên dương a1, a2,
…an Hãy tìm 2 số ai, aj, sao cho i≠j và
ai+aj đạt max
Trang 64???
Trang 65• Thuật toán 1: Duyệt toàn bộ:
+ Max:=a1+a2;// Khởi tạo giá trị ban đầu
+ For i:=1 to n-1 do
For j:=i+1 to n do
If Max<ai+ aj then Max:=ai+aj //Cập nhật
Thuật toán này có độ phức tạp O(n2)
• Khi n=10000, thuật toán không hiệu quả
Trang 67Tốt hơn được không?
???
Trang 69?
Trang 70• Thuật toán 4 (Xử lý luôn khi đọc dữ liệu)
• +Readl(f,n) {n >1}; Read (f, a,b);
• {gọi max1, max2 là số lớn và bé trong a,b}
• +If a>b then Begin max1:=a; max2:=b End
• Else Begin max1:=b; max2:=a End
• + For i:=3 to n do
• Begin
• Read(f, c);
• If c>= max1 then
• Begin max2:=max1; max1:=c End
• Else If c>= max2 then max2:=c;
Trang 71Anh /Chị hãy phát biểu bài toán tương tự …và trình bày thuật
toán giải nó.
.
Trang 72Bài toán cho tổng 3 số.
Tìm tổng max của ai+ aj + ak (I, j, k khác nhau)
Cho hs trình bày các thuật toán tương tự
và đánh giá hiệu quả các thuật toán
Trang 73Bài 2 Dãy đối xứng
• Ví dụ: Dãy 1 2 1 2 2 thì cần thêm 1 2 1
Trang 74?
Trang 75• Phân tích:
• Số phần tử thêm vào ít nhất nếu đoạn sau
cùng tạo thành đoạn đối xứng là lớn nhất
+ Tìm I nhỏ nhất sao cho ai, ai+1,…, an đx
+ Thêm tiếp vào phía sau: ai-1 ai-2,…a1
Trang 77Bài 3 Bao nhiêu điểm
• Đề bài:
• Trong một cuộc thi đấu thể thao n người tham
gia Người thứ I có điểm là ai Biết rằng có đủ các giải nhất ,nhì, ba và những người có điểm ngang nhau có giải như nhau và ngược lại An được giảI 3 Hỏi số điểm của An là bao nhiêu.
• Ví dụ: Input n=6, a: 10 9 1 7 3 10 7
• Output: 7
•
•
Trang 78?
Trang 80• Có thuật toán tốt hơn ?.
+ Tìm max1 (O(n))
+ Tìm max2< max1 (O(n))
+ Tìm max3< max2 (O(n))
Trang 81
Hãy phát biểu mở
rộng bài toán!
Trang 82• Bài toán tổng quát:
• Cho dãy n các số nguyên dương Biết
rằng trong dãy tồn tại k giá trị khác nhau
• Hỏi khi sắp theo thứ tự giảm dần thì phần
tử lớn thứ k bằng bao nhiêu? (k=3 là
trường hợp bài toán trên)
Trang 83Bài 4 Dãy số Fibonacci
• Đề bài Cho dãy sô Fibonacci 1, 1, 2, 3,
5….Ta thành lập dãy số mới bằng cách lần
lượt thay mỗi số hạng bằng số dư của số hạng
đó khi chia cho 100.
• 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233
• Dãy số mới nhận được sau khi thay là:
• 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 44, 33
• Số hạng thứ n trong dãy mới là số nào?
• Có bao nhiêu giá trị khác nhau trong dãy số
mới?
Trang 84???
Trang 85Thuật toán (lùa bò vào chuồng)
• +Dùng mảng : a[0], a[1], a[2],…, a[99];
• A[i]=0 nếu I không xuất hiện trong dãy rút gọn),
a[i]=1 nếu I xuất hiện trong dãy.
+ If (n=1) or (n=2) then writeln (1,’ ‘, 1);
Else Begin a:=1; b:=1; d:=2;
Repeat Inc(d);
I c:=(a+b) mod 100; a:=b;b: =c;
If a[c] =0 then a[c]:=1;
Until d=n;
End; {In ra C, a[0]+a[1]+…+a[99]}
Trang 865 Dãy tăng
• Cho một dãy các số nguyên a1, a2, …an.
• Yêu cầu: Hãy cho biết:
• a) Dãy có tăng hay giảm?
• b) Tìm một đoạn dài nhất các phần tử liên
tục tăng
• c) Tìm một đoạn dài nhất các phần tử liên
tục giống nhau
Trang 876 Tìm UCLN, BCNN của dãy
Đề bài: Cho dãy số nguyên dương a1, a2, ,
an Hãy tìm UCLN, BCNN của dãy
Trang 883 Nhóm các bài toán xử lý xâu
• Để giải các bài toán về xâu cần cho học
sinh nắm vững các hàm, thủ tục xử lý xâu như hàm COPY(), LENGTH(), INSERT(), STR() , VAL()…
Trang 89Bài 1 Tìm số (Đề thi HSG Hà nội 2011)
Đề bài:
• Cho một xâu S, trong đó có chứa một số cụm
số Không có quá 6 chữ số liên tuc trong S.
• Hãy tìm xâu con của S, biểu diễn một số
nguyên tố lớn nhất.
• Ví dụ S = ‘tesst1234#password5426’ Số
cần tìm là 23.
•
Trang 90???
Trang 91• Thuật toán 1: Giả sử xâu đã cho là S,
• + Tạo mảng so[1], so[2],,,lần lượt copy
được từ các cụm số trong S
• +Với mỗi s[i] dùng 2 biến chạy l, r để tách
ra một xâu con của so[i] từ vị trí l đến vị trí
j và lưu lại số NT max trong so[i] rồi số
sánh với các số nguyên tố trong so[j]
khác
Trang 92• Ví dụ S = ‘tesst1234#password5426’
• So[1]=234; So[2]=5426;
• Số nguyên tố lớn nhất trong So[1] là 23.
• Số nguyên tố lớn nhất trong So[2] là 5
• Vậy đáp số là 23.
Trang 93Thuật toán 2 (không lưu mảng các số)
• Khởi tạo: S:= ‘ ‘+S+ ‘ ‘; SoNgtmax:=-1
• For i:=2 to length(s) do if (S[i] in [0 9]) and
S[i-1] not in [0 9] then begin j:=I; repeat
inc(j) until not S[j] in [0 9] or (j> length(s)); so:=copy(S, I, j-i)
If SoNgtmax< max(so) then
SoNgtmax:=max(so);
End;
{ Function max(so: string[9]): integer, cho số
Trang 94Có bài toán tương tự nào
không?
Trang 95Bài 2 Sắp xếp số
• Cho xâu S chỉ gồm các chữ cái tiếng anh
thường và chữ số Các chữ số kế tiếp nhau
trong S tạo thành một số tự nhiên
Các kí tự khác giữ nguyên thứ tự Giả thiết mỗi xâu con của S có không quá 6 chữ số liên tục.
Output:t0a46ui148t994x
Trang 96• Thuật toán: S= t994a0046ui00t148x
• + Tách số và chèn dấu * vào vị trí số:
so[1]=994, so[2]=0046, s0[3]=00, so[4]= 148
S=t*a*ui*t*x
+ Chuẩn và sắp sếp tăng:
so[1]=0, so[2]=46, so[3]=148, so[4]= 994
+ Lần lượt thay dấu * bởi so[1], so[2],…
Trang 97• ?Anh / chi hãy phát biểu vài bài toán có
cùng các giải.
Trang 983 Mật khẩu
Cho trước một xâu S bao gồm chữ cái hoa,
chữ cái thường và chữ số
• Yêu cầu:
• Chọn một xâu con (gồm các ký tự liên tục)
của S có độ dài ngắn nhất sao cho xâu con vừa chọn có thể dùng làm một mật khẩu an toàn
• ( nghĩa là trong xâu con đó có đủ 3 loại chữ cái
in, chữ cái thường , chữ số và đô dài mk ≥ 6)
Trang 99Thuật toán
• Đây là bài toán đơn giản:
• Luui:=1; luuj:=length(s)
• For i:=1 to length(s)-5 do
• For j:=i+5 to length(s) do
• Begin x:=copy(s,I, j-i+1);
• If OK(x) then if j-i+1=6 then
• begin luui:=i; luuj:=j Break; End
• else Capnhat( luui, luuj)
Trang 100• ?Anh/ Chi hãy phát biểu bài toán mới!
Trang 101• Yêu cầu : Hãy tô một số hạt màu trắng thành
màu B, R, hoặc Y để trên vòng xuyến có số hạt cùng màu là nhiều nhất
• Ví dụ S=WRBBBWWYYRWRW Ta tô W-> R
• khi đó S=RRBBRRYYRRRR Đ/s 6
Trang 102Thuật toán
• + Nhân đôi S:=S+S;
• + Bước1: Tô tất hạt W thành B Tìm đoạn
dài nhất các phần tử màu B liên tục (S1)
Trang 103• Tóm tắt:
Khi bắt đầu giảng dạy môn thuật toán và lập trình cho học sinh THCS, GV cần :
• Rèn luyện tư duy thuật toán tốt cho HS
• Rèn luyện cách trình bày một chương
trình.
• Rèn luyện tính sáng tạo, chặt chẽ, tối ưu.
Trang 104Chúc anh/chị có nhiều
sáng tạo trong giảng