1. Trang chủ
  2. » Luận Văn - Báo Cáo

skkn sử dụng kiểu xâu thực hiện phép toán với số nguyên lớn trung học phổ thông tống duy tân

16 619 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 101 KB

Nội dung

Nhiều em học sinh cho rằng, ngôn ngữ lập trình Pascal chỉ có thể giải được các bài toán có phép tính trong khoảng số nguyên lớn mà các em được biết.. Thông qua đó, các em có thể giải các

Trang 1

I ĐẶT VẤN ĐỀ

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

Mặc dù ra trường chưa lâu nhưng cũng đủ để tôi thấy được rằng công việc giảng dạy của một giáo viên ngoài kiến thức còn cần sự say mê nghề, nhiệt tình

và tâm huyết với từng bài giảng Trong những năm giảng dạy tôi đã từng được dạy cả 3 khối lớp 10, 11, 12 còn nhiều phần kiến thức tôi phải trăn trở để làm sao biến phần kiến thức đó trong sách giáo khoa trở thành kiến thức của học sinh, giúp các em khái quát kiến thức một cách có hệ thống, dễ nhớ mà không bị lặp lại kiến thức khiến các em khỏi bị lẫn lộn trong quá trình vận dụng kiến thức

đã học

Lập trình là vấn đề tương đối mới đối với học sinh THPT, đặt biệt là học sinh vùng nông thôn như trường THPT Tống Duy Tân Trong quá trình lập trình nếu học sinh không nắm vững các kiến thức để viết chương trình thì thường dẫn đến các sai sót dẫn tới chương trình không đạt được kết quả như mong muốn

Khi làm việc với số nguyên lớn có thể làm cho học sinh hay mắc phải

những nhó khăn thư thế Chính vì vậy, tôi mạnh dạn viết sáng kiến “SỬ DỤNG

KIỂU XÂU THỰC HIỆN PHÉP TOÁN VỚI SỐ NGUYÊN LỚN” Hy vọng

rằng những kinh nghiệm này của tôi có thể góp phần giúp các em học sinh hiểu bài hơn và có hứng thú hơn với môn Tin học

Trang 2

II GIẢI QUYẾT VẤN ĐỀ

1 Cơ sở lý luận của vấn đề:

Môn Tin học không phải là môn khoa học lý thuyết thuần túy vì vậy học sinh không thể nhớ nếu như không hiểu bài Việc giáo viên bắt học sinh ghi nhớ thụ động từng nội dung trong sách giáo khoa là một điều cực khó, cho dù học sinh có cố gắng ghi nhớ thì vẫn bị lẫn lộn Hơn nữa, khi gặp các bài toán phải sử dụng kiểu dữ liệu lớn nhiều em lúng lúng Việc giải các bài toán với kiểu dữ liệu lớn thực sự cần thiết cho các em khi làm các bài toán lập trình trong chương trình Tin học phổ thông nói riêng và việc giải quyết các bài toán thực tế nói chung

2 Thực trạng của vấn đề:

Trong chương trình sách giáo khoa Tin học 11 có giới thiệu các kiểu dữ liệu số nguyên Kiểu dữ liệu nguyên lớn nhất mà các em được biết đó là kiểu số nguyên lớn (longint) có phạm vi -2147483648 2147483647 Khảo sát thực trạng tại các lớp 11A, 11B là các lớp học theo ban tự nhiên và các lớp học theo ban cơ bản Nhiều em học sinh cho rằng, ngôn ngữ lập trình Pascal chỉ có thể giải được các bài toán có phép tính trong khoảng số nguyên lớn mà các em được biết Tin học là môn trong những môn học được ứng dụng nhiều trong thực tế Trong thực tế cần phải giải quyết các bài toán, phép toán với các số rất lớn Việc các em có thể giải được các bài toán với số nguyên lớn thực sự cần thiết Thông qua đó, các em có thể giải các bài toán trong 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

3 Giải quyết vấn đề và tổ chức thực hiện

3.1 Giải quyết vấn đề.

