PDA

View Full Version : giúp giùm em giải bài chọn số ngẫu nhiên



Michelle Yip
12-12-2007, 18:56
Đề bài là viết chương trình để máy tính chọn ra 10 số điện thoại ngẫu nhiên 090 3xx ***x (ko trùng lặp)
giúp giùm em với. cảm ơn rất nhìu ^_^

mr_invincible
12-12-2007, 19:03
Dùng lệnh Randomize để khởi động bộ sinh ngẫu nhiên)
Cho 1 biến đếm chạy từ 1 đến 10
Trong vòng lặp đó, ghi ra 0903 rồi cho 1 vòng lặp khác chạy từ 1 đến 6 (số lượng số thiếu) và in ra màn hình các số ngấu nhiên nhỏ hơn 10 write(random(10)+1 rồi xuống dòng (để ghi số điện thoại khác)

Michelle Yip
12-12-2007, 19:24
em ko hiểu lắm và chưa làm ra T__T
sau khi dùng randomize, biến đếm For i:=1 to 10 do...
vậy sau do là "write('0903')" ạ?
rồi sau đó làm sao nữa, em thử mà hem ra. >_<

mr_invincible
12-12-2007, 20:20
Xin lỗi ở trên viết nhầm. Phải là random(10), không có cộng 1
For i:=1 to 10 do
begin
write('0903');
For j:=1 to 6 do Write(random(10)); {viết các số ngẫu nhiên}
Writeln;
end;

mr_invincible
12-12-2007, 20:22
À hình như tôi vẫn không đọc kĩ đề. Vì không trùng lặp nên bạn phải lưu lại tất cả các số và kiểm tra xem số đó đã có chưa. Có thể dùng một mảng gồm các biến kiểu string để lưu số điện thoại (thay Write(random(10)) bằng lệnh lưu lại giá trị số đấy) và trước khi in ra cần kiểm tra xem số đó đã có chưa.
Có thể làm 1 hàm kiểm tra xem số đó đã có trong mảng lưu kq chưa
Rồi thay đoạn trên như sau
i:=0;
repeat
inc(i);
luukq[i]:='';
repeat
val(random(10),ch,code); {ch là biến kiểu char còn code là biến kiểu integer}
luukq[i]:=luukq[i]+luukq+ch;
until kt(s,i-1); {Kiểm tra xem số vừa lập đã có chưa trong các số trước chưa}
until i=10;
Chương trình trên chưa được test, không biết có đúng không. Nếu sai mong bạn thông cảm

mr_invincible
12-12-2007, 20:31
Hàm kiểm tra số đã có chưa có thể viết như sau:
Function kt(s:string;n:integer):boolean;
Var i:integer;
Begin
kt:=false;
For i:=1 to n do If s=luukq[i] then exit;
kt:=true;
End;
Hàm trên cũng chưa được test. Nếu sai mong bạn thông cảm

cashier
12-12-2007, 20:46
bạn cho mình hỏi, hàm kt(s)của bạn như thế nào được không ?
( mà bạn truyền biến s là biến gì nhỉ ?)

phuclun
12-12-2007, 21:12
Bác invi làm việc cẩu thả wớ,sửa tới sửa lui àh,tui vẫn chưa bik sử dụng hàm Randomize nên đành đứng ngó thoai.Bác post code lên giùm tui đc hok,thông cảm,tui mới học đc 3 tháng àh.

cashier
12-12-2007, 21:22
Thế nào nhỉ . Ý tưởng của bạn tốt, nhưng bạn cài đặt vậy là không đúng, nếu chạy thử sẽ báo lỗi ngay lập tức . Bạn thử chạy = tay đã thấy lỗi rồi Xem và sửa lại đi ban.
@ phucluc: random(n) là 1 hàm trả về một số nguyên là giá trị ngẫu nhiên nằm trong khoảng từ 0-> n-1 hay là từ 1 -> n-1 gì đó (mình cũng chẳng nhớ rõ nữa :) ) . Trước khi dùng hàm này, ở phần khai báo uses thì khai báo thêm unit crt và trong thân chương trình, trước khi sử dụng thì gõ thêm lệnh randomize. Tóm lại nó là thế đấy, chẳng có gì cả . Mà bạn mới học có 3 tháng thui ah ? sao biết nhiều vậy ? ngưỡng mộ *__* .

mr_invincible
12-12-2007, 22:09
Lạ nhỉ tôi đã xem lại rồi mà vẫn không hiểu mình sai ở đâu. Bạn có thể nói rõ hơn được không?
Mà bạn phuclun mới học được 3 tháng thôi à? Sao siêu quá vậy? Có thể cho biết thêm bạn bao nhiêu tuổi không? Đúng là nhân tài hiếm có. Đúng là phục luôn rồi đó
Hàm random(n) cho giá trị ngẫu nhiên trong khoảng 0 -> n-1 mà hình như cũng không cần khai báo uses crt vì nó là 1 hàm bình thường thôi mà

