Hỏi/ Thắc mắc - Hỏi về Pascal tin học? | VN-Zoom | Cộng đồng Chia Sẻ Kiến Thức Công Nghệ và Phần Mềm Máy Tính

Adblocker detected! Please consider reading this notice.

We've detected that you are using AdBlock Plus or some other adblocking software which is preventing the page from fully loading.

We need money to operate the site, and almost all of it comes from our online advertising.

If possible, please support us by clicking on the advertisements.

Please add vn-z.vn to your ad blocking whitelist or disable your adblocking software.

×

Hỏi/ Thắc mắc Hỏi về Pascal tin học?

Hacker Is Real

Hãy like thay vì post thanks ❤❤❤!
Xin mọi người code để viết một chương trình như sau:
- In ra lần lượt 1 số bất kì từ 1 - 52 (không trùng nhau) --> sau khi in xong là sẽ in 52 lần, mỗi lần 1 con khác nhau --> kết thúc chương trình
Mong mọi người giúp em
 

lvt491

Rìu Vàng Đôi
Ko còn nhớ pascal ntn nữa rồi ^^
Tạo 1 mảng M các phần tử = 0 hết
Làm 1 vòng lặp
Random từ 1 đến 52
So sánh số random được nếu ko trùng số nào trong mảng M thì lưu luôn nó vào mảng M.
Khi nào mảng M(max)#0 thì thoát vòng lặp
Hơi lan man bạn cố hiểu nhé :p

Code autoit bạn tham khảo nhé
;khai báo mảng
Global $mang[53]

;gán các phần tử = 0
For $i=1 to 52
$mang[$i]=0
Next
;tạo vòng lặp chỉ kết thúc khi phần tử thứ 52 được gán
While ($mang[52]==0)

;tạo số random
$rd=Random(1,52,1)
$exist=False

;kiểm tra xem số random đã tồn tại trong mảng chưa
For $i=1 to 52
If $mang[$i]==$rd Then
$exist=true
ExitLoop
EndIf
Next

;nếu chưa tồn tại thì thêm nó vào mảng
If Not $exist Then
For $i=1 To 52
If $mang[$i]==0 Then
$mang[$i]=$rd
ExitLoop ;thoát vòng lặp For
EndIf
Next

WEnd

;in mảng đã hoàn thành ra
For $i=1 To 52
ConsoleWrite($mang[$i]&";")
Next
 
Sửa lần cuối:

malemkhoang

Rìu Chiến
Lại đánh bạc online rồi.
1. Chia nó ra thành 4 đống, mỗi đống 13 lá bài:
Đống 1, từ 1 đến 13;
Đống 2, từ 14 đến 26;
Đống 3, từ 27 đến 39;
Đống 4, từ 40 đến 52;
2. Thủ tục trang bài:
B1. Chọn số nguyên bất kỳ trong khoảng từ 1 đến 13
B2. Thay thế phần tử tương ứng theo số đã chọn của từng đống với phần tử đầu hoặc phần tử cuối của từng đống
B3. Chọn số nguyên bất kỳ trong khoảng từ 1 đến 13
B4. Thay thế phần tử tương ứng theo số đã chọn từ đống nọ sang đống kia
B5. Thay thế sự sáng tạo của bạn
3. In ra kết quả bằng vòng lặp kép với chỉ số ngoài từ 1 đến 13, chỉ số trong từ 1 đến 4
 
Sửa lần cuối:

Hacker Is Real

Hãy like thay vì post thanks ❤❤❤!
Lại đánh bạc online rồi.
1. Chia nó ra thành 4 đống, mỗi đống 13 lá bài:
Đống 1, từ 1 đến 13;
Đống 2, từ 14 đến 26;
Đống 3, từ 27 đến 39;
Đống 4, từ 40 đến 52;
2. Thủ tục trang bài:
B1. Chọn số nguyên bất kỳ trong khoảng từ 1 đến 13
B2. Thay thế phần tử tương ứng theo số đã chọn của từng đống với phần tử đầu hoặc phần tử cuối của từng đống
B3. Chọn số nguyên bất kỳ trong khoảng từ 1 đến 13
B4. Thay thế phần tử tương ứng theo số đã chọn từ đống nọ sang đống kia
B5. Thay thế sự sáng tạo của bạn
3. In ra kết quả bằng vòng lặp kép với chỉ số ngoài từ 1 đến 13, chỉ số trong từ 1 đến 4
Thanks
 
