Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 17 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
17
Dung lượng
27,26 KB
Nội dung
Ưng dung kiêu xâu phep toan 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, ln đòi h ỏi ng ười h ọc khơng có lĩnh hội kiến thức lớp mà 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 việc học m ới th ực s ự 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ì v ậy 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ễ qn 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 tơi góp phần giúp em h ọc sinh hi ểu có hứng thú với mơn Tin học 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 thu ần túy v ậ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 m ột ều c ực khó, cho dù học sinh 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 tố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ơ ngun 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 có th ể gi ải tố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 tốn, phép tốn với sơ lớn Việc em giải tốn v ới sơ ngun lớn thực cần thiết Thơng qua đó, em có th ể giải tố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 phap: - Các sô lớn lưu dạng xâu Độ dài xâu đ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 tốn xâu để tính kết Trong tính tố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 - 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 tốn có nhiều cách giải sau lời giải tự nhiên nh ưng 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 q 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 * Cac 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 h ơ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); 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); 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 xet: - 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 d ữ li ệu vào ghi kết * Bây tìm hiêu giải thuật kinh điên cho d ạng toan 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: - 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] ofbyte; 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; End; For i:=0 to Max Write(c[i]); End; BEGIN cong; readln; END Nhận xet: - 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 - Ngồ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ơ q trình tính tố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ự * Cac 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 - So sánh hai xâu st1 st2 Thêm kí tự ‘0’ vào xâu ng ắn h ơ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ừ ci lên đầu (tương tự phép trừ tốn học) Sử dụng th ủ tục chuyển đổi xâu thành sơ q trình tính tố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); 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]