cashier
12-12-2007, 22:44
Bạn không thấy thật ah? Để mình chỉ vậy nhá
1. Ở hàm kt . bạn truyền vào tham trị là s ( kt(s)) vậy bạn thử xem lại chương trình chính xem s là biến gì vậy ? . Khi đó chương trình sẽ báo lỗi là không tồn tại biến này .
2. Ở hàm kt . Bạn truyền tham trị i-1 ( theo chương trình chính là số điện thoại cần tìm ) . Vậy mình hỏi bạn, làm thế nào để bạn tìm đủ 6 số cần phải thay vào ? . Ví dụ đơn giản thế này nhá;
cái vòng lặp repeat - until thứ 2 í: bạn sẽ cộng thêm vào luukq[i] cho đến khi nào ( nếu như đây là kết quả đầu tiên ) thì nó sẽ chạy không bao giờ dừng . Đảm bảo chương trình của bạn treo ngay :D

Theo mình , để sửa những điều trên không khó :


i:=0;
repeat
inc(i);
luukq[i]:='';
j:=0;
repeat
j:=j+1;
val(random(10),ch,code);
luukq[i]:=luukq[i]+ch;
until kt(s,i-1,j);
until i=10;



và sửa thêm ở kt:

Function kt(s:string;n:integer; var j:integer):boolean;
Var i:integer;
Begin
kt:=false;
if j<>6 then begin j:=0; exit end;
j:=0;
For i:=1 to n do If s=luukq[i] then exit;
kt:=true;
End;


Mình cũng lưu ý các bạn, một khi đã post code thì nên để trong thẻ [code] [ /code] để nhìn bài dễ hơn .


Còn về hàm randomize, mình chắc chắn phải khai báo uses crt vì đây không phải là một hàm bình thường ( hàm bình thường là các hàm hiểu như ord hay chr thì trước khi dùng nó đâu cần phải khai báo gì đâu .Còn random thì phải gõ lệnh randomize trước cơ mà :) )

phuclun
12-12-2007, 22:58
Tui mà là nhân tài gì đâu,chỉ là may mắn làm đc mấy bài cỏn con àh.
Tui năm nay lên lớp 10,lần đầu tiên đụng vào Pascal khoảng đầu học kỳ(tui thi Toán rớt-->sang Tin),nếu nói chính xác thì học từ đầu năm lớp 9 hiểu đc 2 lệnh write,read là câm nín òi,kt thì cứ ngồi cạnh mấy thằng giỏi Tin mà chép(hồi đó tui tập trung vào Toán,Tin là môn phụ,chép mặc dù *** hiểu gì,ở nhà cũng *** thèm cài Pascal,phí thời gian ngồi code+debug),từ đầu năm nay mới bắt đầu mở Pascal lên mà học.Kt lớp 9 nhớ đc phần khai báo var,begin,write,read.Vậy nên nói tui biết Pascal đc 1 năm 3 tháng nhưng tui học Pascal đc 3 tháng.
Mấy đưá bạn tui còn giỏi hơn tui nhiều,cũng chuyển từ Toán sang nhưng bọn nó học NK(TPHCM),bài của tui bọn nó kêu''Bài này chỉ xứng đáng cho lớp tao đánh máy''.Hết biết,bọn NK ăn cái gì mà trâu vậy.Nhân tài giấu mặt nhiều lắm,còn cái kiểu lộ mặt như tui chỉ là bình thường.

mr_invincible
12-12-2007, 23:05
Gửi bạn cashier
Xin lỗi lúc nãy không để ý lại còn viết sai nữa chứ

À
i:=0;
repeat
inc(i);
luukq[i]:='';
repeat
for j:=1 to 6 do
begin
val(random(10),ch,code); {ch là biến kiểu char còn code là biến kiểu integer}
luukq[i]:=luukq[i]+ch;
end;
until kt(luukq[i],i-1); {Kiểm tra xem số vừa lập đã có chưa trong các số trước chưa}
until i=10;


Còn sửa nhiều như bạn có lẽ không cần thiết

cashier
12-12-2007, 23:07
Hờ hờ, thì 1 bài tin bao giờ chẳng có nhiều cách làm :) , tui chỉ minh hoạ cách sửa sao cho " không giống sửa " :D.
mà bạn lại xem lại đi :


