Tin học Lập trình Pascal !

M

marik

@Storm: Anh thấy đệ quy thì chỉ cần làm 2 bài 8 con hậu và mã đi tuần là ổn vì cái này cũng không khó lắm mà cũng chỉ dùng khi hết đường!
Thử làm bài này xem sao: Cho mảng 3x3, tìm tất cả các cách điền các số từ 1->9 sao cho tổng hàng ngang=hàng dọc= đường chéo :d
 
D

diemhang307

Tin học cấp tốc Pascal

Bài : Cấu trúc chương trình Pascal
I/ Những nguyện tắc cơ bản của lập trình Pascal
1. Các kí hiệu sử dụng trong Pascal
Ngôn ngữ Pascal được xây dựng từ các kí hiệu : begin, end, var , while , do ........và các kí tự a, b , c , d , ....., A, B, C , D ...., 1,2 ,3, 4....Ngôn ngữ Pascal không dùng các kí hiệu của bộ chữ cái HY Lạp
Để xây dựng chương trình - các kí hiệu phải tuân theo quy ước về ngữ pháp và ngữ nghĩa quy định của Pascal.
a) Danh hiệu
Trong Pascal để đặt tên cho các " biến , hằng , kiểu , chương trình con ...." . []Ta dùng “danh hiệu “ , Danh hiệu trong Pascal quy định bắt đầu phải là một chữ cái , sau đó là một chữ cái hay chữ số , hoặc dấu gạch dưới _
Ví dụ : Tam
X
PT_bac_1
Hanh
Ví dụ : các biến sau không phải là danh hiệu
2bien
n!
hang h
Trong Pascal danh hiệu không phân biệt chữ thường và chữ hoa
VD : diem_hang và DIEM_HANG là một
*chú ý : ta không nên đặt danh hiệu trùng với danh hiệu của ngôn ngữ và nên dùng danh hiệu có tính gợi nhớ để dễ viết và kiểm tra chương trình , người đọc cũng cảm thấy dễ hiểu
VD : Write , Writeln , read , readln , sqrt , integer, real ………
b) Từ khóa
Trong ngôn ngữ chỉ có những từ được dành riêng là những phần tử tạo nên ngôn ngữ . Do đó hcungs ta không được đặt những danh hiệu trùng với những từ dành riêng này . Người ta gọi những từ này là những từ khóa
VD : Progam , begin , end , while , do , procedure, function , type , var…
Từ dành riêng cũng không phân biệt chữ thường và chữ hoa
Một số từ dành riêng trong Pascal
And Array Begin Case Const Div Do Downto
Else End File For Forward Function Goto if
Program Record Repeat Set Shl Shr String Then
To Type Until Var While With Xor
c) Khoảng trắng dấu chấm phẩy , dấu móc , dấu nháy đơn , toán tử toán hạng
=> Khoảng trắng : Dùng để cách biệt 2 từ trong chuỗi
=> Dấu chấm phẩy : Dùng sau tên chương trình , sau các câu lệnh (trừ câu lệnh trước ELSE – đề cập sau
=> Dấu móc : { } “ Trong Pascal những gì đặt trong hai dấu móc sẽ là phần ghi chú
=> Dấu nháy đơn “ ‘ “ Dùng để bao một chuỗi
=> Toán tử : Đặt giữa hai toán hạng . VD : x+2, y=8 , 7> 3, x< 7 , z >= y … vậy + ,=, > ,< ,<= là các toán tử , còn hai bên sẽ là các toán hạng .
2/ Cấu trúc một chương trình Pascal
Một chương trình trong Pascal gồm các phần khai báo và sau đó là thân chương trình
Khai báo program
Khai báo Uses
Khai báo Label
Khai báo Const
Khai báo Type
Khai báo Var
Khai báo các chương trình con ( thủ tục hay hàm )
Thân chương trình
Thân của chương trình được bắt đầu bằng từ khóa Begin và kết thúc bằng từ khóa End và dấu chấm “ . “ Giữa Begin và End là các phát biểu
VD : Program Chuongtrinhmau;
Uses
……………
Label
…………..
Const
………….
Type
…………..
Var
………..( Khai báo tên và kiểu của các biến )
Function …
End;
Proceduce….
End;
Begin
……….
………….
End.
Thông thường trong một chương trình Pascal , các khai báo Uses , Label , const , type, Function , Procedure có thể có hoặc không tùy theo bài , nếu không dùng biến thì cũng không cần khai báo Var , tuy nhiên hầu hết các chương trình đều dùng khai báo Program, var các biến thân chương trình .
 
V

vipgood9x

các bác giúp e bài này với



Có N người tử tội đem ra pháp trường, xếp vòng tròn
vua cho 1 ân huệ, đưa cho 1 con dao và bảo bọn họ tự chém nhau người cuối cùng sống sẽ được thoát tội. Và mỗi người chỉ luôn chém người bên trái mình trong 1 lần cầm dao,sau khi chém thì đưa dao cho người bên trái tiếp theo (còn sống) cứ chém đến khi nào chỉ còn 1 người.
Hỏi phải đứng vị trí bao nhiêu kể từ người đầu tiên được đưa dao để có thể sống.

Dữ liệuu: Vào từ file INP.TXT chứa số N (1<N<100).
Kết quả: Đưa ra file OUTPUT>TXT là vị trí để có thể sống nếu đứng đó
Vi dụ:
INP.TXT OUT.TXT
5 3
 
Last edited by a moderator:
M

marik

Bài này nếu ai giỏi toán chắc chẳng cần viết code :D
Mã:
var a:array[1..100] of 0..1;
n,i:integer;
f:text;
function ketiep(j:integer):integer;
var k,kt:integer;
begin
kt:=0;
for k:=n downto j+1 do if a[k]=1 then kt:=k;
if kt = 0 then for k:=j-1 downto 1 do if a[k]=1 then kt:=k;
ketiep:=kt;
end;
begin
assign(f,'input.txt');
reset(f);
readln(f,n);
close(f);
assign(f,'output.txt');
rewrite(f);
fillchar(a,n,1);
i:=1;
repeat
if (a[i]<>0) and (ketiep(i)<>0) then a[ketiep(i)]:=0;
inc(i);
if i=n+1 then i:=1;
if ketiep(i)=0 then writeln(f,i);
until ketiep(i)=0;
close(f);
end.
 
T

tellmywhy1

ừ thế mình làm thế này bạn xem có được không nhé

Mã:
uses crt;
var
a,b,x,z,m,n: integer;
f,g:text;
begin
clrscr;
assign(f,'input.txt');
reset(f);
readln(f,x,y);
readln(f,m,n);
close(f);
assign(g,'output.txt');
rewrite(g);
a:=x+y;
b:=m+n;
writeln(g,a);
writeln(g,b);
close(g);
end.

Đó là nếu mỗi dòng chắc chắn chỉ có 2 phần tử còn nếu nhiều hơn chắc phải có 1 dòng là n phần tử của dòng nữa:D

Đã kiểm tra kĩ các lỗi có thể xảy ra chưa, bạn có tin là có TH nó đọc dữ liệu lộn không, nếu như có 3 dòng hay nhiều hơn?????
Theo mình phải dùng vòng lặp cho con trỏ tệp về vị trí đầu của tệp, rồi đọc mỗi dòng 2 giá trị, dù 1 dòng có nhiều hơn 2 giá trị CT vẫn đúng, vẫn sẽ lấy 2 giá trí đầu tiên
 
H

huyhoang2100

Tiếp bởi: tellmywhy1
quên mất thêm vòng lặp này vào coi: while not eof(f) do
 
H

huyhoang2100

Ai làm nhanh dùm với:
Cho một xâu S = ’123456789’ hãy tìm cách chèn vào S các dấu '+' hoặc '-' để thu được số M cho trước (nếu có thể). Số M nguyên được nhập từ bàn phím. Trong file Output Chenxau.Out ghi tất cả các phương án chèn (nếu có) và ghi "Khong co" nếu như không thể thu được M từ cách làm trên.
Ví dụ: Nhập M = 8, một trong các phương án đó là: '-1+2-3+4+5-6+7';
M = -28, một trong các phương án đó là: '-1+2-34+5';
 
T

thanhthuytu

Thuật Toán Prim Kruskal

Bài toán: Cho một đồ thị vô hướng. Hãy tìm cây bao trùm ngắn nhất (Tức là tổng các trọng số các cạnh của cây là nhỏ nhất).

Giới hạn:
INPUT:
Dòng đầu: Gồm 2 số n,d: (n,d thuộc [0;100]), n là số đỉnh, d: Số cạnh.
D dòng tiếp theo: Mỗi dòng gồm các số i,j,s.
+ Cho biết trọng số cạnh i,j là s (i,j là số hiệu đỉnh).

OUTPUT:
- Dòng đầu: Gồm 1 số m duy nhất cho biết số cạnh của cây (luôn bằng (n-1))
- m (hay (n-1)) dòng tiếp theo: Mỗi dòng gồm các số a,b,s: Cho biết đỉnh a nối với đỉnh b có trọng số cạnh ab là s.
(n-1) dòng tiếp theo này cho biết các cạnh của cây.
- Dòng cuối: T cho biết tổng trọng số của cây bao trùm ngắn nhất.
- Nếu không liên thông thì xuất ″đồ thị không liên thông″

*) Giải thuật:
Có lẽ thuật toán Prim và Kruscal đã quen thuộc để giải loại bài toán này. (Đã từng được giới thiệu trên báo THNT) , Nhưng mỗi thuật toán tôi lại cảm thấy không được tối ưu cho lắm vì các bước cần giải quyết khá phức tạp.

