MỤC LỤC MỞ ĐẦU 1.1 Lý chọn đề tài .2 1.2 Mục đích nghiên cứu 1.3 Đối tượng nghiên cứu 1.4 Phương pháp nghiên cứu Tôi có tham khảo số sách số trang web Internet Tôi thấy người ta tìm hiểu mởrộngphạmvitínhtoánvớisốnguyên đưa bàn luận code chương trìnhchủ yếu ngônngữlậptrình C, C++ Trong sáng kiến kinh nghiệm vận dụng trực tiếp vào ngônngữlậptrình Free Pascal để học sinh có cách nhìn tổng quan dễ hiểu phù hợp vớingônngữlậptrình mà em biết .2 .2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơsở lý luận sáng kiến kinh nghiệm 2.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm 2.3 Các giải pháp sử dụng để giải vấn đề a) Giải thuật cộng: .4 b) Giải thuật trừ: c) Giải thuật nhân: .6 d) Giải thuật chia: 2.4 Hiệu sáng kiến kinh nghiệm hoạt động giáo dục, với thân, đồng nghiệp nhà trường .8 3.1 Kết luận 3.2 Kiến nghị Tài liệu tham khảo 1 MỞ ĐẦU 1.1 Lý chọn đề tài Lậptrình Tin học vấn đề khoa học cótính thực tiễn cao, đòi hỏi người lậptrình lĩnh hội kiến thức học vận dụng kiến thức vào giải toán thực tế “Các Kiểu liệu ngônngữlậptrình nói chung ngônngữlậptrìnhPascal free pascal nói riêng giới hạn phạmvi định…”[1] Khi Test chương trình học sinh thường test test bé nên có cảm giác làm với input test máy với test lớn chương trình đưa kết không Chính vậy, mạnh dạn viết sáng kiến “Mở rộngphạmvitínhtoánngônngữlậptrình Free Pascalvớisốnguyên không âm cónhiềuchữ số” Hy vọng kinh nghiệm góp phần giúp đồng nghiệp em học sinh giỏi cósố thuật giải cộng trừ nhân chia vớisốnguyêncónhiềuchữsố 1.2 Mục đích nghiên cứu Trong sáng kiến kinh nghiệm muốn truyền tải đến thầy cô ôn thi đội tuyển học sinh giỏi cấp em học sinh tham gia câu lạc lậptrình Tin học có thêm số kiến thức kỹ để vận dụng mởrộng khả tínhtoán cho ngônngữlậptrình Free Pascal tập sốnguyên không âm cónhiềuchữsố ứng dụng vào thực tế giải toán khác 1.3 Đối tượng nghiên cứu Đối tượng nghiên cứu chương trình Tin học 11 (trong chương trình giáo dục quốc gia) cách sử dụng ngônngữlậptrìnhPascal để vận dụng vào tínhtoánsốnguyên không âm lớn 1.4 Phương pháp nghiên cứu Trongphạmvi sáng kiến kinh nghiệm Tôi có sử dụng phương pháp sau: - Sử dụng phương pháp nghiên cứu xây dựng sở lý thuyết - Sử dụng phương pháp xử lý liệu 1.5 Những điểm SKKN Tôi có tham khảo số sách số trang web Internet Tôi thấy người ta tìm hiểu mởrộngphạmvitínhtoánvớisốnguyên đưa bàn luận code chương trìnhchủ yếu ngônngữlậptrình C, C+ + Trong sáng kiến kinh nghiệm vận dụng trực tiếp vào ngônngữlậptrình Free Pascal để học sinh có cách nhìn tổng quan dễ hiểu phù hợp vớingônngữlậptrình mà em biết 2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơsở lý luận sáng kiến kinh nghiệm Đối vớilậptrình việc tìm thuật toán cần phải viết chương trình điều khó học sinh trường THPT Khi gặp toán phải tínhtoánvớisốcónhiềuchữsốnhiều em lúng lúng số vượt khỏi phạmvi kiểu liệu mà ngônngữlậptrình cung cấp Chính vậy, việc giải toánvớisố lớn thực cần thiết cho em học sinh giỏi giải toán liên quan đến sốcónhiềuchữsố nói riêng việc giải toán thực tế nói chung Nhiềungônngữlậptrình cung cấp kiểu liệu sốnguyên lớn, chẳng hạn ngônngữlậptrình FreePascal có kiểu số 64 bit (khoảng 19 chữ số) Tuy nhiên để thực phép toánvớisốphạmvi biểu diễn cung cấp (có hàng trăm chí hàng tỷ chữsố chẳng hạn), cần tự thiết kế cách biểu diễn hàm để thực phép toánvớisốnguyêncónhiềuchữ số.[1] 2.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm Trongtrình dạy, giao tập: “Hãy sử dụng ngônngữlậptrìnhPascal FreePascal để tính tổng, hiệu, tích, thương hai sốnguyên a b”[3] Học sinh lậptrìnhtính sau: Khi chạy chương trình ta nhập: máy báo lỗi! Vì lại vậy, ta biết “kiểu sốnguyên lớn (longint) cóphạmvi biểu diễn từ -2147483648 2147483647 (khoảng 10 chữ số)…”[2] Nên nhập sốnguyên b=54564654565456456456 (có 20 chữ số) vượt phạmvi longint Nhiều em học sinh lúng túng cho rằng, ngônngữlậptrìnhPascal giải toáncó phép tính khoảng sốnguyên mà em biết 2.3 Các giải pháp sử dụng để giải vấn đề - Tổ chức lưu trữ số dạng xâu “Độ dài xâu tối đa 255 kí tự…”[2] Vì vậy, xâu lưu trữ sốcó tối đa 255 chữsố Đồng nghĩa với việc ta tínhtoánvớisốcó độ dài tối đa 255 chữsố Ngoài ra, “ngôn ngữlậptrình FreePascal cung cấp thêm kiểu liệu dạng chuỗi (ANSISTRING) tổ chức lưu trữ số lớn gấp nhiều lần sovới kiểu string (bộ nhớ lớn chuỗi dài)…[4] - Sử dụng phép tínhtoán xâu để tính kết Trongtínhtoán cần sử dụng hiệu thủ tục chuyển đổi kí tự kiểu xâu thành số (hàm val) ngược lại từ số thành xâu (hàm str)…[5] - Hiện thị kết dạng xâu (hoặc mảng) Sau số giải thuật cộng, trừ, nhân chia số không âm (các trường hợp lại nói sau): a) Giải thuật cộng: Khi cộng hai sốcónhiềuchữ số, thực từ phải qua trái Với lần cộng, kết cộng với giá trị nhớ lần trước đồng thời xác định giá trị nhớ [6] Cụ thể ta tiến hành bước sau: -Bước 1: Hai số nhập từ bàn phím lưu vào hai biến kiểu xâu st1 st2 -Bước 2: So sánh hai xâu st1 st2 Thêm kí tự ‘0’ vào xâu ngắn để hai xâu có độ dài -Bước 3: Thực phép cộng hai xâu cócó độ dài nhau, cộng từ cuối lên đầu (tương tự cộng số thực từ hàng đơn vị) Các kí tự xâu chuyển thành số (sử dụng thủ tục chuyển đổi) thực phép cộng Kết cộng số chuyển ngược lại thành xâu (h1) -Bước 4: Sử dụng xâu kết (h) lưu trữ kết phép cộng (lưu ý phần nhớ) Trong phần thân chương trình ta cần gọi: Nhận xét: - Chương trình thực việc cộng hai số nhập từ bàn phím - Trong chương trìnhcó sử dụng hàm chương trình FUNCTION CONG(S1,S2:STRING): STRING; để tính kết phép cộng hai xâu s1, s2 - Kết phép cộng lên hình - Ta thay đổi chương trình cách sử dụng tệp để đọc liệu vào ghi kết - Ta mởrộngphạmvitínhtoán tới sốnguyên dương không âm cósố lượng chữsố vượt qua 255 chữsố cách khai báo biến kiểu xâu ANSISTRING b) Giải thuật trừ: Giống cộng, thực từ phải qua trái Với lần trừ, đề phòng chữsốsố bị trừ nhỏ nên ta vay tạm chục Nếu lần trước vay lần phải trừ Nhưng đáng vay kết sau trừ bé 10, lớn 10 vay [6] Các bước tiến hành sau: -Bước 1: Nhập hai số từ bàn phím lưu vào hai biến xâu st1, st2 -Bước 2: So sánh hai xâu st1 st2 Thêm kí tự ‘0’ vào xâu ngắn để hai xâu có độ dài -Bước 3: So sánh hai xâu st1, st2 độ dài + Nếu xâu lưu số bị trừ lớn xâu lưu số trừ Thực phép trừ hai xâu từ cuối lên đầu (tương tự phép trừ toán học) Sử dụng thủ tục chuyển đổi xâu thành sốtrìnhtínhtoán + Nếu xâu lưu số bị trừ bé xâu lưu số trừ thực đặt dấu trừ (-) vào phần đầu kết quả, đồng thời thực hoán đổi hai xâu cho thực phép trừ tương tự -Bước 4: Phép trừ thực sau: + Các kí tự sâu St1 chuyển thành số lưu vào mảng h1 + Các kí tự sâu St2 chuyển thành số lưu vào mảng h2 + Thực phép trừ hai mảng h1 h2 (lưu ý trương hợp số bị trừ bé số trừ) Nếu h1[i]=h2[i] c[i]:=h1[i]-h2[i]; -Bước 5: Mảng C thu kết Qua đó, ta viết thành chương trình sau: Nhận xét: - Chương trình thực phép trừ hai số lớn lớn nhập từ bàn phím với biến kiểu xâu khai báo ANSISTRING Hiệu hai số hiển thị hình Cần ý tới phần dấu phép trừ (nếu số bị trừ bé số trừ ghi vào kết dấu -) c) Giải thuật nhân: Thông thường, nhân a với b, thực từ phải qua trái Mỗi lần nhân chữsố b vớisố a đặt kết dịch sang trái chữsố Nhưng lần lại nhân chữsố a vớichữsố nói b Cũng phép cộng, kết phụ thuộc việc nhớ lần nhân trước xác định giá trị nhớ Việc nhận thực từ trái qua phải [6] Quá trình làm tiến hành qua bước sau: -Bước 1: Nhập hai số lưu dạng hai biến xâu s1, s2 -Bước 2: Sử dụng mảng C lưu kết phép nhân hai xâu s1, s2 (các kí tự xâu chuyển đối thành sốtính toán) L1:=length(s1); L2:=length(s2); For i:=1 to L1 For j:=1 to L2 Begin val(s1[i],A,code); val(s2[j],B,code); c[i+j]:=c[i+j]+a*b; End; -Bước 3: Xử lý mảng kết quả: For i:=L1+L2 downto Begin c[i-1]:=c[i-1] + c[i] Div 10; c[i]:=c[i] Mod 10; End; Sau chương trình: Nhận xét: - Chương trình thực phép nhân hai số lớn nhập từ bàn phím Kết phép nhân hiển thị hình - Khi sử dụng mảng để lưu kết phép nhân, độ dài mảng kết lớn tổng độ dài hai số (xâu) - Ta thay đổi kiểu liệu cho biến kiểu xâu thành ANSISTRING để nhân sốnguyên dương không âm lớn 255 chữsố d) Giải thuật chia: Để chia số a cho số b ta tiến hành qua bước sau: -Bước1: Dùng xâu a b chứa chữsốsố bị chia số chia (các mảng cósố phần tử tương ứng n m), dùng xâu c để chứa kết -Bước 2: Lấy m phần tử đầu chuỗi a chuỗi a1, đem số chia cho chuỗi b, số lớn nên dùng vòng for để lặp từ đến 10, i = 9, mà i*b > a1 thương i-1 số dư t1 = a1 -b*(i-1) -Bước 3: Cósố dư t1 từ bước 2, tiếp túc lấy t1*10+ số thứ m+1 chuỗi a ban đầu để số chia a2, lại dùng vòng for để lặp lại tính đc số dư t2, tiếp tục đến đến phần tử n chuỗi a dừng Có thể tiếp tục muốn lấy số thập phân Như ta xây dựng hàm chương trình dùng để chia sốnguyên lớn dựa vào kết hai hàm cộng trừ trên: Nhận xét: - Kết phép chia ta phần nguyên - Trong chương trình ta sử dụng lời gọi chương trình cộng trừ sốnguyên lớn (cong(kb[i-1],b) tru(hold,kb[k-1])) - Muốn lấy kết phần dư ta sửa chương trình trên….[1] thành sau: 2.4 Hiệu sáng kiến kinh nghiệm hoạt động giáo dục, với thân, đồng nghiệp nhà trường - Thông qua sáng kiến kinh nghiệm học sinh thực phép toán cộng trừ nhân chia vớisốnguyên dương không âm vượt phạmvi biểu diễn kiểu liệu mà ngônngữlậptrình cung cấp - Sáng kiến kinh nghiệm giúp học sinh thầy cô giáo có thêm giải thuật để cộng trừ nhân chia vớisốnguyên lớn cách sử dụng kiến thức học mảng chiều xâu ký tự - Qua giải thuật sáng kiến kinh nghiệm thầy cô em học sinh phát triển để cộng trừ nhân chia cho sốnguyên cho số thực lớn.[4] - Sáng kiến kinh nghiệm góp phần giúp thầy cô giáo môn nhà trường có thêm tài liệu để ôn cho học sinh giỏi cấp trường, tỉnh,… Đồng thời, giúp học sinh khắc sâu kiến thức vận dụng kiến thức mảng chiều xâu ký tự học vào giải toán khác KẾT LUẬN 3.1 Kết luận Đề tài mang tính thực tiễn cao Các em sử dụng kiến thức lậptrình để giải toán thực tế thường gặp, toántínhtoánvớisố lớn Kết cónhiều em dễ dàng vận dụng kiến thức để giải toánlặp giáo viên đặt Trong khuôn khổ sáng kiến kinh nghiệm này, trình bày thuật toán code chương trình cho phép toán cộng trừ nhân chia vớisốnguyên dương không âm Còn vớisốnguyên khác trình bày sáng kiến kinh nghiệm lần sau 3.2 Kiến nghị - Đề nghị cấp lãnh đạo quan tâm đạo sát để tạo điều kiện cho môn tin học nói chung môn tin học 11 nói riêng phát triển lên tầm cao XÁC NHẬN CỦA THỦ TRƯỞNG ĐƠN VỊ Thanh Hóa, ngày 11 tháng 04 năm 2017 Tôi xin cam đoan SKKN viết, không chép nội dung người khác (Ký ghi rõ họ tên) Nguyễn Văn Thủy Lê Văn Như TÀI LIỆU THAM KHẢO Tài liệu giáo khoa chuyên tin 1, Hồ Sĩ Đàm (chủ biên )- Đỗ Đức ĐôngLê Minh Hoàng-Nguyễn Thanh Hùng, Nhà xuất giáo dục Việt Nam, năm 2009 Tin học 11, Hồ Sĩ Đàm (chủ biên)- Nguyễn Thanh Tùng, Nhà xuất giáo dục Việt Nam, năm 2014 Bài tập Tin học 11, Hồ Sĩ Đàm (chủ biên)-Hồ Cẩm Hà-Trần Đỗ HùngNguyễn Đức Nghĩa-Nguyễn Thanh Tùng- Ngô Ánh Tuyết, Nhà xuất giáo dục Việt Nam, năm 2014 Phương pháp giải toán tin học, ThS Trần Đức Huyên, Nhà xuất Hà Nội (xuất lần 5), năm 2003 Giáo trình lý thuyết tập Pascal - Toàn tập : Ấn dành cho sinh viên, Nguyễn Đình Tê(Chủ Biên)- Hoàng Đức Hải, Nhà xuất Lao động xã hội, năm 2004 Nguồn từ Internet: - Thao tác vớisốnguyên lớn-trình bày thuật toán cách thực hiện, Donvuon, 2010, mã nguồn: http://diendan.congdongcviet.com/threads/t31199::thao-tac-songuyen-lon-trinh-bay-thuat-toan-cach-thuc-hien.cpp 10 ... máy với test lớn chương trình đưa kết không Chính vậy, mạnh dạn vi t sáng kiến Mở rộng phạm vi tính toán ngôn ngữ lập trình Free Pascal với số nguyên không âm có nhiều chữ số Hy vọng kinh nghiệm... câu lạc lập trình Tin học có thêm số kiến thức kỹ để vận dụng mở rộng khả tính toán cho ngôn ngữ lập trình Free Pascal tập số nguyên không âm có nhiều chữ số ứng dụng vào thực tế giải toán khác... hiểu mở rộng phạm vi tính toán với số nguyên đưa bàn luận code chương trình chủ yếu ngôn ngữ lập trình C, C+ + Trong sáng kiến kinh nghiệm vận dụng trực tiếp vào ngôn ngữ lập trình Free Pascal