luukq[i]:=luukq[i]+luukq[i]+ch; :D
Ồ, mới học lớp 10 mà gớm thât. Tui năm ngoái cũng chuyển từ toán sang tin ( thi toán thiếu 0,25 mới đau lòng chứ :( ) nhưng mà phải đến 2 tháng mới biết write và read :D thêm 2 tháng nữa để biết thêm mảng + xâu :D và 2 tháng nữa mới hiểu thế nào là pascal =)) . bơ na nờ .
"Trẻ con" bây giờ có điều kiện ghê, chẹp chẹp ... :D :D :D

mr_invincible
12-12-2007, 23:11
Gửi bạn cashier
Mình càng chắc chắn hơn là khi sử dụng hàm randomize và random không cần phải uses crt
Cách đơn giản nhất là bạn vào phần help của Pascal (Shift+F1) rồi vào random bạn sẽ thấy đây chỉ là một hàm bình thường của chương trình (nếu là của unit crt thì phải đề là crt procedure/ crt function)
Nguyên tắc làm việc của hai lệnh này.
- Lệnh random: cho ra 1 số tiếp theo trong bộ sinh ngẫu nhiên theo công thức nào đó
- Lệnh randomize: đặt lại vị trí bắt đầu của dãy số trong bộ sinh ngẫu nhiên (công thức dựa theo ngày giờ của máy)
Dựa theo 2 công thức này, người ta đã chứng minh được là số được sinh ra tương đối ngẫu nhiên
Chỗ bạn vừa nói sai có một chút à chẳng qua lúc copy hơi nhầm
Ủa mà sao lắm người bắt buộc phải chuyển từ toán sang tin vậy nhỉ? Không có ai chọn tin ngay từ đầu vì yêu thích môn học này à?

cashier
12-12-2007, 23:17
Híc, mặc dù không muốn nhưng phải công nhận đúng là mình nhầm thật :( ( hồi đó thầy giáo nói thế nào, cứ thế nghe theo, không chạy thử gì cả , tắc trách quá )
Cảm ơn bạn mr_invincible đã chỉ ra lỗi sai của mình :)

phuclun
12-12-2007, 23:24
Theo mình thì có 5 lý do chính là như thê này
1)Tin cấp 2 chỉ là môn phụ.Mình lớp 9 mới đc học 1 tiết 1 tuần thôi mà
2)Sự kính nể dành cho dân chuyên Tin ít.Đa số nể chuyên Toán nhiêù hơn,khi nói mình dân chuyên Toán thì đương nhiên phải oách hơn rồi-->nhân tài qua bên Toán cả.
3)Ko biết đc cái hay của Pascal.Theo như suy nghĩ của mình hồi cấp 2 thì Pascal là thư ngôn ngữ từ thời Napoleon còn cởi truồng-->ko đáng quan tâm
Bây giờ người ta xài ngôn ngữ C++ rồi mà con ngồi Pascal.
4)Lười.Học tin mà chỉ ngồi chép bài mà ko suy nghĩ,ko tự code,tự debug thì làm sao mà hiểu.
5)Thiếu máy móc hỗ trợ học tập.Nếu so với Toán chỉ cần 1 cây viết+1 tờ giấy nháp thì Tin học khác 1 trời 1 vực.

mr_invincible
12-12-2007, 23:27
Nhưng mà kể ra bạn mới học có vài tháng như vậy là siêu lắm rồi đó. Không hiểu bạn đang học trường nào.
Bạn có thể giải thích thuật toán củ hành là cái gì không?

mr_invincible
12-12-2007, 23:27
Ô hình như mình post nhầm topic rồi thì phải

phuclun
12-12-2007, 23:36
Bác invi hôm nay on sung wa',spam liên tục từ 44 bài lên 61 bài,bó tay
Còn bác hỏi thuật toán củ hành là gì thì thuật toán đó đc suy ra từ bài toán bác cho đó.Bài toán đó đc gọi là bài toán củ hành.Thuật toán đó có thể áp dụng cho 1 số bài(như bài của tui cho là 1 ví dụ)
Hok bik có đc gọi là thuật toán hay ko,cứ biết thầy nói gì thì bây giờ nói các bác cái đó.

Long_Phung
13-12-2007, 12:13
Theo như suy nghĩ của mình hồi cấp 2 thì Pascal là thư ngôn ngữ từ thời Napoleon còn cởi truồng-->ko đáng quan tâm


Pascal là ngôn ngữ để thể hiện thuật toán. Có những bài toán C không thể thực hiện được ( hoặc thực hiện được nhưng dài dòng và khó hiểu khi đọc code)

Hix, lạc chủ đề rùi...

