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

skkn sử dụng hàm sinh số ngẫu nhiên random tạo test cho một số bài tập cơ bản tin học 11

15 963 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 15
Dung lượng 104 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Chính vì xác định được tầm quan trọng đó nên Nhà nước ta đã đưa môn tin học vào trong nhà trường và ở chương trình THPT tin học còn cho học sinh một vốn kiến thức về công nghệ thông tin

Trang 1

MỤC LỤC

TRANG

1 MỞ ĐẦU 2

1.1 Lý do chọn đề tài 2

1.2 Mục đích nghiên cứu 2

1.3 Đối tượng nghiên cứu 3

1.4 Phương pháp nghiên cứu 3

2 NỘI DUNG CỦA SÁNG KIẾN KINH NGHIỆM 3

2.1 Cơ sở lý luận của sáng kiến kinh nghiệm 3

2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm 3

2.3 Các sáng kiến kinh nghiệm hoặc các giải pháp đã sử dụng để giải quyết vấn đề 4

2.3.1Sinh một số, kí tự ngẫu nhiên……… 5

2.3.2 Sinh mảng N số ngẫu nhiên, xâu kí tự có độ dài ngẫu nhiên……….6

2.3.3 Sinh ngẫu nhiên tệp………7

2.3.4 Một số ví dụ………8

2.4 Hiệu quả của sáng kiến kinh nghiệm đối với hoạt động giáo dục, với bản thân, đồng nghiệp và nhà trường 12

3 KẾT LUẬN, KIẾN NGHỊ 12

1 Kết luận 12

2 Kiến nghị 12

Trang 2

1 MỞ ĐẦU

1.1 Lý do chọn đề tài:

Sự bùng nổ thông tin đã tác động lớn đến công cuộc phát triển kinh tế xã hội người Với con người của thời đại hiện nay ngoài các kiến thức về chuyên môn thì hầu hết mọi người luôn sử dụng máy tính như một công cụ trợ giúp Đảng và Nhà nước đã xác định rõ ý nghĩa và tầm quan trọng của tin học và công nghệ thông tin, truyền thông cũng như những yêu cầu đẩy mạnh của ứng dụng công nghệ thông tin, đào tạo nguồn nhân lực đáp ứng yêu cầu công nghiệp hóa, hiện đại hóa, mở cửa và hội nhập, hướng tới nền kinh tế tri thức của nước ta nói riêng – thế giới nói chung

Chính vì xác định được tầm quan trọng đó nên Nhà nước ta đã đưa môn tin học vào trong nhà trường và ở chương trình THPT tin học còn cho học sinh một vốn kiến thức về công nghệ thông tin và các kỹ năng để có thể làm việc sau khi tốt nghiệp phổ thông

Học sinh THPT là nguồn lao động trẻ có thể sử dụng ngay sau khi tốt nghiệp

do vậy việc được tiếp cận công nghệ thông tin từ trong nhà trường phổ thông sẽ giúp cho học sinh có thể tự tin hơn trong công việc Trong trường ngoài các tiết lý thuyết về công nghệ thông tin thì việc thực hành đóng một vai trò quan trong và quyết định đến các kỹ năng sau này của học sinh Từ lâu nay HS có thể rất thuộc lý thuyết nhưng khi bắt tay vào thực tế thì thường rất lúng túng và không có khả năng làm việc theo nhóm độc lập và theo nhóm

Các bài tập và thực hành trong chương trình lớp 11 giúp học sinh:

+ Biết một số khái niệm cơ bản về lập trình và ngôn ngữ bậc cao

+ Vận dụng các cơ sở dữ liệu và kiến thức về thuật toán

+ Hình thành và phát triển tư duy logic

+ Hình thành các bước để giải quyết vấn đề nêu ra

+ Có thể áp dụng lập trình vào giải các bài toán thực tế

+ Có thái độ ham thích môn học và có tính kỷ luật cao và có khả năng làm việc theo nhóm

Kiểm tra đánh giá các thuật toán của học sinh thường chỉ được chạy thử với các test nhỏ do vậy không phản ánh được chính xác sự tối ưu của thuật toán Việc tạo ra các test lớn bằng cách thủ công rất mất thời gian, nhàm chán Với những lý

do trên tôi chọn đề tài về “Sử dụng hàm sinh số ngẫu nhiên Random tạo test cho

một số bài tập cơ bản tin học 11”

1.2 Mục đích nghiên cứu.

Đưa ra một số đoạn chương trình tạo những test để chạy thử các bài toán cơ bản và nâng cao trong chương trình lớp 11 Việc tạo test bằng hàm random sẽ nhanh chóng hơn và tùy theo yêu cầu bài toán mà giáo viên có thể định hướng được

