Tin học là môn học khoa học có tính thực tiễn cao, luôn đòi hỏi người học không chỉ có lĩnh hội những kiến thức trên lớp mà còn cần phải có những hiểu biết thực tế rộng gắn liền với môn Tin học thì việc học mới thực sự có hiệu quả và dễ nhớ kiến thức. Trong thực tế hiện nay, sự hiểu biết thực tế của các em về kiến thức thực tế môn Tin học lại rất hạn chế. Vì vậy khi học, các em sẽ trở nên bị động, không vận dụng được kiến thức đã học vào thưc tiễn. Do đó, khi ghi nhớ kiến thực học sinh dễ quên. Cũng vì lẽ đó, môn Tin học THPT luôn được học sinh xem là một môn học khó và thiếu hứng thú học tập.
Ứng dụng kiểu xâu phép toán với số nguyên lớn I ĐẶT VẤN ĐỀ Tin học môn học khoa học có tính thực tiễn cao, đòi hỏi người học lĩnh hội kiến thức lớp mà cần phải có hiểu biết thực tế rộng gắn liền với môn Tin học việc học thực có hiệu dễ nhớ kiến thức Trong thực tế nay, hiểu biết thực tế em kiến thức thực tế môn Tin học lại hạn chế Vì học, em trở nên bị động, không vận dụng kiến thức học vào thưc tiễn Do đó, ghi nhớ kiến thực học sinh dễ quên Cũng lẽ đó, môn Tin học THPT học sinh xem môn học khó thiếu hứng thú học tập Lập trình vấn đề tương đối đối với học sinh THPT Trong trình lập trình học sinh không nắm vững kiến thức để viết chương trình thường dẫn đến sai sót dẫn tới chương trình không đạt kết mong muốn Khi làm việc với số nguyên lớn làm cho học sinh hay mắc phải nhó khăn thư Chính vậy, mạnh dạn viết sáng kiến “ỨNG DỤNG KIỂU XÂU TRONG PHÉP TOÁN SỐ NGUYÊN LỚN ” Hy vọng kinh nghiệm góp phần giúp em học sinh hiểu có hứng thú với môn Tin học 123doc.org – Angela Lê Ứng dụng kiểu xâu phép toán với số nguyên lớn II GIẢI QUYẾT VẤN ĐỀ Cơ sở lý luận vấn đề: Môn Tin học môn khoa học lý thuyết túy học sinh nhớ không hiểu Việc giáo viên bắt học sinh ghi nhớ thụ động nội dung sách giáo khoa điều cực khó, cho dù học sinh có cố gắng ghi nhớ vẫn bị lẫn lộn Hơn nữa, gặp toán phải sử dụng kiểu liệu lớn nhiều em lúng lúng Việc giải toán với kiểu liệu lớn thực cần thiết cho em làm toán lập trình chương trình Tin học phổ thông nói riêng việc giải toán thực tế nói chung Thực trạng vấn đề: Trong chương trình sách giáo khoa Tin học 11 có giới thiệu kiểu liệu số nguyên Kiểu liệu nguyên lớn mà em biết kiểu số nguyên lớn (longint) có phạm vi -2147483648 2147483647 Nhiều em học sinh cho rằng, ngôn ngữ lập trình Pascal giải toán có phép tính khoảng số nguyên lớn mà em biết Tin học môn môn học ứng dụng nhiều thực tế Trong thực tế cần phải giải toán, phép toán với số lớn Việc em giải toán với số nguyên lớn thực cần thiết Thông qua đó, em giải toán thực tế, góp phần đưa kiến thức học lập trình tin học vào đời sống Giải vấn đề tổ chức thực 3.1 Giải vấn đề Phương pháp: - Các số lớn lưu dạng xâu Độ dài xâu tối đa 255 kí tự Vì vậy, xâu lưu trữ số có tối đa 255 chữ số - 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ố ngược lại từ số thành xâu 123doc.org – Angela Lê Ứng dụng kiểu xâu phép toán với số nguyên lớn - Hiện thị kết dạng xâu (hoặc mảng) 3.2 Tổ chức thực hiện: Bài toán1 : “Hãy tính tổng hai số tự nhiên lớn” Bài toán có nhiều cách giải sau lời giải tự nhiên hiệu dễ hiểu sau: * Ý tưởng: - Hai số lưu dạng xâu Các số đọc từ tệp lưu vào biến kiểu xâu số nhập từ hình lưu vào biến kiểu xâu - So sánh độ dài hai xâu, tìm độ dài xâu lớn - Thêm kí tự '0' vào xâu có độ dài ngắn để hai xâu - Thực phép cộng hai xâu có độ dài Thực phép cộng từ cuối lên đầu (tương tự cộng số thực từ hàng đơn vị) Trong trình cộng có sử dụng thủ tục trung gian chuyển đổi từ xâu sang số ngược lại (lưu ý phần nhớ phép cộng) - Kết đưa trực tiếp vào xâu - Hiển thị kết dạng xâu * Các bước thực hiện: - Hai số nhập từ bàn phím lưu vào hai biến kiểu xâu st1 st2 - 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 - 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) nho:=0; h:=''; For i:=Max downto Begin val(s1[i],a,code); 123doc.org – Angela Lê Ứng dụng kiểu xâu phép toán với số nguyên lớn val(s2[i],b,code); tam:=a+b+nho; if tam>=10 Then nho:=1 Else nho:=0; str(tam Mod 10,h1); h:=h1+h; End; - Sử dụng xâu kết (h) lưu trữ kết phép cộng (lưu ý phần nhớ) Chương trình: Program so_lon; var st,st1,st2:string; Function Cong(s1,s2:String):String; Var L1,L2,Max,i,tam,a,b,code,nho:Integer; h,h1:String; Begin L1:=length(s1); L2:=length(s2); if L1>L2 Then Max:=L1 Else Max:=L2; For i:=L1+1 to Max s1:='0'+s1; For i:=L2+1 to Max s2:='0'+s2; nho:=0; h:=''; For i:=Max downto Begin val(s1[i],a,code); val(s2[i],b,code); tam:=a+b+nho; if tam>=10 Then nho:=1 Else nho:=0; str(tam Mod 10,h1); 123doc.org – Angela Lê Ứng dụng kiểu xâu phép toán với số nguyên lớn h:=h1+h; End; if nho=1 Then h:='1'+h; cong:=h; End; Begin write('nhap so thu nhat'); readln(st1); write('nhap so thu hai'); readln(st2); writeln('ket qua la', cong(st1,st2)); readln; End 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 có sử dụng chương trình 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 * Bây tìm hiểu giải thuật kinh điển cho dạng toán sau: - Giả sử hai số cho chuổi s1,s2 - Thêm kí tự ‘0’ vào bên trái số có chiều dài ngắn để chuổi s1,s2 có chiều dài giả sử chiều dài lúc Max - Kết đưa vào mảng C - Tính c[i]=a[i]+b[i] với i(i=1 Max) Ví dụ: a=986 b=927 Thì c[1]=18; c[2]=10; c[3]=13; - Để C mảng số kết cần biến đổi chút sau: 123doc.org – Angela Lê Ứng dụng kiểu xâu phép toán với số nguyên lớn - Duyệt mảng C từ phải qua trái, c[i] giữ lại phần dư phần nguyên cộng thêm cho phần tử c[i-1] sau: For i:=Max downto Begin c[i-1]:=c[i-1] + c[i] Div 10; c[i]:=c[i] Mod 10; End; Chương trình kết đưa vào mảng USES CRT; Procedure cong; Var s1,s2:String; a,b,i,L1,L2,code:word; max:longint; c:Array[0 255] of byte; Begin Write('Nhap so thu nhat'); Readln(s1); Write('Nhap so thu hai'); Readln(s2); L1:=length(s1); L2:=length(s2); if L1>L2 Then Max:=L1 Else Max:=L2; For i:=L2+1 to Max s2:='0'+s2; For i:=L1+1 to Max s1:='0'+s1; For i:=0 to 255 C[i]:=0; For i:=0 to Max Begin val(s1[i],A,code); val(s2[i],B,code); c[i]:=a+b; End; For i:=Max downto Begin c[i-1]:=c[i-1] + c[i] Div 10; c[i]:=c[i] Mod 10; 123doc.org – Angela Lê Ứng dụng kiểu xâu phép toán với số nguyên lớn End; For i:=0 to Max Write(c[i]); End; BEGIN cong; readln; END Nhận xét: - Chương trình thực việc cộng hai số nguyên lớn nhập từ bàn phím Kết phép cộng hiển thị hình - Ngoài ta sử dụng tệp để đọc số nguyên lớn vào ghi kết Bài toán 2: Chương trình trừ số tự nhiên lớn * Ý tưởng: - Hai số lưu dạng xâu Các số đọc từ tệp lưu vào biến kiểu xâu số nhập từ hình lưu vào biến kiểu xâu - So sánh độ dài hai xâu, tìm độ dài xâu lớn - Thêm kí tự '0' vào xâu có độ dài ngắn để hai xâu - So sánh hai xâu có độ 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ự * Các bước thực hiện: - Nhập hai số từ bàn phím lưu vào hai biến xâu st1, st2 123doc.org – Angela Lê Ứng dụng kiểu xâu phép toán với số nguyên lớn - 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 - 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ự - 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]; - Mảng C thu kết Chương trình: program tru_so_lon; var st1,st2:string; Procedure tru(s1,s2:string); Var s:String; h1,h2:Array[1 255] of byte; C:Array[1 255] of byte; dau:Char; code,l1,l2,Max,i:word; Begin L1:=length(s1); 123doc.org – Angela Lê Ứng dụng kiểu xâu phép toán với số nguyên lớn L2:=length(s2); if L1>L2 Then Max:=L1 Else Max:=L2; For i:=L2+1 to Max s2:='0'+s2; For i:=L1+1 to Max s1:='0'+s1; dau:=' '; IF s2>s1 Then Begin dau:='-'; s:=s2; s2:=s1; s1:=s; End; For i:=1 to 255 C[i]:=0; For i:=1 to Max Begin val(s1[i],h1[i],code); val(s2[i],h2[i],code); End; For i:=Max downto IF h1[i]