*) Thuật toán Prim: Tư tưởng chủ đạo là chọn cạnh, mỗi lần chọn cạnh lại phải kiểm tra có tạo chu trình hay không, nếu cạnh ấy có tạo chu trình thì loại bỏ cạnh ấy.

Thuật toán Kruscal: Tư tưởng chủ đạo là chọn đỉnh, phải chọn đỉnh không ở trong tập đỉnh đã chọn, có cung nối đỉnh đó với đỉnh đã chọn và có trọng số là nhỏ nhất.

Các bước trong thuật toán trên khá phức tạp, tốn kém thời gian, khi dữ liệu quá lớn thì có lẽ đó là chưa là thuật toán tốt. Em đã nghĩ ra thuật toán kết hợp tinh hoa của hai thuật toán trên trở thành ″Thuật toán Prim − Kruscal″

Các bước của thuật toán:
Bước 1. Sắp xếp các cạnh từ nhỏ đến lớn theo trọng số (Dùng kiểu record), Chọn cạnh đầu tiên.
Bước 2. Tìm cạnh tiếp theo: cạnh được chọn phải thoả: 1 đỉnh ở trong tập hợp đỉnh đã chọn và một đỉnh ngoài tập hợp đỉnh đã chọn và cạnh đó chưa được chọn.
Bước 3: Trở lại đầu dãy cạnh đã sắp xếp.
Trở lại bước 2 và chỉ thoát khi chọn đủ (n-1) cạnh hoặc chưa chọn đủ (n-1) cạnh nhưng không thể chọn thêm cạnh nữa (trường hợp này đồ thị không liên thông).