Trang 3

kết quả theo ý mình Việc tạo các test lớn cũng sẽ giúp học sinh nhận ra các sai lầm của mình khi thiết kế thuật toán chạy với bộ dữ liệu lớn

1.3 Đối tượng nghiên cứu.

Học sinh khối 11 trường THPT Nông Cống 1

Máy tính, máy chiếu để chạy thử

1.4 Phương pháp nghiên cứu

Phương pháp phân tích thuật toán, kiểm tra đánh giá năng lực học sinh, phát triển tư duy logic Một số tài liệu tham khảo và tìm kiếm thông tin trên internet

2 Nội dung sáng kiến

2.1 Cơ sở lí luận của sáng kiến kinh nghiệm.

Nghị quyết số 29/NQ-TW Hội nghị Trung ương 8 khóa XI về đổi mới căn bản, toàn diện giáo dục và đào tạo nêu rõ: "Tiếp tục đổi mới mạnh mẽ phương pháp dạy

và học theo hướng hiện đại; phát huy tính tích cực, chủ động, sáng tạo và vận dụng kiến thức, kỹ năng của người học; khắc phục lối truyền đạt một chiều, ghi nhớ máy móc Tập trung dạy cách học, cách nghĩ, khuyến khích tự học, tạo cơ sở để người học tự cập nhật và đổi mới tri thức, kỹ năng, phát triển năng lực" Nhận thức được tầm quan trọng của việc tăng cường đổi mới kiểm tra, đánh giá thúc đẩy đổi mới phương pháp dạy học, Sở Giáo dục và Đào tạo đã tập trung chỉ đạo đổi mới các hoạt động này nhằm tạo sự chuyển biến cơ bản về tổ chức hoạt động dạy học, góp phần nâng cao chất lượng giáo dục trong các trường trung học

+ Chỉ thị 40/CT của Ban bí thư Trung ương Đảng: Đổi mới nội dung chương trình là tích cực áp dụng một cách sáng tạo của phương pháp tiên tiến, hiện đại, ứng dụng công nghệ thông tin vào hoạt động dạy và học

+ Xã hội hiện nay thì những kiến thức cơ bản về thông tin và các công nghệ cao là những kiến thức rất cần thiết đối với mỗi người nhất là thế hệ trẻ hiện nay

2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm.

Việc học ngôn ngữ lập trình pascal giúp học sinh phát triển tư duy khá tốt nhưng việc tạo hứng thú và tạo sự yêu thích môn học cho học sinh lại khó khăn

Quá trình thực hiện đề tài tại trường THPT Nông Cống 1 tôi có một số thuận lợi và khó khăn sau:

2.2.1 Thuận lợi:

* Nhà trường:

- Nhà trường đã tạo điều kiện để học sinh có điều kiện tốt nhất để học, tạo điều kiện sắm sửa máy móc, trang thiết bị phục vụ cho việc dạy và học môn Tin học Nhà trường đã tạo điều kiện tối đa để HS có đủ thời gian và máy móc để thực hành

Trang 4

- Nhà trường đã có 2 phòng tin (mỗi phòng 25 máy+1 máy chiếu) trong đó

có một phòng máy tính xách tay

* Học sinh:

Đầu vào của học sinh các năm của trường khá cao đó là tiền đề tốt để phát triển môn học lập trình Đa số học sinh có ý thức học tập và có nhiều em yêu thích môn lập trình

2.2.2 Khó khăn:

* Nhà trường:

Tuy nhà trường đã có 2 phòng máy nhưng cũng chỉ thực hiện được một phần nào số tiết thực hành vì số lớp đông (24 lớp)

Nhà trường chưa có giáo viên chuyên trách để quản lý phòng máy nên nhiều lúc máy tính trục trặc không sửa chữa kịp thời Phòng Thực hành tin học chưa đủ tiêu chuẩn(phòng chật, không thông thoáng) nên cũng gây khó khăn cho các tiết thực hành nhất là những hôm thời tiết quá nóng

* Giáo viên:

Tài liệu của môn tin học trong nhà trường khá ít do đó gây khó khăn cho việc nâng cao trình độ

Đời sống giáo viên còn nhiều khó khăn nên việc tập trung tối đa cho môn học cũng bị ảnh hưởng

* Học sinh:

Lập trình có đặc trưng riêng so với các môn học khác nên sự tiếp cận của học sinh khá khó khăn