Sửa lần cuối:

malemkhoang

Rìu Chiến
==========
Mình còn chưa kịp oánh ván nào mà...

Mã:
program BAC;

Type
TU = Array[1..13] of Byte;

Var
A, B, C, D : TU;
i, j, m : Byte;

Procedure nhap;
Begin
    For i := 1 to 13 do
    Begin
        A[i] := i;
        B[i] := i;
        C[i] := i;
        D[i] := i;
     end;
end;

Procedure trangbai;
Begin
    Randomize;
    For j := 1 to 13 do
    Begin
    (* Move First *)
    i := Random(12) + 1;
    m := A[i];
    A[i] := A[1];
    A[1] := m;
    i := Random(12) + 1;
    m := B[i];
    B[i] := B[1];
    B[1] := m;
    i := Random(12) + 1;
    m := C[i];
    C[i] := C[1];
    C[1] := m;
    i := Random(12) + 1;
    m := D[i];
    D[i] := D[1];
    D[1] := m;
    (* Move Last *)
    i := Random(12) + 1;
    m := A[i];
    A[i] := A[13];
    A[13] := m;
    i := Random(12) + 1;
    m := B[i];
    B[i] := B[13];
    B[13] := m;
    i := Random(12) + 1;
    m := C[i];
    C[i] := C[13];
    C[13] := m;
    i := Random(12) + 1;
    m := D[i];
    D[i] := D[13];
    D[13] := m;
    end;
    (* Move... *)
    For j := 1 to 13 do
    Begin
    i := Random(12) + 1;
    m := A[i];
    A[i] := B[i];
    B[i] := m;
    i := Random(12) + 1;
    m := B[i];
    B[i] := C[i];
    C[i] := m;
    i := Random(12) + 1;
    m := C[i];
    C[i] := D[i];
    D[i] := m;
    i := Random(12) + 1;
    m := D[i];
    D[i] := A[i];
    A[i] := m;
    end;
end;

Procedure hienKQ;
Begin
    Writeln('');
    For i := 1 to 13 do
    Begin
         Writeln(A[i], ' Co');
         Writeln(B[i], ' Ro ');
         Writeln(C[i], ' Bich');
         Writeln(D[i], ' Nhep');
    end;
end;

BEGIN

     nhap;
     trangbai;
     hienKQ;

END.
 

Hacker Is Real

Hãy like thay vì post thanks ❤❤❤!
==========
Mình còn chưa kịp oánh ván nào mà...

Mã:
program BAC;

Type
TU = Array[1..13] of Byte;

Var
A, B, C, D : TU;
i, j, m : Byte;

Procedure nhap;
Begin
    For i := 1 to 13 do
    Begin
        A[i] := i;
        B[i] := i;
        C[i] := i;
        D[i] := i;
     end;
end;

Procedure trangbai;
Begin
    Randomize;
    For j := 1 to 13 do
    Begin
    (* Move First *)
    i := Random(12) + 1;
    m := A[i];
    A[i] := A[1];
    A[1] := m;
    i := Random(12) + 1;
    m := B[i];
    B[i] := B[1];
    B[1] := m;
    i := Random(12) + 1;
    m := C[i];
    C[i] := C[1];
    C[1] := m;
    i := Random(12) + 1;
    m := D[i];
    D[i] := D[1];
    D[1] := m;
    (* Move Last *)
    i := Random(12) + 1;
    m := A[i];
    A[i] := A[13];
    A[13] := m;
    i := Random(12) + 1;
    m := B[i];
    B[i] := B[13];
    B[13] := m;
    i := Random(12) + 1;
    m := C[i];
    C[i] := C[13];
    C[13] := m;
    i := Random(12) + 1;
    m := D[i];
    D[i] := D[13];
    D[13] := m;
    end;
    (* Move... *)
    For j := 1 to 13 do
    Begin
    i := Random(12) + 1;
    m := A[i];
    A[i] := B[i];
    B[i] := m;
    i := Random(12) + 1;
    m := B[i];
    B[i] := C[i];
    C[i] := m;
    i := Random(12) + 1;
    m := C[i];
    C[i] := D[i];
    D[i] := m;
    i := Random(12) + 1;
    m := D[i];
    D[i] := A[i];
    A[i] := m;
    end;