cashier
13-12-2007, 13:51
Đúng là tui không chọn môn tin vì những lí do đó, ngoài ra cũng muốn bổ sung thêm :D :
1/Môn tin không thi tốt nghiệp mà cũng chẳng thi đại học :(
2/Môn tin thì chỉ cần nghe tên là đã biết ảnh hưởng tới sức khoẻ ( đặc biệt là mắt ) nên chẳng bố mẹ nào lại muốn con chọn môn này cả, thương con lắm :) trong khi mấy môn kia chẳng tổn hại gì đến sức khoẻ cả
( mới đầu pà con họ hàng ai cũng khuyên mình không nên theo tin, học ở trường bình thường còn hơn, may mà mình kiên định :D )

chungkid1
13-12-2007, 21:37
Theo như suy nghĩ của mình hồi cấp 2 thì Pascal là thư ngôn ngữ từ thời Napoleon còn cởi truồng-->ko đáng quan tâm

Ko đáng quan tâm hả?Có biết Delphi là cái gì không?Nó là ngôn ngữ OOP cực mạnh phát triển trên nền tảng cái ngôn ngữ "ko đáng quan tâm" của bạn đấy.Vào đây xem thử nhé http://en.wikipedia.org/wiki/Delphi_language

Pascal là ngôn ngữ để thể hiện thuật toán.
Đây là câu cửa miệng của giáo viên dạy tin học.Bởi vì họ không chịu cập nhật nên
chỉ biết Pascal như thế mà thôi,ko hề biết đến Delphi là cái gì cả(bạn vào địa chỉ ở trên xem nhé).
Như tôi đây,toàn bộ lớp Tin 24 người mà chỉ có tôi là thi vào vì thich môn Tin,còn lại toàn là vì thi trượt các lớp chuyên khác mà vào.Có lần nghe thằng
bạn nói câu này mới điên:"Gặp bạn bè cũ nói mình học lớp Tin,xấu hổ quá!".Tức sôi máu!

chungkid1
13-12-2007, 22:09
gì đây,muốn gây sự à?Đợi tí lập nick Zing nói chuyện tiếp
vừa post đề thi qg ngoài kia kìa,ra mà down

phuclun
13-12-2007, 22:22
trời ơi,bác kid làm gì mà nổi nóng lên thế,đã nói là suy nghĩ hồi cấp 2 mà,bây giờ đâu còn thế nữa đâu.Đã nói là 1 trong các nguyên nhân rồi mà bác bắt bẻ tui wa',tui chỉ nhớ lại quá khứ thôi mà.
P/s:Chắc đề tài này đụng chạm vào danh dự của bác kid,đề nghị chấm dứt đề tài này chứ nếu ko lại


gì đây,muốn gây sự à?Đợi tí lập nick Zing nói chuyện tiếp

mr_invincible
15-12-2007, 13:38
Có lẽ các bạn thích nói chuyện thêm thì có thể vào phần "góc thư giãn" hay "Chit Chat" chứ nói ở đây nghe không được hay lắm

cashier
21-12-2007, 21:09
Ui ui , buồn cười đau hết cả bụng . Suýt nhập viện =))
Đã hô ổng del mấy bài kia đi không người ta hiểu nhầm mà không nghe
Mà cũng khổ thân mấy bạn, hiểu nhầm mất ý bạn Chung nên tưởng mình là " đối tượng nổi nóng " của bạn Chung . Lại đau bụng rồi :D

Mà dạo này bạn Chung cũng " bận" lắm, chắc không có thời gian thanh minh đâu . Vậy để em giải thích cho các bạn hiểu vậy ... :

Chuyện là thế này, ngoài 4rum em và bạn kid có tí bức xúc với nhau, thế là không đánh lại ngoài đời :) pác Kid định cậy ta đây IT ( hé hé) nên lên mạng giải quyết bức xúc, thành ra mấy cái # mang " nhã ý " " hăm doạ" kia chẳng liên quan gì tới topic này cả ( Lại đau bụng tiếp :D )
( cũng tại em del mấy bài kia của em nên thành ra pác Kid cãi nhau với gió ... )

Mà đấy , cũng tại cái tội thích bắt bẻ người khác + không chịu nhận sai thành ra em với pác Kid mới có bức xúc ... Vậy nay em xin post bài này để đính chính, bao giờ bạn Kid on em sẽ bảo del ngay bài kia không có khi lại có người ban mất nick pác Chung ( Ôi, không thể dừng cười được nữa rồi :)) )

Mong mấy pác lần sau có thấy bài nào của pác Kid mà "hình như " có nội dung động chạm tới mình thì là hiểu nhầm hết đó ( pác nè nói thế chứ hiền lắm, chắc chỉ dám bắt nạt mỗi mình em ... )

trankientrung
24-12-2007, 21:05
Em nè, Yêu thích môn tin tù nhỏ.Nên rất thích học những gì liên quan đến Tin. Hì Hì !!