Phương pháp: - Các số lớn được lưu dưới dạng xâu Độ dài xâu tối đa là

255 kí tự Vì vậy, xâu có thể lưu trữ được số có tối đa là 255 chữ số

Trang 3

- Sử dụng các phép tính toán trên xâu để tính kết quả Trong khi tính toán cần sử dụng hiệu quả các thủ tục chuyển đổi kí tự kiểu xâu thành số và ngược lại

từ số thành xâu

- Hiện thị kết quả 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 của hai số tự nhiên lớn” Bài toán này có nhiều

cách giải sau đây là lời giải tự nhiên nhất nhưng cũng rất hiệu quả và dễ hiểu như sau:

* Ý tưởng:

- Hai số được lưu dưới dạng xâu Các số có thể đọc ra từ tệp lưu vào biến kiểu xâu hoặc các số có thể được nhập từ màn 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 nhất

- Thêm kí tự '0' vào xâu có độ dài ngắn hơn để hai xâu bằng nhau

- Thực hiện phép cộng hai xâu có độ dài bằng nhau Thực hiện phép cộng

từ cuối lên đầu (tương tự như cộng ở số được thực hiện từ hàng đơn vị) Trong quá trình cộng có sử dụng thủ tục trung gian chuyển đổi từ xâu sang số và ngược lại (lưu ý phần nhớ của phép cộng)

- Kết quả đưa trực tiếp vào xâu

- Hiển thị kết quả dạng xâu

* Các bước thực hiện:

- Hai số được nhập từ bàn phím và lưu vào hai biến kiểu xâu st1 và st2

- So sánh hai xâu st1 và st2 Thêm kí tự ‘0’ vào xâu ngắn hơn để hai xâu

có độ dài bằng nhau

- Thực hiện phép cộng hai xâu có có độ dài bằng nhau, cộng từ cuối lên đầu (tương tự như cộng ở số được thực hiện từ hàng đơn vị) Các kí tự trong xâu lần lượt chuyển thành số (sử dụng thủ tục chuyển đổi) rồi thực hiện phép cộng Kết quả cộng các số được chuyển ngược lại thành xâu (h1)

nho:=0; h:='';

For i:=Max downto 1 do

Trang 4

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 quả (h) lưu trữ kết quả các phép cộng (lưu ý phần nhớ)

Toàn văn 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 do s1:='0'+s1;

For i:=L2+1 to Max do s2:='0'+s2;

nho:=0; h:='';

For i:=Max downto 1 do

Begin

val(s1[i],a,code);

val(s2[i],b,code);

tam:=a+b+nho;

Trang 5

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 xét :

- Chương trình trên thực hiện việc cộng hai số được nhập từ bàn phím

- Trong chương trình có sử dụng chương trình con Cong(s1,s2:String): String để tính kết quả phép cộng hai xâu s1, s2.

- Kết quả phép cộng được hiện lên trên màn hình

- Ta có thể thay đổi chương trình bằng cách sử dụng tệp để đọc dữ liệu vào và ghi kết quả ra

* Bây giờ chúng ta tìm hiểu giải thuật kinh điển cho dạng toán này như sau:

- Giả sử hai số được cho bởi chuổi s1,s2

- Thêm kí tự ‘0’ vào bên trái số có chiều dài ngắn để 2 chuổi s1,s2 có chiều dài bằng nhau và giả sử chiều dài lúc đó là Max

- Kết quả được đưa vào mảng C

- Tính c[i]=a[i]+b[i] với mọi i(i=1 Max)

Ví dụ: a=986 b=927

Trang 6

Thì c[1]=18; c[2]=10; c[3]=13;

- Để C là mảng số kết quả cần biến đổi một chút nữa như sau:

- Duyệt mảng C từ phải qua trái, mỗi c[i] chỉ giữ lại phần dư còn phần nguyên thì cộng thêm cho phần tử c[i-1] như sau:

For i:=Max downto 1 do Begin

c[i-1]:=c[i-1] + c[i] Div 10;

c[i]:=c[i] Mod 10;