end;

Procedure hienKQ;
Begin
    Writeln('');
    For i := 1 to 13 do
    Begin
         Writeln(A[i], ' Co');
         Writeln(B[i], ' Ro ');
         Writeln(C[i], ' Bich');
         Writeln(D[i], ' Nhep');
    end;
end;

BEGIN

     nhap;
     trangbai;
     hienKQ;

END.
ha ha, cám ơn bạn nha
 

Hacker Is Real

Hãy like thay vì post thanks ❤❤❤!
==========
Mình còn chưa kịp oánh ván nào mà...

Mã:
program BAC;

Type
TU = Array[1..13] of Byte;

Var
A, B, C, D : TU;
i, j, m : Byte;

Procedure nhap;
Begin
    For i := 1 to 13 do
    Begin
        A[i] := i;
        B[i] := i;
        C[i] := i;
        D[i] := i;
     end;
end;

Procedure trangbai;
Begin
    Randomize;
    For j := 1 to 13 do
    Begin
    (* Move First *)
    i := Random(12) + 1;
    m := A[i];
    A[i] := A[1];
    A[1] := m;
    i := Random(12) + 1;
    m := B[i];
    B[i] := B[1];
    B[1] := m;
    i := Random(12) + 1;
    m := C[i];
    C[i] := C[1];
    C[1] := m;
    i := Random(12) + 1;
    m := D[i];
    D[i] := D[1];
    D[1] := m;
    (* Move Last *)
    i := Random(12) + 1;
    m := A[i];
    A[i] := A[13];
    A[13] := m;
    i := Random(12) + 1;
    m := B[i];
    B[i] := B[13];
    B[13] := m;
    i := Random(12) + 1;
    m := C[i];
    C[i] := C[13];
    C[13] := m;
    i := Random(12) + 1;
    m := D[i];
    D[i] := D[13];
    D[13] := m;
    end;
    (* Move... *)
    For j := 1 to 13 do
    Begin
    i := Random(12) + 1;
    m := A[i];
    A[i] := B[i];
    B[i] := m;
    i := Random(12) + 1;
    m := B[i];
    B[i] := C[i];
    C[i] := m;
    i := Random(12) + 1;
    m := C[i];
    C[i] := D[i];
    D[i] := m;
    i := Random(12) + 1;
    m := D[i];
    D[i] := A[i];
    A[i] := m;
    end;
end;

Procedure hienKQ;
Begin
    Writeln('');
    For i := 1 to 13 do
    Begin
         Writeln(A[i], ' Co');
         Writeln(B[i], ' Ro ');
         Writeln(C[i], ' Bich');
         Writeln(D[i], ' Nhep');
    end;
end;

BEGIN

     nhap;
     trangbai;
     hienKQ;

END.
Mình xem rồi, chương trình bạn rất hay nhưng thiếu một chút thân thiện, bạn nên cho lệnh delay hoặc readln để người khác đọc được con nữa chứ chương trình chạy 1 lần luôn á, không kịp nhìn :)), mình thêm rồi, cám ơn bạn nha! :)
 

Hacker Is Real

Hãy like thay vì post thanks ❤❤❤!
Ko còn nhớ pascal ntn nữa rồi ^^
Tạo 1 mảng M các phần tử = 0 hết
Làm 1 vòng lặp
Random từ 1 đến 52
So sánh số random được nếu ko trùng số nào trong mảng M thì lưu luôn nó vào mảng M.
Khi nào mảng M(max)#0 thì thoát vòng lặp
Hơi lan man bạn cố hiểu nhé :p

Code autoit bạn tham khảo nhé
;khai báo mảng
Global $mang[53]

;gán các phần tử = 0
For $i=1 to 52
$mang[$i]=0
Next
;tạo vòng lặp chỉ kết thúc khi phần tử thứ 52 được gán
While ($mang[52]==0)

;tạo số random
$rd=Random(1,52,1)
$exist=False

;kiểm tra xem số random đã tồn tại trong mảng chưa
For $i=1 to 52
If $mang[$i]==$rd Then
$exist=true
ExitLoop
EndIf
Next