Môn lập trình đòi hỏi phải có máy tính để có thể kiểm tra các chương trình nhưng phần lớn học sinh không có máy tính riêng Thời gian học cũng khó sắp xếp

do vậy nhiều học sinh yêu thích môn tin cũng không có điều kiện phát triển

Tư tưởng học để thi đại học vẫn còn nặng trong học sinh nên thời gian học các môn không phải môn khối là không đủ để phát triển

2.3 Các sáng kiến kinh nghiệm hoặc các giải pháp đã sử dụng để giải quyết vấn đề.

Trong ngôn ngữ lập trình Pascal hàm random(N) sinh một số ngẫu nhiên, với

N kiểu Word thì thì hàm random(N) sinh một số ngẫu nhiên kiểu nguyên nằm trong khoảng 0 đến N-1 Hàm Random() sinh một số ngẫu nhiên trong đoạn (0 1) Dựa vào hàm Random này tôi đưa ra một số đoạn chương trình tạo một test cho một số bài tập đơn giản và nâng cao trong chương trình lớp 11 Trước khi gọi hàm Random ta cần gọi thủ tục Randomize để máy tính khởi động cơ chế phát sinh số ngẫu nhiên

Trang 5

2.3.1 Sinh một số, kí tự ngẫu nhiên.

a Sinh một số ngẫu nhiên nguyên a không âm

Đoạn chương trình:

Procedure sinh(m:integer);

Begin

Randomize;

a:= random(m);

end;

b Sinh một số ngẫu nhiên a

Đoạn chương trình:

Procedure sinh(n,m:integer);

Begin

Randomize;

a:= random(m)-random(m);

end;

c Sinh số ngẫu nhiên nguyên từ n đếm m (n<m) như sau:

Ta có random(m-n+1) sinh số ngẫu nhiên nguyên từ 0 đếm m-n do đó n+random(m-n+1) sinh các số từ n đến n+m-n=m Từ nhận xét đó ta có đoạn chương trình sau:

Đoạn chương trình:

Procedure sinh(n,m:integer);

Begin

Randomize;

a:= n+random(m-n);

end;

d Sinh một kí tự ngẫu nhiên.

Ta có các kí tự trong bảng mã ASCII có mã thập phân từ 0 đến 255 do đó ta sử dụng hàm CHR(chuyển sang kí tự tương ứng với số thứ tự) Hàm chuyển như sau

Đoạn chương trình:

Function kitungaunhien:char;

Begin

Kitungaunhien:=CHR(random(255));

End;

Khi ta muốn sinh ngẫu nhiên các kí tự ‘A’ đến ‘Z’ thì ta có nhận xét: Kí tự ‘A’

có số thứ tự 65 còn ‘Z’ có số thứ tự 90 do đó:

Kitungaunhien:=CHR(random(25)+60);

Trang 6

Từ ví dụ trên ta có thể sinh ngẫu nhiên một kí tự trong khoảng nào đó mà đề bài quy định

e Sinh ngẫu nhiên một số thực.

Hàm Random(); sinh các số ngẫu nhiên trong khoảng (0,1) do vậy nếu ta chỉ cần sinh các số ngẫu nhiên trong khoảng này thì chỉ cần viết câu lệnh a:=Random(); Nếu ta muốn sinh các số thực ngẫu nhiên lớn hơn một thì ta có thực hiện hàm

Đoạn chương trình:

Function sothuc:real;

Begin

Sothuc:=random()*random(10000);

{nếu số thực âm thì sothuc:=random()*(random(10000)-random(10000));}

End;

Khi chúng ta thay đổi kiểu dữ liệu và tùy theo bài toán ta có thể tạo ra các test

để kiểm tra tính đúng đắn của các bài toán mà học sinh làm Việc sinh một số ngẫu nhiên, một kí tự ngẫu nhiên sẽ giúp giáo viên tạo các test cho các tập ở chương III(SGK tin học 11) một cách dễ dàng từ đó có thể đánh giá các giải thuật của học sinh một cách chính xác

2.3.2 Sinh mảng N số ngẫu nhiên, xâu kí tự có độ dài ngẫu nhiên.

Sinh ngẫu nhiên N số, kí tự ngẫu nhiên sử dụng kiểu dữ liệu mảng để lưu

a Sinh n số ngẫu nhiên không âm cho

Đoạn chương trình:

Procedure sinh(m:word);

Var i:integer;

Begin

Randomize;

For i:=1 to n do a[i]:=random(m);

End;

b Sinh n số ngẫu nhiên cho mảng a

Đoạn chương trình:

Procedure sinh(m:word);

Var i:integer;

Begin

Randomize;