*) Ví dụ minh hoạ: Gọi T là tập các đỉnh đã chọn, C là tâp các cạnh đã chọn.

Bước 1. Sắp xếp các cạnh theo chiều tăng của trọng số:
(1,2) (4,3) (3,5) (4,5) (1,4) (1,5) (2,5)
Trọng số 1 1 2 2 3 4 5
Chọn cạnh đầu tiên: (1,2). Khi đó, cạnh (1,2) đã chọn, đỉnh1,2 đã chọn C= { (1,2)}, T= {1,2}
Bước 2. Chọn cạnh tiếp theo: Duyệt từ đầu dãy: (1,2) đã chọn ; (4,3) chưa chọn nhưng không thỏa: có 1 đỉnh trong, 1 đỉnh ngoài tập T; (3,5) không chọn được với lý do tương tự; (4,5) không chọn, (1,4) : cạnh này chưa chọn và có một đỉnh trong tập T, 1 đỉnh ngoài tập T nên chọn. Khi đó:
C={(1,2), (1,4)}
T={1,2,4}
Bước 3. - Kiểm tra đủ (n-1) cạnh trong C chưa hoặc không còn có thể chọn cạnh tiếp hay không, khi đó thoát.
Trở lại đầu dãy trỏ lại bước 2.
Bước 2: Duyệt lại từ đầu:
(1,2): đã có trong tập C nên không chọn, (4,3): chưa chọn, 1 đỉnh trong, 1 đỉnh ngoài T nên chọn. Khi đó:
C={(1,2), (4,3), (1,4)}
T={1,2,4,3}
Cứ tiếp tục đến khi kết thúc (kiểm tra kết thúc ở bước 3)

Chương trình:

Type canh: record
d1,d2,d: word;
chon: Boolean;
end;
var a: array[1..10000] of canh;
v: array[1..10000] of boolean;
+) canh: d1,d2: 2 đỉnh của các cạnh, d: trọng số.
+) mảng cạnh: a
+) v: v=true khi và chỉ khi i thuộc T.
+) cạnh có thành phần chọn: cho biết chọn hay không canh.
Với khai báo trên:
{Bước 1: Sắp xếp}
for i:=1 to m-1 do
for j:=1 to m do
If a.d>a[j].d then
Begin
tam: a;
a:=a[j];
a[j]:=tam;
end;
{Chọn cạnh đầu tiên}
a[1].chon:= true;
v[[a[1].d1]:=true;
v[a[1].d2]:=true;
{Bước 2, bước 3}
Repeat
I:=1;
inc(spt);
While (a.chon= true) or not (v[a.d1) xor v[a.d2]) and (i<=m) do inc(i);
If (i<=m) then
Begin
a.chon:=true;
v[a.d1]:=true;
v[a.d2]:=true;
end;
Until (spt=n-1) or (i>m);
{Xuất kết quả}
If (i<=m) then
Begin
For i:=1 to m do
If a.chon then
Write(fo, a.d1,′ ′, a.d2);
End
Else write(fo,′ Do thi khong lien thong′)
 
M

marik

Ý tưởng của thuật toán này khá giống với bài anh viết năm ngoái nhưng anh vẫn nghĩ đó đơn thuần là Prim

Mã:
Program Thuat_toan_Prim;
 Uses crt;
 Var
 kt             : array[1..150] of boolean; 
 trongso        : array[1..150,1..150] of integer; 
 dinh           : array[1..150] of integer; 
 dinhke         : array[1..150] of integer; 
 n,m,t: integer; 
 i,j: integer; 
 tep: string; 
 ch: char; 
 f:text; 
 Procedure Inmatran; 
 Begin 
    (*In ma tran ra *) 
       Writeln('-------------------------------------------------------'); 
              For i:=1 to n do 
         Begin 
            For j:=1 to n do 
               If TrongSo[i,j]=Maxint then write('   0',' ') 
                    Else write(TrongSo[i,j]:4,' '); 
            Writeln; 
         End; 
       Writeln('-------------------------------------------------------'); 
 End; 
 Procedure Nhap(tep: string); 
 Var 
 z: integer; 
 Begin 
  assign(f,tep); 
    reset(f); 
     readln(f,n,m); 
   For z:=1 to m do 
 begin 
         readln(f,i,j,trongSo[i,j]); 
          trongso[j,i]:=trongso[i,j]; 
end;
            for i:=1 to n do
          for j:=1 to n do
         if trongso[i,j]=0 then trongso[i,j]:=maxint;
        
 close(f); 
 end; 
Procedure Prim; 
 Var 
 v,k,z,q,h: integer; 
 min: integer; 
    Begin 
   Write('Chon dinh bat dau thuat toan: ');readln(z); 
          dinh[1]:=z; kt[z]:=true; 
  q:=1; 
     repeat 
         min:=maxint; 
           for z:=1 to q do 
             begin 
                for i:=1 to n do 
          begin 
 if (dinh[z]<>0) and (trongso[dinh[z],i]<=min) and not kt[i] then 
        begin 
           min:=trongso[dinh[z],i]; 
          h:=dinh[z]; 
         k:=i; 
        end; 
  if (dinhke[z]<>0) and (trongso[dinhke[z],i]<=min) and not kt[i] then 
   begin 
            min:=trongso[dinhke[z],i]; 
          h:=dinhke[z]; 
         k:=i; 
        end; 
 end;
             end; 
  t:=t+min; 
   kt[k]:=true; 
     dinh[q]:=h; 
      dinhke[q]:=k; 
      inc(q); 
    until q=n; 
  end; 
 Procedure Intep; 
  Begin 
 Assign(f,'prim.txt'); 
 Rewrite(f); 
 Writeln(f,'-------------------------------------------------------'); 
         For i:=1 to n do 
         Begin 
            For j:=1 to n do 
               If TrongSo[i,j]=maxint then write(f,'   0',' ') 
                    Else write(f,TrongSo[i,j]:4,' '); 
            Writeln(f); 
         End; 
      Writeln(f,'-------------------------------------------------------'); 
writeln(f,'Cay khung nho nhat gom cac canh:'); 
 For i:=1 to n-1 do 
   begin 
     write(f,'(',dinh[i],',',DinhKe[i],') '); 
   end; 
 writeln(f); 
 writeln(f,'Length: ',T); 
 close(f); 
  end; 
  Begin 
  clrscr; 
  writeln('THUAT TOAN PRIM TIM CAY KHUNG NHO NHAT'); 
  writeln('           DUNG MA TRAN KE'); 
  writeln('---------------------------------------'); 
   write('    Hay nhap ten tep du lieu:'); readln(tep); 
    Nhap(tep); 
    Inmatran; 
    Prim; 
    Intep; 
    write('Cac canh cua cay khung be nhat:'); 
    for i:=1 to n-1 do write('(',dinh[i],',',DinhKe[i],')'); 
    writeln; 
    writeln('Do dai cua cay khung : ',t); 
    writeln('***************************************'); 
    writeln('Nhan phim Enter de tiep tuc.'); 
    readln; 
   end.
 
Last edited by a moderator:
G

great_future92

mọi người giúp mình bài này nhé!
Lập trình quản lí điểm của 1 lớp.

a, Nhập hồ sơ của mỗi hs gồm: họ tên, ns, điểm TBHK I, DTBHK II, ĐTB cả năm.

b, In ra danh sách những hs lưu ban.

c, In ra ds lớp theo ĐTB cả năm giảm dần

d, In ra ds hs có ĐTB cả năm lớn hơn 5.0

e, Tình tỉ lệ hs giỏi, khá, TB, yếu, kém của lớp.

cảm ơn mọi người trước nha! cảm ơn nhiều!
 
M

marik

Còn câu cuối anh buồn ngủ quá nên ko làm nổi nữa! Nhưng mà cũng dễ thôi, nếu em tự làm đc thì càng tốt.

Mã:
uses crt;
type tt=record
t:string[30];
xl,ns:string[10];
tb1,tb2,cn:real;
end;
var hs:array[1..100] of tt;
a,k:integer;
procedure nhap;
var i,j:integer;
tg:tt;
begin
k:=k+1;
with hs[k] do
begin
write('Ten hoc sinh: ');readln(t);
write('Ngay sinh: ');readln(ns);
write('Diem TB ki I: ');readln(tb1);
write('Diem TB ki II: ');readln(tb2);
cn:=(tb1+tb2*2)/3;
if cn>=8 then xl:='Gioi'
else if cn>=6.5 then xl:='Kha'
else if cn>=5 then xl:='TB'
else if cn>=3.5 then xl:='Kem'
else xl:='Yeu';
for i:=2 to k do
end;
for i:=2 to k do
for j:=k downto i do
if hs[j].cn>hs[j-1].cn then
begin
tg:=hs[j];
hs[j]:=hs[j-1];
hs[j-1]:=tg;
end;
end;
procedure lb;
var i:integer;
begin
writeln('STT','Ten HS':18,'Sinh ngay':12,'TBHKI':8,'TBHKII':8,'Ca nam':8,'Xeploai':10);
for i:=1 to k do
if hs[i].xl='Yeu' then
with hs[i] do
writeln(i,t:20,ns:12,tb1:8:1,tb2:8:1,cn:8:1,xl:10);
readln;
end;
procedure xuat;
var i:integer;
begin
writeln('STT','Ten HS':18,'Sinh ngay':12,'TBHKI':8,'TBHKII':8,'Ca nam':8,'Xeploai':10);
for i:=1 to k do
with hs[i] do
writeln(i,t:20,ns:12,tb1:8:1,tb2:8:1,cn:8:1,xl:10);
readln;
end;
procedure phay;
var i:integer;
begin
i:=1;
writeln('STT','Ten HS':18,'Sinh ngay':12,'TBHKI':8,'TBHKII':8,'Ca nam':8,'Xeploai':10);
while hs[i].cn>5 do
begin
with hs[i] do
writeln(i,t:20,ns:12,tb1:8:1,tb2:8:1,cn:8:1,xl:10);
inc(i);
end;
readln;
end;
begin
k:=0;
clrscr;
repeat
writeln('1. Nhap');
writeln('2. In ra nhung hoc sinh luu ban');
writeln('3. In ra diem TB ca lop');
writeln('4. In ra nhung hoc sinh co phay tren 5');
writeln('5. Thoat');
readln(a);
case a of
1:
begin
clrscr;
nhap;
clrscr;
end;
2:
begin
clrscr;
lb;
clrscr;
end;
3:
begin
clrscr;
xuat;
clrscr;
end;
4:
begin
clrscr;
phay;
clrscr;
end;
5:exit;
end;
until a=5;
readln;
end.

Cái này là anh cho học sinh lưu ban là học sinh có xếp loại yếu nhé!
 
G

gervie

Xin giúp em giải bài toán mã đi tuần và tháp hà nội, những code mẫu trong sách khi đánh ra toàn sai không :(
 
M

marik

Code mã đi tuần
Mã:
Type ma = Record
     x, y : Integer;
     huong : Integer;
End;

Var Banco: Array [1..8,1..8] of Integer;
    Nuocdi: Array [1..64] of ma;
    a,cach,SoNuocdi : Integer;
  
Procedure Khoidong;
Var i,j : Integer;
Begin
write('Nhap kich thuoc ban co: ');readln(a);
  cach := 0;
  for i:=1 to a do
     for j:= 1 to a do
         Banco[i,j] := -1;
   write('Nhap toa do hang chua con ma : ');
   readln(Nuocdi[1].y);
   write('Nhap toa do cot chua con ma : ');
   readln(Nuocdi[1].x);
   Nuocdi[1].huong := 0;
   {Thiet lap nuoc di dau tien cua con ma}
   SoNuocdi :=1;
   Banco[Nuocdi[SoNuocdi].x,Nuocdi[SoNuocdi].y] := 1;
End;

Procedure InKetqua;
Var h,c : Integer;
Begin
   cach := cach + 1;
   writeln('Cach di thu ',cach,':');
   for h:= a downto 1 do begin
      { Hien thi hang luoi ngang ban co }
      for c:= 1 to a do write('+--');
      writeln('+');
      { Hien thi noi dung hang thu h ban co }
      for c:= 1 to a do
         write('|',Banco[h,c]:2);
      writeln('|');
         end;
  {Hien thi hang luoi ngang ban co cuoi cung}
   for c:= 1 to a do write('+--');
   writeln('+');
    readln;
End;

Function TimNuocKe : Boolean;
Var x, y : Integer;
    RetVal : Boolean;
Begin
    RetVal := False;
      repeat {lap tim nuoc di ke tiep cho den khi tim duoc hoac het cach di}
        while (RetVal=False) and (Nuocdi[SoNuocdi].huong < 8) do begin
            Case Nuocdi[SoNuocdi].huong of  {thu huong di hien tai}
            0 : begin
                 x := Nuocdi[SoNuocdi].x + 2;
                 y := Nuocdi[SoNuocdi].y - 1;
                 end;
            1 : begin
                 x := Nuocdi[SoNuocdi].x + 1;
                 y := Nuocdi[SoNuocdi].y - 2;
                 end;
            2 : begin
                 x := Nuocdi[SoNuocdi].x - 1;
                 y := Nuocdi[SoNuocdi].y - 2;
                 end;
            3 : begin
                 x := Nuocdi[SoNuocdi].x - 2;
                 y := Nuocdi[SoNuocdi].y - 1;
                 end;
            4 : begin;
                 x := Nuocdi[SoNuocdi].x - 2;
                 y := Nuocdi[SoNuocdi].y + 1;
                 end;
            5 : begin
                 x := Nuocdi[SoNuocdi].x - 1;
                 y := Nuocdi[SoNuocdi].y + 2;
                 end;
            6 : begin
                 x := Nuocdi[SoNuocdi].x + 1;
                 y := Nuocdi[SoNuocdi].y + 2;
                 end;
            7 : begin
                 x := Nuocdi[SoNuocdi].x + 2;
                 y := Nuocdi[SoNuocdi].y + 1;
                 end
            End;
            if (0<=x) and (x<=a) and (0<=y) and (y<=a) and (Banco[x,y]=-1) then begin
            {neu duoc thi ghi nhan}
                 SoNuocdi := SoNuocdi + 1;
                 Banco[x,y] := SoNuocdi;
                 Nuocdi[SoNuocdi].x := x;
                 Nuocdi[SoNuocdi].y := y;
                 Nuocdi[SoNuocdi].huong := 0;
                 RetVal:=True;
           end else
                {neu khong duoc thi thu huong ke tiep}
                 Nuocdi[SoNuocdi].huong := Nuocdi[SoNuocdi].huong + 1;
        end;
        if (RetVal=False) and (SoNuocdi <> 1) then begin
            {neu khong tim duoc nuoc di ke thi lui con ma lai 1 buoc}
            Banco[Nuocdi[SoNuocdi].x,Nuocdi[SoNuocdi].y] := -1;
            SoNuocdi := SoNuocdi - 1;
            Nuocdi[SoNuocdi].huong := Nuocdi[SoNuocdi].huong + 1;
        end;
      until RetVal or (SoNuocdi = 1);
   TimNuocKe := RetVal;
End;

Begin
    Khoidong;
    while TimNuocKe do begin
        if SoNuocdi = a*a then begin
             {neu tim duoc 1 nghiem}
              InKetqua;
              Banco[Nuocdi[SoNuocdi].x,Nuocdi[SoNuocdi].y] := -1;
              SoNuocdi := SoNuocdi -1;
              Nuocdi[SoNuocdi].huong := Nuocdi[SoNuocdi].huong + 1;
        end;
    end;
    readln;
End.
Code tháp Hà Nội
Mã:
uses crt;
const DLT:Word = 200;
type TCoc = record
              sodia:byte;
              size:array[1..100]of byte;
              tdX,tdY:byte;
            end;
var coc:array[1..3]of TCoc;
    sodia,tongsodia:byte;
    quit:boolean;
{---------------------------------------------------------}
procedure Init(sodia:byte);
var i:byte;
begin
  tongsodia:=sodia;
  coc[1].sodia:=sodia;
  for i:=1 to sodia do
    coc[1].size[i]:=sodia-i+1;
  coc[2].sodia:=0;
  coc[3].sodia:=0;
  for i:=1 to 3 do
     begin
       coc[i].tdY:=20;
       coc[i].tdX:=i*26-13;
     end;
  Quit:=false;
end;
{---------------------------------------------------------}
procedure VeDia(size,x,y:byte);
var i:byte;
    st:string;
begin
  st:='Û';
  textcolor(size);
  textbackground(0);
  for i:=2 to size do st:='Û'+st+'Û';
  gotoxy(x-size+1,y);
  write(st);
end;
{---------------------------------------------------------}
procedure XoaDia(size,x,y:byte);
var i:byte;
    st:string;
begin
  st:='Û';
  textcolor(0);
  textbackground(0);
  for i:=2 to size do st:='Û'+st+'Û';
  gotoxy(x-size+1,y);
  write(st);
end;
{---------------------------------------------------------}
procedure MyDelay(t:word);
var c:char;
    i:word;
begin
  i:=0;
  repeat
    delay(1);
    if Keypressed then
       begin
         c:=readkey;
         case c of
           #27:Quit:=true;
           '+':if DLT<1000 then inc(DLT);
           '-':if DLT>20 then dec(DLT);
         end;
         gotoxy(70,1);
         textcolor(15);
         write('Delay:',DLT:4);
       end;
{    if port[$60]=1 then quit:=true;}
    inc(i);
  until (i>T)or(Quit);
end;
{---------------------------------------------------------}

procedure MoveUpDown(size,X,y1,y2:byte);
var step:shortint;
    y:byte;
begin
  if y1<y2 then step:=1 else step:=-1;
  y:=y1;
  while (y<>y2)and(not Quit) do
   begin
     Vedia(size,x,y);
     MyDelay(DLT);
     Xoadia(size,x,y);
     y:=y+step;
   end;
end;
{---------------------------------------------------------}
procedure MoveSide(size,Y,x1,x2:byte);
var step:shortint;
    x:byte;
begin
  if x1<x2 then step:=1 else step:=-1;
  x:=x1;
  while (x<>x2)and(not Quit) do
   begin
     Vedia(size,x,y);
     MyDelay(DLT);
     Xoadia(size,x,y);
     x:=x+step;
   end;
end;
{---------------------------------------------------------}
procedure MoveAction(a,b:byte);
var s,y1,y2:byte;
begin
  if Quit then exit;
  if coc[a].sodia=0 then exit;
  s:=coc[a].size[coc[a].sodia];
  y1:=coc[a].tdY-coc[a].sodia+1;
  y2:=coc[a].tdY-tongsodia-2;
  MoveUpdown(s,coc[a].tdX,y1,y2);
  MoveSide(s,y2,coc[a].tdX,coc[b].tdX);
  y1:=y2;
  y2:=coc[b].tdY-coc[b].sodia;
  MoveUpdown(s,coc[b].tdX,y1,y2);
  dec(coc[a].sodia);
  inc(coc[b].sodia);
  coc[b].size[coc[b].sodia]:=s;
  Vedia(s,coc[b].tdX,y2);
end;
{-------------------  Hat Nhan --------------------------------------}
procedure ChuyenDia(n,a,b,c:byte);
begin
  if Quit then exit;
  if n=1 then MoveAction(a,b)
  else
    begin
      ChuyenDia(n-1,a,c,b);
      ChuyenDia(1,a,b,c);
      ChuyenDia(n-1,c,b,a);
    end;
end;
{--------------------------------------------------------------------}
{---------------------------------------------------------}
{---------------------------------------------------------}
procedure VeBandau;
var i:byte;
begin
  for i:=1 to coc[1].sodia do
    Vedia(coc[1].sodia-i+1,coc[1].tdX,coc[1].tdY-i+1);
  gotoxy(70,1);
  textcolor(15);
  write('Delay:',DLT:4);
end;
{---------------------------------------------------------}
begin
  textcolor(15);
  textbackground(0);
  clrscr;
  write('So dia:');readln(sodia);
  clrscr;
  writeln('An ESC de thoat');
  Init(sodia);
  VeBandau;
  ChuyenDia(sodia,1,2,3);
  if not Quit then
    begin
      textcolor(15);
      gotoxy(1,1);
      writeln('    Hoan thanh !   ');
      readln;
    end;
end.
Bài này dựa trên bài của Quách Tuấn Ngọc( cái này ko phải anh viết :d)
 
G

gervie

Code tháp hà nội thì đc rồi nhưng code mã đi tuần thì nhập kích thước bàn cờ, tọa độ rồi chẳng ra gì hết
 
M

marik

Hic, anh vẫn chạy bình thường mà. Hy vọng là em ko nhập kích thước lớn quá. Và mỗi lần ấn enter thì nó ra 1 nghiệm.
untitled-3.jpg
 
G

gervie

Anh có thể cho em đoạn code khác cũng là mã đi tuần nhưng chỉ cần 1 cách đi thôi đc không (không cần phải view ra nhiều cách đâu). Với lại cái code trên em gõ kích thước 6 tọa độ 1 1 là đứng luôn
 
M

marik

6 1,1 vẫn chạy bt em ạ!
ObjectCapture.jpg


Cho 1 kết quả:
Mã:
{Kieu du lieu chua thong tin cua 1 buoc di}
Type ma = Record
     x, y : Integer;
     huong : Integer;
End;
{ Cac bien du lieu chinh}
Var Banco: Array [1..8,1..8] of Integer;
    Nuocdi: Array [1..64] of ma;
    a,SoNuocdi : Integer;
    {Thu tuc khoi dong cac gia tri dau cua chuong trinh}
Procedure Khoidong;
Var i,j : Integer;
Begin
write('Nhap kich thuoc ban co: ');readln(a);
  cach := 0;
  for i:=1 to a do
     for j:= 1 to a do
         Banco[i,j] := -1;
   write('Nhap toa do hang chua con ma : ');
   readln(Nuocdi[1].y);
   write('Nhap toa do cot chua con ma : ');
   readln(Nuocdi[1].x);
   Nuocdi[1].huong := 0;
   {Thiet lap nuoc di dau tien cua con ma}
   SoNuocdi :=1;
   Banco[Nuocdi[SoNuocdi].x,Nuocdi[SoNuocdi].y] := 1;
End;

{In ket qua con ma di tren ban co}
Procedure InKetqua;
Var h,c : Integer;
Begin
   for h:= a downto 1 do begin
      { Hien thi hang luoi ngang ban co }
      for c:= 1 to a do write('+--');
      writeln('+');
      { Hien thi noi dung hang thu h ban co }
      for c:= 1 to a do
         write('|',Banco[h,c]:2);
      writeln('|');
         end;
  {Hien thi hang luoi ngang ban co cuoi cung}
   for c:= 1 to a do write('+--');
   writeln('+');
    readln;
End;
{Thu tuc tim nuoc di ke tiep}
Function TimNuocKe : Boolean;
Var x, y : Integer;
    RetVal : Boolean;
Begin
    RetVal := False;
      repeat {lap tim nuoc di ke tiep cho den khi tim duoc hoac het cach di}
        while (RetVal=False) and (Nuocdi[SoNuocdi].huong < 8) do begin
            Case Nuocdi[SoNuocdi].huong of  {thu huong di hien tai}
            0 : begin
                 x := Nuocdi[SoNuocdi].x + 2;
                 y := Nuocdi[SoNuocdi].y - 1;
                 end;
            1 : begin
                 x := Nuocdi[SoNuocdi].x + 1;
                 y := Nuocdi[SoNuocdi].y - 2;
                 end;
            2 : begin
                 x := Nuocdi[SoNuocdi].x - 1;
                 y := Nuocdi[SoNuocdi].y - 2;
                 end;
            3 : begin
                 x := Nuocdi[SoNuocdi].x - 2;
                 y := Nuocdi[SoNuocdi].y - 1;
                 end;
            4 : begin;
                 x := Nuocdi[SoNuocdi].x - 2;
                 y := Nuocdi[SoNuocdi].y + 1;
                 end;
            5 : begin
                 x := Nuocdi[SoNuocdi].x - 1;
                 y := Nuocdi[SoNuocdi].y + 2;
                 end;
            6 : begin
                 x := Nuocdi[SoNuocdi].x + 1;
                 y := Nuocdi[SoNuocdi].y + 2;
                 end;
            7 : begin
                 x := Nuocdi[SoNuocdi].x + 2;
                 y := Nuocdi[SoNuocdi].y + 1;
                 end
            End;
            if (0<=x) and (x<=a) and (0<=y) and (y<=a) and (Banco[x,y]=-1) then begin
            {neu duoc thi ghi nhan}
                 SoNuocdi := SoNuocdi + 1;
                 Banco[x,y] := SoNuocdi;
                 Nuocdi[SoNuocdi].x := x;
                 Nuocdi[SoNuocdi].y := y;
                 Nuocdi[SoNuocdi].huong := 0;
                 RetVal:=True;
           end else
                {neu khong duoc thi thu huong ke tiep}
                 Nuocdi[SoNuocdi].huong := Nuocdi[SoNuocdi].huong + 1;
        end;
        if (RetVal=False) and (SoNuocdi <> 1) then begin
            {neu khong tim duoc nuoc di ke thi lui con ma lai 1 buoc}
            Banco[Nuocdi[SoNuocdi].x,Nuocdi[SoNuocdi].y] := -1;
            SoNuocdi := SoNuocdi - 1;
            Nuocdi[SoNuocdi].huong := Nuocdi[SoNuocdi].huong + 1;
        end;
      until RetVal or (SoNuocdi = 1);
   TimNuocKe := RetVal;
End;

{Chuong trinh chinh}
Begin
    Khoidong;
    while TimNuocKe do begin
        if SoNuocdi = a*a then  InKetqua;
      exit;     
end;
End.
 
Last edited by a moderator:
G

gervie

Hix, sao không ra gì hết vậy anh, nhập số liệu vào xong rồi nó thóat lun chứ chẳng ra cái ô như cũ nữa
 
Top Bottom