;nếu chưa tồn tại thì thêm nó vào mảng
If Not $exist Then
For $i=1 To 52
If $mang[$i]==0 Then
$mang[$i]=$rd
ExitLoop ;thoát vòng lặp For
EndIf
Next

WEnd

;in mảng đã hoàn thành ra
For $i=1 To 52
ConsoleWrite($mang[$i]&";")
Next
ok bạn, mình hiểu rồi, mình viết 2 code cho 1 chương trình luôn á :) thanks bạn
 

TekMonts

Búa Đá Đôi
Dùng đệ quy,

array list;

for(0~51)
{
print(CheckNum(random(1, 52)))
}
CheckNum(int num) : int{
if(!list.containts(num)){
list.add(num);
return num;
} else return (CheckNum(random(1, 52)));
}
ý tưởng là vậy.
bữa vọc angular tính xác suất vietlott :D
 
Sửa lần cuối:

Hacker Is Real

Hãy like thay vì post thanks ❤❤❤!
Dùng đệ quy,

array list;

for(0~51)
{
print(CheckNum(random(1, 52)))
}
CheckNum(int num) : int{
if(!list.containts(num)){
list.add(num);
return num;
} else return (CheckPoint(random(1, 52)));
}
ý tưởng là vậy.
bữa vọc angular tính xác suất vietlott :D
à cám ơn bạn nhé, nhưng mình không hiểu lắm bạn ơi
 

Hacker Is Real

Hãy like thay vì post thanks ❤❤❤!
Anh em nghĩ đơn giản thôi, cao quá rồi!

Mã:
program Hello;
var a: array [1..52] of boolean;
    d, t, i: integer;

begin
  for i:= 1 to 52 do a[i] := false;
  randomize;
  d := 0;
  while d < 52 do
  begin
    t := random(52) + 1;
    if a[t] = false then
    begin
        write(t,' ');
        a[t] := true;
        d := d + 1;
    end
  end
end.
chương trình cũng hay đó bạn, cám ơn bạn nhé :) :)
 

dammage

Rìu Chiến
Anh em nghĩ đơn giản thôi, cao quá rồi!

Mã:
program Hello;
var a: array [1..52] of boolean;
    d, t, i: integer;

begin
  for i:= 1 to 52 do a[i] := false;
  randomize;
  d := 0;
  while d < 52 do
  begin
    t := random(52) + 1;
    if a[t] = false then
    begin
        write(t,' ');
        a[t] := true;
        d := d + 1;
    end
  end
end.
bữa nay tui rảnh phân tích thử cho vui
fV2jNq8.gif
, theo tui hiểu thì code này sẽ sinh 1 số ngẫu nhiên, nếu đã có rồi thì phát sinh lại, vậy thì

Mã:
phát sinh số đầu tiên, tỉ lệ thất bại (bị trùng) là 0% dễ hiểu
sinh số thứ 2, tỉ lệ trùng 1/52 = 1.9230%, trung bình phải random 1/51 = 0.0196 lần mới thành công
sinh số thứ 3, tỉ lệ trùng 2/52 = 3.8461%, trung bình phải random 2/50 = 0.04 lần mới thành công
..........
sinh số thứ 51, tỉ lệ trùng 50/52 = 96.1538%, trung bình phải random 50/2 = 25 lần mới thành công
sinh số thứ 52, tỉ lệ trùng 51/52 = 98.0769%, trung bình phải random 51/1 = 51 lần mới thành công

như vậy để sinh đủ 52 số không trùng nhau thì trung bình sẽ cần random tổng cộng 1/51 + 2/50 + 3/49 + ....... + 50/2 + 51/1 ≈ 184 lần

thử làm theo cách của tui, tạo sẵn mảng có giá trị từ 1 tới 52 xong rồi xài thuật giải fisher-yates để xào nó, nghe tên thì thấy lạnh cẳng chứ thực ra nó siêu dễ, còn dễ hơn mấy cái sắp xếp này nọ nữa
7L1XX2F.gif

Mã:
To shuffle an array a of n elements (indices 0..n-1):
for i from n - 1 downto 1 do
    j = random integer with 0 <= j <= i
    exchange a[j] and a[i]