End;

Toàn văn chương trình kết quả đư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 do s2:='0'+s2;

For i:=L1+1 to Max do s1:='0'+s1;

For i:=0 to 255 do C[i]:=0;

For i:=0 to Max do

Begin

val(s1[i],A,code);

val(s2[i],B,code);

c[i]:=a+b;

End;

For i:=Max downto 1 do

Begin

Trang 7

c[i-1]:=c[i-1] + c[i] Div 10;

c[i]:=c[i] Mod 10;

End;

For i:=0 to Max do Write(c[i]);

End;

BEGIN

cong;

readln;

END

Nhận xét:

- Chương trình trên thực hiện việc cộng hai số nguyên lớn được nhập từ

bàn phím Kết quả của phép cộng được hiển thị trên màn hình

- Ngoài ra ta có thể sử dụng tệp để đọc các số nguyên lớn vào và ghi kết quả ra

Bài toán 2: Chương trình trừ 2 số tự nhiên lớn:

* Ý tưởng:

- Hai số được lưu dưới dạng xâu Các số có thể đọc ra từ tệp lưu vào biến kiểu xâu hoặc các số có thể được nhập từ màn 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 nhất

- Thêm kí tự '0' vào xâu có độ dài ngắn hơn để hai xâu bằng nhau

- So sánh hai xâu có độ dài bằng nhau

+ Nếu xâu lưu số bị trừ lớn hơn xâu lưu số trừ Thực hiện phép trừ hai xâu từ cuối lên đầu (tương tự như phép trừ trong toán học) Sử dụng thủ tục chuyển đổi xâu thành số trong quá trình tính toán

+ Nếu xâu lưu số bị trừ bé hơn xâu lưu số trừ thực hiện đặt dấu trừ (-) vào phần đầu kết quả, đồng thời thực hiện hoán đổi hai xâu cho nhau và thực hiện phép trừ tương tự như ở trên

Trang 8

* 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.

- So sánh hai xâu st1 và st2 Thêm kí tự ‘0’ vào xâu ngắn hơn để hai xâu

có độ dài bằng nhau

- So sánh hai xâu st1, st2 độ dài bằng nhau

+ Nếu xâu lưu số bị trừ lớn hơn xâu lưu số trừ Thực hiện phép trừ hai xâu

từ cuối lên đầu (tương tự như phép trừ trong toán học) Sử dụng thủ tục chuyển đổi xâu thành số trong quá trình tính toán

+ Nếu xâu lưu số bị trừ bé hơn xâu lưu số trừ thực hiện đặt dấu trừ (-) vào phần đầu kết quả, đồng thời thực hiện hoán đổi hai xâu cho nhau và thực hiện phép trừ tương tự như ở trên

- Phép trừ được thực hiện như sau:

Các kí tự sâu St1 được chuyển thành số và lưu vào mảng h1.

Các kí tự sâu St2 được chuyển thành số và lưu vào mảng h2 Thực hiện phép trừ hai mảng h1 và h2 (lưu ý trương hợp số bị trừ

bé hơn số trừ)

Nếu h1[i]<h2[i] thì c[i]:=h1[i]+10-h2[i]; và h2[i-1]:=h2[i-1]+1; ngược lại nếu h1[i]>=h2[i] thì c[i]:=h1[i]-h2[i];

- Mảng C thu được chính là kết quả

Toàn văn 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;

Trang 9

Begin

L1:=length(s1);

L2:=length(s2);

if L1>L2 Then Max:=L1 Else Max:=L2;

For i:=L2+1 to Max do s2:='0'+s2;

For i:=L1+1 to Max do s1:='0'+s1;

dau:=' ';

IF s2>s1 Then

Begin

dau:='-'; s:=s2; s2:=s1; s1:=s;

End;

For i:=1 to 255 do C[i]:=0;

For i:=1 to Max do

Begin

val(s1[i],h1[i],code);

val(s2[i],h2[i],code);

End;

For i:=Max downto 1 do

IF h1[i]<h2[i] Then

