intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

SKKN: Rèn luyện kĩ năng sử dụng cấu trúc lặp trong lập trình Pascal cho học sinh lớp 11

Chia sẻ: Trần Thị Ta | Ngày: | Loại File: DOCX | Số trang:37

137
lượt xem
11
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Đề tài “Rèn luyện kĩ năng sử dụng cấu trúc lặp trong lập trình Pascal cho học sinh lớp 11” nhằm cung cấp cho học sinh những kiến thức khái quát hơn về cấu trúc lặp và rèn luyện kỹ năng lập trình cho học sinh thông qua một số bài toán cụ thể.

Chủ đề:
Lưu

Nội dung Text: SKKN: Rèn luyện kĩ năng sử dụng cấu trúc lặp trong lập trình Pascal cho học sinh lớp 11

  1. Trang 1   
  2.                                                  DANH MỤC CÁC CHỮ VIẾT TẮT 1.        THPT: Trung học phổ thông  2.        HSG: Học sinh giỏi  3.        HS: Học sinh  4.        SKKN: Sáng kiến kinh nghiệm  5.       NXB: Nhà xuất bản 6.        SGK: Sách giáo khoa Trang 2   
  3. MỤC LỤC Trang 3
  4. BÁO CÁO KẾT QUẢ  NGHIÊN CỨU, ỨNG DỤNG SÁNG KIẾN  1. LỜI GIỚI THIỆU  Một trong những yếu tố  quan trọng và không thể  thiếu của một trương trình là  “việc điều khiển”, cụ thể là các cấu trúc điều khiển, cũng là thành tố kết hợp đồng   thời giữa dữ liệu và tác vụ. Cấu trúc điều khiển là một trong các đặc trưng cơ bản  của phương pháp lập trình cấu trúc. Trong đó người ta sử  dụng ba cấu trúc điều  khiển để tạo nên logic của chương trình. Mọi vấn đề về logic đều được giải quyết  bằng cách sử dụng linh hoạt ba cấu trúc điều khiển là: Cấu trúc tuần tự Cấu trúc rẽ nhánh Cấu trúc lặp Trong chương trình tin học lớp 11, các em học sinh đã được làm quen với lập trình   có cấu trúc trong đó có cấu trúc lặp nhưng trong quá trình học tập và rèn luyện học   sinh vẫn gặp phải một số khó khăn trong lập trình, chưa biết cách tối ưu hóa thuật  toán, thậm chí còn mắc sai lầm khi lập trình giải các bài toán có sử  dụng cấu trúc  lặp. Vì những lý do trên tôi chọn đề  tài “Rèn luyện kĩ năng sử  dụng cấu trúc lặp   trong lập trình Pascal cho học sinh lớp 11” nhằm cung cấp cho học sinh những kiến   thức khái quát hơn về  cấu trúc lặp và rèn luyện kỹ  năng lập trình cho học sinh   thông qua một số bài toán cụ thể.  2. TÊN SÁNG KIẾN  “Rèn luyện kĩ năng sử dụng cấu trúc lặp trong lập trình Pascal cho học sinh lớp   11”  3. TÁC GIẢ SÁNG KIẾN ­ Họ tên: Nguyễn Thị Nụ ­ Địa chỉ: Trường THPT Yên Lạc 2 – Huyện Yên Lạc – Tỉnh Vĩnh Phúc ­ Số điện thoại: 0965170380 ­ E_mail: nunguyen1101@gmail.com 4. CHỦ ĐẦU TƯ SÁNG TẠO RA SÁNG KIẾN ­ Họ tên: Nguyễn Thị Nụ ­ Trình độ chuyên môn: Cử nhân Tin Học ­ Đơn vị công tác: Trường THPT Yên Lạc 2 – Huyện Yên Lạc – Tỉnh Vĩnh Phúc Trang 4   
  5. 5. LĨNH VỰC ÁP DỤNG SÁNG KIẾN  Rèn luyện kĩ năng sử dụng cấu trúc lặp trong lập trình Pascal giảng dạy môn   Tin học lớp 11 và bồi dưỡng học sinh tham gia kì thi chọn học sinh giỏi các cấp   môn Tin học.  6. NGÀY SÁNG KIẾN ĐƯỢC ÁP DỤNG  Từ ngày 01/08/2019  7. MÔ TẢ BẢN CHẤT CỦA SÁNG KIẾN  7.1. Tổng quan các vấn đề nghiên cứu  7.1.1. Mục đích nghiên cứu  Góp phần đổi mới phương pháp dạy học sinh giỏi môn Tin học theo hướng  phát huy tính tích cực, chủ động và sáng tạo của học sinh giúp học sinh tiếp thu tri   thức một cách có hiệu quả.  Góp phần gây hứng thú học tập môn Tin học cho học sinh tham gia thi chọn   học sinh giỏi, tránh việc học thụ động, học vẹt. Giúp học sinh lĩnh hội tri thức một  cách khoa học, củng cố và khắc sâu kiến thức.  Qua đề  tài này tôi mong muốn cung cấp cho học sinh một những vấn đề  mà  các em đang gặp phải về kĩ năng sử dụng cấu trúc lặp trong khi lập trình giúp các   em chủ động hơn trong học tập, tích luỹ kiến thức, kỹ năng lập trình.  7.1.2. Bản chất đối tượng nghiên cứu  Đưa ra hệ thống lý thuyết về cấu trúc lặp và ứng dụng cấu trúc lặp giải các   bài tập trong ngôn ngữ  lập trình Pascal giúp học sinh lĩnh hội tri thức, giúp các em   tích cực, chủ động tích lũy kiến thức. Qua đó, học sinh phát triển được tư duy logic  thông qua hệ thống bài tập giúp các em rèn luyện được tính tự giác, tính kỉ luật, thói  quen tự học đó là những đức tính rèn luyện tốt của học sinh.  7.1.3. Đối tượng, phạm vi nghiên cứu  ­ Đối tượng: Cấu trúc lặp trong lập trình   ­ Phạm vi:  Các vấn đề  về  cấu trúc lặp trong chương trình tin học lập trình trên  ngôn ngữ Pascal.  7.1.4. Phương pháp nghiên cứu  Phương pháp    Nghiên cứu lí luận chung.    Khảo sát điều tra thực tế dạy học.    Tổng hợp đúc rút kinh nghiệm.  Trang 5   
  6. Cách thực hiện    Trao đổi với đồng nghiệp, tham khảo ý kiến giáo viên cùng bộ  môn. Liên hệ  thực tế trong nhà trường, áp dụng và đúc rút kinh nghiệm qua quá trình giảng dạy.  Thông qua việc giảng dạy trực tiếp học sinh lớp 11 và học sinh tham gia thi chọn   học sinh giỏi môn Tin học khối 10 tại trường THPT Yên Lạc 2 năm học 2019 ­2020. 7.1.5. Giới hạn về không gian của phương pháp nghiên cứu  Đề tài được đề cập với đồng nghiệp và thực nghiệm sư phạm qua các em học   sinh lớp 11A2 và các em học sinh tham gia dự kì thi chọn học sinh giỏi môn Tin học   lớp 10 năm học 2019­2020 7.1.6. Phạm vi nghiên cứu  Tôi đã nghiên cứu đề tài này trong suốt quá trình giảng dạy và thực nghiệm đề  tài này trong  năm học 2019­2020. 7.2. Phần nội dung  7.2.1. Cơ sở lý luận  Cấu trúc lặp là là một trong ba cấu trúc cơ bản trong lập trình có cấu trúc. Tuy  nhiên trước một bài toán lập trình tin học có các thao tác lặp đi lặp lại nhiều học  sinh thường lúng túng, không biết nên lựa chọn và sử  dụng câu lệnh lặp nào cho   phù hợp với yêu cầu bài toán và tối ưu hóa thuật toán? Một số học sinh khá, giỏi có  thể sử dụng cấu trúc lặp để mô tả nhưng đa số chưa biết tối ưu hóa thuật toán để  giảm số  lần lặp và điều đó gây tâm lý chán nản cho các em. Với tình hình  ấy để  giúp học sinh có kĩ năng tốt hơn trong việc sử  dụng cấu trúc lặp để  mô tả  thuật  toán, thì người giáo viên cần tăng cường rèn luyện cho học sinh kĩ năng sử   dụng  cấu trúc lặp từ các các bài toán cơ bản quen thuộc mà các em đã biết, khai thác các  yếu tố đặc trưng của một số bài toán cơ bản để tìm thuật toán cho các bài toán mới,   dựa vào đặc điểm cụ thể của từng bài toán để tối ưu hóa thuật toán. Việc rèn luyện   kĩ năng lập trình cho học sinh từ những bài toán cơ bản để xây dựng thuật toán cho   các bài toán tương tự  hoặc các bài toán mở  rộng từ  các bài toán cơ  bản đó là một   quá trình giúp học sinh rèn luyện kỹ năng lập trình.  7.2.2. Cơ sở thực tiễn  Trường THPT Yên lạc 2 là ngôi trường  ở  vùng nông thôn nằm dưới chân đê  dải sông Hồng nên đa số học sinh chưa có cơ hội, điều kiện tiếp xúc với công nghệ  và máy tính. Vì vậy, tin học là một môn học tương đối lạ  lẫm và khó đối với học   sinh trường tôi. Đặc biệt là chương trình tin học 11, với các em học lập trình còn   khó hơn học toán, lí, hóa, .. vì điều kiện cơ  sở  vật chất của trường còn nhiều khó  khăn, học sinh chỉ  học chính khóa trên lớp về  nhà lại không có máy tính để  thực  Trang 6   
  7. hành. Điều này dẫn đến ý thức tự  giác của học sinh chưa cao, đặc biệt là các em   học để  thi học sinh giỏi lại càng khó. Với đội tuyển học sinh giỏi 10, hầu hết các   em đều chưa có bất kì kiến thức cơ bản nào liên quan đến lập trình, gia đình chưa   có máy tính để các em thực hành. Vì vậy giáo viên dạy đội tuyển phải bắt đầu rèn  luyện cho các em từ những câu lệnh cơ bản nhất. Cơ sở trên đã giúp tôi áp dụng đề  tài rèn luyện kĩ năng sử dụng cấu trúc lặp trong lập trình Pascal giảng dạy cho học   sinh khối 11 và áp dụng cho học sinh tham dự kì thi chọn học sinh giỏi Tin học 10  tại trường THPT Yên Lạc 2.  7.2.3. Nội dung cụ thể  Tất cả  các nội dung, các ví dụ, bài tập trong đề  tài này được xây dựng trên   ngôn ngữ lập trình Pascal  8. Lặp Xét 2 bài toán sau đây: Bài toán 1: Tính và đưa kết quả ra màn hình tổng            S = 1+2+3+…+100 Bài toán 2: Tính và đưa kết quả ra màn hình tổng            S = 1+2+3+..+n+… cho đến khi S > 105 Với cả 2 bài toán trên, dễ thấy cách để tính tổng S có nhiều điểm tương tự: Xuất phát, S được gán giá trị 0; Tiếp theo công vào tổng S một giá trị i với i = 1,2,3,4,5,…. Việc cộng này được lặp lại một số lần. Đối với bài toán 1, số  lần lặp là 100 và việc cộng vào tổng S sẽ  kết thúc khi   thực hiện cồn việc 100 lần. Đối với bài toán 2, số lần lặp chưa biết trước nhưng việc cộng vào tổng S sẽ  kết thúc khi điều kiện S > 105 được thỏa mãn. Nói chung, ta thấy trong một số thuật toán có những thao tác phải lặp đi lặp lại  nhiều lần. Cấu trúc lặp mô tả thao tác lặp được phân biệt 2 loại là lặp với số lần   biết trước và lặp với số lần chưa biết trước. Các ngôn ngữ lập trình đều có các câu lệnh để mô tả cấu trúc lặp. 9. Lặp với số lần biết trước và câu lệnh FOR – DO 10. Cú pháp và hoạt động của câu lệnh For – do Có 2 thuật toán tong1a và tong1b để giải bài toán 1 như sau: Thuật toán tong1a Bước 1: S ← 0; i ← 0; Trang 7   
  8. Bước 2: i ← i+1; Bước 3: Nếu i  100 thì chuyển đến bước 5; Bước 4: S ← S+i rồi quay lại bước 2; Bước 5: Đưa S ra màn hình rồi kết thúc. Trong thuật toán tong1a, giá trị i khi bắt đầu tham gia vòng lặp là 1 và sau mỗi lần   lặp i tăng lên 1 đơn vị cho đến khi i > 100 thì kết thúc lặp (thực hiện 100 lần). Trong   thuật toán tong1b giá trị  i khi bắt đầu tham gia vòng lặp là 100 và sau mỗi lần lặp   giảm đi 1 cho đến khi i 
  9. + Giá trị  biến đếm được điều khiển tự  động vì vậy câu lệnh sau do không được  thay đổi giá trị biến đếm; + Không giống với các ngôn ngữ khác pascal không kiểm tra   >  trong câu lệnh for –to­do để  kết thúc vòng lặp mà kiểm tra   =    để  thực hiện lần lặp cuối cùng. Vì lẽ  đó việc can thiệp vào biến   đếm có thể gây ra sự cố “vòng lặp vô tận”. Ngay cả khi biến đã duyệt hết phạm vi   của kiể  dữ  liệu thì biến lại quay lại giá trị  0 và mọi thứ  lại tiếp tục… trừ  khi gõ   CTRL+ Break; + Trong câu lệnh for  ,  được tính  từ khi bắt đầu vòng  lặp để tính số  lần lặp, nên trong vòng lặp dù có câu lệnh thay đổi  ,    thì số lần lặp vẫn không thay đổi. Sử  dụng cấu trúc lặp dạng tiến và dạng lùi như  trên để  mô tả  quá trình lặp trong  thuật toán tong1a và tong1b chương trình có thể được cài đặt như sau: Program tong1a; Var S, i: longint; Begin           S:=0;           For i:= 1 to 100 do                          S:= S+i;            Write (‘Tong S la: ‘, S);            Readln; End. Program tong1b; Var S, i: longint; Begin           S:=0;           For i:= 100 downto 1 do                          S:= S+i;            Write (‘Tong S la: ‘, S);            Readln; Trang 9   
  10. End. 11. Một số ví dụ Ví dụ 1:  Viết chương trình in ra các số lẻ nhỏ hơn hoặc bằng n (0
  11. Uses crt; var i, dem: integer; Begin      Clrscr;      dem:=0;      For i:=20 to 100 do                                 if i mod 2 0 then inc(dem);      write(‘Co ‘,dem,’ so le trong doan tu 20 den 100’);      readln end. Ví dụ 3: Viết chương trình đếm xem có bao nhiêu số chẵn, bao nhiêu số lẻ trong khoảng   từ n đến m (0
  12.                                if i mod 2 0 then inc(d_le)                                else inc(d_chan);       Writeln(‘Co ‘,d_chan,’ so chan trong khoang tu ‘,n,’ den ‘,m);     Writeln(‘Co ‘,d_le,’ so le trong khoang tu ‘,n,’ den ‘,m);      readln end. Ví dụ 4: Một số có tổng các ước  thực sự (là các ước không kể chính nó) bằng chính nó   được gọi là số hoàn chỉnh. Ví dụ: Số nguyên 6 có các ước thực sự là 1, 2, 3. Tổng là 1 + 2 + 3 = 6. Viết chương trình xét xem một số  n (n
  13.            readln end. c. Nhận xét Ước lớn nhất của số nguyên N không kể chính nó luôn 
  14. Program Tim_uoc_2; uses crt; Var S, n, i, j: longint; Begin           clrscr;           Write('Nhap so n ='); readln(n);           For i:=1 to n­1 do                                         Begin                                                   S:=0;                                                   For j:=1 to i div 2 do                                                              if i mod j = 0 then S:=S+j;                                                   if S = i then write(i,',  ');                                         end;     readln end. Ví dụ 6:  Viết chương trình xét xem một số n có phải là số nguyên tố không (0
  15. Program Nguyen_to_1; uses crt; var n, i: integer;       ok: boolean; begin          ok:=true;          write('Nhap n: ');readln(n);          for i:= 2 to n­1 do                                         if n mod i = 0 then    ok :=false;          if ok then write(n,' la so nguyen to')          else write(n, ' khong la so nguyen to');          readln end. c. Nhận xét + Ở đây ta sử dụng biến có kiểu logic (Đúng, sai). Chỉ cần một lần n mod i = 0 thì   sau khi thực hiện xong vòng lặp ok có giá trị là false.  + Mọi số nguyên N nếu có ước khác 1 và chính nó thì chắc chắn có ước trong   đoạn từ  2 đến phần nguyên căn bậc 2 của N. Vì vậy thay vì kiểm tra n có chia  hết cho số nào trong đoạn từ 2 đến n ­1 hay không, ta chỉ cần kiểm tra n có chia hết   cho số nào trong đoạn từ 2 đến trunc(sqrt(n)) hay không, việc làm này sẽ giúp giảm  đáng kể số lần lặp, giúp tiết kiệm thời gian thực hiện chương trình.  Giá trị của N Các ước của N ( Khác 1 và N)  Trunc(sqrt(n)) 2 1 3 1 4 2 2 5 2 6 2,  3 2 7 2 8 2,  4 2 Trang 15   
  16. 9 3 3 10 2,  5 3 11 3 12 2,3,  4,6 3 13 3 14 2,  7 3 15 3,  5 3 16 2,4,  8 4 17 4 18 2,  6,9 4 Chương trình trên có thể được viết lại như sau: Program Nguyen_to_2; uses crt; var n, i: integer;       ok: boolean; begin            ok:=true;            write('Nhap n: ');readln(n);            for i:= 2 to trunc(sqrt(n)) do                                                           if n mod i = 0 then ok :=false;             if ok then write(n,' la so nguyen to')             else write(n, ' khong la so nguyen to');             readln end. + Trong chương trình Nguyen_to_2 nếu đã phát hiện n chia hết cho 1 số trong đoạn  từ 2 đến trunc(sqrt(n)) rồi (thuật toán có thể kết thúc và thông báo kết quả) nhưng  vòng lặp vẫn tiếp tục kiểm tra các số  tiếp theo. Điều này làm thời gian thực hiện   chương trình chưa được tối ưu Trang 16   
  17. Để khắc phục nhược điểm này ta sử dụng thủ tục Break, cho phép thoát khỏi vòng  lặp gần nhất chứa nó. Chương trình có thể viết lại: Program Nguyen_to_3; uses crt; var n, i: integer;       ok: boolean; begin          ok:=true;          write('Nhap n: ');readln(n);          for i:= 2 to trunc(sqrt(n)) do                   if n mod i = 0 then begin                                                           ok :=false;                                                          break;                                                  end;          if ok then write(n,' la so nguyen to')          else write(n, ' khong la so nguyen to');         readln end. Ví dụ 7:   Lập trình tính giai thừa của số nguyên n (n
  18.            Writeln(‘Nhap n: ‘);             Readln(n);             gt:=1;             For i:= 1 to n do                                         gt:= gt*1;             Writeln(‘n! = ‘, gt);             Readln End. Ví dụ 8: Dãy số fibonaci được định nghĩa như sau: Viết chương trình in ra số fibonaci thứ n (n 
  19.                                                                         f:=f1+f2;                                                                         f1:=f2;                                                                         f2:=f;                                                             End;                                   Write(‘So fibonaci thu ‘,n,’ la: ‘,f);                           End;            Readln  End. Ví dụ 9: Lập trình tính tổng sau:      (SGK Tin học 11 – Trang 51) a. Ý tưởng Với bài toán trên có thể  sử  dụng cấu trúc lặp với số  lần biết trước dạng tiến  hay lùi đều được. Nếu sử  dụng cấu trúc lặp   For …downto … do   ta có thể  xây  dựng công thức truy hồi để tính giá trị Y như sau:            Với n từ 50 giảm dần về 1 Việc cộng vào tổng Y được lặp lại 50 lần, giá trị n khi tham gia vòng lặp là   50 và sau mỗi lần lặp n giảm đi 1 cho đến khi n =1 thì dừng. Như vậy số lần lặp là   biết trước, biến n được sử dụng là một biến đếm giảm từ 50 về 1, tổng cần tính là  Y0   b. Code tham khảo var     Y: real;           n : integer; begin Y := 0;       for n := 50 downto 1  do                       Y := Y + n/(n+1);      writeln('Tong Y la: ',Y:10:4);      readln; end. Trang 19   
  20.       Tuy nhiên trong một số trường hợp thì chỉ có thể dùng một cấu trúc, đặc biệt là   khi tính các công thức truy hồi. Ta xét một ví dụ dùng for … downto … do thích hợp  hơn: Ví dụ 10: Tính tổng    S =      với n là một số tự nhiên nhập từ bàn phím. a. Ý tưởng Đặt   ta có công thức truy hồi sau:         Tổng cần tính là si. Công thức truy hồi là truy hồi ngược (vì tính si qua si+1) nên  dùng for … down … to là thích hợp nhất.  b. Code tham khảo Var   i,n : integer;     s   : real; begin       write('Nhap mot so tu nhien n = ');       readln(n);         s:=0;       for i := n downto 1 do           s := sqrt (2 * i + s);       writeln('Ket qua can tinh: s = ',s:10:5);       readln; end. 12. Lặp với số lần chưa biết trước 1. Cú pháp và hoạt động của lệnh lặp với số lần chưa biết trước  13. Câu lệnh While – do  Cú pháp:            While  do ; Trong đó: + Điều kiện là biểu thức logic Trang 20   
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2