For i:=1 to n do a[i]:=random(m)-random(m);

End;

c Sinh ngẫu nhiên n số nguyên trong khoảng a đến b

Trang 7

Dựa vào nhận xét của mục a ta có thủ tục sinh ngẫu nhiên n số nguyên từ a đến b(a<b) như sau:

Đoạn chương trình:

Procedure sinh(n,a,b:integer);

Var i:integer;

Begin

Randomize;

For i:=1 to n do songuyen[i]:=a+random(b-a+1);

End;

d Sinh ngẫu nhiên N số thực cho mảng

Sử dụng đoạn chương trình sinh một số thực ở mục a ta sẽ có một mảng ngẫu nhiên gồm n số thực

Đoạn chương trình:

Function sothuc:real;

Var i:integer;

Begin

For i:=1 to n do

Sothuc[i]:=random()*random(10000);

{số thực âm thì sothuc[i]:=random()*(random(10000)-random(10000));} End;

e Sinh xâu kí tự có độ dài ngẫu nhiên.

Trong các bài toán xử lí xâu chúng ta thường tạo các test có số lượng kí tự nhỏ

vì việc gõ các test có lượng kí tự lớn rất mất thời gian và nhàm chán Từ đó dễ dẫn đến không kiểm tra được độ chính xác của giải thuật khi xử lý xâu lớn và không kiểm tra đúng đắn thời gian chạy(có thể giải thuật sẽ tốn rất nhiều thời gian); đối với việc bồi dưỡng học sinh giỏi thì thời gian chạy cũng rất quan trọng Sau đây tôi

sẽ đưa ra một hàm tạo một xâu ngẫu nhiên gồm các kí tự từ ‘A’ đến ‘Z’ các trường hợp còn lại làm tương tự

Đoạn chương trình.

Begin

Xaungaunhien:=’’;

N:=1+random(500);

For i:=1 to n do xaungaunhien:=xaungaunhien+chr(random(25)+65);

End;

Trang 8

Nhận xét: Từ các đoạn chương trình trên ta có thể tạo ra các bộ test cho các

bài toán cơ bản trong chương IV(SGK tin học 11)

2.3.3 Sinh tệp ngẫu nhiên.

Sử dụng các đoạn chương trình ở mục a, b ta có thể lưu các giá trị ngẫu nhiên sinh ra vào các tệp Việc làm này sẽ giúp cho giáo viên dễ dàng hơn trong việc kiểm tra và bồi dưỡng học sinh giỏi(việc tạo các tệp để test giúp chấm bằng phần mềm tự động dễ dàng và nhanh chóng)

Sau khi có input bằng cách sinh số ngẫu nhiên ta chạy code của mình để sinh output

VD1: Tạo tệp chứa các số nguyên dương, mỗi số cách nhau bởi dấu cách

Đoạn chương trình:

Procedure sinh(m:word);

Var i:integer;

Begin

Randomize;

For i:=1 to n do Write(f1,a[i]:=random(m)),’ ‘);

End;

VD2: Tạo tệp chứa xâu kí tự gồm các kí tự từ ‘A’ đến ‘Z’ có độ dài ngẫu nhiên(sử dụng đoạn chương trình ở muc 2.3.2)

Đoạn chương trình.

F1:text;

Begin

Assign(f1,’xaukitu.inp’);rewrite(f1);

Xaungaunhien:=’’;

N:=1+random(500);

For i:=1 to n do xaungaunhien:=xaungaunhien+chr(random(25)+65);

write(f1,xaungaunhien);

close(f1);

End;

2.3.4 Một số ví dụ.

Dựa trên các hàm và thủ tục đã trình bày ở mục 2.3.3 tôi đưa ra một số bài toán hay dùng trong chương trình

Bài toán 1: Sinh một mảng ngẫu nhiên tăng.

Thuật toán:

- Sinh ngẫu nhiên phần tử đầu tiên: a[1]:=random(n);

Trang 9

- Phần tử thứ 2 trở đi thì được sinh bằng phần tử trước đó cộng thêm một lượng ngẫu nhiên: a[i]:=a[i-1]+random(n);

Đoạn chương trình:

Begin

Randomize;

a[1]:=random(n);

for i:=2 to n do a[i]:=a[i-1]+random(n);

end;

{chương trình chính ta chỉ cần gọi sinh(n) để tạo mảng tăng dần}

Nhận xét: Từ bài toán này ta có thể sinh tệp ngẫu nhiên tăng như sau:

i:integer;

x:longint;

Begin

Randomize;

Assign(f,fi);{fi được khai báo với một tên tệp cho trước}

