1. Trang chủ
  2. » Giáo án - Bài giảng

Mở rộng phạm vi tính toán trong ngôn ngữ lập trình pascal với số nguyên có nhiều chữ số

10 413 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 201,5 KB

Nội dung

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 tham khảo số sách số trang web Internet Tôi thấy người ta tìm 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 để học sinh cách nhìn tổng quan dễ hiểu phù hợp với ngôn ngữ lập trình mà em biết .2 .2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 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ập trình Tin học vấn đề khoa học tính thực tiễn cao, đòi hỏi người lập trì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ôn ngữ lập trình nói chung ngôn ngữ lập trình Pascal free pascal nói riêng giới hạn phạm vi định…”[1] Khi Test chương trình học sinh thường test test bé nên 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ộ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 nhiều chữ số” Hy vọng kinh nghiệm góp phần giúp đồng nghiệp em học sinh giỏi số thuật giải cộng trừ nhân chia với số nguyên nhiều chữ 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 ôn thi đội tuyển học sinh giỏi cấp em học sinh tham gia câu lạc lập trình Tin họ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 nhiều chữ 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ôn ngữ lập trình Pascal để vận dụng vào tính toán số nguyên không âm lớn 1.4 Phương pháp nghiên cứu Trong phạm vi sáng kiến kinh nghiệm Tôi 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 tham khảo số sách số trang web Internet Tôi thấy người ta tìm 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 để học sinh cách nhìn tổng quan dễ hiểu phù hợp với ngôn ngữ lập trình mà em biết 2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 sở lý luận sáng kiến kinh nghiệm Đối với lập trì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ính toán với số nhiều chữ số nhiều em lúng lúng số vượt khỏi phạm vi kiểu liệu mà ngôn ngữ lập trình cung cấp Chính vậy, việc giải toán với số lớn thực cần thiết cho em học sinh giỏi giải toán liên quan đến số nhiều chữ số nói riêng việc giải toán thực tế nói chung Nhiều ngôn ngữ lập trình cung cấp kiểu liệu số nguyên lớn, chẳng hạn ngôn ngữ lập trình FreePascal kiểu số 64 bit (khoảng 19 chữ số) Tuy nhiên để thực phép toán với số phạm vi 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án với số nguyên nhiều chữ số.[1] 2.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm Trong trình dạy, giao tập: “Hãy sử dụng ngôn ngữ lập trình Pascal FreePascal để tính tổng, hiệu, tích, thương hai số nguyên a b”[3] Học sinh lập trình tính sau: Khi chạy chương trình ta nhập: máy báo lỗi! lại vậy, ta biết “kiểu số nguyên lớn (longint) phạm vi 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ạm vi longint Nhiều em học sinh lúng túng cho rằng, ngôn ngữ lập trình Pascal giải toán 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ậy, xâu lưu trữ số tối đa 255 chữ số Đồng nghĩa với việc ta tính toán với số độ dài tối đa 255 chữ số Ngoài ra, “ngôn ngữ lập trì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 so với kiểu string (bộ nhớ lớn chuỗi dài)…[4] - Sử dụng phép tính toán xâu để tính kết Trong tính toá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ố nhiều chữ 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 độ dài -Bước 3: Thực phép cộng hai xâu độ 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ình 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ộng phạm vi tính toán tới số nguyên dương không âm 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 độ 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ình tính toá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ới số a đặt kết dịch sang trái chữ số Nhưng lần lại nhân chữ số a với chữ 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 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: 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 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ới số nguyên dương không âm vượt phạm vi biểu diễn kiểu liệu mà ngôn ngữ lập trình cung cấp - Sáng kiến kinh nghiệm giúp học sinh thầy giáo thêm giải thuật để cộng trừ nhân chia với số 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 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 giáo môn nhà trường 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ập trình để giải toán thực tế thường gặp, toán tính toán với số lớn Kết nhiều em dễ dàng vận dụng kiến thức để giải toán lặ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ới số nguyên dương không âm Còn với số 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ới số 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

Ngày đăng: 16/08/2017, 14:51

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w