https://www.geeksforgeeks.org/shuffle-a-given-array-using-fisher-yates-shuffle-algorithm/

pascal tui quên hết trơn rồi, mượn tạm code bạn sửa lại chút xíu, có thể sai vài lỗi cú pháp
Mã:
begin
    for i:= 1 to 52 do a[i] := i;
    randomize;

    for i:= 52 to 1 do
    begin
        d := random(i) + 1;
        t := a[i];
        a[i] := a[d];
        a[d] := t;
    end

    for i:= 1 to 52 do write(a[i], ' ');
end.
nói chung thấy cách của tui là tốt nhất
fV2jNq8.gif
, bạn malemkhoang ở trên thật ra cũng là cách này, có điều bạn đó xào bài giống trong phim quá
7L1XX2F.gif
 
Sửa lần cuối:
bữa nay tui rảnh phân tích thử cho vui
fV2jNq8.gif
, theo tui hiểu thì code này sẽ sinh 1 số ngẫu nhiên, nếu đã có rồi thì phát sinh lại, vậy thì

Mã:
phát sinh số đầu tiên, tỉ lệ thất bại (bị trùng) là 0% dễ hiểu
sinh số thứ 2, tỉ lệ trùng 1/52 = 1.9230%, trung bình phải random 1/51 = 0.0196 lần mới thành công
sinh số thứ 3, tỉ lệ trùng 2/52 = 3.8461%, trung bình phải random 2/50 = 0.04 lần mới thành công
..........
sinh số thứ 51, tỉ lệ trùng 50/52 = 96.1538%, trung bình phải random 50/2 = 25 lần mới thành công
sinh số thứ 52, tỉ lệ trùng 51/52 = 98.0769%, trung bình phải random 51/1 = 51 lần mới thành công

như vậy để sinh đủ 52 số không trùng nhau thì trung bình sẽ cần random tổng cộng 1/51 + 2/50 + 3/49 + ....... + 50/2 + 51/1 ≈ 184 lần

thử làm theo cách của tui, tạo sẵn mảng có giá trị từ 1 tới 52 xong rồi xài thuật giải fisher-yates để xào nó, nghe tên thì thấy lạnh cẳng chứ thực ra nó siêu dễ, còn dễ hơn mấy cái sắp xếp này nọ nữa
7L1XX2F.gif

Mã:
To shuffle an array a of n elements (indices 0..n-1):
for i from n - 1 downto 1 do
    j = random integer with 0 <= j <= i
    exchange a[j] and a[i]
https://www.geeksforgeeks.org/shuffle-a-given-array-using-fisher-yates-shuffle-algorithm/

pascal tui quên hết trơn rồi, mượn tạm code bạn sửa lại chút xíu, có thể sai vài lỗi cú pháp
Mã:
begin
    for i:= 1 to 52 do a[i] := i;
    randomize;

    for i:= 52 to 1 do
    begin
        d := random(i) + 1;
        t := a[i];
        a[i] := a[d];
        a[d] := t;
    end

    for i:= 1 to 52 do write(a[i], ' ');
end.
nói chung thấy cách của tui là tốt nhất
fV2jNq8.gif
, bạn malemkhoang ở trên thật ra cũng là cách này, có điều bạn đó xào bài giống trong phim quá
7L1XX2F.gif
kkk
 

TekMonts

Búa Đá Đôi
à cám ơn bạn nhé, nhưng mình không hiểu lắm bạn ơi
Tạo một mảng có 52 phần tử

Từ một đến 52, in ngẫu nhiên một số, nếu số đó chưa có trong mảng thì thêm số đó vào mảng rồi in ra.
nếu số đã có trong mảng thì lặp lại bước kiểm tra số đã có trong mảng chưa bằng một số ngẫu nhiên mới
 

Hacker Is Real

Hãy like thay vì post thanks ❤❤❤!
Tạo một mảng có 52 phần tử

Từ một đến 52, in ngẫu nhiên một số, nếu số đó chưa có trong mảng thì thêm số đó vào mảng rồi in ra.
nếu số đã có trong mảng thì lặp lại bước kiểm tra số đã có trong mảng chưa bằng một số ngẫu nhiên mới
ok thanks banj
 


Top