x:=random(n);

for i:=2 to n do

x:=x+random(n);

write(f,x,’ ‘);

end;

end;

Bài tập áp dụng: Sinh mảng giảm dần

Bài toán 2: Sinh tệp cấp số cộng (Tạo test bài 5 trang 79 SGK tin học 11)

Thuật toán:

- Sinh số hạng đầu tiên và công sai d như sau: x:=random(n); d:=random(n)+1;

- Từ số thứ 2 sinh bằng cách lấy số trước đó cộng với d

Đoạn chương trình:

Procedure sinh(n:integer);

i,d:integer;

x:longint;

Begin

Randomize;

Trang 10

Assign(f,fi);{fi được khai báo với một tên tệp cho trước}

x:=random(n);

d:=random(n)+1; {cộng thêm 1 để tránh trường hợp d=0}

for i:=2 to n do begin

x:=x+random(n);

write(f,x,’ ‘);

end;

end;

Nhận xét: Từ bài toán sinh mảng cấp số cộng ta có thể sinh mảng cấp số nhân một

cách dễ dàng

Bài toán 3: Sinh ngẫu nhiên mảng có tỉ lệ 1:k

Thuật toán:

- t:=sum(a[1 n]) {t là tổng các số}

- Muốn chia mảnh thành hai phần a[1 i] và a[i+1 n] có tổng gấp nhau k lần thì ta phải có:

+ Tổng các số phải chia hết cho (k+1): Giả sử t1=t div (k+1) và tk=t-t1; + Nếu tồn tại i (i<=i<=n) thì sum(a[1 i])=t1 hoặc sum(a[1 i])=tk

Ta chọn d=random(m div 2)+1 là điểm chia hai phần Ta lại chọn ngẫu nhiên một trong hai trường hợp

Trường hợp 1: Đoạn a[1 d] bằng k lần đoạn còn lại

Trường hợp 2: Đoạn a[(d+1) n] bằng k lần đoạn a[1 d]

Đoạn chương trình:

Procedure Sinh(m,k:word);

Var i,d,t:longint;

Begin

d:=random(m div 2)+1;

{d là điểm chia và trong khoảng từ 1 đến m div 2 - 1}

for i:=1 to d do

a[i]:=random(m);

t:=t+a[i];

if random(2)=0 then a[d]:=a[d]+ (k-1)*t

{đoạn a[1 d] gấp k lần đoạn a[(d+1) n]}

else t:=t*k; {đoạn a[(d+1) n] gấp k lần đoạn a[1 d]}

if i:=d+1 to n-1 do

a[i]:=random(t);

Trang 11

a[n]:=t;

end;

Nhận xét: Nếu k=1 thì bài toán trở thành bài toán chia tỉ lệ 1:1;

Bài toán 4: Sinh ngẫu nhiên đều.

Bài toán sinh ngẫu nhiên mảng nguyên a n phần tử tạo thành k đoạn liên tiếp

có tổng bằng nhau

Thuật toán:

Chọn ngẫu nhiên số lượng phần tử trong đoạn là random(n div k)+1, khi đó

số lượng các phần tử phát sinh sẽ không vượt quá k*(n div k)<=n Sau đó ta chỉnh cho số lượng đúng bằng n

- Giả sử a[c d] là đoạn thứ i cần sinh ngẫu nhiên sao cho:

a[c]+a[c+1]+a[c+2]+ +a[d]=t;

- Ta sinh đoạn này như sau(ta làm tương tự như bài toán 3)

+ Gán t1:=t;{t1 là giá trị còn lại của tổng trong đoạn}

+ Gán giá trị ngẫu nhiên từ 0 đến t1 cho các phần tử a[c d-1]

+ Đồng thời chỉnh giá trị còn lại của tổng đoạn: t1:=t1-a[i] (với i =c d-1) Khi đó thì ta có: a[c]+a[c+1]+a[c+2]+ +a[d-1]<t

+ Ta đặt giá trị còn lại của tổng đoạn vào phần tử cuối: a[d]:=t1;

Đoạn chương trình.

Procedure sinh(n,k,t;integer);

Var i,j,p,s,t1:integer;

Begin

S:=n div k;{s là số phần tử tối đa trong đoạn}

i:=0;

for j:=1 to k do {sinh đoạn thứ j}

begin

t1:=t;

for p:=1 to random(s) do

begin

inc(i);

a[i]:=random(t1);

t1:=t1-a[i];

end;

inc(i); {phần tử cuối của đoạn}

a[i]:=t1;

end;

Ngày đăng: 17/10/2017, 09:32

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w