Begin

c[i]:=h1[i]+10-h2[i];

h2[i-1]:=h2[i-1]+1;

End Else

c[i]:=h1[i]-h2[i];

Write(dau);

For i:=1 to Max do Write(c[i]);

End;

Begin

Trang 10

write('nhap so thu nhat'); readln(st1);

write('nhap so thu nhat'); readln(st2);

writeln('ket qua la');

tru(st1,st2);

Readln;

End

Nhận xét:

- Chương trình trên thực hiện phép trừ hai số lớn được nhập từ bàn phím.

Hiệu của hai số được hiển thị trên màn hình

- Kết quả phép trừ được lưu vào một mảng Để hiện thị kết quả, ta chỉ cần hiển thị lần lượt các phần tử trong mảng Khi hiện thỉ cần chú ý tới phần dấu của phép trừ (nếu số bị trù bé hơn số trừ ghi vào kết quả dấu -)

- Tương tự như các bài ở trên, ta có thể thay đối cách vào ra dữ liệu bằng cách sử dụng tệp để đọc dữ liệu vào và ghi kết quả ra

Bài toán 3: Chương trình nhân 2 số tự nhiên lớn.

* Ý tưởng:

- Hai số được lưu dưới dạng xâu Các số có thể đọc ra từ tệp lưu vào biến kiểu xâu hoặc các số có thể được nhập từ màn hình lưu vào biến kiểu xâu

- Thực hiện phép nhân lần lượt các kí tự (đã dùng thủ tục chuyển thành số) trong hai xâu

- Kết quả đưa vào mảng

- Xử lý mảng kết quả ta thu được kết quả phép nhân

* Các bước thực hiện:

- Nhập hai số lưu ở dang hai biến xâu s1, s2

- Sử dụng mảng C lưu kết quả phép nhân hai xâu s1, s2 (các kí tự trong xâu được chuyển đối thành số khi tính toán)

- Ta có: L1:=length(s1); L2:=length(s2);

Trang 11

For i:=1 to L1 do

For j:=1 to L2 do

Begin

val(s1[i],A,code);

val(s2[j],B,code);

c[i+j]:=c[i+j]+a*b;

End;

- Xử lý mảng kết quả:

For i:=L1+L2 downto 3 do

Begin

c[i-1]:=c[i-1] + c[i] Div 10;

c[i]:=c[i] Mod 10;

End;

Toàn văn chương trình:

Program nhan_hai_so;

Var s1,s2:String;

C :Array[0 10000] of byte;

Procedure nhan;

Var a,b,i,j,L1,L2,code:word;

Begin

Write(' Nhap so thu nhat'); Readln(s1);

Write(' Nhap so thư hai'); Readln(s2);

L1:=length(s1); L2:=length(s2);

For i:=1 to l1+l2 do C[i]:=0;

For i:=1 to L1 do For j:=1 to L2 do

Begin

val(s1[i],A,code);

val(s2[j],B,code);

c[i+j]:=c[i+j]+a*b;

Trang 12

For i:=L1+L2 downto 3 do

Begin

c[i-1]:=c[i-1] + c[i] Div 10;

c[i]:=c[i] Mod 10;

End;

Write('Tich la : ');

For i:=2 to L1+L2 do Write(c[i]);

End;

Begin

Nhan;

Readln;

End

Nhận xét:

- Chương trình trên thực hiện phép nhân hai số lớn được nhập từ bàn phím Kết quả phép nhân được hiển thị trên màn hình

- Lưu ý: Khi sử dụng mảng để lưu kết quả phép nhân, độ dài của mảng kết quả lớn hơn hoặc bằng tổng độ dài của hai số (xâu)

- Ta có thể thay đôi kiểu vào ra dữ liệu cho chương trình trên bằng cách

sử dụng kiểu dữ liệu tệp

4 Kết quả:

Thực tế sau khi áp dụng sáng kiến kinh nghiệm này vào giảng dạy môn

Tin học lớp 11 ở trường, tôi nhận thấy chất lượng bộ môn được nâng cao đáng kể:

- Khả năng tiếp thu tốt hơn vì các em học và tự kiểm chứng nội dung bằng chương trình

Trang 13

- Kỹ năng tư duy, sáng tạo, biết phân tích và giải quyết tình huống của các

em học sinh ngày càng tốt hơn

- Thông qua một số bài tập mẫu giúp cho học sinh nắm được phương

pháp giải chung, từ đó áp dụng để giải một số bài toán cơ bản có sử dụng các phép tính toán với số nguyên lớn

- Sau khi thực hiện đề tài này tại trường trung học phổ thông Tống Duy Tân Qua từng tiết học, tôi đã vận dụng các kiến thức trên, kết hợp cả lý thuyết lẫn thực hành cho học sinh thực hiện lập trình giải các bài toán trong chương trình phổ thông, từ đó áp dụng để giải các bài toán nâng cao và các bài toán trong thực tế có sử dụng số nguyên lớn Thông qua đó tạo hứng thú giúp học sinh tích cực hơn trong học lập trình Pascal nói riêng và môn Tin học nói chung

III KẾT LUẬN

Ngôn ngữ lập trình nói chung đóng vai trò rất quan trọng trong việc xây dựng các chương trình ứng dụng để phục vụ cho cuộc sống Nhờ sự phát triển của tin học (trong đó các nhà lập trình chuyên nghiệp đóng vai trò không nhỏ)

mà hiện nay hầu hết các lĩnh vực trong xã hội đã ứng dụng được tin học để giải quyết công viêc nhanh, hiệu quả và chính xác hơn

Trang 14

Hiện nay, ngôn ngữ lập trình Pascal đã trở thành ngôn ngữ lập trình phổ biến nhất trên thế giới sử dụng trong lĩnh vực giảng dạy Trong quá trình giảng dạy, các thầy cô có thể đưa ra các vấn đề như lập trình các game nhỏ…để các

em có thể chứng tỏ được khả năng của mình làm cho học sinh yêu thích môn học, ham học hỏi và sáng tạo

Đề tài này mang tính thực tiễn rất cao cụ thể là: Các em có thể sử dụng kiến thức lập trình để gải các bài toán thực tế thường gặp, các bài toán tính toán với số lớn Kết quả là có rất nhiều em đã dễ dàng vận dụng được kiến thức để giải các bài toán lặp do giáo viên đặt ra

Qua thực tế giảng dạy và học tập, được sự giúp dỡ của các thầy cô, các bạn đồng nghiệp, bản thân tôi đã tiếp thu được nhiều điều bổ ích, thiết thực cho quá trình giảng dạy và công tác Tôi mạnh dạn chọn đề tài này với mong muốn được tạo được hừng thú khi học sinh học ngôn ngữ lập trình Pascal nói riêng và lập trình nói chung Qua thực nghiệm tôi thấy đề tài này đã có tác dụng tốt trong việc giảng dạy và học tập của thầy và trò Và tôi sẽ cùng các đồng nghiệp áp dụng sáng kiến kinh nghiệm này vào công tác giảng dạy Tin học khối 11 môn lập trình pascal cho những năm tiếp theo nhằm nâng cao hiệu quả và chất lượng dạy học

XÁC NHẬN CỦA THỦ TRƯỞNG

ĐƠN VỊ

Thanh Hóa, ngày 07 tháng 6 năm 2013

Tôi xin cam đoan đây là SKKN của mình viết, không sao chép nội dung của người khác

Người viết

Nguyễn Văn Đông

TÀI LIỆU THAM KHẢO

1 Sách giáo khoa tin học 11 Hồ Sĩ Đàm chủ biên

2 Sách giáo viên tin học 11 Hồ Sĩ Đàm chủ biên

3 Sách bài tập tin học 11 Hồ Sĩ Đàm chủ biên

4 Lý thuyết và Bài tập lập trình Pascal 5.5-6.0 Nguyễn Thị Kiều Duyên

Ngày đăng: 19/07/2014, 07:38

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w